diff --git a/Firmware/Radio/Components/ble/controller/include/ll.h b/Firmware/Radio/Components/ble/controller/include/ll.h new file mode 100644 index 0000000..fae4fbf --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/ll.h @@ -0,0 +1,2598 @@ +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2012-11-09 12:02:03 -0800 (Fri, 09 Nov 2012) $ + Revision: $Revision: 32139 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_H +#define LL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#define LL_STATUS_SUCCESS 0x00 // Success +#define LL_STATUS_ERROR_UNKNOWN_CONN_HANDLE 0x02 // Unknown Connection Identifier +#define LL_STATUS_ERROR_INACTIVE_CONNECTION 0x02 // Unknown Connection Identifier for now; may be needed for multiple connections +#define LL_STATUS_ERROR_PIN_OR_KEY_MISSING 0x06 // Pin or Key Missing +#define LL_STATUS_ERROR_OUT_OF_CONN_RESOURCES 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_TX_MEM 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_RX_MEM 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_HEAP 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_WL_TABLE_FULL 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_CONNECTION_TIMEOUT 0x08 // Connection Timeout +#define LL_STATUS_ERROR_CONNECTION_LIMIT_EXCEEDED 0x09 // Connection Limit Exceeded +#define LL_STATUS_ERROR_COMMAND_DISALLOWED 0x0C // Command Disallowed +#define LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES 0x0D // Command Rejected Due To Limited Resources +#define LL_STATUS_ERROR_DUE_TO_DELAYED_RESOURCES 0x0D // Command Delayed Due To Limited Resources +#define LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED 0x11 // Unsupported Feature or Parameter Value +#define LL_STATUS_ERROR_UNEXPECTED_PARAMETER 0x12 // Invalid HCI Command Parameters +#define LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION 0x12 // Invalid HCI Command Parameters +#define LL_STATUS_ERROR_BAD_PARAMETER 0x12 // Invalid HCI Command Parameters or 0x30: Parameter Out of Mandatory Range? +#define LL_STATUS_ERROR_UNKNOWN_ADV_EVT_TYPE 0x12 // Invalid HCI Command Parameters or 0x30: Parameter Out of Mandatory Range? +#define LL_STATUS_ERROR_PEER_TERM 0x13 // Remote User Terminated Connection +#define LL_STATUS_ERROR_PEER_DEVICE_TERM_LOW_RESOURCES 0x14 // Remote Device Terminated Connection Due To Low Resources +#define LL_STATUS_ERROR_PEER_DEVICE_TERM_POWER_OFF 0x15 // Remote Device Terminated Connection Due To Power Off +#define LL_STATUS_ERROR_HOST_TERM 0x16 // Connection Terminated By Local Host +#define LL_STATUS_ERROR_UNSUPPORTED_REMOTE_FEATURE 0x1A // Unsupported Remote Feature +#define LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND 0x1F // Unspecified Error +#define LL_STATUS_ERROR_WL_TABLE_EMPTY 0x1F // Unspecified Error +#define LL_STATUS_ERROR_RNG_FAILURE 0x1F // Unspecified Error +#define LL_STATUS_ERROR_DISCONNECT_IMMEDIATE 0x1F // Unspecified Error +#define LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE 0x21 // Role Change Not Allowed +#define LL_STATUS_ERROR_LL_TIMEOUT 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_LL_TIMEOUT_HOST 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_LL_TIMEOUT_PEER 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_INSTANT_PASSED 0x28 // Instant Passed +#define LL_STATUS_ERROR_INSTANT_PASSED_HOST 0x28 // Instant Passed +#define LL_STATUS_ERROR_INSTANT_PASSED_PEER 0x28 // Instant Passed +#define LL_STATUS_ERROR_NO_ADV_CHAN_FOUND 0x30 // Parameter Out Of Mandatory Range +#define LL_STATUS_ERROR_PARAM_OUT_OF_RANGE 0x30 // Parameter Out Of Mandatory Range +#define LL_STATUS_ERROR_UPDATE_CTRL_PROC_PENDING 0x3A // Controller Busy +#define LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE 0x3A // Controller Busy +#define LL_STATUS_ERROR_VER_INFO_REQ_ALREADY_PENDING 0x3A // Controller Busy +#define LL_STATUS_ERROR_UNACCEPTABLE_CONN_INTERVAL 0x3B // Unacceptable Connection Interval +#define LL_STATUS_ERROR_DIRECTED_ADV_TIMEOUT 0x3C // Directed Advertising Timeout +#define LL_STATUS_ERROR_CONN_TERM_DUE_TO_MIC_FAILURE 0x3D // Connection Terminated Due To MIC Failure +#define LL_STATUS_ERROR_CONN_FAILED_TO_BE_ESTABLISHED 0x3E // Connection Failed To Be Established +#define LL_STATUS_ERROR_CONN_TIMING_FAILURE 0x3F // MAC Connection Failed +// Internal +#define LL_STATUS_WARNING_TX_DISABLED 0xFF // only used internally, so value doesn't matter +#define LL_STATUS_WARNING_FLAG_UNCHANGED 0xFF // only used internally, so value doesn't matter + +// Encryption Key Request Reason Codes +#define LL_ENC_KEY_REQ_ACCEPTED LL_STATUS_SUCCESS +#define LL_ENC_KEY_REQ_REJECTED LL_STATUS_ERROR_PIN_OR_KEY_MISSING +#define LL_ENC_KEY_REQ_UNSUPPORTED_FEATURE LL_STATUS_ERROR_UNSUPPORTED_REMOTE_FEATURE + +// Disconnect Reason Codes +#define LL_SUPERVISION_TIMEOUT_TERM LL_STATUS_ERROR_CONNECTION_TIMEOUT +#define LL_PEER_REQUESTED_TERM LL_STATUS_ERROR_PEER_TERM +#define LL_PEER_REQUESTED_LOW_RESOURCES_TERM LL_STATUS_ERROR_PEER_DEVICE_TERM_LOW_RESOURCES +#define LL_PEER_REQUESTED_POWER_OFF_TERM LL_STATUS_ERROR_PEER_DEVICE_TERM_POWER_OFF +#define LL_HOST_REQUESTED_TERM LL_STATUS_ERROR_HOST_TERM +#define LL_CTRL_PKT_TIMEOUT_TERM LL_STATUS_ERROR_LL_TIMEOUT +#define LL_CTRL_PKT_TIMEOUT_HOST_TERM LL_STATUS_ERROR_LL_TIMEOUT_HOST +#define LL_CTRL_PKT_TIMEOUT_PEER_TERM LL_STATUS_ERROR_LL_TIMEOUT_PEER +#define LL_CTRL_PKT_INSTANT_PASSED_TERM LL_STATUS_ERROR_INSTANT_PASSED +#define LL_CTRL_PKT_INSTANT_PASSED_HOST_TERM LL_STATUS_ERROR_INSTANT_PASSED_HOST +#define LL_CTRL_PKT_INSTANT_PASSED_PEER_TERM LL_STATUS_ERROR_INSTANT_PASSED_PEER +#define LL_UNACCEPTABLE_CONN_INTERVAL_TERM LL_STATUS_ERROR_UNACCEPTABLE_CONN_INTERVAL +#define LL_MIC_FAILURE_TERM LL_STATUS_ERROR_CONN_TERM_DUE_TO_MIC_FAILURE +#define LL_CONN_ESTABLISHMENT_FAILED_TERM LL_STATUS_ERROR_CONN_FAILED_TO_BE_ESTABLISHED + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#define LL_ADV_CONN_INTERVAL_MIN 32 // 20ms in 625us +#define LL_ADV_CONN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_ADV_NONCONN_INTERVAL_MIN 160 // 100ms in 625us +#define LL_ADV_NONCONN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_ADV_DELAY_MIN 0 // in ms +#define LL_ADV_DELAY_MAX 10 // in ms +#define LL_SCAN_INTERVAL_MIN 4 // 2.5ms in 625us +#define LL_SCAN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_SCAN_WINDOW_MIN 4 // 2.5ms in 625us +#define LL_SCAN_WINDOW_MAX 16384 // 10.24s in 625us +#define LL_CONN_INTERVAL_MIN 6 // 7.5ms in 1.25ms +#define LL_CONN_INTERVAL_MAX 3200 // 4s in 1.25ms +#define LL_CONN_TIMEOUT_MIN 10 // 100ms in 10ms +#define LL_CONN_TIMEOUT_MAX 3200 // 32s in 10ms +#define LL_SLAVE_LATENCY_MIN 0 +#define LL_SLAVE_LATENCY_MAX 499 +#define LL_HOP_LENGTH_MIN 5 +#define LL_HOP_LENGTH_MAX 16 +#define LL_INSTANT_NUMBER_MIN 6 + +// LL Advertiser Channels +#define LL_ADV_CHAN_37 1 +#define LL_ADV_CHAN_38 2 +#define LL_ADV_CHAN_39 4 +#define LL_ADV_CHAN_ALL 7 + +// LL Advertiser Events +#define LL_ADV_CONNECTABLE_UNDIRECTED_EVT 0 +#define LL_ADV_CONNECTABLE_DIRECTED_EVT 1 +#define LL_ADV_SCANNABLE_UNDIRECTED_EVT 2 +#define LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT 3 + +// LL Address Type +#define LL_DEV_ADDR_TYPE_PUBLIC 0 +#define LL_DEV_ADDR_TYPE_RANDOM 1 + +// Advertiser White List Policy +#define LL_ADV_WL_POLICY_ANY_REQ 0 // any scan request or connect request +#define LL_ADV_WL_POLICY_WL_SCAN_REQ 1 // any connect request, white list scan request +#define LL_ADV_WL_POLICY_WL_CONNECT_REQ 2 // any scan request, white list connect request +#define LL_ADV_WL_POLICY_WL_ALL_REQ 3 // white list scan request and connect request + +// Scanner White List Policy +#define LL_SCAN_WL_POLICY_ANY_ADV_PKTS 0 +#define LL_SCAN_WL_POLICY_USE_WHITE_LIST 1 + +// Initiator White List Policy +#define LL_INIT_WL_POLICY_USE_PEER_ADDR 0 +#define LL_INIT_WL_POLICY_USE_WHITE_LIST 1 + +// Black List Control +#define LL_SET_BLACKLIST_DISABLE 0 +#define LL_SET_BLACKLIST_ENABLE 1 + +// Advertiser Commands +#define LL_ADV_MODE_OFF 0 +#define LL_ADV_MODE_ON 1 +#define LL_ADV_MODE_RESERVED 2 + +// LL Scan Commands +#define LL_SCAN_STOP 0 +#define LL_SCAN_START 1 + +// LL Scan Filtering +#define LL_FILTER_REPORTS_DISABLE 0 +#define LL_FILTER_REPORTS_ENABLE 1 + +// LL Scan Types +#define LL_SCAN_PASSIVE 0 +#define LL_SCAN_ACTIVE 1 + +// LL Tx Power Types +#define LL_READ_CURRENT_TX_POWER_LEVEL 0 +#define LL_READ_MAX_TX_POWER_LEVEL 1 + +// Data Fragmentation Flag +#define LL_DATA_FIRST_PKT_HOST_TO_CTRL 0 +#define LL_DATA_CONTINUATION_PKT 1 +#define LL_DATA_FIRST_PKT_CTRL_TO_HOST 2 + +// Connection Complete Role +#define LL_LINK_CONNECT_COMPLETE_MASTER 0 +#define LL_LINK_CONNECT_COMPLETE_SLAVE 1 + +// Encryption Related +#define LL_ENCRYPTION_OFF 0 +#define LL_ENCRYPTION_ON 1 + +// Feature Set Related +#define LL_MAX_FEATURE_SET_SIZE 8 // in bytes +// +#define LL_FEATURE_RFU 0 // all bits in a byte +#define LL_FEATURE_ENCRYPTION 1 // byte 0, bit 0 + +// Receive Flow Control +#define LL_DISABLE_RX_FLOW_CONTROL 0 +#define LL_ENABLE_RX_FLOW_CONTROL 1 + +// Direct Test Mode +#define LL_DIRECT_TEST_NUM_RF_CHANS 40 // PHY_NUM_RF_CHANS +#define LL_DIRECT_TEST_MAX_PAYLOAD_LEN 37 +// +#define LL_DIRECT_TEST_PAYLOAD_PRBS9 0 +#define LL_DIRECT_TEST_PAYLOAD_0x0F 1 +#define LL_DIRECT_TEST_PAYLOAD_0x55 2 +#define LL_DIRECT_TEST_PAYLOAD_PRBS15 3 +#define LL_DIRECT_TEST_PAYLOAD_0xFF 4 +#define LL_DIRECT_TEST_PAYLOAD_0x00 5 +#define LL_DIRECT_TEST_PAYLOAD_0xF0 6 +#define LL_DIRECT_TEST_PAYLOAD_0xAA 7 +#define LL_DIRECT_TEST_PAYLOAD_UNDEFINED 0xFF +// +#define LL_DIRECT_TEST_MODE_TX 0 +#define LL_DIRECT_TEST_MODE_RX 1 +// +#define LL_RF_RSSI_UNDEFINED PHY_RSSI_VALUE_INVALID + +// Vendor Specific +#define LL_EXT_RX_GAIN_STD 0 +#define LL_EXT_RX_GAIN_HIGH 1 +// +#define LL_EXT_TX_POWER_MINUS_23_DBM 0 +#define LL_EXT_TX_POWER_MINUS_6_DBM 1 +#define LL_EXT_TX_POWER_0_DBM 2 +#define LL_EXT_TX_POWER_4_DBM 3 + +#if defined( CC2541) || defined( CC2541S ) + +#define LL_EXT_MAX_TX_POWER LL_EXT_TX_POWER_0_DBM + +#else // CC2540 + +#define LL_EXT_MAX_TX_POWER LL_EXT_TX_POWER_4_DBM + +#endif // CC2541 || CC2541S + +// +#define LL_EXT_DISABLE_ONE_PKT_PER_EVT 0 +#define LL_EXT_ENABLE_ONE_PKT_PER_EVT 1 +// +#define LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT 0 +#define LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT 1 +// +#define LL_EXT_NV_NOT_IN_USE 0 +#define LL_EXT_NV_IN_USE 1 +// +#define LL_EXT_DISABLE_FAST_TX_RESP_TIME 0 +#define LL_EXT_ENABLE_FAST_TX_RESP_TIME 1 +// +#define LL_EXT_TX_MODULATED_CARRIER 0 +#define LL_EXT_TX_UNMODULATED_CARRIER 1 +// +#define LL_EXT_SET_FREQ_TUNE_DOWN 0 +#define LL_EXT_SET_FREQ_TUNE_UP 1 +// +#define LL_EXT_PM_IO_PORT_P0 0 +#define LL_EXT_PM_IO_PORT_P1 1 +#define LL_EXT_PM_IO_PORT_P2 2 +#define LL_EXT_PM_IO_PORT_NONE 0xFF +#define LL_EXT_PM_IO_DISABLE LL_EXT_PM_IO_PORT_NONE +// +#define LL_EXT_PM_IO_PORT_PIN0 0 +#define LL_EXT_PM_IO_PORT_PIN1 1 +#define LL_EXT_PM_IO_PORT_PIN2 2 +#define LL_EXT_PM_IO_PORT_PIN3 3 +#define LL_EXT_PM_IO_PORT_PIN4 4 +#define LL_EXT_PM_IO_PORT_PIN5 5 +#define LL_EXT_PM_IO_PORT_PIN6 6 +#define LL_EXT_PM_IO_PORT_PIN7 7 +// +#define LL_EXT_PER_RESET 0 +#define LL_EXT_PER_READ 1 +// +#define LL_EXT_HALT_DURING_RF_DISABLE 0 +#define LL_EXT_HALT_DURING_RF_ENABLE 1 + +// Packet Lengths +#define LL_DEVICE_ADDR_LEN 6 +#define LL_MAX_ADV_DATA_LEN 31 +#define LL_MAX_ADV_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_ADV_DATA_LEN) +#define LL_MAX_SCAN_DATA_LEN 31 +#define LL_MAX_SCAN_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_SCAN_DATA_LEN) +#define LL_MAX_LINK_DATA_LEN 27 + +/* +** Event Parameters +*/ + +// Advertising Report Data +#define LL_ADV_RPT_ADV_IND LL_ADV_CONNECTABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_ADV_DIRECT_IND LL_ADV_CONNECTABLE_DIRECTED_EVT +#define LL_ADV_RPT_ADV_SCANNABLE_IND LL_ADV_SCANNABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_ADV_NONCONN_IND LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_SCAN_RSP (LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT + 1) +#define LL_ADV_RPT_INVALID 0xFF +// +#define LL_RSSI_NOT_AVAILABLE 127 + +// Sleep Clock Accuracy (SCA) +#define LL_SCA_500_PPM 0 +#define LL_SCA_250_PPM 1 +#define LL_SCA_150_PPM 2 +#define LL_SCA_100_PPM 3 +#define LL_SCA_75_PPM 4 +#define LL_SCA_50_PPM 5 +#define LL_SCA_30_PPM 6 +#define LL_SCA_20_PPM 7 + +/* +** Miscellaneous +*/ + +#define LL_MAX_NUM_DATA_CHAN 37 // 0 - 36 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ LL_MAX_NUM_DATA_CHAN ]; + uint16 numCrcErr[ LL_MAX_NUM_DATA_CHAN ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_SetScanParam API + * + * @brief This API is called by the HCI to set the Scanner's parameters. + * + * input parameters + * + * @param scanType - Passive or Active scan type. + * @param scanInterval - Time between scan events. + * @param scanWindow - Duration of a scan. When the same as the scan + * interval, then scan continuously. + * @param ownAddrType - Address type (Public or Random) to use in the + * SCAN_REQ packet. + * @param advWlPolicy - Either allow all Adv packets, or only those that + * are in the white list. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanParam( uint8 scanType, + uint16 scanInterval, + uint16 scanWindow, + uint8 ownAddrType, + uint8 advWlPolicy ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_SetScanControl API + * + * @brief This API is called by the HCI to start or stop the Scanner. It + * also specifies whether the LL will filter duplicate advertising + * reports to the Host, or generate a report for each packet + * received. + * + * input parameters + * + * @param scanMode - LL_SCAN_START or LL_SCAN_STOP. + * @param filterReports - LL_FILTER_REPORTS_DISABLE or + * LL_FILTER_REPORTS_ENABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_SetScanControl( uint8 scanMode, + uint8 filterReports ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); +#endif // CTRL_CONFIG=INIT_CFG + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/* +** LL Callbacks to HCI +*/ + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_AdvReportCback Callback + * + * @brief This Callback is used by the LL to provide information about + * advertisers from which an advertising packet was received. + * + * input parameters + * + * @param eventType - Type of advertisement packet received by Scanner + * or Initiator, and scan response for Initiator. + * @param advAddrType - Advertiser address type (public or random). + * @param advAddr - Advertiser address. + * @param dataLen - Size in bytes of advertisement packet. + * @param data - Advertisement data. + * @param rssi - RSSI value (-127..20dBm), or not available + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_AdvReportCback( uint8 eventType, + uint8 advAddrType, + uint8 *advAddr, + uint8 dataLen, + uint8 *data, + int8 rssi ); +#endif // CTRL_CONIFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); +#endif // CTRL_CONIFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); +#endif // CTRL_CONIFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + +#ifdef __cplusplus +} +#endif + +#endif /* LL_H */ + diff --git a/Firmware/Radio/Components/ble/controller/include/ll_math.h b/Firmware/Radio/Components/ble/controller/include/ll_math.h new file mode 100644 index 0000000..ed3ed7b --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/ll_math.h @@ -0,0 +1,84 @@ +/******************************************************************************* + Filename: ll_math.h + Revised: $Date: 2011-02-17 15:41:10 -0800 (Thu, 17 Feb 2011) $ + Revision: $Revision: 25131 $ + + Description: This file contains the types, contants, API's etc. for math + routines. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_MATH_H +#define LL_MATH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern NEAR_FUNC uint32 llDivide31By16To16( uint32 dividend, + uint16 divisor ); + + +#ifdef __cplusplus +} +#endif + +#endif /* LL_MATH_H */ diff --git a/Firmware/Radio/Components/ble/controller/include/ll_sleep.h b/Firmware/Radio/Components/ble/controller/include/ll_sleep.h new file mode 100644 index 0000000..a723884 --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/ll_sleep.h @@ -0,0 +1,100 @@ +/******************************************************************************* + Filename: ll_sleep.h + Revised: $Date: 2011-07-29 11:32:05 -0700 (Fri, 29 Jul 2011) $ + Revision: $Revision: 26968 $ + + Description: This file contains the Link Layer (LL) types, constants, + API's etc. for Sleep Management for the Bluetooth Low Energy + (ULE) Controller + + Copyright 2009-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_SLEEP_H +#define LL_SLEEP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// NanoRisc Execution Mode +#define LL_NR_STATE_IDLE 0 +#define LL_NR_STATE_RUNNING 1 + +// Sleep Management +#define LL_SLEEP_REQUEST_ALLOWED 0 +#define LL_SLEEP_REQUEST_DENIED 1 + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +extern volatile DATA unsigned char phyState; +extern volatile DATA unsigned char clkState; + +/******************************************************************************* + * API + */ + +extern NEAR_FUNC void HaltMcuUsingPhyFlag(void); +// +extern NEAR_FUNC void LL_TimeToNextRfEvent( uint32 *sleepTimer, uint32 *timeout ); +extern NEAR_FUNC uint8 LL_PowerOffReq( uint8 mode ); +extern NEAR_FUNC void LL_PowerOnReq( uint8 wakeForRF ); + +#ifdef __cplusplus +} +#endif + +#endif /* LL_SLEEP_H */ + diff --git a/Firmware/Radio/Components/ble/controller/include/ll_timer2.h b/Firmware/Radio/Components/ble/controller/include/ll_timer2.h new file mode 100644 index 0000000..0b5605d --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/ll_timer2.h @@ -0,0 +1,225 @@ +/******************************************************************************* + Filename: ll_timer2.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Link + Layer (LL) software timer management software for Timer2. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_TIMER2_H +#define LL_TIMER2_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +#define llDisableT2Event1() (T2CSPCFG |= LL_T2_DISABLE_EVENT1;) +#define llDisableT2Event2() (T2CSPCFG |= LL_T2_DISABLE_EVENT2;) +#define llAddTime( time, val ) (((time) + (val)) & LL_T2OVF_PERIOD_VALUE) +#define llSubTime( time, val ) (((time) - (val)) & LL_T2OVF_PERIOD_VALUE) + +/******************************************************************************* + * CONSTANTS + */ + +// Timer 2 Control Register +#define LL_T2_CTRL_INIT_NO_SYNCH 0x08 +#define LL_T2_CTRL_INIT_SYNCH 0x0A + +/* +** Timer 2 Multiplex Select +*/ +#define LL_T2_TIMER_SEL 0x00 +#define LL_T2_CAPTURE_SEL 0x01 +#define LL_T2_PERIOD_SEL 0x02 +#define LL_T2_COMPARE1_SEL 0x03 +#define LL_T2_COMPARE2_SEL 0x04 +// +#define LL_T2OVF_TIMER_SEL 0x00 +#define LL_T2OVF_CAPTURE_SEL 0x10 +#define LL_T2OVF_PERIOD_SEL 0x20 +#define LL_T2OVF_COMPARE1_SEL 0x30 +#define LL_T2OVF_COMPARE2_SEL 0x40 + +/* +** Timer 2 Interrupt Masks and Flags +*/ +#define LL_T2_PERIOD_FLAG 0x01 +#define LL_T2_COMPARE1_FLAG 0x02 +#define LL_T2_COMPARE2_FLAG 0x04 +// +#define LL_T2OVF_PERIOD_FLAG 0x08 +#define LL_T2OVF_COMPARE1_FLAG 0x10 +#define LL_T2OVF_COMPARE2_FLAG 0x20 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2_LONG_COMPARE1_FLAG 0x40 +#define LL_T2_LONG_COMPARE2_FLAG 0x80 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Interrupt Masks +*/ +#define LL_T2_PERIOD_MASK 0x01 +#define LL_T2_COMPARE1_MASK 0x02 +#define LL_T2_COMPARE2_MASK 0x04 +// +#define LL_T2OVF_PERIOD_MASK 0x08 +#define LL_T2OVF_COMPARE1_MASK 0x10 +#define LL_T2OVF_COMPARE2_MASK 0x20 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2_LONG_COMPARE1_MASK 0x40 +#define LL_T2_LONG_COMPARE2_MASK 0x80 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Event Configuration +*/ +#define LL_T2_PERIOD_EVENT1 0x00 +#define LL_T2_COMPARE1_EVENT1 0x01 +#define LL_T2_COMPARE2_EVENT1 0x02 +// +#define LL_T2OVF_PERIOD_EVENT1 0x03 +#define LL_T2OVF_COMPARE1_EVENT1 0x04 +#define LL_T2OVF_COMPARE2_EVENT1 0x05 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2OVF_LONG_CMP1_EVENT1 0x08 +#define LL_T2OVF_LONG_CMP2_EVENT1 0x09 +#define LL_T2_DISABLE_EVENT1 0x0F +#else // CC2540 +#define LL_T2_DISABLE_EVENT1 0x07 +#endif // CC2541 || CC2541S +// +#define LL_T2_PERIOD_EVENT2 0x00 +#define LL_T2_COMPARE1_EVENT2 0x10 +#define LL_T2_COMPARE2_EVENT2 0x20 +// +#define LL_T2OVF_PERIOD_EVENT2 0x30 +#define LL_T2OVF_COMPARE1_EVENT2 0x40 +#define LL_T2OVF_COMPARE2_EVENT2 0x50 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2OVF_LONG_CMP1_EVENT2 0x80 +#define LL_T2OVF_LONG_CMP2_EVENT2 0x90 +#define LL_T2_DISABLE_EVENT2 0xF0 +#else // CC2540 +#define LL_T2_DISABLE_EVENT2 0x70 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Miscellanous +*/ + +#define LL_T2_RUN_BIT 0x01 // 0: stop timer; 1: run timer +#define LL_T2_SYNCH_BIT 0x02 // 0: start/stop immediate; 1: start/stop synch with 32kHz +#define LL_T2_STATE_BIT 0x04 +#define LL_T2_PERIOD_VALUE 0x4E20 // 20K 32MHz ticks = 625us +#define LL_T2_PERIOD_1US_VALUE 0x20 // 1us in 31.25ns ticks +#define LL_T2OVF_PERIOD_VALUE 0x00FFFFFF // full 24 bit range, or 2.913 hours +#define LL_T2_MAX_VALUE 0x01000000 // full 24 bit range + +/******************************************************************************* + * TYPEDEFS + */ + +/* +** Anchor Point +*/ +typedef struct +{ + uint32 coarse; // number of 625us ticks at SFD capture + uint16 fine; // number of 31.25ns ticks at SFD capture +} sysTime_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern void llInitTimer2( void ); +extern void llStopTimer2( void ); +extern void llStartTimer2( void ); +extern void llSetT2C1Timeout( uint16 timeout ); +extern void llSetT2C2Timeout( uint16 timeout ); +extern void llSetT2OVFC1Timeout( uint32 timeout ); +extern void llSetT2OVFC2Timeout( uint32 timeout ); +extern void llSetT2LongC1Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2LongC2Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2C1Event1( uint16 timeout ); +extern void llSetT2OVFC1Event1( uint32 timeout ); +extern void llSetT2LongC1Event1( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2OVFC2Event2( uint32 timeout ); +extern void llSetT2Delta( uint16 count ); +extern void llDisableT2Ints( void ); +extern void llDisableT2IntsEvts( void ); +extern void llDisableT2E1( void ); +extern void llGetTimer2Capture( uint32 *coarseTime, uint16 *fineTime ); +extern uint32 llGetCurrentTime( void ); +extern uint16 llGetCurrentFineTime( void ); +extern void llGetFullCurrentTime( uint32 *coarse, uint16 *fine ); +//extern void llGetFullCTandST( uint32 *coarseTime, uint16 *fineTime, uint32 *sleepTime ); +extern void llGetFullCTandST( sysTime_t *curTime, uint32 *sleepTime ); +extern uint32 llGetT2OVFC1( void ); +extern uint32 llGetT2OVFC2( void ); +extern uint16 ll_McuPrecisionCount( void ); +// +extern NEAR_FUNC uint8 ll24BitTimeCompare( uint32 time1, uint32 time2 ); +extern NEAR_FUNC uint32 ll24BitTimeDelta( uint32 time1, uint32 time2 ); +extern NEAR_FUNC uint32 ll24BitAbsTimeDelta( uint32 time1, uint32 time2 ); +extern NEAR_FUNC void llAdjustTimeForward( sysTime_t *curTime, sysTime_t *adjTime ); +extern NEAR_FUNC void llAdjustTimeBackward( sysTime_t *curTime, sysTime_t *adjTime ); + +#ifdef __cplusplus +} +#endif + +#endif /* LL_TIMER2_H */ diff --git a/Firmware/Radio/Components/ble/controller/include/phy.h b/Firmware/Radio/Components/ble/controller/include/phy.h new file mode 100644 index 0000000..da1cbe2 --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/phy.h @@ -0,0 +1,2354 @@ +/******************************************************************************* + Filename: phy.h + Revised: $Date: 2012-09-21 10:29:50 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31589 $ + + Description: This is the header file of Physical Layer (PHY) module. All + the exported functions and data types will be defined here. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef PHY_H +#define PHY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "hal_types.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +#if defined( CC2541) || defined( CC2541S ) +#include "ioCC2541_extra.h" +#else // CC2540 +#include "ioCC2540_extra.h" +#endif // CC2541 || CC2541S + +/******************************************************************************* + * MACROS + */ + +#if !defined(USE_PHY_FUNCS) + +// default to PHY macros to speed up processing + +#define PHY_GET_CHIP_ID() (*(P_INFOPAGE+3)) + +#define PHY_WRITE_BYTE( data, len ) \ + { \ + uint8 z; \ + for (z=0; z<(len); z++) { RFD = (data)[z]; } \ + } + +#define PHY_WRITE_BYTE_VAL( value ) (RFD = (value)) + +#define PHY_READ_BYTE( ptr, len ) \ + st( uint8 z; \ + if ( (ptr) == NULL ) \ + { \ + for (z=0; z<(len); z++) \ + { RFD; } \ + } \ + else \ + { \ + for (z=0; z<(len); z++) \ + { (ptr)[z] = RFD; } \ + } \ + ) + +#define PHY_READ_BYTE_VAL() (RFD) + +#define PHY_RESET_TX_FIFO() (RFST = PHY_FIFO_TX_RESET) + +#define PHY_RESET_RX_FIFO() (RFST = PHY_FIFO_RX_RESET) + +#define PHY_RESET_TXRX_FIFO() (RFST = PHY_FIFO_RESET) + +#define PHY_COMMAND( cmd ) \ + st( while( RFST != 0 ); \ + if ( (cmd) != PHY_CMD_INVALID ) \ + { \ + RFST = (cmd); \ + } \ + ) + +#define PHY_CLEAR_COUNTERS() \ + st( BLE_NTXDONE = 0; \ + BLE_NTXACK = 0; \ + BLE_NTXCTRLACK = 0; \ + BLE_NTXCTRL = 0; \ + BLE_NTXRETRANS = 0; \ + BLE_NTX = 0; \ + BLE_NRXOK = 0; \ + BLE_NRXCTRL = 0; \ + BLE_NRXNOK = 0; \ + BLE_NRXIGNORED = 0; \ + BLE_NRXEMPTY = 0; \ + BLE_NRXFIFOFULL = 0; \ + ) + +#define PHY_READ_COUNTERS( ptr ) \ + st( (*((ptr)+0)) = BLE_NTXDONE; \ + (*((ptr)+1)) = BLE_NTXACK; \ + (*((ptr)+2)) = BLE_NTXCTRLACK; \ + (*((ptr)+3)) = BLE_NTXCTRL; \ + (*((ptr)+4)) = BLE_NTXRETRANS; \ + (*((ptr)+5)) = BLE_NTX; \ + (*((ptr)+6)) = BLE_NRXOK; \ + (*((ptr)+7)) = BLE_NRXCTRL; \ + (*((ptr)+8)) = BLE_NRXNOK; \ + (*((ptr)+9)) = BLE_NRXIGNORED; \ + (*((ptr)+10)) = BLE_NRXEMPTY; \ + (*((ptr)+11)) = BLE_NRXFIFOFULL; \ + ) + +#define PHY_TX_FIFO_LEN() (RFTXFLEN) + +#define PHY_RX_FIFO_LEN() (RFRXFLEN) + +#define PHY_INIT_LAST_RSSI() (BLE_LAST_RSSI = PHY_RSSI_VALUE_INVALID) + +#define PHY_GET_LAST_RSSI() (BLE_LAST_RSSI) + +#define PHY_GET_RSSI() (RSSI) + +#define PHY_CLR_WINCONF() (BLE_WINCONF = 0); + +#define PHY_SET_DYN_WINOFFSET( winOffset, connInterval ) \ + st( BLE_WINOFFSET_0 = (winOffset) & 0xFF; \ + BLE_WINOFFSET_1 = (winOffset) >> 8; \ + BLE_WINMOD_0 = (connInterval) & 0xFF; \ + BLE_WINMOD_1 = (connInterval) >> 8; \ + BLE_WINCONF = 0xC1; \ + ) + +#define PHY_TX_FIFO_BYTES_FREE() (PHY_FIFO_SIZE - RFTXFLEN) + +#define PHY_COMMIT_TX_FIFO() (RFST = PHY_FIFO_TX_COMMIT) + +#define PHY_ANCHOR_VALID() (BLE_ANCHOR_VALID) + +#define PHY_GET_DATA_CHAN() (BLE_CHAN) + +#else // PHY functions + +// PHY functions +#define PHY_GET_CHIP_ID() PHY_GetChipID() +#define PHY_WRITE_BYTE( data, len ) PHY_WriteByte( (data), (len) ) +#define PHY_WRITE_BYTE_VAL( value ) PHY_WriteByteVal( (value) ) +#define PHY_READ_BYTE( ptr, len ) PHY_ReadByte( (ptr), (len) ) +#define PHY_READ_BYTE_VAL() PHY_ReadByteVal() +#define PHY_RESET_TX_FIFO() PHY_ResetTxFifo() +#define PHY_RESET_RX_FIFO() PHY_ResetRxFifo() +#define PHY_RESET_TXRX_FIFO() PHY_ResetTxRxFifo() +#define PHY_COMMAND( cmd ) PHY_Command( (cmd) ) +#define PHY_CLEAR_COUNTERS() PHY_ClearCounters() +#define PHY_READ_COUNTERS( ptr ) PHY_ReadCounters( (ptr) ) +#define PHY_TX_FIFO_LEN() PHY_TxFifoLen() +#define PHY_RX_FIFO_LEN() PHY_RxFifoLen() +#define PHY_INIT_LAST_RSSI() PHY_InitLastRssi() +#define PHY_GET_LAST_RSSI() PHY_GetLastRssi() +#define PHY_GET_RSSI() PHY_GetRssi() +#define PHY_CLR_WINCONF() PHY_ClearWindowConfig() +#define PHY_SET_DYN_WINOFFSET( winOff, ci ) PHY_SetDynamicWinOffset( (winOff), (ci) ) +#define PHY_TX_FIFO_BYTES_FREE() PHY_TxFifoBytesFree() +#define PHY_COMMIT_TX_FIFO() PHY_CommitTxFifo() +#define PHY_GET_DATA_CHAN() PHY_GetDataChan() + +#endif // !USE_PHY_FUNCS + +/******************************************************************************* + * CONSTANTS + */ + +// Chip ID +#define PHY_CHIP_ID_CC2540 0x8D +#define PHY_CHIP_ID_CC2541 0x41 +#define PHY_CHIP_ID_CC2541S 0x42 + +// FIFO Size & Addresses +#define PHY_DATA_BANK_PTR RFCORE_RAM +#define PHY_RX_FIFO_PTR RXFIFO +#define PHY_TX_FIFO_PTR TXFIFO + +// nR RAM Registers +#define BLE_REG_BASE_ADDR (0x6000) +#define BLE_RX_FIFO_BASE_ADDR (0x6080) +#define BLE_TX_FIFO_BASE_ADDR (0x6100) +#define BLE_BANK_SIZE 128 +#define BLE_MAX_TX_FIFO_SIZE 128 +#define BLE_MAX_RX_FIFO_SIZE 128 + +#define BLE_CHAN XREG((BLE_REG_BASE_ADDR + 0)) // BLE_LSI_CHAN +#define BLE_CHANMAP XREG((BLE_REG_BASE_ADDR + 1)) // BLE_A_CHANMAP +#define BLE_FIFO_CONF XREG((BLE_REG_BASE_ADDR + 2)) // BLE_FIFO_CONF +#define BLE_CONF XREG((BLE_REG_BASE_ADDR + 3)) // BLE_L_CONF +#define BLE_MAXNACK XREG((BLE_REG_BASE_ADDR + 4)) // BLE_L_MAXNACK + +#define BLE_CRCINIT_0 XREG((BLE_REG_BASE_ADDR + 5)) // BLE_L_CRCINIT +#define BLE_CRCINIT_1 XREG((BLE_REG_BASE_ADDR + 6)) // BLE_L_CRCINIT +#define BLE_CRCINIT_2 XREG((BLE_REG_BASE_ADDR + 7)) // BLE_L_CRCINIT + +#define BLE_SEQSTAT XREG((BLE_REG_BASE_ADDR + 8)) // BLE_L_SEQSTAT + +#define BLE_BLACKLIST XREG((BLE_REG_BASE_ADDR + 9)) // BLE_S_BLACKLIST + +#define BLE_BACKOFFCNT_0 XREG((BLE_REG_BASE_ADDR + 10)) // BLE_S_BACKOFFCNT +#define BLE_BACKOFFCNT_1 XREG((BLE_REG_BASE_ADDR + 11)) // BLE_S_BACKOFFCNT + +#define BLE_SCANCONF XREG((BLE_REG_BASE_ADDR + 12)) // BLE_S_CONF + +#define BLE_WINCONF XREG((BLE_REG_BASE_ADDR + 13)) // BLE_I_WIN_CONF + +#define BLE_WINOFFSET_0 XREG((BLE_REG_BASE_ADDR + 14)) // BLE_I_WIN_OFFSET +#define BLE_WINOFFSET_1 XREG((BLE_REG_BASE_ADDR + 15)) // BLE_I_WIN_OFFSET + +#define BLE_WINMOD_0 XREG((BLE_REG_BASE_ADDR + 16)) // BLE_I_WIN_MOD +#define BLE_WINMOD_1 XREG((BLE_REG_BASE_ADDR + 17)) // BLE_I_WIN_MOD + +#define BLE_MAX_LEN XREG((BLE_REG_BASE_ADDR + 18)) // BLE_MAX_LEN +#define BLE_LEN_BIT_MASK XREG((BLE_REG_BASE_ADDR + 19)) // BLE_LEN_BIT_MASK + +#define BLE_WLPOLICY XREG((BLE_REG_BASE_ADDR + 20)) // BLE_ASI_WLPOLICY +#define BLE_ADDRTYPE XREG((BLE_REG_BASE_ADDR + 21)) // BLE_ASI_ADDRTYPE + +#define BLE_OWNADDR_0 XREG((BLE_REG_BASE_ADDR + 22)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_1 XREG((BLE_REG_BASE_ADDR + 23)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_2 XREG((BLE_REG_BASE_ADDR + 24)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_3 XREG((BLE_REG_BASE_ADDR + 25)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_4 XREG((BLE_REG_BASE_ADDR + 26)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_5 XREG((BLE_REG_BASE_ADDR + 27)) // BLE_ASI_OWNADDR + +#define BLE_PEERADDR_0 XREG((BLE_REG_BASE_ADDR + 28)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_1 XREG((BLE_REG_BASE_ADDR + 29)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_2 XREG((BLE_REG_BASE_ADDR + 30)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_3 XREG((BLE_REG_BASE_ADDR + 31)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_4 XREG((BLE_REG_BASE_ADDR + 32)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_5 XREG((BLE_REG_BASE_ADDR + 33)) // BLE_AI_PEERADDR + +#define BLE_WLVALID XREG((BLE_REG_BASE_ADDR + 34)) // BLE_ASI_WLVALID +#define BLE_WLADDRTYPE XREG((BLE_REG_BASE_ADDR + 35)) // BLE_ASI_WLADTYPE +#define BLE_WL_PTR PXREG((BLE_REG_BASE_ADDR + 36)) // BLE_ASI_WHITELIST0..BLE_ASI_WHITELIST7 + +#define BLE_NTXDONE XREG((BLE_REG_BASE_ADDR + 84)) // BLE_L_NTXDONE +#define BLE_NTXACK XREG((BLE_REG_BASE_ADDR + 85)) // BLE_L_NTXACK +#define BLE_NTXCTRLACK XREG((BLE_REG_BASE_ADDR + 86)) // BLE_L_NTXCTRLACK +#define BLE_NTXCTRL XREG((BLE_REG_BASE_ADDR + 87)) // BLE_L_NTXCTRL +#define BLE_NTXRETRANS XREG((BLE_REG_BASE_ADDR + 88)) // BLE_L_NTXRETRANS +#define BLE_NTX XREG((BLE_REG_BASE_ADDR + 89)) // BLE_NTX +#define BLE_NRXOK XREG((BLE_REG_BASE_ADDR + 90)) // BLE_NRXOK +#define BLE_NRXCTRL XREG((BLE_REG_BASE_ADDR + 91)) // BLE_L_NRXCTRL +#define BLE_NRXNOK XREG((BLE_REG_BASE_ADDR + 92)) // BLE_NRXNOK +#define BLE_NRXIGNORED XREG((BLE_REG_BASE_ADDR + 93)) // BLE_NRXIGNORED +#define BLE_NRXEMPTY XREG((BLE_REG_BASE_ADDR + 94)) // BLE_L_NRXEMPTY +#define BLE_NRXFIFOFULL XREG((BLE_REG_BASE_ADDR + 95)) // BLE_NRXFIFOFULL + +//////////////////////////////////////////////////////////////////////////////// +// Raw Data Transmit and Receive Only +// Note: Only the following registers and BLE_ENDCAUSE are valid when the nR is +// configured to operate as a Raw Transmit/Receive task. This task is +// only used for Direct Test Mode. +// +#define BLE_RAW_CONF XREG((BLE_REG_BASE_ADDR + 81)) // BLE_RAW_CONF +#define BLE_RAW_FIFOCMD XREG((BLE_REG_BASE_ADDR + 82)) // BLE_RAW_FIFOCMD +#define BLE_RAW_WINIT XREG((BLE_REG_BASE_ADDR + 83)) // BLE_RAW_WINIT +#define BLE_RAW_CRCINIT0 XREG((BLE_REG_BASE_ADDR + 84)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT1 XREG((BLE_REG_BASE_ADDR + 85)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT2 XREG((BLE_REG_BASE_ADDR + 86)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT3 XREG((BLE_REG_BASE_ADDR + 87)) // BLE_RAW_CRCINIT +// +#define BLE_RAW_NTX0 XREG((BLE_REG_BASE_ADDR + 88)) // BLE_RAW_NTX +#define BLE_RAW_NTX1 XREG((BLE_REG_BASE_ADDR + 89)) // BLE_RAW_NTX +#define BLE_RAW_NRXOK0 XREG((BLE_REG_BASE_ADDR + 90)) // BLE_RAW_NRXOK +#define BLE_RAW_NRXOK1 XREG((BLE_REG_BASE_ADDR + 91)) // BLE_RAW_NRXOK +#define BLE_RAW_NRXNOK0 XREG((BLE_REG_BASE_ADDR + 92)) // BLE_RAW_NRXNOK +#define BLE_RAW_NRXNOK1 XREG((BLE_REG_BASE_ADDR + 93)) // BLE_RAW_NRXNOK +// +#define BLE_RAW_TX_CRC_LEN XREG((BLE_REG_BASE_ADDR + 94)) // BLE_TX_CRC_LENGTH +#define BLE_RAW_RX_LEN XREG((BLE_REG_BASE_ADDR + 95)) // BLE_RX_LENGTH +// +//////////////////////////////////////////////////////////////////////////////// + +#define BLE_LAST_RSSI XREG((BLE_REG_BASE_ADDR + 96)) // BLE_RX_RSSI +#define BLE_ENDCAUSE XREG((BLE_REG_BASE_ADDR + 97)) // BLE_ENDCAUSE +#define BLE_ANCHOR_VALID XREG((BLE_REG_BASE_ADDR + 98)) // BLE_ANCHOR_VALID +#define BLE_DF_BYTES XREG((BLE_REG_BASE_ADDR + 99)) // BLE_A_DF_BYTES +#define BLE_RX_TIMEOUT0 XREG((BLE_REG_BASE_ADDR + 100)) // BLE_L_RXTIMEOUT LSO +#define BLE_RX_TIMEOUT1 XREG((BLE_REG_BASE_ADDR + 101)) // BLE_L_RXTIMEOUT MSO + +// White List Owner +#define PHY_SCAN_WL 0 +#define PHY_HOST_WL 1 + +// RF Constants +#define PHY_FIFO_SIZE 0x80 +#define PHY_RSSI_VALUE_INVALID 0x80 +#define PHY_NUM_RF_CHANS 40 +#define PHY_FIRST_RF_CHAN 0 +#define PHY_LAST_RF_CHAN (PHY_NUM_RF_CHANS-1) + +// RF FIFO Command Values +#define PHY_FIFO_RX_RESET 0x81 +#define PHY_FIFO_RX_DEALLOC 0x82 +#define PHY_FIFO_RX_RETRY 0x83 +#define PHY_FIFO_RX_DISCARD 0x84 +#define PHY_FIFO_RX_COMMIT 0x85 +// +#define PHY_FIFO_TX_RESET 0x91 +#define PHY_FIFO_TX_DEALLOC 0x92 +#define PHY_FIFO_TX_RETRY 0x93 +#define PHY_FIFO_TX_DISCARD 0x94 +#define PHY_FIFO_TX_COMMIT 0x95 +// +#define PHY_FIFO_RESET 0xF1 +#define PHY_FIFO_DEALLOC 0xF2 +#define PHY_FIFO_RETRY 0xF3 +#define PHY_FIFO_DISCARD 0xF4 +#define PHY_FIFO_COMMIT 0xF5 + +// RF Registers +#define PHY_PN7_WHITENER_BIT BV(0) +#define PHY_PN9_WHITENER_BIT BV(1) +// +#define PHY_MOD_NO_TONE 0x04 +#define PHY_MOD_GFSK_250KHZ_1MBPS_TONE 0x24 +#define PHY_MOD_GFSK_156KHZ_250KBPS_TONE 0x28 +#define PHY_MOD_GFSK_156KHZ_1MBPS_TONE 0x2C +#define PHY_MOD_MSK_250KBPS_TONE 0x30 +#define PHY_MOD_MSK_500KBPS_TONE 0x32 +#define PHY_MOD_MSK_1MBPS_TONE 0x34 +// +#define PHY_CORRELATION_THRESHOLD 0x48 +#define PHY_FREQ_OFFSET 0x40 + +#if defined( CC2541) || defined( CC2541S ) +#define PHY_TX_FILTER_CONFIG 0x03 +#define PHY_TX_CTRL_DAC_CURRENT 0x19 +#define PHY_TX_IV_CTRL 0x1B +#define PHY_PREAMBLE_SYNC 0x02 +#else // CC2540 +#define PHY_TX_FILTER_CONFIG 0x07 +#define PHY_TX_CTRL_DAC_CURRENT 0x69 +#define PHY_TX_IV_CTRL 0xFF // Don't Care as Not Used! +#define PHY_COMP_QUAD_SKEW 0x16 +#define PHY_PREAMBLE_SYNC 0x00 +#endif // CC2541 || CC2541S + +// Frequency Tuning +#define PHY_FREQ_TUNE_NO_CAP_LOAD 0x0F + +// Rx Gain +#define PHY_RX_LNA_GAIN_STD 0x3A +#define PHY_RX_LNA_GAIN_HIGH 0x7F +#define PHY_RX_CTRL_STD 0x33 +#define PHY_RX_CTRL_HIGH 0x3F +#define PHY_RX_FSCTRL_STD 0x55 +#define PHY_RX_FSCTRL_HIGH 0x5A +// CC2590 +#define PHY_CC2590_HGM_LOW 0x00 +#define PHY_CC2590_HGM_HIGH 0x01 + +// RSSI Correction Based on Rx Gain +#define PHY_RSSI_DB2DBM_STD_GAIN 0x61 +#define PHY_RSSI_DB2DBM_HIGH_GAIN 0x6A + +// RSSI Correction Based on Rx Gain for CC2590 RF Range Extender +#define PHY_RSSI_DB2DBM_STD_GAIN_CC2590 0x67 +#define PHY_RSSI_DB2DBM_HIGH_GAIN_CC2590 0x71 + +// Tx Output Power +#if defined( CC2541) || defined( CC2541S ) +#define PHY_TX_POWER_REG_MINUS_23_DBM 0x31 +#define PHY_TX_POWER_REG_MINUS_6_DBM 0xB1 +#define PHY_TX_POWER_REG_0_DBM 0xE1 +#define PHY_TX_POWER_REG_4_DBM 0xFF // Don't Care as Not Used! +#else // CC2540 +#define PHY_TX_POWER_REG_MINUS_23_DBM 0x05 +#define PHY_TX_POWER_REG_MINUS_6_DBM 0x95 +#define PHY_TX_POWER_REG_0_DBM 0xD5 +#define PHY_TX_POWER_REG_4_DBM 0xF5 +#endif // CC2541 || CC2541S + +// RF Normal Interrupts +#define PHY_RFIRQ0_TXTHSHDN_BIT BV(0) +#define PHY_RFIRQ0_RXTHSHDN_BIT BV(1) +#define PHY_RFIRQ0_TXTHSHUP_BIT BV(2) +#define PHY_RFIRQ0_RXTHSHUP_BIT BV(3) +// +#define PHY_RFIRQ1_RXOK_BIT BV(0) +#define PHY_RFIRQ1_RXCTRL_BIT BV(1) +#define PHY_RFIRQ1_RXNOK_BIT BV(2) +#define PHY_RFIRQ1_RXIGNORED_BIT BV(3) +#define PHY_RFIRQ1_RXEMPTY_BIT BV(4) +#define PHY_RFIRQ1_TXDONE_BIT BV(5) +#define PHY_RFIRQ1_TASKDONE_BIT BV(6) +#define PHY_RFIRQ1_PINGRSP_BIT BV(7) + +// RF Error Interrupts +#define PHY_RFERR_TXUNDERF_BIT BV(0) +#define PHY_RFERR_RXUNDERF_BIT BV(1) +#define PHY_RFERR_TXOVERF_BIT BV(2) +#define PHY_RFERR_RXOVERF_BIT BV(3) +#define PHY_RFERR_RXTXABO_BIT BV(4) +#define PHY_RFERR_NRERR_BIT BV(5) +#define PHY_RFERR_RXFIFOFULL_BIT BV(6) + +/******************************************************************************* + * TYPEDEFS + */ + +typedef unsigned char volatile __xdata * phyXRegPtr_t; +typedef unsigned char volatile __xdata * phyXDataPtr_t; + +enum +{ + PHY_STATUS_SUCCESS, + PHY_STATUS_FAILURE, + PHY_STATUS_ERROR_BL_CKSUM_FAILURE, + PHY_STATUS_WL_FULL, + PHY_STATUS_WL_EMPTY, + PHY_STATUS_WL_ENTRY_NOT_FOUND, + PHY_STATUS_WL_ENTRY_FOUND +}; +typedef uint8 phyStatus_t; + +enum +{ + PHY_SEM_0, + PHY_SEM_1, + PHY_SEM_2 +}; +typedef uint8 phySemId_t; + + +enum +{ + PHY_ADDR_TYPE_PUBLIC, + PHY_ADDR_TYPE_RANDOM +}; +typedef uint8 phyAddrType_t; + + +enum +{ + PHY_ADV_CHANNEL_37 = BV(0), + PHY_ADV_CHANNEL_38 = BV(1), + PHY_ADV_CHANNEL_39 = BV(2) +}; +typedef uint8 phyChanMap_t; + + +enum +{ + PHY_SCAN_MODE_PASSIVE, + PHY_SCAN_MODE_ACTIVE +}; +typedef uint8 phyScanMode_t; + +enum +{ + PHY_SCAN_END_ON_ADV_REPORT_DISABLED, + PHY_SCAN_END_ON_ADV_REPORT_ENABLED +}; +typedef uint8 phyScanEnd_t; + +enum +{ + PHY_END_CONN_CONTINUE, // set ENDC = 0 + PHY_END_CONN_AFTER_NEXT_PKT // set ENDC = 1 +}; +typedef uint8 phyEndConn_t; + +enum +{ + PHY_MD_BIT_FROM_FIFO_ENTRY = (0 << 1), // use bit in packet + PHY_MD_BIT_BASED_ON_FIFO_CONTENTS = (1 << 1), // set MD based on data in TX FIFO + PHY_MD_BIT_ALWAYS_ZERO = (2 << 1), // always 0 + PHY_MD_BIT_ALWAYS_ONE = (3 << 1) // always 1 +}; +typedef uint8 phyConfMD_t; + +enum +{ + PHY_FIFO_DATA_DIABLE_ALL = 0, + PHY_FIFO_DATA_AUTO_FLUSH_IGNORED = BV(0), + PHY_FIFO_DATA_AUTO_FLUSH_CRC_ERROR = BV(1), + PHY_FIFO_DATA_AUTO_FLUSH_EMPTY_PKT = BV(2), + PHY_FIFO_DATA_APPEND_RX_STATUS = BV(3) +}; +typedef uint8 phyFifoData_t; + +enum +{ + PHY_FIFO_CONFIG_DISABLE_ALL = 0, + PHY_FIFO_CONFIG_AUTO_DEALLOC_RX = BV(0), + PHY_FIFO_CONFIG_AUTO_COMMIT_RX = BV(1), + PHY_FIFO_CONFIG_AUTO_DEALLOC_TX = BV(4), + PHY_FIFO_CONFIG_AUTO_COMMIT_TX = BV(5) +}; +typedef uint8 phyFifoConfig_t; + +enum +{ + PHY_ADVERTISER_WHITE_LIST_NONE, + PHY_ADVERTISER_WHITE_LIST_SCAN_REQ, + PHY_ADVERTISER_WHITE_LIST_CONNECT_REQ, + PHY_ADVERTISER_WHITE_LIST_ALL +}; +typedef uint8 phyAdvWlPolicy_t; + +enum +{ + PHY_SCANNER_ALLOW_ALL_ADV_PKTS, + PHY_SCANNER_USE_WHITE_LIST +}; +typedef uint8 phyScanWlPolicy_t; + +enum +{ + PHY_INITIATOR_USE_PEER_ADDR, + PHY_INITIATOR_USE_WL +}; +typedef uint8 phyInitWlPolicy_t; + +enum +{ + PHY_SET_BLACKLIST_DISABLE, + PHY_SET_BLACKLIST_ENABLE +}; +typedef uint8 phyBlacklist_t; + +enum +{ + PHY_DISABLE_ALL_WHITENER, + PHY_ENABLE_BLE_WHITENER, + PHY_DISABLE_BLE_WHITENER, + PHY_ENABLE_PN9_WHITENER, + PHY_DISABLE_PN9_WHITENER, + PHY_ENABLE_ONLY_BLE_WHITENER, + PHY_ENABLE_ONLY_PN9_WHITENER, + PHY_ENABLE_ALL_WHITENER +}; +typedef uint8 phyWhitener_t; + +enum +{ + PHY_ENABLE_APPEND_RF_STATUS, + PHY_DISABLE_APPEND_RF_STATUS +}; +typedef uint8 phyAppendRfStatus_t; + +enum +{ + PHY_RF_RAM_BANK_0, + PHY_RF_RAM_BANK_1, + PHY_RF_RAM_BANK_2, + PHY_RF_RAM_BANK_3, + PHY_RF_RAM_BANK_4, + PHY_RF_RAM_BANK_5, + PHY_RF_RAM_RX_FIFO, + PHY_RF_RAM_TX_FIFO +}; +typedef uint8 phyRfRamBank_t; + +enum +{ + PHY_CMD_SHUTDOWN = 1, // stop operation immediately + PHY_CMD_DEMOD_TEST = 2, // start demodulator w/o sync search + PHY_CMD_RX_TEST = 3, // start demodulator & sync search + PHY_CMD_TX_TEST = 4, // start TX, send zeros + PHY_CMD_TX_CAL_TEST = 5, // calibrate, start TX, send zeros + PHY_CMD_PING = 6, // ping RF + + PHY_CMD_BLE_SLAVE = 16, // Slave + PHY_CMD_BLE_MASTER = 17, // Master + + PHY_CMD_BLE_ADV = 18, // Connectable Undirected Advertiser + PHY_CMD_BLE_ADV_DIR = 19, // Connectable Directed Advertiser + PHY_CMD_BLE_ADV_NC = 20, // Nonconnectable Advertiser + PHY_CMD_BLE_ADV_DISC = 21, // Discoverable Undirected Advertiser + + PHY_CMD_BLE_SCAN = 22, // Scanner + PHY_CMD_BLE_INITIATOR = 23, // Initiator + + PHY_CMD_BLE_RX_RAW = 24, // RX raw data + PHY_CMD_BLE_TX_RAW = 25, // TX a raw data message + + PHY_CMD_SEND_EVENT1 = 33, // trigger Timer 2 Event 1 + PHY_CMD_SEND_EVENT2 = 34, // trigger Timer 2 Event 2 + + PHY_CMD_INVALID = 0xFF +}; +typedef uint8 phyCmd_t; + +enum +{ + PHY_TASK_ENDOK = 0, // task ended normally + PHY_TASK_RXTIMEOUT = 1, // timeout of first RX; slave, scan, init + PHY_TASK_NOSYNC = 2, // timeout of subsequent RX + PHY_TASK_RXERR = 3, // task ended due to RX error (CRC or other) + PHY_TASK_CONNECT = 4, // CONNECT_REQ received; adv + PHY_TASK_MAXNACK = 5, // max number retrans exceeded; master, slave + PHY_TASK_ABORT = 6, // task aborted by command + // + // Note: If the following values are changed to non-negative numbers, all + // table entry indices for taskErrorEndCauses will have to be changed + // as well. + // + PHY_TASKERR_RXFIFO = 250, // overfull RX FIFO; adv, scan, init + PHY_TASKERR_TXFIFO = 251, // empty TX FIFO when not permitted + PHY_TASKERR_PAR = 252, // illegal parameter + PHY_TASKERR_SEM = 253, // unable to obtain semaphore + PHY_TASKERR_CMD = 254, // unknown command + PHY_TASKERR_INTERNAL = 255 // internal program error +}; + +enum +{ + PHY_FREQ_MODE_MODULATED_CW, + PHY_FREQ_MODE_UNMODULATED_CW +}; +typedef uint8 phyFreqMode_t; + +enum +{ + PHY_RAW_RUN_ONCE, + PHY_RAW_RUN_REPEAT +}; +typedef uint8 phyRawRunMode_t; + +enum +{ + PHY_RAW_START_IMMEDIATE, + PHY_RAW_START_ON_TIMER_EVENT +}; +typedef uint8 phyRawStartMode_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * API + */ + +/******************************************************************************* + * @fn PHY_Init + * + * @brief Loads the nanoRisc image and initialises PHY module. + * + * Note: This routine does not verify the nR image after loading. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Init( void ); + + +/******************************************************************************* + * @fn PHY_Reset + * + * @brief Holds the nR in Reset, then releases it. + * + * Note: This will clear any nR pending interrupts. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Reset( void ); + + +/******************************************************************************* + * @fn PHY_LoadNR + * + * @brief Copies nanoRisc image from the array to nanoRisc memory + * location. + * + * Note: After the load, the nanoRisc is left in reset. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_LoadNR( void ); + + +/******************************************************************************* + * @fn PHY_VerifyNR + * + * @brief Verifies that the nanoRisc image in the memory is not corrupted. + * Compares the RAM memory data with the image array which is + * located in the code section. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_FAILURE + */ +phyStatus_t PHY_VerifyNR( void ); + + +/******************************************************************************* + * @fn PHY_ClearAllRegsAndFifos + * + * @brief Clears the nanoRisc register bank, and the TX and RX FIFO banks. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearAllRegsAndFifos( void ); + + +/******************************************************************************* + * @fn PHY_GetSem + * + * @brief Get the specified semaphore. + * + * input parameters + * + * @param semId - PHY_SEM_0, PHY_SEM_1, PHY_SEM_2. + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS: Semaphore was free and was taken. + * PHY_STATUS_FAILURE: Semaphore is not free. + */ +phyStatus_t PHY_GetSem( phySemId_t semId ); + + +/******************************************************************************* + * @fn PHY_ReleaseSem + * + * @brief Release the specified semaphore. + * + * input parameters + * + * @param semId - PHY_SEM_0, PHY_SEM_1, PHY_SEM_2 + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS: Semaphore was released. + * PHY_STATUS_FAILURE: Semaphore was already free. + */ +phyStatus_t PHY_ReleaseSem( phySemId_t semId ); + + +/******************************************************************************* + * @fn PHY_SetOwnAddr + * + * @brief Set Own device address and address type. + * + * input parameters + * + * @param addr - Pointer to Own device BLE address. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetOwnAddr( uint8 *addr, + phyAddrType_t addrType); + + +/******************************************************************************* + * @fn PHY_SetPeerAddr + * + * @brief Set Peer device address and address type. + * + * input parameters + * + * @param addr - Pointer to Peer device BLE address. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetPeerAddr( uint8 *addr, + phyAddrType_t addrType); + + +/******************************************************************************* + * @fn PHY_SetCRCInit + * + * @brief Set initial CRC value used in a connection. + * + * input parameters + * + * @param crcInit - Initial 3 byte CRC value. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetCRCInit( uint32 crcInit ); + + +/******************************************************************************* + * @fn PHY_GetAdvChans + * + * @brief Read the configured advertising channels to be used. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Three bit Advertising bit map of a combination of: + * PHY_ADV_CHANNEL_37, PHY_ADV_CHANNEL_38, and PHY_ADV_CHANNEL_39. + */ +phyChanMap_t PHY_GetAdvChans( void ); + + +/******************************************************************************* + * @fn PHY_SetAdvChans + * + * @brief Configure the advertising channels to be used. + * + * input parameters + * + * @param advChanMap - Three bit Advertising bit map of a combination of: + * PHY_ADV_CHANNEL_37, PHY_ADV_CHANNEL_38, and + * PHY_ADV_CHANNEL_39. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetAdvChans( uint8 advChanMap ); + + +/******************************************************************************* + * @fn PHY_SetDataChan + * + * @brief Configure the data channel to be used: + * Master/Slave use data channels 0-36. + * Scanner/Initiator use data channels 37-39. + * + * input parameters + * + * @param dataChan - Data channel value. + * + * output parameters + * + * @param None. + * + * @return None. + */ +NEAR_FUNC void PHY_SetDataChan( uint8 dataChan ); + + +/******************************************************************************* + * @fn PHY_GetDataChan + * + * @brief Read the configured data channel: + * Master/Slave use data channels 0-36. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return dataChan - Data channel value. + */ +NEAR_FUNC uint8 PHY_GetDataChan( void ); + + +/******************************************************************************* + * @fn PHY_SetEndConnection + * + * @brief Configure the ENDC bit in pkt. If set, the connection is closed + * after next packet is received from the slave. + * + * input parameters + * + * @param endConn - PHY_END_CONN_CONTINUE, PHY_END_CONN_AFTER_NEXT_PKT. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetEndConnection( phyEndConn_t endConn ); + + +/******************************************************************************* + * @fn PHY_ConfigureMD + * + * @brief Configures how the More Data (MD) bit is populated in the data + * PDU. + * + * input parameters + * + * @param moreData - PHY_MD_BIT_FROM_FIFO_ENTRY, + * PHY_MD_BIT_BASED_ON_FIFO_CONTENTS, + * PHY_MD_BIT_ALWAYS_ZERO, + * PHY_MD_BIT_ALWAYS_ONE + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureMD( phyConfMD_t moreData ); + + +/******************************************************************************* + * @fn PHY_SetBackoffCnt + * + * @brief Set the Scanner backoff count. + * + * input parameters + * + * @param count - Backoff count: 1-256. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetBackoffCnt( uint16 count ); + + +/******************************************************************************* + * @fn PHY_SetScanMode + * + * @brief Configure Scanner to scan active or passive. + * + * input parameters + * + * @param scanMode - PHY_SCAN_MODE_PASSIVE, PHY_SCAN_MODE_ACTIVE. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanMode( phyScanMode_t scanMode ); + + +/******************************************************************************* + * @fn PHY_SetScanEnd + * + * @brief Configure Scanner to end after a Scan Request is received for + * which no Scan Response will be sent. + * + * input parameters + * + * @param scanEnd - PHY_SCAN_END_ON_ADV_REPORT_DISABLED, + * PHY_SCAN_END_ON_ADV_REPORT_ENABLED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanEnd( phyScanEnd_t scanEnd ); + + +/******************************************************************************* + * @fn PHY_GetEndCause + * + * @brief Returns the task end cause. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The LLE nR task end cause. + */ +uint8 PHY_GetEndCause( void ); + + +/******************************************************************************* + * @fn PHY_AnchorValid + * + * @brief Check if there is a valid anchor point value. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: Valid anchor point value. + * FALSE: The anchor point is not valid. + */ +uint8 PHY_AnchorValid( void ); + + +/******************************************************************************* + * @fn PHY_InitSeqStat + * + * @brief Initialize the connection sequencing status to the default + * value. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_InitSeqStat( void ); + + +/******************************************************************************* + * @fn PHY_FirstPktReceived + * + * @brief Returns an indication of whether the first packet in a new + * connection, or updated connection, has been received. + * + * Note: The logic of returned value is true-low. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: First packet has not yet been received. + * FALSE: First packet has been received. + */ +uint8 PHY_FirstPktReceived( void ); + + +/******************************************************************************* + * @fn PHY_CtrlAckPending + * + * @brief Returns an indication of whether the last successfully received + * packet that was a LL control packet has been ACK'ed or not. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: ACK for last received control packet is pending. + * FALSE: Last received control packet has been ACK'ed. + */ +uint8 PHY_CtrlAckPending( void ); + + +/******************************************************************************* + * @fn PHY_SetSyncWord + * + * @brief Set synchronization word. + * + * Note: The synch word lenght is fixed at four bytes. + * + * input parameters + * + * @param syncWord - Synchronization word (a.k.a. access address). + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetSyncWord( uint32 syncWord ); + + +/******************************************************************************* + * @fn PHY_SetMaxNack + * + * @brief Set the maximum number of NACKs allowed to be received before + * ending the connection event. + * + * input parameters + * + * @param maxNackCount - Maximum number of NACKs allowed count, or zero + * to disable this feature. + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetMaxNack( uint8 maxNackCount ); + + +/******************************************************************************* + * @fn PHY_ClearWhitelist + * + * @brief Clears the white list table and the number of table entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWhitelist( void ); + + +/******************************************************************************* + * @fn PHY_ClearWlEntry + * + * @brief Clears the white list table entry. + * + * input parameters + * + * @param wlEntryIndex - Whhite list table entry index. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWlEntry( uint8 wlEntryIndex ); + + +/******************************************************************************* + * @fn PHY_ClearWlBasedOnBl + * + * @brief Clears the white list table entries that correspond to + * blacklist entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWlBasedOnBl( void ); + + +/******************************************************************************* + * @fn PHY_GetNumFreeWlEntries + * + * @brief Returns the number of available white list entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of available white list entries. + */ +uint8 PHY_GetNumFreeWlEntries( void ); + + +/******************************************************************************* + * @fn PHY_GetWlSize + * + * @brief Returns the number of white list entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of white list entries. + */ +uint8 PHY_GetWlSize( void ); + + +/******************************************************************************* + * @fn PHY_AddWlEntry + * + * @brief Adds a white list entry. The address is added at the next + * available index. If the table is full, it returns a failure. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * @param setBlacklist - PHY_SET_BLACKLIST_DISABLE, + * PHY_SET_BLACKLIST_ENABLE + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_WL_FULL, PHY_STATUS_FAILURE + */ +phyStatus_t PHY_AddWlEntry( uint8 *addr, + phyAddrType_t addrType, + phyBlacklist_t setBlacklist ); + + +/******************************************************************************* + * @fn PHY_RemoveWlEntry + * + * @brief Removes a white list entry based on its address and address + * type. If located, then the entry is set invalid, and the address + * is cleared. If the table is empty, or the address and address + * type is not located, it returns a failure. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_WL_EMPTY, + * PHY_STATUS_WL_ENTRY_NOT_FOUND + */ +phyStatus_t PHY_RemoveWlEntry( uint8 *addr, + phyAddrType_t addrType ); + + +/******************************************************************************* + * @fn PHY_SetAdvWlPolicy + * + * @brief Set the Advertiser's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_ADVERTISER_WHITE_LIST_NONE, + * PHY_ADVERTISER_WHITE_LIST_SCAN_REQ, + * PHY_ADVERTISER_WHITE_LIST_CONNECT_REQ, + * PHY_ADVERTISER_WHITE_LIST_ALL + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetAdvWlPolicy( phyAdvWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetScanWlPolicy + * + * @brief Set the Advertiser's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_SCANNER_ALLOW_ALL_ADV_PKTS, + * PHY_SCANNER_USE_WHITE_LIST + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanWlPolicy( phyScanWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetInitWlPolicy + * + * @brief Set the Initiator's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_INITIATOR_USE_PEER_ADDR, + * PHY_INITIATOR_USE_WL + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetInitWlPolicy( phyInitWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetBlacklistIndex + * + * @brief Set a white list table entry as being black listed. That is, + * Advertising packets received with the address and address type + * of the white list table entry that is black listed are ignored. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param blackListIndex - The white list table entry that is blacklisted. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetBlacklistIndex( uint8 blackListIndex ); + + +/******************************************************************************* + * @fn PHY_SetBlacklistEntry + * + * @brief Search the white list table for an entry, and if found, set the + * corresponding blacklist entry index. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +phyStatus_t PHY_SetBlacklistEntry( uint8 *addr, + phyAddrType_t addrType ); + + +/******************************************************************************* + * @fn PHY_ClearBlacklistIndex + * + * @brief Clear a blacklist table entry based on a white list entry index. + * + * input parameters + * + * @param blackListIndex - The white list table entry that is blacklisted. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearBlacklistIndex( uint8 blackListIndex ); + + +/******************************************************************************* + * @fn PHY_ClearBlacklist + * + * @brief Clear the black list. All white list table entries are used as + * normal white list entries. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearBlacklist( void ); + + +/******************************************************************************* + * @fn PHY_SaveWhiteList + * + * @brief This routine saves any valid white list entries to Bank 1. This + * routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SaveWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_RestoreWhiteList + * + * @brief This routine restores any valid white list entries from Bank 1. + * This routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RestoreWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_ClearSavedWhiteList + * + * @brief This routine clears any valid white list entries from Bank 1. + * This routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearSavedWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_Command + * + * @brief Send a command to the LLE nanoRisc. + * + * input parameters + * + * @param cmd - LLE nanoRisc command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Command( phyCmd_t cmd ); + + +/******************************************************************************* + * @fn PHY_ClearCounters + * + * @brief Clears all LLE nanoRisc counters. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearCounters( void ); + + +/******************************************************************************* + * @fn PHY_ReadCounters + * + * @brief Reads all LLE nanoRisc counters. + * + * input parameters + * + * @param cntPtr - Pointer to array to hold LLE nanoRisc counters. + * + * output parameters + * + * @param cntPtr - Pointer to populated array of LLE nanoRisc counters. + * + * @return None. + */ +void PHY_ReadCounters( uint8 *cntPtr ); + + +/******************************************************************************* + * @fn PHY_ConfigureFifoDataProcessing + * + * @brief Configure FIFO data processing. This includes flushing ignored + * packets, packets that fail the CRC, and empty packets. Also, + * whether a RX status containing the packets's data channel number + * and RSSI should be appended to the end of the packet. + * + * input parameters + * + * @param fifoDataConf - Bit mapped configuration value where each + * included bit enables a feature: + * PHY_FIFO_DATA_DIABLE_ALL or some combination of: + * PHY_FIFO_DATA_AUTO_FLUSH_IGNORED + * PHY_FIFO_DATA_AUTO_FLUSH_CRC_ERROR + * PHY_FIFO_DATA_AUTO_FLUSH_EMPTY_PKT + * PHY_FIFO_DATA_APPEND_RX_STATUS + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureFifoDataProcessing( phyFifoData_t fifoDataConf ); + + +/******************************************************************************* + * @fn PHY_ConfigureAppendRfStatus + * + * @brief Configure if nanoRisc should append the RF status to the end of + * received packets. + * + * input parameters + * + * @param appendRfStatus - PHY_ENABLE_APPEND_RF_STATUS, + * PHY_DISABLE_APPEND_RF_STATUS + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureAppendRfStatus( phyAppendRfStatus_t appendRfStatus ); + + +/******************************************************************************* + * @fn PHY_SetFifoConfig + * + * @brief Configure FIFO configuration operations. This includes automatic + * dellocation of RX packet and commit of TX packet by MCU, and + * automatic commit of RX packet and deallocate of TX packet by nR. + * + * input parameters + * + * @param fifoConfig - Bit mapped configuration value where each included + * bit enables a FIFO automatic operation: + * PHY_FIFO_CONFIG_DISABLE_ALL or some combination of: + * PHY_FIFO_CONFIG_AUTO_DEALLOC_RX + * PHY_FIFO_CONFIG_AUTO_COMMIT_RX + * PHY_FIFO_CONFIG_AUTO_DEALLOC_TX + * PHY_FIFO_CONFIG_AUTO_COMMIT_TX + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetFifoConfig( phyFifoConfig_t fifoConfig ); + + +/******************************************************************************* + * @fn PHY_InitLastRssi + * + * @brief Set the Last RSSI value to invalid. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_InitLastRssi( void ); + + +/******************************************************************************* + * @fn PHY_GetLastRssi + * + * @brief Get the Last RSSI value captured by the nanoRisc. + * + * Note: The returned value is returned as an unsigned integer! + * Note: The returned value is not corrected for RX gain. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The last data RSSI received by the nanoRisc, as an unsigned + * integer. Invalid value: 0x80. + */ +uint8 PHY_GetLastRssi( void ); + + +/******************************************************************************* + * @fn PHY_GetRssi + * + * @brief Get the RF RSSI value. + * + * Note: The returned value is returned as an unsigned integer! + * Note: This call should only be made when RX is active. + * Note: An invalid value is -128. + * Note: The returned value is not corrected for RX gain. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The RF RSSI, as an unsigned integer. Invalid value: 0x80. + */ +uint8 PHY_GetRssi( void ); + + +/******************************************************************************* + * @fn Clear Window Configuration + * + * @brief Clear the window connfiguration register so that the connect + * request packet uses the window offset stored in the packet. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWinConfig( void ); + + +/******************************************************************************* + * @fn Set Dynamic Window Offset + * + * @brief This routine sets the window offset and connection interval + * used during dynamic window offset control when forming multiple + * connections. For this feature, once the Initiator has started, + * each T2E1 pulse will decrement the winOffset. When the Init + * responds with a CONNECT_REQ, it will contain the window offset + * based on this dynamic adjustment. This is needed to start the + * new connection at a precise time. But since it is not known + * when the CONNECT_REQ will happen, the window offset is adjusted + * (i.e. corrected) on each system tick. + * + * input parameters + * + * @param uint16 winOffset - Initial window offset, in 625us ticks. + * @param uint16 connInterval - New connection's interval in 625us ticks. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetDynamicWinOffset( uint16 winOffset, + uint16 connInterval ); + + +/******************************************************************************* + * @fn PHY_SetWhitener + * + * @brief Configure the whitener as none, only BLE Pseudo Number 7 (PN7), + * only the TI Pseudo Number 9 (PN9), or both. + * + * input parameters + * + * @param whitener - PHY_DISABLE_ALL_WHITENER, + * PHY_ENABLE_BLE_WHITENER, + * PHY_DISABLE_BLE_WHITENER, + * PHY_ENABLE_PN9_WHITENER, + * PHY_DISABLE_PN9_WHITENER, + * PHY_ENABLE_ONLY_BLE_WHITENER, + * PHY_ENABLE_ONLY_PN9_WHITENER, + * PHY_ENABLE_ALL_WHITENER + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigWhitener( phyWhitener_t whitener ); + + +/******************************************************************************* + * @fn PHY_ResetTxFifo + * + * @brief Reset the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_ResetRxFifo + * + * @brief Reset the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_ResetTxRxFifo + * + * @brief Reset the TX and RX FIFOs. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetTxRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_TxFifoBytesFree + * + * @brief Reads the number of available bytes in the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of available bytes, 0..127. + */ +uint8 PHY_TxFifoBytesFree( void ); + + +/******************************************************************************* + * @fn PHY_TxFifoLen + * + * @brief Reads the number of used bytes in the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of used bytes, 0..127. + */ +uint8 PHY_TxFifoLen( void ); + + +/******************************************************************************* + * @fn PHY_RxFifoLen + * + * @brief Reads the number of used bytes in the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of used bytes, 0..127. + */ +uint8 PHY_RxFifoLen( void ); + + +/******************************************************************************* + * @fn PHY_RetryTxFifo + * + * @brief Issue a TX FIFO Retry operation. + * + * Note: Normally the TX FIFO read pointers are managed by the + * nanoRisc. However, for Raw mode, after the packet has + * been sent, then a retry must be issued to reuse the + * packet already in the TX FIFO. + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RetryTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_RetryRxFifo + * + * @brief Issue a RX FIFO Retry operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RetryRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_CommitTxFifo + * + * @brief Issue a TX FIFO Commit operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_CommitTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_CommitRxFifo + * + * @brief Issue a RX FIFO Commit operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_CommitRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_DiscardTxFifo + * + * @brief Issue a RX FIFO Discard operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_DiscardTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_DeallocateRxFifo + * + * @brief Issue a RX FIFO Deallocate operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_DeallocateRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_SetRxFifoThreshold + * + * @brief Set the RX FIFO Threshold. + * + * input parameters + * + * @param thresLen - FIFO watermark, 0..127. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetRxFifoThreshold( uint8 thresLen ); + + +/******************************************************************************* + * @fn PHY_GetTxSWP + * + * @brief Get the TX FIFO Start Write Pointer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TX FIFO Start Write Pointer. + */ +uint8 *PHY_GetTxSWP( void ); + + +/******************************************************************************* + * @fn PHY_GetRxSRP + * + * @brief Get the RX FIFO Start Read Pointer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return RX FIFO Start Read Pointer. + */ +uint8 *PHY_GetRxSRP( void ); + + +/******************************************************************************* + * @fn PHY_WriteByte + * + * @brief Write multiple bytes of data to TX FIFO. + * + * Note: It is assumed the caller does not write more than the + * amount of free space available in the TX FIFO. + * + * input parameters + * + * @param data - Pointer to data to be written. + * @param len - Number of bytes to be written. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_WriteByte( uint8 *data, + uint8 len ); + + +/******************************************************************************* + * @fn PHY_WriteByteVal + * + * @brief Write a single byte of data to TX FIFO. + * + * Note: It is assumed the caller does not write more than the + * amount of free space available in the TX FIFO. + * + * input parameters + * + * @param value - A single byte of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_WriteByteVal( uint8 value ); + + +/******************************************************************************* + * @fn PHY_ReadByte + * + * @brief Read multiple bytes of data from the RX FIFO. + * + * Note: It is assumed the caller does not read more than the + * amount of available data in the RX FIFO. + * + * input parameters + * + * @param ptr - Pointer to buffer to place read data. If NULL, the read + * data is discarded, but RX FIFO read pointer is still + * advanced. + * @param len - Number of bytes to be read. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ReadByte( uint8 *ptr, + uint8 len ); + + +/******************************************************************************* + * @fn PHY_ReadByteVal + * + * @brief Read a single byte of data from the RX FIFO. + * + * Note: It is assumed the caller does not read more than the + * amount of available data in the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A single byte of data from the RX FIFO. + */ +uint8 PHY_ReadByteVal( void ); + + +/******************************************************************************* + * @fn PHY_MapDataBank + * + * @brief Map a data bank to the specified RF RAM bank. + * + * input parameters + * + * @param bankNum - The RF RAM bank given by one of the following values: + * PHY_RF_RAM_BANK_0, + * PHY_RF_RAM_BANK_1, + * PHY_RF_RAM_BANK_2, + * PHY_RF_RAM_BANK_3, + * PHY_RF_RAM_BANK_4, + * PHY_RF_RAM_BANK_5, + * PHY_RF_RAM_RX_FIFO, + * PHY_RF_RAM_TX_FIFO + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_MapDataBank( phyRfRamBank_t bankNum ); + + +/******************************************************************************* + * @fn PHY_SaveRestoreConn + * + * @brief Saves and restores the TX and RX FIFO for the specified + * connection to/from the LLE RAM bank memory. Called when the + * current connection's FIFO data is to be backed up and another + * connections FIFO is to be restored. The restored connection + * could be a connection that did not exist in the backup. In this + * case, the FIFO parameters will be set to reset conditions. + * + * input parameters + * + * @param saveConnId - Connection ID of FIFOs to be saved. + * @param restoreConnId - Connection ID of FIFOs to be restored. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SaveRestoreConn( uint8 saveConnId, + uint8 restoreConnId ); + + +/******************************************************************************* + * @fn PHY_RestoreConn + * + * @brief Restores TX and RX FIFOs for the specified connection. The data + * currently in the TX and RX FIFO is lost/overwritten. Call this + * when the current FIFO data does not need to be saved. + * + * input parameters + * + * @param connId - Connection ID of FIFOs to be restored. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RestoreConn( uint8 connId ); + + +/******************************************************************************* + * @fn PHY_RawTxInit + * + * @brief Initializes Raw TX Task start operation (immediate or based on + * a timer event) and run operation (single shot, or repeat). + * + * input parameters + * + * @param startMode - PHY_RAW_START_IMMEDIATE, + * PHY_RAW_START_ON_TIMER_EVENT + * @param runMode - PHY_RAW_RUN_ONCE, + * PHY_RAW_RUN_REPEAT + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RawTxInit( phyRawStartMode_t startMode, + phyRawRunMode_t runMode ); + + +/******************************************************************************* + * @fn PHY_RawRxInit + * + * @brief Initializes Raw RX Task start operation (immediate or based on + * a timer event) and run operation (single shot, or repeat). + * + * input parameters + * + * @param startMode - PHY_RAW_START_IMMEDIATE, + * PHY_RAW_START_ON_TIMER_EVENT + * @param runMode - PHY_RAW_RUN_ONCE, + * PHY_RAW_RUN_REPEAT + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RawRxInit( phyRawStartMode_t startMode, + phyRawRunMode_t runMode ); + + +/******************************************************************************* + * @fn PHY_RawGetNumTxPkts + * + * @brief Gets the number of transmitted packets. + * + * input parameters + * + * @param numTxPkts - Word pointer. + * + * output parameters + * + * @param numTxPkts - The number of transmitted packets. + * + * @return None. + */ +void PHY_RawGetNumTxPkts( uint16 *numTxPkts ); + + +/******************************************************************************* + * @fn PHY_RawGetNumRxPkts + * + * @brief Gets the number of successfully received packets. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param numRxPkts - The number of successfully received packets. + * + * @return None. + */ +void PHY_RawGetNumRxPkts( uint16 *numRxPkts ); + + +/******************************************************************************* + * @fn PHY_RawGetRxData + * + * @brief Gets the number of successfully received packets, the number + * of packets received with a CRC error, and the last received + * RSSI (as an unsigned integer). + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param numRxPkts - Number of successfully received packets. + * @param numRxErrPkts - Number of received packets with a CRC error. + * @param rxRSSI - Last received RSSI (as an unsigned integer). + * + * @return None. + */ +void PHY_RawGetRxData( uint16 *numRxPkts, + uint16 *numRxErrPkts, + uint8 *rxRSSI ); + + +/******************************************************************************* + * @fn PHY_SetRfFreq + * + * @brief Sets the RF frequency for the given RF channel. + * + * Note: BLE frequency range is 2402..2480MHz over 40 RF channels. + * Note: The RF channel is given, not the BLE channel. + * + * input parameters + * + * @param rfChan - The RF channel to set the Tx or Rx frequency (0..39). + * @param freqMode - PHY_FREQ_MODE_MODULATED_CW, + * PHY_FREQ_MODE_UNMODULATED_CW + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetRfFreq( uint8 rfChan, + phyFreqMode_t freqMode ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PHY_H */ diff --git a/Firmware/Radio/Components/ble/controller/include/phy_image.h b/Firmware/Radio/Components/ble/controller/include/phy_image.h new file mode 100644 index 0000000..84d9f76 --- /dev/null +++ b/Firmware/Radio/Components/ble/controller/include/phy_image.h @@ -0,0 +1,95 @@ +/******************************************************************************* + Filename: phy_image.h + + DesignSync revision information for LLE Firmware + Revised: $Date: Tue May 03 02:02:50 2011 GMT$ + Revision: $Revision: 1.7$ + $KeysEnd$ + + SVN revision information: + Revised: $Date: 2011-05-09 11:50:07 -0700 (Mon, 09 May 2011) $ + Revision: $Revision: 25919 $ + + Description: This file contains the TI nanoRisc Link Layer Engine (LLE) + binary image header used by the Physical Layer (PHY) + on the CC2540 + + LLE Firmware Information: + Release 1.4 + + NOTE: This file is autogenerated. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef PHY_IMAGE_H +#define PHY_IMAGE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +#define NR_IMAGE_SIZE 3564 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef const unsigned char nrImage_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +extern nrImage_t NanoRiscImage[]; + +#ifdef __cplusplus +} +#endif + +#endif /* PHY_IMAGE_H */ diff --git a/Firmware/Radio/Components/ble/hci/hci_c_event.h b/Firmware/Radio/Components/ble/hci/hci_c_event.h new file mode 100644 index 0000000..af2c50e --- /dev/null +++ b/Firmware/Radio/Components/ble/hci/hci_c_event.h @@ -0,0 +1,299 @@ +/******************************************************************************* + Filename: hci_c_event.h + Revised: $Date: 2012-05-01 12:13:50 -0700 (Tue, 01 May 2012) $ + Revision: $Revision: 30418 $ + + Description: This file contains the HCI Event types, contants, + external functions etc. for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_C_EVENT_H +#define HCI_C_EVENT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "hci_tl.h" + +extern uint8 bleEvtMask; +extern uint8 pHciEvtMask[]; + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// Event Mask Default Values +#define BT_EVT_MASK_BYTE0 0xFF +#define BT_EVT_MASK_BYTE1 0xFF +#define BT_EVT_MASK_BYTE2 0xFF +#define BT_EVT_MASK_BYTE3 0xFF +#define BT_EVT_MASK_BYTE4 0xFF +#define BT_EVT_MASK_BYTE5 0x9F +#define BT_EVT_MASK_BYTE6 0x00 +#define BT_EVT_MASK_BYTE7 0x20 +// +#define LE_EVT_MASK_DEFAULT 0x1F + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** Internal Functions +*/ + +extern void hciInitEventMasks( void ); + +/* +** HCI Controller Events +*/ + +/******************************************************************************* + * @fn HCI_DataBufferOverflowEvent + * + * @brief This function sends the Data Buffer Overflow Event to the Host. + * + * input parameters + * + * @param linkType - HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW, + * HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_DataBufferOverflowEvent( uint8 linkType ); + + +/******************************************************************************* + * @fn HCI_NumOfCompletedPacketsEvent + * + * @brief This function sends the Number of Completed Packets Event to + * the Host. + * + * Note: Currently, the number of handles is always one. + * + * input parameters + * + * @param numHandles - Number of handles. + * @param handlers - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets for + * each handle. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_NumOfCompletedPacketsEvent( uint8 numHandles, + uint16 *handlers, + uint16 *numCompletedPackets ); + + +/******************************************************************************* + * @fn HCI_CommandCompleteEvent + * + * @brief This function sends a Command Complete Event to the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandCompleteEvent( uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_VendorSpecifcCommandCompleteEvent + * + * @brief This function sends a Vendor Specific Command Complete Event to + * the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_VendorSpecifcCommandCompleteEvent( uint16 opcode, + uint8 len, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_CommandStatusEvent + * + * @brief This function sends a Command Status Event to the Host. + * + * input parameters + * + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandStatusEvent( uint8 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_HardwareErrorEvent + * + * @brief This function sends a Hardware Error Event to the Host. + * + * input parameters + * + * @param hwErrorCode - The hardware error code. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_HardwareErrorEvent( uint8 hwErrorCode ); + + +/******************************************************************************* + * @fn HCI_SendCommandStatusEvent + * + * @brief This generic function sends a Command Status event to the Host. + * It is provided as a direct call so the Host can use it directly. + * + * input parameters + * + * @param eventCode - The event code. + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandStatusEvent ( uint8 eventCode, + uint16 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_SendCommandCompleteEvent + * + * @brief This generic function sends a Command Complete or a Vendor + * Specific Command Complete Event to the Host. + * + * input parameters + * + * @param eventCode - The event code. + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandCompleteEvent ( uint8 eventCode, + uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_SendControllerToHostEvent + * + * @brief This generic function sends a Controller to Host Event. + * + * input parameters + * + * @param eventCode - Bluetooth event code. + * @param dataLen - Length of dataField. + * @param pData - Pointer to data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendControllerToHostEvent( uint8 eventCode, + uint8 dataLen, + uint8 *pData ); + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_C_EVENT_H */ diff --git a/Firmware/Radio/Components/ble/hci/hci_data.h b/Firmware/Radio/Components/ble/hci/hci_data.h new file mode 100644 index 0000000..d4d7250 --- /dev/null +++ b/Firmware/Radio/Components/ble/hci/hci_data.h @@ -0,0 +1,192 @@ +/******************************************************************************* + Filename: hci_c_data.h + Revised: $Date: 2011-08-22 08:41:40 -0700 (Mon, 22 Aug 2011) $ + Revision: $Revision: 27235 $ + + Description: This file handles HCI data for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_C_DATA_H +#define HCI_C_DATA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "osal_bufmgr.h" + +/******************************************************************************* + * MACROS + */ + +#define HCI_ResetControllerBuffers() HCI_TxDataBufferInit() + +/******************************************************************************* + * CONSTANTS + */ + +#define UNDEFINED_CONN_HANDLE 0xFFFF + +// Data State +#define DATA_BUF_FREE 0 +#define DATA_BUF_IN_USE 1 +#define DATA_BUF_PENDING 2 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 state; // DATA_BUF_FREE, DATA_BUF_IN_USE, DATA_BUF_PENDING + uint16 connHandle; // Connection Handle + uint8 fragFlag; // Packet Boundary Flag + uint16 len; // Data Length + uint8 *pData; // Pointer to Packet Payload +} hciTxData_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Data API +*/ + +/******************************************************************************* + * This function will initialize the buffers for transmit data. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataBufferInit( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_TxDataBufferInsert + * + * @brief This function will insert a transmit data packet into the free + * buffers. + * + * input parameters + * + * @param connHandle - Connection handle. + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED + */ +extern hciStatus_t HCI_TxDataBufferInsert( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_TxDataSend + * + * @brief This function sends an ACL transmit data packet to the LL. If + * the packet is successfully transferred to the TX FIFO by the + * LL, then the buffer can be freed. Otherwise, the packet is + * still pending in the LL, so it can't be released. If any error + * occurs (due to parametric checks), then the buffer is freed + * and a Number of Completed Packets event is generated with the + * number of completed packets set to zero. + * + * input parameters + * + * @param connHandle - Connection handle, or HCI_TX_DATA_ANY_CONNECTION. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataSend( uint8 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_ReverseBytes + * + * @brief This function is used to reverse the order of the bytes in + * an array in place. + * + * input parameters + * + * @param *buf - Pointer to buffer containing bytes to be reversed. + * @param len - Number of bytes in buffer. + * + * Note: The length must be even. + * + * Note: The maximum length is 128 bytes. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ReverseBytes( uint8 *buf, + uint8 len ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_C_DATA_H */ diff --git a/Firmware/Radio/Components/ble/hci/hci_event.h b/Firmware/Radio/Components/ble/hci/hci_event.h new file mode 100644 index 0000000..af2c50e --- /dev/null +++ b/Firmware/Radio/Components/ble/hci/hci_event.h @@ -0,0 +1,299 @@ +/******************************************************************************* + Filename: hci_c_event.h + Revised: $Date: 2012-05-01 12:13:50 -0700 (Tue, 01 May 2012) $ + Revision: $Revision: 30418 $ + + Description: This file contains the HCI Event types, contants, + external functions etc. for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_C_EVENT_H +#define HCI_C_EVENT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "hci_tl.h" + +extern uint8 bleEvtMask; +extern uint8 pHciEvtMask[]; + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// Event Mask Default Values +#define BT_EVT_MASK_BYTE0 0xFF +#define BT_EVT_MASK_BYTE1 0xFF +#define BT_EVT_MASK_BYTE2 0xFF +#define BT_EVT_MASK_BYTE3 0xFF +#define BT_EVT_MASK_BYTE4 0xFF +#define BT_EVT_MASK_BYTE5 0x9F +#define BT_EVT_MASK_BYTE6 0x00 +#define BT_EVT_MASK_BYTE7 0x20 +// +#define LE_EVT_MASK_DEFAULT 0x1F + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** Internal Functions +*/ + +extern void hciInitEventMasks( void ); + +/* +** HCI Controller Events +*/ + +/******************************************************************************* + * @fn HCI_DataBufferOverflowEvent + * + * @brief This function sends the Data Buffer Overflow Event to the Host. + * + * input parameters + * + * @param linkType - HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW, + * HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_DataBufferOverflowEvent( uint8 linkType ); + + +/******************************************************************************* + * @fn HCI_NumOfCompletedPacketsEvent + * + * @brief This function sends the Number of Completed Packets Event to + * the Host. + * + * Note: Currently, the number of handles is always one. + * + * input parameters + * + * @param numHandles - Number of handles. + * @param handlers - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets for + * each handle. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_NumOfCompletedPacketsEvent( uint8 numHandles, + uint16 *handlers, + uint16 *numCompletedPackets ); + + +/******************************************************************************* + * @fn HCI_CommandCompleteEvent + * + * @brief This function sends a Command Complete Event to the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandCompleteEvent( uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_VendorSpecifcCommandCompleteEvent + * + * @brief This function sends a Vendor Specific Command Complete Event to + * the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_VendorSpecifcCommandCompleteEvent( uint16 opcode, + uint8 len, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_CommandStatusEvent + * + * @brief This function sends a Command Status Event to the Host. + * + * input parameters + * + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandStatusEvent( uint8 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_HardwareErrorEvent + * + * @brief This function sends a Hardware Error Event to the Host. + * + * input parameters + * + * @param hwErrorCode - The hardware error code. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_HardwareErrorEvent( uint8 hwErrorCode ); + + +/******************************************************************************* + * @fn HCI_SendCommandStatusEvent + * + * @brief This generic function sends a Command Status event to the Host. + * It is provided as a direct call so the Host can use it directly. + * + * input parameters + * + * @param eventCode - The event code. + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandStatusEvent ( uint8 eventCode, + uint16 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_SendCommandCompleteEvent + * + * @brief This generic function sends a Command Complete or a Vendor + * Specific Command Complete Event to the Host. + * + * input parameters + * + * @param eventCode - The event code. + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandCompleteEvent ( uint8 eventCode, + uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_SendControllerToHostEvent + * + * @brief This generic function sends a Controller to Host Event. + * + * input parameters + * + * @param eventCode - Bluetooth event code. + * @param dataLen - Length of dataField. + * @param pData - Pointer to data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendControllerToHostEvent( uint8 eventCode, + uint8 dataLen, + uint8 *pData ); + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_C_EVENT_H */ diff --git a/Firmware/Radio/Components/ble/hci/hci_tl.h b/Firmware/Radio/Components/ble/hci/hci_tl.h new file mode 100644 index 0000000..ce66a1b --- /dev/null +++ b/Firmware/Radio/Components/ble/hci/hci_tl.h @@ -0,0 +1,327 @@ +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_TL_H +#define HCI_TL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +#include "hci.h" +#include "OSAL.h" +#include "hal_uart.h" +#include "hci_data.h" +#include "hci_event.h" + +extern uint8 hciTaskID; +// +extern uint8 hciTestTaskID; +extern uint8 hciGapTaskID; +extern uint8 hciL2capTaskID; +extern uint8 hciSmpTaskID; + +/******************************************************************************* + * MACROS + */ + +#define HCI_ASSERT(condition) HAL_ASSERT(condition) + +/******************************************************************************* + * CONSTANTS + */ + +// OSAL Task Events +#define HCI_TX_PROCESS_EVENT 0x0001 +#define HCI_TEST_UART_SEND_EVENT 0x0002 +#define HCI_BDADDR_UPDATED_EVENT 0x4000 +#define HCI_OSAL_MSG_EVENT SYS_EVENT_MSG + +// OSAL Message Header Events +#define HCI_CONTROLLER_TO_HOST_EVENT 0x01 +#define HCI_HOST_TO_CTRL_CMD_EVENT 0x02 +#define HCI_HOST_TO_CTRL_DATA_EVENT 0x03 + +#define HCI_BDADDR_LEN 6 + +// Max Buffers Supported +#define HCI_MAX_NUM_DATA_BUFFERS 0x04 +#define HCI_MAX_NUM_CMD_BUFFERS 0x01 + +// Max Allowed HCI Packet +#define HCI_MAX_CMD_PKT_SIZE 0xFF +#define HCI_MAX_DATA_PKT_SIZE 0xFFFF + +// Max Data Length in Packet +#define HCI_DATA_MAX_DATA_LENGTH 27 + +// +// Minimum length for CMD packet is 1+2+1 +// | Packet Type (1) | OPCode(2) | Length(1) | +// +#define HCI_CMD_MIN_LENGTH 4 + +// +// Minimum length for EVENT packet is 1+1+1 +// | Packet Type (1) | Event Code(1) | Length(1) | +// +#define HCI_EVENT_MIN_LENGTH 3 + +// +// Minimum length for DATA packet is 1+2+2 +// | Packet Type (1) | Handler(2) | Length(2) | +// +#define HCI_DATA_MIN_LENGTH 5 + +// Max Number of Connections +#define HCI_MAX_NUM_CONNECTIONS 0x03 +// +#define HCI_TX_DATA_ANY_CONNECTION 0xFF + +// HCI Packet Types +#define HCI_CMD_PACKET 0x01 +#define HCI_ACL_DATA_PACKET 0x02 +#define HCI_SCO_DATA_PACKET 0x03 +#define HCI_EVENT_PACKET 0x04 + +/* +** HCI Command Opcodes +*/ + +// Link Control Commands +#define HCI_DISCONNECT 0x0406 +#define HCI_READ_REMOTE_VERSION_INFO 0x041D + +// Controller and Baseband Commands +#define HCI_SET_EVENT_MASK 0x0C01 +#define HCI_RESET 0x0C03 +#define HCI_READ_TRANSMIT_POWER 0x0C2D +#define HCI_SET_CONTROLLER_TO_HOST_FLOW_CONTROL 0x0C31 +#define HCI_HOST_BUFFER_SIZE 0x0C33 +#define HCI_HOST_NUM_COMPLETED_PACKETS 0x0C35 + +// Information Parameters +#define HCI_READ_LOCAL_VERSION_INFO 0x1001 +#define HCI_READ_LOCAL_SUPPORTED_COMMANDS 0x1002 +#define HCI_READ_LOCAL_SUPPORTED_FEATURES 0x1003 +#define HCI_READ_BDADDR 0x1009 + +// Status Parameters +#define HCI_READ_RSSI 0x1405 + +// LE Commands +#define HCI_LE_SET_EVENT_MASK 0x2001 +#define HCI_LE_READ_BUFFER_SIZE 0x2002 +#define HCI_LE_READ_LOCAL_SUPPORTED_FEATURES 0x2003 +#define HCI_LE_SET_RANDOM_ADDR 0x2005 +#define HCI_LE_SET_ADV_PARAM 0x2006 +#define HCI_LE_READ_ADV_CHANNEL_TX_POWER 0x2007 +#define HCI_LE_SET_ADV_DATA 0x2008 +#define HCI_LE_SET_SCAN_RSP_DATA 0x2009 +#define HCI_LE_SET_ADV_ENABLE 0x200A +#define HCI_LE_SET_SCAN_PARAM 0x200B +#define HCI_LE_SET_SCAN_ENABLE 0x200C +#define HCI_LE_CREATE_CONNECTION 0x200D +#define HCI_LE_CREATE_CONNECTION_CANCEL 0x200E +#define HCI_LE_READ_WHITE_LIST_SIZE 0x200F +#define HCI_LE_CLEAR_WHITE_LIST 0x2010 +#define HCI_LE_ADD_WHITE_LIST 0x2011 +#define HCI_LE_REMOVE_WHITE_LIST 0x2012 +#define HCI_LE_CONNECTION_UPDATE 0x2013 +#define HCI_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x2014 +#define HCI_LE_READ_CHANNEL_MAP 0x2015 +#define HCI_LE_READ_REMOTE_USED_FEATURES 0x2016 +#define HCI_LE_ENCRYPT 0x2017 +#define HCI_LE_RAND 0x2018 +#define HCI_LE_START_ENCRYPTION 0x2019 +#define HCI_LE_LTK_REQ_REPLY 0x201A +#define HCI_LE_LTK_REQ_NEG_REPLY 0x201B +#define HCI_LE_READ_SUPPORTED_STATES 0x201C +#define HCI_LE_RECEIVER_TEST 0x201D +#define HCI_LE_TRANSMITTER_TEST 0x201E +#define HCI_LE_TEST_END 0x201F + +// LE Vendor Specific LL Extension Commands +#define HCI_EXT_SET_RX_GAIN 0xFC00 +#define HCI_EXT_SET_TX_POWER 0xFC01 +#define HCI_EXT_ONE_PKT_PER_EVT 0xFC02 +#define HCI_EXT_CLK_DIVIDE_ON_HALT 0xFC03 +#define HCI_EXT_DECLARE_NV_USAGE 0xFC04 +#define HCI_EXT_DECRYPT 0xFC05 +#define HCI_EXT_SET_LOCAL_SUPPORTED_FEATURES 0xFC06 +#define HCI_EXT_SET_FAST_TX_RESP_TIME 0xFC07 +#define HCI_EXT_MODEM_TEST_TX 0xFC08 +#define HCI_EXT_MODEM_HOP_TEST_TX 0xFC09 +#define HCI_EXT_MODEM_TEST_RX 0xFC0A +#define HCI_EXT_END_MODEM_TEST 0xFC0B +#define HCI_EXT_SET_BDADDR 0xFC0C +#define HCI_EXT_SET_SCA 0xFC0D +#define HCI_EXT_ENABLE_PTM 0xFC0E // Not a supported HCI command! Application only. +#define HCI_EXT_SET_FREQ_TUNE 0xFC0F +#define HCI_EXT_SAVE_FREQ_TUNE 0xFC10 +#define HCI_EXT_SET_MAX_DTM_TX_POWER 0xFC11 +#define HCI_EXT_MAP_PM_IO_PORT 0xFC12 +#define HCI_EXT_DISCONNECT_IMMED 0xFC13 +#define HCI_EXT_PER 0xFC14 +#define HCI_EXT_PER_BY_CHAN 0xFC15 // Not a supported HCI command! Application only. +#define HCI_EXT_EXTEND_RF_RANGE 0xFC16 +#define HCI_EXT_ADV_EVENT_NOTICE 0xFC17 // Not a supported HCI command! Application only. +#define HCI_EXT_CONN_EVENT_NOTICE 0xFC18 // Not a supported HCI command! Application only. +#define HCI_EXT_HALT_DURING_RF 0xFC19 + +/* +** HCI Event Codes +*/ + +// BT Events +#define HCI_DISCONNECTION_COMPLETE_EVENT_CODE 0x05 +#define HCI_ENCRYPTION_CHANGE_EVENT_CODE 0x08 +#define HCI_READ_REMOTE_INFO_COMPLETE_EVENT_CODE 0x0C +#define HCI_COMMAND_COMPLETE_EVENT_CODE 0x0E +#define HCI_COMMAND_STATUS_EVENT_CODE 0x0F +#define HCI_BLE_HARDWARE_ERROR_EVENT_CODE 0x10 +#define HCI_NUM_OF_COMPLETED_PACKETS_EVENT_CODE 0x13 +#define HCI_DATA_BUFFER_OVERFLOW_EVENT 0x1A +#define HCI_KEY_REFRESH_COMPLETE_EVENT_CODE 0x30 + +// LE Event Code (for LE Meta Events) +#define HCI_LE_EVENT_CODE 0x3E + +// LE Meta Event Codes +#define HCI_BLE_CONNECTION_COMPLETE_EVENT 0x01 +#define HCI_BLE_ADV_REPORT_EVENT 0x02 +#define HCI_BLE_CONN_UPDATE_COMPLETE_EVENT 0x03 +#define HCI_BLE_READ_REMOTE_FEATURE_COMPLETE_EVENT 0x04 +#define HCI_BLE_LTK_REQUESTED_EVENT 0x05 + +// Vendor Specific Event Code +#define HCI_VE_EVENT_CODE 0xFF + +// LE Vendor Specific LL Extension Events +#define HCI_EXT_SET_RX_GAIN_EVENT 0x0400 +#define HCI_EXT_SET_TX_POWER_EVENT 0x0401 +#define HCI_EXT_ONE_PKT_PER_EVT_EVENT 0x0402 +#define HCI_EXT_CLK_DIVIDE_ON_HALT_EVENT 0x0403 +#define HCI_EXT_DECLARE_NV_USAGE_EVENT 0x0404 +#define HCI_EXT_DECRYPT_EVENT 0x0405 +#define HCI_EXT_SET_LOCAL_SUPPORTED_FEATURES_EVENT 0x0406 +#define HCI_EXT_SET_FAST_TX_RESP_TIME_EVENT 0x0407 +#define HCI_EXT_MODEM_TEST_TX_EVENT 0x0408 +#define HCI_EXT_MODEM_HOP_TEST_TX_EVENT 0x0409 +#define HCI_EXT_MODEM_TEST_RX_EVENT 0x040A +#define HCI_EXT_END_MODEM_TEST_EVENT 0x040B +#define HCI_EXT_SET_BDADDR_EVENT 0x040C +#define HCI_EXT_SET_SCA_EVENT 0x040D +#define HCI_EXT_ENABLE_PTM_EVENT 0x040E // Not a supported HCI command! Application only. +#define HCI_EXT_SET_FREQ_TUNE_EVENT 0x040F +#define HCI_EXT_SAVE_FREQ_TUNE_EVENT 0x0410 +#define HCI_EXT_SET_MAX_DTM_TX_POWER_EVENT 0x0411 +#define HCI_EXT_MAP_PM_IO_PORT_EVENT 0x0412 +#define HCI_EXT_DISCONNECT_IMMED_EVENT 0x0413 +#define HCI_EXT_PER_EVENT 0x0414 +#define HCI_EXT_PER_BY_CHAN_EVENT 0x0415 // Not a supported HCI command! Application only. +#define HCI_EXT_EXTEND_RF_RANGE_EVENT 0x0416 +#define HCI_EXT_ADV_EVENT_NOTICE_EVENT 0x0417 // Not a supported HCI command! Application only. +#define HCI_EXT_CONN_EVENT_NOTICE_EVENT 0x0418 // Not a supported HCI command! Application only. +#define HCI_EXT_HALT_DURING_RF_EVENT 0x0419 + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI OSAL API +*/ + +/******************************************************************************* + * @fn HCI_Init + * + * @brief This is the HCI OSAL task initialization routine. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_Init( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ProcessEvent + * + * @brief This is the HCI OSAL task process event handler. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * @param events - HCI OSAL task events. + * + * output parameters + * + * @param None. + * + * @return Unprocessed events. + */ +extern uint16 HCI_ProcessEvent( uint8 task_id, + uint16 events ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_TL_H */ diff --git a/Firmware/Radio/Components/ble/host/gatt_uuid.c b/Firmware/Radio/Components/ble/host/gatt_uuid.c new file mode 100644 index 0000000..a1de5dd --- /dev/null +++ b/Firmware/Radio/Components/ble/host/gatt_uuid.c @@ -0,0 +1,380 @@ +/************************************************************************************************** + Filename: gatt_uuid.c + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" +#include "OSAL.h" + +#include "gatt.h" +#include "gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/** + * GATT Services + */ +// Generic Access Profile Service UUID +CONST uint8 gapServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GAP_SERVICE_UUID ), HI_UINT16( GAP_SERVICE_UUID ) +}; + +// Generic Attribute Profile Service UUID +CONST uint8 gattServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SERVICE_UUID ), HI_UINT16( GATT_SERVICE_UUID ) +}; + +// Manufacturer Service UUID +CONST uint8 manufactServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( MANUFACT_SERVICE_UUID ), HI_UINT16( MANUFACT_SERVICE_UUID ) +}; + +// Address Service UUID +CONST uint8 addressServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( ADDRESS_SERVICE_UUID ), HI_UINT16( ADDRESS_SERVICE_UUID ) +}; + +/** + * GATT Attribute Types + */ +// Primary Service UUID +CONST uint8 primaryServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_PRIMARY_SERVICE_UUID ), HI_UINT16( GATT_PRIMARY_SERVICE_UUID ) +}; + +// Secondary Service UUID +CONST uint8 secondaryServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SECONDARY_SERVICE_UUID ), HI_UINT16( GATT_SECONDARY_SERVICE_UUID ) +}; + +// Include UUID +CONST uint8 includeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_INCLUDE_UUID ), HI_UINT16( GATT_INCLUDE_UUID ) +}; + +// Characteristic UUID +CONST uint8 characterUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHARACTER_UUID ), HI_UINT16( GATT_CHARACTER_UUID ) +}; + +/** + * GATT Characteristic Descriptors + */ +// Characteristic Extended Properties UUID +CONST uint8 charExtPropsUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_EXT_PROPS_UUID ), HI_UINT16( GATT_CHAR_EXT_PROPS_UUID ) +}; + +// Characteristic User Description UUID +CONST uint8 charUserDescUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_USER_DESC_UUID ), HI_UINT16( GATT_CHAR_USER_DESC_UUID ) +}; + +// Client Characteristic Configuration UUID +CONST uint8 clientCharCfgUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CLIENT_CHAR_CFG_UUID ), HI_UINT16( GATT_CLIENT_CHAR_CFG_UUID ) +}; + +// Server Characteristic Configuration UUID +CONST uint8 servCharCfgUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SERV_CHAR_CFG_UUID ), HI_UINT16( GATT_SERV_CHAR_CFG_UUID ) +}; + +// Characteristic Format UUID +CONST uint8 charFormatUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_FORMAT_UUID ), HI_UINT16( GATT_CHAR_FORMAT_UUID ) +}; + +// Characteristic Aggregate Format UUID +CONST uint8 charAggFormatUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_AGG_FORMAT_UUID ), HI_UINT16( GATT_CHAR_AGG_FORMAT_UUID ) +}; + +/** + * GATT Characteristic Types + */ +// Device Name UUID +CONST uint8 deviceNameUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( DEVICE_NAME_UUID ), HI_UINT16( DEVICE_NAME_UUID ) +}; + +// Appearance UUID +CONST uint8 appearanceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( APPEARANCE_UUID ), HI_UINT16( APPEARANCE_UUID ) +}; + +// Peripheral Privacy Flag UUID +CONST uint8 periPrivacyFlagUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PERI_PRIVACY_FLAG_UUID ), HI_UINT16( PERI_PRIVACY_FLAG_UUID ) +}; + +// Reconnection Address UUID +CONST uint8 reconnectAddrUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( RECONNECT_ADDR_UUID ), HI_UINT16( RECONNECT_ADDR_UUID ) +}; + +// Peripheral Preferred Connection Parameters UUID +CONST uint8 periConnParamUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PERI_CONN_PARAM_UUID ), HI_UINT16( PERI_CONN_PARAM_UUID ) +}; + +// Service Changed UUID +CONST uint8 serviceChangedUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( SERVICE_CHANGED_UUID ), HI_UINT16( SERVICE_CHANGED_UUID ) +}; + +// Manufacturer Name UUID +CONST uint8 manuNameUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( MANUFACT_NAME_UUID ), HI_UINT16( MANUFACT_NAME_UUID ) +}; + +// Serial Number UUID +CONST uint8 serialNumUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( SERIAL_NUM_UUID ), HI_UINT16( SERIAL_NUM_UUID ) +}; + +// Manufacturer Address UUID +CONST uint8 manuAddrUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( MANUFACT_ADDR_UUID ), HI_UINT16(MANUFACT_ADDR_UUID ) +}; + +// Valid Range UUID +CONST uint8 validRangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_VALID_RANGE_UUID ), HI_UINT16( GATT_VALID_RANGE_UUID ) +}; + +// External Report Reference Descriptor +CONST uint8 extReportRefUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_EXT_REPORT_REF_UUID ), HI_UINT16( GATT_EXT_REPORT_REF_UUID ) +}; + +// Report Reference characteristic descriptor +CONST uint8 reportRefUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_REPORT_REF_UUID ), HI_UINT16( GATT_REPORT_REF_UUID ) +}; + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn GATT_FindUUIDRec + * + * @brief Find the UUID record for a given UUID. + * + * @param pUUID - UUID to look for. + * @param len - length of UUID. + * + * @return Pointer to UUID record. NULL, otherwise. + */ +const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ) +{ + const uint8 *pRec = NULL; + + if ( len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pUUID[0], pUUID[1] ); + switch ( uuid ) + { + /*** GATT Services ***/ + + case GAP_SERVICE_UUID: + pRec = gapServiceUUID; + break; + + case GATT_SERVICE_UUID: + pRec = gattServiceUUID; + break; + + /*** GATT Attribute Types ***/ + + case GATT_PRIMARY_SERVICE_UUID: + pRec = primaryServiceUUID; + break; + + case GATT_SECONDARY_SERVICE_UUID: + pRec = secondaryServiceUUID; + break; + + case GATT_INCLUDE_UUID: + pRec = includeUUID; + break; + + case GATT_CHARACTER_UUID: + pRec = characterUUID; + break; + + /*** GATT Characteristic Descriptors ***/ + + case GATT_CHAR_EXT_PROPS_UUID: + pRec = charExtPropsUUID; + break; + + case GATT_CHAR_USER_DESC_UUID: + pRec = charUserDescUUID; + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + pRec = clientCharCfgUUID; + break; + + case GATT_SERV_CHAR_CFG_UUID: + pRec = servCharCfgUUID; + break; + + case GATT_CHAR_FORMAT_UUID: + pRec = charFormatUUID; + break; + + case GATT_CHAR_AGG_FORMAT_UUID: + pRec = charAggFormatUUID; + break; + + case GATT_VALID_RANGE_UUID: + pRec = validRangeUUID; + break; + + case GATT_EXT_REPORT_REF_UUID: + pRec = extReportRefUUID; + break; + + case GATT_REPORT_REF_UUID: + pRec = reportRefUUID; + break; + + /*** GATT Characteristic Types ***/ + + case DEVICE_NAME_UUID: + pRec = deviceNameUUID; + break; + + case APPEARANCE_UUID: + pRec = appearanceUUID; + break; + + case RECONNECT_ADDR_UUID: + pRec = reconnectAddrUUID; + break; + + case PERI_PRIVACY_FLAG_UUID: + pRec = periPrivacyFlagUUID; + break; + + case PERI_CONN_PARAM_UUID: + pRec = periConnParamUUID; + break; + + case SERVICE_CHANGED_UUID: + pRec = serviceChangedUUID; + break; + + /*** GATT Characteristic Descriptions ***/ + + /*** GATT Characteristic Units ***/ + + default: + break; + } + } + else if ( len == ATT_UUID_SIZE ) + { + // 128-bit UUID + } + + return ( pRec ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Components/ble/host/linkdb.h b/Firmware/Radio/Components/ble/host/linkdb.h new file mode 100644 index 0000000..3ab4a28 --- /dev/null +++ b/Firmware/Radio/Components/ble/host/linkdb.h @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef LINKDB_H +#define LINKDB_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles +#define INVALID_CONNHANDLE 0xFFFF // Invalid connection handle, used for no connection handle +#define LOOPBACK_CONNHANDLE 0xFFFE // Loopback connection handle, used to loopback a message + +// Link state flags +#define LINK_NOT_CONNECTED 0x00 // Link isn't connected +#define LINK_CONNECTED 0x01 // Link is connected +#define LINK_AUTHENTICATED 0x02 // Link is authenticated +#define LINK_BOUND 0x04 // Link is bonded +#define LINK_ENCRYPTED 0x10 // Link is encrypted + +// Link Database Status callback changeTypes +#define LINKDB_STATUS_UPDATE_NEW 0 // New connection created +#define LINKDB_STATUS_UPDATE_REMOVED 1 // Connection was removed +#define LINKDB_STATUS_UPDATE_STATEFLAGS 2 // Connection state flag changed + +// Link Authentication Errors +#define LINKDB_ERR_INSUFFICIENT_AUTHEN 0x05 // Link isn't even encrypted +#define LINBDB_ERR_INSUFFICIENT_KEYSIZE 0x0c // Link is encrypted but the key size is too small +#define LINKDB_ERR_INSUFFICIENT_ENCRYPTION 0x0f // Link is encrypted but it's not authenticated + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[KEYLEN]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[KEYLEN]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[B_RANDOM_NUM_SIZE]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[B_ADDR_LEN]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + #define linkDB_Up( connectionHandle ) linkDB_State( (connectionHandle), LINK_CONNECTED ) + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + #define linkDB_Encrypted( connectionHandle ) linkDB_State( (connectionHandle), LINK_ENCRYPTED ) + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* LINKDB_H */ diff --git a/Firmware/Radio/Components/ble/include/att.h b/Firmware/Radio/Components/ble/include/att.h new file mode 100644 index 0000000..3d0a52b --- /dev/null +++ b/Firmware/Radio/Components/ble/include/att.h @@ -0,0 +1,1241 @@ +/** + @headerfile: att.h + + +**************************************************************************************************/ + +#ifndef ATT_H +#define ATT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +#include "l2cap.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. +#define ATT_MTU_SIZE L2CAP_MTU_SIZE //!< Minimum ATT MTU size +#define ATT_MAX_MTU_SIZE 517 //!< Maximum ATT MTU size + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#define ATT_ERROR_RSP 0x01 //!< ATT Error Response +#define ATT_EXCHANGE_MTU_REQ 0x02 //!< ATT Exchange MTU Request +#define ATT_EXCHANGE_MTU_RSP 0x03 //!< ATT Exchange MTU Response +#define ATT_FIND_INFO_REQ 0x04 //!< ATT Find Information Request +#define ATT_FIND_INFO_RSP 0x05 //!< ATT Find Information Response +#define ATT_FIND_BY_TYPE_VALUE_REQ 0x06 //!< ATT Find By Type Vaue Request +#define ATT_FIND_BY_TYPE_VALUE_RSP 0x07 //!< ATT Find By Type Vaue Response +#define ATT_READ_BY_TYPE_REQ 0x08 //!< ATT Read By Type Request +#define ATT_READ_BY_TYPE_RSP 0x09 //!< ATT Read By Type Response +#define ATT_READ_REQ 0x0a //!< ATT Read Request +#define ATT_READ_RSP 0x0b //!< ATT Read Response +#define ATT_READ_BLOB_REQ 0x0c //!< ATT Read Blob Request +#define ATT_READ_BLOB_RSP 0x0d //!< ATT Read Blob Response +#define ATT_READ_MULTI_REQ 0x0e //!< ATT Read Multiple Request +#define ATT_READ_MULTI_RSP 0x0f //!< ATT Read Multiple Response +#define ATT_READ_BY_GRP_TYPE_REQ 0x10 //!< ATT Read By Group Type Request +#define ATT_READ_BY_GRP_TYPE_RSP 0x11 //!< ATT Read By Group Type Response +#define ATT_WRITE_REQ 0x12 //!< ATT Write Request +#define ATT_WRITE_RSP 0x13 //!< ATT Write Response +#define ATT_PREPARE_WRITE_REQ 0x16 //!< ATT Prepare Write Request +#define ATT_PREPARE_WRITE_RSP 0x17 //!< ATT Prepare Write Response +#define ATT_EXECUTE_WRITE_REQ 0x18 //!< ATT Execute Write Request +#define ATT_EXECUTE_WRITE_RSP 0x19 //!< ATT Execute Write Response +#define ATT_HANDLE_VALUE_NOTI 0x1b //!< ATT Handle Value Notification +#define ATT_HANDLE_VALUE_IND 0x1d //!< ATT Handle Value Indication +#define ATT_HANDLE_VALUE_CFM 0x1e //!< ATT Handle Value Confirmation + +#define ATT_WRITE_CMD 0x52 //!< ATT Write Command +#define ATT_SIGNED_WRITE_CMD 0xD2 //!< ATT Signed Write Command + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) +#define ATT_METHOD_BITS 0x3f + +// Command Flag (bit 6) +#define ATT_CMD_FLAG_BIT 0x40 + +// Authentication Signature Flag (bit 7) +#define ATT_AUTHEN_SIG_FLAG_BIT 0x80 + +// Size of 16-bit Bluetooth UUID +#define ATT_BT_UUID_SIZE 2 + +// Size of 128-bit UUID +#define ATT_UUID_SIZE 16 + +// ATT Response or Confirmation timeout +#define ATT_MSG_TIMEOUT 30 + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent +#define ATT_SIG_NOT_INCLUDED 0x00 // Signature not included +#define ATT_SIG_VALID 0x01 // Included signature valid +#define ATT_SIG_INVALID 0x02 // Included signature not valid + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#define ATT_ERR_INVALID_HANDLE 0x01 //!< Attribute handle value given was not valid on this attribute server +#define ATT_ERR_READ_NOT_PERMITTED 0x02 //!< Attribute cannot be read +#define ATT_ERR_WRITE_NOT_PERMITTED 0x03 //!< Attribute cannot be written +#define ATT_ERR_INVALID_PDU 0x04 //!< The attribute PDU was invalid +#define ATT_ERR_INSUFFICIENT_AUTHEN 0x05 //!< The attribute requires authentication before it can be read or written +#define ATT_ERR_UNSUPPORTED_REQ 0x06 //!< Attribute server doesn't support the request received from the attribute client +#define ATT_ERR_INVALID_OFFSET 0x07 //!< Offset specified was past the end of the attribute +#define ATT_ERR_INSUFFICIENT_AUTHOR 0x08 //!< The attribute requires an authorization before it can be read or written +#define ATT_ERR_PREPARE_QUEUE_FULL 0x09 //!< Too many prepare writes have been queued +#define ATT_ERR_ATTR_NOT_FOUND 0x0a //!< No attribute found within the given attribute handle range +#define ATT_ERR_ATTR_NOT_LONG 0x0b //!< Attribute cannot be read or written using the Read Blob Request or Prepare Write Request +#define ATT_ERR_INSUFFICIENT_KEY_SIZE 0x0c //!< The Encryption Key Size used for encrypting this link is insufficient +#define ATT_ERR_INVALID_VALUE_SIZE 0x0d //!< The attribute value length is invalid for the operation +#define ATT_ERR_UNLIKELY 0x0e //!< The attribute request that was requested has encountered an error that was very unlikely, and therefore could not be completed as requested +#define ATT_ERR_INSUFFICIENT_ENCRYPT 0x0f //!< The attribute requires encryption before it can be read or written +#define ATT_ERR_UNSUPPORTED_GRP_TYPE 0x10 //!< The attribute type is not a supported grouping attribute as defined by a higher layer specification +#define ATT_ERR_INSUFFICIENT_RESOURCES 0x11 //!< Insufficient Resources to complete the request + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0xFF ***/ + +#define ATT_ERR_INVALID_VALUE 0x80 //!< The attribute value is invalid for the operation + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID +#define ATT_HANDLE_BT_UUID_TYPE 0x01 + + // Handle and 128-bit UUID +#define ATT_HANDLE_UUID_TYPE 0x02 + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response +#define ATT_MAX_NUM_HANDLE_BT_UUID ( ( ATT_MTU_SIZE - 2 ) / ( 2 + ATT_BT_UUID_SIZE ) ) + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response +#define ATT_MAX_NUM_HANDLE_UUID ( ( ATT_MTU_SIZE - 2 ) / ( 2 + ATT_UUID_SIZE ) ) + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response +#define ATT_MAX_NUM_HANDLES_INFO ( ( ATT_MTU_SIZE - 1 ) / 4 ) + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request +#define ATT_MAX_NUM_HANDLES ( ( ATT_MTU_SIZE - 1 ) / 2 ) + + // Minimum number of handles in a single Read Multiple Request +#define ATT_MIN_NUM_HANDLES 2 + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes +#define ATT_CANCEL_PREPARED_WRITES 0x00 + + // Immediately write all pending prepared values +#define ATT_WRITE_PREPARED_VALUES 0x01 + +#if defined ( TESTMODES ) + // ATT Test Modes + #define ATT_TESTMODE_OFF 0 // Test mode off + #define ATT_TESTMODE_UNAUTHEN_SIG 1 // Do not authenticate incoming signature +#endif + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) +#define READ_BY_TYPE_REQ_FIXED_SIZE 4 + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) +#define PREPARE_WRITE_REQ_FIXED_SIZE 4 + +/********************************************************************* + * VARIABLES + */ +extern CONST uint8 btBaseUUID[ATT_UUID_SIZE]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[ATT_UUID_SIZE]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[ATT_BT_UUID_SIZE]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[ATT_BT_UUID_SIZE]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[ATT_UUID_SIZE]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[ATT_MAX_NUM_HANDLE_BT_UUID]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[ATT_MAX_NUM_HANDLE_UUID]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[ATT_MAX_NUM_HANDLES_INFO]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[ATT_MAX_NUM_HANDLES]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[ATT_MTU_SIZE-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ATT_H */ diff --git a/Firmware/Radio/Components/ble/include/bcomdef.h b/Firmware/Radio/Components/ble/include/bcomdef.h new file mode 100644 index 0000000..74c2c8a --- /dev/null +++ b/Firmware/Radio/Components/ble/include/bcomdef.h @@ -0,0 +1,254 @@ +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + +#ifndef BCOMDEF_H +#define BCOMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +#if defined ( HOST_CONFIG ) + // Set the Controller Configuration + #if ( HOST_CONFIG == ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG | SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == ( CENTRAL_CFG | BROADCASTER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == ( PERIPHERAL_CFG | OBSERVER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG | SCAN_CFG ) + #elif ( HOST_CONFIG == ( BROADCASTER_CFG | OBSERVER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | SCAN_CFG ) + #elif ( HOST_CONFIG == CENTRAL_CFG ) + #define CTRL_CONFIG ( SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == PERIPHERAL_CFG ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG ) + #elif ( HOST_CONFIG == OBSERVER_CFG ) + #define CTRL_CONFIG SCAN_CFG + #elif ( HOST_CONFIG == BROADCASTER_CFG ) + #define CTRL_CONFIG ADV_NCONN_CFG + #else + #error "Build Configuration Error: Invalid Host Role!" + #endif +#else + // Controller Sanity Check: Stop build when no configuration is defined. + #if !defined( CTRL_CONFIG ) || !( CTRL_CONFIG & ( ADV_NCONN_CFG | \ + ADV_CONN_CFG | \ + SCAN_CFG | \ + INIT_CFG ) ) + #error "Build Configuration Error: At least one Controller build component required!" + #endif // no Controller build components defined +#endif + +#if !defined ( MAX_NUM_LL_CONN ) + #if ( CTRL_CONFIG & INIT_CFG ) + #define MAX_NUM_LL_CONN 3 + #elif ( !( CTRL_CONFIG & INIT_CFG ) && ( CTRL_CONFIG & ADV_CONN_CFG ) ) + #define MAX_NUM_LL_CONN 1 + #else // no connection needed + #define MAX_NUM_LL_CONN 0 + #endif // CTRL_CONFIG=INIT_CFG +#endif // !MAX_NUM_LL_CONN + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length +#define B_ADDR_LEN 6 + +//! Default key length +#define KEYLEN 16 + +//! BLE Channel Map length +#define B_CHANNEL_MAP_LEN 5 + +//! BLE Event mask length +#define B_EVENT_MASK_LEN 8 + +//! BLE Local Name length +#define B_LOCAL_NAME_LEN 248 + +//! BLE Maximum Advertising Packet Length +#define B_MAX_ADV_LEN 31 + +//! BLE Random Number Size +#define B_RANDOM_NUM_SIZE 8 + +//! BLE Feature Supported length +#define B_FEATURE_SUPPORT_LENGTH 8 + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#define bleInvalidTaskID INVALID_TASK //!< Task ID isn't setup properly +#define bleNotReady 0x10 //!< Not ready to perform task +#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task +#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task +#define bleMemAllocError 0x13 //!< Memory allocation error occurred +#define bleNotConnected 0x14 //!< Can't perform function when not in a connection +#define bleNoResources 0x15 //!< There are no resource available +#define blePending 0x16 //!< Waiting +#define bleTimeout 0x17 //!< Timed out performing function +#define bleInvalidRange 0x18 //!< A parameter is out of range +#define bleLinkEncrypted 0x19 //!< The link is already encrypted +#define bleProcedureComplete 0x1A //!< The Procedure is completed + +// GAP Status Return Values - returned as bStatus_t +#define bleGAPUserCanceled 0x30 //!< The user canceled the task +#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted +#define bleGAPBondRejected 0x32 //!< The bound information was rejected. + +// ATT Status Return Values - returned as bStatus_t +#define bleInvalidPDU 0x40 //!< The attribute PDU is invalid +#define bleInsufficientAuthen 0x41 //!< The attribute has insufficient authentication +#define bleInsufficientEncrypt 0x42 //!< The attribute has insufficient encryption +#define bleInsufficientKeySize 0x43 //!< The attribute has insufficient encryption key size + +// L2CAP Status Return Values - returned as bStatus_t + +#define INVALID_TASK_ID 0xFF //!< Task ID isn't setup properly +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F +#define BLE_NVID_IRK 0x02 //!< The Device's IRK +#define BLE_NVID_CSRK 0x03 //!< The Device's CSRK +#define BLE_NVID_SIGNCOUNTER 0x04 //!< The Device's Sign Counter + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings +#define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs +#define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries +#define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs +#define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ +#define GAP_EVENT_SIGN_COUNTER_CHANGED 0x4000 //!< The device level sign counter changed + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) +#define GAP_MSG_EVENT 0xD0 //!< Incoming GAP message + +// SM - Messages IDs (0xC1 - 0xCF) +#define SM_NEW_RAND_KEY_EVENT 0xC1 //!< New Rand Key Event message + +// GATT - Messages IDs (0xB0 - 0xBF) +#define GATT_MSG_EVENT 0xB0 //!< Incoming GATT message +#define GATT_SERV_MSG_EVENT 0xB1 //!< Incoming GATT Serv App message + +// L2CAP - Messages IDs (0xA0 - 0xAF) +#define L2CAP_DATA_EVENT 0xA0 //!< Incoming data on a channel +#define L2CAP_SIGNAL_EVENT 0xA2 //!< Incoming Signaling message + +// HCI - Messages IDs (0x90 - 0x9F) +#define HCI_DATA_EVENT 0x90 //!< HCI Data Event message +#define HCI_GAP_EVENT_EVENT 0x91 //!< GAP Event message +#define HCI_SMP_EVENT_EVENT 0x92 //!< SMP Event message +#define HCI_EXT_CMD_EVENT 0x93 //!< HCI Extended Command Event message +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 +#define TI_BASE_UUID_128( uuid ) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, \ + 0x00, 0x40, 0x51, 0x04, LO_UINT16( uuid ), HI_UINT16( uuid ), 0x00, 0xF0 + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BCOMDEF_H */ diff --git a/Firmware/Radio/Components/ble/include/gap.h b/Firmware/Radio/Components/ble/include/gap.h new file mode 100644 index 0000000..d630f04 --- /dev/null +++ b/Firmware/Radio/Components/ble/include/gap.h @@ -0,0 +1,1196 @@ +/** + @headerfile: gap.h + $Date: 2012-11-14 11:27:54 -0800 (Wed, 14 Nov 2012) $ + $Revision: 32182 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + +#ifndef GAP_H +#define GAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "sm.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#define GAP_DEVICE_INIT_DONE_EVENT 0x00 //!< Sent when the Device Initialization is complete. This event is sent as an OSAL message defined as gapDeviceInitDoneEvent_t. +#define GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an OSAL message defined as gapDevDiscEvent_t. +#define GAP_ADV_DATA_UPDATE_DONE_EVENT 0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an OSAL message defined as gapAdvDataUpdateEvent_t. +#define GAP_MAKE_DISCOVERABLE_DONE_EVENT 0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an OSAL message defined as gapMakeDiscoverableRspEvent_t. +#define GAP_END_DISCOVERABLE_DONE_EVENT 0x04 //!< Sent when the Advertising has ended. This event is sent as an OSAL message defined as gapEndDiscoverableRspEvent_t. +#define GAP_LINK_ESTABLISHED_EVENT 0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an OSAL message defined as gapEstLinkReqEvent_t. +#define GAP_LINK_TERMINATED_EVENT 0x06 //!< Sent when a connection was terminated. This event is sent as an OSAL message defined as gapTerminateLinkEvent_t. +#define GAP_LINK_PARAM_UPDATE_EVENT 0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an OSAL message defined as gapLinkUpdateEvent_t. +#define GAP_RANDOM_ADDR_CHANGED_EVENT 0x08 //!< Sent when a random address was changed. This event is sent as an OSAL message defined as gapRandomAddrEvent_t. +#define GAP_SIGNATURE_UPDATED_EVENT 0x09 //!< Sent when the device's signature counter is updated. This event is sent as an OSAL message defined as gapSignUpdateEvent_t. +#define GAP_AUTHENTICATION_COMPLETE_EVENT 0x0A //!< Sent when the Authentication (pairing) process is complete. This event is sent as an OSAL message defined as gapAuthCompleteEvent_t. +#define GAP_PASSKEY_NEEDED_EVENT 0x0B //!< Sent when a Passkey is needed. This is part of the pairing process. This event is sent as an OSAL message defined as gapPasskeyNeededEvent_t. +#define GAP_SLAVE_REQUESTED_SECURITY_EVENT 0x0C //!< Sent when a Slave Security Request is received. This event is sent as an OSAL message defined as gapSlaveSecurityReqEvent_t. +#define GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered. This event is sent as an OSAL message defined as gapDeviceInfoEvent_t. +#define GAP_BOND_COMPLETE_EVENT 0x0E //!< Sent when the bonding(bound) process is complete. This event is sent as an OSAL message defined as gapBondCompleteEvent_t. +#define GAP_PAIRING_REQ_EVENT 0x0F //!< Sent when an unexpected Pairing Request is received. This event is sent as an OSAL message defined as gapPairingReqEvent_t. +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ +#define GAP_CONNHANDLE_INIT 0xFFFE //!< terminates a link create +#define GAP_CONNHANDLE_ALL 0xFFFF //!< terminates all links for the matching task ID. +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ +#define GAP_PROFILE_BROADCASTER 0x01 //!< A device that sends advertising events only. +#define GAP_PROFILE_OBSERVER 0x02 //!< A device that receives advertising events only. +#define GAP_PROFILE_PERIPHERAL 0x04 //!< A device that accepts the establishment of an LE physical link using the connection establishment procedure +#define GAP_PROFILE_CENTRAL 0x08 //!< A device that supports the Central role initiates the establishment of a physical connection +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode (mSec). Setting this parameter to 0 turns off the timeout (default). +#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode. In seconds (default 180 seconds) +#define TGAP_GEN_DISC_SCAN 2 //!< Minimum time to perform scanning, when performing General Discovery proc (mSec) +#define TGAP_LIM_DISC_SCAN 3 //!< Minimum time to perform scanning, when performing Limited Discovery proc (mSec) +#define TGAP_CONN_EST_ADV_TIMEOUT 4 //!< Advertising timeout, when performing Connection Establishment proc (mSec) +#define TGAP_CONN_PARAM_TIMEOUT 5 //!< Link Layer connection parameter update notification timer, connection parameter update proc (mSec) + +// Constants +#define TGAP_LIM_DISC_ADV_INT_MIN 6 //!< Minimum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_LIM_DISC_ADV_INT_MAX 7 //!< Maximum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MIN 8 //!< Minimum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MAX 9 //!< Maximum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MIN 10 //!< Minimum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MAX 11 //!< Maximum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_INT 12 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_WIND 13 //!< Scan window used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_INT 14 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_WIND 15 //!< Scan window used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_INT 16 //!< Scan interval used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_WIND 17 //!< Scan window used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_INT 18 //!< Scan interval used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_WIND 19 //!< Scan window used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_CONN_EST_ADV 20 //!< Advertising interval, when using Connection Establishment proc (n * 0.625 mSec). Obsolete - Do not use. +#define TGAP_CONN_EST_INT_MIN 21 //!< Minimum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_INT_MAX 22 //!< Maximum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_SCAN_INT 23 //!< Scan interval used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SCAN_WIND 24 //!< Scan window used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SUPERV_TIMEOUT 25 //!< Link Layer connection supervision timeout, when using Connection Establishment proc (n * 10 mSec) +#define TGAP_CONN_EST_LATENCY 26 //!< Link Layer connection slave latency, when using Connection Establishment proc (in number of connection events) +#define TGAP_CONN_EST_MIN_CE_LEN 27 //!< Local informational parameter about min len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_MAX_CE_LEN 28 //!< Local informational parameter about max len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_PRIVATE_ADDR_INT 29 //!< Minimum Time Interval between private (resolvable) address changes. In minutes (default 15 minutes) + +// Proprietary +#define TGAP_SM_TIMEOUT 30 //!< SM Message Timeout (milliseconds). Default 30 seconds. +#define TGAP_SM_MIN_KEY_LEN 31 //!< SM Minimum Key Length supported. Default 7. +#define TGAP_SM_MAX_KEY_LEN 32 //!< SM Maximum Key Length supported. Default 16. +#define TGAP_FILTER_ADV_REPORTS 33 //!< Filter duplicate advertising reports. Default TRUE. +#define TGAP_SCAN_RSP_RSSI_MIN 34 //!< Minimum RSSI required for scan responses to be reported to the app. Default -127. + +#if !defined ( TESTMODES ) + #define TGAP_AUTH_TASK_ID 35 //!< Task ID override for Task Authentication control (for stack internal use only) + #define TGAP_PARAMID_MAX 36 //!< ID MAX-valid Parameter ID +#else + #define TGAP_GAP_TESTCODE 35 //!< GAP TestCodes - puts GAP into a test mode + #define TGAP_SM_TESTCODE 36 //!< SM TestCodes - puts SM into a test mode + #define TGAP_AUTH_TASK_ID 37 //!< Task ID override for Task Authentication control (for stack internal use only) + #define TGAP_PARAMID_MAX 38 //!< ID MAX-valid Parameter ID + + #define TGAP_GATT_TESTCODE 100 //!< GATT TestCodes - puts GATT into a test mode (paramValue maintained by GATT) + #define TGAP_ATT_TESTCODE 101 //!< ATT TestCodes - puts ATT into a test mode (paramValue maintained by ATT) + #define TGAP_GGS_TESTCODE 102 //!< GGS TestCodes - puts GGS into a test mode (paramValue maintained by GGS) +#endif + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ +#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting +#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices +#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices +#define DEVDISC_MODE_ALL 0x03 //!< Not filtered +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ +#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR +#define ADDRTYPE_STATIC 0x01 //!< Static address +#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address +#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ +#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement +#define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement +#define GAP_ADTYPE_ADV_DISCOVER_IND 0x02 //!< Discoverable undirected advertisement +#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement +#define GAP_ADTYPE_SCAN_RSP_IND 0x04 //!< Only used in gapDeviceInfoEvent_t +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ +#define GAP_FILTER_POLICY_ALL 0x00 //!< Allow Scan Request from Any, Allow Connect Request from Any (default). +#define GAP_FILTER_POLICY_WHITE_SCAN 0x01 //!< Allow Scan Request from White List Only, Allow Connect from Any +#define GAP_FILTER_POLICY_WHITE_CON 0x02 //!< Allow Scan Request from Any, Connect from White List Only +#define GAP_FILTER_POLICY_WHITE 0x03 //!< Allow Scan Request and Connect from White List Only +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map +#define ADV_CHANMAP_SIZE 5 + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. +#define GAP_PASSCODE_MAX 999999 + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ +#define GAP_INIT_SIGN_COUNTER 0xFFFFFFFF + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ +#define GAP_ADVCHAN_37 0x01 //!< Advertisement Channel 37 +#define GAP_ADVCHAN_38 0x02 //!< Advertisement Channel 38 +#define GAP_ADVCHAN_39 0x04 //!< Advertisement Channel 39 +#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //!< All Advertisement Channels Enabled +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ +#define WL_NOTUSED 0x00 //!< White list not used but the advertiser's address in this command is used +#define WL_USED 0x01 //!< White list is used and the advertiser's address in this command is not used. +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#define GAP_ADTYPE_FLAGS 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES +#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available +#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs +#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available +#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs +#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available +#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs +#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name +#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name +#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: 0xXX: -127 to +127 dBm +#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets) +#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value +#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Secutiry Manager OOB Flags +#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max) +#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field +#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs +#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs +#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data +#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance +#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ +#define GAP_ADTYPE_FLAGS_LIMITED 0x01 //!< Discovery Mode: LE Limited Discoverable Mode +#define GAP_ADTYPE_FLAGS_GENERAL 0x02 //!< Discovery Mode: LE General Discoverable Mode +#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 0x04 //!< Discovery Mode: BR/EDR Not Supported +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#define GAP_APPEARE_UNKNOWN 0x0000 //!< Unknown +#define GAP_APPEARE_GENERIC_PHONE 0x0040 //!< Generic Phone +#define GAP_APPEARE_GENERIC_COMPUTER 0x0080 //!< Generic Computer +#define GAP_APPEARE_GENERIC_WATCH 0x00C0 //!< Generic Watch +#define GAP_APPEARE_WATCH_SPORTS 0x00C1 //!< Watch: Sports Watch +#define GAP_APPEARE_GENERIC_CLOCK 0x0100 //!< Generic Clock +#define GAP_APPEARE_GENERIC_DISPLAY 0x0140 //!< Generic Display +#define GAP_APPEARE_GENERIC_RC 0x0180 //!< Generic Remote Control +#define GAP_APPEARE_GENERIC_EYE_GALSSES 0x01C0 //!< Generic Eye-glasses +#define GAP_APPEARE_GENERIC_TAG 0x0200 //!< Generic Tag +#define GAP_APPEARE_GENERIC_KEYRING 0x0240 //!< Generic Keyring +#define GAP_APPEARE_GENERIC_MEDIA_PLAYER 0x0280 //!< Generic Media Player +#define GAP_APPEARE_GENERIC_BARCODE_SCANNER 0x02C0 //!< Generic Barcode Scanner +#define GAP_APPEARE_GENERIC_THERMOMETER 0x0300 //!< Generic Thermometer +#define GAP_APPEARE_GENERIC_THERMO_EAR 0x0301 //!< Thermometer: Ear +#define GAP_APPEARE_GENERIC_HR_SENSOR 0x0340 //!< Generic Heart rate Sensor +#define GAP_APPEARE_GENERIC_HRS_BELT 0x0341 //!< Heart Rate Sensor: Heart Rate Belt +#define GAP_APPEARE_GENERIC_BLOOD_PRESSURE 0x0380 //!< Generic Blood Pressure +#define GAP_APPEARE_GENERIC_BP_ARM 0x0381 //!< Blood Pressure: Arm +#define GAP_APPEARE_GENERIC_BP_WRIST 0x0382 //!< Blood Pressure: Wrist +#define GAP_APPEARE_GENERIC_HID 0x03C0 //!< Generic Human Interface Device (HID) +#define GAP_APPEARE_HID_KEYBOARD 0x03C1 //!< HID Keyboard +#define GAP_APPEARE_HID_MOUSE 0x03C2 //!< HID Mouse +#define GAP_APPEARE_HID_JOYSTIC 0x03C3 //!< HID Joystick +#define GAP_APPEARE_HID_GAMEPAD 0x03C4 //!< HID Gamepad +#define GAP_APPEARE_HID_DIGITIZER_TYABLET 0x03C5 //!< HID Digitizer Tablet +#define GAP_APPEARE_HID_DIGITAL_CARDREADER 0x03C6 //!< HID Card Reader +#define GAP_APPEARE_HID_DIGITAL_PEN 0x03C7 //!< HID Digital Pen +#define GAP_APPEARE_HID_BARCODE_SCANNER 0x03C8 //!< HID Barcode Scanner +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[B_ADDR_LEN]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[B_ADDR_LEN]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[B_ADDR_LEN]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[B_ADDR_LEN]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[B_ADDR_LEN]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[B_ADDR_LEN]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAP_H */ diff --git a/Firmware/Radio/Components/ble/include/gatt.h b/Firmware/Radio/Components/ble/include/gatt.h new file mode 100644 index 0000000..30022ae --- /dev/null +++ b/Firmware/Radio/Components/ble/include/gatt.h @@ -0,0 +1,1365 @@ +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GATT_H +#define GATT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +#include "att.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#define GATT_PERMIT_READ 0x01 //!< Attribute is Readable +#define GATT_PERMIT_WRITE 0x02 //!< Attribute is Writable +#define GATT_PERMIT_AUTHEN_READ 0x04 //!< Read requires Authentication +#define GATT_PERMIT_AUTHEN_WRITE 0x08 //!< Write requires Authentication +#define GATT_PERMIT_AUTHOR_READ 0x10 //!< Read requires Authorization +#define GATT_PERMIT_AUTHOR_WRITE 0x20 //!< Write requires Authorization + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + +#if !defined( GATT_MAX_NUM_PREPARE_WRITES ) + #define GATT_MAX_NUM_PREPARE_WRITES 5 //!< GATT Maximum number of attributes that Attribute Server can prepare for writing per Attribute Client +#endif + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + +#define GATT_ENCRYPT_KEY_SIZE 16 //!< GATT Encryption Key Size used for encrypting a link + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + +#define GATT_MAX_ATTR_SIZE 512 //!< GATT Maximum length of an attribute value + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) +#define GATT_MAX_NUM_CONN ( MAX_NUM_LL_CONN + 1 ) + + // GATT Base Method +#define GATT_BASE_METHOD 0x40 + +// Attribute handle defintions +#define GATT_INVALID_HANDLE 0x0000 // Invalid attribute handle +#define GATT_MIN_HANDLE 0x0001 // Minimum attribute handle +#define GATT_MAX_HANDLE 0xFFFF // Maximum attribute handle + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#define gattPermitRead( a ) ( (a) & GATT_PERMIT_READ ) +#define gattPermitWrite( a ) ( (a) & GATT_PERMIT_WRITE ) +#define gattPermitAuthenRead( a ) ( (a) & GATT_PERMIT_AUTHEN_READ ) +#define gattPermitAuthenWrite( a ) ( (a) & GATT_PERMIT_AUTHEN_WRITE ) +#define gattPermitAuthorRead( a ) ( (a) & GATT_PERMIT_AUTHOR_READ ) +#define gattPermitAuthorWrite( a ) ( (a) & GATT_PERMIT_AUTHOR_WRITE ) + +// Check for different UUID types +#define gattPrimaryServiceType( t ) ( ATT_CompareUUID( primaryServiceUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattSecondaryServiceType( t ) ( ATT_CompareUUID( secondaryServiceUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattCharacterType( t ) ( ATT_CompareUUID( characterUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattIncludeType( t ) ( ATT_CompareUUID( includeUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattServiceType( t ) ( gattPrimaryServiceType( (t) ) || \ + gattSecondaryServiceType( (t) ) ) + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATT_H */ diff --git a/Firmware/Radio/Components/ble/include/gatt_uuid.h b/Firmware/Radio/Components/ble/include/gatt_uuid.h new file mode 100644 index 0000000..1ae59c8 --- /dev/null +++ b/Firmware/Radio/Components/ble/include/gatt_uuid.h @@ -0,0 +1,281 @@ +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GATT_UUID_H +#define GATT_UUID_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ +#define GAP_SERVICE_UUID 0x1800 // Generic Access Profile +#define GATT_SERVICE_UUID 0x1801 // Generic Attribute Profile +#define BATT_STATE_SERVICE_UUID 0xA000 // Battery State +#define TMERMO_HUMID_SERVICE_UUID 0xA001 // Thermometer Humidity +#define WEIGHT_SERVICE_UUID 0xA002 // Weight +#define POSITION_SERVICE_UUID 0xA003 // Position +#define ALERT_SERVICE_UUID 0xA004 // Alert +#define MANUFACT_SERVICE_UUID 0xA005 // Manufacturer +#define ADDRESS_SERVICE_UUID 0xA006 // Address + +/** + * GATT Attribute Types + */ +#define GATT_PRIMARY_SERVICE_UUID 0x2800 // Primary Service +#define GATT_SECONDARY_SERVICE_UUID 0x2801 // Secondary Service +#define GATT_INCLUDE_UUID 0x2802 // Include +#define GATT_CHARACTER_UUID 0x2803 // Characteristic + +/** + * GATT Characteristic Descriptors + */ +#define GATT_CHAR_EXT_PROPS_UUID 0x2900 // Characteristic Extended Properties +#define GATT_CHAR_USER_DESC_UUID 0x2901 // Characteristic User Description +#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 // Client Characteristic Configuration +#define GATT_SERV_CHAR_CFG_UUID 0x2903 // Server Characteristic Configuration +#define GATT_CHAR_FORMAT_UUID 0x2904 // Characteristic Format +#define GATT_CHAR_AGG_FORMAT_UUID 0x2905 // Characteristic Aggregate Format +#define GATT_VALID_RANGE_UUID 0x2906 // Valid Range +#define GATT_EXT_REPORT_REF_UUID 0x2907 // External Report Reference Descriptor +#define GATT_REPORT_REF_UUID 0x2908 // Report Reference Descriptor + +/** + * GATT Characteristic Types + */ +#define DEVICE_NAME_UUID 0x2A00 // Device Name +#define APPEARANCE_UUID 0x2A01 // Appearance +#define PERI_PRIVACY_FLAG_UUID 0x2A02 // Peripheral Privacy Flag +#define RECONNECT_ADDR_UUID 0x2A03 // Reconnection Address +#define PERI_CONN_PARAM_UUID 0x2A04 // Peripheral Preferred Connection Parameters +#define SERVICE_CHANGED_UUID 0x2A05 // Service Changed + +#define BATT_STATE_UUID 0xB000 // Battery State +#define TEMPERATURE_UUID 0xB001 // Temperature +#define RELATIVE_HUMID_UUID 0xB002 // Relative Humidity +#define WEIGHT_KG_UUID 0xB004 // Weight Kg +#define LATI_LONGI_UUID 0xB005 // Latitude Longitude +#define LATI_LONGI_ELEV_UUID 0xB006 // Latitude Longitude Elevation +#define ALERT_ENUM_UUID 0xB007 // Alert Enumeration +#define MANUFACT_NAME_UUID 0xB008 // Manufacturer Name +#define SERIAL_NUM_UUID 0xB009 // Serial Number +#define MANUFACT_ADDR_UUID 0xB00A // Manufacturer Address + +/** + * GATT Characteristic Descriptions + */ +#define GATT_DESC_HEART_RATE_UUID 0x3100 // used with Unit beats per minute +#define GATT_DESC_CADENCE_UUID 0x3101 // used with Unit revolution per minute +#define GATT_DESC_LATITUDE_UUID 0x3102 // used with Unit degree +#define GATT_DESC_LONGITUDE_UUID 0x3103 // used with Unit degree +#define GATT_DESC_REL_HUMIDITY_UUID 0x3104 // used with Unit percent +#define GATT_DESC_BODY_MASS_IDX_UUID 0x3105 // used with Unit surface density +#define GATT_DESC_BODY_FAT_UUID 0x3106 // used with Unit percent +#define GATT_DESC_INSIDE_UUID 0x3107 // the value is inside a building +#define GATT_DESC_OUTSIDE_UUID 0x3108 // the value is outside a building +#define GATT_DESC_HANGING_UUID 0x3109 // used with Unit mass kilogram +#define GATT_DESC_BATTERY_UUID 0x310A // the value is associated with a battery +#define GATT_DESC_PWR_SUPPLY_UUID 0x310B // the value is associated with a power supply +#define GATT_DESC_CURRENT_UUID 0x310C // the value is the current value +#define GATT_DESC_TARGET_UUID 0x310D // the value is the target value +#define GATT_DESC_LIGHT_STATE_UUID 0x310E // false = off, true = on +#define GATT_DESC_APPLICANCE_PWR_UUID 0x310F // false = off, true = on +#define GATT_DESC_FRACTIONAL_PWR_UUID 0x3110 // used with Unit range nibble, range octet, range word +#define GATT_DESC_LENGTH_UUID 0x3111 // used with Unit meter +#define GATT_DESC_ELEVATION_UUID 0x3112 // used with Unit meter + +/** + * GATT Characteristic Units + */ +#define GATT_UNITLESS_UUID 0x2700 // , +#define GATT_UNIT_LENGTH_METER_UUID 0x2701 // m, m +#define GATT_UNIT_MASS_KGRAM_UUID 0x2702 // kg, kg +#define GATT_UNIT_TIME_SECOND_UUID 0x2703 // s, s +#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID 0x2704 // A, A +#define GATT_UNIT_THERMODYNAMIC_TEMP_K_UUID 0x2705 // K, K +#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID 0x2706 // mol, mol +#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID 0x2707 // cd, cd + +#define GATT_UNIT_AREA_SQ_MTR_UUID 0x2710 // m^2, m^2 +#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID 0x2711 // m^3, m^3 +#define GATT_UNIT_VELOCITY_MPS_UUID 0x2712 // m/s, m s^-1 +#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID 0x2713 // m/s^2, m s^-2 +#define GATT_UNIT_WAVENUMBER_RM_UUID 0x2714 // ó, m^-1 +#define GATT_UNIT_DENSITY_KGPCM_UUID 0x2715 // p, kg m^-3 +#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID 0x2716 // pA, kg m^-2 +#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID 0x2717 // v, m^3 kg^-1 +#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID 0x2718 // j, A m^-2 +#define GATT_UNIT_MAGNETIC_FIELD_STRENGTH_UUID 0x2719 // H, A m +#define GATT_UNIT_AMOUNT_CONCENTRATE_MPCM_UUID 0x271A // c, mol m^-3 +#define GATT_UNIT_MASS_CONCENTRATE_KGPCM_UUID 0x271B // c, kg m^-3 +#define GATT_UNIT_LUMINANCE_CPSM_UUID 0x271C // Lv, cd m^-2 +#define GATT_UNIT_REFRACTIVE_INDEX_UUID 0x271D // n, 1 +#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID 0x271E // u, 1 +#define GATT_UNIT_PLANE_ANGLE_RAD_UUID 0x2720 // rad, m m-1 +#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID 0x2721 // sr, m2 m-2 +#define GATT_UNIT_FREQUENCY_HTZ_UUID 0x2722 // Hz, s-1 +#define GATT_UNIT_FORCE_NEWTON_UUID 0x2723 // N, m kg s-2 +#define GATT_UNIT_PRESSURE_PASCAL_UUID 0x2724 // Pa, N/m2 = m2 kg s-2 +#define GATT_UNIT_ENERGY_JOULE_UUID 0x2725 // J, N m = m2 kg s-2 +#define GATT_UNIT_POWER_WATT_UUID 0x2726 // W, J/s = m2 kg s-3 +#define GATT_UNIT_ELECTRIC_CHARGE_C_UUID 0x2727 // C, sA +#define GATT_UNIT_ELECTRIC_POTENTIAL_DIF_V_UUID 0x2728 // V, W/A = m2 kg s-3 A-1 + +#define GATT_UNIT_CELSIUS_TEMP_DC_UUID 0x272F // oC, t/oC = T/K - 273.15 + +#define GATT_UNIT_TIME_MINUTE_UUID 0x2760 // min, 60 s +#define GATT_UNIT_TIME_HOUR_UUID 0x2761 // h, 3600 s +#define GATT_UNIT_TIME_DAY_UUID 0x2762 // d, 86400 s +#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID 0x2763 // o, (pi/180) rad +#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID 0x2764 // ', (pi/10800) rad +#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID 0x2765 // '', (pi/648000) rad +#define GATT_UNIT_AREA_HECTARE_UUID 0x2766 // ha, 10^4 m^2 +#define GATT_UNIT_VOLUME_LITRE_UUID 0x2767 // l, 10^-3 m^3 +#define GATT_UNIT_MASS_TONNE_UUID 0x2768 // t, 10^3 kg + +#define GATT_UINT_LENGTH_YARD_UUID 0x27A0 // yd, 0.9144 m +#define GATT_UNIT_LENGTH_PARSEC_UUID 0x27A1 // pc, 3.085678 × 1016 m +#define GATT_UNIT_LENGTH_INCH_UUID 0x27A2 // in, 0.0254 m +#define GATT_UNIT_LENGTH_FOOT_UUID 0x27A3 // ft, 0.3048 m +#define GATT_UNIT_LENGTH_MILE_UUID 0x27A4 // mi, 1609.347 m +#define GATT_UNIT_PRESSURE_PFPSI_UUID 0x27A5 // psi, 6.894757 × 103 Pa +#define GATT_UNIT_VELOCITY_KMPH_UUID 0x27A6 // km/h, 0.2777778 m^s-1 +#define GATT_UNIT_VELOCITY_MPH_UUID 0x27A7 // mi/h, 0.44704 m^ s-1 +#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID 0x27A8 // r/min, 0.1047198 rad s-1 +#define GATT_UNIT_ENERGY_GCAL_UUID 0x27A9 // +#define GATT_UNIT_ENERGY_KCAL_UUID 0x27AA // kcal, 4190.02 J +#define GATT_UNIT_ENERGY_KWH_UUID 0x27AB // kWh, 3600000 J +#define GATT_UNIT_THERMODYNAMIC_TEMP_DF_UUID 0x27AC // oF, t/oF = T/K × 1.8 - 459.67 +#define GATT_UNIT_PERCENTAGE_UUID 0x27AD // % +#define GATT_UNIT_PER_MILE_UUID 0x27AE // +#define GATT_UNIT_PERIOD_BPM_UUID 0x27AF // +#define GATT_UNIT_ELECTRIC_CHARGE_AH_UUID 0x27B0 // +#define GATT_UNIT_MASS_DENSITY_MGPD_UUID 0x27B1 // +#define GATT_UNIT_MASS_DENSITY_MMPL_UUID 0x27B2 // +#define GATT_UNIT_TIME_YEAR_UUID 0x27B3 // +#define GATT_UNIT_TIME_MONTH_UUID 0x27B4 // + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern CONST uint8 gapServiceUUID[]; +extern CONST uint8 gattServiceUUID[]; +extern CONST uint8 testServiceUUID[]; +extern CONST uint8 manufactServiceUUID[]; +extern CONST uint8 addressServiceUUID[]; +extern CONST uint8 longServiceUUID[]; +extern CONST uint8 long3ServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern CONST uint8 primaryServiceUUID[]; +extern CONST uint8 secondaryServiceUUID[]; +extern CONST uint8 includeUUID[]; +extern CONST uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern CONST uint8 charExtPropsUUID[]; +extern CONST uint8 charUserDescUUID[]; +extern CONST uint8 clientCharCfgUUID[]; +extern CONST uint8 servCharCfgUUID[]; +extern CONST uint8 charFormatUUID[]; +extern CONST uint8 charAggFormatUUID[]; +extern CONST uint8 validRangeUUID[]; +extern CONST uint8 extReportRefUUID[]; +extern CONST uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern CONST uint8 deviceNameUUID[]; +extern CONST uint8 appearanceUUID[]; +extern CONST uint8 periPrivacyFlagUUID[]; +extern CONST uint8 reconnectAddrUUID[]; +extern CONST uint8 periConnParamUUID[]; +extern CONST uint8 serviceChangedUUID[]; +extern CONST uint8 manuNameUUID[]; +extern CONST uint8 serialNumUUID[]; +extern CONST uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATT_UUID_H */ diff --git a/Firmware/Radio/Components/ble/include/hci.h b/Firmware/Radio/Components/ble/include/hci.h new file mode 100644 index 0000000..769c2f4 --- /dev/null +++ b/Firmware/Radio/Components/ble/include/hci.h @@ -0,0 +1,2405 @@ +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2012-11-09 12:02:03 -0800 (Fri, 09 Nov 2012) $ + Revision: $Revision: 32139 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_H +#define HCI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "ll.h" +#include "hal_assert.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#define HCI_SUCCESS 0x00 +#define HCI_ERROR_CODE_UNKNOWN_HCI_CMD 0x01 +#define HCI_ERROR_CODE_UNKNOWN_CONN_ID 0x02 +#define HCI_ERROR_CODE_HW_FAILURE 0x03 +#define HCI_ERROR_CODE_PAGE_TIMEOUT 0x04 +#define HCI_ERROR_CODE_AUTH_FAILURE 0x05 +#define HCI_ERROR_CODE_PIN_KEY_MISSING 0x06 +#define HCI_ERROR_CODE_MEM_CAP_EXCEEDED 0x07 +#define HCI_ERROR_CODE_CONN_TIMEOUT 0x08 +#define HCI_ERROR_CODE_CONN_LIMIT_EXCEEDED 0x09 +#define HCI_ERROR_CODE_SYNCH_CONN_LIMIT_EXCEEDED 0x0A +#define HCI_ERROR_CODE_ACL_CONN_ALREADY_EXISTS 0x0B +#define HCI_ERROR_CODE_CMD_DISALLOWED 0x0C +#define HCI_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES 0x0D +#define HCI_ERROR_CODE_CONN_REJECTED_SECURITY_REASONS 0x0E +#define HCI_ERROR_CODE_CONN_REJECTED_UNACCEPTABLE_BDADDR 0x0F +#define HCI_ERROR_CODE_CONN_ACCEPT_TIMEOUT_EXCEEDED 0x10 +#define HCI_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE 0x11 +#define HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS 0x12 +#define HCI_ERROR_CODE_REMOTE_USER_TERM_CONN 0x13 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES 0x14 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF 0x15 +#define HCI_ERROR_CODE_CONN_TERM_BY_LOCAL_HOST 0x16 +#define HCI_ERROR_CODE_REPEATED_ATTEMPTS 0x17 +#define HCI_ERROR_CODE_PAIRING_NOT_ALLOWED 0x18 +#define HCI_ERROR_CODE_UNKNOWN_LMP_PDU 0x19 +#define HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE 0x1A +#define HCI_ERROR_CODE_SCO_OFFSET_REJ 0x1B +#define HCI_ERROR_CODE_SCO_INTERVAL_REJ 0x1C +#define HCI_ERROR_CODE_SCO_AIR_MODE_REJ 0x1D +#define HCI_ERROR_CODE_INVALID_LMP_PARAMS 0x1E +#define HCI_ERROR_CODE_UNSPECIFIED_ERROR 0x1F +#define HCI_ERROR_CODE_UNSUPPORTED_LMP_PARAM_VAL 0x20 +#define HCI_ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21 +#define HCI_ERROR_CODE_LMP_LL_RESP_TIMEOUT 0x22 +#define HCI_ERROR_CODE_LMP_ERR_TRANSACTION_COLLISION 0x23 +#define HCI_ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24 +#define HCI_ERROR_CODE_ENCRYPT_MODE_NOT_ACCEPTABLE 0x25 +#define HCI_ERROR_CODE_LINK_KEY_CAN_NOT_BE_CHANGED 0x26 +#define HCI_ERROR_CODE_REQ_QOS_NOT_SUPPORTED 0x27 +#define HCI_ERROR_CODE_INSTANT_PASSED 0x28 +#define HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 +#define HCI_ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A +#define HCI_ERROR_CODE_RESERVED1 0x2B +#define HCI_ERROR_CODE_QOS_UNACCEPTABLE_PARAM 0x2C +#define HCI_ERROR_CODE_QOS_REJ 0x2D +#define HCI_ERROR_CODE_CHAN_ASSESSMENT_NOT_SUPPORTED 0x2E +#define HCI_ERROR_CODE_INSUFFICIENT_SECURITY 0x2F +#define HCI_ERROR_CODE_PARAM_OUT_OF_MANDATORY_RANGE 0x30 +#define HCI_ERROR_CODE_RESERVED2 0x31 +#define HCI_ERROR_CODE_ROLE_SWITCH_PENDING 0x32 +#define HCI_ERROR_CODE_RESERVED3 0x33 +#define HCI_ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34 +#define HCI_ERROR_CODE_ROLE_SWITCH_FAILED 0x35 +#define HCI_ERROR_CODE_EXTENDED_INQUIRY_RESP_TOO_LARGE 0x36 +#define HCI_ERROR_CODE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37 +#define HCI_ERROR_CODE_HOST_BUSY_PAIRING 0x38 +#define HCI_ERROR_CODE_CONN_REJ_NO_SUITABLE_CHAN_FOUND 0x39 +#define HCI_ERROR_CODE_CONTROLLER_BUSY 0x3A +#define HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL 0x3B +#define HCI_ERROR_CODE_DIRECTED_ADV_TIMEOUT 0x3C +#define HCI_ERROR_CODE_CONN_TERM_MIC_FAILURE 0x3D +#define HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH 0x3E +#define HCI_ERROR_CODE_MAC_CONN_FAILED 0x3F + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags +#define FIRST_PKT_HOST_TO_CTRL LL_DATA_FIRST_PKT_HOST_TO_CTRL +#define CONTINUING_PKT LL_DATA_CONTINUATION_PKT +#define FIRST_PKT_CTRL_TO_HOST LL_DATA_FIRST_PKT_CTRL_TO_HOST + +// Receive Data Packet +#define HCI_RSSI_NOT_AVAILABLE LL_RSSI_NOT_AVAILABLE + +// Disconnect Reasons +#define HCI_DISCONNECT_AUTH_FAILURE HCI_ERROR_CODE_AUTH_FAILURE +#define HCI_DISCONNECT_REMOTE_USER_TERM HCI_ERROR_CODE_REMOTE_USER_TERM_CONN +#define HCI_DISCONNECT_REMOTE_DEV_LOW_RESOURCES HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES +#define HCI_DISCONNECT_REMOTE_DEV_POWER_OFF HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF +#define HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE +#define HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED +#define HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL + +// Tx Power Types +#define HCI_READ_CURRENT_TX_POWER_LEVEL LL_READ_CURRENT_TX_POWER_LEVEL +#define HCI_READ_MAX_TX_POWER_LEVEL LL_READ_MAX_TX_POWER_LEVEL + +// Host Flow Control +#define HCI_CTRL_TO_HOST_FLOW_CTRL_OFF 0 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF 1 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON 2 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON 3 + +// Device Address Type +#define HCI_PUBLIC_DEVICE_ADDRESS LL_DEV_ADDR_TYPE_PUBLIC +#define HCI_RANDOM_DEVICE_ADDRESS LL_DEV_ADDR_TYPE_RANDOM + +// Advertiser Events +#define HCI_CONNECTABLE_UNDIRECTED_ADV LL_ADV_CONNECTABLE_UNDIRECTED_EVT +#define HCI_CONNECTABLE_DIRECTED_ADV LL_ADV_CONNECTABLE_DIRECTED_EVT +#define HCI_SCANNABLE_UNDIRECTED LL_ADV_SCANNABLE_UNDIRECTED_EVT +#define HCI_NONCONNECTABLE_UNDIRECTED_ADV LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT + +// Advertiser Channels +#define HCI_ADV_CHAN_37 LL_ADV_CHAN_37 +#define HCI_ADV_CHAN_38 LL_ADV_CHAN_38 +#define HCI_ADV_CHAN_39 LL_ADV_CHAN_39 +#define HCI_ADV_CHAN_ALL (LL_ADV_CHAN_37 | LL_ADV_CHAN_38 | LL_ADV_CHAN_39) + +// Advertiser White List Policy +#define HCI_ADV_WL_POLICY_ANY_REQ LL_ADV_WL_POLICY_ANY_REQ +#define HCI_ADV_WL_POLICY_WL_SCAN_REQ LL_ADV_WL_POLICY_WL_SCAN_REQ +#define HCI_ADV_WL_POLICY_WL_CONNECT_REQ LL_ADV_WL_POLICY_WL_CONNECT_REQ +#define HCI_ADV_WL_POLICY_WL_ALL_REQ LL_ADV_WL_POLICY_WL_ALL_REQ + +// Advertiser Commands +#define HCI_ENABLE_ADV LL_ADV_MODE_ON +#define HCI_DISABLE_ADV LL_ADV_MODE_OFF + +// Scan Types +#define HCI_SCAN_PASSIVE LL_SCAN_PASSIVE +#define HCI_SCAN_ACTIVE LL_SCAN_ACTIVE + +// Scan White List Policy +#define HCI_SCAN_WL_POLICY_ANY_ADV_PKTS LL_SCAN_WL_POLICY_ANY_ADV_PKTS +#define HCI_SCAN_WL_POLICY_USE_WHITE_LIST LL_SCAN_WL_POLICY_USE_WHITE_LIST + +// Scan Filtering +#define HCI_FILTER_REPORTS_DISABLE LL_FILTER_REPORTS_DISABLE +#define HCI_FILTER_REPORTS_ENABLE LL_FILTER_REPORTS_ENABLE + +// Scan Commands +#define HCI_SCAN_STOP LL_SCAN_STOP +#define HCI_SCAN_START LL_SCAN_START + +// Initiator White List Policy +#define HCI_INIT_WL_POLICY_USE_PEER_ADDR LL_INIT_WL_POLICY_USE_PEER_ADDR +#define HCI_INIT_WL_POLICY_USE_WHITE_LIST LL_INIT_WL_POLICY_USE_WHITE_LIST + +// Encryption Related +#define HCI_ENCRYPTION_OFF LL_ENCRYPTION_OFF +#define HCI_ENCRYPTION_ON LL_ENCRYPTION_ON + +// Direct Test Mode +#define HCI_DTM_NUMBER_RF_CHANS LL_DIRECT_TEST_NUM_RF_CHANS +#define HCI_DIRECT_TEST_MAX_PAYLOAD_LEN LL_DIRECT_TEST_MAX_PAYLOAD_LEN +// +#define HCI_DIRECT_TEST_PAYLOAD_PRBS9 LL_DIRECT_TEST_PAYLOAD_PRBS9 +#define HCI_DIRECT_TEST_PAYLOAD_0x0F LL_DIRECT_TEST_PAYLOAD_0x0F +#define HCI_DIRECT_TEST_PAYLOAD_0x55 LL_DIRECT_TEST_PAYLOAD_0x55 +#define HCI_DIRECT_TEST_PAYLOAD_PRBS15 LL_DIRECT_TEST_PAYLOAD_PRBS15 +#define HCI_DIRECT_TEST_PAYLOAD_0xFF LL_DIRECT_TEST_PAYLOAD_0xFF +#define HCI_DIRECT_TEST_PAYLOAD_0x00 LL_DIRECT_TEST_PAYLOAD_0x00 +#define HCI_DIRECT_TEST_PAYLOAD_0xF0 LL_DIRECT_TEST_PAYLOAD_0xF0 +#define HCI_DIRECT_TEST_PAYLOAD_0xAA LL_DIRECT_TEST_PAYLOAD_0xAA + +// Vendor Specific +#define HCI_EXT_RX_GAIN_STD LL_EXT_RX_GAIN_STD +#define HCI_EXT_RX_GAIN_HIGH LL_EXT_RX_GAIN_HIGH +// +#define HCI_EXT_TX_POWER_MINUS_23_DBM LL_EXT_TX_POWER_MINUS_23_DBM +#define HCI_EXT_TX_POWER_MINUS_6_DBM LL_EXT_TX_POWER_MINUS_6_DBM +#define HCI_EXT_TX_POWER_0_DBM LL_EXT_TX_POWER_0_DBM +#define HCI_EXT_TX_POWER_4_DBM LL_EXT_TX_POWER_4_DBM +// +#define HCI_EXT_ENABLE_ONE_PKT_PER_EVT LL_EXT_ENABLE_ONE_PKT_PER_EVT +#define HCI_EXT_DISABLE_ONE_PKT_PER_EVT LL_EXT_DISABLE_ONE_PKT_PER_EVT +// +#define HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT +#define HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT +// +#define HCI_EXT_NV_IN_USE LL_EXT_NV_IN_USE +#define HCI_EXT_NV_NOT_IN_USE LL_EXT_NV_NOT_IN_USE +// +#define HCI_EXT_ENABLE_FAST_TX_RESP_TIME LL_EXT_ENABLE_FAST_TX_RESP_TIME +#define HCI_EXT_DISABLE_FAST_TX_RESP_TIME LL_EXT_DISABLE_FAST_TX_RESP_TIME +// +#define HCI_EXT_TX_MODULATED_CARRIER LL_EXT_TX_MODULATED_CARRIER +#define HCI_EXT_TX_UNMODULATED_CARRIER LL_EXT_TX_UNMODULATED_CARRIER +// +#define HCI_PTM_SET_FREQ_TUNE_DOWN LL_EXT_SET_FREQ_TUNE_DOWN +#define HCI_PTM_SET_FREQ_TUNE_UP LL_EXT_SET_FREQ_TUNE_UP +// +#define HCI_EXT_PM_IO_PORT_P0 LL_EXT_PM_IO_PORT_P0 +#define HCI_EXT_PM_IO_PORT_P1 LL_EXT_PM_IO_PORT_P1 +#define HCI_EXT_PM_IO_PORT_P2 LL_EXT_PM_IO_PORT_P2 +#define HCI_EXT_PM_IO_PORT_NONE LL_EXT_PM_IO_PORT_NONE +// +#define HCI_EXT_PM_IO_PORT_PIN0 LL_EXT_PM_IO_PORT_PIN0 +#define HCI_EXT_PM_IO_PORT_PIN1 LL_EXT_PM_IO_PORT_PIN1 +#define HCI_EXT_PM_IO_PORT_PIN2 LL_EXT_PM_IO_PORT_PIN2 +#define HCI_EXT_PM_IO_PORT_PIN3 LL_EXT_PM_IO_PORT_PIN3 +#define HCI_EXT_PM_IO_PORT_PIN4 LL_EXT_PM_IO_PORT_PIN4 +#define HCI_EXT_PM_IO_PORT_PIN5 LL_EXT_PM_IO_PORT_PIN5 +#define HCI_EXT_PM_IO_PORT_PIN6 LL_EXT_PM_IO_PORT_PIN6 +#define HCI_EXT_PM_IO_PORT_PIN7 LL_EXT_PM_IO_PORT_PIN7 +// +#define HCI_EXT_PER_RESET LL_EXT_PER_RESET +#define HCI_EXT_PER_READ LL_EXT_PER_READ +// +#define HCI_EXT_HALT_DURING_RF_DISABLE LL_EXT_HALT_DURING_RF_DISABLE +#define HCI_EXT_HALT_DURING_RF_ENABLE LL_EXT_HALT_DURING_RF_ENABLE + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow +#define HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW 0 +#define HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW 1 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[B_ADDR_LEN]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[B_ADDR_LEN]; // device address + uint8 dataLen; // length of report data + uint8 rspData[B_MAX_ADV_LEN]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[B_RANDOM_NUM_SIZE]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/* +** HCI API +*/ + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn HCI_LE_SetScanParamCmd API + * + * @brief This LE API is used to set the Scan parameters. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param scanType - HCI_SCAN_PASSIVE, HCI_SCAN_ACTIVE + * @param scanInterval - Time between scan events. + * @param scanWindow - Time of scan before scan event ends. + * Note: When the scanWindow equals the scanInterval + * then scanning is continuous. + * @param ownAddrType - This device's address. + * @param filterPolicy - HCI_SCAN_PASSIVE, HCI_SCAN_ACTIVE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanParamCmd( uint8 scanType, + uint16 scanInterval, + uint16 scanWindow, + uint8 ownAddrType, + uint8 filterPolicy ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn HCI_LE_SetScanEnableCmd API + * + * @brief This LE API is used to turn Scanning on or off. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent, + * AdvReportEvent + * + * input parameters + * + * @param scanEnable - HCI_SCAN_START, HCI_SCAN_STOP + * @param filterDuplicates - HCI_FILTER_REPORTS_ENABLE, + * HCI_FILTER_REPORTS_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanEnableCmd( uint8 scanEnable, + uint8 filterDuplicates ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); +#endif // CTRL_CONFIG=INIT_CFG + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=INIT_CFG + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandStatusEvent or + * HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_H */ diff --git a/Firmware/Radio/Components/ble/include/l2cap.h b/Firmware/Radio/Components/ble/include/l2cap.h new file mode 100644 index 0000000..996cfae --- /dev/null +++ b/Firmware/Radio/Components/ble/include/l2cap.h @@ -0,0 +1,407 @@ +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef L2CAP_H +#define L2CAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) +#define L2CAP_MTU_SIZE 23 + +// Minimum supported information payload for the Control frame (C-frame) +#define L2CAP_SIG_MTU_SIZE 23 + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) +#define L2CAP_HDR_SIZE 4 + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). +#define L2CAP_PDU_SIZE ( L2CAP_HDR_SIZE + L2CAP_MTU_SIZE ) + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. +#define L2CAP_CID_NULL 0x0000 // Illegal Identifier +#define L2CAP_CID_ATT 0x0004 // Attribute Protocol +#define L2CAP_CID_SIG 0x0005 // L2CAP Signaling +#define L2CAP_CID_SMP 0x0006 // Security Management Protocol +#define L2CAP_CID_GENERIC 0x0007 // Generic Fixed Channel + +// L2CAP Dynamic Channel Identifiers +#define L2CAP_BASE_DYNAMIC_CID 0x0040 +#define L2CAP_LAST_DYNAMIC_CID ( BASE_DYNAMIC_CID + L2CAP_NUM_CHANNELS - 1 ) + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel +#define L2CAP_NUM_FIXED_CHANNELS 4 + +// Number of Protocols supported -- for future use +#define L2CAP_NUM_PROTOCOLS 0 + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request +#define L2CAP_NUM_AUX_CHANNELS 3 + +// Number of Dynamic channels: one per each protocol supported on each physical connection +#define L2CAP_NUM_DYNAMIC_CHANNELS ( L2CAP_NUM_PROTOCOLS * MAX_NUM_LL_CONN ) + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels +#define L2CAP_NUM_CHANNELS ( L2CAP_NUM_DYNAMIC_CHANNELS + L2CAP_NUM_AUX_CHANNELS ) + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. +#define L2CAP_RTX_TIMEOUT 30 + +// L2CAP Signaling Codes (type of commands) +#define L2CAP_CMD_REJECT 0x01 +#define L2CAP_ECHO_REQ 0x08 // No longer supported +#define L2CAP_ECHO_RSP 0x09 // No longer supported +#define L2CAP_INFO_REQ 0x0a // No longer supported +#define L2CAP_INFO_RSP 0x0b // No longer supported +#define L2CAP_PARAM_UPDATE_REQ 0x12 +#define L2CAP_PARAM_UPDATE_RSP 0x13 + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood +#define L2CAP_REJECT_CMD_NOT_UNDERSTOOD 0x0000 + + // Signaling MTU exceeded +#define L2CAP_REJECT_SIGNAL_MTU_EXCEED 0x0001 + + // Invalid CID in request +#define L2CAP_REJECT_INVALID_CID 0x0002 + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU +#define L2CAP_INFO_CONNLESS_MTU 0x0001 + + // Extended features supported +#define L2CAP_INFO_EXTENDED_FEATURES 0x0002 + + // Fixed channels supported +#define L2CAP_INFO_FIXED_CHANNELS 0x0003 + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported +#define L2CAP_FIXED_CHANNELS 0x00000080 + + // Length of Extended Features bit mask +#define L2CAP_EXTENDED_FEATURES_SIZE 4 + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported +#define L2CAP_FIXED_CHANNELS_ATT 0x10 + + // Fixed Channel L2CAP Signaling is supported +#define L2CAP_FIXED_CHANNELS_SIG 0x20 + + // Fixed Channel SMP is supported +#define L2CAP_FIXED_CHANNELS_SMP 0x40 + + // Length of Fixed Channels bit mask +#define L2CAP_FIXED_CHANNELS_SIZE 8 + +/********************************************************************* + * Information Response: Result Values + */ + // Success +#define L2CAP_INFO_SUCCESS 0x0000 + + // Not supported +#define L2CAP_INFO_NOT_SUPPORTED 0x0001 + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted +#define L2CAP_CONN_PARAMS_ACCEPTED 0x0000 + + // Connection Parameters rejected +#define L2CAP_CONN_PARAMS_REJECTED 0x0001 + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + #define maxSignalMTU reasonData.signalMTU + #define invalidLocalCID reasonData.invalidCID.localCID + #define invalidRemoteCID reasonData.invalidCID.remoteCID +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[L2CAP_FIXED_CHANNELS_SIZE]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* L2CAP_H */ diff --git a/Firmware/Radio/Components/ble/include/sm.h b/Firmware/Radio/Components/ble/include/sm.h new file mode 100644 index 0000000..5d6779b --- /dev/null +++ b/Firmware/Radio/Components/ble/include/sm.h @@ -0,0 +1,381 @@ +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef SM_H +#define SM_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ +#define DISPLAY_ONLY 0x00 //!< Display Only Device +#define DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End SM_IO_CAP_DEFINES */ + +#define SM_AUTH_MITM_MASK(a) (((a) & 0x04) >> 2) + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ +#define SM_PASSKEY_TYPE_INPUT 0x01 //!< Input the passkey +#define SM_PASSKEY_TYPE_DISPLAY 0x02 //!< Display the passkey +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ +#define SM_AUTH_REQ_NO_BONDING 0x00 //!< No bonding +#define SM_AUTH_REQ_BONDING 0x01 //!< Bonding +/** @} End SM_BONDING_FLAGS_DEFINES */ + +#define PASSKEY_LEN 6 //! Passkey Character Length (ASCII Characters) + +#define SM_AUTH_STATE_AUTHENTICATED 0x04 //! Authenticate requested +#define SM_AUTH_STATE_BONDING 0x01 //! Bonding requested + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[KEYLEN]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[KEYLEN]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[KEYLEN]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[B_RANDOM_NUM_SIZE]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[KEYLEN]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[B_ADDR_LEN]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[KEYLEN]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* SM_H */ diff --git a/Firmware/Radio/Components/hal/common/hal_assert.c b/Firmware/Radio/Components/hal/common/hal_assert.c new file mode 100644 index 0000000..4aace00 --- /dev/null +++ b/Firmware/Radio/Components/hal/common/hal_assert.c @@ -0,0 +1,308 @@ +/************************************************************************************************** + Filename: hal_assert.c + Revised: $Date: 2010-11-22 08:13:43 -0800 (Mon, 22 Nov 2010) $ + Revision: $Revision: 24480 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_types.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) || (defined HAL_MCU_CC2530) || \ + (defined HAL_MCU_CC2533) || (defined HAL_MCU_MSP430) + /* for access to debug data */ +#include "mac_rx.h" +#include "mac_tx.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Local Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHazardLights(void); + + +/************************************************************************************************** + * @fn halAssertHandler + * + * @brief Logic to handle an assert. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHandler(void) +{ + /* execute code that handles asserts */ +#ifdef ASSERT_RESET + HAL_SYSTEM_RESET(); +#elif !defined ASSERT_WHILE + halAssertHazardLights(); +#else + while(1); +#endif +} + +#if !defined ASSERT_WHILE +/************************************************************************************************** + * @fn halAssertHazardLights + * + * @brief Blink LEDs to indicate an error. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHazardLights(void) +{ + enum + { + DEBUG_DATA_RSTACK_HIGH_OFS, + DEBUG_DATA_RSTACK_LOW_OFS, + DEBUG_DATA_TX_ACTIVE_OFS, + DEBUG_DATA_RX_ACTIVE_OFS, + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) + DEBUG_DATA_INT_MASK_OFS, +#elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) + DEBUG_DATA_INT_MASK0_OFS, + DEBUG_DATA_INT_MASK1_OFS, +#endif + + DEBUG_DATA_SIZE + }; + + uint8 buttonHeld; + uint8 debugData[DEBUG_DATA_SIZE]; + + /* disable all interrupts before anything else */ + HAL_DISABLE_INTERRUPTS(); + + /*------------------------------------------------------------------------------- + * Initialize LEDs and turn them off. + */ + HAL_BOARD_INIT(); + + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /*------------------------------------------------------------------------------- + * Master infinite loop. + */ + for (;;) + { + buttonHeld = 0; + + /*------------------------------------------------------------------------------- + * "Hazard lights" loop. A held keypress will exit this loop. + */ + do + { + HAL_LED_BLINK_DELAY(); + + /* toggle LEDS, the #ifdefs are in case HAL has logically remapped non-existent LEDs */ +#if (HAL_NUM_LEDS >= 1) + HAL_TOGGLE_LED1(); +#if (HAL_NUM_LEDS >= 2) + HAL_TOGGLE_LED2(); +#if (HAL_NUM_LEDS >= 3) + HAL_TOGGLE_LED3(); +#if (HAL_NUM_LEDS >= 4) + HAL_TOGGLE_LED4(); +#endif +#endif +#endif +#endif + + /* escape hatch to continue execution, set escape to '1' to continue execution */ + { + static uint8 escape = 0; + if (escape) + { + escape = 0; + return; + } + } + + /* break out of loop if button is held long enough */ + if (HAL_PUSH_BUTTON1()) + { + buttonHeld++; + } + else + { + buttonHeld = 0; + } + } + while (buttonHeld != 10); /* loop until button is held specified number of loops */ + + /*------------------------------------------------------------------------------- + * Just exited from "hazard lights" loop. + */ + + /* turn off all LEDs */ + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /* wait for button release */ + HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); + + /*------------------------------------------------------------------------------- + * Load debug data into memory. + */ +#ifdef HAL_MCU_AVR + { + uint8 * pStack; + pStack = (uint8 *) SP; + pStack++; /* point to return address on stack */ + debugData[DEBUG_DATA_RSTACK_HIGH_OFS] = *pStack; + pStack++; + debugData[DEBUG_DATA_RSTACK_LOW_OFS] = *pStack; + } + debugData[DEBUG_DATA_INT_MASK_OFS] = EIMSK; +#endif + +#if (defined HAL_MCU_CC2430) + debugData[DEBUG_DATA_INT_MASK_OFS] = RFIM; +#elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) + debugData[DEBUG_DATA_INT_MASK0_OFS] = RFIRQM0; + debugData[DEBUG_DATA_INT_MASK1_OFS] = RFIRQM1; +#endif + + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) || (defined HAL_MCU_CC2530) || \ + (defined HAL_MCU_CC2533) || (defined HAL_MCU_MSP430) + debugData[DEBUG_DATA_TX_ACTIVE_OFS] = macTxActive; + debugData[DEBUG_DATA_RX_ACTIVE_OFS] = macRxActive; +#endif + + /* initialize for data dump loop */ + { + uint8 iBit; + uint8 iByte; + + iBit = 0; + iByte = 0; + + /*------------------------------------------------------------------------------- + * Data dump loop. A button press cycles data bits to an LED. + */ + while (iByte < DEBUG_DATA_SIZE) + { + /* wait for key press */ + while(!HAL_PUSH_BUTTON1()); + + /* turn on all LEDs for first bit of byte, turn on three LEDs if not first bit */ + HAL_TURN_ON_LED1(); + HAL_TURN_ON_LED2(); + HAL_TURN_ON_LED3(); + if (iBit == 0) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + + /* wait for debounced key release */ + HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); + + /* turn off all LEDs */ + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /* output value of data bit to LED1 */ + if (debugData[iByte] & (1 << (7 - iBit))) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + + /* advance to next bit */ + iBit++; + if (iBit == 8) + { + iBit = 0; + iByte++; + } + } + } + + /* + * About to enter "hazard lights" loop again. Turn off LED1 in case the last bit + * displayed happened to be one. This guarantees all LEDs are off at the start of + * the flashing loop which uses a toggle operation to change LED states. + */ + HAL_TURN_OFF_LED1(); + } +} +#endif + +/* ------------------------------------------------------------------------------------------------ + * Compile Time Assertions + * ------------------------------------------------------------------------------------------------ + */ + +/* integrity check of type sizes */ +HAL_ASSERT_SIZE( int8, 1); +HAL_ASSERT_SIZE( uint8, 1); +HAL_ASSERT_SIZE( int16, 2); +HAL_ASSERT_SIZE(uint16, 2); +HAL_ASSERT_SIZE( int32, 4); +HAL_ASSERT_SIZE(uint32, 4); + + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/common/hal_drivers.c b/Firmware/Radio/Components/hal/common/hal_drivers.c new file mode 100644 index 0000000..458be77 --- /dev/null +++ b/Firmware/Radio/Components/hal/common/hal_drivers.c @@ -0,0 +1,283 @@ +/************************************************************************************************** + Filename: hal_drivers.c + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Drivers Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#if (defined HAL_AES) && (HAL_AES == TRUE) +#include "hal_aes.h" +#endif +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) +#include "hal_buzzer.h" +#endif +#if (defined HAL_DMA) && (HAL_DMA == TRUE) +#include "hal_dma.h" +#endif +#include "hal_drivers.h" +#include "hal_key.h" +#include "hal_lcd.h" +#include "hal_led.h" +#include "hal_sleep.h" +#include "hal_timer.h" +#include "hal_types.h" +#include "hal_uart.h" +#ifdef CC2591_COMPRESSION_WORKAROUND +#include "mac_rx.h" +#endif +#include "OSAL.h" +#if defined POWER_SAVING +#include "OSAL_PwrMgr.h" +#endif +#if (defined HAL_HID) && (HAL_HID == TRUE) +#include "usb_hid.h" +#endif + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +uint8 Hal_TaskID; + +extern void HalLedUpdate( void ); /* Notes: This for internal only so it shouldn't be in hal_led.h */ + +/************************************************************************************************** + * @fn Hal_Init + * + * @brief Hal Initialization function. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_Init( uint8 task_id ) +{ + /* Register task ID */ + Hal_TaskID = task_id; + +#ifdef CC2591_COMPRESSION_WORKAROUND + osal_start_reload_timer( Hal_TaskID, PERIOD_RSSI_RESET_EVT, PERIOD_RSSI_RESET_TIMEOUT ); +#endif +} + +/************************************************************************************************** + * @fn Hal_DriverInit + * + * @brief Initialize HW - These need to be initialized before anyone. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void HalDriverInit (void) +{ + /* TIMER */ +#if (defined HAL_TIMER) && (HAL_TIMER == TRUE) +#endif + + /* ADC */ +#if (defined HAL_ADC) && (HAL_ADC == TRUE) + HalAdcInit(); +#endif + + /* DMA */ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + // Must be called before the init call to any module that uses DMA. + HalDmaInit(); +#endif + + /* AES */ +#if (defined HAL_AES) && (HAL_AES == TRUE) + HalAesInit(); +#endif + + /* LCD */ +#if (defined HAL_LCD) && (HAL_LCD == TRUE) + HalLcdInit(); +#endif + + /* LED */ +#if (defined HAL_LED) && (HAL_LED == TRUE) + HalLedInit(); +#endif + + /* UART */ +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTInit(); +#endif + + /* KEY */ +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + HalKeyInit(); +#endif + + /* HID */ +#if (defined HAL_HID) && (HAL_HID == TRUE) + usbHidInit(); +#endif +} + +/************************************************************************************************** + * @fn Hal_ProcessEvent + * + * @brief Hal Process Event + * + * @param task_id - Hal TaskId + * events - events + * + * @return None + **************************************************************************************************/ +uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) +{ + uint8 *msgPtr; + + (void)task_id; // Intentionally unreferenced parameter + + if ( events & SYS_EVENT_MSG ) + { + msgPtr = osal_msg_receive(Hal_TaskID); + + while (msgPtr) + { + /* Do something here - for now, just deallocate the msg and move on */ + + /* De-allocate */ + osal_msg_deallocate( msgPtr ); + /* Next */ + msgPtr = osal_msg_receive( Hal_TaskID ); + } + return events ^ SYS_EVENT_MSG; + } + +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) + if (events & HAL_BUZZER_EVENT) + { + HalBuzzerStop(); + return events ^ HAL_BUZZER_EVENT; + } +#endif + +#ifdef CC2591_COMPRESSION_WORKAROUND + if ( events & PERIOD_RSSI_RESET_EVT ) + { + macRxResetRssi(); + return (events ^ PERIOD_RSSI_RESET_EVT); + } +#endif + + if ( events & HAL_LED_BLINK_EVENT ) + { +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + HalLedUpdate(); +#endif /* BLINK_LEDS && HAL_LED */ + return events ^ HAL_LED_BLINK_EVENT; + } + + if (events & HAL_KEY_EVENT) + { +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + /* Check for keys */ + HalKeyPoll(); + + /* if interrupt disabled, do next polling */ + if (!Hal_KeyIntEnable) + { + osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); + } +#endif + return events ^ HAL_KEY_EVENT; + } + +#if defined POWER_SAVING + if ( events & HAL_SLEEP_TIMER_EVENT ) + { + halRestoreSleepLevel(); + return events ^ HAL_SLEEP_TIMER_EVENT; + } + + if ( events & HAL_PWRMGR_HOLD_EVENT ) + { + (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_HOLD); + + (void)osal_stop_timerEx(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + (void)osal_clear_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + + return (events & ~(HAL_PWRMGR_HOLD_EVENT | HAL_PWRMGR_CONSERVE_EVENT)); + } + + if ( events & HAL_PWRMGR_CONSERVE_EVENT ) + { + (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_CONSERVE); + return events ^ HAL_PWRMGR_CONSERVE_EVENT; + } +#endif + + return 0; +} + +/************************************************************************************************** + * @fn Hal_ProcessPoll + * + * @brief This routine will be called by OSAL to poll UART, TIMER... + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_ProcessPoll () +{ + /* UART Poll */ +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTPoll(); +#endif + + /* HID poll */ +#if (defined HAL_HID) && (HAL_HID == TRUE) + usbHidProcessEvents(); +#endif + +#if defined( POWER_SAVING ) + /* Allow sleep before the next OSAL event loop */ + ALLOW_SLEEP_MODE(); +#endif +} + +/************************************************************************************************** +**************************************************************************************************/ + diff --git a/Firmware/Radio/Components/hal/include/hal_adc.h b/Firmware/Radio/Components/hal/include/hal_adc.h new file mode 100644 index 0000000..13a22c7 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_adc.h @@ -0,0 +1,142 @@ +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2010-02-25 15:22:29 -0800 (Thu, 25 Feb 2010) $ + Revision: $Revision: 21800 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_ADC_H +#define HAL_ADC_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ +#define HAL_ADC_RESOLUTION_8 0x01 +#define HAL_ADC_RESOLUTION_10 0x02 +#define HAL_ADC_RESOLUTION_12 0x03 +#define HAL_ADC_RESOLUTION_14 0x04 + +/* Channels */ +#define HAL_ADC_CHANNEL_0 0x00 +#define HAL_ADC_CHANNEL_1 0x01 +#define HAL_ADC_CHANNEL_2 0x02 +#define HAL_ADC_CHANNEL_3 0x03 +#define HAL_ADC_CHANNEL_4 0x04 +#define HAL_ADC_CHANNEL_5 0x05 +#define HAL_ADC_CHANNEL_6 0x06 +#define HAL_ADC_CHANNEL_7 0x07 + +#define HAL_ADC_CHN_AIN0 0x00 /* AIN0 */ +#define HAL_ADC_CHN_AIN1 0x01 /* AIN1 */ +#define HAL_ADC_CHN_AIN2 0x02 /* AIN2 */ +#define HAL_ADC_CHN_AIN3 0x03 /* AIN3 */ +#define HAL_ADC_CHN_AIN4 0x04 /* AIN4 */ +#define HAL_ADC_CHN_AIN5 0x05 /* AIN5 */ +#define HAL_ADC_CHN_AIN6 0x06 /* AIN6 */ +#define HAL_ADC_CHN_AIN7 0x07 /* AIN7 */ +#define HAL_ADC_CHN_A0A1 0x08 /* AIN0,AIN1 */ +#define HAL_ADC_CHN_A2A3 0x09 /* AIN2,AIN3 */ +#define HAL_ADC_CHN_A4A5 0x0a /* AIN4,AIN5 */ +#define HAL_ADC_CHN_A6A7 0x0b /* AIN6,AIN7 */ +#define HAL_ADC_CHN_GND 0x0c /* GND */ +#define HAL_ADC_CHN_VREF 0x0d /* Positive voltage reference */ +#define HAL_ADC_CHN_TEMP 0x0e /* Temperature sensor */ +#define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */ +#define HAL_ADC_CHN_BITS 0x0f /* Bits [3:0] */ + +#define HAL_ADC_CHANNEL_TEMP HAL_ADC_CHN_TEMP +#define HAL_ADC_CHANNEL_VDD HAL_ADC_CHN_VDD3 /* channel VDD divided by 3 */ + +/* Vdd Limits */ +#define HAL_ADC_VDD_LIMIT_0 0x00 +#define HAL_ADC_VDD_LIMIT_1 0x01 +#define HAL_ADC_VDD_LIMIT_2 0x02 +#define HAL_ADC_VDD_LIMIT_3 0x03 +#define HAL_ADC_VDD_LIMIT_4 0x04 +#define HAL_ADC_VDD_LIMIT_5 0x05 +#define HAL_ADC_VDD_LIMIT_6 0x06 +#define HAL_ADC_VDD_LIMIT_7 0x07 + +/* Reference Voltages */ +#define HAL_ADC_REF_125V 0x00 /* Internal Reference (1.25V-CC2430)(1.15V-CC2530) */ +#define HAL_ADC_REF_AIN7 0x40 /* AIN7 Reference */ +#define HAL_ADC_REF_AVDD 0x80 /* AVDD_SOC Pin Reference */ +#define HAL_ADC_REF_DIFF 0xc0 /* AIN7,AIN6 Differential Reference */ +#define HAL_ADC_REF_BITS 0xc0 /* Bits [7:6] */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_assert.h b/Firmware/Radio/Components/hal/include/hal_assert.h new file mode 100644 index 0000000..ddfb126 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_assert.h @@ -0,0 +1,110 @@ +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_ASSERT_H +#define HAL_ASSERT_H + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#ifdef HALNODEBUG +#define HAL_ASSERT(expr) +#define HAL_ASSERT_FORCED() +#define HAL_ASSERT_STATEMENT(statement) +#define HAL_ASSERT_DECLARATION(declaration) +#else +#define HAL_ASSERT(expr) st( if (!( expr )) halAssertHandler(); ) +#define HAL_ASSERT_FORCED() halAssertHandler() +#define HAL_ASSERT_STATEMENT(statement) st( statement ) +#define HAL_ASSERT_DECLARATION(declaration) declaration +#endif + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ +#define HAL_ASSERT_SIZE(x,y) typedef char x ## _assert_size_t[-1+10*(sizeof(x) == (y))] + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_board.h b/Firmware/Radio/Components/hal/include/hal_board.h new file mode 100644 index 0000000..506e100 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_board.h @@ -0,0 +1 @@ +#include "hal_board_cfg.h" diff --git a/Firmware/Radio/Components/hal/include/hal_defs.h b/Firmware/Radio/Components/hal/include/hal_defs.h new file mode 100644 index 0000000..6a3119d --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_defs.h @@ -0,0 +1,130 @@ +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DEFS_H +#define HAL_DEFS_H + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#ifndef BV +#define BV(n) (1 << (n)) +#endif + +#ifndef BF +#define BF(x,b,s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ +#define BREAK_UINT32( var, ByteNum ) \ + (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF)) + +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \ + ((uint32)((uint32)((Byte0) & 0x00FF) \ + + ((uint32)((Byte1) & 0x00FF) << 8) \ + + ((uint32)((Byte2) & 0x00FF) << 16) \ + + ((uint32)((Byte3) & 0x00FF) << 24))) + +#define BUILD_UINT16(loByte, hiByte) \ + ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +#define HI_UINT16(a) (((a) >> 8) & 0xFF) +#define LO_UINT16(a) ((a) & 0xFF) + +#define BUILD_UINT8(hiByte, loByte) \ + ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4))) + +#define HI_UINT8(a) (((a) >> 4) & 0x0F) +#define LO_UINT8(a) ((a) & 0x0F) + +#ifndef GET_BIT +#define GET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] & BV((IDX) % 8)) ? TRUE : FALSE) +#endif +#ifndef SET_BIT +#define SET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] |= BV((IDX) % 8))) +#endif +#ifndef CLR_BIT +#define CLR_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] &= (BV((IDX) % 8) ^ 0xFF))) +#endif + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ +#define st(x) do { x } while (__LINE__ == -1) + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_drivers.h b/Firmware/Radio/Components/hal/include/hal_drivers.h new file mode 100644 index 0000000..847a12d --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_drivers.h @@ -0,0 +1,105 @@ +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_DRIVER_H +#define HAL_DRIVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +#define HAL_BUZZER_EVENT 0x0080 +#define PERIOD_RSSI_RESET_EVT 0x0040 +#define HAL_LED_BLINK_EVENT 0x0020 +#define HAL_KEY_EVENT 0x0010 + +#if defined POWER_SAVING +#define HAL_SLEEP_TIMER_EVENT 0x0004 +#define HAL_PWRMGR_HOLD_EVENT 0x0002 +#define HAL_PWRMGR_CONSERVE_EVENT 0x0001 +#endif + +#define HAL_PWRMGR_CONSERVE_DELAY 10 +#define PERIOD_RSSI_RESET_TIMEOUT 10 + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + +#ifdef __cplusplus +} +#endif + +#endif + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Components/hal/include/hal_flash.h b/Firmware/Radio/Components/hal/include/hal_flash.h new file mode 100644 index 0000000..f08c739 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_flash.h @@ -0,0 +1,122 @@ +/************************************************************************************************** + Filename: hal_flash.h + Revised: $Date:$ + Revision: $Revision:$ + + Description: This file contains the interface to the Flash Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_FLASH_H +#define HAL_FLASH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128). + * @param offset - Valid offset into the page (so < HAL_NV_PAGE_SIZE and byte-aligned is ok). + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to read: a read cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to write: a write cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases 'cnt' pages of the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128) to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg); + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/include/hal_key.h b/Firmware/Radio/Components/hal/include/hal_key.h new file mode 100644 index 0000000..6ba1b61 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_key.h @@ -0,0 +1,152 @@ +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_KEY_H +#define HAL_KEY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ +#define HAL_KEY_INTERRUPT_DISABLE 0x00 +#define HAL_KEY_INTERRUPT_ENABLE 0x01 + +/* Key state - shift or nornal */ +#define HAL_KEY_STATE_NORMAL 0x00 +#define HAL_KEY_STATE_SHIFT 0x01 + +#define HAL_KEY_SW_1 0x01 // Joystick up +#define HAL_KEY_SW_2 0x02 // Joystick right +#define HAL_KEY_SW_5 0x04 // Joystick center +#define HAL_KEY_SW_4 0x08 // Joystick left +#define HAL_KEY_SW_3 0x10 // Joystick down + +#define HAL_KEY_SW_6 0x20 // Button S1 if available +#define HAL_KEY_SW_7 0x40 // Button S2 if available + +/* Joystick */ +#define HAL_KEY_UP 0x01 // Joystick up +#define HAL_KEY_RIGHT 0x02 // Joystick right +#define HAL_KEY_CENTER 0x04 // Joystick center +#define HAL_KEY_LEFT 0x08 // Joystick left +#define HAL_KEY_DOWN 0x10 // Joystick down + +/* Buttons */ +#define HAL_PUSH_BUTTON_RIGHT 0x01 // Button right +#define HAL_PUSH_BUTTON_LEFT 0x02 // Button left +#define HAL_PUSH_BUTTON_SELECT 0x04 // Button select +#define HAL_KEY_BUTTON_UP 0x40 // Button up +#define HAL_KEY_BUTTON_DOWN 0x80 // Button down + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_lcd.h b/Firmware/Radio/Components/hal/include/hal_lcd.h new file mode 100644 index 0000000..af3b8b2 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_lcd.h @@ -0,0 +1,135 @@ +/************************************************************************************************** + Filename: hal_lcd.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LCD Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_LCD_H +#define HAL_LCD_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" +#if (defined HAL_LCD) && (HAL_LCD == TRUE) +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* These are used to specify which line the text will be printed */ +#define HAL_LCD_LINE_1 0x01 +#define HAL_LCD_LINE_2 0x02 +/* + This to support LCD with extended number of lines (more than 2). + Don't use these if LCD doesn't support more than 2 lines +*/ +#define HAL_LCD_LINE_3 0x03 +#define HAL_LCD_LINE_4 0x04 +#define HAL_LCD_LINE_5 0x05 +#define HAL_LCD_LINE_6 0x06 +#define HAL_LCD_LINE_7 0x07 +#define HAL_LCD_LINE_8 0x08 + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize LCD Service + */ +extern void HalLcdInit(void); + +/* + * Write a string to the LCD + */ +extern void HalLcdWriteString ( char *str, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteScreen( char *line1, char *line2 ); + +/* + * Write a string followed by a value to the LCD + */ +extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ); + +/* + * Write a string followed by 2 values to the LCD + */ +extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line ); + +/* + * Write a percentage bar to the LCD + */ +extern void HalLcdDisplayPercentBar( char *title, uint8 value ); + + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_led.h b/Firmware/Radio/Components/hal/include/hal_led.h new file mode 100644 index 0000000..bb327f1 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_led.h @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_LED_H +#define HAL_LED_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_board.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ +#define HAL_LED_1 0x01 +#define HAL_LED_2 0x02 +#define HAL_LED_3 0x04 +#define HAL_LED_4 0x08 +#define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4) + +/* Modes */ +#define HAL_LED_MODE_OFF 0x00 +#define HAL_LED_MODE_ON 0x01 +#define HAL_LED_MODE_BLINK 0x02 +#define HAL_LED_MODE_FLASH 0x04 +#define HAL_LED_MODE_TOGGLE 0x08 + +/* Defaults */ +#define HAL_LED_DEFAULT_MAX_LEDS 4 +#define HAL_LED_DEFAULT_DUTY_CYCLE 5 +#define HAL_LED_DEFAULT_FLASH_COUNT 50 +#define HAL_LED_DEFAULT_FLASH_TIME 1000 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_rpc.h b/Firmware/Radio/Components/hal/include/hal_rpc.h new file mode 100644 index 0000000..cf8118e --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_rpc.h @@ -0,0 +1,136 @@ +/************************************************************************************************** + Filename: hal_rpc.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains information required by services that + use the Remote Procedure Call (RPC) standard. + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_RPC_H +#define HAL_RPC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Common +/////////////////////////////////////////////////////////////////////////////////////////////////// + +// RPC Command Field Type +#define RPC_CMD_POLL 0x00 +#define RPC_CMD_SREQ 0x20 +#define RPC_CMD_AREQ 0x40 +#define RPC_CMD_SRSP 0x60 +#define RPC_CMD_RES4 0x80 +#define RPC_CMD_RES5 0xA0 +#define RPC_CMD_RES6 0xC0 +#define RPC_CMD_RES7 0xE0 + +// RPC Command Field Subsystem +#define RPC_SYS_RES0 0 +#define RPC_SYS_SYS 1 +#define RPC_SYS_MAC 2 +#define RPC_SYS_NWK 3 +#define RPC_SYS_AF 4 +#define RPC_SYS_ZDO 5 +#define RPC_SYS_SAPI 6 // Simple API +#define RPC_SYS_UTIL 7 +#define RPC_SYS_DBG 8 +#define RPC_SYS_APP 9 +#define RPC_SYS_RCAF 10 // Remote Control Application Framework +#define RPC_SYS_RCN 11 // Remote Control Network Layer +#define RPC_SYS_RCN_CLIENT 12 // Remote Control Network Layer Client +#define RPC_SYS_BOOT 13 // Serial Bootloader +#define RPC_SYS_MAX 14 // Maximum value, must be last + +/* 1st byte is the length of the data field, 2nd/3rd bytes are command field. */ +#define RPC_FRAME_HDR_SZ 3 + +/* The 3 MSB's of the 1st command field byte are for command type. */ +#define RPC_CMD_TYPE_MASK 0xE0 + +/* The 5 LSB's of the 1st command field byte are for the subsystem. */ +#define RPC_SUBSYSTEM_MASK 0x1F + +/* position of fields in the general format frame */ +#define RPC_POS_LEN 0 +#define RPC_POS_CMD0 1 +#define RPC_POS_CMD1 2 +#define RPC_POS_DAT0 3 + +/* Error codes */ +#define RPC_SUCCESS 0 /* success */ +#define RPC_ERR_SUBSYSTEM 1 /* invalid subsystem */ +#define RPC_ERR_COMMAND_ID 2 /* invalid command ID */ +#define RPC_ERR_PARAMETER 3 /* invalid parameter */ +#define RPC_ERR_LENGTH 4 /* invalid length */ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UART Specific +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#define RPC_UART_FRAME_OVHD 2 + +// Start of frame character value +#define RPC_UART_SOF 0xFE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// SPI Specific +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif /* HAL_RPC_H */ diff --git a/Firmware/Radio/Components/hal/include/hal_sleep.h b/Firmware/Radio/Components/hal/include/hal_sleep.h new file mode 100644 index 0000000..2457acf --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_sleep.h @@ -0,0 +1,84 @@ +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2012-02-28 18:16:46 -0800 (Tue, 28 Feb 2012) $ + Revision: $Revision: 29565 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_SLEEP_H +#define HAL_SLEEP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_timer.h b/Firmware/Radio/Components/hal/include/hal_timer.h new file mode 100644 index 0000000..517b1e6 --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_timer.h @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_timer.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_TIMER_H +#define HAL_TIMER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_board.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + + + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ +/* Timer ID definitions */ +#define HAL_TIMER_0 0x00 // 8bit timer +#define HAL_TIMER_1 0x01 // 16bit Mac timer +#define HAL_TIMER_2 0x02 // 8bit timer +#define HAL_TIMER_3 0x03 // 16bit timer +#define HAL_TIMER_MAX 4 // Max number of timer + +/* Operation Modes for timer */ +#define HAL_TIMER_MODE_NORMAL 0x01 // Normal Mode +#define HAL_TIMER_MODE_CTC 0x02 // Clear Timer On Compare +#define HAL_TIMER_MODE_MASK (HAL_TIMER_MODE_NORMAL | HAL_TIMER_MODE_CTC) + +/* Timer1 channels */ +#define HAL_T1_CH0 0 +#define HAL_T1_CH1 1 +#define HAL_T1_CH2 2 +#define HAL_T1_CH3 3 +#define HAL_T1_CH4 4 + +/* Channel definitions */ +#define HAL_TIMER_CHANNEL_SINGLE 0x01 // Single Channel - default +#define HAL_TIMER_CHANNEL_A 0x02 // Channel A +#define HAL_TIMER_CHANNEL_B 0x04 // Channel B +#define HAL_TIMER_CHANNEL_C 0x08 // Channel C +#define HAL_TIMER_CHANNEL_D 0x10 // Channel D +#define HAL_TIMER_CHANNEL_E 0x20 // Channel E +#define HAL_TIMER_CHANNEL_MASK (HAL_TIMER_CHANNEL_SINGLE | \ + HAL_TIMER_CHANNEL_A | \ + HAL_TIMER_CHANNEL_B | \ + HAL_TIMER_CHANNEL_C | \ + HAL_TIMER_CHANNEL_D | \ + HAL_TIMER_CHANNEL_E) +#define HAL_TIMER_CH_MAX 0x06 + +/* Timer 1 Channel 0 Channel compare mode definitions */ +#define HAL_TIMER1_CH0_CMP_MODE_SET_ON_COMP 0x00 // 000: Set output on compare +#define HAL_TIMER1_CH0_CMP_MODE_CLR_ON_COMP 0x01 // 001: Clear output on compare +#define HAL_TIMER1_CH0_CMP_MODE_TOG_ON_COMP 0x02 // 010: Toggle output on compare +#define HAL_TIMER1_CH0_CMP_MODE_SET_ON_COMP_CLR_ON_0 0x03 // 011: Set output on compare-up, clear on 0 +#define HAL_TIMER1_CH0_CMP_MODE_CLR_ON_COMP_SET_ON_0 0x04 // 100: Clear output on compare-up, set on 0 +#define HAL_TIMER1_CH0_CMP_MODE_INIT 0x07 // 111: Initialize output pin. CMP[2:0] is not changed + +/* Timer 1 Channel 1-5 channel compare mode definitions */ +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_COMP 0x00 // 000: Set output on compare +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_COMP 0x01 // 001: Clear output on compare +#define HAL_TIMER1_CHn_CMP_MODE_TOG_ON_COMP 0x02 // 010: Toggle output on compare +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_COMP_CLR_ON_0 0x03 // 011: Set output on compare-up, clear on compare down in up-down mode. Otherwise set output on + // compare, clear on 0. +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_COMP_SET_ON_0 0x04 // 100: Clear output on compare-up, set on compare down in up-down mode. Otherwise clear output + // on compare, set on 0 +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_CH0_SET_ON_CHn 0x05 // 101: Clear when equal T1CC0, set when equal T1CC2 +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_CH0_CLR_ON_CHn 0x06 // 110: Set when equal T1CC0, clear when equal T1CC2 +#define HAL_TIMER1_CHn_CMP_MODE_INIT 0x07 // 111: Initialize output pin. CMP[2:0] is not changed. +#define HAL_TIMER1_CH_CMP_MODE_BITS 0x38 // bits 5:3 + +/* Timer 1 Capture mode */ +#define HAL_TIMER1_CH_CAP_MODE_NO 0x00 // 00: No capture +#define HAL_TIMER1_CH_CAP_MODE_RISING 0x01 // 01: Capture on rising edge +#define HAL_TIMER1_CH_CAP_MODE_FALLING 0x02 // 10: Capture on falling edge +#define HAL_TIMER1_CH_CAP_MODE_ALL 0x03 // 11: Capture on all edges +#define HAL_TIMER1_CH_CAP_BITS 0x03 // bits 1:0 + +/* Channel mode definitions */ +#define HAL_TIMER_CH_MODE_INPUT_CAPTURE 0x01 // Channel Mode Input-Capture +#define HAL_TIMER_CH_MODE_OUTPUT_COMPARE 0x02 // Channel Mode Output_Compare +#define HAL_TIMER_CH_MODE_OVERFLOW 0x04 // Channel Mode Overflow +#define HAL_TIMER_CH_MODE_MASK (HAL_TIMER_CH_MODE_INPUT_CAPTURE | \ + HAL_TIMER_CH_MODE_OUTPUT_COMPARE | \ + HAL_TIMER_CH_MODE_OVERFLOW) + +/* Error Code */ +#define HAL_TIMER_OK 0x00 +#define HAL_TIMER_NOT_OK 0x01 +#define HAL_TIMER_PARAMS_ERROR 0x02 +#define HAL_TIMER_NOT_CONFIGURED 0x03 +#define HAL_TIMER_INVALID_ID 0x04 +#define HAL_TIMER_INVALID_CH_MODE 0x05 +#define HAL_TIMER_INVALID_OP_MODE 0x06 + +/* Timer clock pre-scaler definitions for 16bit timer1 and timer3 */ +#define HAL_TIMER3_16_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER3_16_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER3_16_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER3_16_TC_DIV64 0x03 // Clock pre-scaled by 64 +#define HAL_TIMER3_16_TC_DIV256 0x04 // Clock pre-scaled by 256 +#define HAL_TIMER3_16_TC_DIV1024 0x05 // Clock pre-scaled by 1024 +#define HAL_TIMER3_16_TC_EXTFE 0x06 // External clock (T2), falling edge +#define HAL_TIMER3_16_TC_EXTRE 0x07 // External clock (T2), rising edge + +/* Timer clock pre-scaler definitions for 8bit timer0 and timer2 */ +#define HAL_TIMER0_8_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER0_8_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER0_8_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER0_8_TC_DIV32 0x03 // Clock pre-scaled by 32 +#define HAL_TIMER0_8_TC_DIV64 0x04 // Clock pre-scaled by 64 +#define HAL_TIMER0_8_TC_DIV128 0x05 // Clock pre-scaled by 128 +#define HAL_TIMER0_8_TC_DIV256 0x06 // Clock pre-scaled by 256 +#define HAL_TIMER0_8_TC_DIV1024 0x07 // Clock pre-scaled by 1024 + +/* Timer clock pre-scaler definitions for 8bit timer2 */ +#define HAL_TIMER2_8_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER2_8_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER2_8_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER2_8_TC_DIV64 0x03 // Clock pre-scaled by 32 +#define HAL_TIMER2_8_TC_DIV256 0x04 // Clock pre-scaled by 64 +#define HAL_TIMER2_8_TC_DIV1024 0x05 // Clock pre-scaled by 128 +#define HAL_TIMER2_8_TC_EXTFE 0x06 // External clock (T2), falling edge +#define HAL_TIMER2_8_TC_EXTRE 0x07 // External clock (T2), rising edge + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +typedef void (*halTimerCBack_t) (uint8 timerId, uint8 channel, uint8 channelMode); + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/* + * Initialize Timer Service + */ +extern void HalTimerInit ( void ); + +/* + * Configure channel in different modes + */ +extern uint8 HalTimerConfig ( uint8 timerId, + uint8 opMode, + uint8 channel, + uint8 channelMode, + bool intEnable, + halTimerCBack_t cback ); + +/* + * Start a Timer + */ +extern uint8 HalTimerStart ( uint8 timerId, uint32 timePerTick ); + +/* + * Stop a Timer + */ +extern uint8 HalTimerStop ( uint8 timerId ); + + +/* + * This is used for polling, provide the tick increment + */ +extern void HalTimerTick ( void ); + +/* + * Enable and disable particular timer + */ +extern uint8 HalTimerInterruptEnable (uint8 timerId, uint8 channelMode, bool enable); + +/* + * Configures timer 1 to control 4 PWM outputs + */ +void HalTimer1Init (halTimerCBack_t cBack); + + +/* + * Set dutycycle on timer 1 PWM output channel + */ +void halTimer1SetChannelDuty (uint8 channel, uint16 promill); + +/*************************************************************************************************** +***************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/include/hal_uart.h b/Firmware/Radio/Components/hal/include/hal_uart.h new file mode 100644 index 0000000..df5184c --- /dev/null +++ b/Firmware/Radio/Components/hal/include/hal_uart.h @@ -0,0 +1,235 @@ +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_UART_H +#define HAL_UART_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_board.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#define HAL_UART_BR_9600 0x00 +#define HAL_UART_BR_19200 0x01 +#define HAL_UART_BR_38400 0x02 +#define HAL_UART_BR_57600 0x03 +#define HAL_UART_BR_115200 0x04 + +/* Frame Format constant */ + +/* Stop Bits */ +#define HAL_UART_ONE_STOP_BIT 0x00 +#define HAL_UART_TWO_STOP_BITS 0x01 + +/* Parity settings */ +#define HAL_UART_NO_PARITY 0x00 +#define HAL_UART_EVEN_PARITY 0x01 +#define HAL_UART_ODD_PARITY 0x02 + +/* Character Size */ +#define HAL_UART_8_BITS_PER_CHAR 0x00 +#define HAL_UART_9_BITS_PER_CHAR 0x01 + +/* Flow control */ +#define HAL_UART_FLOW_OFF 0x00 +#define HAL_UART_FLOW_ON 0x01 + +/* Ports */ +#define HAL_UART_PORT_0 0x00 +#define HAL_UART_PORT_1 0x01 +#define HAL_UART_PORT_MAX 0x02 + +/* UART Status */ +#define HAL_UART_SUCCESS 0x00 +#define HAL_UART_UNCONFIGURED 0x01 +#define HAL_UART_NOT_SUPPORTED 0x02 +#define HAL_UART_MEM_FAIL 0x03 +#define HAL_UART_BAUDRATE_ERROR 0x04 + +/* UART Events */ +#define HAL_UART_RX_FULL 0x01 +#define HAL_UART_RX_ABOUT_FULL 0x02 +#define HAL_UART_RX_TIMEOUT 0x04 +#define HAL_UART_TX_FULL 0x08 +#define HAL_UART_TX_EMPTY 0x10 + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_dma.c b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_dma.c new file mode 100644 index 0000000..2d59793 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_dma.c @@ -0,0 +1,1074 @@ +/************************************************************************************************** + Filename: _hal_uart_dma.c + Revised: $Date: 2012-12-12 13:58:27 -0800 (Wed, 12 Dec 2012) $ + Revision: $Revision: 32579 $ + + Description: This file contains the interface to the H/W UART driver by DMA. + + A known defect is that when flow control is enabled, the function HalUARTPollTxTrigDMA() can + prematurely invoke HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX) and clobber that last byte of one txBuf[] + block transfer with the first byte of the next txBuf[] block transfer. Additionally, Tx can + become permanently stalled during heavy use and/or simultaeous heavy radio traffic when using + DMA for the Tx and hardware flow control. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef UTXxIE +#undef UTXxIF +#if (HAL_UART_DMA == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF +#elif (HAL_UART_DMA == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_SEL +#if (HAL_UART_DMA == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0x0C // Peripheral I/O Select for Rx/Tx. +#elif (HAL_UART_DMA == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0xC0 // Peripheral I/O Select for Rx/Tx. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_DMA == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_DMA == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxDIR +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_DMA == 1) +#define PxDIR P0DIR +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#define DMA_RDYIn P0_4 +#define DMA_RDYOut P0_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_DMA == 2) +#define PxDIR P1DIR +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define DMA_RDYIn P1_4 +#define DMA_RDYOut P1_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#if !defined( DMA_PM ) +#if defined POWER_SAVING +#define DMA_PM 1 +#else +#define DMA_PM 0 +#endif // POWER_SAVING +#endif // !DMA_PM + +// For known defects described above in the moduel description, prefer to drive the Tx by ISR vice +// DMA unless H/W flow control is not used and full-throughput on Tx is absolutely essential. +#if !defined HAL_UART_TX_BY_ISR +#define HAL_UART_TX_BY_ISR 1 +#endif + +// TRUE or FALSE whether or not to flush the Rx queue when an Rx overrun is detected. +// Note that when HAL_UART_RX_FLUSH is set to TRUE, then uartRxBug and its hunt for where the Rx +// DMA is working is absolutely necessary because the flush can leave the dmaCfg.rxHead stranded. +#if !defined HAL_UART_RX_FLUSH +#define HAL_UART_RX_FLUSH TRUE +#endif + +// Minimum delay before allowing sleep and/or clearing DMA ready-out after a DMA ready-in ISR. +// ST-ticks for 6-msecs plus 1 tick added for when the dmaRdyDly is forced from zero to 0xFF. +// If a greater delay than 6-msec is configured, then the logic should be changed to use a uint16. +//efine DMA_PM_DLY 198 // 32768 * 0.006 + 1 -> 198. +// This delay should be set as short as possible to work with the max expected latency in the sender +// between its asserting ready-out and its checking of the ready-in response. The RBA Master +// logic in the internal uart-to-uart bridge app checks for ready-in immediately, +// so this is just set to zero. +#define DMA_PM_DLY 0 + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_DMA_RX_MAX +#define HAL_UART_DMA_RX_MAX 128 +#endif +#if !defined HAL_UART_DMA_TX_MAX +#define HAL_UART_DMA_TX_MAX HAL_UART_DMA_RX_MAX +#endif +#if !defined HAL_UART_DMA_HIGH +#define HAL_UART_DMA_HIGH (HAL_UART_DMA_RX_MAX - 1) +#endif +#if !defined HAL_UART_DMA_IDLE +#define HAL_UART_DMA_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif +#if !defined HAL_UART_DMA_FULL +#define HAL_UART_DMA_FULL (HAL_UART_DMA_RX_MAX - 16) +#endif + +// ST-ticks for 1 byte @ 38.4-kB plus 1 tick added for when the txTick is forced from zero to 0xFF. +#define HAL_UART_TX_TICK_MIN 11 + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if HAL_UART_DMA_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_DMA_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint16 rxBuf[HAL_UART_DMA_RX_MAX]; + rxIdx_t rxHead; + rxIdx_t rxTail; +#if HAL_UART_DMA_IDLE + uint8 rxTick; +#endif + +#if HAL_UART_TX_BY_ISR + uint8 txBuf[HAL_UART_DMA_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; +#else + uint8 txBuf[2][HAL_UART_DMA_TX_MAX]; + txIdx_t txIdx[2]; + uint8 txMT; // Indication that at least one of two Tx buffers are free. + uint8 txTick; // ST ticks of delay to allow at least one byte-time at a given baud rate. + uint8 txTrig; // Flag indicating that Tx should be manually triggered after txTick expires. + + // Although all of the txVars above are modified by the Tx-done ISR, only this one should need + // the special volatile consideration by the optimizer (critical sections protect the rest). + volatile uint8 txSel; +#endif + + halUARTCBack_t uartCB; +} uartDMACfg_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_UART_DMA_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)])) +#define HAL_UART_DMA_GET_RX_BYTE(IDX) (*(volatile uint8 *)(dmaCfg.rxBuf+(IDX))) +#define HAL_UART_DMA_CLR_RX_BYTE(IDX) (dmaCfg.rxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) + +#define HAL_UART_DMA_CLR_RDY_OUT() (DMA_RDYOut = 1) +#define HAL_UART_DMA_SET_RDY_OUT() (DMA_RDYOut = 0) + +#define HAL_UART_DMA_RDY_IN() (DMA_RDYIn == 0) +#define HAL_UART_DMA_RDY_OUT() (DMA_RDYOut == 0) + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_DECR(IDX) (IDX)-- +#else +#define HAL_UART_RX_IDX_T_DECR(IDX) st ( \ + if ((IDX)-- == 0) \ + { \ + (IDX) = HAL_UART_DMA_RX_MAX-1; \ + } \ +) +#endif + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_INCR(IDX) (IDX)++ +#else +#define HAL_UART_RX_IDX_T_INCR(IDX) st ( \ + if (++(IDX) >= HAL_UART_DMA_RX_MAX) \ + { \ + (IDX) = 0; \ + } \ +) +#endif + +#define HAL_UART_DMA_TX_AVAIL() \ + (dmaCfg.txHead > dmaCfg.txTail) ? \ + (dmaCfg.txHead - dmaCfg.txTail - 1) : \ + (HAL_UART_DMA_TX_MAX - dmaCfg.txTail + dmaCfg.txHead - 1) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// The following two variables are only used when POWER_SAVING is defined. +static volatile uint8 dmaRdyIsr; +static uint8 dmaRdyDly; // Minimum delay before allowing sleep after detecting RdyIn de-asserted. + +static uartDMACfg_t dmaCfg; + +/* Used to walk the dmaCfg.rxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. + * Although not captured in this UART by DMA case, the _hal_uart_spi.c was able to show that the + * immediate buffer area around the spiRxIdx consists of "cleared" uint16 values, + * but 10-16 indices ahead, there are valid SPI packets ready to be parsed. + */ +static rxIdx_t uartRxBug; // Pre-emptive (not empirically determined necessary) use from SPI case. + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrDMA(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +// Invoked by functions in hal_uart.c when this file is included. +static void HalUARTInitDMA(void); +static void HalUARTOpenDMA(halUARTCfg_t *config); +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len); +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len); +static void HalUARTPollDMA(void); +static uint16 HalUARTRxAvailDMA(void); +static uint8 HalUARTBusyDMA(void); +#if !HAL_UART_TX_BY_ISR +static void HalUARTPollTxTrigDMA(void); +static void HalUARTArmTxDMA(void); +#endif + +/****************************************************************************** + * @fn HalUARTInitDMA + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitDMA(void) +{ + halDMADesc_t *ch; +#if (HAL_UART_DMA == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif + PxSEL |= HAL_UART_Px_SEL; // Enable Peripheral control of Rx/Tx on Px. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + if (DMA_PM) + { + // Setup GPIO for interrupts by falling edge on DMA_RDY_IN. + PxIEN |= DMA_RDYIn_BIT; + PICTL |= PICTL_BIT; + + HAL_UART_DMA_CLR_RDY_OUT(); + PxDIR |= DMA_RDYOut_BIT; + } + +#if !HAL_UART_TX_BY_ISR + // Setup Tx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); +#endif + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf ); + HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX); + HAL_DMA_ARM_CH(HAL_DMA_CH_RX); + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); +} + +/****************************************************************************** + * @fn HalUARTOpenDMA + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenDMA(halUARTCfg_t *config) +{ + dmaCfg.uartCB = config->callBackFunc; + + // Only supporting subset of baudrate for code size - other is possible. + HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + if (DMA_PM || config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + PxSEL |= HAL_UART_Px_CTS; // Enable Peripheral control of CTS flow control on Px. + } + else + { + UxUCR = UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + } + + UxCSR = (CSR_MODE | CSR_RE); + + if (DMA_PM) + { + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; + } + else if (UxUCR & UCR_FLOW) + { + // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the + // circular Rx queue depth. Start by allowing flow. + HAL_UART_DMA_SET_RDY_OUT(); + PxDIR |= HAL_UART_Px_RTS; + } + +#if HAL_UART_TX_BY_ISR + UTXxIF = 1; // Prime the ISR pump. +#endif +} + +/***************************************************************************** + * @fn HalUARTReadDMA + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len) +{ + uint16 cnt; + + for (cnt = 0; cnt < len; cnt++) + { + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + break; + } + *buf++ = HAL_UART_DMA_GET_RX_BYTE(dmaCfg.rxHead); + HAL_UART_DMA_CLR_RX_BYTE(dmaCfg.rxHead); + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + if (HalUARTRxAvailDMA() < HAL_UART_DMA_HIGH) + { + HAL_UART_DMA_SET_RDY_OUT(); // Re-enable the flow asap (i.e. not wait until next uart poll). + } + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteDMA + * + * @brief Write a buffer to the UART, enforcing an all or none policy if the requested length + * exceeds the space available. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len) +{ +#if HAL_UART_TX_BY_ISR + // Enforce all or none. + if (HAL_UART_DMA_TX_AVAIL() < len) + { + return 0; + } + + for (uint16 cnt = 0; cnt < len; cnt++) + { + dmaCfg.txBuf[dmaCfg.txTail] = *buf++; + dmaCfg.txMT = 0; + + if (dmaCfg.txTail >= HAL_UART_DMA_TX_MAX-1) + { + dmaCfg.txTail = 0; + } + else + { + dmaCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } +#else + txIdx_t txIdx; + uint8 txSel; + halIntState_t his; + + HAL_ENTER_CRITICAL_SECTION(his); + txSel = dmaCfg.txSel; + txIdx = dmaCfg.txIdx[txSel]; + HAL_EXIT_CRITICAL_SECTION(his); + + // Enforce all or none. + if ((len + txIdx) > HAL_UART_DMA_TX_MAX) + { + return 0; + } + + (void)memcpy(&(dmaCfg.txBuf[txSel][txIdx]), buf, len); + + HAL_ENTER_CRITICAL_SECTION(his); + /* If an ongoing DMA Tx finished while this buffer was being *appended*, then another DMA Tx + * will have already been started on this buffer, but it did not include the bytes just appended. + * Therefore these bytes have to be re-copied to the start of the new working buffer. + */ + if (txSel != dmaCfg.txSel) + { + HAL_EXIT_CRITICAL_SECTION(his); + txSel ^= 1; + + (void)memcpy(&(dmaCfg.txBuf[txSel][0]), buf, len); + HAL_ENTER_CRITICAL_SECTION(his); + dmaCfg.txIdx[txSel] = len; + } + else + { + dmaCfg.txIdx[txSel] = txIdx + len; + } + + // If there is no ongoing DMA Tx, then the channel must be armed here. + if (dmaCfg.txIdx[(txSel ^ 1)] == 0) + { + HAL_EXIT_CRITICAL_SECTION(his); + HalUARTArmTxDMA(); + } + else + { + dmaCfg.txMT = FALSE; + HAL_EXIT_CRITICAL_SECTION(his); + } +#endif + + return len; +} + +/****************************************************************************** + * @fn HalUARTPollDMA + * + * @brief Poll a USART module implemented by DMA, including the hybrid solution in which the Rx + * is driven by DMA but the Tx is driven by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollDMA(void) +{ + uint8 evt = 0; + uint16 cnt; + +#if DMA_PM + PxIEN &= ~DMA_RDYIn_BIT; // Clear to not race with DMA_RDY_IN ISR. + { + if (dmaRdyIsr || HAL_UART_DMA_RDY_IN() || HalUARTBusyDMA()) + { + // Master may have timed-out the SRDY asserted state & may need a new edge. +#if HAL_UART_TX_BY_ISR + if (!HAL_UART_DMA_RDY_IN() && (dmaCfg.txHead != dmaCfg.txTail)) +#else + if (!HAL_UART_DMA_RDY_IN() && ((dmaCfg.txIdx[0] != 0) || (dmaCfg.txIdx[1] != 0))) +#endif + { + HAL_UART_DMA_CLR_RDY_OUT(); + } + dmaRdyIsr = 0; + + if (dmaRdyDly == 0) + { + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + + if ((dmaRdyDly = ST0) == 0) // Reserve zero to signify that the delay expired. + { + dmaRdyDly = 0xFF; + } + HAL_UART_DMA_SET_RDY_OUT(); + } + else if ((dmaRdyDly != 0) && (!DMA_PM_DLY || ((uint8)(ST0 - dmaRdyDly) > DMA_PM_DLY))) + { + dmaRdyDly = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + PxIEN |= DMA_RDYIn_BIT; +#endif + +#if !HAL_UART_TX_BY_ISR + HalUARTPollTxTrigDMA(); +#endif + + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + if (HAL_UART_DMA_NEW_RX_BYTE(uartRxBug)) + { + do { + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } while (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + HAL_UART_RX_IDX_T_INCR(uartRxBug); + } + + cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around. + +#if HAL_UART_DMA_IDLE + if (dmaCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway) to measure the Rx timeout. + if ((ST0 - dmaCfg.rxTick) > HAL_UART_DMA_IDLE) + { + dmaCfg.rxTick = 0; + evt = HAL_UART_RX_TIMEOUT; + } + } + else if (cnt != 0) + { + if ((dmaCfg.rxTick = ST0) == 0) // Zero signifies that the Rx timeout is not running. + { + dmaCfg.rxTick = 0xFF; + } + } +#else + if (cnt != 0) + { + evt = HAL_UART_RX_TIMEOUT; + } +#endif + + if (cnt >= HAL_UART_DMA_FULL) + { + evt |= HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_DMA_HIGH) + { + evt |= HAL_UART_RX_ABOUT_FULL; + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + HAL_UART_DMA_CLR_RDY_OUT(); // Disable Rx flow. + } + } + + if (dmaCfg.txMT) + { + dmaCfg.txMT = FALSE; + evt |= HAL_UART_TX_EMPTY; + } + + if ((evt != 0) && (dmaCfg.uartCB != NULL)) + { + dmaCfg.uartCB(HAL_UART_DMA-1, evt); + } + + if (DMA_PM && (dmaRdyDly == 0) && !HalUARTBusyDMA()) + { + HAL_UART_DMA_CLR_RDY_OUT(); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailDMA() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailDMA(void) +{ + // First, synchronize the Rx tail marker with where the DMA Rx engine is working. + rxIdx_t tail = dmaCfg.rxTail; + + do + { + if (!HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + break; + } + + HAL_UART_RX_IDX_T_INCR(tail); + } while (tail != dmaCfg.rxHead); + + dmaCfg.rxTail = tail; + + uint16 cnt = tail - dmaCfg.rxHead; + + // If the DMA Rx may have overrun the circular queue, investigate further. + if ((cnt == 0) && HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + /* Ascertain whether this polling is racing with the DMA Rx which may have clocked in a byte + * since walking the tail. The Rx queue has wrapped only if the byte before the head is new. + */ + tail = dmaCfg.rxHead; + HAL_UART_RX_IDX_T_DECR(tail); + + if (HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + if (HAL_UART_RX_FLUSH) + { + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + else + { + cnt = HAL_UART_DMA_RX_MAX; + } + } + else + { + cnt = 1; + } + } + else if (cnt > HAL_UART_DMA_RX_MAX) // If the tail has wrapped at the end of the Rx queue. + { + cnt += HAL_UART_DMA_RX_MAX; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTBusyDMA + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +static uint8 HalUARTBusyDMA( void ) +{ +#if HAL_UART_TX_BY_ISR + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txHead == dmaCfg.txTail)); +#else + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txIdx[0] == 0) && (dmaCfg.txIdx[1] == 0)); +#endif +} + +#if !HAL_UART_TX_BY_ISR +/****************************************************************************** + * @fn HalUARTPollTxTrigDMA + * + * @brief Ascertain whether a manual trigger is required for the DMA Tx channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTPollTxTrigDMA(void) +{ + if ((UxCSR & CSR_TX_BYTE) == 0) // If no TXBUF to shift register transfer, then TXBUF may be MT. + { + if ((dmaCfg.txTick == 0) || ((uint8)(ST0 - dmaCfg.txTick) > HAL_UART_TX_TICK_MIN)) + { + dmaCfg.txTick = 0; + + if (dmaCfg.txTrig && HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)) + { + HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX); + } + dmaCfg.txTrig = 0; + } + } + else + { + UxCSR = (CSR_MODE | CSR_RE); // Clear the CSR_TX_BYTE flag. + dmaCfg.txTick = ST0; + + if (dmaCfg.txTick == 0) // Reserve zero to signify that the minimum delay has been met. + { + dmaCfg.txTick = 0xFF; + } + } +} + +/****************************************************************************** + * @fn HalUARTArmTxDMA + * + * @brief Arm the Tx DMA channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTArmTxDMA(void) +{ + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX); + HAL_DMA_SET_SOURCE(ch, dmaCfg.txBuf[dmaCfg.txSel]); + HAL_DMA_SET_LEN(ch, dmaCfg.txIdx[dmaCfg.txSel]); + + dmaCfg.txSel ^= 1; + dmaCfg.txTrig = 1; + HAL_DMA_ARM_CH(HAL_DMA_CH_TX); + + HalUARTPollTxTrigDMA(); + + if (DMA_PM) + { + HAL_UART_DMA_SET_RDY_OUT(); + } +} +#endif + +/****************************************************************************** + * @fn HalUART_DMAIsrDMA + * + * @brief Handle the Tx done DMA ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUART_DMAIsrDMA(void) +{ +#if !HAL_UART_TX_BY_ISR + if (dmaCfg.txIdx[dmaCfg.txSel]) + { + // If there is more Tx data ready to go, re-arm the DMA immediately on it. + HalUARTArmTxDMA(); + + // Indicate that the Tx buffer just finished is now free (re-arming did a ^= toggle of txSel). + dmaCfg.txIdx[dmaCfg.txSel] = 0; + } + else + { + dmaCfg.txIdx[(dmaCfg.txSel ^ 1)] = 0; // Indicate that the Tx buffer just finished is now free. + + // Clear the CSR_TX_BYTE flag & start the txTick to allow the possibility of an immediate + // manual trigger from the next Write(), if it occurs more than one character time later. + HalUARTPollTxTrigDMA(); + } + + dmaCfg.txMT = TRUE; // Notify CB that at least one Tx buffer is now free to use. +#endif +} + +#if DMA_PM +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + PxIFG = 0; + PxIF = 0; + + dmaRdyIsr = 1; + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +} +#endif + +#if HAL_UART_TX_BY_ISR +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (dmaCfg.txHead == dmaCfg.txTail) + { + IEN2 &= ~UTXxIE; + dmaCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; + + if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) + { + dmaCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_isr.c b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_isr.c new file mode 100644 index 0000000..60c81b4 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_isr.c @@ -0,0 +1,662 @@ +/************************************************************************************************** + Filename: _hal_uart_isr.c + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the H/W UART driver by ISR. + + Note that when using this interrupt service based UART configuration (as opposed to DMA) the + higher baudrates, such as 115200bps, may suffer Rx overrun, especially when the radio is used + simultaneously and/or there is heavy to full throughout and/or full-duplex data. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_uart.h" + +/********************************************************************* + * MACROS + */ + +//#define HAL_UART_ASSERT(expr) HAL_ASSERT((expr)) +#define HAL_UART_ASSERT(expr) + +#define HAL_UART_ISR_RX_AVAIL() \ + (isrCfg.rxTail >= isrCfg.rxHead) ? \ + (isrCfg.rxTail - isrCfg.rxHead) : \ + (HAL_UART_ISR_RX_MAX - isrCfg.rxHead + isrCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ + (isrCfg.txHead > isrCfg.txTail) ? \ + (isrCfg.txHead - isrCfg.txTail - 1) : \ + (HAL_UART_ISR_TX_MAX - isrCfg.txTail + isrCfg.txHead - 1) + +/********************************************************************* + * CONSTANTS + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +// Incompatible redefinitions result with more than one UART driver sub-module. +#undef PxOUT +#undef PxDIR +#undef PxSEL +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef URXxIE +#undef URXxIF +#undef UTXxIE +#undef UTXxIF +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RX_TX +#undef HAL_UART_Px_RX +#undef PxIFG +#undef PxIF +#undef PxIEN +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_ISR == 1) +#define PxOUT P0 +#define PxIN P0 +#define PxDIR P0DIR +#define PxSEL P0SEL +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define URXxIE URX0IE +#define URXxIF URX0IF +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF + +#define PxIFG P0IFG +#define PxIF P0IF +#define PxIEN P0IEN +#define PICTL_BIT 0x01 +#define IENx IEN1 +#define IEN_BIT 0x20 + +#else +#define PxOUT P1 +#define PxIN P1 +#define PxDIR P1DIR +#define PxSEL P1SEL +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define URXxIE URX1IE +#define URXxIF URX1IF +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF + +#define PxIFG P1IFG +#define PxIF P1IF +#define PxIEN P1IEN +#define PICTL_BIT 0x04 +#define IENx IEN2 +#define IEN_BIT 0x10 +#endif + +#if (HAL_UART_ISR == 1) +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_Px_RX_TX 0x0C // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x04 // Peripheral I/O Select for Rx. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#else +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#define HAL_UART_Px_RX_TX 0xC0 // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x80 // Peripheral I/O Select for Rx. +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_ISR_RX_MAX +#define HAL_UART_ISR_RX_MAX 128 +#endif +#if !defined HAL_UART_ISR_TX_MAX +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX +#endif +#if !defined HAL_UART_ISR_HIGH +#define HAL_UART_ISR_HIGH (HAL_UART_ISR_RX_MAX / 2 - 16) +#endif +#if !defined HAL_UART_ISR_IDLE +#define HAL_UART_ISR_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +#if HAL_UART_ISR_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_ISR_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + rxIdx_t rxHead; + volatile rxIdx_t rxTail; + uint8 rxTick; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; + + halUARTCBack_t uartCB; +} uartISRCfg_t; + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uartISRCfg_t isrCfg; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void HalUARTInitISR(void); +static void HalUARTOpenISR(halUARTCfg_t *config); +static uint16 HalUARTReadISR(uint8 *buf, uint16 len); +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len); +static void HalUARTPollISR(void); +static uint16 HalUARTRxAvailISR(void); +static uint8 HalUARTBusyISR(void); +static void HalUARTSuspendISR(void); +static void HalUARTResumeISR(void); + +/****************************************************************************** + * @fn HalUARTInitISR + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitISR(void) +{ + // Set P2 priority - USART0 over USART1 if both are defined. + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + +#if (HAL_UART_ISR == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O location to P1. +#endif + PxSEL |= HAL_UART_Px_RX_TX; // Enable Tx and Rx on P1. + ADCCFG &= ~HAL_UART_Px_RX_TX; // Make sure ADC doesnt use this. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. +} + +/****************************************************************************** + * @fn HalUARTOpenISR + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenISR(halUARTCfg_t *config) +{ + isrCfg.uartCB = config->callBackFunc; + // Only supporting subset of baudrate for code size - other is possible. + HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + if (config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; + PxSEL |= HAL_UART_Px_RTS | HAL_UART_Px_CTS; + PxOUT &= ~HAL_UART_Px_RTS; + PxDIR |= HAL_UART_Px_RTS; + } + else + { + UxUCR = UCR_STOP; + } + + URXxIE = 1; + UTXxIF = 1; // Prime the ISR pump. + UxCSR = (CSR_MODE | CSR_RE); +} + +/***************************************************************************** + * @fn HalUARTReadISR + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadISR(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((isrCfg.rxHead != isrCfg.rxTail) && (cnt < len)) + { + *buf++ = isrCfg.rxBuf[isrCfg.rxHead++]; + if (isrCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteISR + * + * @brief Write a buffer to the UART. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Enforce all or none. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + isrCfg.txBuf[isrCfg.txTail] = *buf++; + isrCfg.txMT = 0; + + if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1) + { + isrCfg.txTail = 0; + } + else + { + isrCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTPollISR + * + * @brief Poll a USART module implemented by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollISR(void) +{ + uint16 cnt = HAL_UART_ISR_RX_AVAIL(); + uint8 evt = 0; + + if (isrCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - isrCfg.rxShdw; + + if (isrCfg.rxTick > decr) + { + isrCfg.rxTick -= decr; + } + else + { + isrCfg.rxTick = 0; + } + } + isrCfg.rxShdw = ST0; + + if (cnt >= HAL_UART_ISR_RX_MAX-1) + { + evt = HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_ISR_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !isrCfg.rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (isrCfg.txMT) + { + isrCfg.txMT = 0; + evt |= HAL_UART_TX_EMPTY; + } + + if (evt && (isrCfg.uartCB != NULL)) + { + isrCfg.uartCB(HAL_UART_ISR-1, evt); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailISR() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailISR(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +/****************************************************************************** + * @fn HalUARTBusyISR + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +uint8 HalUARTBusyISR( void ) +{ + return ((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && + (isrCfg.rxHead == isrCfg.rxTail) && (isrCfg.txHead == isrCfg.txTail)); +} + +/****************************************************************************** + * @fn HalUARTSuspendISR + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTSuspendISR( void ) +{ +#if defined POWER_SAVING + UxCSR = CSR_MODE; // Suspend Rx operations. + + if (UxUCR & UCR_FLOW) + { + PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow. + PxIFG = (HAL_UART_Px_CTS ^ 0xFF); + PxIEN |= HAL_UART_Px_CTS; // Enable the CTS ISR. + } + else + { + PxIFG = (HAL_UART_Px_RX ^ 0xFF); + PxIEN |= HAL_UART_Px_RX; // Enable the Rx ISR. + } + +#if defined HAL_UART_GPIO_ISR + PxIF = 0; // Clear the next level. + PICTL |= PICTL_BIT; // Interrupt on falling edge of input. + IENx |= IEN_BIT; +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTResumeISR + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTResumeISR( void ) +{ +#if defined POWER_SAVING +#if defined HAL_UART_GPIO_ISR + IENx &= (IEN_BIT ^ 0xFF); +#endif + + if (UxUCR & UCR_FLOW) + { + PxIEN &= (HAL_UART_Px_CTS ^ 0xFF); // Disable the CTS ISR. + PxOUT &= (HAL_UART_Px_RTS ^ 0xFF); // Re-enable Rx flow. + } + else + { + PxIEN &= (HAL_UART_Px_RX ^ 0xFF); // Enable the Rx ISR. + } + + UxUCR |= UCR_FLUSH; + UxCSR = (CSR_MODE | CSR_RE); +#endif +} + +/*************************************************************************************************** + * @fn halUartRxIsr + * + * @brief UART Receive Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + uint8 tmp = UxDBUF; + isrCfg.rxBuf[isrCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (isrCfg.rxHead == isrCfg.rxTail) + { + isrCfg.rxShdw = ST0; + } + + if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxTail = 0; + } + + isrCfg.rxTick = HAL_UART_ISR_IDLE; + + HAL_EXIT_ISR(); +} + +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (isrCfg.txHead == isrCfg.txTail) + { + IEN2 &= ~UTXxIE; + isrCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = isrCfg.txBuf[isrCfg.txHead++]; + + if (isrCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + isrCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} + +#if (defined POWER_SAVING && defined HAL_UART_GPIO_ISR) +/*************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + HalUARTResume(); + if (dmaCfg.uartCB != NULL) + { + dmaCfg.uartCB(HAL_UART_DMA-1, HAL_UART_RX_WAKEUP); + } + PxIFG = 0; + PxIF = 0; + + HAL_EXIT_ISR(); +} +#endif + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_spi.c b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_spi.c new file mode 100644 index 0000000..81f55f7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/_hal_uart_spi.c @@ -0,0 +1,1075 @@ +/************************************************************************************************** + Filename: _hal_uart_spi.c + Revised: $Date: 2012-10-30 19:25:51 -0700 (Tue, 30 Oct 2012) $ + Revision: $Revision: 31987 $ + + Description: Implementation of a specialized SPI Transport driver for emulating a UART API. + + Concept of Operation for porting this code to act as a SPI Master: + + 5 GPIO lines are required: MOSI, MISO, SPI Clock, SPI CSn/MRDY, and SRDY. + MRDY = SPI Master Ready to send and serves as a SPI Slave wakeup from sleep. + SRDY = SPI Slave Ready to send and serves as a SPI Master wakeup from sleep. + + SRDY also serves as an indication that the Slave has awoken from sleep and is ready to recieve + as follows: when the Slave has no message ready, it will toggle the state of its SRDY on every + falling edge of the CSn/MRDY. The SPI Slave has a configurable time delay before re-enabling + sleep after being awoken. + + The SPI Slave does not re-enter sleep for the following conditions: + - Slave is asserting SRDY (i.e. it is waiting to send a SPI packet). + - Master is asserting MRDY. + - Slave has parsed the SOF byte of a SPI packet, but has not received the entire packet yet. + Note how important this case is to support a master that has to interrupt a SPI packet + transmission in order to service a higher priority SPI slave (i.e. the master has executed the + protocol to ensure that the SPI slave is awake, but cannot hold MRDY low for the entire, + contiguous packet for having to service some other SPI slave mid-packet). + + Any transfer, from one byte to SPI_MAX_DAT_LEN bytes is packetized by pre-pending an SOF & LEN + byte and appending an FCS byte. The FCS is calculated over the data payload and the LEN bytes. + + Only Full-Duplex transfers are supported - at any byte of a Tx transfer, + the incoming bytes may not be just garbage bytes clocked out by the synchronous transfer, but + instead be meaningful bytes of a Tx-packet from the other side. Thus, the necessity of concocting + the concept of the SPI transfer packet described above. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#elif defined HAL_SPI_QUEUED_TX && HAL_SPI_QUEUED_TX +#include "OSAL.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* The bridge utility application uses 4 DMA channels for 2 sets of Rx/Tx by DMA, and thereby also + * implements a special DMA ISR handler, which accomodates this extra definition. + */ +#if !defined HAL_SPI_CH_RX +#define HAL_SPI_CH_RX HAL_DMA_CH_RX +#endif +#if !defined HAL_SPI_CH_TX +#define HAL_SPI_CH_TX HAL_DMA_CH_TX +#endif + +// Overlay the SPI Rx/Tx buffers on the UART Rx/Tx buffers when running with a run-time selectable +// UART port by SPI or by UART in order to save XDATA space. +#if !defined HAL_SPI_ON_UART_BUFS +#define HAL_SPI_ON_UART_BUFS FALSE +#endif + +#if !defined HAL_SPI_QUEUED_TX +#define HAL_SPI_QUEUED_TX FALSE +#endif + +#define SPI_MAX_PKT_LEN 256 +#define SPI_MAX_DAT_LEN (SPI_MAX_PKT_LEN - SPI_FRM_LEN) + +#define SPI_SOF 0xFE // Start-of-frame delimiter for SPI transport. + +// The FCS is calculated over the SPI Frame Header and the Frame Data bytes. +#define SPI_HDR_LEN 1 // One byte LEN pre-pended to data byte array. +// SOF & Header bytes pre-pended and the FCS byte appended. +#define SPI_FRM_LEN (2 + SPI_HDR_LEN) + +#define SPI_SOF_IDX 0 +#define SPI_HDR_IDX 1 // The frame header consists only of the LEN byte for now. +#define SPI_LEN_IDX 1 // LEN byte is offset by the SOF byte. +#define SPI_DAT_IDX 2 // Data bytes are offset by the SOF & LEN bytes. + +#if defined HAL_SPI_MASTER +// If POWER_SAVING is enabled in the 8051-SOC slave, then any master transmit must be preceded by a +// dummy zero byte transfer to give the slave time to wake from PM2/3 & enable its 1.8V and signal +// such success by responding with its SRDY active low. +#if !defined HAL_SPI_WAKEUP +#define HAL_SPI_WAKEUP TRUE +#endif +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 2 +#elif (HAL_UART_SPI != 2) +#error Only supporting HAL_UART_SPI==2 for now. +#endif + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#if (HAL_UART_SPI == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#elif (HAL_UART_SPI == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_SEL_S +#undef HAL_UART_Px_SEL_M +#if (HAL_UART_SPI == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_SEL_S 0x3C // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0x2C // Peripheral I/O Select for Master: MI/MO/CLK. +#elif (HAL_UART_SPI == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_SEL_S 0xF0 // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0xE0 // Peripheral I/O Select for Master: MI/MO/CLK. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_SPI == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_SPI == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#if !defined SPI_RDYIn +#define SPI_RDYIn P0_1 +#define SPI_RDYIn_BIT BV(1) +#endif +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_SPI == 2) +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define SPI_RDYIn P1_4 +#define SPI_RDYIn_BIT BV(4) +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#undef PxDIR +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxDIR P1DIR +#define SPI_RDYOut P1_4 +#define SPI_RDYOut_BIT BV(4) +#elif (HAL_UART_SPI == 2) +#define PxDIR P0DIR +#define SPI_RDYOut P0_5 +#define SPI_RDYOut_BIT BV(5) +#endif + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if (SPI_MAX_PKT_LEN <= 256) +typedef uint8 spiLen_t; +#else +typedef uint16 spiLen_t; +#endif + +typedef enum +{ + spiRxSteSOF, + spiRxSteLen, + spiRxSteData, + spiRxSteFcs +} spiRxSte_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#if SPI_MAX_PKT_LEN == 256 +#define SPI_LEN_T_INCR(LEN) (LEN)++ +#define SPI_LEN_T_BOUNDS_CHECK(LEN) +#else +#define SPI_LEN_T_INCR(LEN) st ( \ + if (++(LEN) >= SPI_MAX_PKT_LEN) \ + { \ + (LEN) = 0; \ + } \ +) + +#define SPI_LEN_T_BOUNDS_CHECK(LEN) st ( \ + if (len > SPI_MAX_PKT_LEN) \ + { \ + len = SPI_MAX_PKT_LEN; \ + } \ +) +#endif + +#define SPI_CLR_RX_BYTE(IDX) (spiRxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) +#define SPI_GET_RX_BYTE(IDX) (*(volatile uint8 *)(spiRxBuf+(IDX))) +#define SPI_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(spiRxBuf[(IDX)])) + +#define SPI_DAT_LEN(PBUF) ((PBUF)[SPI_LEN_IDX]) +#define SPI_PKT_LEN(PBUF) (SPI_DAT_LEN((PBUF)) + SPI_FRM_LEN) + +#define SPI_RDY_IN() (SPI_RDYIn == 0) +#define SPI_RDY_OUT() (SPI_RDYOut == 0) + +#if defined HAL_SPI_MASTER +#define SPI_CLR_CSn_OUT() (SPI_RDYOut = 1) +#define SPI_SET_CSn_OUT() (SPI_RDYOut = 0) + +#define SPI_CLOCK_RX(CNT) st ( \ + SPI_SET_CSn_OUT(); \ + \ + for (spiLen_t cnt = 0; cnt <= (CNT); cnt++) \ + { \ + UxDBUF = 0; \ + while (UxCSR & CSR_ACTIVE); \ + } \ + \ + SPI_CLR_CSn_OUT(); \ +) +#define SPI_CLR_RDY_OUT() SPI_CLR_CSn_OUT() + +#elif !defined HAL_SPI_MASTER +#define SPI_CLR_RDY_OUT() (SPI_RDYOut = 1) +#define SPI_SET_RDY_OUT() (SPI_RDYOut = 0) +#define SPI_TOG_RDY_OUT() st ( \ + if (SPI_RDY_OUT()) \ + { \ + SPI_CLR_RDY_OUT(); \ + } \ + else \ + { \ + SPI_SET_RDY_OUT(); \ + } \ +) +#endif + +#define SPI_RX_RDY() (spiRxHead != spiRxTail) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// Convenient way to save RAM space when running with both SPI & UART ports enabled, +// but only using one at a time with a run-time choice. +#if HAL_SPI_ON_UART_BUFS +static uint16 *const spiRxBuf = dmaCfg.rxBuf; +#if (defined HAL_UART_TX_BY_ISR && HAL_UART_TX_BY_ISR) +static uint8 *const spiRxDat = dmaCfg.txBuf; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#else +static uint8 *const spiRxDat = dmaCfg.txBuf[0]; +static uint8 *const spiTxPkt = dmaCfg.txBuf[1]; +#endif +#else +static __no_init uint16 spiRxBuf[SPI_MAX_PKT_LEN]; // uint16 for trick with DMA Rx 2-for-1. +static __no_init uint8 spiRxDat[SPI_MAX_PKT_LEN]; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#endif + +#if HAL_SPI_QUEUED_TX +static osal_msg_q_t spiTxQ; +static volatile uint8 spiTxMT; +#endif + +static spiRxSte_t spiRxSte; // State of SPI packet parsing from spiRxBuf[]. +static spiLen_t spiRxIdx; // Index in spiRxBuf[] for SPI packet parsing. +static spiLen_t spiRxCnt; // Count payload data bytes parsed from spiRxBuf[]. +static spiLen_t spiRxLen; // Total length of payload data bytes to be parsed from spiRxBuf[]. +static spiLen_t spiRxFcs; // Running FCS calculation of bytes being parsed from spiRxBuf[]. + +static spiLen_t spiRxHead; // Index in spiRxDat[] from which to read with HalUARTReadSPI(). +static spiLen_t spiRxTail; // Index in spiRxDat[] up to which to read with HalUARTReadSPI(). +static spiLen_t spiRxTemp; // Index in spiRxDat[] to which to parse data from spiRxBuf[]. + +// Not supporting Tx packet buffering with a spiTxBuf[] for now to save XDATA/Flash space. + +static volatile spiLen_t spiTxLen; // Total length of payload data bytes to transmit. + +static halUARTCBack_t spiCB; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) +static volatile uint8 spiRdyIsr; // Sticky flag from SPI_RDY_IN ISR for background polling. +#endif + +#if defined POWER_SAVING +static uint8 spiHoldPM; // Boolean whether or not this module is holding off the PM. +#endif + +/* Used to walk the spiRxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. The immediate buffer area around + * the spiRxIdx consists of "cleared" uint16 values, but 10-16 indices ahead, there are valid SPI + * packets ready to be parsed. + */ +static spiLen_t spiRxBug; // DMA pointer is seen to jump ahead, or S/W bug corrupts spiRxIdx? + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrSPI(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +static uint8 spiCalcFcs(uint8 *pBuf); +static void spiParseRx(void); +#if defined POWER_SAVING +static uint8 spiSweepRx(void); +#endif + +/************************************************************************************************** + * @fn HalUARTInitSPI + * + * @brief Initialize the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTInitSPI(void) +{ +#if (HAL_UART_SPI == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif +#if defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_M; // SPI-Master peripheral select. + UxCSR = 0; // Mode is SPI-Master Mode. + UxGCR = 16; // Cfg for the max Rx/Tx baud of 4-MHz. + UxBAUD = 255; +#elif !defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_S; // SPI-Slave peripheral select. + UxCSR = CSR_SLAVE; // Mode is SPI-Slave Mode. +#endif + UxUCR = UCR_FLUSH; // Flush it. + UxGCR |= BV(5); // Set bit order to MSB. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + // Setup GPIO for interrupts by falling edge on SPI_RDY_IN. + PxIEN |= SPI_RDYIn_BIT; + PICTL |= PICTL_BIT; + + SPI_CLR_RDY_OUT(); + PxDIR |= SPI_RDYOut_BIT; + + // Setup Tx by DMA. + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + HAL_DMA_SET_SOURCE( ch, spiTxPkt ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, spiRxBuf ); + HAL_DMA_SET_LEN( ch, SPI_MAX_PKT_LEN ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_SPI_CH_RX); + HAL_DMA_ARM_CH(HAL_SPI_CH_RX); + (void)memset(spiRxBuf, (DMA_PAD ^ 0xFF), SPI_MAX_PKT_LEN * sizeof(uint16)); +} + +/************************************************************************************************** + * @fn HalUARTOpenSPI + * + * @brief Start the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTOpenSPI(halUARTCfg_t *config) +{ + spiCB = config->callBackFunc; + + UxCSR |= CSR_RE; + + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; +} + +/************************************************************************************************** + * @fn HalUARTReadSPI + * + * @brief Read data bytes from a received SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory to where to copy the received SPI data bytes. + * @param len - the length to copy (for now, must be the exact length of the received data). + * + * output parameters + * + * None. + * + * @return The number of bytes read from a received SPI packet. + */ +static spiLen_t HalUARTReadSPI(uint8 *buf, spiLen_t len) +{ + for (spiLen_t cnt = 0; cnt < len; cnt++) + { + if (spiRxHead == spiRxTail) + { + len = cnt; + break; + } + + *buf++ = spiRxDat[spiRxHead]; + SPI_LEN_T_INCR(spiRxHead); + } + + return len; +} + +/************************************************************************************************** + * @fn HalUARTWriteSPI + * + * @brief Transmit data bytes as a SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory of the data bytes to send. + * @param len - the length of the data bytes to send. + * + * output parameters + * + * None. + * + * @return Zero for any error; otherwise, 'len'. + */ +static spiLen_t HalUARTWriteSPI(uint8 *buf, spiLen_t len) +{ + if (spiTxLen != 0) + { +#if HAL_SPI_QUEUED_TX + uint8 *txMsg = osal_msg_allocate(len); + + if (txMsg != NULL) + { + (void)memcpy(txMsg, buf, len); + osal_msg_enqueue(&spiTxQ, txMsg); + + return len; + } +#endif + + return 0; + } + + if (len > SPI_MAX_DAT_LEN) + { + len = SPI_MAX_DAT_LEN; + } + spiTxLen = len; +#if HAL_SPI_QUEUED_TX + spiTxMT = FALSE; +#endif + + spiTxPkt[SPI_LEN_IDX] = len; + (void)memcpy(spiTxPkt + SPI_DAT_IDX, buf, len); + + spiCalcFcs(spiTxPkt); + spiTxPkt[SPI_SOF_IDX] = SPI_SOF; + + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_SPI_CH_TX); + HAL_DMA_SET_LEN(ch, SPI_PKT_LEN(spiTxPkt)); + +#if defined HAL_SPI_MASTER +#if HAL_SPI_WAKEUP + /* A Full-Duplex Slave will keep SRDY active low if it has Tx ready; otherwise it will toggle its + * SRDY with every falling edge of MRDY. So if SRDY is high and the wait after writing each byte + * is not long enough, the master may loop here, infinitely out of sync with the toggling SRDY. + * Thus in a threaded OS, it would be advisable to send one zero and yield for 1-msec or more, or + * be able to receive and check here for the SRDY ISR. + */ + spiRdyIsr = 0; + while (!SPI_RDY_IN() && (spiRdyIsr == 0)) + { + SPI_CLOCK_RX(1); + + for (uint16 cnt = 0; cnt < 512; cnt++) + { + if (SPI_RDY_IN() || (spiRdyIsr != 0)) + { + break; + } + } + } +#endif + SPI_SET_CSn_OUT(); + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + HAL_DMA_MAN_TRIGGER(HAL_SPI_CH_TX); + +#elif !defined HAL_SPI_MASTER + + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + SPI_SET_RDY_OUT(); +#endif + + return len; +} + +/************************************************************************************************** + * @fn HalUARTPollSPI + * + * @brief SPI Transport Polling Manager. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTPollSPI(void) +{ +#if HAL_SPI_QUEUED_TX + /* There should not be a race with the Tx-Done ISR checking the spiTxQ because if the background + * can first detect the volatile variable spiTxLen as zero and then detect the spiTxQ as not + * empty, then the Tx-Done ISR has already fired after the background write started to enqueue + * the message but before it was done doing so. + */ + if ((spiTxLen == 0) && (spiTxQ != NULL)) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else if (spiTxMT) + { + spiTxMT = FALSE; + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); + } +#endif + + spiParseRx(); + +#if HAL_SPI_QUEUED_TX || defined HAL_SPI_MASTER + if (SPI_RX_RDY()) +#else + // When there is no ability to queue Tx data and there is still Tx data pending, do not call the + // Application with new Rx data, as this may result in an attempt to respond. Although this + // failure will be actionable by the Application when HalUARTWriteSPI() returns zero, simple + // applications (like the SBL, which does not enable Tx queueing) do not handle the zero return. + if (SPI_RX_RDY() && !spiTxLen) +#endif + { + if (spiCB != NULL) + { + spiCB((HAL_UART_SPI - 1), HAL_UART_RX_TIMEOUT); + } + } + + PxIEN &= ~SPI_RDYIn_BIT; // Clear to not race with SPI_RDY_IN ISR. + + if (!SPI_RDY_IN() && !spiTxLen) + { + SPI_CLR_RDY_OUT(); // Clear the ready-out bit before re-enabling the ready-in ISR. + } + +#if defined POWER_SAVING + if (SPI_RDY_IN() || SPI_RX_RDY() || spiRxLen || spiTxLen || spiRdyIsr) + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM == 0) + { + spiHoldPM = 1; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + } + else + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM != 0) + { + PxIEN |= SPI_RDYIn_BIT; // Allow the ready-in ISR during the relatively long Rx sweep. + + if (spiSweepRx()) + { + spiHoldPM = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + } +#endif + + PxIEN |= SPI_RDYIn_BIT; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailSPI + * + * @brief Return the byte count of Rx data ready to be read HalUARTReadSPI(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return Number of bytes ready to be read with HalUARTReadSPI(). + */ +static spiLen_t HalUARTRxAvailSPI(void) +{ + return (spiRxTail > spiRxHead) ? (spiRxTail-spiRxHead) : (spiRxTail+(SPI_MAX_PKT_LEN-spiRxHead)); +} + +/************************************************************************************************** + * @fn spiCalcFcs + * + * @brief Calculate the FCS of a SPI Transport frame and append it to the packet. + * + * input parameters + * + * @param pBuf - Pointer to the SPI Transport frame over which to calculate the FCS. + * + * output parameters + * + * None. + * + * @return The FCS calculated. + */ +static uint8 spiCalcFcs(uint8 *pBuf) +{ + spiLen_t len = SPI_DAT_LEN(pBuf) + SPI_HDR_LEN + SPI_HDR_IDX; + spiLen_t idx = SPI_HDR_IDX; + uint8 fcs = 0; + + while (idx < len) + { + fcs ^= pBuf[idx++]; + } + pBuf[idx] = fcs; + + return fcs; +} + +/************************************************************************************************** + * @fn spiParseRx + * + * @brief Parse all available bytes from the spiRxBuf[]; parse Rx data into the spiRxDat[]. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void spiParseRx(void) +{ + while (1) + { + if (!SPI_NEW_RX_BYTE(spiRxIdx)) + { +#if defined HAL_SPI_MASTER + if (SPI_RDY_IN() && (spiTxLen == 0)) + { + SPI_CLOCK_RX(1); + continue; + } +#endif + + if (SPI_NEW_RX_BYTE(spiRxBug)) + { + while (!SPI_NEW_RX_BYTE(spiRxIdx)) + { + SPI_LEN_T_INCR(spiRxIdx); + } + + spiRxBug = spiRxIdx; + continue; + } + + SPI_LEN_T_INCR(spiRxBug); + break; + } + + uint8 ch = SPI_GET_RX_BYTE(spiRxIdx); + SPI_CLR_RX_BYTE(spiRxIdx); + SPI_LEN_T_INCR(spiRxIdx); + + switch (spiRxSte) + { + case spiRxSteSOF: + if (ch == SPI_SOF) + { + spiRxSte = spiRxSteLen; + + // At this point, the master has effected the protocol for ensuring that the SPI slave is + // awake, so set the spiRxLen to non-zero to prevent the slave from re-entering sleep until + // the entire packet is received - even if the master interrupts the sending of the packet + // by de-asserting/re-asserting MRDY one or more times. + spiRxLen = 1; + } + break; + + case spiRxSteLen: + if ((ch == 0) || (ch > SPI_MAX_DAT_LEN)) + { + spiRxSte = spiRxSteSOF; + spiRxLen = 0; + } + else + { + spiRxFcs = spiRxLen = ch; + spiRxTemp = spiRxTail; + spiRxCnt = 0; + spiRxSte = spiRxSteData; +#if defined HAL_SPI_MASTER + SPI_CLOCK_RX(ch + 1); // Clock out the SPI Frame Data bytes and FCS. +#endif + } + break; + + case spiRxSteData: + spiRxFcs ^= ch; + spiRxDat[spiRxTemp] = ch; + SPI_LEN_T_INCR(spiRxTemp); + + if (++spiRxCnt == spiRxLen) + { + spiRxSte = spiRxSteFcs; + } + break; + + case spiRxSteFcs: + spiRxSte = spiRxSteSOF; + + if (ch == spiRxFcs) + { + spiRxTail = spiRxTemp; + } + + spiRxCnt = spiRxLen = 0; + break; + + default: + HAL_ASSERT(0); + break; + } + } +} + +#if defined POWER_SAVING +/************************************************************************************************** + * @fn spiSweepRx + * + * @brief Sweep the entire spiRxBuf[] looking for buggy DMA Rx - this function is an + * enhancement to the 'spiRxBug' work-around that is required when POWER_SAVING is + * enabled because the 'spiRxBug' only looks at one byte per polling pass and the + * buggy DMA Rx may be further away and not encountered before allowing sleep. + * + * input parameters + * + * None. + * + * output parameters + * + * The local global variables spiRxIdx and spiRxBug are set to the index of the first valid Rx + * after the index where spiRxIdx had been set upon entering this function. + * + * @return TRUE for a clean sweep (spiRxBuf[] has no valid Rx); FALSE otherwise. + */ +static uint8 spiSweepRx(void) +{ + spiLen_t sweepIdx = spiRxIdx; + + do { + if (SPI_NEW_RX_BYTE(sweepIdx)) + { + spiRxBug = spiRxIdx = sweepIdx++; + break; + } + + SPI_LEN_T_INCR(sweepIdx); + + } while (sweepIdx != spiRxIdx); + + return (sweepIdx == spiRxIdx); +} +#endif + +/************************************************************************************************** + * @fn HalUART_DMAIsrSPI + * + * @brief Handle the Tx done DMA ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalUART_DMAIsrSPI(void) +{ +#if !defined HAL_SPI_MASTER + if (!SPI_RDY_IN()) +#endif + { + SPI_CLR_RDY_OUT(); + } + spiTxLen = 0; + +#if HAL_SPI_QUEUED_TX + if (spiTxQ != NULL) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else + { + spiTxMT = TRUE; + } +#else + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); +#endif +} + +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief Handler for the SPI_RDY_IN falling-edge ISR. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if defined HAL_SBL_BOOT_CODE +static void spiRdyIn(void) +{ +#else +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#elif (HAL_UART_SPI == 2) +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); +#endif + + PxIFG = 0; + PxIF = 0; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) + spiRdyIsr = 1; +#endif +#if !defined HAL_SPI_MASTER + if (spiTxLen == 0) + { + SPI_TOG_RDY_OUT(); + } +#endif + +#if !defined HAL_SBL_BOOT_CODE + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +#endif +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_adc.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_adc.c new file mode 100644 index 0000000..392cd2a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_adc.c @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_adc.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the HAL ADC. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_ADC_EOC 0x80 /* End of Conversion bit */ +#define HAL_ADC_START 0x40 /* Starts Conversion */ + +#define HAL_ADC_STSEL_EXT 0x00 /* External Trigger */ +#define HAL_ADC_STSEL_FULL 0x10 /* Full Speed, No Trigger */ +#define HAL_ADC_STSEL_T1C0 0x20 /* Timer1, Channel 0 Compare Event Trigger */ +#define HAL_ADC_STSEL_ST 0x30 /* ADCCON1.ST =1 Trigger */ + +#define HAL_ADC_RAND_NORM 0x00 /* Normal Operation */ +#define HAL_ADC_RAND_LFSR 0x04 /* Clock LFSR */ +#define HAL_ADC_RAND_SEED 0x08 /* Seed Modulator */ +#define HAL_ADC_RAND_STOP 0x0c /* Stop Random Generator */ +#define HAL_ADC_RAND_BITS 0x0c /* Bits [3:2] */ + +#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */ +#define HAL_ADC_DEC_128 0x10 /* Decimate by 128 : 10-bit resolution */ +#define HAL_ADC_DEC_256 0x20 /* Decimate by 256 : 12-bit resolution */ +#define HAL_ADC_DEC_512 0x30 /* Decimate by 512 : 14-bit resolution */ +#define HAL_ADC_DEC_BITS 0x30 /* Bits [5:4] */ + +#define HAL_ADC_STSEL HAL_ADC_STSEL_ST +#define HAL_ADC_RAND_GEN HAL_ADC_RAND_STOP +#define HAL_ADC_REF_VOLT HAL_ADC_REF_AVDD +#define HAL_ADC_DEC_RATE HAL_ADC_DEC_064 +#define HAL_ADC_SCHN HAL_ADC_CHN_VDD3 +#define HAL_ADC_ECHN HAL_ADC_CHN_GND + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +#if (HAL_ADC == TRUE) +static uint8 adcRef; +#endif + +/************************************************************************************************** + * @fn HalAdcInit + * + * @brief Initialize ADC Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalAdcInit (void) +{ +#if (HAL_ADC == TRUE) + adcRef = HAL_ADC_REF_VOLT; +#endif +} + +/************************************************************************************************** + * @fn HalAdcRead + * + * @brief Read the ADC based on given channel and resolution + * + * @param channel - channel where ADC will be read + * @param resolution - the resolution of the value + * + * @return 16 bit value of the ADC in offset binary format. + * + * Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale. + * Note2: This function assumes that ADCCON3 contains the voltage reference. + **************************************************************************************************/ +uint16 HalAdcRead (uint8 channel, uint8 resolution) +{ + int16 reading = 0; + +#if (HAL_ADC == TRUE) + uint8 i, resbits; + uint8 adcChannel = 1; + + /* + * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled. The code + * does NOT disable the pin at the end of this function. I think it is better to leave the pin + * enabled because the results will be more accurate. Because of the inherent capacitance on the + * pin, it takes time for the voltage on the pin to charge up to its steady-state level. If + * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage + * than actuality because the pin did not have time to fully charge. + */ + if (channel < 8) + { + for (i=0; i < channel; i++) + { + adcChannel <<= 1; + } + } + + /* Enable channel */ + ADCCFG |= adcChannel; + + /* Convert resolution to decimation rate */ + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + resbits = HAL_ADC_DEC_064; + break; + case HAL_ADC_RESOLUTION_10: + resbits = HAL_ADC_DEC_128; + break; + case HAL_ADC_RESOLUTION_12: + resbits = HAL_ADC_DEC_256; + break; + case HAL_ADC_RESOLUTION_14: + default: + resbits = HAL_ADC_DEC_512; + break; + } + + /* writing to this register starts the extra conversion */ + ADCCON3 = channel | resbits | adcRef; + + /* Wait for the conversion to be done */ + while (!(ADCCON1 & HAL_ADC_EOC)); + + /* Disable channel after done conversion */ + ADCCFG &= (adcChannel ^ 0xFF); + + /* Read the result */ + reading = (int16) (ADCL); + reading |= (int16) (ADCH << 8); + + /* Treat small negative as 0 */ + if (reading < 0) + reading = 0; + + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + reading >>= 8; + break; + case HAL_ADC_RESOLUTION_10: + reading >>= 6; + break; + case HAL_ADC_RESOLUTION_12: + reading >>= 4; + break; + case HAL_ADC_RESOLUTION_14: + default: + reading >>= 2; + break; + } +#else + // unused arguments + (void) channel; + (void) resolution; +#endif + + return ((uint16)reading); +} + +/************************************************************************************************** + * @fn HalAdcSetReference + * + * @brief Sets the reference voltage for the ADC and initializes the service + * + * @param reference - the reference voltage to be used by the ADC + * + * @return none + * + **************************************************************************************************/ +void HalAdcSetReference ( uint8 reference ) +{ +#if (HAL_ADC == TRUE) + adcRef = reference; +#endif +} + +/********************************************************************* + * @fn HalAdcCheckVdd + * + * @brief Check for minimum Vdd specified. + * + * @param vdd - The board-specific Vdd reading to check for. + * + * @return TRUE if the Vdd measured is greater than the 'vdd' minimum parameter; + * FALSE if not. + * + *********************************************************************/ +bool HalAdcCheckVdd(uint8 vdd) +{ + ADCCON3 = 0x0F; + while (!(ADCCON1 & 0x80)); + return (ADCH > vdd); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_board_cfg.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_board_cfg.h new file mode 100644 index 0000000..7887ed3 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_board_cfg.h @@ -0,0 +1,461 @@ +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2012-09-07 14:26:14 -0700 (Fri, 07 Sep 2012) $ + Revision: $Revision: 31498 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" + +/* Board Identifier */ + +#if !defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_BOARD_CC2530EB_REV13) + #define HAL_BOARD_CC2530EB_REV17 +#endif + +/* Clock Speed */ + +#define HAL_CPU_CLOCK_MHZ 32 + +/* Sleep Clock */ + +#define EXTERNAL_CRYSTAL_OSC 0x00 // external 32kHz XOSC +#define INTERNAL_RC_OSC 0x80 // internal 32kHz RCOSC + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. +#if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == TRUE)) +#define OSC_32KHZ EXTERNAL_CRYSTAL_OSC +#else +#define OSC_32KHZ INTERNAL_RC_OSC +#endif + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LED Configuration */ + +#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590) + #define HAL_NUM_LEDS 3 +#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590) + #define HAL_NUM_LEDS 1 +#else + #error Unknown Board Indentifier +#endif + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P1_0 +#define LED1_DDR P1DIR +#define LED1_POLARITY ACTIVE_HIGH + +#ifdef HAL_BOARD_CC2530EB_REV17 + /* 2 - Red */ + #define LED2_BV BV(1) + #define LED2_SBIT P1_1 + #define LED2_DDR P1DIR + #define LED2_POLARITY ACTIVE_HIGH + + /* 3 - Yellow */ + #define LED3_BV BV(4) + #define LED3_SBIT P1_4 + #define LED3_DDR P1DIR + #define LED3_POLARITY ACTIVE_HIGH +#endif + +/* Push Button Configuration */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* S1 */ +#define PUSH1_BV BV(1) +#define PUSH1_SBIT P0_1 + +#ifdef HAL_BOARD_CC2530EB_REV17 + #define PUSH1_POLARITY ACTIVE_HIGH +#elif defined (HAL_BOARD_CC2530EB_REV13) + #define PUSH1_POLARITY ACTIVE_LOW +#else + #error Unknown Board Indentifier +#endif + +/* Joystick Center Press */ +#define PUSH2_BV BV(0) +#define PUSH2_SBIT P2_0 +#define PUSH2_POLARITY ACTIVE_HIGH + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 + +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_PHYS 2048 + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. +#define HAL_FLASH_PAGE_SIZE HAL_FLASH_PAGE_PHYS +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +#define HAL_FLASH_LOCK_BITS 16 + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_NV_PAGE_END 30 +#elif defined HAL_BOARD_CC2541S +#define HAL_NV_PAGE_END 125 +#else +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 +#define VDD_2_0 74 // 2.0 V required to safely read/write internal flash. +#define VDD_2_7 100 // 2.7 V required for the Numonyx device. + +#define VDD_MIN_RUN VDD_2_0 +#define VDD_MIN_NV (VDD_2_0+4) // 5% margin over minimum to survive a page erase and compaction. +#define VDD_MIN_XNV (VDD_2_7+5) // 5% margin over minimum to survive a page erase and compaction. + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} + +/* Board Initialization */ +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} + +/* Debounce */ +#define HAL_DEBOUNCE(expr) { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } } + +/* ----------- Push Buttons ---------- */ +#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) +#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) +#define HAL_PUSH_BUTTON3() (0) +#define HAL_PUSH_BUTTON4() (0) +#define HAL_PUSH_BUTTON5() (0) +#define HAL_PUSH_BUTTON6() (0) + +/* LED's */ + +#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590) + + #define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) + #define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) + #define HAL_TURN_OFF_LED3() st( LED3_SBIT = LED3_POLARITY (0); ) + #define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1() + + #define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) + #define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) + #define HAL_TURN_ON_LED3() st( LED3_SBIT = LED3_POLARITY (1); ) + #define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1() + + #define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) + #define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) + #define HAL_TOGGLE_LED3() st( if (LED3_SBIT) { LED3_SBIT = 0; } else { LED3_SBIT = 1;} ) + #define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1() + + #define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) + #define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) + #define HAL_STATE_LED3() (LED3_POLARITY (LED3_SBIT)) + #define HAL_STATE_LED4() HAL_STATE_LED1() + +#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590) + + #define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) + #define HAL_TURN_OFF_LED2() HAL_TURN_OFF_LED1() + #define HAL_TURN_OFF_LED3() HAL_TURN_OFF_LED1() + #define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1() + + #define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) + #define HAL_TURN_ON_LED2() HAL_TURN_ON_LED1() + #define HAL_TURN_ON_LED3() HAL_TURN_ON_LED1() + #define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1() + + #define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) + #define HAL_TOGGLE_LED2() HAL_TOGGLE_LED1() + #define HAL_TOGGLE_LED3() HAL_TOGGLE_LED1() + #define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1() + + #define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) + #define HAL_STATE_LED2() HAL_STATE_LED1() + #define HAL_STATE_LED3() HAL_STATE_LED1() + #define HAL_STATE_LED4() HAL_STATE_LED1() + +#endif + +/* XNV */ + +#define XNV_SPI_BEGIN() st(P1_3 = 0;) +#define XNV_SPI_TX(x) st(U1CSR &= ~0x02; U1DBUF = (x);) +#define XNV_SPI_RX() U1DBUF +#define XNV_SPI_WAIT_RXRDY() st(while (!(U1CSR & 0x02));) +#define XNV_SPI_END() st(P1_3 = 1;) + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#define XNV_SPI_INIT() \ +st( \ + /* Mode select UART1 SPI Mode as master. */\ + U1CSR = 0; \ + \ + /* Setup for 115200 baud. */\ + U1GCR = 11; \ + U1BAUD = 216; \ + \ + /* Set bit order to MSB */\ + U1GCR |= BV(5); \ + \ + /* Set UART1 I/O to alternate 2 location on P1 pins. */\ + PERCFG |= 0x02; /* U1CFG */\ + \ + /* Select peripheral function on I/O pins but SS is left as GPIO for separate control. */\ + P1SEL |= 0xE0; /* SELP1_[7:4] */\ + /* P1.1,2,3: reset, LCD CS, XNV CS. */\ + P1SEL &= ~0x0E; \ + P1 |= 0x0E; \ + P1_1 = 0; \ + P1DIR |= 0x0E; \ + \ + /* Give UART1 priority over Timer3. */\ + P2SEL &= ~0x20; /* PRI2P1 */\ + \ + /* When SPI config is complete, enable it. */\ + U1CSR |= 0x40; \ + /* Release XNV reset. */\ + P1_1 = 1; \ +) + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC TRUE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES TRUE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA TRUE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD TRUE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + +/* Set to TRUE enable UART usage, FALSE disable it */ +#ifndef HAL_UART +#if (defined ZAPP_P1) || (defined ZAPP_P2) || (defined ZTOOL_P1) || (defined ZTOOL_P2) +#define HAL_UART TRUE +#else +#define HAL_UART FALSE +#endif +#endif + +#if HAL_UART +// Always prefer to use DMA over ISR. +#if HAL_DMA + #ifndef HAL_UART_DMA + #if (defined ZAPP_P1) || (defined ZTOOL_P1) + #define HAL_UART_DMA 1 + #elif (defined ZAPP_P2) || (defined ZTOOL_P2) + #define HAL_UART_DMA 2 + #else + #define HAL_UART_DMA 1 + #endif + #endif + #ifndef HAL_UART_ISR + #define HAL_UART_ISR 0 + #endif +#else + #ifndef HAL_UART_ISR + #if (defined ZAPP_P1) || (defined ZTOOL_P1) + #define HAL_UART_ISR 1 + #elif (defined ZAPP_P2) || (defined ZTOOL_P2) + #define HAL_UART_ISR 2 + #else + #define HAL_UART_ISR 1 + #endif + #endif + #ifndef HAL_UART_DMA + #define HAL_UART_DMA 0 + #endif +#endif + +// Used to set P2 priority - USART0 over USART1 if both are defined. +#if ((HAL_UART_DMA == 1) || (HAL_UART_ISR == 1)) +#define HAL_UART_PRIPO 0x00 +#else +#define HAL_UART_PRIPO 0x40 +#endif + +#else +#define HAL_UART_DMA 0 +#define HAL_UART_ISR 0 +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 0 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BOARD_CFG_H */ + +/******************************************************************************* +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_flash.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_key.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_key.c new file mode 100644 index 0000000..365669d --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_key.c @@ -0,0 +1,653 @@ +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-12-06 14:00:35 -0800 (Thu, 06 Dec 2012) $ + Revision: $Revision: 32474 $ + + Description: This file contains the interface to the HAL KEY Service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +/********************************************************************* + NOTE: If polling is used, the hal_driver task schedules the KeyRead() + to occur every 100ms. This should be long enough to naturally + debounce the keys. The KeyRead() function remembers the key + state of the previous poll and will only return a non-zero + value if the key state changes. + + NOTE: If interrupts are used, the KeyRead() function is scheduled + 25ms after the interrupt occurs by the ISR. This delay is used + for key debouncing. The ISR disables any further Key interrupt + until KeyRead() is executed. KeyRead() will re-enable Key + interrupts after executing. Unlike polling, when interrupts + are enabled, the previous key state is not remembered. This + means that KeyRead() will return the current state of the keys + (not a change in state of the keys). + + NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by + the ISR. Therefore, the joystick movements will only be detected + during a pushbutton interrupt caused by S1 or the center joystick + pushbutton. + + NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally + high state to a low state. This transition is typically clean. The + duration of the low state is around 200ms. When the signal returns + to the high state, there is a high likelihood of signal bounce, which + causes a unwanted interrupts. Normally, we would set the interrupt + edge to falling edge to generate an interrupt when S1 is pushed, but + because of the signal bounce, it is better to set the edge to rising + edge to generate an interrupt when S1 is released. The debounce logic + can then filter out the signal bounce. The result is that we typically + get only 1 interrupt per button push. This mechanism is not totally + foolproof because occasionally, signal bound occurs during the falling + edge as well. A similar mechanism is used to handle the joystick + pushbutton on the DB. For the EB, we do not have independent control + of the interrupt edge for the S1 and center joystick pushbutton. As + a result, only one or the other pushbuttons work reasonably well with + interrupts. The default is the make the S1 switch on the EB work more + reliably. + +*********************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_key.h" +#include "osal.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_KEY_RISING_EDGE 0 +#define HAL_KEY_FALLING_EDGE 1 + +#define HAL_KEY_DEBOUNCE_VALUE 25 + +/* CPU port interrupt */ +#define HAL_KEY_CPU_PORT_0_IF P0IF +#define HAL_KEY_CPU_PORT_2_IF P2IF + +#if defined ( CC2540_MINIDK ) +/* SW_1 is at P0.0 */ +#define HAL_KEY_SW_1_PORT P0 +#define HAL_KEY_SW_1_BIT BV(0) +#define HAL_KEY_SW_1_SEL P0SEL +#define HAL_KEY_SW_1_DIR P0DIR + +/* SW_2 is at P0.1 */ +#define HAL_KEY_SW_2_PORT P0 +#define HAL_KEY_SW_2_BIT BV(1) +#define HAL_KEY_SW_2_SEL P0SEL +#define HAL_KEY_SW_2_DIR P0DIR + +#define HAL_KEY_SW_1_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_1_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_1_ICTLBIT BV(0) /* P0IEN - P0.0 enable/disable bit */ +#define HAL_KEY_SW_1_IENBIT BV(5) /* Mask bit for all of Port_0 */ + +#define HAL_KEY_SW_1_PXIFG P0IFG /* Interrupt flag at source */ +#define HAL_KEY_SW_2_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_2_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_2_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */ +#define HAL_KEY_SW_2_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_2_PXIFG P0IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_1_EDGEBIT BV(0) + +#else + +/* SW_6 is at P0.1 */ +#define HAL_KEY_SW_6_PORT P0 +#define HAL_KEY_SW_6_BIT BV(1) +#define HAL_KEY_SW_6_SEL P0SEL +#define HAL_KEY_SW_6_DIR P0DIR + +/* edge interrupt */ +#define HAL_KEY_SW_6_EDGEBIT BV(0) +#define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE + +/* SW_6 interrupts */ +#define HAL_KEY_SW_6_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_6_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_6_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_6_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */ +#define HAL_KEY_SW_6_PXIFG P0IFG /* Interrupt flag at source */ + +/* Joy stick move at P2.0 */ +#define HAL_KEY_JOY_MOVE_PORT P2 +#define HAL_KEY_JOY_MOVE_BIT BV(0) +#define HAL_KEY_JOY_MOVE_SEL P2SEL +#define HAL_KEY_JOY_MOVE_DIR P2DIR + +/* edge interrupt */ +#define HAL_KEY_JOY_MOVE_EDGEBIT BV(3) +#define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE + +/* Joy move interrupts */ +#define HAL_KEY_JOY_MOVE_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_JOY_MOVE_IENBIT BV(1) /* Mask bit for all of Port_2 */ +#define HAL_KEY_JOY_MOVE_ICTL P2IEN /* Port Interrupt Control register */ +#define HAL_KEY_JOY_MOVE_ICTLBIT BV(0) /* P2IENL - P2.0<->P2.3 enable/disable bit */ +#define HAL_KEY_JOY_MOVE_PXIFG P2IFG /* Interrupt flag at source */ + +#define HAL_KEY_JOY_CHN HAL_ADC_CHANNEL_6 + +#endif + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +static uint8 halKeySavedKeys; /* used to store previous key state in polling mode */ +static halKeyCBack_t pHalKeyProcessFunction; +static uint8 HalKeyConfigured; +bool Hal_KeyIntEnable; /* interrupt enable/disable flag */ + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +void halProcessKeyInterrupt(void); +uint8 halGetJoyKeyInput(void); + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalKeyInit + * + * @brief Initilize Key Service + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalKeyInit( void ) +{ + halKeySavedKeys = 0; // Initialize previous key to 0. + +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */ + HAL_KEY_SW_2_SEL &= ~(HAL_KEY_SW_2_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_2_DIR &= ~(HAL_KEY_SW_2_BIT); /* Set pin direction to Input */ +#else + HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT); /* Set pin direction to Input */ + HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO */ + HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to Input */ + + P2INP |= PUSH2_BV; /* Configure GPIO tri-state. */ +#endif + + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + /* Start with key is not configured */ + HalKeyConfigured = FALSE; +} + + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief Configure the Key serivce + * + * @param interruptEnable - TRUE/FALSE, enable/disable interrupt + * cback - pointer to the CallBack function + * + * @return None + **************************************************************************************************/ +void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) +{ + /* Enable/Disable Interrupt or */ + Hal_KeyIntEnable = interruptEnable; + + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + + /* Determine if interrupt is enable or not */ + if (Hal_KeyIntEnable) + { +#if defined ( CC2540_MINIDK ) + /* Rising/Falling edge configuratinn */ + PICTL |= HAL_KEY_SW_1_EDGEBIT; /* Set the edge bit to set falling edge to give int */ + + HAL_KEY_SW_1_ICTL |= HAL_KEY_SW_1_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_1_IEN |= HAL_KEY_SW_1_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear any pending interrupt */ + HAL_KEY_SW_2_ICTL |= HAL_KEY_SW_2_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_2_IEN |= HAL_KEY_SW_2_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear any pending interrupt */ + +#else + /* Rising/Falling edge configuratinn */ + PICTL &= ~(HAL_KEY_SW_6_EDGEBIT); /* Clear the edge bit */ + /* For falling edge, the bit must be set. */ + #if (HAL_KEY_SW_6_EDGE == HAL_KEY_FALLING_EDGE) + PICTL |= HAL_KEY_SW_6_EDGEBIT; + #endif + + + /* Interrupt configuration: + * - Enable interrupt generation at the port + * - Enable CPU interrupt + * - Clear any pending interrupt + */ + HAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT; + HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT; + HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); + + + + /* Rising/Falling edge configuratinn */ + + HAL_KEY_JOY_MOVE_ICTL &= ~(HAL_KEY_JOY_MOVE_EDGEBIT); /* Clear the edge bit */ + /* For falling edge, the bit must be set. */ + #if (HAL_KEY_JOY_MOVE_EDGE == HAL_KEY_FALLING_EDGE) + HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_EDGEBIT; + #endif + + + /* Interrupt configuration: + * - Enable interrupt generation at the port + * - Enable CPU interrupt + * - Clear any pending interrupt + */ + HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_ICTLBIT; + HAL_KEY_JOY_MOVE_IEN |= HAL_KEY_JOY_MOVE_IENBIT; + HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); +#endif // !CC2540_MINIDK + + /* Do this only after the hal_key is configured - to work with sleep stuff */ + if (HalKeyConfigured == TRUE) + { + osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */ + } + } + else /* Interrupts NOT enabled */ + { +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_ICTL &= ~(HAL_KEY_SW_1_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_1_IEN &= ~(HAL_KEY_SW_1_IENBIT); /* Clear interrupt enable bit */ + HAL_KEY_SW_2_ICTL &= ~(HAL_KEY_SW_2_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_2_IEN &= ~(HAL_KEY_SW_2_IENBIT); /* Clear interrupt enable bit */ +#else + HAL_KEY_SW_6_ICTL &= ~(HAL_KEY_SW_6_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_6_IEN &= ~(HAL_KEY_SW_6_IENBIT); /* Clear interrupt enable bit */ +#endif // !CC2540_MINIDK + + osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + /* Key now is configured */ + HalKeyConfigured = TRUE; +} + + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief Read the current value of a key + * + * @param None + * + * @return keys - current keys status + **************************************************************************************************/ +uint8 HalKeyRead ( void ) +{ + uint8 keys = 0; + +#if defined (CC2540_MINIDK) + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } +#else +#ifdef HAL_BOARD_CC2530EB_REV17 + if ( (HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active high */ +#elif defined (HAL_BOARD_CC2530EB_REV13) + if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active low */ +#endif + { + keys |= HAL_KEY_SW_6; + } + + if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active low */ + { + keys |= halGetJoyKeyInput(); + } +#endif + return keys; +} + + +/************************************************************************************************** + * @fn HalKeyPoll + * + * @brief Called by hal_driver to poll the keys + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalKeyPoll (void) +{ + uint8 keys = 0; + uint8 notify = 0; +#if defined (CC2540_MINIDK) + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } +#else + if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_6; + } + + if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */ + { + keys = halGetJoyKeyInput(); + } +#endif + + /* If interrupts are not enabled, previous key status and current key status + * are compared to find out if a key has changed status. + */ + if (!Hal_KeyIntEnable) + { + if (keys == halKeySavedKeys) + { + /* Exit - since no keys have changed */ + return; + } + else + { + notify = 1; + } + } + else + { + /* Key interrupt handled here */ + if (keys) + { + notify = 1; + } + } + + /* Store the current keys for comparation next time */ + halKeySavedKeys = keys; + + /* Invoke Callback if new keys were depressed */ + if (notify && (pHalKeyProcessFunction)) + { + (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); + + } +} + +#if !defined ( CC2540_MINIDK ) +/************************************************************************************************** + * @fn halGetJoyKeyInput + * + * @brief Map the ADC value to its corresponding key. + * + * @param None + * + * @return keys - current joy key status + **************************************************************************************************/ +uint8 halGetJoyKeyInput(void) +{ + /* The joystick control is encoded as an analog voltage. + * Read the JOY_LEVEL analog value and map it to joy movement. + */ + uint8 adc; + uint8 ksave0 = 0; + uint8 ksave1; + + /* Keep on reading the ADC until two consecutive key decisions are the same. */ + do + { + ksave1 = ksave0; /* save previouse key reading */ + + adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8); + + if ((adc >= 2) && (adc <= 38)) + { + ksave0 |= HAL_KEY_UP; + } + else if ((adc >= 74) && (adc <= 88)) + { + ksave0 |= HAL_KEY_RIGHT; + } + else if ((adc >= 60) && (adc <= 73)) + { + ksave0 |= HAL_KEY_LEFT; + } + else if ((adc >= 39) && (adc <= 59)) + { + ksave0 |= HAL_KEY_DOWN; + } + else if ((adc >= 89) && (adc <= 100)) + { + ksave0 |= HAL_KEY_CENTER; + } + } while (ksave0 != ksave1); + + return ksave0; +} +#endif + +/************************************************************************************************** + * @fn halProcessKeyInterrupt + * + * @brief Checks to see if it's a valid key interrupt, saves interrupt driven key states for + * processing by HalKeyRead(), and debounces keys by scheduling HalKeyRead() 25ms later. + * + * @param + * + * @return + **************************************************************************************************/ +void halProcessKeyInterrupt (void) +{ + bool valid=FALSE; + +#if defined ( CC2540_MINIDK ) + if( HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) /* Interrupt Flag has been set by SW1 */ + { + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) /* Interrupt Flag has been set by SW2 */ + { + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } +#else + if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) /* Interrupt Flag has been set */ + { + HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT) /* Interrupt Flag has been set */ + { + HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } +#endif + if (valid) + { + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); + } +} + +/************************************************************************************************** + * @fn HalKeyEnterSleep + * + * @brief - Get called to enter sleep mode + * + * @param + * + * @return + **************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** + * @fn HalKeyExitSleep + * + * @brief - Get called when sleep is over + * + * @param + * + * @return - return saved keys + **************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +/*************************************************************************************************** + * INTERRUPT SERVICE ROUTINE + ***************************************************************************************************/ + +/************************************************************************************************** + * @fn halKeyPort0Isr + * + * @brief Port0 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) +{ + HAL_ENTER_ISR(); + +#if defined ( CC2540_MINIDK ) + if ((HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) || (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT)) +#else + if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) +#endif + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_0 + PxIFG has to be cleared before PxIF + */ +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_PXIFG = 0; + HAL_KEY_SW_2_PXIFG = 0; +#else + HAL_KEY_SW_6_PXIFG = 0; +#endif + HAL_KEY_CPU_PORT_0_IF = 0; + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +#if !defined ( CC2540_MINIDK ) +/************************************************************************************************** + * @fn halKeyPort2Isr + * + * @brief Port2 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT) + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_2 + PxIFG has to be cleared before PxIF + Notes: P2_1 and P2_2 are debug lines. + */ + HAL_KEY_JOY_MOVE_PXIFG = 0; + HAL_KEY_CPU_PORT_2_IF = 0; + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} +#endif +#else + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_lcd.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_lcd.c new file mode 100644 index 0000000..b29acf3 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_lcd.c @@ -0,0 +1,767 @@ +/************************************************************************************************** + Filename: hal_lcd.c + Revised: $Date: 2012-08-03 14:28:46 -0700 (Fri, 03 Aug 2012) $ + Revision: $Revision: 31092 $ + + Description: This file contains the interface to the HAL LCD Service. + + + Copyright 2007 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "hal_lcd.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "hal_assert.h" + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + #include "DebugTrace.h" +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +/* + LCD pins + + //control + P0.0 - LCD_MODE + P1.1 - LCD_FLASH_RESET + P1.2 - LCD_CS + + //spi + P1.5 - CLK + P1.6 - MOSI + P1.7 - MISO +*/ + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LCD Control lines */ +#define HAL_LCD_MODE_PORT 0 +#define HAL_LCD_MODE_PIN 0 + +#define HAL_LCD_RESET_PORT 1 +#define HAL_LCD_RESET_PIN 1 + +#define HAL_LCD_CS_PORT 1 +#define HAL_LCD_CS_PIN 2 + +/* LCD SPI lines */ +#define HAL_LCD_CLK_PORT 1 +#define HAL_LCD_CLK_PIN 5 + +#define HAL_LCD_MOSI_PORT 1 +#define HAL_LCD_MOSI_PIN 6 + +#define HAL_LCD_MISO_PORT 1 +#define HAL_LCD_MISO_PIN 7 + +/* SPI settings */ +#define HAL_SPI_CLOCK_POL_LO 0x00 +#define HAL_SPI_CLOCK_PHA_0 0x00 +#define HAL_SPI_TRANSFER_MSB_FIRST 0x20 + +/* LCD lines */ +#define LCD_MAX_LINE_COUNT 3 + +/* Defines for HW LCD */ + +/* Set power save mode */ +#define OSC_OFF 0x00 +#define OSC_ON 0x01 +#define POWER_SAVE_OFF 0x00 +#define POWER_SAVE_ON 0x02 +#define SET_POWER_SAVE_MODE(options) HalLcd_HW_Control(0x0C | (options)) + +/* Function Set */ +#define CGROM 0x00 +#define CGRAM 0x01 +#define COM_FORWARD 0x00 +#define COM_BACKWARD 0x02 +#define TWO_LINE 0x00 +#define THREE_LINE 0x04 +#define FUNCTION_SET(options) HalLcd_HW_Control(0x10 | (options)) + +/* Set Display Start Line */ +#define LINE1 0x00 +#define LINE2 0x01 +#define LINE3 0x02 +#define LINE4 0x03 +#define SET_DISPLAY_START_LINE(line) HalLcd_HW_Control(0x18 | (line)) + +/* Bias control */ +#define BIAS_1_5 0x00 +#define BIAS_1_4 0x01 +#define SET_BIAS_CTRL(bias) HalLcd_HW_Control(0x1C | (bias)) + +/* Power control */ +#define VOLTAGE_DIVIDER_OFF 0x00 +#define VOLTAGE_DIVIDER_ON 0x01 +#define CONVERTER_AND_REG_OFF 0x00 +#define CONVERTER_AND_REG_ON 0x04 +#define SET_POWER_CTRL(options) HalLcd_HW_Control(0x20 | (options)) + +// Set display control +#define DISPLAY_CTRL_ON 0x01 +#define DISPLAY_CTRL_OFF 0x00 +#define DISPLAY_CTRL_BLINK_ON 0x02 +#define DISPLAY_CTRL_BLINK_OFF 0x00 +#define DISPLAY_CTRL_CURSOR_ON 0x04 +#define DISPLAY_CTRL_CURSOR_OFF 0x00 +#define SET_DISPLAY_CTRL(options) HalLcd_HW_Control(0x28 | (options)) + +/* Set DD/ CGRAM address */ +#define SET_DDRAM_ADDR(charIndex) HalLcd_HW_Control(0x80 | (charIndex)) +#define SET_GCRAM_CHAR(specIndex) HalLcd_HW_Control(0xC0 | (specIndex)) + +/* Set ICONRAM address */ +#define CONTRAST_CTRL_REGISTER 0x10 +#define SET_ICONRAM_ADDR(addr) HalLcd_HW_Control(0x40 | (addr)) + +/* Set double height */ +#define LINE_1_AND_2 0x01 +#define LINE_2_AND_3 0x02 +#define NORMAL_DISPLAY 0x00 +#define SET_DOUBLE_HEIGHT(options) HalLcd_HW_Control(0x08 | (options)) + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val) +#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) + +#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) +#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define HAL_CONFIG_IO_PERIPHERAL(port, pin) HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) +#define HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + + + +/* SPI interface control */ +#define LCD_SPI_BEGIN() HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 0); /* chip select */ +#define LCD_SPI_END() \ +{ \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); /* chip select */ \ +} +/* clear the received and transmit byte status, write tx data to buffer, wait till transmit done */ +#define LCD_SPI_TX(x) { U1CSR &= ~(BV(2) | BV(1)); U1DBUF = x; while( !(U1CSR & BV(1)) ); } +#define LCD_SPI_WAIT_RXRDY() { while(!(U1CSR & BV(1))); } + + +/* Control macros */ +#define LCD_DO_WRITE() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); +#define LCD_DO_CONTROL() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 0); + +#define LCD_ACTIVATE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0); +#define LCD_RELEASE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +static uint8 *Lcd_Line1; +#endif //LCD + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +void HalLcd_HW_Init(void); +void HalLcd_HW_WaitUs(uint16 i); +void HalLcd_HW_Clear(void); +void HalLcd_HW_ClearAllSpecChars(void); +void HalLcd_HW_Control(uint8 cmd); +void HalLcd_HW_Write(uint8 data); +void HalLcd_HW_SetContrast(uint8 value); +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text); +void HalLcd_HW_WriteLine(uint8 line, const char *pText); +#endif //LCD + +/************************************************************************************************** + * @fn HalLcdInit + * + * @brief Initilize LCD Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcdInit(void) +{ +#if (HAL_LCD == TRUE) + Lcd_Line1 = NULL; + HalLcd_HW_Init(); +#endif +} + +/************************************************************************************************* + * LCD EMULATION FUNCTIONS + * + * Some evaluation boards are equipped with Liquid Crystal Displays + * (LCD) which may be used to display diagnostic information. These + * functions provide LCD emulation, sending the diagnostic strings + * to Z-Tool via the RS232 serial port. These functions are enabled + * when the "LCD_SUPPORTED" compiler flag is placed in the makefile. + * + * Most applications update both lines (1 and 2) of the LCD whenever + * text is posted to the device. This emulator assumes that line 1 is + * updated first (saved locally) and the formatting and send operation + * is triggered by receipt of line 2. Nothing will be transmitted if + * only line 1 is updated. + * + *************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalLcdWriteString + * + * @brief Write a string to the LCD + * + * @param str - pointer to the string that will be displayed + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteString ( char *str, uint8 option) +{ +#if (HAL_LCD == TRUE) + + uint8 strLen = 0; + uint8 totalLen = 0; + uint8 *buf; + uint8 tmpLen; + + if ( Lcd_Line1 == NULL ) + { + Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 ); + HalLcdWriteString( "Texas Instruments", 1 ); + } + + strLen = (uint8)osal_strlen( (char*)str ); + + /* Check boundries */ + if ( strLen > HAL_LCD_MAX_CHARS ) + strLen = HAL_LCD_MAX_CHARS; + + if ( option == HAL_LCD_LINE_1 ) + { + /* Line 1 gets saved for later */ + osal_memcpy( Lcd_Line1, str, strLen ); + Lcd_Line1[strLen] = '\0'; + } + else + { + /* Line 2 triggers action */ + tmpLen = (uint8)osal_strlen( (char*)Lcd_Line1 ); + totalLen = tmpLen + 1 + strLen + 1; + buf = osal_mem_alloc( totalLen ); + if ( buf != NULL ) + { + /* Concatenate strings */ + osal_memcpy( buf, Lcd_Line1, tmpLen ); + buf[tmpLen++] = ' '; + osal_memcpy( &buf[tmpLen], str, strLen ); + buf[tmpLen+strLen] = '\0'; + + /* Send it out */ +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + +#if defined(SERIAL_DEBUG_SUPPORTED) + debug_str( (uint8*)buf ); +#endif //LCD_SUPPORTED + +#endif //ZTOOL_P1 + + /* Free mem */ + osal_mem_free( buf ); + } + } + + /* Display the string */ + HalLcd_HW_WriteLine (option, str); + +#endif //HAL_LCD + +} + +/************************************************************************************************** + * @fn HalLcdWriteValue + * + * @brief Write a value to the LCD + * + * @param value - value that will be displayed + * radix - 8, 10, 16 + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option) +{ +#if (HAL_LCD == TRUE) + uint8 buf[HAL_LCD_MAX_BUFF]; + + _ltoa( value, &buf[0], radix ); + HalLcdWriteString( (char*)buf, option ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteScreen + * + * @brief Write a value to the LCD + * + * @param line1 - string that will be displayed on line 1 + * line2 - string that will be displayed on line 2 + * + * @return None + **************************************************************************************************/ +void HalLcdWriteScreen( char *line1, char *line2 ) +{ +#if (HAL_LCD == TRUE) + HalLcdWriteString( line1, 1 ); + HalLcdWriteString( line2, 2 ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value - value + * format - redix + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ) +{ +#if (HAL_LCD == TRUE) + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen] = ' '; + err = (uint32)(value); + _ltoa( err, &buf[tmpLen+1], format ); + HalLcdWriteString( (char*)buf, line ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value1 - value #1 + * format1 - redix of value #1 + * value2 - value #2 + * format2 - redix of value #2 + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, + uint16 value2, uint8 format2, uint8 line ) +{ + +#if (HAL_LCD == TRUE) + + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + if ( tmpLen ) + { + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen++] = ' '; + } + + err = (uint32)(value1); + _ltoa( err, &buf[tmpLen], format1 ); + tmpLen = (uint8)osal_strlen( (char*)buf ); + + buf[tmpLen++] = ','; + buf[tmpLen++] = ' '; + err = (uint32)(value2); + _ltoa( err, &buf[tmpLen], format2 ); + + HalLcdWriteString( (char *)buf, line ); + +#endif +} + +/************************************************************************************************** + * @fn HalLcdDisplayPercentBar + * + * @brief Display percentage bar on the LCD + * + * @param title - + * value - + * + * @return None + **************************************************************************************************/ +void HalLcdDisplayPercentBar( char *title, uint8 value ) +{ +#if (HAL_LCD == TRUE) + + uint8 percent; + uint8 leftOver; + uint8 buf[17]; + uint32 err; + uint8 x; + + /* Write the title: */ + HalLcdWriteString( title, HAL_LCD_LINE_1 ); + + if ( value > 100 ) + value = 100; + + /* convert to blocks */ + percent = (uint8)(value / 10); + leftOver = (uint8)(value % 10); + + /* Make window */ + osal_memcpy( buf, "[ ] ", 15 ); + + for ( x = 0; x < percent; x ++ ) + { + buf[1+x] = '>'; + } + + if ( leftOver >= 5 ) + buf[1+x] = '+'; + + err = (uint32)value; + _ltoa( err, (uint8*)&buf[13], 10 ); + + HalLcdWriteString( (char*)buf, HAL_LCD_LINE_2 ); + +#endif + +} + + +#if (HAL_LCD == TRUE) +/************************************************************************************************** + * HARDWARE LCD + **************************************************************************************************/ + +/************************************************************************************************** + * @fn halLcd_ConfigIO + * + * @brief Configure IO lines needed for LCD control. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigIO(void) +{ + /* GPIO configuration */ + HAL_CONFIG_IO_OUTPUT(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); +} + +/************************************************************************************************** + * @fn halLcd_ConfigSPI + * + * @brief Configure SPI lines needed for talking to LCD. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigSPI(void) +{ + /* UART/SPI Peripheral configuration */ + + uint8 baud_exponent; + uint8 baud_mantissa; + + /* Set SPI on UART 1 alternative 2 */ + PERCFG |= 0x02; + + /* Configure clk, master out and master in lines */ + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_CLK_PORT, HAL_LCD_CLK_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MOSI_PORT, HAL_LCD_MOSI_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MISO_PORT, HAL_LCD_MISO_PIN); + + + /* Set SPI speed to 1 MHz (the values assume system clk of 32MHz) + * Confirm on board that this results in 1MHz spi clk. + */ + baud_exponent = 15; + baud_mantissa = 0; + + /* Configure SPI */ + U1UCR = 0x80; /* Flush and goto IDLE state. 8-N-1. */ + U1CSR = 0x00; /* SPI mode, master. */ + U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent; + U1BAUD = baud_mantissa; +} + +/************************************************************************************************** + * @fn HalLcd_HW_Init + * + * @brief Initilize HW LCD Driver. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Init(void) +{ + /* Initialize LCD IO lines */ + halLcd_ConfigIO(); + + /* Initialize SPI */ + halLcd_ConfigSPI(); + + /* Perform reset */ + LCD_ACTIVATE_RESET(); + HalLcd_HW_WaitUs(15000); // 15 ms + LCD_RELEASE_RESET(); + HalLcd_HW_WaitUs(15); // 15 us + + /* Perform the initialization sequence */ + FUNCTION_SET(CGRAM | COM_FORWARD | THREE_LINE); + + /* Set contrast */ + HalLcd_HW_SetContrast(15); + + /* Set power */ + SET_POWER_SAVE_MODE(OSC_OFF | POWER_SAVE_ON); + SET_POWER_CTRL(VOLTAGE_DIVIDER_ON | CONVERTER_AND_REG_ON); + SET_BIAS_CTRL(BIAS_1_5); + HalLcd_HW_WaitUs(21000);// 21 ms + + /* Clear the display */ + HalLcd_HW_Clear(); + HalLcd_HW_ClearAllSpecChars(); + SET_DISPLAY_CTRL(DISPLAY_CTRL_ON | DISPLAY_CTRL_BLINK_OFF | DISPLAY_CTRL_CURSOR_OFF); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Control + * + * @brief Write 1 command to the LCD + * + * @param uint8 cmd - command to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Control(uint8 cmd) +{ + LCD_SPI_BEGIN(); + LCD_DO_CONTROL(); + LCD_SPI_TX(cmd); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Write + * + * @brief Write 1 byte to the LCD + * + * @param uint8 data - data to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Write(uint8 data) +{ + LCD_SPI_BEGIN(); + LCD_DO_WRITE(); + LCD_SPI_TX(data); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_SetContrast + * + * @brief Set display contrast + * + * @param uint8 value - contrast value + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_SetContrast(uint8 value) +{ + SET_ICONRAM_ADDR(CONTRAST_CTRL_REGISTER); + HalLcd_HW_Write(value); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Clear + * + * @brief Clear the HW LCD + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Clear(void) +{ + uint8 n; + + SET_DDRAM_ADDR(0x00); + for (n = 0; n < (LCD_MAX_LINE_COUNT * HAL_LCD_MAX_CHARS); n++) + { + HalLcd_HW_Write(' '); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_ClearAllSpecChars + * + * @brief Clear all special chars + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_ClearAllSpecChars(void) +{ + uint8 n = 0; + + SET_GCRAM_CHAR(0); + for (n = 0; n < (8 * 8); n++) + { + HalLcd_HW_Write(0x00); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_WriteChar + * + * @brief Write one char to the display + * + * @param uint8 line - line number that the char will be displayed + * uint8 col - colum where the char will be displayed + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text) +{ + if (col < HAL_LCD_MAX_CHARS) + { + SET_DDRAM_ADDR((line - 1) * HAL_LCD_MAX_CHARS + col); + HalLcd_HW_Write(text); + } + else + { + return; + } +} + +/************************************************************************************************** + * @fn halLcdWriteLine + * + * @brief Write one line on display + * + * @param uint8 line - display line + * char *pText - text buffer to write + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_WriteLine(uint8 line, const char *pText) +{ + uint8 count; + uint8 totalLength = (uint8)osal_strlen( (char *)pText ); + + /* Write the content first */ + for (count=0; countmode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->left = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + // Cancel any overlapping timer for blink events + osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT); + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if ( !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->left--; // Not continuous, reduce count + } + } + else if ( !(sts->left) && !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->mode ^= HAL_LED_MODE_BLINK; // No more blinks + } + else + { + pct = sts->onPct; // Percentage of cycle for on + sts->mode |= HAL_LED_MODE_ON; // Say it's on + HalLedOnOff( led, HAL_LED_MODE_ON ); // Turn it on + } + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + if (leds & HAL_LED_3) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED3(); + } + else + { + HAL_TURN_OFF_LED3(); + } + } + + if (leds & HAL_LED_4) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + HalSleepLedState |= HAL_STATE_LED3() << 2; + HalSleepLedState |= HAL_STATE_LED4() << 3; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_mcu.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_sleep.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_sleep.c new file mode 100644 index 0000000..2c74bd3 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_sleep.c @@ -0,0 +1,602 @@ +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#include "hal_types.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_sleep.h" +#include "hal_led.h" +#include "hal_key.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "hal_drivers.h" +#include "hal_assert.h" +#include "ll_sleep.h" +#include "ll_timer2.h" +#include "ll_math.h" + +/******************************************************************************* + * MACROS + */ + +#ifndef HAL_SLEEP_DEBUG_POWER_MODE +// Set CC2540 power mode; always use PM2. +#define HAL_SLEEP_PREP_POWER_MODE(mode) \ + st( SLEEPCMD &= ~PMODE; /* clear mode bits */ \ + SLEEPCMD |= mode; /* set mode bits */ \ + while (!(STLOAD & LDRDY)); \ + halSleepPconValue = PCON_IDLE; \ + ) +#define HAL_SLEEP_SET_POWER_MODE() \ + halSetSleepMode() + +#else // HAL_SLEEP_DEBUG_POWER_MODE + +// Debug: Don't set power mode, just block until sleep timer interrupt. +#define HAL_SLEEP_PREP_POWER_MODE(mode) /* nothing */ +#define HAL_SLEEP_SET_POWER_MODE() \ + st( while(halSleepInt == FALSE); \ + halSleepInt = FALSE; \ + HAL_DISABLE_INTERRUPTS(); \ + ) +#endif // !HAL_SLEEP_DEBUG_POWER_MODE + +// sleep timer interrupt control +#define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;) // enable sleep timer interrupt +#define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;) // disable sleep timer interrupt +#define HAL_SLEEP_TIMER_CLEAR_INT() st(IRCON &= ~0x80;) // clear sleep interrupt flag + +// backup interrupt enable registers before sleep +#define HAL_SLEEP_IE_BACKUP_AND_DISABLE( ien0, ien1, ien2 ) \ + st( (ien0) = IEN0; \ + (ien1) = IEN1; \ + (ien2) = IEN2; \ + IEN0 &= STIE_BV; \ + IEN1 &= P0IE_BV; \ + IEN2 &= (P1IE_BV|P2IE_BV); \ + ) + +// restore interrupt enable registers before sleep +#define HAL_SLEEP_IE_RESTORE( ien0, ien1, ien2 ) \ + st( IEN0 = (ien0); \ + IEN1 = (ien1); \ + IEN2 = (ien2); \ + ) + +// convert msec to 625 usec units with round +#define HAL_SLEEP_MS_TO_625US( ms ) (((((uint32) (ms)) * 8) + 4) / 5) + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 +#define HAL_SLEEP_MS_TO_32KHZ( ms ) ((((uint32) (ms)) * 4096) / 125) + +//Max 16 bit value +#define MAX_16BIT_TIMEOUT 0xFFFF + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). +#define CC2540_PM0 0 // PM0, Clock oscillators on, voltage regulator on +#define CC2540_PM1 1 // PM1, 32.768 kHz oscillators on, voltage regulator on +#define CC2540_PM2 2 // PM2, 32.768 kHz oscillators on, voltage regulator off +#define CC2540_PM3 3 // PM3, All clock oscillators off, voltage regulator off + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. +#define HAL_SLEEP_OFF CC2540_PM0 +#define HAL_SLEEP_TIMER CC2540_PM2 +#define HAL_SLEEP_DEEP CC2540_PM3 + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms +#define MAX_SLEEP_TIME 16711680 // max time to sleep allowed by ST, in 32kHz ticks + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period +#if !defined (PM_MIN_SLEEP_TIME) +#define PM_MIN_SLEEP_TIME 66 // default to min safe sleep time, in 32kHz ticks +#endif // !PM_MIN_SLEEP_TIME + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). +#if defined( CC2541) || defined( CC2541S ) +#define HAL_SLEEP_ADJ_TICKS 25 // default sleep adjustment, in 32kHz ticks +#else // CC2540 +#define HAL_SLEEP_ADJ_TICKS 35 // default sleep adjustment, in 32kHz ticks +#endif // CC2541 || CC2541S + +// sleep and external interrupt port masks +#define STIE_BV BV(5) +#define P0IE_BV BV(5) +#define P1IE_BV BV(4) +#define P2IE_BV BV(1) + +// for optimized indexing of uint32 +#if HAL_MCU_LITTLE_ENDIAN() +#define UINT32_NDX0 0 +#define UINT32_NDX1 1 +#define UINT32_NDX2 2 +#define UINT32_NDX3 3 +#else +#define UINT32_NDX0 3 +#define UINT32_NDX1 2 +#define UINT32_NDX2 1 +#define UINT32_NDX3 0 +#endif // HAL_MCU_LITTLE_ENDIAN() + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = HAL_SLEEP_OFF; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE +static bool halSleepInt = FALSE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = PCON_IDLE; + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + EA = 0; +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + if (osal_timeout > MAX_16BIT_TIMEOUT) + { + osal_timeout = MAX_16BIT_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_startup.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_timer.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_types.h b/Firmware/Radio/Components/hal/target/CC2540EB/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540EB/hal_uart.c b/Firmware/Radio/Components/hal/target/CC2540EB/hal_uart.c new file mode 100644 index 0000000..37e6d10 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540EB/hal_uart.c @@ -0,0 +1,374 @@ +/************************************************************************************************** + Filename: hal_uart.c + Revised: $Date: 2012-08-01 14:42:41 -0700 (Wed, 01 Aug 2012) $ + Revision: $Revision: 31065 $ + + Description: This file contains the interface to the H/W UART driver. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board_cfg.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#endif + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +void HalUARTIsrDMA(void); + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +#if HAL_UART_DMA +#include "_hal_uart_dma.c" +#endif +#if HAL_UART_ISR +#include "_hal_uart_isr.c" +#endif +#if HAL_UART_SPI +#include "_hal_uart_spi.c" +#endif +#if HAL_UART_USB +#include "_hal_uart_usb.c" +#endif + +/****************************************************************************** + * @fn HalUARTInit + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTInit(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTInitSPI(); + } + else + { + HalUARTInitDMA(); + } +#else +#if HAL_UART_DMA + HalUARTInitDMA(); +#endif +#if HAL_UART_ISR + HalUARTInitISR(); +#endif +#if HAL_UART_SPI + HalUARTInitSPI(); +#endif +#if HAL_UART_USB + HalUARTInitUSB(); +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTOpen + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param port - UART port + * config - contains configuration information + * + * @return Status of the function call + *****************************************************************************/ +uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenISR(config); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenISR(config); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_USB) + HalUARTOpenUSB(config); +#endif +#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) config; // unused argument +#endif + + return HAL_UART_SUCCESS; +} + +/***************************************************************************** + * @fn HalUARTRead + * + * @brief Read a buffer from the UART + * + * @param port - USART module designation + * buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadSPI(buf, len); +#endif + +#if HAL_UART_USB + return HalUARTRx(buf, len); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTWrite + * + * @brief Write a buffer to the UART. + * + * @param port - UART port + * buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteSPI(buf, len); +#endif + +#if HAL_UART_USB + HalUARTTx(buf, len); + return len; +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTSuspend + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTSuspend( void ) +{ +#if HAL_UART_ISR + HalUARTSuspendISR(); +#endif +} + +/****************************************************************************** + * @fn HalUARTResume + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTResume( void ) +{ +#if HAL_UART_ISR + HalUARTResumeISR(); +#endif +} + +/*************************************************************************************************** + * @fn HalUARTPoll + * + * @brief Poll the UART. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTPoll(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTPollSPI(); + } + else + { + HalUARTPollDMA(); + } +#else +#if HAL_UART_DMA + HalUARTPollDMA(); +#endif +#if HAL_UART_ISR + HalUARTPollISR(); +#endif +#if HAL_UART_SPI + HalUARTPollSPI(); +#endif +#if HAL_UART_USB + HalUARTPollUSB(); +#endif +#endif +} + +/************************************************************************************************** + * @fn Hal_UART_RxBufLen() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param port - UART port + * + * @return length of current Rx Buffer + **************************************************************************************************/ +uint16 Hal_UART_RxBufLen( uint8 port ) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailSPI(); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailSPI(); +#endif + +#if HAL_UART_USB + return HalUARTRxAvailUSB(); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + #endif + return 0; +#endif +} + +void HalUARTIsrDMA(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUART_DMAIsrSPI(); + } + else + { + HalUART_DMAIsrDMA(); + } +#elif HAL_UART_DMA + HalUART_DMAIsrDMA(); +#elif HAL_UART_SPI + HalUART_DMAIsrSPI(); +#endif +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_dma.c b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_dma.c new file mode 100644 index 0000000..2d59793 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_dma.c @@ -0,0 +1,1074 @@ +/************************************************************************************************** + Filename: _hal_uart_dma.c + Revised: $Date: 2012-12-12 13:58:27 -0800 (Wed, 12 Dec 2012) $ + Revision: $Revision: 32579 $ + + Description: This file contains the interface to the H/W UART driver by DMA. + + A known defect is that when flow control is enabled, the function HalUARTPollTxTrigDMA() can + prematurely invoke HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX) and clobber that last byte of one txBuf[] + block transfer with the first byte of the next txBuf[] block transfer. Additionally, Tx can + become permanently stalled during heavy use and/or simultaeous heavy radio traffic when using + DMA for the Tx and hardware flow control. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef UTXxIE +#undef UTXxIF +#if (HAL_UART_DMA == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF +#elif (HAL_UART_DMA == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_SEL +#if (HAL_UART_DMA == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0x0C // Peripheral I/O Select for Rx/Tx. +#elif (HAL_UART_DMA == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0xC0 // Peripheral I/O Select for Rx/Tx. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_DMA == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_DMA == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxDIR +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_DMA == 1) +#define PxDIR P0DIR +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#define DMA_RDYIn P0_4 +#define DMA_RDYOut P0_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_DMA == 2) +#define PxDIR P1DIR +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define DMA_RDYIn P1_4 +#define DMA_RDYOut P1_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#if !defined( DMA_PM ) +#if defined POWER_SAVING +#define DMA_PM 1 +#else +#define DMA_PM 0 +#endif // POWER_SAVING +#endif // !DMA_PM + +// For known defects described above in the moduel description, prefer to drive the Tx by ISR vice +// DMA unless H/W flow control is not used and full-throughput on Tx is absolutely essential. +#if !defined HAL_UART_TX_BY_ISR +#define HAL_UART_TX_BY_ISR 1 +#endif + +// TRUE or FALSE whether or not to flush the Rx queue when an Rx overrun is detected. +// Note that when HAL_UART_RX_FLUSH is set to TRUE, then uartRxBug and its hunt for where the Rx +// DMA is working is absolutely necessary because the flush can leave the dmaCfg.rxHead stranded. +#if !defined HAL_UART_RX_FLUSH +#define HAL_UART_RX_FLUSH TRUE +#endif + +// Minimum delay before allowing sleep and/or clearing DMA ready-out after a DMA ready-in ISR. +// ST-ticks for 6-msecs plus 1 tick added for when the dmaRdyDly is forced from zero to 0xFF. +// If a greater delay than 6-msec is configured, then the logic should be changed to use a uint16. +//efine DMA_PM_DLY 198 // 32768 * 0.006 + 1 -> 198. +// This delay should be set as short as possible to work with the max expected latency in the sender +// between its asserting ready-out and its checking of the ready-in response. The RBA Master +// logic in the internal uart-to-uart bridge app checks for ready-in immediately, +// so this is just set to zero. +#define DMA_PM_DLY 0 + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_DMA_RX_MAX +#define HAL_UART_DMA_RX_MAX 128 +#endif +#if !defined HAL_UART_DMA_TX_MAX +#define HAL_UART_DMA_TX_MAX HAL_UART_DMA_RX_MAX +#endif +#if !defined HAL_UART_DMA_HIGH +#define HAL_UART_DMA_HIGH (HAL_UART_DMA_RX_MAX - 1) +#endif +#if !defined HAL_UART_DMA_IDLE +#define HAL_UART_DMA_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif +#if !defined HAL_UART_DMA_FULL +#define HAL_UART_DMA_FULL (HAL_UART_DMA_RX_MAX - 16) +#endif + +// ST-ticks for 1 byte @ 38.4-kB plus 1 tick added for when the txTick is forced from zero to 0xFF. +#define HAL_UART_TX_TICK_MIN 11 + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if HAL_UART_DMA_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_DMA_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint16 rxBuf[HAL_UART_DMA_RX_MAX]; + rxIdx_t rxHead; + rxIdx_t rxTail; +#if HAL_UART_DMA_IDLE + uint8 rxTick; +#endif + +#if HAL_UART_TX_BY_ISR + uint8 txBuf[HAL_UART_DMA_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; +#else + uint8 txBuf[2][HAL_UART_DMA_TX_MAX]; + txIdx_t txIdx[2]; + uint8 txMT; // Indication that at least one of two Tx buffers are free. + uint8 txTick; // ST ticks of delay to allow at least one byte-time at a given baud rate. + uint8 txTrig; // Flag indicating that Tx should be manually triggered after txTick expires. + + // Although all of the txVars above are modified by the Tx-done ISR, only this one should need + // the special volatile consideration by the optimizer (critical sections protect the rest). + volatile uint8 txSel; +#endif + + halUARTCBack_t uartCB; +} uartDMACfg_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_UART_DMA_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)])) +#define HAL_UART_DMA_GET_RX_BYTE(IDX) (*(volatile uint8 *)(dmaCfg.rxBuf+(IDX))) +#define HAL_UART_DMA_CLR_RX_BYTE(IDX) (dmaCfg.rxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) + +#define HAL_UART_DMA_CLR_RDY_OUT() (DMA_RDYOut = 1) +#define HAL_UART_DMA_SET_RDY_OUT() (DMA_RDYOut = 0) + +#define HAL_UART_DMA_RDY_IN() (DMA_RDYIn == 0) +#define HAL_UART_DMA_RDY_OUT() (DMA_RDYOut == 0) + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_DECR(IDX) (IDX)-- +#else +#define HAL_UART_RX_IDX_T_DECR(IDX) st ( \ + if ((IDX)-- == 0) \ + { \ + (IDX) = HAL_UART_DMA_RX_MAX-1; \ + } \ +) +#endif + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_INCR(IDX) (IDX)++ +#else +#define HAL_UART_RX_IDX_T_INCR(IDX) st ( \ + if (++(IDX) >= HAL_UART_DMA_RX_MAX) \ + { \ + (IDX) = 0; \ + } \ +) +#endif + +#define HAL_UART_DMA_TX_AVAIL() \ + (dmaCfg.txHead > dmaCfg.txTail) ? \ + (dmaCfg.txHead - dmaCfg.txTail - 1) : \ + (HAL_UART_DMA_TX_MAX - dmaCfg.txTail + dmaCfg.txHead - 1) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// The following two variables are only used when POWER_SAVING is defined. +static volatile uint8 dmaRdyIsr; +static uint8 dmaRdyDly; // Minimum delay before allowing sleep after detecting RdyIn de-asserted. + +static uartDMACfg_t dmaCfg; + +/* Used to walk the dmaCfg.rxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. + * Although not captured in this UART by DMA case, the _hal_uart_spi.c was able to show that the + * immediate buffer area around the spiRxIdx consists of "cleared" uint16 values, + * but 10-16 indices ahead, there are valid SPI packets ready to be parsed. + */ +static rxIdx_t uartRxBug; // Pre-emptive (not empirically determined necessary) use from SPI case. + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrDMA(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +// Invoked by functions in hal_uart.c when this file is included. +static void HalUARTInitDMA(void); +static void HalUARTOpenDMA(halUARTCfg_t *config); +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len); +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len); +static void HalUARTPollDMA(void); +static uint16 HalUARTRxAvailDMA(void); +static uint8 HalUARTBusyDMA(void); +#if !HAL_UART_TX_BY_ISR +static void HalUARTPollTxTrigDMA(void); +static void HalUARTArmTxDMA(void); +#endif + +/****************************************************************************** + * @fn HalUARTInitDMA + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitDMA(void) +{ + halDMADesc_t *ch; +#if (HAL_UART_DMA == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif + PxSEL |= HAL_UART_Px_SEL; // Enable Peripheral control of Rx/Tx on Px. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + if (DMA_PM) + { + // Setup GPIO for interrupts by falling edge on DMA_RDY_IN. + PxIEN |= DMA_RDYIn_BIT; + PICTL |= PICTL_BIT; + + HAL_UART_DMA_CLR_RDY_OUT(); + PxDIR |= DMA_RDYOut_BIT; + } + +#if !HAL_UART_TX_BY_ISR + // Setup Tx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); +#endif + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf ); + HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX); + HAL_DMA_ARM_CH(HAL_DMA_CH_RX); + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); +} + +/****************************************************************************** + * @fn HalUARTOpenDMA + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenDMA(halUARTCfg_t *config) +{ + dmaCfg.uartCB = config->callBackFunc; + + // Only supporting subset of baudrate for code size - other is possible. + HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + if (DMA_PM || config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + PxSEL |= HAL_UART_Px_CTS; // Enable Peripheral control of CTS flow control on Px. + } + else + { + UxUCR = UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + } + + UxCSR = (CSR_MODE | CSR_RE); + + if (DMA_PM) + { + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; + } + else if (UxUCR & UCR_FLOW) + { + // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the + // circular Rx queue depth. Start by allowing flow. + HAL_UART_DMA_SET_RDY_OUT(); + PxDIR |= HAL_UART_Px_RTS; + } + +#if HAL_UART_TX_BY_ISR + UTXxIF = 1; // Prime the ISR pump. +#endif +} + +/***************************************************************************** + * @fn HalUARTReadDMA + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len) +{ + uint16 cnt; + + for (cnt = 0; cnt < len; cnt++) + { + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + break; + } + *buf++ = HAL_UART_DMA_GET_RX_BYTE(dmaCfg.rxHead); + HAL_UART_DMA_CLR_RX_BYTE(dmaCfg.rxHead); + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + if (HalUARTRxAvailDMA() < HAL_UART_DMA_HIGH) + { + HAL_UART_DMA_SET_RDY_OUT(); // Re-enable the flow asap (i.e. not wait until next uart poll). + } + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteDMA + * + * @brief Write a buffer to the UART, enforcing an all or none policy if the requested length + * exceeds the space available. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len) +{ +#if HAL_UART_TX_BY_ISR + // Enforce all or none. + if (HAL_UART_DMA_TX_AVAIL() < len) + { + return 0; + } + + for (uint16 cnt = 0; cnt < len; cnt++) + { + dmaCfg.txBuf[dmaCfg.txTail] = *buf++; + dmaCfg.txMT = 0; + + if (dmaCfg.txTail >= HAL_UART_DMA_TX_MAX-1) + { + dmaCfg.txTail = 0; + } + else + { + dmaCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } +#else + txIdx_t txIdx; + uint8 txSel; + halIntState_t his; + + HAL_ENTER_CRITICAL_SECTION(his); + txSel = dmaCfg.txSel; + txIdx = dmaCfg.txIdx[txSel]; + HAL_EXIT_CRITICAL_SECTION(his); + + // Enforce all or none. + if ((len + txIdx) > HAL_UART_DMA_TX_MAX) + { + return 0; + } + + (void)memcpy(&(dmaCfg.txBuf[txSel][txIdx]), buf, len); + + HAL_ENTER_CRITICAL_SECTION(his); + /* If an ongoing DMA Tx finished while this buffer was being *appended*, then another DMA Tx + * will have already been started on this buffer, but it did not include the bytes just appended. + * Therefore these bytes have to be re-copied to the start of the new working buffer. + */ + if (txSel != dmaCfg.txSel) + { + HAL_EXIT_CRITICAL_SECTION(his); + txSel ^= 1; + + (void)memcpy(&(dmaCfg.txBuf[txSel][0]), buf, len); + HAL_ENTER_CRITICAL_SECTION(his); + dmaCfg.txIdx[txSel] = len; + } + else + { + dmaCfg.txIdx[txSel] = txIdx + len; + } + + // If there is no ongoing DMA Tx, then the channel must be armed here. + if (dmaCfg.txIdx[(txSel ^ 1)] == 0) + { + HAL_EXIT_CRITICAL_SECTION(his); + HalUARTArmTxDMA(); + } + else + { + dmaCfg.txMT = FALSE; + HAL_EXIT_CRITICAL_SECTION(his); + } +#endif + + return len; +} + +/****************************************************************************** + * @fn HalUARTPollDMA + * + * @brief Poll a USART module implemented by DMA, including the hybrid solution in which the Rx + * is driven by DMA but the Tx is driven by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollDMA(void) +{ + uint8 evt = 0; + uint16 cnt; + +#if DMA_PM + PxIEN &= ~DMA_RDYIn_BIT; // Clear to not race with DMA_RDY_IN ISR. + { + if (dmaRdyIsr || HAL_UART_DMA_RDY_IN() || HalUARTBusyDMA()) + { + // Master may have timed-out the SRDY asserted state & may need a new edge. +#if HAL_UART_TX_BY_ISR + if (!HAL_UART_DMA_RDY_IN() && (dmaCfg.txHead != dmaCfg.txTail)) +#else + if (!HAL_UART_DMA_RDY_IN() && ((dmaCfg.txIdx[0] != 0) || (dmaCfg.txIdx[1] != 0))) +#endif + { + HAL_UART_DMA_CLR_RDY_OUT(); + } + dmaRdyIsr = 0; + + if (dmaRdyDly == 0) + { + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + + if ((dmaRdyDly = ST0) == 0) // Reserve zero to signify that the delay expired. + { + dmaRdyDly = 0xFF; + } + HAL_UART_DMA_SET_RDY_OUT(); + } + else if ((dmaRdyDly != 0) && (!DMA_PM_DLY || ((uint8)(ST0 - dmaRdyDly) > DMA_PM_DLY))) + { + dmaRdyDly = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + PxIEN |= DMA_RDYIn_BIT; +#endif + +#if !HAL_UART_TX_BY_ISR + HalUARTPollTxTrigDMA(); +#endif + + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + if (HAL_UART_DMA_NEW_RX_BYTE(uartRxBug)) + { + do { + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } while (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + HAL_UART_RX_IDX_T_INCR(uartRxBug); + } + + cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around. + +#if HAL_UART_DMA_IDLE + if (dmaCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway) to measure the Rx timeout. + if ((ST0 - dmaCfg.rxTick) > HAL_UART_DMA_IDLE) + { + dmaCfg.rxTick = 0; + evt = HAL_UART_RX_TIMEOUT; + } + } + else if (cnt != 0) + { + if ((dmaCfg.rxTick = ST0) == 0) // Zero signifies that the Rx timeout is not running. + { + dmaCfg.rxTick = 0xFF; + } + } +#else + if (cnt != 0) + { + evt = HAL_UART_RX_TIMEOUT; + } +#endif + + if (cnt >= HAL_UART_DMA_FULL) + { + evt |= HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_DMA_HIGH) + { + evt |= HAL_UART_RX_ABOUT_FULL; + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + HAL_UART_DMA_CLR_RDY_OUT(); // Disable Rx flow. + } + } + + if (dmaCfg.txMT) + { + dmaCfg.txMT = FALSE; + evt |= HAL_UART_TX_EMPTY; + } + + if ((evt != 0) && (dmaCfg.uartCB != NULL)) + { + dmaCfg.uartCB(HAL_UART_DMA-1, evt); + } + + if (DMA_PM && (dmaRdyDly == 0) && !HalUARTBusyDMA()) + { + HAL_UART_DMA_CLR_RDY_OUT(); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailDMA() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailDMA(void) +{ + // First, synchronize the Rx tail marker with where the DMA Rx engine is working. + rxIdx_t tail = dmaCfg.rxTail; + + do + { + if (!HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + break; + } + + HAL_UART_RX_IDX_T_INCR(tail); + } while (tail != dmaCfg.rxHead); + + dmaCfg.rxTail = tail; + + uint16 cnt = tail - dmaCfg.rxHead; + + // If the DMA Rx may have overrun the circular queue, investigate further. + if ((cnt == 0) && HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + /* Ascertain whether this polling is racing with the DMA Rx which may have clocked in a byte + * since walking the tail. The Rx queue has wrapped only if the byte before the head is new. + */ + tail = dmaCfg.rxHead; + HAL_UART_RX_IDX_T_DECR(tail); + + if (HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + if (HAL_UART_RX_FLUSH) + { + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + else + { + cnt = HAL_UART_DMA_RX_MAX; + } + } + else + { + cnt = 1; + } + } + else if (cnt > HAL_UART_DMA_RX_MAX) // If the tail has wrapped at the end of the Rx queue. + { + cnt += HAL_UART_DMA_RX_MAX; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTBusyDMA + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +static uint8 HalUARTBusyDMA( void ) +{ +#if HAL_UART_TX_BY_ISR + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txHead == dmaCfg.txTail)); +#else + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txIdx[0] == 0) && (dmaCfg.txIdx[1] == 0)); +#endif +} + +#if !HAL_UART_TX_BY_ISR +/****************************************************************************** + * @fn HalUARTPollTxTrigDMA + * + * @brief Ascertain whether a manual trigger is required for the DMA Tx channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTPollTxTrigDMA(void) +{ + if ((UxCSR & CSR_TX_BYTE) == 0) // If no TXBUF to shift register transfer, then TXBUF may be MT. + { + if ((dmaCfg.txTick == 0) || ((uint8)(ST0 - dmaCfg.txTick) > HAL_UART_TX_TICK_MIN)) + { + dmaCfg.txTick = 0; + + if (dmaCfg.txTrig && HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)) + { + HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX); + } + dmaCfg.txTrig = 0; + } + } + else + { + UxCSR = (CSR_MODE | CSR_RE); // Clear the CSR_TX_BYTE flag. + dmaCfg.txTick = ST0; + + if (dmaCfg.txTick == 0) // Reserve zero to signify that the minimum delay has been met. + { + dmaCfg.txTick = 0xFF; + } + } +} + +/****************************************************************************** + * @fn HalUARTArmTxDMA + * + * @brief Arm the Tx DMA channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTArmTxDMA(void) +{ + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX); + HAL_DMA_SET_SOURCE(ch, dmaCfg.txBuf[dmaCfg.txSel]); + HAL_DMA_SET_LEN(ch, dmaCfg.txIdx[dmaCfg.txSel]); + + dmaCfg.txSel ^= 1; + dmaCfg.txTrig = 1; + HAL_DMA_ARM_CH(HAL_DMA_CH_TX); + + HalUARTPollTxTrigDMA(); + + if (DMA_PM) + { + HAL_UART_DMA_SET_RDY_OUT(); + } +} +#endif + +/****************************************************************************** + * @fn HalUART_DMAIsrDMA + * + * @brief Handle the Tx done DMA ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUART_DMAIsrDMA(void) +{ +#if !HAL_UART_TX_BY_ISR + if (dmaCfg.txIdx[dmaCfg.txSel]) + { + // If there is more Tx data ready to go, re-arm the DMA immediately on it. + HalUARTArmTxDMA(); + + // Indicate that the Tx buffer just finished is now free (re-arming did a ^= toggle of txSel). + dmaCfg.txIdx[dmaCfg.txSel] = 0; + } + else + { + dmaCfg.txIdx[(dmaCfg.txSel ^ 1)] = 0; // Indicate that the Tx buffer just finished is now free. + + // Clear the CSR_TX_BYTE flag & start the txTick to allow the possibility of an immediate + // manual trigger from the next Write(), if it occurs more than one character time later. + HalUARTPollTxTrigDMA(); + } + + dmaCfg.txMT = TRUE; // Notify CB that at least one Tx buffer is now free to use. +#endif +} + +#if DMA_PM +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + PxIFG = 0; + PxIF = 0; + + dmaRdyIsr = 1; + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +} +#endif + +#if HAL_UART_TX_BY_ISR +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (dmaCfg.txHead == dmaCfg.txTail) + { + IEN2 &= ~UTXxIE; + dmaCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; + + if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) + { + dmaCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_isr.c b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_isr.c new file mode 100644 index 0000000..60c81b4 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_isr.c @@ -0,0 +1,662 @@ +/************************************************************************************************** + Filename: _hal_uart_isr.c + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the H/W UART driver by ISR. + + Note that when using this interrupt service based UART configuration (as opposed to DMA) the + higher baudrates, such as 115200bps, may suffer Rx overrun, especially when the radio is used + simultaneously and/or there is heavy to full throughout and/or full-duplex data. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_uart.h" + +/********************************************************************* + * MACROS + */ + +//#define HAL_UART_ASSERT(expr) HAL_ASSERT((expr)) +#define HAL_UART_ASSERT(expr) + +#define HAL_UART_ISR_RX_AVAIL() \ + (isrCfg.rxTail >= isrCfg.rxHead) ? \ + (isrCfg.rxTail - isrCfg.rxHead) : \ + (HAL_UART_ISR_RX_MAX - isrCfg.rxHead + isrCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ + (isrCfg.txHead > isrCfg.txTail) ? \ + (isrCfg.txHead - isrCfg.txTail - 1) : \ + (HAL_UART_ISR_TX_MAX - isrCfg.txTail + isrCfg.txHead - 1) + +/********************************************************************* + * CONSTANTS + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +// Incompatible redefinitions result with more than one UART driver sub-module. +#undef PxOUT +#undef PxDIR +#undef PxSEL +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef URXxIE +#undef URXxIF +#undef UTXxIE +#undef UTXxIF +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RX_TX +#undef HAL_UART_Px_RX +#undef PxIFG +#undef PxIF +#undef PxIEN +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_ISR == 1) +#define PxOUT P0 +#define PxIN P0 +#define PxDIR P0DIR +#define PxSEL P0SEL +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define URXxIE URX0IE +#define URXxIF URX0IF +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF + +#define PxIFG P0IFG +#define PxIF P0IF +#define PxIEN P0IEN +#define PICTL_BIT 0x01 +#define IENx IEN1 +#define IEN_BIT 0x20 + +#else +#define PxOUT P1 +#define PxIN P1 +#define PxDIR P1DIR +#define PxSEL P1SEL +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define URXxIE URX1IE +#define URXxIF URX1IF +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF + +#define PxIFG P1IFG +#define PxIF P1IF +#define PxIEN P1IEN +#define PICTL_BIT 0x04 +#define IENx IEN2 +#define IEN_BIT 0x10 +#endif + +#if (HAL_UART_ISR == 1) +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_Px_RX_TX 0x0C // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x04 // Peripheral I/O Select for Rx. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#else +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#define HAL_UART_Px_RX_TX 0xC0 // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x80 // Peripheral I/O Select for Rx. +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_ISR_RX_MAX +#define HAL_UART_ISR_RX_MAX 128 +#endif +#if !defined HAL_UART_ISR_TX_MAX +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX +#endif +#if !defined HAL_UART_ISR_HIGH +#define HAL_UART_ISR_HIGH (HAL_UART_ISR_RX_MAX / 2 - 16) +#endif +#if !defined HAL_UART_ISR_IDLE +#define HAL_UART_ISR_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +#if HAL_UART_ISR_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_ISR_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + rxIdx_t rxHead; + volatile rxIdx_t rxTail; + uint8 rxTick; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; + + halUARTCBack_t uartCB; +} uartISRCfg_t; + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uartISRCfg_t isrCfg; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void HalUARTInitISR(void); +static void HalUARTOpenISR(halUARTCfg_t *config); +static uint16 HalUARTReadISR(uint8 *buf, uint16 len); +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len); +static void HalUARTPollISR(void); +static uint16 HalUARTRxAvailISR(void); +static uint8 HalUARTBusyISR(void); +static void HalUARTSuspendISR(void); +static void HalUARTResumeISR(void); + +/****************************************************************************** + * @fn HalUARTInitISR + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitISR(void) +{ + // Set P2 priority - USART0 over USART1 if both are defined. + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + +#if (HAL_UART_ISR == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O location to P1. +#endif + PxSEL |= HAL_UART_Px_RX_TX; // Enable Tx and Rx on P1. + ADCCFG &= ~HAL_UART_Px_RX_TX; // Make sure ADC doesnt use this. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. +} + +/****************************************************************************** + * @fn HalUARTOpenISR + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenISR(halUARTCfg_t *config) +{ + isrCfg.uartCB = config->callBackFunc; + // Only supporting subset of baudrate for code size - other is possible. + HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + if (config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; + PxSEL |= HAL_UART_Px_RTS | HAL_UART_Px_CTS; + PxOUT &= ~HAL_UART_Px_RTS; + PxDIR |= HAL_UART_Px_RTS; + } + else + { + UxUCR = UCR_STOP; + } + + URXxIE = 1; + UTXxIF = 1; // Prime the ISR pump. + UxCSR = (CSR_MODE | CSR_RE); +} + +/***************************************************************************** + * @fn HalUARTReadISR + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadISR(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((isrCfg.rxHead != isrCfg.rxTail) && (cnt < len)) + { + *buf++ = isrCfg.rxBuf[isrCfg.rxHead++]; + if (isrCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteISR + * + * @brief Write a buffer to the UART. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Enforce all or none. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + isrCfg.txBuf[isrCfg.txTail] = *buf++; + isrCfg.txMT = 0; + + if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1) + { + isrCfg.txTail = 0; + } + else + { + isrCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTPollISR + * + * @brief Poll a USART module implemented by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollISR(void) +{ + uint16 cnt = HAL_UART_ISR_RX_AVAIL(); + uint8 evt = 0; + + if (isrCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - isrCfg.rxShdw; + + if (isrCfg.rxTick > decr) + { + isrCfg.rxTick -= decr; + } + else + { + isrCfg.rxTick = 0; + } + } + isrCfg.rxShdw = ST0; + + if (cnt >= HAL_UART_ISR_RX_MAX-1) + { + evt = HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_ISR_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !isrCfg.rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (isrCfg.txMT) + { + isrCfg.txMT = 0; + evt |= HAL_UART_TX_EMPTY; + } + + if (evt && (isrCfg.uartCB != NULL)) + { + isrCfg.uartCB(HAL_UART_ISR-1, evt); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailISR() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailISR(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +/****************************************************************************** + * @fn HalUARTBusyISR + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +uint8 HalUARTBusyISR( void ) +{ + return ((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && + (isrCfg.rxHead == isrCfg.rxTail) && (isrCfg.txHead == isrCfg.txTail)); +} + +/****************************************************************************** + * @fn HalUARTSuspendISR + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTSuspendISR( void ) +{ +#if defined POWER_SAVING + UxCSR = CSR_MODE; // Suspend Rx operations. + + if (UxUCR & UCR_FLOW) + { + PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow. + PxIFG = (HAL_UART_Px_CTS ^ 0xFF); + PxIEN |= HAL_UART_Px_CTS; // Enable the CTS ISR. + } + else + { + PxIFG = (HAL_UART_Px_RX ^ 0xFF); + PxIEN |= HAL_UART_Px_RX; // Enable the Rx ISR. + } + +#if defined HAL_UART_GPIO_ISR + PxIF = 0; // Clear the next level. + PICTL |= PICTL_BIT; // Interrupt on falling edge of input. + IENx |= IEN_BIT; +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTResumeISR + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTResumeISR( void ) +{ +#if defined POWER_SAVING +#if defined HAL_UART_GPIO_ISR + IENx &= (IEN_BIT ^ 0xFF); +#endif + + if (UxUCR & UCR_FLOW) + { + PxIEN &= (HAL_UART_Px_CTS ^ 0xFF); // Disable the CTS ISR. + PxOUT &= (HAL_UART_Px_RTS ^ 0xFF); // Re-enable Rx flow. + } + else + { + PxIEN &= (HAL_UART_Px_RX ^ 0xFF); // Enable the Rx ISR. + } + + UxUCR |= UCR_FLUSH; + UxCSR = (CSR_MODE | CSR_RE); +#endif +} + +/*************************************************************************************************** + * @fn halUartRxIsr + * + * @brief UART Receive Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + uint8 tmp = UxDBUF; + isrCfg.rxBuf[isrCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (isrCfg.rxHead == isrCfg.rxTail) + { + isrCfg.rxShdw = ST0; + } + + if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxTail = 0; + } + + isrCfg.rxTick = HAL_UART_ISR_IDLE; + + HAL_EXIT_ISR(); +} + +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (isrCfg.txHead == isrCfg.txTail) + { + IEN2 &= ~UTXxIE; + isrCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = isrCfg.txBuf[isrCfg.txHead++]; + + if (isrCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + isrCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} + +#if (defined POWER_SAVING && defined HAL_UART_GPIO_ISR) +/*************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + HalUARTResume(); + if (dmaCfg.uartCB != NULL) + { + dmaCfg.uartCB(HAL_UART_DMA-1, HAL_UART_RX_WAKEUP); + } + PxIFG = 0; + PxIF = 0; + + HAL_EXIT_ISR(); +} +#endif + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_spi.c b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_spi.c new file mode 100644 index 0000000..81f55f7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_spi.c @@ -0,0 +1,1075 @@ +/************************************************************************************************** + Filename: _hal_uart_spi.c + Revised: $Date: 2012-10-30 19:25:51 -0700 (Tue, 30 Oct 2012) $ + Revision: $Revision: 31987 $ + + Description: Implementation of a specialized SPI Transport driver for emulating a UART API. + + Concept of Operation for porting this code to act as a SPI Master: + + 5 GPIO lines are required: MOSI, MISO, SPI Clock, SPI CSn/MRDY, and SRDY. + MRDY = SPI Master Ready to send and serves as a SPI Slave wakeup from sleep. + SRDY = SPI Slave Ready to send and serves as a SPI Master wakeup from sleep. + + SRDY also serves as an indication that the Slave has awoken from sleep and is ready to recieve + as follows: when the Slave has no message ready, it will toggle the state of its SRDY on every + falling edge of the CSn/MRDY. The SPI Slave has a configurable time delay before re-enabling + sleep after being awoken. + + The SPI Slave does not re-enter sleep for the following conditions: + - Slave is asserting SRDY (i.e. it is waiting to send a SPI packet). + - Master is asserting MRDY. + - Slave has parsed the SOF byte of a SPI packet, but has not received the entire packet yet. + Note how important this case is to support a master that has to interrupt a SPI packet + transmission in order to service a higher priority SPI slave (i.e. the master has executed the + protocol to ensure that the SPI slave is awake, but cannot hold MRDY low for the entire, + contiguous packet for having to service some other SPI slave mid-packet). + + Any transfer, from one byte to SPI_MAX_DAT_LEN bytes is packetized by pre-pending an SOF & LEN + byte and appending an FCS byte. The FCS is calculated over the data payload and the LEN bytes. + + Only Full-Duplex transfers are supported - at any byte of a Tx transfer, + the incoming bytes may not be just garbage bytes clocked out by the synchronous transfer, but + instead be meaningful bytes of a Tx-packet from the other side. Thus, the necessity of concocting + the concept of the SPI transfer packet described above. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#elif defined HAL_SPI_QUEUED_TX && HAL_SPI_QUEUED_TX +#include "OSAL.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* The bridge utility application uses 4 DMA channels for 2 sets of Rx/Tx by DMA, and thereby also + * implements a special DMA ISR handler, which accomodates this extra definition. + */ +#if !defined HAL_SPI_CH_RX +#define HAL_SPI_CH_RX HAL_DMA_CH_RX +#endif +#if !defined HAL_SPI_CH_TX +#define HAL_SPI_CH_TX HAL_DMA_CH_TX +#endif + +// Overlay the SPI Rx/Tx buffers on the UART Rx/Tx buffers when running with a run-time selectable +// UART port by SPI or by UART in order to save XDATA space. +#if !defined HAL_SPI_ON_UART_BUFS +#define HAL_SPI_ON_UART_BUFS FALSE +#endif + +#if !defined HAL_SPI_QUEUED_TX +#define HAL_SPI_QUEUED_TX FALSE +#endif + +#define SPI_MAX_PKT_LEN 256 +#define SPI_MAX_DAT_LEN (SPI_MAX_PKT_LEN - SPI_FRM_LEN) + +#define SPI_SOF 0xFE // Start-of-frame delimiter for SPI transport. + +// The FCS is calculated over the SPI Frame Header and the Frame Data bytes. +#define SPI_HDR_LEN 1 // One byte LEN pre-pended to data byte array. +// SOF & Header bytes pre-pended and the FCS byte appended. +#define SPI_FRM_LEN (2 + SPI_HDR_LEN) + +#define SPI_SOF_IDX 0 +#define SPI_HDR_IDX 1 // The frame header consists only of the LEN byte for now. +#define SPI_LEN_IDX 1 // LEN byte is offset by the SOF byte. +#define SPI_DAT_IDX 2 // Data bytes are offset by the SOF & LEN bytes. + +#if defined HAL_SPI_MASTER +// If POWER_SAVING is enabled in the 8051-SOC slave, then any master transmit must be preceded by a +// dummy zero byte transfer to give the slave time to wake from PM2/3 & enable its 1.8V and signal +// such success by responding with its SRDY active low. +#if !defined HAL_SPI_WAKEUP +#define HAL_SPI_WAKEUP TRUE +#endif +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 2 +#elif (HAL_UART_SPI != 2) +#error Only supporting HAL_UART_SPI==2 for now. +#endif + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#if (HAL_UART_SPI == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#elif (HAL_UART_SPI == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_SEL_S +#undef HAL_UART_Px_SEL_M +#if (HAL_UART_SPI == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_SEL_S 0x3C // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0x2C // Peripheral I/O Select for Master: MI/MO/CLK. +#elif (HAL_UART_SPI == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_SEL_S 0xF0 // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0xE0 // Peripheral I/O Select for Master: MI/MO/CLK. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_SPI == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_SPI == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#if !defined SPI_RDYIn +#define SPI_RDYIn P0_1 +#define SPI_RDYIn_BIT BV(1) +#endif +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_SPI == 2) +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define SPI_RDYIn P1_4 +#define SPI_RDYIn_BIT BV(4) +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#undef PxDIR +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxDIR P1DIR +#define SPI_RDYOut P1_4 +#define SPI_RDYOut_BIT BV(4) +#elif (HAL_UART_SPI == 2) +#define PxDIR P0DIR +#define SPI_RDYOut P0_5 +#define SPI_RDYOut_BIT BV(5) +#endif + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if (SPI_MAX_PKT_LEN <= 256) +typedef uint8 spiLen_t; +#else +typedef uint16 spiLen_t; +#endif + +typedef enum +{ + spiRxSteSOF, + spiRxSteLen, + spiRxSteData, + spiRxSteFcs +} spiRxSte_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#if SPI_MAX_PKT_LEN == 256 +#define SPI_LEN_T_INCR(LEN) (LEN)++ +#define SPI_LEN_T_BOUNDS_CHECK(LEN) +#else +#define SPI_LEN_T_INCR(LEN) st ( \ + if (++(LEN) >= SPI_MAX_PKT_LEN) \ + { \ + (LEN) = 0; \ + } \ +) + +#define SPI_LEN_T_BOUNDS_CHECK(LEN) st ( \ + if (len > SPI_MAX_PKT_LEN) \ + { \ + len = SPI_MAX_PKT_LEN; \ + } \ +) +#endif + +#define SPI_CLR_RX_BYTE(IDX) (spiRxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) +#define SPI_GET_RX_BYTE(IDX) (*(volatile uint8 *)(spiRxBuf+(IDX))) +#define SPI_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(spiRxBuf[(IDX)])) + +#define SPI_DAT_LEN(PBUF) ((PBUF)[SPI_LEN_IDX]) +#define SPI_PKT_LEN(PBUF) (SPI_DAT_LEN((PBUF)) + SPI_FRM_LEN) + +#define SPI_RDY_IN() (SPI_RDYIn == 0) +#define SPI_RDY_OUT() (SPI_RDYOut == 0) + +#if defined HAL_SPI_MASTER +#define SPI_CLR_CSn_OUT() (SPI_RDYOut = 1) +#define SPI_SET_CSn_OUT() (SPI_RDYOut = 0) + +#define SPI_CLOCK_RX(CNT) st ( \ + SPI_SET_CSn_OUT(); \ + \ + for (spiLen_t cnt = 0; cnt <= (CNT); cnt++) \ + { \ + UxDBUF = 0; \ + while (UxCSR & CSR_ACTIVE); \ + } \ + \ + SPI_CLR_CSn_OUT(); \ +) +#define SPI_CLR_RDY_OUT() SPI_CLR_CSn_OUT() + +#elif !defined HAL_SPI_MASTER +#define SPI_CLR_RDY_OUT() (SPI_RDYOut = 1) +#define SPI_SET_RDY_OUT() (SPI_RDYOut = 0) +#define SPI_TOG_RDY_OUT() st ( \ + if (SPI_RDY_OUT()) \ + { \ + SPI_CLR_RDY_OUT(); \ + } \ + else \ + { \ + SPI_SET_RDY_OUT(); \ + } \ +) +#endif + +#define SPI_RX_RDY() (spiRxHead != spiRxTail) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// Convenient way to save RAM space when running with both SPI & UART ports enabled, +// but only using one at a time with a run-time choice. +#if HAL_SPI_ON_UART_BUFS +static uint16 *const spiRxBuf = dmaCfg.rxBuf; +#if (defined HAL_UART_TX_BY_ISR && HAL_UART_TX_BY_ISR) +static uint8 *const spiRxDat = dmaCfg.txBuf; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#else +static uint8 *const spiRxDat = dmaCfg.txBuf[0]; +static uint8 *const spiTxPkt = dmaCfg.txBuf[1]; +#endif +#else +static __no_init uint16 spiRxBuf[SPI_MAX_PKT_LEN]; // uint16 for trick with DMA Rx 2-for-1. +static __no_init uint8 spiRxDat[SPI_MAX_PKT_LEN]; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#endif + +#if HAL_SPI_QUEUED_TX +static osal_msg_q_t spiTxQ; +static volatile uint8 spiTxMT; +#endif + +static spiRxSte_t spiRxSte; // State of SPI packet parsing from spiRxBuf[]. +static spiLen_t spiRxIdx; // Index in spiRxBuf[] for SPI packet parsing. +static spiLen_t spiRxCnt; // Count payload data bytes parsed from spiRxBuf[]. +static spiLen_t spiRxLen; // Total length of payload data bytes to be parsed from spiRxBuf[]. +static spiLen_t spiRxFcs; // Running FCS calculation of bytes being parsed from spiRxBuf[]. + +static spiLen_t spiRxHead; // Index in spiRxDat[] from which to read with HalUARTReadSPI(). +static spiLen_t spiRxTail; // Index in spiRxDat[] up to which to read with HalUARTReadSPI(). +static spiLen_t spiRxTemp; // Index in spiRxDat[] to which to parse data from spiRxBuf[]. + +// Not supporting Tx packet buffering with a spiTxBuf[] for now to save XDATA/Flash space. + +static volatile spiLen_t spiTxLen; // Total length of payload data bytes to transmit. + +static halUARTCBack_t spiCB; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) +static volatile uint8 spiRdyIsr; // Sticky flag from SPI_RDY_IN ISR for background polling. +#endif + +#if defined POWER_SAVING +static uint8 spiHoldPM; // Boolean whether or not this module is holding off the PM. +#endif + +/* Used to walk the spiRxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. The immediate buffer area around + * the spiRxIdx consists of "cleared" uint16 values, but 10-16 indices ahead, there are valid SPI + * packets ready to be parsed. + */ +static spiLen_t spiRxBug; // DMA pointer is seen to jump ahead, or S/W bug corrupts spiRxIdx? + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrSPI(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +static uint8 spiCalcFcs(uint8 *pBuf); +static void spiParseRx(void); +#if defined POWER_SAVING +static uint8 spiSweepRx(void); +#endif + +/************************************************************************************************** + * @fn HalUARTInitSPI + * + * @brief Initialize the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTInitSPI(void) +{ +#if (HAL_UART_SPI == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif +#if defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_M; // SPI-Master peripheral select. + UxCSR = 0; // Mode is SPI-Master Mode. + UxGCR = 16; // Cfg for the max Rx/Tx baud of 4-MHz. + UxBAUD = 255; +#elif !defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_S; // SPI-Slave peripheral select. + UxCSR = CSR_SLAVE; // Mode is SPI-Slave Mode. +#endif + UxUCR = UCR_FLUSH; // Flush it. + UxGCR |= BV(5); // Set bit order to MSB. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + // Setup GPIO for interrupts by falling edge on SPI_RDY_IN. + PxIEN |= SPI_RDYIn_BIT; + PICTL |= PICTL_BIT; + + SPI_CLR_RDY_OUT(); + PxDIR |= SPI_RDYOut_BIT; + + // Setup Tx by DMA. + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + HAL_DMA_SET_SOURCE( ch, spiTxPkt ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, spiRxBuf ); + HAL_DMA_SET_LEN( ch, SPI_MAX_PKT_LEN ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_SPI_CH_RX); + HAL_DMA_ARM_CH(HAL_SPI_CH_RX); + (void)memset(spiRxBuf, (DMA_PAD ^ 0xFF), SPI_MAX_PKT_LEN * sizeof(uint16)); +} + +/************************************************************************************************** + * @fn HalUARTOpenSPI + * + * @brief Start the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTOpenSPI(halUARTCfg_t *config) +{ + spiCB = config->callBackFunc; + + UxCSR |= CSR_RE; + + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; +} + +/************************************************************************************************** + * @fn HalUARTReadSPI + * + * @brief Read data bytes from a received SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory to where to copy the received SPI data bytes. + * @param len - the length to copy (for now, must be the exact length of the received data). + * + * output parameters + * + * None. + * + * @return The number of bytes read from a received SPI packet. + */ +static spiLen_t HalUARTReadSPI(uint8 *buf, spiLen_t len) +{ + for (spiLen_t cnt = 0; cnt < len; cnt++) + { + if (spiRxHead == spiRxTail) + { + len = cnt; + break; + } + + *buf++ = spiRxDat[spiRxHead]; + SPI_LEN_T_INCR(spiRxHead); + } + + return len; +} + +/************************************************************************************************** + * @fn HalUARTWriteSPI + * + * @brief Transmit data bytes as a SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory of the data bytes to send. + * @param len - the length of the data bytes to send. + * + * output parameters + * + * None. + * + * @return Zero for any error; otherwise, 'len'. + */ +static spiLen_t HalUARTWriteSPI(uint8 *buf, spiLen_t len) +{ + if (spiTxLen != 0) + { +#if HAL_SPI_QUEUED_TX + uint8 *txMsg = osal_msg_allocate(len); + + if (txMsg != NULL) + { + (void)memcpy(txMsg, buf, len); + osal_msg_enqueue(&spiTxQ, txMsg); + + return len; + } +#endif + + return 0; + } + + if (len > SPI_MAX_DAT_LEN) + { + len = SPI_MAX_DAT_LEN; + } + spiTxLen = len; +#if HAL_SPI_QUEUED_TX + spiTxMT = FALSE; +#endif + + spiTxPkt[SPI_LEN_IDX] = len; + (void)memcpy(spiTxPkt + SPI_DAT_IDX, buf, len); + + spiCalcFcs(spiTxPkt); + spiTxPkt[SPI_SOF_IDX] = SPI_SOF; + + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_SPI_CH_TX); + HAL_DMA_SET_LEN(ch, SPI_PKT_LEN(spiTxPkt)); + +#if defined HAL_SPI_MASTER +#if HAL_SPI_WAKEUP + /* A Full-Duplex Slave will keep SRDY active low if it has Tx ready; otherwise it will toggle its + * SRDY with every falling edge of MRDY. So if SRDY is high and the wait after writing each byte + * is not long enough, the master may loop here, infinitely out of sync with the toggling SRDY. + * Thus in a threaded OS, it would be advisable to send one zero and yield for 1-msec or more, or + * be able to receive and check here for the SRDY ISR. + */ + spiRdyIsr = 0; + while (!SPI_RDY_IN() && (spiRdyIsr == 0)) + { + SPI_CLOCK_RX(1); + + for (uint16 cnt = 0; cnt < 512; cnt++) + { + if (SPI_RDY_IN() || (spiRdyIsr != 0)) + { + break; + } + } + } +#endif + SPI_SET_CSn_OUT(); + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + HAL_DMA_MAN_TRIGGER(HAL_SPI_CH_TX); + +#elif !defined HAL_SPI_MASTER + + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + SPI_SET_RDY_OUT(); +#endif + + return len; +} + +/************************************************************************************************** + * @fn HalUARTPollSPI + * + * @brief SPI Transport Polling Manager. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTPollSPI(void) +{ +#if HAL_SPI_QUEUED_TX + /* There should not be a race with the Tx-Done ISR checking the spiTxQ because if the background + * can first detect the volatile variable spiTxLen as zero and then detect the spiTxQ as not + * empty, then the Tx-Done ISR has already fired after the background write started to enqueue + * the message but before it was done doing so. + */ + if ((spiTxLen == 0) && (spiTxQ != NULL)) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else if (spiTxMT) + { + spiTxMT = FALSE; + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); + } +#endif + + spiParseRx(); + +#if HAL_SPI_QUEUED_TX || defined HAL_SPI_MASTER + if (SPI_RX_RDY()) +#else + // When there is no ability to queue Tx data and there is still Tx data pending, do not call the + // Application with new Rx data, as this may result in an attempt to respond. Although this + // failure will be actionable by the Application when HalUARTWriteSPI() returns zero, simple + // applications (like the SBL, which does not enable Tx queueing) do not handle the zero return. + if (SPI_RX_RDY() && !spiTxLen) +#endif + { + if (spiCB != NULL) + { + spiCB((HAL_UART_SPI - 1), HAL_UART_RX_TIMEOUT); + } + } + + PxIEN &= ~SPI_RDYIn_BIT; // Clear to not race with SPI_RDY_IN ISR. + + if (!SPI_RDY_IN() && !spiTxLen) + { + SPI_CLR_RDY_OUT(); // Clear the ready-out bit before re-enabling the ready-in ISR. + } + +#if defined POWER_SAVING + if (SPI_RDY_IN() || SPI_RX_RDY() || spiRxLen || spiTxLen || spiRdyIsr) + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM == 0) + { + spiHoldPM = 1; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + } + else + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM != 0) + { + PxIEN |= SPI_RDYIn_BIT; // Allow the ready-in ISR during the relatively long Rx sweep. + + if (spiSweepRx()) + { + spiHoldPM = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + } +#endif + + PxIEN |= SPI_RDYIn_BIT; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailSPI + * + * @brief Return the byte count of Rx data ready to be read HalUARTReadSPI(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return Number of bytes ready to be read with HalUARTReadSPI(). + */ +static spiLen_t HalUARTRxAvailSPI(void) +{ + return (spiRxTail > spiRxHead) ? (spiRxTail-spiRxHead) : (spiRxTail+(SPI_MAX_PKT_LEN-spiRxHead)); +} + +/************************************************************************************************** + * @fn spiCalcFcs + * + * @brief Calculate the FCS of a SPI Transport frame and append it to the packet. + * + * input parameters + * + * @param pBuf - Pointer to the SPI Transport frame over which to calculate the FCS. + * + * output parameters + * + * None. + * + * @return The FCS calculated. + */ +static uint8 spiCalcFcs(uint8 *pBuf) +{ + spiLen_t len = SPI_DAT_LEN(pBuf) + SPI_HDR_LEN + SPI_HDR_IDX; + spiLen_t idx = SPI_HDR_IDX; + uint8 fcs = 0; + + while (idx < len) + { + fcs ^= pBuf[idx++]; + } + pBuf[idx] = fcs; + + return fcs; +} + +/************************************************************************************************** + * @fn spiParseRx + * + * @brief Parse all available bytes from the spiRxBuf[]; parse Rx data into the spiRxDat[]. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void spiParseRx(void) +{ + while (1) + { + if (!SPI_NEW_RX_BYTE(spiRxIdx)) + { +#if defined HAL_SPI_MASTER + if (SPI_RDY_IN() && (spiTxLen == 0)) + { + SPI_CLOCK_RX(1); + continue; + } +#endif + + if (SPI_NEW_RX_BYTE(spiRxBug)) + { + while (!SPI_NEW_RX_BYTE(spiRxIdx)) + { + SPI_LEN_T_INCR(spiRxIdx); + } + + spiRxBug = spiRxIdx; + continue; + } + + SPI_LEN_T_INCR(spiRxBug); + break; + } + + uint8 ch = SPI_GET_RX_BYTE(spiRxIdx); + SPI_CLR_RX_BYTE(spiRxIdx); + SPI_LEN_T_INCR(spiRxIdx); + + switch (spiRxSte) + { + case spiRxSteSOF: + if (ch == SPI_SOF) + { + spiRxSte = spiRxSteLen; + + // At this point, the master has effected the protocol for ensuring that the SPI slave is + // awake, so set the spiRxLen to non-zero to prevent the slave from re-entering sleep until + // the entire packet is received - even if the master interrupts the sending of the packet + // by de-asserting/re-asserting MRDY one or more times. + spiRxLen = 1; + } + break; + + case spiRxSteLen: + if ((ch == 0) || (ch > SPI_MAX_DAT_LEN)) + { + spiRxSte = spiRxSteSOF; + spiRxLen = 0; + } + else + { + spiRxFcs = spiRxLen = ch; + spiRxTemp = spiRxTail; + spiRxCnt = 0; + spiRxSte = spiRxSteData; +#if defined HAL_SPI_MASTER + SPI_CLOCK_RX(ch + 1); // Clock out the SPI Frame Data bytes and FCS. +#endif + } + break; + + case spiRxSteData: + spiRxFcs ^= ch; + spiRxDat[spiRxTemp] = ch; + SPI_LEN_T_INCR(spiRxTemp); + + if (++spiRxCnt == spiRxLen) + { + spiRxSte = spiRxSteFcs; + } + break; + + case spiRxSteFcs: + spiRxSte = spiRxSteSOF; + + if (ch == spiRxFcs) + { + spiRxTail = spiRxTemp; + } + + spiRxCnt = spiRxLen = 0; + break; + + default: + HAL_ASSERT(0); + break; + } + } +} + +#if defined POWER_SAVING +/************************************************************************************************** + * @fn spiSweepRx + * + * @brief Sweep the entire spiRxBuf[] looking for buggy DMA Rx - this function is an + * enhancement to the 'spiRxBug' work-around that is required when POWER_SAVING is + * enabled because the 'spiRxBug' only looks at one byte per polling pass and the + * buggy DMA Rx may be further away and not encountered before allowing sleep. + * + * input parameters + * + * None. + * + * output parameters + * + * The local global variables spiRxIdx and spiRxBug are set to the index of the first valid Rx + * after the index where spiRxIdx had been set upon entering this function. + * + * @return TRUE for a clean sweep (spiRxBuf[] has no valid Rx); FALSE otherwise. + */ +static uint8 spiSweepRx(void) +{ + spiLen_t sweepIdx = spiRxIdx; + + do { + if (SPI_NEW_RX_BYTE(sweepIdx)) + { + spiRxBug = spiRxIdx = sweepIdx++; + break; + } + + SPI_LEN_T_INCR(sweepIdx); + + } while (sweepIdx != spiRxIdx); + + return (sweepIdx == spiRxIdx); +} +#endif + +/************************************************************************************************** + * @fn HalUART_DMAIsrSPI + * + * @brief Handle the Tx done DMA ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalUART_DMAIsrSPI(void) +{ +#if !defined HAL_SPI_MASTER + if (!SPI_RDY_IN()) +#endif + { + SPI_CLR_RDY_OUT(); + } + spiTxLen = 0; + +#if HAL_SPI_QUEUED_TX + if (spiTxQ != NULL) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else + { + spiTxMT = TRUE; + } +#else + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); +#endif +} + +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief Handler for the SPI_RDY_IN falling-edge ISR. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if defined HAL_SBL_BOOT_CODE +static void spiRdyIn(void) +{ +#else +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#elif (HAL_UART_SPI == 2) +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); +#endif + + PxIFG = 0; + PxIF = 0; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) + spiRdyIsr = 1; +#endif +#if !defined HAL_SPI_MASTER + if (spiTxLen == 0) + { + SPI_TOG_RDY_OUT(); + } +#endif + +#if !defined HAL_SBL_BOOT_CODE + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +#endif +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_usb.c b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_usb.c new file mode 100644 index 0000000..85d5d64 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/_hal_uart_usb.c @@ -0,0 +1,389 @@ +/************************************************************************************************** + Filename: _hal_uart_usb.c + Revised: $Date: 2012-08-17 16:36:33 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31296 $ + + Description: This file contains the interface to the H/W UART driver by USB. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_uart.h" + +#include "usb_board_cfg.h" +#include "usb_cdc.h" +#include "usb_cdc_hooks.h" +#include "usb_firmware_library_config.h" +#include "usb_firmware_library_headers.h" + +/********************************************************************* + * MACROS + */ + +#if !defined HAL_UART_BAUD_RATE +#define HAL_UART_BAUD_RATE 115200 +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_USB_HIGH +#define HAL_UART_USB_HIGH (256 / 2 - 16) +#endif +#if !defined HAL_UART_USB_IDLE +#define HAL_UART_USB_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +// Max USB packet size, per specification; see also usb_cdc_descriptor.s51 +#define HAL_UART_USB_TX_MAX 64 + +/*********************************************************************************** + * EXTERNAL VARIABLES + */ + +/*********************************************************************************** + * GLOBAL VARIABLES + */ + +/*********************************************************************************** + * LOCAL DATA + */ + +__no_init static uint8 halUartRxQ[256]; +__no_init static uint8 halUartTxQ[256]; + +static uint8 halUartRxH, halUartRxT; +static uint8 halUartTxH, halUartTxT; + +#if !defined HAL_SB_BOOT_CODE +static uint8 rxTick; +static uint8 rxShdw; +static uint8 usbTxMT; +static halUARTCBack_t usbCB; +#endif + +/*********************************************************************************** + * LOCAL FUNCTIONS + */ + +static void HalUARTInitUSB(void); +static void HalUARTPollUSB(void); +static void halUartPollEvt(void); +static void halUartPollRx(void); +static void halUartPollTx(void); + +/****************************************************************************** + * FUNCTIONS + */ + +/*********************************************************************************** +* @fn usbUartInitUSB +* +* @brief USB UART init function. +* - Set initial line decoding to 8/NONE/1. +* - Initialise the USB Firmware Library and the USB controller. +* +* @param none +* +* @return none +*/ +void HalUARTInitUSB(void) +{ + // Set default line coding. + currentLineCoding.dteRate = HAL_UART_BAUD_RATE; + currentLineCoding.charFormat = CDC_CHAR_FORMAT_1_STOP_BIT; + currentLineCoding.parityType = CDC_PARITY_TYPE_NONE; + currentLineCoding.dataBits = 8; + + // Init USB library + usbfwInit(); + + // Initialize the USB interrupt handler with bit mask containing all processed USBIRQ events + usbirqInit(0xFFFF); + +#if defined HAL_SB_BOOT_CODE + HAL_USB_PULLUP_ENABLE(); // Enable pullup on D+. +#endif +} + +#if !defined HAL_SB_BOOT_CODE +/****************************************************************************** + * @fn HalUARTOpenUSB + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenUSB(halUARTCfg_t *config) +{ + usbCB = config->callBackFunc; + HAL_USB_PULLUP_ENABLE(); // Enable pullup on D+ +} +#endif + +/*********************************************************************************** +* @fn HalUartPollUSB +* +* @brief The USB UART main task function. Should be called from the OSAL main loop. +* +* @param none +* +* @return none +*/ +void HalUARTPollUSB(void) +{ +#if defined HAL_SB_BOOT_CODE + while (USBIF) usbirqHandler(); +#endif + halUartPollEvt(); + halUartPollRx(); + halUartPollTx(); +} + +uint8 HalUARTRx(uint8 *buf, uint8 max); +uint8 HalUARTRx(uint8 *buf, uint8 max) +{ + uint8 cnt = 0; + + while ((halUartRxH != halUartRxT) && (cnt < max)) + { + *buf++ = halUartRxQ[halUartRxH++]; + cnt++; + } + + return cnt; +} + +uint8 HalUARTTx(uint8 *buf, uint8 cnt); +uint8 HalUARTTx(uint8 *buf, uint8 cnt) +{ + while (cnt--) + { + halUartTxQ[halUartTxT++] = *buf++; + } + +#if !defined HAL_SB_BOOT_CODE + usbTxMT = FALSE; +#endif + return 1; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailUSB() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailUSB(void) +{ + return ((halUartRxT >= halUartRxH)? + halUartRxT - halUartRxH : sizeof(halUartRxQ) - halUartRxH + halUartRxT); +} + +/*********************************************************************************** +* @fn halUartPollEvt +* +* @brief Poll for USB events which are not directly related to the UART. +* +* @param none +* +* @return none +*/ +static void halUartPollEvt(void) +{ + // Handle reset signaling on the bus + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) + { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET); + usbfwResetHandler(); + } + + // Handle packets on EP0 + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SETUP) + { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SETUP); + usbfwSetupHandler(); + } + + // Handle USB suspend + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) + { + // Clear USB suspend interrupt + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND); + +#if HAL_UART_USB_SUSPEND + // Take the chip into PM1 until a USB resume is deteceted. + usbsuspEnter(); +#endif + + // Running again; first clear RESUME interrupt + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME); + } +} + +/*********************************************************************************** +* @fn halUartPollRx +* +* @brief Poll for data from USB. +* +* @param none +* +* @return none +*/ +static void halUartPollRx(void) +{ + uint8 cnt; + uint8 ep = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(4); + + // If the OUT endpoint has received a complete packet. + if (USBFW_OUT_ENDPOINT_DISARMED()) + { + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); + // Get length of USB packet, this operation must not be interrupted. + cnt = USBFW_GET_OUT_ENDPOINT_COUNT_LOW(); + cnt += USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() >> 8; + HAL_EXIT_CRITICAL_SECTION(intState); + + while (cnt--) + { + halUartRxQ[halUartRxT++] = USBF4; + } + USBFW_ARM_OUT_ENDPOINT(); + +#if !defined HAL_SB_BOOT_CODE + // If the USB has transferred in more Rx bytes, reset the Rx idle timer. + + // Re-sync the shadow on any 1st byte(s) received. + if (rxTick == 0) + { + rxShdw = ST0; + } + rxTick = HAL_UART_USB_IDLE; +#endif + } +#if !defined HAL_SB_BOOT_CODE + else if (rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - rxShdw; + + if (rxTick > decr) + { + rxTick -= decr; + rxShdw = ST0; + } + else + { + rxTick = 0; + } + } + + { + uint8 evt = 0; + cnt = halUartRxT - halUartRxH; + + if (cnt >= HAL_UART_USB_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (evt && (NULL != usbCB)) + { + usbCB(0, evt); + } + } +#endif + + USBFW_SELECT_ENDPOINT(ep); +} + +/*********************************************************************************** +* @fn halUartPollTx +* +* @brief Poll for data to USB. +* +* @param none +* +* @return none +*/ +static void halUartPollTx(void) +{ + uint8 ep = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(4); + + // If the IN endpoint is ready to accept data. + if (USBFW_IN_ENDPOINT_DISARMED()) + { + if (halUartTxT == halUartTxH) + { +#if !defined HAL_SB_BOOT_CODE + if (!usbTxMT && usbCB) + { + usbTxMT = TRUE; + usbCB(0, HAL_UART_TX_EMPTY); + } +#endif + } + else + { + uint8 max = HAL_UART_USB_TX_MAX; + + do + { + USBF4 = halUartTxQ[halUartTxH++]; + } while ((halUartTxH != halUartTxT) && (0 != --max)); + + USBFW_ARM_IN_ENDPOINT(); + } + } + + USBFW_SELECT_ENDPOINT(ep); +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_adc.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_adc.c new file mode 100644 index 0000000..392cd2a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_adc.c @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_adc.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the HAL ADC. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_ADC_EOC 0x80 /* End of Conversion bit */ +#define HAL_ADC_START 0x40 /* Starts Conversion */ + +#define HAL_ADC_STSEL_EXT 0x00 /* External Trigger */ +#define HAL_ADC_STSEL_FULL 0x10 /* Full Speed, No Trigger */ +#define HAL_ADC_STSEL_T1C0 0x20 /* Timer1, Channel 0 Compare Event Trigger */ +#define HAL_ADC_STSEL_ST 0x30 /* ADCCON1.ST =1 Trigger */ + +#define HAL_ADC_RAND_NORM 0x00 /* Normal Operation */ +#define HAL_ADC_RAND_LFSR 0x04 /* Clock LFSR */ +#define HAL_ADC_RAND_SEED 0x08 /* Seed Modulator */ +#define HAL_ADC_RAND_STOP 0x0c /* Stop Random Generator */ +#define HAL_ADC_RAND_BITS 0x0c /* Bits [3:2] */ + +#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */ +#define HAL_ADC_DEC_128 0x10 /* Decimate by 128 : 10-bit resolution */ +#define HAL_ADC_DEC_256 0x20 /* Decimate by 256 : 12-bit resolution */ +#define HAL_ADC_DEC_512 0x30 /* Decimate by 512 : 14-bit resolution */ +#define HAL_ADC_DEC_BITS 0x30 /* Bits [5:4] */ + +#define HAL_ADC_STSEL HAL_ADC_STSEL_ST +#define HAL_ADC_RAND_GEN HAL_ADC_RAND_STOP +#define HAL_ADC_REF_VOLT HAL_ADC_REF_AVDD +#define HAL_ADC_DEC_RATE HAL_ADC_DEC_064 +#define HAL_ADC_SCHN HAL_ADC_CHN_VDD3 +#define HAL_ADC_ECHN HAL_ADC_CHN_GND + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +#if (HAL_ADC == TRUE) +static uint8 adcRef; +#endif + +/************************************************************************************************** + * @fn HalAdcInit + * + * @brief Initialize ADC Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalAdcInit (void) +{ +#if (HAL_ADC == TRUE) + adcRef = HAL_ADC_REF_VOLT; +#endif +} + +/************************************************************************************************** + * @fn HalAdcRead + * + * @brief Read the ADC based on given channel and resolution + * + * @param channel - channel where ADC will be read + * @param resolution - the resolution of the value + * + * @return 16 bit value of the ADC in offset binary format. + * + * Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale. + * Note2: This function assumes that ADCCON3 contains the voltage reference. + **************************************************************************************************/ +uint16 HalAdcRead (uint8 channel, uint8 resolution) +{ + int16 reading = 0; + +#if (HAL_ADC == TRUE) + uint8 i, resbits; + uint8 adcChannel = 1; + + /* + * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled. The code + * does NOT disable the pin at the end of this function. I think it is better to leave the pin + * enabled because the results will be more accurate. Because of the inherent capacitance on the + * pin, it takes time for the voltage on the pin to charge up to its steady-state level. If + * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage + * than actuality because the pin did not have time to fully charge. + */ + if (channel < 8) + { + for (i=0; i < channel; i++) + { + adcChannel <<= 1; + } + } + + /* Enable channel */ + ADCCFG |= adcChannel; + + /* Convert resolution to decimation rate */ + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + resbits = HAL_ADC_DEC_064; + break; + case HAL_ADC_RESOLUTION_10: + resbits = HAL_ADC_DEC_128; + break; + case HAL_ADC_RESOLUTION_12: + resbits = HAL_ADC_DEC_256; + break; + case HAL_ADC_RESOLUTION_14: + default: + resbits = HAL_ADC_DEC_512; + break; + } + + /* writing to this register starts the extra conversion */ + ADCCON3 = channel | resbits | adcRef; + + /* Wait for the conversion to be done */ + while (!(ADCCON1 & HAL_ADC_EOC)); + + /* Disable channel after done conversion */ + ADCCFG &= (adcChannel ^ 0xFF); + + /* Read the result */ + reading = (int16) (ADCL); + reading |= (int16) (ADCH << 8); + + /* Treat small negative as 0 */ + if (reading < 0) + reading = 0; + + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + reading >>= 8; + break; + case HAL_ADC_RESOLUTION_10: + reading >>= 6; + break; + case HAL_ADC_RESOLUTION_12: + reading >>= 4; + break; + case HAL_ADC_RESOLUTION_14: + default: + reading >>= 2; + break; + } +#else + // unused arguments + (void) channel; + (void) resolution; +#endif + + return ((uint16)reading); +} + +/************************************************************************************************** + * @fn HalAdcSetReference + * + * @brief Sets the reference voltage for the ADC and initializes the service + * + * @param reference - the reference voltage to be used by the ADC + * + * @return none + * + **************************************************************************************************/ +void HalAdcSetReference ( uint8 reference ) +{ +#if (HAL_ADC == TRUE) + adcRef = reference; +#endif +} + +/********************************************************************* + * @fn HalAdcCheckVdd + * + * @brief Check for minimum Vdd specified. + * + * @param vdd - The board-specific Vdd reading to check for. + * + * @return TRUE if the Vdd measured is greater than the 'vdd' minimum parameter; + * FALSE if not. + * + *********************************************************************/ +bool HalAdcCheckVdd(uint8 vdd) +{ + ADCCON3 = 0x0F; + while (!(ADCCON1 & 0x80)); + return (ADCH > vdd); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_board_cfg.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_board_cfg.h new file mode 100644 index 0000000..f052925 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_board_cfg.h @@ -0,0 +1,360 @@ +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2012-08-31 11:31:40 -0700 (Fri, 31 Aug 2012) $ + Revision: $Revision: 31449 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC2540USB (8051 core). + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "usb_board_cfg.h" + +/* Board Identifier */ + +#define HAL_BOARD_CC2540USB + +/* Clock Speed */ + +#define HAL_CPU_CLOCK_MHZ 32 + +/* Sleep Clock */ + +#define EXTERNAL_CRYSTAL_OSC 0x00 // external 32kHz XOSC +#define INTERNAL_RC_OSC 0x80 // internal 32kHz RCOSC + +// For USB, assume internal, unless an external crystal is explicitly indicated. +#if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == FALSE)) +#define OSC_32KHZ INTERNAL_RC_OSC +#else +#define OSC_32KHZ EXTERNAL_CRYSTAL_OSC +#endif + + /* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LED Configuration */ + +#define HAL_NUM_LEDS 2 + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P0_0 +#define LED1_DDR P0DIR +#define LED1_POLARITY ACTIVE_LOW + +/* 2 - Red */ +#define LED2_BV BV(1) +#define LED2_SBIT P1_1 +#define LED2_DDR P1DIR +#define LED2_POLARITY ACTIVE_HIGH + +/* Push Button Configuration */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* S1 */ +#define PUSH1_BV BV(2) +#define PUSH1_SBIT P1_2 +#define PUSH1_POLARITY ACTIVE_LOW + +/* S2 */ +#define PUSH2_BV BV(3) +#define PUSH2_SBIT P1_3 +#define PUSH2_POLARITY ACTIVE_LOW + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 + +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_SIZE 2048 +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +#define HAL_FLASH_LOCK_BITS 16 + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_NV_PAGE_END 30 +#elif defined FEATURE_UBL_MSD +#define HAL_NV_PAGE_END 121 +#else +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + +/* Reserving 1st 3 pages and last page for USB-CDC boot loader. */ + +#define HAL_USB_IMG_ADDR 0x1800 +#define HAL_USB_CRC_ADDR 0x1890 +// Size of internal flash less 4 pages for boot loader and 6 pages for NV. +#define HAL_USB_IMG_SIZE (0x40000 - 0x2000 - 0x3000) + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} + +/* Board Initialization */ +#if defined HAL_USB_BOOT_CODE +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Disconnect D+ signal to host. */ \ + HAL_USB_PULLUP_DISABLE(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} + +#else +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} +#endif + +/* Debounce */ + +#define HAL_DEBOUNCE(expr) { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } } + +/* Push Buttons */ + +#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) +#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) +#define HAL_PUSH_BUTTON3() (0) +#define HAL_PUSH_BUTTON4() (0) +#define HAL_PUSH_BUTTON5() (0) +#define HAL_PUSH_BUTTON6() (0) + +/* LED's */ + +#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) +#define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) +#define HAL_TURN_OFF_LED3() HAL_TURN_OFF_LED1() +#define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED2() + +#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) +#define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) +#define HAL_TURN_ON_LED3() HAL_TURN_ON_LED1() +#define HAL_TURN_ON_LED4() HAL_TURN_ON_LED2() + +#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) +#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) +#define HAL_TOGGLE_LED3() HAL_TOGGLE_LED1() +#define HAL_TOGGLE_LED4() HAL_TOGGLE_LED2() + +#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) +#define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) +#define HAL_STATE_LED3() HAL_STATE_LED1() +#define HAL_STATE_LED4() HAL_STATE_LED2() + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC TRUE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES TRUE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA TRUE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD FALSE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + +/* Set to TRUE enable UART usage, FALSE disable it */ +#ifndef HAL_UART +#define HAL_UART TRUE +#define HAL_UART_DMA 0 +#define HAL_UART_ISR 0 +#define HAL_UART_USB 1 +#endif + +#ifndef HAL_UART_DMA +#define HAL_UART_DMA 0 +#endif +#ifndef HAL_UART_ISR +#define HAL_UART_ISR 0 +#endif + +#ifndef HAL_UART_USB +# if HAL_UART +# define HAL_UART_USB 1 +# else +# define HAL_UART_USB 0 +# endif +#endif + +/* Set to TRUE enable HID usage, FALSE disable it */ +#ifndef HAL_HID +#define HAL_HID FALSE +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BOARD_CFG_H */ + +/******************************************************************************* +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_flash.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_key.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_key.c new file mode 100644 index 0000000..1b2966b --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_key.c @@ -0,0 +1,308 @@ +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-06-22 10:04:42 -0700 (Fri, 22 Jun 2012) $ + Revision: $Revision: 30773 $ + + Description: This file contains the interface to the H/W Key driver. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_drivers.h" +#include "hal_key.h" +#include "hal_types.h" +#include "osal.h" +#include "usb_interrupt.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_KEY_CLR_INT() \ +st ( \ + /* PxIFG has to be cleared before PxIF. */\ + P1IFG = 0; \ + P1IF = 0; \ +) + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ + +uint8 Hal_KeyIntEnable; + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +static halKeyCBack_t pHalKeyProcessFunction; +static volatile uint8 isrKeys; +static uint8 halKeys; + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalKeyInit + * + * @brief This function is called by HalDriverInit to initialize the H/W keys. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyInit(void) +{ +} + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief This function is called by HalDriverInit to initialize the H/W keys. + * + * input parameters + * + * @param interruptEnable - TRUE/FALSE to enable the key interrupt. + * @param cback - The callback function for the key change event. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback) +{ + if ((Hal_KeyIntEnable = interruptEnable)) + { + HAL_KEY_CLR_INT(); // Clear spurious ints. + PICTL |= 0x01; // P1ICONL: Falling edge ints on pins 0-3. + P1IEN |= PUSH1_BV | PUSH2_BV; // Enable specific P1 bits for ints by bit mask. + IEN2 |= 0x10; // Enable general P1 interrupts. + } + else + { + (void)osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + pHalKeyProcessFunction = cback; +} + +/************************************************************************************************** + * @fn HalKeyPoll + * + * @brief This function is called by Hal_ProcessEvent() on a HAL_KEY_EVENT. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyPoll(void) +{ + uint8 newKeys; + + if (Hal_KeyIntEnable) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); + newKeys = isrKeys; + isrKeys = 0; + HAL_EXIT_CRITICAL_SECTION(intState); + } + else + { + uint8 keys = HalKeyRead(); + newKeys = (halKeys ^ keys) & keys; + halKeys = keys; + } + + if (newKeys && pHalKeyProcessFunction) + { + (pHalKeyProcessFunction)(newKeys, HAL_KEY_STATE_NORMAL); + } +} + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief This function is called anywhere. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The bit mask of all keys pressed. + ************************************************************************************************** + */ +uint8 HalKeyRead(void) +{ + uint8 keys = 0; + + if (HAL_PUSH_BUTTON1()) + { + keys |= HAL_KEY_SW_1; + } + + if (HAL_PUSH_BUTTON2()) + { + keys |= HAL_KEY_SW_2; + } + + return keys; +} + +/************************************************************************************************** + * @fn HalKeyEnterSleep + * + * @brief - Get called to enter sleep mode + * + * @param + * + * @return + **************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** + * @fn HalKeyExitSleep + * + * @brief - Get called when sleep is over + * + * @param + * + * @return - return saved keys + **************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +/************************************************************************************************** + * @fn usbKeyISR + * + * @brief This function is the ISR for the Port2 USB/Key interrupt. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +HAL_ISR_FUNCTION( usbKeyISR, P1INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + if (P1IFG & PUSH1_BV) + { + isrKeys |= HAL_KEY_SW_1; + } + + if (P1IFG & PUSH2_BV) + { + isrKeys |= HAL_KEY_SW_2; + } + + HAL_KEY_CLR_INT(); + (void)osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +#else + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif /* HAL_KEY */ + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_lcd.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_lcd.c new file mode 100644 index 0000000..b29acf3 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_lcd.c @@ -0,0 +1,767 @@ +/************************************************************************************************** + Filename: hal_lcd.c + Revised: $Date: 2012-08-03 14:28:46 -0700 (Fri, 03 Aug 2012) $ + Revision: $Revision: 31092 $ + + Description: This file contains the interface to the HAL LCD Service. + + + Copyright 2007 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "hal_lcd.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "hal_assert.h" + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + #include "DebugTrace.h" +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +/* + LCD pins + + //control + P0.0 - LCD_MODE + P1.1 - LCD_FLASH_RESET + P1.2 - LCD_CS + + //spi + P1.5 - CLK + P1.6 - MOSI + P1.7 - MISO +*/ + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LCD Control lines */ +#define HAL_LCD_MODE_PORT 0 +#define HAL_LCD_MODE_PIN 0 + +#define HAL_LCD_RESET_PORT 1 +#define HAL_LCD_RESET_PIN 1 + +#define HAL_LCD_CS_PORT 1 +#define HAL_LCD_CS_PIN 2 + +/* LCD SPI lines */ +#define HAL_LCD_CLK_PORT 1 +#define HAL_LCD_CLK_PIN 5 + +#define HAL_LCD_MOSI_PORT 1 +#define HAL_LCD_MOSI_PIN 6 + +#define HAL_LCD_MISO_PORT 1 +#define HAL_LCD_MISO_PIN 7 + +/* SPI settings */ +#define HAL_SPI_CLOCK_POL_LO 0x00 +#define HAL_SPI_CLOCK_PHA_0 0x00 +#define HAL_SPI_TRANSFER_MSB_FIRST 0x20 + +/* LCD lines */ +#define LCD_MAX_LINE_COUNT 3 + +/* Defines for HW LCD */ + +/* Set power save mode */ +#define OSC_OFF 0x00 +#define OSC_ON 0x01 +#define POWER_SAVE_OFF 0x00 +#define POWER_SAVE_ON 0x02 +#define SET_POWER_SAVE_MODE(options) HalLcd_HW_Control(0x0C | (options)) + +/* Function Set */ +#define CGROM 0x00 +#define CGRAM 0x01 +#define COM_FORWARD 0x00 +#define COM_BACKWARD 0x02 +#define TWO_LINE 0x00 +#define THREE_LINE 0x04 +#define FUNCTION_SET(options) HalLcd_HW_Control(0x10 | (options)) + +/* Set Display Start Line */ +#define LINE1 0x00 +#define LINE2 0x01 +#define LINE3 0x02 +#define LINE4 0x03 +#define SET_DISPLAY_START_LINE(line) HalLcd_HW_Control(0x18 | (line)) + +/* Bias control */ +#define BIAS_1_5 0x00 +#define BIAS_1_4 0x01 +#define SET_BIAS_CTRL(bias) HalLcd_HW_Control(0x1C | (bias)) + +/* Power control */ +#define VOLTAGE_DIVIDER_OFF 0x00 +#define VOLTAGE_DIVIDER_ON 0x01 +#define CONVERTER_AND_REG_OFF 0x00 +#define CONVERTER_AND_REG_ON 0x04 +#define SET_POWER_CTRL(options) HalLcd_HW_Control(0x20 | (options)) + +// Set display control +#define DISPLAY_CTRL_ON 0x01 +#define DISPLAY_CTRL_OFF 0x00 +#define DISPLAY_CTRL_BLINK_ON 0x02 +#define DISPLAY_CTRL_BLINK_OFF 0x00 +#define DISPLAY_CTRL_CURSOR_ON 0x04 +#define DISPLAY_CTRL_CURSOR_OFF 0x00 +#define SET_DISPLAY_CTRL(options) HalLcd_HW_Control(0x28 | (options)) + +/* Set DD/ CGRAM address */ +#define SET_DDRAM_ADDR(charIndex) HalLcd_HW_Control(0x80 | (charIndex)) +#define SET_GCRAM_CHAR(specIndex) HalLcd_HW_Control(0xC0 | (specIndex)) + +/* Set ICONRAM address */ +#define CONTRAST_CTRL_REGISTER 0x10 +#define SET_ICONRAM_ADDR(addr) HalLcd_HW_Control(0x40 | (addr)) + +/* Set double height */ +#define LINE_1_AND_2 0x01 +#define LINE_2_AND_3 0x02 +#define NORMAL_DISPLAY 0x00 +#define SET_DOUBLE_HEIGHT(options) HalLcd_HW_Control(0x08 | (options)) + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val) +#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) + +#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) +#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define HAL_CONFIG_IO_PERIPHERAL(port, pin) HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) +#define HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + + + +/* SPI interface control */ +#define LCD_SPI_BEGIN() HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 0); /* chip select */ +#define LCD_SPI_END() \ +{ \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); /* chip select */ \ +} +/* clear the received and transmit byte status, write tx data to buffer, wait till transmit done */ +#define LCD_SPI_TX(x) { U1CSR &= ~(BV(2) | BV(1)); U1DBUF = x; while( !(U1CSR & BV(1)) ); } +#define LCD_SPI_WAIT_RXRDY() { while(!(U1CSR & BV(1))); } + + +/* Control macros */ +#define LCD_DO_WRITE() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); +#define LCD_DO_CONTROL() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 0); + +#define LCD_ACTIVATE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0); +#define LCD_RELEASE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +static uint8 *Lcd_Line1; +#endif //LCD + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +void HalLcd_HW_Init(void); +void HalLcd_HW_WaitUs(uint16 i); +void HalLcd_HW_Clear(void); +void HalLcd_HW_ClearAllSpecChars(void); +void HalLcd_HW_Control(uint8 cmd); +void HalLcd_HW_Write(uint8 data); +void HalLcd_HW_SetContrast(uint8 value); +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text); +void HalLcd_HW_WriteLine(uint8 line, const char *pText); +#endif //LCD + +/************************************************************************************************** + * @fn HalLcdInit + * + * @brief Initilize LCD Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcdInit(void) +{ +#if (HAL_LCD == TRUE) + Lcd_Line1 = NULL; + HalLcd_HW_Init(); +#endif +} + +/************************************************************************************************* + * LCD EMULATION FUNCTIONS + * + * Some evaluation boards are equipped with Liquid Crystal Displays + * (LCD) which may be used to display diagnostic information. These + * functions provide LCD emulation, sending the diagnostic strings + * to Z-Tool via the RS232 serial port. These functions are enabled + * when the "LCD_SUPPORTED" compiler flag is placed in the makefile. + * + * Most applications update both lines (1 and 2) of the LCD whenever + * text is posted to the device. This emulator assumes that line 1 is + * updated first (saved locally) and the formatting and send operation + * is triggered by receipt of line 2. Nothing will be transmitted if + * only line 1 is updated. + * + *************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalLcdWriteString + * + * @brief Write a string to the LCD + * + * @param str - pointer to the string that will be displayed + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteString ( char *str, uint8 option) +{ +#if (HAL_LCD == TRUE) + + uint8 strLen = 0; + uint8 totalLen = 0; + uint8 *buf; + uint8 tmpLen; + + if ( Lcd_Line1 == NULL ) + { + Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 ); + HalLcdWriteString( "Texas Instruments", 1 ); + } + + strLen = (uint8)osal_strlen( (char*)str ); + + /* Check boundries */ + if ( strLen > HAL_LCD_MAX_CHARS ) + strLen = HAL_LCD_MAX_CHARS; + + if ( option == HAL_LCD_LINE_1 ) + { + /* Line 1 gets saved for later */ + osal_memcpy( Lcd_Line1, str, strLen ); + Lcd_Line1[strLen] = '\0'; + } + else + { + /* Line 2 triggers action */ + tmpLen = (uint8)osal_strlen( (char*)Lcd_Line1 ); + totalLen = tmpLen + 1 + strLen + 1; + buf = osal_mem_alloc( totalLen ); + if ( buf != NULL ) + { + /* Concatenate strings */ + osal_memcpy( buf, Lcd_Line1, tmpLen ); + buf[tmpLen++] = ' '; + osal_memcpy( &buf[tmpLen], str, strLen ); + buf[tmpLen+strLen] = '\0'; + + /* Send it out */ +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + +#if defined(SERIAL_DEBUG_SUPPORTED) + debug_str( (uint8*)buf ); +#endif //LCD_SUPPORTED + +#endif //ZTOOL_P1 + + /* Free mem */ + osal_mem_free( buf ); + } + } + + /* Display the string */ + HalLcd_HW_WriteLine (option, str); + +#endif //HAL_LCD + +} + +/************************************************************************************************** + * @fn HalLcdWriteValue + * + * @brief Write a value to the LCD + * + * @param value - value that will be displayed + * radix - 8, 10, 16 + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option) +{ +#if (HAL_LCD == TRUE) + uint8 buf[HAL_LCD_MAX_BUFF]; + + _ltoa( value, &buf[0], radix ); + HalLcdWriteString( (char*)buf, option ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteScreen + * + * @brief Write a value to the LCD + * + * @param line1 - string that will be displayed on line 1 + * line2 - string that will be displayed on line 2 + * + * @return None + **************************************************************************************************/ +void HalLcdWriteScreen( char *line1, char *line2 ) +{ +#if (HAL_LCD == TRUE) + HalLcdWriteString( line1, 1 ); + HalLcdWriteString( line2, 2 ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value - value + * format - redix + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ) +{ +#if (HAL_LCD == TRUE) + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen] = ' '; + err = (uint32)(value); + _ltoa( err, &buf[tmpLen+1], format ); + HalLcdWriteString( (char*)buf, line ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value1 - value #1 + * format1 - redix of value #1 + * value2 - value #2 + * format2 - redix of value #2 + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, + uint16 value2, uint8 format2, uint8 line ) +{ + +#if (HAL_LCD == TRUE) + + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + if ( tmpLen ) + { + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen++] = ' '; + } + + err = (uint32)(value1); + _ltoa( err, &buf[tmpLen], format1 ); + tmpLen = (uint8)osal_strlen( (char*)buf ); + + buf[tmpLen++] = ','; + buf[tmpLen++] = ' '; + err = (uint32)(value2); + _ltoa( err, &buf[tmpLen], format2 ); + + HalLcdWriteString( (char *)buf, line ); + +#endif +} + +/************************************************************************************************** + * @fn HalLcdDisplayPercentBar + * + * @brief Display percentage bar on the LCD + * + * @param title - + * value - + * + * @return None + **************************************************************************************************/ +void HalLcdDisplayPercentBar( char *title, uint8 value ) +{ +#if (HAL_LCD == TRUE) + + uint8 percent; + uint8 leftOver; + uint8 buf[17]; + uint32 err; + uint8 x; + + /* Write the title: */ + HalLcdWriteString( title, HAL_LCD_LINE_1 ); + + if ( value > 100 ) + value = 100; + + /* convert to blocks */ + percent = (uint8)(value / 10); + leftOver = (uint8)(value % 10); + + /* Make window */ + osal_memcpy( buf, "[ ] ", 15 ); + + for ( x = 0; x < percent; x ++ ) + { + buf[1+x] = '>'; + } + + if ( leftOver >= 5 ) + buf[1+x] = '+'; + + err = (uint32)value; + _ltoa( err, (uint8*)&buf[13], 10 ); + + HalLcdWriteString( (char*)buf, HAL_LCD_LINE_2 ); + +#endif + +} + + +#if (HAL_LCD == TRUE) +/************************************************************************************************** + * HARDWARE LCD + **************************************************************************************************/ + +/************************************************************************************************** + * @fn halLcd_ConfigIO + * + * @brief Configure IO lines needed for LCD control. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigIO(void) +{ + /* GPIO configuration */ + HAL_CONFIG_IO_OUTPUT(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); +} + +/************************************************************************************************** + * @fn halLcd_ConfigSPI + * + * @brief Configure SPI lines needed for talking to LCD. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigSPI(void) +{ + /* UART/SPI Peripheral configuration */ + + uint8 baud_exponent; + uint8 baud_mantissa; + + /* Set SPI on UART 1 alternative 2 */ + PERCFG |= 0x02; + + /* Configure clk, master out and master in lines */ + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_CLK_PORT, HAL_LCD_CLK_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MOSI_PORT, HAL_LCD_MOSI_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MISO_PORT, HAL_LCD_MISO_PIN); + + + /* Set SPI speed to 1 MHz (the values assume system clk of 32MHz) + * Confirm on board that this results in 1MHz spi clk. + */ + baud_exponent = 15; + baud_mantissa = 0; + + /* Configure SPI */ + U1UCR = 0x80; /* Flush and goto IDLE state. 8-N-1. */ + U1CSR = 0x00; /* SPI mode, master. */ + U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent; + U1BAUD = baud_mantissa; +} + +/************************************************************************************************** + * @fn HalLcd_HW_Init + * + * @brief Initilize HW LCD Driver. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Init(void) +{ + /* Initialize LCD IO lines */ + halLcd_ConfigIO(); + + /* Initialize SPI */ + halLcd_ConfigSPI(); + + /* Perform reset */ + LCD_ACTIVATE_RESET(); + HalLcd_HW_WaitUs(15000); // 15 ms + LCD_RELEASE_RESET(); + HalLcd_HW_WaitUs(15); // 15 us + + /* Perform the initialization sequence */ + FUNCTION_SET(CGRAM | COM_FORWARD | THREE_LINE); + + /* Set contrast */ + HalLcd_HW_SetContrast(15); + + /* Set power */ + SET_POWER_SAVE_MODE(OSC_OFF | POWER_SAVE_ON); + SET_POWER_CTRL(VOLTAGE_DIVIDER_ON | CONVERTER_AND_REG_ON); + SET_BIAS_CTRL(BIAS_1_5); + HalLcd_HW_WaitUs(21000);// 21 ms + + /* Clear the display */ + HalLcd_HW_Clear(); + HalLcd_HW_ClearAllSpecChars(); + SET_DISPLAY_CTRL(DISPLAY_CTRL_ON | DISPLAY_CTRL_BLINK_OFF | DISPLAY_CTRL_CURSOR_OFF); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Control + * + * @brief Write 1 command to the LCD + * + * @param uint8 cmd - command to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Control(uint8 cmd) +{ + LCD_SPI_BEGIN(); + LCD_DO_CONTROL(); + LCD_SPI_TX(cmd); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Write + * + * @brief Write 1 byte to the LCD + * + * @param uint8 data - data to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Write(uint8 data) +{ + LCD_SPI_BEGIN(); + LCD_DO_WRITE(); + LCD_SPI_TX(data); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_SetContrast + * + * @brief Set display contrast + * + * @param uint8 value - contrast value + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_SetContrast(uint8 value) +{ + SET_ICONRAM_ADDR(CONTRAST_CTRL_REGISTER); + HalLcd_HW_Write(value); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Clear + * + * @brief Clear the HW LCD + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Clear(void) +{ + uint8 n; + + SET_DDRAM_ADDR(0x00); + for (n = 0; n < (LCD_MAX_LINE_COUNT * HAL_LCD_MAX_CHARS); n++) + { + HalLcd_HW_Write(' '); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_ClearAllSpecChars + * + * @brief Clear all special chars + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_ClearAllSpecChars(void) +{ + uint8 n = 0; + + SET_GCRAM_CHAR(0); + for (n = 0; n < (8 * 8); n++) + { + HalLcd_HW_Write(0x00); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_WriteChar + * + * @brief Write one char to the display + * + * @param uint8 line - line number that the char will be displayed + * uint8 col - colum where the char will be displayed + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text) +{ + if (col < HAL_LCD_MAX_CHARS) + { + SET_DDRAM_ADDR((line - 1) * HAL_LCD_MAX_CHARS + col); + HalLcd_HW_Write(text); + } + else + { + return; + } +} + +/************************************************************************************************** + * @fn halLcdWriteLine + * + * @brief Write one line on display + * + * @param uint8 line - display line + * char *pText - text buffer to write + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_WriteLine(uint8 line, const char *pText) +{ + uint8 count; + uint8 totalLength = (uint8)osal_strlen( (char *)pText ); + + /* Write the content first */ + for (count=0; countmode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->left = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + // Cancel any overlapping timer for blink events + osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT); + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if ( !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->left--; // Not continuous, reduce count + } + } + else if ( !(sts->left) && !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->mode ^= HAL_LED_MODE_BLINK; // No more blinks + } + else + { + pct = sts->onPct; // Percentage of cycle for on + sts->mode |= HAL_LED_MODE_ON; // Say it's on + HalLedOnOff( led, HAL_LED_MODE_ON ); // Turn it on + } + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + if (leds & HAL_LED_3) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED3(); + } + else + { + HAL_TURN_OFF_LED3(); + } + } + + if (leds & HAL_LED_4) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + HalSleepLedState |= HAL_STATE_LED3() << 2; + HalSleepLedState |= HAL_STATE_LED4() << 3; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_mcu.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_sleep.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_sleep.c new file mode 100644 index 0000000..2c74bd3 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_sleep.c @@ -0,0 +1,602 @@ +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#include "hal_types.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_sleep.h" +#include "hal_led.h" +#include "hal_key.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "hal_drivers.h" +#include "hal_assert.h" +#include "ll_sleep.h" +#include "ll_timer2.h" +#include "ll_math.h" + +/******************************************************************************* + * MACROS + */ + +#ifndef HAL_SLEEP_DEBUG_POWER_MODE +// Set CC2540 power mode; always use PM2. +#define HAL_SLEEP_PREP_POWER_MODE(mode) \ + st( SLEEPCMD &= ~PMODE; /* clear mode bits */ \ + SLEEPCMD |= mode; /* set mode bits */ \ + while (!(STLOAD & LDRDY)); \ + halSleepPconValue = PCON_IDLE; \ + ) +#define HAL_SLEEP_SET_POWER_MODE() \ + halSetSleepMode() + +#else // HAL_SLEEP_DEBUG_POWER_MODE + +// Debug: Don't set power mode, just block until sleep timer interrupt. +#define HAL_SLEEP_PREP_POWER_MODE(mode) /* nothing */ +#define HAL_SLEEP_SET_POWER_MODE() \ + st( while(halSleepInt == FALSE); \ + halSleepInt = FALSE; \ + HAL_DISABLE_INTERRUPTS(); \ + ) +#endif // !HAL_SLEEP_DEBUG_POWER_MODE + +// sleep timer interrupt control +#define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;) // enable sleep timer interrupt +#define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;) // disable sleep timer interrupt +#define HAL_SLEEP_TIMER_CLEAR_INT() st(IRCON &= ~0x80;) // clear sleep interrupt flag + +// backup interrupt enable registers before sleep +#define HAL_SLEEP_IE_BACKUP_AND_DISABLE( ien0, ien1, ien2 ) \ + st( (ien0) = IEN0; \ + (ien1) = IEN1; \ + (ien2) = IEN2; \ + IEN0 &= STIE_BV; \ + IEN1 &= P0IE_BV; \ + IEN2 &= (P1IE_BV|P2IE_BV); \ + ) + +// restore interrupt enable registers before sleep +#define HAL_SLEEP_IE_RESTORE( ien0, ien1, ien2 ) \ + st( IEN0 = (ien0); \ + IEN1 = (ien1); \ + IEN2 = (ien2); \ + ) + +// convert msec to 625 usec units with round +#define HAL_SLEEP_MS_TO_625US( ms ) (((((uint32) (ms)) * 8) + 4) / 5) + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 +#define HAL_SLEEP_MS_TO_32KHZ( ms ) ((((uint32) (ms)) * 4096) / 125) + +//Max 16 bit value +#define MAX_16BIT_TIMEOUT 0xFFFF + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). +#define CC2540_PM0 0 // PM0, Clock oscillators on, voltage regulator on +#define CC2540_PM1 1 // PM1, 32.768 kHz oscillators on, voltage regulator on +#define CC2540_PM2 2 // PM2, 32.768 kHz oscillators on, voltage regulator off +#define CC2540_PM3 3 // PM3, All clock oscillators off, voltage regulator off + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. +#define HAL_SLEEP_OFF CC2540_PM0 +#define HAL_SLEEP_TIMER CC2540_PM2 +#define HAL_SLEEP_DEEP CC2540_PM3 + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms +#define MAX_SLEEP_TIME 16711680 // max time to sleep allowed by ST, in 32kHz ticks + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period +#if !defined (PM_MIN_SLEEP_TIME) +#define PM_MIN_SLEEP_TIME 66 // default to min safe sleep time, in 32kHz ticks +#endif // !PM_MIN_SLEEP_TIME + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). +#if defined( CC2541) || defined( CC2541S ) +#define HAL_SLEEP_ADJ_TICKS 25 // default sleep adjustment, in 32kHz ticks +#else // CC2540 +#define HAL_SLEEP_ADJ_TICKS 35 // default sleep adjustment, in 32kHz ticks +#endif // CC2541 || CC2541S + +// sleep and external interrupt port masks +#define STIE_BV BV(5) +#define P0IE_BV BV(5) +#define P1IE_BV BV(4) +#define P2IE_BV BV(1) + +// for optimized indexing of uint32 +#if HAL_MCU_LITTLE_ENDIAN() +#define UINT32_NDX0 0 +#define UINT32_NDX1 1 +#define UINT32_NDX2 2 +#define UINT32_NDX3 3 +#else +#define UINT32_NDX0 3 +#define UINT32_NDX1 2 +#define UINT32_NDX2 1 +#define UINT32_NDX3 0 +#endif // HAL_MCU_LITTLE_ENDIAN() + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = HAL_SLEEP_OFF; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE +static bool halSleepInt = FALSE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = PCON_IDLE; + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + EA = 0; +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + if (osal_timeout > MAX_16BIT_TIMEOUT) + { + osal_timeout = MAX_16BIT_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_startup.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_timer.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_types.h b/Firmware/Radio/Components/hal/target/CC2540USB/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/hal_uart.c b/Firmware/Radio/Components/hal/target/CC2540USB/hal_uart.c new file mode 100644 index 0000000..37e6d10 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/hal_uart.c @@ -0,0 +1,374 @@ +/************************************************************************************************** + Filename: hal_uart.c + Revised: $Date: 2012-08-01 14:42:41 -0700 (Wed, 01 Aug 2012) $ + Revision: $Revision: 31065 $ + + Description: This file contains the interface to the H/W UART driver. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board_cfg.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#endif + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +void HalUARTIsrDMA(void); + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +#if HAL_UART_DMA +#include "_hal_uart_dma.c" +#endif +#if HAL_UART_ISR +#include "_hal_uart_isr.c" +#endif +#if HAL_UART_SPI +#include "_hal_uart_spi.c" +#endif +#if HAL_UART_USB +#include "_hal_uart_usb.c" +#endif + +/****************************************************************************** + * @fn HalUARTInit + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTInit(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTInitSPI(); + } + else + { + HalUARTInitDMA(); + } +#else +#if HAL_UART_DMA + HalUARTInitDMA(); +#endif +#if HAL_UART_ISR + HalUARTInitISR(); +#endif +#if HAL_UART_SPI + HalUARTInitSPI(); +#endif +#if HAL_UART_USB + HalUARTInitUSB(); +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTOpen + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param port - UART port + * config - contains configuration information + * + * @return Status of the function call + *****************************************************************************/ +uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenISR(config); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenISR(config); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_USB) + HalUARTOpenUSB(config); +#endif +#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) config; // unused argument +#endif + + return HAL_UART_SUCCESS; +} + +/***************************************************************************** + * @fn HalUARTRead + * + * @brief Read a buffer from the UART + * + * @param port - USART module designation + * buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadSPI(buf, len); +#endif + +#if HAL_UART_USB + return HalUARTRx(buf, len); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTWrite + * + * @brief Write a buffer to the UART. + * + * @param port - UART port + * buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteSPI(buf, len); +#endif + +#if HAL_UART_USB + HalUARTTx(buf, len); + return len; +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTSuspend + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTSuspend( void ) +{ +#if HAL_UART_ISR + HalUARTSuspendISR(); +#endif +} + +/****************************************************************************** + * @fn HalUARTResume + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTResume( void ) +{ +#if HAL_UART_ISR + HalUARTResumeISR(); +#endif +} + +/*************************************************************************************************** + * @fn HalUARTPoll + * + * @brief Poll the UART. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTPoll(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTPollSPI(); + } + else + { + HalUARTPollDMA(); + } +#else +#if HAL_UART_DMA + HalUARTPollDMA(); +#endif +#if HAL_UART_ISR + HalUARTPollISR(); +#endif +#if HAL_UART_SPI + HalUARTPollSPI(); +#endif +#if HAL_UART_USB + HalUARTPollUSB(); +#endif +#endif +} + +/************************************************************************************************** + * @fn Hal_UART_RxBufLen() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param port - UART port + * + * @return length of current Rx Buffer + **************************************************************************************************/ +uint16 Hal_UART_RxBufLen( uint8 port ) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailSPI(); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailSPI(); +#endif + +#if HAL_UART_USB + return HalUARTRxAvailUSB(); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + #endif + return 0; +#endif +} + +void HalUARTIsrDMA(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUART_DMAIsrSPI(); + } + else + { + HalUART_DMAIsrDMA(); + } +#elif HAL_UART_DMA + HalUART_DMAIsrDMA(); +#elif HAL_UART_SPI + HalUART_DMAIsrSPI(); +#endif +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h new file mode 100644 index 0000000..195d123 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h @@ -0,0 +1,118 @@ +/*********************************************************************************** + + Filename: usb_cdc.h + + Description: USB CDC definitions. + +***********************************************************************************/ + +#ifndef USB_CDC_H +#define USB_CDC_H + +/* Device Class Code */ +#define CDC_DEVICE 0x02 + +/* Communication Interface Class Code */ +#define COMM_INTF 0x02 + +/* Communication Interface Class SubClass Codes */ +#define ABSTRACT_CONTROL_MODEL 0x02 + +/* Communication Interface Class Control Protocol Codes */ +#define V25TER 0x01 // Common AT commands ("Hayes(TM)") + + +/* Data Interface Class Codes */ +#define DATA_INTF 0x0A + +/* Data Interface Class Protocol Codes */ +#define NO_PROTOCOL 0x00 // No class specific protocol required + + +/* Communication Feature Selector Codes */ +#define ABSTRACT_STATE 0x01 +#define COUNTRY_SETTING 0x02 + +/* Functional Descriptors */ +/* Type Values for the bDescType Field */ +#define CS_INTERFACE 0x24 +#define CS_ENDPOINT 0x25 + +/* bDescSubType in Functional Descriptors */ +#define DSC_FN_HEADER 0x00 +#define DSC_FN_CALL_MGT 0x01 +#define DSC_FN_ACM 0x02 // ACM - Abstract Control Management +#define DSC_FN_DLM 0x03 // DLM - Direct Line Managment +#define DSC_FN_TELEPHONE_RINGER 0x04 +#define DSC_FN_RPT_CAPABILITIES 0x05 +#define DSC_FN_UNION 0x06 +#define DSC_FN_COUNTRY_SELECTION 0x07 +#define DSC_FN_TEL_OP_MODES 0x08 +#define DSC_FN_USB_TERMINAL 0x09 +/* more.... see Table 25 in USB CDC Specification 1.1 */ + + +#define CDC_COMM_INTF_ID 0x00 +#define CDC_DATA_INTF_ID 0x01 + + + +// CLASS REQUESTS +#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_SET_COMM_FEATURE 0x02 //optional +#define CDC_GET_COMM_FEATURE 0x03 //optional +#define CDC_CLEAR_COMM_FEATURE 0x04 //optional +#define CDC_SET_LINE_CODING 0x20 //optional +#define CDC_GET_LINE_CODING 0x21 //optional +#define CDC_SET_CONTROL_LINE_STATE 0x22 //optional +#define CDC_SEND_BREAK 0x23 //optional + + + +#define CDC_CHAR_FORMAT_1_STOP_BIT 0 +#define CDC_CHAR_FORMAT_1_5_STOP_BIT 1 +#define CDC_CHAR_FORMAT_2_STOP_BIT 2 + +#define CDC_PARITY_TYPE_NONE 0 +#define CDC_PARITY_TYPE_ODD 1 +#define CDC_PARITY_TYPE_EVEN 2 +#define CDC_PARITY_TYPE_MARK 3 +#define CDC_PARITY_TYPE_SPACE 4 + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS†WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 new file mode 100644 index 0000000..00ee177 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 @@ -0,0 +1,235 @@ +/*********************************************************************************** + + Filename: usb_cdc_descriptor.s51 + + Description: Descriptor for USB CDC class. + +***********************************************************************************/ +/* ++------------------------------------------------------------------------------ +|The default USB descriptor defines a minimum configuration, with no endpoints +|apart from EP0. The application can define 3 IN and OUT endpoints, and override +|the configuration and interface descriptor (only one of each). +|The device and string descriptors are locked. ++------------------------------------------------------------------------------*/ + + +#define ASM_FILE +#include "..\library\usb_descriptor.h" +#include "usb_cdc.h" + +#if !defined chip +#define chip 2540 +#endif + + MODULE usb_descriptor + + RSEG RCODE + + PUBLIC usbDescStart; + PUBLIC usbDescEnd; + PUBLIC usbDescLut; + PUBLIC usbDescLutEnd; + PUBLIC usbDblbufLut; + PUBLIC usbDblbufLutEnd; + +;;------------------------------------------------------------------------------------------------------- +;; USB descriptors +usbDescStart: +deviceDesc: ; Device descriptor + DB deviceDescEnd - deviceDesc + DB DESC_TYPE_DEVICE ; bDescriptorType + DB 00H, 02H ; bcdUSB + DB CDC_DEVICE ; bDeviceClass + DB 00H ; bDeviceSubClass + DB 00H ; bDeviceProtocol + DB EP0_PACKET_SIZE + DB 51H, 04H ; idVendor Texas Instruments + #if (chip==2540) + DB 0AAH, 16H ; idProduct CC2540 + #elif (chip==2531) + DB 0A8H, 16H ; idProduct CC2531 + #elif (chip==2511) + DB 0A4H, 16H ; idProduct CC2511 + #else + DB 0A6H, 16H ; idProduct CC1111 + #endif + DB 09H, 00H ; bcdDevice + DB 01H ; iManufacturer + DB 02H ; iProduct + DB 03H ; iSerialNumber (OR set to zero) + DB 01H ; bNumConfigurations +deviceDescEnd: + +config1LengthStart: +configDesc: ; Configuration descriptor + DB configDescEnd - configDesc + DB DESC_TYPE_CONFIG ; bDescriptorType + DB config1LengthEnd - config1LengthStart, 00H + DB 02H ; NumInterfaces + DB 01H ; bConfigurationValue + DB 00H ; iConfiguration + DB 80H ; bmAttributes + DB 25 ; MaxPower +configDescEnd: + + +; +; INTERFACE 0 +; + + +interface0Desc: ; Interface descriptor + DB interface0DescEnd - interface0Desc + DB DESC_TYPE_INTERFACE ; bDescriptorType + DB 00H ; bInterfaceNumber + DB 00H ; bAlternateSetting + DB 01H ; bNumEndpoints + DB COMM_INTF ; bInterfaceClass + DB ABSTRACT_CONTROL_MODEL ; bInterfaceSubClass + DB V25TER ; bInterfaceProcotol + DB 00H ; iInterface +interface0DescEnd: + +;; CDC Class-Specific Descriptors + +headerFunctionalDesc: ; Header Functional Descriptor + DB headerFunctionalDescEnd - headerFunctionalDesc + DB CS_INTERFACE + DB DSC_FN_HEADER + DB 10H, 01H +headerFunctionalDescEnd: + + +absCtrlManFuncDesc: ; Abstract Control Management Functional Descriptor + DB absCtrlManFuncDescEnd - absCtrlManFuncDesc + DB CS_INTERFACE + DB DSC_FN_ACM + DB 02H ;set the supported class requests +absCtrlManFuncDescEnd: + +unionFunctionalDesc: ; Union Functional Descriptor + DB unionFunctionalDescEnd - unionFunctionalDesc + DB CS_INTERFACE + DB DSC_FN_UNION + DB CDC_COMM_INTF_ID + DB CDC_DATA_INTF_ID +unionFunctionalDescEnd: + + +callMngFuncDesc: ; Call Management Functional Descriptor + DB callMngFuncDescEnd - callMngFuncDesc + DB CS_INTERFACE + DB DSC_FN_CALL_MGT + DB 00H + DB CDC_DATA_INTF_ID +callMngFuncDescEnd: + + + +endpoint0Desc: ; Endpoint descriptor (EP2 IN) + DB endpoint0DescEnd - endpoint0Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 82H ; bEndpointAddress + DB EP_ATTR_INT ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 40H ; bInterval +endpoint0DescEnd: + +; +; INTERFACE 1 +; + +interface1Desc: ; Interface descriptor + DB interface1DescEnd - interface1Desc + DB DESC_TYPE_INTERFACE ; Interface descriptor type + DB 01H ; Interface Number + DB 00H ; Alternate Setting Number + DB 02H ; Number of endpoints in this intf + DB DATA_INTF ; Class code + DB 00H ; Subclass code + DB NO_PROTOCOL ; Protocol code + DB 00H ; Interface string index +interface1DescEnd: + + +endpoint1Desc: ; Endpoint descriptor (EP4 OUT) + DB endpoint1DescEnd - endpoint1Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 84H ; bEndpointAddress + DB EP_ATTR_BULK ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 01H ; bInterval +endpoint1DescEnd: + +endpoint2Desc: ; Endpoint descriptor (EP4 IN) + DB endpoint2DescEnd - endpoint2Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 04H ; bEndpointAddress + DB EP_ATTR_BULK ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 01H ; bInterval +endpoint2DescEnd: +config1LengthEnd: +;;------------------------------------------------------------------------------------------------------- + +usbDescEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for descriptors that are not returned through requests for DSC_DEVICE, DSC_CONFIG or +;; DSC_STRING (e.g. HID report descriptors) +usbDescLut: +usbDescLutEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for double buffer settings (one set of bit masks for each defined interface) +usbDblbufLut: DW interface0Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask + DW interface1Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask +usbDblbufLutEnd: +;;------------------------------------------------------------------------------------------------------- + + + END; + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c new file mode 100644 index 0000000..ffd65e9 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c @@ -0,0 +1,156 @@ +/*********************************************************************************** + + Filename: usb_cdc_hooks.c + + Contains the necessary hook functions for various USB request processing + that is featured from the USB firmware library. Some + functions are empty. + +***********************************************************************************/ + + +/********************************************************************************** + * INCLUDES + */ + +#include "usb_cdc.h" +#include "usb_cdc_hooks.h" +#include "usb_firmware_library_headers.h" + +#include "hal_types.h" + +/* Global data */ + +CDC_LINE_CODING_STRUCTURE currentLineCoding; + + +// ********************************************************************************* +// All Hooks and functions required by the USB library. +// ********************************************************************************* + +// **************** Process USB class requests with OUT data phase ***************** +void usbcrHookProcessOut(void) +{ + // Process USB class requests with OUT data phase, or stall endpoint 0 when unsupported + if (usbSetupHeader.request == CDC_SET_CONTROL_LINE_STATE) { + // Control line state from host + if(usbfwData.ep0Status == EP_IDLE) + { + usbfwData.ep0Status = EP_RX; + } + + + } else if(usbSetupHeader.request == CDC_SET_LINE_CODING) { + + if(usbfwData.ep0Status == EP_IDLE) + { + usbSetupData.pBuffer = (uint8 __xdata *) ¤tLineCoding; + usbfwData.ep0Status = EP_RX; + } + else if(usbfwData.ep0Status == EP_RX) { } + } + // Unknown request? + else { + usbfwData.ep0Status = EP_STALL; + } +} + +// **************** Process USB class requests with IN data phase ****************** +void usbcrHookProcessIn(void) +{ + // Process USB class requests with IN data phase, or stall endpoint 0 when unsupported + if (usbSetupHeader.request == CDC_GET_LINE_CODING) { + // First the endpoint status is EP_IDLE... + if (usbfwData.ep0Status == EP_IDLE) { + usbSetupData.pBuffer = (uint8 __xdata *) ¤tLineCoding; + usbSetupData.bytesLeft = 7; + usbfwData.ep0Status = EP_TX; + // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer) + } else if (usbfwData.ep0Status == EP_TX) { + // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + } + } else { + usbfwData.ep0Status = EP_STALL; + } +} + +// ******************************** Unsupported USB hooks ************************* +void usbvrHookProcessOut(void) {usbfwData.ep0Status = EP_STALL; } +void usbvrHookProcessIn(void) {usbfwData.ep0Status = EP_STALL; } + +// ************************ unsupported/unhandled standard requests *************** +void usbsrHookSetDescriptor(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSynchFrame(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookClearFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSetFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus) { } + + +// ************************ USB standard request event processing ****************** +void usbsrHookProcessEvent(uint8 event, uint8 index) +{ + // Process relevant events, one at a time. + switch (event) { + case USBSR_EVENT_CONFIGURATION_CHANGING : //(the device configuration is about to change) + break; + case USBSR_EVENT_CONFIGURATION_CHANGED :// (the device configuration has changed) + break; + case USBSR_EVENT_INTERFACE_CHANGING ://(the alternate setting of the given interface is about to change) + break; + case USBSR_EVENT_INTERFACE_CHANGED : //(the alternate setting of the given interface has changed) + break; + case USBSR_EVENT_REMOTE_WAKEUP_ENABLED ://(remote wakeup has been enabled by the host) + break; + case USBSR_EVENT_REMOTE_WAKEUP_DISABLED ://(remote wakeup has been disabled by the host) + break; + case USBSR_EVENT_EPIN_STALL_CLEARED ://(the given IN endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPIN_STALL_SET ://(the given IN endpoint has been stalled by the host) + break; + case USBSR_EVENT_EPOUT_STALL_CLEARED ://(the given OUT endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPOUT_STALL_SET ://(the given OUT endpoint has been stalled by the PC) + break; + } +} + +// ************************ USB interrupt event processing ************************* +void usbirqHookProcessEvents(void) +{ + // Handle events that require immediate processing here +} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h new file mode 100644 index 0000000..9f90800 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h @@ -0,0 +1,23 @@ +/*********************************************************************************** + + Filename: usb_cdc_hooks.h + + Description: USB Virtual UART interface. + +***********************************************************************************/ +#ifndef USB_CDC_HOOKS_H +#define USB_CDC_HOOKS_H + +#include "hal_types.h" + +typedef struct { + uint32 dteRate; + uint8 charFormat; + uint8 parityType; + uint8 dataBits; +} CDC_LINE_CODING_STRUCTURE; + +extern CDC_LINE_CODING_STRUCTURE currentLineCoding; + + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c new file mode 100644 index 0000000..4a68d5a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c @@ -0,0 +1,68 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.c + + Description: USB library configuration. + +***********************************************************************************/ + +/// \addtogroup module_usb_firmware_library_config +/// @{ +#define USBFIRMWARELIBRARYCONFIG_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" + +//----------------------------------------------------------------------------- +// READ THIS!! +// +// This file configures the USB Firmware Library. +// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.c", and +// put it in the project catalog. Then edit the code below as needed: +//----------------------------------------------------------------------------- + +// Declaration of global USB descriptor pointers +USB_DESCRIPTOR_MARKER usbDescriptorMarker= { + (uint8 __code *)&usbDescStart, + (uint8 __code *)&usbDescEnd, + (DESC_LUT_INFO __code *) &usbDescLut, + (DESC_LUT_INFO __code *) &usbDescLutEnd, + (DBLBUF_LUT_INFO __code *) &usbDblbufLut, + (DBLBUF_LUT_INFO __code *) &usbDblbufLutEnd +}; + +/// @} + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h new file mode 100644 index 0000000..336440b --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h @@ -0,0 +1,64 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.h + + Description: USB library configuration. + +***********************************************************************************/ +#ifndef USBFIRMWARELIBRARYCONFIG_H // Don't modify +#define USBFIRMWARELIBRARYCONFIG_H // Don't modify + +//----------------------------------------------------------------------------- +// READ THIS!! +// +// This file configures the USB Firmware Library. +// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.h", and +// put it in the project catalog. Then edit the definitions below: +//----------------------------------------------------------------------------- +// Includes + + +//----------------------------------------------------------------------------- +// Defines + +// Enter the maximum number of interfaces that are used in the configurations (used to calculate the size +// of the table that stores the currently selected alternate setting for each interface) +#define USB_SETUP_MAX_NUMBER_OF_INTERFACES 5 + + +#endif //#ifndef USBFIRMWARELIBRARYCONFIG_H +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h new file mode 100644 index 0000000..cb9bfce --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h @@ -0,0 +1,64 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_headers.h + + Description: Common inclusion of all USB library headers. + +***********************************************************************************/ + +#ifndef USB_FIRMWARE_LIBRARY_HEADERS_H +#define USB_FIRMWARE_LIBRARY_HEADERS_H + + +// This file includes all of the USB Library header files. +// When using the library, include this file only. + +// Also make a copy of usb_firmware_library_config_template.c and usb_firmware_library_config_template.h +// and add it to your project as usb_firmware_library_config.c and +// usb_firmware_library_config.h. The definitions in these files should be adapted to your project. + +#include "usb_firmware_library_config.h" +#include "usb_descriptor.h" +#include "usb_descriptor_parser.h" +#include "usb_interrupt.h" +#include "usb_framework.h" +#include "usb_reg.h" +#include "usb_standard_requests.h" +#include "usb_suspend.h" + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif //USB_FIRMWARE_LIBRARY_HEADERS_H + diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/driver/usb_cdc_driver_cc2540.inf b/Firmware/Radio/Components/hal/target/CC2540USB/usb/driver/usb_cdc_driver_cc2540.inf new file mode 100644 index 0000000..38d89a7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/driver/usb_cdc_driver_cc2540.inf @@ -0,0 +1,130 @@ +; +; Texas Instruments CC2540 Low-power RF to USB Serial Port example setup file +; +; based on Windows USB CDC ACM Setup file +; Copyright (c) 2000 Microsoft Corporation +; Copyright (C) 2009 Texas Instruments Inc + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%PROVIDER% +LayoutFile=layout.inf +DriverVer=05/01/2009,1.1.0.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTx86, NTia64, NTamd64 + +[DestinationDirs] +DefaultDestDir=12 + +[SourceDisksFiles] + +[SourceDisksNames] + +[DeviceList.NTx86] +%DESCRIPTION%=DriverInstall, USB\VID_0451&PID_16AA + +[DeviceList.NTia64] +%DESCRIPTION%=DriverInstall, USB\VID_0451&PID_16AA + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_0451&PID_16AA + + +;------------------------------------------------------------------------------ +; 32-bit section for Windows 2000/2003/XP/Vista +;------------------------------------------------------------------------------ + +[DriverInstall.NTx86] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTx86.AddReg + +[DriverInstall.NTx86] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTx86.AddReg + +[DriverCopyFiles] +usbser.sys,,,0x20 + +[DriverInstall.NTx86.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTx86.Services] +AddService=usbser, 0x00000002, DriverService + +;------------------------------------------------------------------------------ +; 64-bit section for Intel Itanium based systems +;------------------------------------------------------------------------------ + +[DriverInstall.NTia64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTia64.AddReg + +[DriverInstall.NTia64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTia64.AddReg + +[DriverCopyFiles] +usbser.sys,,,0x20 + +[DriverInstall.NTia64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTia64.Services] +AddService=usbser, 0x00000002, DriverService + +;------------------------------------------------------------------------------ +; 64-bit section for AMD64 and Intel EM64T based systems +;------------------------------------------------------------------------------ + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTamd64.AddReg + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles +AddReg=DriverInstall.NTamd64.AddReg + +[DriverCopyFiles] +usbser.sys,,,0x20 + +[DriverInstall.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService + +;------------------------------------------------------------------------------ +; +;------------------------------------------------------------------------------ + +[DriverService] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\usbser.sys ;;%12% == "%WINDIR%\system32\" + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ + +[Strings] +PROVIDER="Texas Instruments" +MFGNAME="Texas Instruments" +DESCRIPTION="TI CC2540 Low-Power RF to USB CDC Serial Port" +SERVICE="TI CC2540 Low-Power RF to USB CDC Serial Port" diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h new file mode 100644 index 0000000..f476804 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h @@ -0,0 +1,162 @@ +/************************************************************************************************** + Filename: usb_board_cfg.h + Revised: $Date: 2009-10-29 16:58:47 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21022 $ + + Description: + + This file implements the Temperature/Voltage Sample Application. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef USB_BOARD_CFG_H +#define USB_BOARD_CFG_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_mcu.h" +#include "ioCC2540.h" +#include "usb_reg.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_BOARD_IO_USB_ENABLE_PORT 1 // USB pull-up enable +#define HAL_BOARD_IO_USB_ENABLE_PIN 0 + +#define BIT0 0x01 +#define BIT1 0x02 +#define BIT2 0x04 +#define BIT3 0x08 +#define BIT4 0x10 +#define BIT5 0x20 +#define BIT6 0x40 +#define BIT7 0x80 + +#if !defined HAL_UART_USB_SUSPEND +#define HAL_UART_USB_SUSPEND FALSE +#endif + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_USB_ENABLE() st( USBCTRL= USBCTRL_PLL_EN | USBCTRL_USB_EN; \ + while (!(USBCTRL&USBCTRL_PLL_LOCKED)); ) +#define HAL_USB_PLL_DISABLE() st( USBCTRL&= ~USBCTRL_PLL_EN; \ + while (USBCTRL&USBCTRL_PLL_LOCKED); ) +#define HAL_USB_DISABLE st(USBCTRL = 0; while (USBCTRL & 0x80);) + +#define HAL_USB_PULLUP_ENABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 1) +#define HAL_USB_PULLUP_DISABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 0) + +#define HAL_USB_INT_ENABLE() st( P2IEN|= 0x20; IEN2|= 0x02; ) +#define HAL_USB_INT_DISABLE() st( P2IEN&= ~0x20; ) +#define HAL_USB_INT_CLEAR() st( P2IFG= 0; P2IF= 0; ) + +#define HAL_USB_RESUME_INT_ENABLE() st ( USBCIE |= 0x02; ) +#define HAL_USB_RESUME_INT_DISABLE() st ( USBCIE &= ~0x02; ) + +#define USBCTRL_PLL_LOCKED 0x80 +#define USBCTRL_PLL_EN 0x02 +#define USBCTRL_USB_EN 0x01 + +#define P2IFG_DPIF 0x20 + +#define CC2540_IS_XOSC_STABLE() (SLEEPSTA & XOSC_STB) + +#define NOP() asm("NOP") +#define MCU_IO_TRISTATE 1 // Used as "func" for the macros below +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +//----------------------------------------------------------------------------- +// Macros for simple configuration of IO pins on TI LPW SoCs +//----------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) +#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) +#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) +#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) +#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) +#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) +#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) + +#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) +#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) + +//---------------------------------------------------------------------------------- +// Macros for internal use (the macros above need a new round in the preprocessor) +//---------------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + +#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BV(pin); \ + P##port##DIR &= ~BV(pin); \ + switch (func) { \ + case MCU_IO_PULLUP: \ + P##port##INP &= ~BV(pin); \ + P2INP &= ~BV(port + 5); \ + break; \ + case MCU_IO_PULLDOWN: \ + P##port##INP &= ~BV(pin); \ + P2INP |= BV(port + 5); \ + break; \ + default: \ + P##port##INP |= BV(pin); \ + break; } ) + +#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) +#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) + +#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) +#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BV(pin)) + +#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR &= ~BV(pin); ) +#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BV(pin); ) + +#endif +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c new file mode 100644 index 0000000..525c7c6 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c @@ -0,0 +1,140 @@ +/*********************************************************************************** + + Filename: usb_interrupt.c + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +/// \addtogroup module_usb_interrupt +/// @{ +#define USBINTERRUPT_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" +#include "hal_flash.h" +#include "hal_led.h" + + +/** \brief Initializes the \ref module_usb_interrupt module + * + * This function should be called after the \ref module_usb_framework module has been initialized. + * Use interrupt group priority control (refer to the CC2531 datasheet) to adjust the priority of the + * USB interrupt relative to other interrupts. + * + * \param[in] irqMask + * A bit mask containing USBIRQ_EVENT bits for all events that shall be reported + */ +void usbirqInit(uint16 irqMask) +{ + // Initialize variables + usbirqData.eventMask = 0x0000; + usbirqData.inSuspend = FALSE; + usbirqData.irqMask = irqMask; + + // Select which IRQ flags to handle + USBCIE = irqMask; + USBIIE = irqMask >> 4; + USBOIE = (irqMask >> 9) & 0x3E; + + HAL_USB_INT_CLEAR(); + HAL_USB_INT_ENABLE(); + +} // usbirqInit + + + +/** \brief USB interrupt handler + * + * Clears the P2 interrupt flag and converts all USB interrupt flags into events. + * The interrupt also lets \ref usbsuspEnter() break from the suspend loop. + */ +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void) +#else +#pragma vector=P2INT_VECTOR +__interrupt void usbirqHandler(void) +#endif +{ + uint8 usbcif; + + // First make sure that the crystal oscillator is stable + while (!CC2540_IS_XOSC_STABLE()); + + // Special handling for reset interrupts + usbcif = USBCIF; + if (usbcif & USBCIF_RSTIF) { + + // All interrupts (except suspend) are by default enabled by hardware, so + // re-initialize the enable bits to avoid unwanted interrupts + USBCIE = usbirqData.irqMask; + USBIIE = usbirqData.irqMask >> 4; + USBOIE = (usbirqData.irqMask >> 9) & 0x3E; + + // Enable suspend mode when suspend signaling is detected on the bus + USBPOW |= USBPOW_SUSPEND_EN; + } + + // Record events (keeping existing) + usbirqData.eventMask |= (uint16) usbcif; + usbirqData.eventMask |= (uint16) USBIIF << 4; + usbirqData.eventMask |= (uint16) USBOIF << 9; + + // If we get a suspend event, we should always enter suspend mode. We must, + // however be sure that we exit the suspend loop upon resume or reset + // signaling. + if (usbcif & USBCIF_SUSPENDIF) { + usbirqData.inSuspend = TRUE; + } + if (usbcif & (USBCIF_RSTIF | USBCIF_RESUMEIF)) { + usbirqData.inSuspend = FALSE; + } + if (P2IFG & P2IFG_DPIF) { + // Resume interrupt detected on D+ line while in suspend + P2IFG = ~P2IFG_DPIF; + usbirqData.inSuspend = FALSE; + } + + // Handle event which need immediate processing + usbirqHookProcessEvents(); + + // Clear the interrupt + HAL_USB_INT_CLEAR(); + +} // usbirqHandler + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c new file mode 100644 index 0000000..4636c07 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c @@ -0,0 +1,139 @@ +/*********************************************************************************** + + Filename: usb_suspend.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_suspend +/// @{ +#include "usb_firmware_library_headers.h" +#include "hal_board.h" +#include "hal_mcu.h" +#include "hal_led.h" + +__xdata VFPTR pFnSuspendEnterHook= NULL; +__xdata VFPTR pFnSuspendExitHook= NULL; + +#if HAL_UART_USB_SUSPEND +extern void halEnterPowerMode(void); + +/** \brief Puts the chip into power mode 1 during USB suspend. + * + * This function must be called from main (i.e. not from interrupt context) upon the reception of a + * \ref USBIRQ_EVENT_SUSPEND event. To comply with the USB specification, this must happen within 10 ms + * after the event occurs. The chip will stay in power mode 1 until a USB resume or USB reset is detected + * on the USB bus, or remote wakeup is used. During this period, the MCU can only run code from + * interrupt context. + */ +void usbsuspEnter(void) +{ + if (pFnSuspendEnterHook!=NULL) + pFnSuspendEnterHook(); + + HAL_USB_INT_CLEAR(); + HAL_USB_INT_ENABLE(); + + // Disable USB clock (PLL) before entering PM1 + HAL_USB_PLL_DISABLE(); + + HAL_LED_CLR_1(); + + do { + // Enter PM1, in prescribed manner as explained in CC253x User's Guide + SLEEPCMD = 0x05; + halEnterPowerMode(); + } while ( usbirqData.inSuspend ); + + // .... we are now up and running again + + // First make sure that the crystal oscillator is stable + while (!CC2540_IS_XOSC_STABLE()); + + // Restart the USB clock (PLL) + HAL_USB_ENABLE(); + + if (pFnSuspendExitHook!=NULL) + pFnSuspendExitHook(); +} // usbsuspEnter +#endif + + + +/** \brief Attempts USB remote wakeup. + * + * This function can be called from interrupt context while the USB device is suspend mode. If the device + * is privileged to do so (see \c usbfwData.remoteWakeup and the \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED + * and \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED events), remote wakeup will be performed. Note that this + * function will block for 10 ms while the resume signal is set on the bus. Note: This function can only + * be called when the 48 MHz XOSC is stable. + * + * \return + * \c TRUE if the remote wakeup was performed (the privilege had been granted), otherwise \c FALSE + * (the device is still in suspend mode). + */ +uint8 usbsuspDoRemoteWakeup(void) +{ + extern void halMcuWaitMs(uint16 msec); + halIntState_t intState; + + // Make sure that it's OK + if (!usbfwData.remoteWakeup) return FALSE; + + HAL_ENTER_CRITICAL_SECTION(intState); + + // Make sure that the suspend loop does not power down the chip again + usbirqData.inSuspend = FALSE; + + // Perform remote wakeup by holding the USB resume signal for 10 ms + USBPOW |= USBPOW_RESUME; + halMcuWaitMs(10); + USBPOW &= ~USBPOW_RESUME; + + // Clear the interrupt flag + HAL_USB_INT_CLEAR(); + + HAL_EXIT_CRITICAL_SECTION(intState); + + return TRUE; + +} // usbsuspDoRemoteWakeup + + + +//@} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h new file mode 100644 index 0000000..7f3b714 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h @@ -0,0 +1,199 @@ +/*********************************************************************************** + + Filename: usb_descriptor.h + + Description: Interface to USB descriptors. + +***********************************************************************************/ +#ifndef USBDESCRIPTOR_H +#define USBDESCRIPTOR_H + + +#ifndef ASM_FILE +#include "usb_framework_structs.h" +#endif + +/** \addtogroup module_usb_descriptor USB Descriptor + * \brief This module contains contains USB descriptor definitions, and guidelines on how to write + * descriptor sets that work with the USB library. + * + * Information on the specific USB descriptor types is available in the USB 2.0 specification and + * in device class documentation. Examples of complete descriptor sets can be found in the Chipcon USB + * application examples. + * + * \section section_usbdsc_standard Standard Descriptors + * The library requires the USB descriptor set to be organized as follows: + * - Device descriptor (\ref USB_DEVICE_DESCRIPTOR) + * - Configuration descriptor (\ref USB_CONFIGURATION_DESCRIPTOR) + * - Interface descriptor (\ref USB_INTERFACE_DESCRIPTOR) + * - Endpoint descriptor (\ref USB_ENDPOINT_DESCRIPTOR) + * - More endpoint descriptors + * - More interface descriptors + * - More configuration descriptors + * - String descriptor (\ref USB_STRING_DESCRIPTOR) + * - More string descriptors + * + * Different USB device classes, such as "HID" and "Audio", may add other standard format descriptor + * types to the hierarchy, and even extend the existing types. This is also supported by the library. + * + * Refer to the \ref module_usb_descriptor_parser module for information on + * \li Where in memory the descriptor set can be placed + * \li How to set the required markers (symbols), \ref usbDescStart and \ref usbDescEnd. + * + * \section section_usbdsc_other Other Descriptors + * Differently formatted descriptors are not supported by the parsing mechanism, and are instead located + * through a \ref DESC_LUT_INFO look-up table. Each entry in the \ref usbDescLut table contains the + * index and value parameters for relevant \ref GET_DESCRIPTOR requests, and the locations and lengths + * of the corresponding descriptors: + * \code + * ; Make the symbols public + * PUBLIC usbDescLut; + * PUBLIC usbDescLutEnd; + * + * ... + * + * usbDescLut: DB HID_REPORT, 00H ; value (MSB, LSB) + * DB 00H, 00H ; index (MSB, LSB) + * DW hidReportDesc0Start ; pDescStart + * DW hidReportDesc0End - hidReportDesc0Start ; length + * + * DB HID_REPORT, 01H ; value (MSB, LSB) + * DB 00H, 00H ; index (MSB, LSB) + * DW hidReportDesc1Start ; pDescStart + * DW hidReportDesc1End - hidReportDesc1Start ; length + * usbDescLutEnd: + * \endcode + * + * An additional look-up table is needed configure endpoint double-buffering. The table must contain one + * \ref DBLBUF_LUT_INFO entry for each interface descriptor with non-zero \c bNumEndpoints: + * \code + * ; Make the symbol public + * PUBLIC usbDblbufLut; + * + * ... + * + * usbDblbufLut: DW interface0Desc ; pInterface + * DB 02H ; inMask (example: EP1 IN is double-buffered) + * DB 00H ; outMask (example: No double-buffered OUT endpoints) + * + * DW interface1Desc ; pInterface + * DB 10H ; inMask (example: EP4 IN is double-buffered) + * DB 08H ; outMask (example: EP3 OUT is double-buffered) + * \endcode + * @{ + */ + + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBDESCRIPTORPARSER_C + #define EXTERN ///< Definition used only for usb_descriptor_parser.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Sizes +//@{ +#define EP0_PACKET_SIZE 32 ///< The maximum data packet size for endpoint 0 +//@} + +/// \name Standard Descriptor Types +//@{ +#define DESC_TYPE_DEVICE 0x01 ///< Device +#define DESC_TYPE_CONFIG 0x02 ///< Configuration +#define DESC_TYPE_STRING 0x03 ///< String +#define DESC_TYPE_INTERFACE 0x04 ///< Interface +#define DESC_TYPE_ENDPOINT 0x05 ///< Endpoint +//@} + +/// \name HID Class Descriptor Types +//@{ +#define DESC_TYPE_HID 0x21 ///< HID descriptor (included in the interface descriptor) +#define DESC_TYPE_HIDREPORT 0x22 ///< Report descriptor (referenced in \ref usbDescLut) +//@} + +/// \name Endpoint Types +//@{ +#define EP_ATTR_CTRL 0x00 ///< Control (endpoint 0 only) +#define EP_ATTR_ISO 0x01 ///< Isochronous (not acknowledged) +#define EP_ATTR_BULK 0x02 ///< Bulk +#define EP_ATTR_INT 0x03 ///< Interrupt (guaranteed polling interval) +#define EP_ATTR_TYPE_BM 0x03 ///< Endpoint type bitmask +//@} +//------------------------------------------------------------------------------------------------------- + + +#ifndef ASM_FILE + +//------------------------------------------------------------------------------------------------------- +/// \name USB Descriptor Marker +//@{ +/// USB descriptor markers which the USB Firmware Library imports from the application +typedef struct { + uint8 __code* const pUsbDescStart; ///< USB descriptor start pointer + uint8 __code* const pUsbDescEnd; ///< USB descriptor end pointer + DESC_LUT_INFO __code* const pUsbDescLut; ///< Start of USB desc look-up table pointer + DESC_LUT_INFO __code* const pUsbDescLutEnd; ///< End of USB desc look-up table pointer + DBLBUF_LUT_INFO __code* const pUsbDblbufLut; ///< Start of double-buffering look-up table pointer + DBLBUF_LUT_INFO __code* const pUsbDblbufLutEnd; ///< End of double-buffering look-up table pointer +} USB_DESCRIPTOR_MARKER; + +extern USB_DESCRIPTOR_MARKER __xdata usbDescriptorMarker; ///< USB descriptor marker + +//------------------------------------------------------------------------------------------------------- + +// Import marker symbols for the USB descriptor to use (from _usb_descriptor.s51) +// They need to be defined here or in application FW +// The source file _usb_descriptor.s51 need to use these names, or update +// the names used here with the ones used in _usb_descriptor.s51. +extern void __code* usbDescStart; ///< Pointer to start of (standard) USB descriptor +extern void __code* usbDescEnd; ///< Pointer to end of (standard) USB descriptor +extern void __code* usbDescLut; ///< Pointer to start of lookup table for non-standard USB descriptors +extern void __code* usbDescLutEnd; ///< Pointer to end of lookup table for non-standard USB descriptors +extern void __code* usbDblbufLut; ///< Pointer to start of lookup table for endpoints' double-buffer settings +extern void __code* usbDblbufLutEnd; ///< Pointer to end of lookup table for endpoints' double-buffer settings +//@} + + +#endif // ASM_FILE +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor_parser.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor_parser.c new file mode 100644 index 0000000..6f9a88e --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_descriptor_parser.c @@ -0,0 +1,386 @@ +/*********************************************************************************** + + Filename: usb_descriptor_parser.c + + Description: Parser for USB descriptor structures. + +***********************************************************************************/ + +/// \addtogroup module_usb_descriptor_parser +/// @{ +#define USBDESCRIPTORPARSER_C ///< Modifies the behavior of "EXTERN" in usb_descriptor_parser.h +#include "usb_firmware_library_headers.h" + +#define BLE_INFO_PAGE_BDADDR 0x780C // LSB..MSB +#define BLE_INFO_PAGE_BDADDR_LEN 8 +#define BLE_INFO_PAGE_WAFER_INFO 0x7FF4 + +//------------------------------------------------------------------------------------------------------- +// USBDP internal module data +static USBDP_DATA __xdata usbdpData; ///< USBDP internal module data + +//------------------------------------------------------------------------------------------------------- +// String descriptors (2-byte unicode data). + +// Language ID. +static const uint8 languageId[4] = { + 4, + DESC_TYPE_STRING, + 0x09, 0x04 /* US-EN */ +}; + +// Manufacturer. +static const uint8 manufacturer[36] = { + 36, + DESC_TYPE_STRING, + 'T', 0, + 'e', 0, + 'x', 0, + 'a', 0, + 's', 0, + ' ', 0, + 'I', 0, + 'n', 0, + 's', 0, + 't', 0, + 'r', 0, + 'u', 0, + 'm', 0, + 'e', 0, + 'n', 0, + 't', 0, + 's', 0 +}; + +// Product. +static const uint8 product[36] = { + 36, + DESC_TYPE_STRING, + 'T', 0, + 'I', 0, + ' ', 0, + 'C', 0, + 'C', 0, + '2', 0, + '5', 0, + '3', 0, + '1', 0, + ' ', 0, + 'U', 0, + 'S', 0, + 'B', 0, + ' ', 0, + 'C', 0, + 'D', 0, + 'C', 0 +}; + +// Serial Number. +static uint8 serialNumber[42] = { + 0, + DESC_TYPE_STRING, + '0', 0, + '1', 0, + '2', 0, + '3', 0, + '4', 0, + '5', 0, + '6', 0, + '7', 0, + '8', 0, + '9', 0, + '0', 0, + '1', 0, + '2', 0, + '3', 0, + '4', 0, + '5', 0, + '6', 0, + '7', 0, + '8', 0, + '9', 0 +}; + +/** \brief Initializes a search +* +* This function must be called before each new search to reset \ref USBDP_DATA.pDesc. +*/ +void usbdpInit(void) +{ + usbdpData.pDesc = (const uint8 __code *) usbDescriptorMarker.pUsbDescStart; +} // usbdpInit + + + + +/** \brief Locates the descriptor of the wanted type +* +* This function parses through the USB descriptors until: +* \li It hits one with bDescriptorType = wantedType, in which case it returns a pointer to +* that descriptor, and exits. \ref USBDP_DATA.pDesc will then point to the next descriptor. +* \li It hits one with bDescriptorType = haltAtType, in which case it returns a NULL-pointer, +* and exits. \ref USBDP_DATA.pDesc will then point to that descriptor. +* \li \ref USBDP_DATA.pDesc = \ref usbDescEnd, in which case it returns a NULL-pointer, and exits. +* \ref USBDP_DATA.pDesc will continue to point to \ref usbDescEnd. +* +* \note To begin a search with this function, \ref usbdpInit should be called first. It should not be +* called when continuing a search - for instance after a call to \ref usbdpGetConfigurationDesc(). +* +* \param[in] wantedType +* The wanted descriptor type (e.g. \ref DESC_TYPE_CONFIG) +* \param[in] haltAtType +* The parser halts when it reaches this descriptor type, unless \c haltAtType is \c 0 (which in any +* case is an invalid \c bDescriptorType value). +* +* \return +* A pointer to the wanted descriptor type, or \c NULL if it was not found. +*/ +void __code* usbdpFindNext(uint8 wantedType, uint8 haltAtType) +{ + void __code *pResult; + pResult = NULL; + + // As long as we haven't reached the end... + while (usbdpData.pDesc != (void __code *) usbDescriptorMarker.pUsbDescEnd) { + + // If we have a match on wantedType... + if (usbdpData.pDesc[DESC_TYPE_IDX] == wantedType) { + pResult = (void __code*) usbdpData.pDesc; + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + break; + + // If we have a match on haltAtType... + } else if (usbdpData.pDesc[DESC_TYPE_IDX] == haltAtType) { + if (haltAtType) break; + } + + // Move on to the next descriptor + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + } + + return pResult; +} // usbdpFindNext + + + + +/** \brief Locates the (one and only) device descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void) +{ + usbdpInit(); + return usbdpFindNext(DESC_TYPE_DEVICE, 0); +} // usbdpGetDeviceDesc + + + + +/** \brief Locates a configuration descriptor +* +* The search will either look for a descriptor with a specific +* \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue, or simply take the n'th descriptor (by "index") +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value to search for (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue), or +* 0 to find descriptor by index +* \param[in] cfgIndex +* A zero-based index for the configuration descriptor to find. +* This value is ignored unless \c cfgValue is 0. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex) +{ + USB_CONFIGURATION_DESCRIPTOR __code *pConfigurationDesc; + usbdpInit(); + + // As long as there are more configuration descriptors... + while (pConfigurationDesc = usbdpFindNext(DESC_TYPE_CONFIG, 0)) { + + // Search by value? + if (cfgValue) { + if (cfgValue == pConfigurationDesc->bConfigurationValue) break; + + // Search by index? (search cfgIndex+1 times) + } else if (!cfgIndex--) { + break; + } + } + + return pConfigurationDesc; +} // usbdpGetConfigurationDesc + + + + +/** \brief Locates an interface descriptor +* +* The function will first go to the configuration descriptor that matches the supplied configuration +* value, and then locate the interface descriptor that matches the given interface number and alternate +* setting. +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue) +* \param[in] intNumber +* The interface number (\ref USB_INTERFACE_DESCRIPTOR.bInterfaceNumber) +* \param[in] altSetting +* The alternate setting (\ref USB_INTERFACE_DESCRIPTOR.bAlternateSetting) +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting) +{ + USB_INTERFACE_DESCRIPTOR __code *pInterfaceDesc; + + // First get to the correct configuration + usbdpGetConfigurationDesc(cfgValue, 0); + + // Then find a match on the interface + while (pInterfaceDesc = usbdpFindNext(DESC_TYPE_INTERFACE, DESC_TYPE_CONFIG)) { + if ((pInterfaceDesc->bInterfaceNumber == intNumber) && (pInterfaceDesc->bAlternateSetting == altSetting)) { + break; + } + } + + return pInterfaceDesc; +} // usbdpGetInterfaceDesc + + + + +/** \brief Locates a string descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] strIndex +* A zero-based index that matches the "iXxxxxxxxxx" string indexes in the other descriptors +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_STRING_DESCRIPTOR *usbdpGetStringDesc(uint8 strIndex) +{ + USB_STRING_DESCRIPTOR *pStringDesc = NULL; + +#ifdef MS_EXT_C_ID + /* OPT: Find the Microsoft OS String Descriptor? + usbdpInit(); + + if (strIndex == 0xEE){ + // Find the Microsoft OS String Descriptor + do{ + pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0); + }while (pStringDesc != NULL && pStringDesc->bLength != 18); + } else + */ +#endif + { + switch (strIndex) + { + case 0: + pStringDesc = (USB_STRING_DESCRIPTOR *)languageId; + break; + + case 1: + pStringDesc = (USB_STRING_DESCRIPTOR *)manufacturer; + break; + + case 2: + pStringDesc = (USB_STRING_DESCRIPTOR *)product; + break; + + case 3: + if (serialNumber[0] == 0) + { + uint8 bdAddr[ 8 ], i; + uint16 tmp; + + // get BDADDR from Info Page + for (i=0; iusbDescStart - usbDescEnd equals the total length of the descriptors). + * + * The markers can be dynamic, provided that they are not changed while the descriptor parser is in use. + * However, in most cases the USB descriptor set will be static, hence the markers are also static. + * The following example shows how static markers are declared and made public in 8051 assembler: + * \code + * ; Make the symbols public + * PUBLIC usbDescStart; + * PUBLIC usbDescEnd; + * + * ... + * + * usbDescStart: + * deviceDesc: ; Device descriptor (the first descriptor) + * DB deviceDescEnd - deviceDesc + * DB DESC_TYPE_DEVICE ; bDescriptorType + * DB 10H, 01H ; bcdUSB + * DB 00H ; bDeviceClass + * DB 00H ; bDeviceSubClass + * + * ... + * + * string3Desc: ; String descriptor: Serial number (the last descriptor) + * DB string3DescEnd - string3Desc; + * DB DESC_TYPE_STRING ; bDescriptorType + * DB '1', 0; + * DB '2', 0; + * DB '3', 0; + * string3DescEnd: + * usbDescEnd: + * \endcode + * @{ + */ + +#include "usb_descriptor.h" + + +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Indexes Into USB Descriptors +//@{ +#define DESC_LENGTH_IDX 0 ///< Index of the bLength field (all descriptors) +#define DESC_TYPE_IDX 1 ///< Index of the bDescriptorType field (all descriptors) +#define DESC_CONFIG_LENGTH_LSB_IDX 2 ///< Index of LOUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +#define DESC_CONFIG_LENGTH_MSB_IDX 3 ///< Index of HIUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbdpInit(void); +void __code *usbdpFindNext(uint8 wantedType, uint8 haltAtType); + +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void); +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex); +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting); +USB_STRING_DESCRIPTOR *usbdpGetStringDesc(uint8 strIndex); +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.c new file mode 100644 index 0000000..ae0da88 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.c @@ -0,0 +1,332 @@ +/*********************************************************************************** + + Filename: usb_framework.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_framework +/// @{ +#define USBFRAMEWORK_C ///< Modifies the behavior of "EXTERN" in usb_framework.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" + +// Function pointer used by usbfwSetupHandler() +static VFPTR __data ProcessFunc; + +/** \brief Initializes the USB framework + * + * This function should be called when the microcontroller is ready to accept USB traffic. It enables the + * USB peripheral unit and enables the pull-up resistor on the D+ line. Endpoint status, current + * configuration value, etc. are initialized and evenetually re-initialized in the + * \ref usbfwResetHandler() function. + */ +void usbfwInit(void) +{ + // Set default values + usbfwData.selfPowered = (usbdpGetConfigurationDesc(1, 0)->bmAttributes & 0x40) ? TRUE : FALSE; + usbfwData.remoteWakeup = FALSE; + + HAL_USB_ENABLE(); + + // Enable Resume Interrupt + HAL_USB_RESUME_INT_ENABLE(); + +} // usbfwInit + + + + +/** \brief Handles USB reset signalling + * + * This function should be called, either from the USB interrupt or the main loop, when the \c USBCIF.RST + * flag has been set. Keep in mind that all bits in \c USBCIF register are cleared when the register is + * read. The function puts the device into the default state (not yet addressed), and puts all endpoints + * (except EP0) into the \ref EP_HALT state + */ +void usbfwResetHandler(void) +{ + + // Reset the USB state + usbfwData.usbState = DEV_DEFAULT; + usbfwData.configurationValue = 0; + + // Reset all endpoints + usbfwData.ep0Status = EP_IDLE; + usbfwSetAllEpStatus(EP_HALT); + + // Reset last function pointer + ProcessFunc = NULL; + +} // usbfwResetHandler + + + + +/** \brief USB Setup Handler + * + * This function should be called either from the USB interrupt or the main loop when the \c USBIIF.EP0IF + * flag has been set. Keep in mind that all bits in \c USBIIF register are cleared when the register is + * read. A detailed description of the framework is found in the \ref section_setup_handler_usage + * section. + * + * \note The USB header data is always little-endian, so if a big-endian compiler is used (such as Keil + * C51), the 16-bit values in the \ref usbSetupHeader must be flipped before they are used. + */ +void usbfwSetupHandler(void) +{ + uint8 controlReg; + uint8 bytesNow; + uint8 oldEndpoint; + + // Save the old index setting, then select endpoint 0 and fetch the control register + oldEndpoint = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(0); + controlReg = USBCS0; + + // The last transfer was ended prematurely by a new SETUP packet + if (controlReg & USBCS0_SETUP_END) { + USBCS0 = USBCS0_CLR_SETUP_END; + usbfwData.ep0Status = EP_CANCEL; + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // A STALL handshake was transmitted to the PC + if (controlReg & USBCS0_SENT_STALL) { + USBCS0 = 0x00; + usbfwData.ep0Status = EP_IDLE; + } + + // Receive OUT packets + if (usbfwData.ep0Status == EP_RX) { + + // Read FIFO + bytesNow = USBCNT0; + usbfwReadFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.bytesLeft -= bytesNow; + usbSetupData.pBuffer += bytesNow; + + // Arm the endpoint + USBCS0 = usbSetupData.bytesLeft ? USBCS0_CLR_OUTPKT_RDY : (USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END); + + // Make a call to the appropriate request handler when done + if (usbSetupData.bytesLeft == 0) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Return here since nothing more will happen until the next interrupt + USBFW_SELECT_ENDPOINT(oldEndpoint); + return; + + // Let the application handle the reception + } else if (usbfwData.ep0Status == EP_MANUAL_RX) { + ProcessFunc(); + } + + // Receive SETUP header + if (usbfwData.ep0Status == EP_IDLE) { + if (controlReg & USBCS0_OUTPKT_RDY) { + usbfwReadFifo(&USBF0, 8, (uint8 __xdata *) &usbSetupHeader); + + // Handle control transfers individually + ProcessFunc = NULL; + switch (usbSetupHeader.requestType & (RT_MASK_TYPE | RT_MASK_DIR)) { + + // Standard requests with data from the host (OUT) + case RT_STD_OUT: + switch (usbSetupHeader.request) { + case SET_ADDRESS: usbsrSetAddress(); break; + case SET_FEATURE: usbsrSetFeature(); break; + case CLEAR_FEATURE: usbsrClearFeature(); break; + case SET_CONFIGURATION: usbsrSetConfiguration(); break; + case SET_INTERFACE: usbsrSetInterface(); break; + case SET_DESCRIPTOR: /*usbsrHookSetDescriptor(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Standard requests with data to the host (IN) + case RT_STD_IN: + switch (usbSetupHeader.request) { + case GET_STATUS: usbsrGetStatus(); break; + case GET_DESCRIPTOR: usbsrGetDescriptor(); break; + case GET_CONFIGURATION: usbsrGetConfiguration(); break; + case GET_INTERFACE: usbsrGetInterface(); break; + case SYNCH_FRAME: /*usbsrHookSynchFrame(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Vendor requests + case RT_VEND_OUT: + ProcessFunc = usbvrHookProcessOut; usbvrHookProcessOut(); + break; + case RT_VEND_IN: + ProcessFunc = usbvrHookProcessIn; usbvrHookProcessIn(); + break; + + // Class requests + case RT_CLASS_OUT: + ProcessFunc = usbcrHookProcessOut; usbcrHookProcessOut(); + break; + case RT_CLASS_IN: + ProcessFunc = usbcrHookProcessIn; usbcrHookProcessIn(); + break; + + // Unrecognized request: Stall the endpoint + default: + usbfwData.ep0Status = EP_STALL; + break; + } + + // Arm/stall the endpoint + USBCS0 = (usbfwData.ep0Status == EP_STALL) ? (USBCS0_CLR_OUTPKT_RDY | USBCS0_SEND_STALL) : USBCS0_CLR_OUTPKT_RDY; + } + } + + // Transmit IN packets + if (usbfwData.ep0Status == EP_TX) { + controlReg = USBCS0_INPKT_RDY; + + // The last frame should contain 0 to (EP0_PACKET_SIZE - 1) bytes + if (usbSetupData.bytesLeft < EP0_PACKET_SIZE) { + bytesNow = usbSetupData.bytesLeft; + controlReg |= USBCS0_DATA_END; + + // All other packets should have the maximum length + } else { + bytesNow = EP0_PACKET_SIZE; + } + + // Load the FIFO and move the pointer + usbfwWriteFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.pBuffer += bytesNow; + usbSetupData.bytesLeft -= bytesNow; + + // Arm the FIFO (even for a zero-length packet) + USBCS0 = controlReg; + + // Make a call to the appropriate request handler when done + if (bytesNow < EP0_PACKET_SIZE) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Let the application handle the transmission + } else if (usbfwData.ep0Status == EP_MANUAL_TX) { + ProcessFunc(); + } + + // Restore the old index setting + USBFW_SELECT_ENDPOINT(oldEndpoint); + +} // usbfwSetupHandler + + + + +/** \brief Changes the state of endpoint 1-5 IN/OUT + * + * This is an internal function used by the library. + * + * \param[in] status + * The new status for each endpoint + */ +void usbfwSetAllEpStatus(EP_STATUS status) +{ + uint8 n; + for (n = 0; n < sizeof(usbfwData.pEpInStatus); n++) + usbfwData.pEpInStatus[n] = status; + for (n = 0; n < sizeof(usbfwData.pEpOutStatus); n++) + usbfwData.pEpOutStatus[n] = status; +} // usbfwSetAllEpStatus + + + + +/** \brief Reads from the selected OUT endpoint FIFO, without using DMA + * + * The FIFO must be re-armed after reading it empty (using the \ref USBFW_ARM_OUT_ENDPOINT() macro). This + * is not necessary when flushing the FIFO. + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to read + * \param[in] *pData + * A pointer to the storage location for the read data (in any memory space) + */ +void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *(pTemp++) = *pFifo; + } while (--count); + } +} // usbfwReadFifo + + + + +/** \brief Writes to the selected IN endpoint FIFO, without using DMA + * + * Note that the FIFO must be armed in order to be transmitted (using the \ref USBFW_ARM_IN_ENDPOINT() + * macro). + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to write + * \param[in] *pData + * A pointer to the data to be written (from any memory space) + */ +void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *pFifo = *(pTemp++); + } while (--count); + } +} // usbfwWriteFifo + + +/// @} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.h new file mode 100644 index 0000000..0846625 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework.h @@ -0,0 +1,383 @@ +/*********************************************************************************** + + Filename: usb_framework.h + + Description: USB library common functionality. + +***********************************************************************************/ + +#ifndef USBFRAMEWORK_H +#define USBFRAMEWORK_H +/** \addtogroup module_usb_framework USB Framework (usbfw) + * \brief This module contains USB status information, functions for initialization, USB device reset + * handling, and most importantly, the framework for transfers on endpoint 0, FIFO access, and endpoint + * control. + * + * \section section_init Framework Initialization + * The framework and the USB peripheral unit can be initialized once the crystal oscillator (48 MHz for + * CC1111/CC2511, 32 MHz for CC2531) is running. This is done by \ref usbfwInit(), which: + * \li Initializes framework variables + * \li Enables the USB peripheral unit by setting the \c SLEEP.USB_EN bit + * \li Enables the pull-up resistor via a GPIO pin + * + * When completing the last step, the host will be recognize the USB device, and start the enumeration + * process. To reply to the shortly incoming standard requests, the call to \ref usbfwInit() must be + * followed immediately by USB Interrupt \ref section_usbirq_initialization. + * + * \section section_endpoint_0_transfers Endpoint 0 Transfers + * The USB interface uses endpoint 0 to perform setup requests of the standard, vendor and class types. + * Such transfers consist of three phases: + * - A setup phase, where an 8-byte \ref USB_SETUP_HEADER is transferred to the device. + * - An IN/OUT data phase, if the length field of the \ref USB_SETUP_HEADER structure is non-zero. + * - A handshake phase, where the application can stall the endpoint to indicate error conditions. + * + * The setup handler, \ref usbfwSetupHandler(), takes care of the low-level parts of these transfers, + * including the IN/OUT buffering during the data phase (when there is one). The transfers fall into two + * categories: + * - Most standard requests are processed internally, with little or no intervention form the user + * application. This is done by the \ref module_usb_standard_requests module. + * - Vendor and class requests are application specific and must always be processed by the application. + * Whenever such a request is received, the following hooks will be called between the phases: + * - \ref usbcrHookProcessOut(): Class requests with OUT data phase + * - \ref usbcrHookProcessIn(): Class requests with IN data phase + * - \ref usbvrHookProcessOut(): Vendor requests with OUT data phase + * - \ref usbvrHookProcessIn(): Vendor requests with IN data phase + * + * \section section_setup_handler_usage Setup Handler Usage + * This section describes what is required to make the vendor and class request hooks work. This + * information also applies to the standard requests that needs application processing + * (\ref usbsrHookSetDescriptor(), \ref usbsrHookSynchFrame(), and some cases of + * \ref usbsrHookSetFeature() and \ref usbsrHookClearFeature()). + * + * The transactions are made using a clean and efficient interface, consisting of two data structures and + * the endpoint 0 status byte: + * - The endpoint status is initially \ref EP_IDLE, which basically means that the setup handler is ready + * for a new setup phase (a new request). Upon an incoming request, the processing hook is called, and + * the \ref usbSetupHeader structure contains the 8 bytes received during the setup phase. At this + * point there are four different outcomes: + * - If the request is unknown or contains errors, the endpoint should be stalled. This is done by + * setting the endpoint status to \ref EP_STALL. + * - If there is no data phase (the length field is zero), the endpoint status should just remain in + * it's current state, \ref EP_IDLE. + * - If the request has an IN data phase, the \ref usbSetupData structure must be prepared. This + * includes setting a pointer to where IN data should be taken from, and the number of bytes to be + * transferred (usually the same number as indicated by the length field, but it can also be a + * lower number). The endpoint state is then changed to \ref EP_TX. + * - If the request has an OUT data phase, the \ref usbSetupData structure must be prepared. This + * includes setting a pointer to where OUT data should be stored, and the number of bytes to be + * transferred (always the same number as indicated by the length field). The endpoint state is + * then changed to \ref EP_RX. + * - When the data phase is complete, the processing hook function will be called a second time to notify + * the application. Under normal conditions the endpoint status will be either \ref EP_TX or \ref EP_RX, + * and does not need to be changed any further (as this is done automatically upon return). If the + * endpoint status is \ref EP_CANCEL, it means that the USB host cancelled the setup transfer. + * + * The following code examples illustrate practical usage (more code is available in the application + * example projects): + * + * \par Example 1: Endpoint 0 Requests With OUT Data phase + * + * \code + * uint8 pLcdBuffer[358]; + * + * void usbvrHookProcessOut(void) { + * + * // When this vendor request is received, we should either update a part of pLcdBuffer[] or leave + * // it as it is, and then refresh the LCD display. The index field of the setup header contains the + * // index of the first character to be updated, and the length field how many characters to update. + * if (usbSetupHeader.request == VR_LCD_UPDATE) { + * + * // First the endpoint status is EP_IDLE... (we have just received the Setup packet) + * if (usbfwData.ep0Status == EP_IDLE) { + * + * // There is no new data -> Just refresh the display + * if (usbSetupHeader.length == 0) { + * lcdRefresh(); + * // There is no change to the endpoint status in this case + * + * // The PC wants to send data that will be stored outside pLcdBuffer -> stall the endpoint! + * } else if ((usbSetupHeader.length > sizeof(pLcdBuffer) || + * (usbSetupHeader.index >= sizeof(pLcdBuffer) || + * ((usbSetupHeader.index + usbSetupHeader.length) > sizeof(pLcdBuffer)) { + * usbfwData.ep0Status = EP_STALL; + * + * // Prepare for OUT data phase, setup the data buffer to receive the LCD data + * } else { + * usbSetupData.pBuffer = &pLcdBuffer[usbSetupHeader.index]; + * usbSetupData.bytesLeft = usbSetupHeader.length; + * usbfwData.ep0Status = EP_RX; + * } + * + * // Then the endpoint status is EP_RX (remember: we did that here when setting up the buffer) + * } else if (usbfwData.ep0Status == EP_RX) { + * // usbfwSetupHandler() has now updated pLcdBuffer, so all we need to do is refresh the LCD + * lcdRefresh(); + * // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + * } + * + * // Unknown vendor request? + * } else { + * usbfwData.ep0Status = EP_STALL; + * } + * } + * \endcode + * + * \par Example 2: Endpoint 0 Requests With IN Data phase + * + * \code + * uint8 keyBufferPos; + * BOOL blockKeyboard; + * char pKeyBuffer[150]; + * + * void usbvrProcessIn(void) { + * + * // When this vendor request is received, we should send all registered key-strokes, and reset the + * // position counter. New keystrokes are blocked during the transfer to avoid overwriting the buffer + * // before it has been sent to the host. + * if (usbSetupHeader.request == VR_GET_KEYS) { + * + * // First the endpoint status is EP_IDLE... + * if (usbfwData.ep0Status == EP_IDLE) { + * + * // Make sure that we do not send more than the PC asked for + * if (usbSetupHeader.length < keyBufferPos) { + * usbfwData.ep0Status = EP_STALL; + * + * // Otherwise... + * } else { + * // Block for new keystrokes + * blockKeyboard = TRUE; + * + * // Setup the buffer + * usbSetupData.pBuffer = pKeyBuffer; + * usbSetupData.bytesLeft = keyBufferPos; + * usbfwData.ep0Status = EP_TX; + * + * // Reset the position counter + * keyBufferPos = 0; + * } + * + * // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer) + * } else if (usbfwData.ep0Status == EP_TX) { + * + * // pKeyBuffer has now been sent to the host, so new keystrokes can safely be registered + * blockKeyboard = FALSE; + * + * // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + * } + * + * // Unknown request? + * } else { + * usbfwData.ep0Status = EP_STALL; + * } + * } + * \endcode + * + * If automated data transfer is not desired, the application should set \c usbfwData.ep0Status to + * either \ref EP_MANUAL_RX or \ref EP_MANUAL_TX instead of \ref EP_RX or \ref EP_TX, respectively. Until + * the transfer is completed, the processing hook function (e.g. \ref usbvrHookProcessIn()) will be called + * at every endpoint 0 interrupt. + * @{ + */ +#include "usb_board_cfg.h" +#include "usb_framework_structs.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBFRAMEWORK_C + #define EXTERN ///< Definition used only for usb_framework.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Module Data +//@{ +EXTERN USBFW_DATA __xdata usbfwData; ///< USBFW internal module data + +//@} +//------------------------------------------------------------------------------------------------------- + + +/// \name Setup Handler Data +//@{ +EXTERN USB_SETUP_DATA __xdata usbSetupData; ///< Setup handler data phase configuration +EXTERN USB_SETUP_HEADER __xdata usbSetupHeader; ///< Setup header +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Request Type Fields +//@{ + +// Field masks +#define RT_MASK_DIR 0x80 ///< Request direction bit mask +#define RT_MASK_TYPE 0x60 ///< Request type bit mask +#define RT_MASK_RECIP 0x1F ///< Request recipient bit mask + +// Direction field +#define RT_DIR_IN 0x80 ///< IN Request +#define RT_DIR_OUT 0x00 ///< OUT Request + +// Type field +#define RT_TYPE_STD 0x00 ///< Standard Request +#define RT_TYPE_CLASS 0x20 ///< Class Request +#define RT_TYPE_VEND 0x40 ///< Vendor Request + +// Recipient field +#define RT_RECIP_DEV 0x00 ///< Device Request +#define RT_RECIP_IF 0x01 ///< Interface Request +#define RT_RECIP_EP 0x02 ///< Endpoint Request +#define RT_RECIP_OTHER 0x03 ///< Other Request + +// Type + direction +#define RT_STD_OUT (RT_TYPE_STD | RT_DIR_OUT) ///< Standard request, direction is OUT +#define RT_STD_IN (RT_TYPE_STD | RT_DIR_IN) ///< Standard request, direction is IN +#define RT_VEND_OUT (RT_TYPE_VEND | RT_DIR_OUT) ///< Vendor request, direction is OUT +#define RT_VEND_IN (RT_TYPE_VEND | RT_DIR_IN) ///< Vendor request, direction is IN +#define RT_CLASS_OUT (RT_TYPE_CLASS | RT_DIR_OUT) ///< Class request, direction is OUT +#define RT_CLASS_IN (RT_TYPE_CLASS | RT_DIR_IN) ///< Class request, direction is IN + +// Direction + recepient +#define RT_OUT_DEVICE (RT_DIR_OUT | RT_RECIP_DEV) ///< Request made to device, direction is OUT +#define RT_IN_DEVICE (RT_DIR_IN | RT_RECIP_DEV) ///< Request made to device, direction is IN +#define RT_OUT_INTERFACE (RT_DIR_OUT | RT_RECIP_IF) ///< Request made to interface, direction is OUT +#define RT_IN_INTERFACE (RT_DIR_IN | RT_RECIP_IF) ///< Request made to interface, direction is IN +#define RT_OUT_ENDPOINT (RT_DIR_OUT | RT_RECIP_EP) ///< Request made to endpoint, direction is OUT +#define RT_IN_ENDPOINT (RT_DIR_IN | RT_RECIP_EP) ///< Request made to endpoint, direction is IN +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Vendor and Class Request Hooks +/// Unused hooks must stall endpoint 0. +//@{ + +/// Hook which is called upon reception of a class request with OUT data phase +void usbcrHookProcessOut(void); +/// Hook which is called upon reception of a class request with IN data phase +void usbcrHookProcessIn(void); +/// Hook which is called upon reception of a vendor request with OUT data phase +void usbvrHookProcessOut(void); +/// Hook which is called upon reception of a vendor request with IN data phase +void usbvrHookProcessIn(void); + +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Endpoint Access Macros +/// Note that the endpoint control registers are indexed, meaning that an endpoint must be selected +/// before the control operations listed below can be used. Interrupts using any of these macros, must +/// save the current selection and restore it upon return. +//@{ + +/// Selects which IN/OUT endpoint (by index 0 to 5) to operate on +#define USBFW_SELECT_ENDPOINT(n) (USBINDEX = (n)) +/// Gets the currently selected IN/OUT endpoint +#define USBFW_GET_SELECTED_ENDPOINT() (USBINDEX) + +/// Stalls the selected IN endpoint +#define USBFW_STALL_IN_ENDPOINT() st (\ + USBCSIL = USBCSIL_SEND_STALL; \ + usbfwData.pEpInStatus[USBINDEX - 1] = EP_HALT; ) + +/// Returns the stall condition for the selected IN endpoint +#define USBFW_IN_ENDPOINT_STALLED() (USBCSIL & USBCSIL_SEND_STALL) +/// Flushes the FIFO for the selected IN endpoint (flush twice when using double-buffering) +#define USBFW_FLUSH_IN_ENDPOINT() st (\ + USBCSIL = USBCSIL_FLUSH_PACKET; \ + while (USBCSIL & USBCSIL_FLUSH_PACKET); ) + +/// Arms the selected IN endpoint, so that contents of the endpoint FIFO can be sent to the host +#define USBFW_ARM_IN_ENDPOINT() (USBCSIL = USBCSIL_INPKT_RDY) +/// Is the selected IN endpoint disarmed? +#define USBFW_IN_ENDPOINT_DISARMED() !(USBCSIL & USBCSIL_INPKT_RDY) +/// Is the FIFO for the selected IN endpoint empty? +#define USBFW_IN_ENDPOINT_FIFO_EMPTY() !(USBCSIL & USBCSIL_PKT_PRESENT) + +/// Stalls the selected OUT endpoint +#define USBFW_STALL_OUT_ENDPOINT() st ( \ + USBCSOL = USBCSOL_SEND_STALL; \ + usbfwData.pEpOutStatus[USBINDEX - 1] = EP_HALT; \ +} + +/// Returns the stall condition for the selected OUT endpoint +#define USBFW_OUT_ENDPOINT_STALLED() (USBCSOL & USBCSOL_SEND_STALL) +/// Flushes the FIFO for the selected OUT endpoint (flush twice when using double-buffering) +#define USBFW_FLUSH_OUT_ENDPOINT() st(\ + USBCSOL = USBCSOL_FLUSH_PACKET; \ + while (USBCSOL & USBCSOL_FLUSH_PACKET); ) + +/// Arms the selected OUT endpoint, so that the FIFO can receive data from the host +#define USBFW_ARM_OUT_ENDPOINT() (USBCSOL = 0) +/// Is the selected OUT endpoint disarmed? If so, there is data waiting in the FIFO +#define USBFW_OUT_ENDPOINT_DISARMED() (USBCSOL & USBCSOL_OUTPKT_RDY) +/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, low byte +#define USBFW_GET_OUT_ENDPOINT_COUNT_LOW() (USBCNTL) +/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, high byte +#define USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() (USBCNTH) + +//@} +//------------------------------------------------------------------------------------------------------- + +// Little endian +#define LOBYTEPTR(w) ( (uint8 __generic *)(&(w)) + 1 ) +// Big endian +//#define LOBYTEPTR(w) ( (uint8 __generic *)&(w) ) + + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbfwInit(void); +void usbfwResetHandler(void); +void usbfwSetupHandler(void); +void usbfwSetAllEpStatus(EP_STATUS status); +void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData); +void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData); +//------------------------------------------------------------------------------------------------------- + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework_structs.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework_structs.h new file mode 100644 index 0000000..4f87484 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_framework_structs.h @@ -0,0 +1,233 @@ +/*********************************************************************************** + + Filename: usb_framework_structs.h + + Description: USB library common data structures. + +***********************************************************************************/ + +#ifndef USBFRAMEWORKSTRUCTS_H +#define USBFRAMEWORKSTRUCTS_H +/** \addtogroup module_usb_framework USB Framework (usbfw) + * \brief This module contains USB status and descriptor structs + * + * + * @{ + */ +#include "hal_types.h" +#include "usb_firmware_library_config.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBFRAMEWORK_C + #define EXTERN ///< Definition used only for usb_framework.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Module Data +//@{ + +/// Endpoint status (used with USB_INFO.ep0Status / pEpInStatus[] / pEpOutStatus[]) +typedef enum { + EP_IDLE = 0x00, ///< The endpoint is idle, or a setup token has been received + EP_TX = 0x01, ///< Setup IN data is transmitted automatically by the framework + EP_RX = 0x02, ///< Setup OUT data is received automatically by the framework + EP_HALT = 0x03, ///< The endpoint is halted (returns stalls to the host) + EP_STALL = 0x04, ///< Send procedural stall in the next status phase + EP_MANUAL_TX = 0x05, ///< Setup IN data is transmitted manually by the user application + EP_MANUAL_RX = 0x06, ///< Setup OUT data is received manually by the user application + EP_CANCEL = 0x07 ///< The current transfer was cancelled by the host +} EP_STATUS; + +/// Device state (used with USB_INFO.usbState) +typedef enum { + DEV_ATTACHED = 0x00, ///< Device attached (invisible state) + DEV_POWERED = 0x01, ///< Device powered (invisible state) + DEV_DEFAULT = 0x02, ///< Default state (the \c USBADDR register is 0) + DEV_ADDRESS = 0x03, ///< Addressed state (the \c USBADDR register has been set) + DEV_CONFIGURED = 0x04, ///< Configured state (\c usbfwData.configurationValue != 0) + DEV_SUSPENDED = 0x05 ///< Suspended state (never set) +} USB_STATE; + +/// USBFW internal module data +typedef struct { + USB_STATE usbState; ///< USB device state + uint8 configurationValue; ///< Current configuration value + uint8 pAlternateSetting[USB_SETUP_MAX_NUMBER_OF_INTERFACES]; ///< Current alternate settings + EP_STATUS ep0Status; ///< Endpoint 0 status + EP_STATUS pEpInStatus[5]; ///< Endpoint 1-5 IN status + EP_STATUS pEpOutStatus[5]; ///< Endpoint 1-5 OUT status + uint8 remoteWakeup; ///< Remote wakeup allowed + uint8 selfPowered; ///< Is currently self-powered? +} USBFW_DATA; + +//------------------------------------------------------------------------------------------------------- +/// Setup header (contains the 8 bytes received during the setup phase) +typedef struct { + uint8 requestType; ///< Request type (direction, type and recipient, see the \c RT_ definitions) + uint8 request; ///< Request ID + uint16 value; ///< Value field + uint16 index; ///< Index field + uint16 length; ///< Length of data phase +} USB_SETUP_HEADER; + +/// Setup handler data phase configuration +typedef struct { + uint8 __generic *pBuffer; ///< Pointer to where IN/OUT data should be taken from/received + uint16 bytesLeft; ///< The number of bytes to transfer +} USB_SETUP_DATA; + + +//@} +//------------------------------------------------------------------------------------------------------- + +// From usb_descriptor.h +/** \addtogroup module_usb_descriptor USB Descriptor*/ +//------------------------------------------------------------------------------------------------------- +/// USB device descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_DEVICE + uint16 bcdUSB; ///< USB specification release number (in BCD, e.g. 0110 for USB 1.1) + uint8 bDeviceClass; ///< Device class code + uint8 bDeviceSubClass; ///< Device subclass code + uint8 bDeviceProtocol; ///< Device protocol code + uint8 bMaxPacketSize0; ///< Maximum packet size for EP0 + uint16 idVendor; ///< Vendor ID + uint16 idProduct; ///< Product ID + uint16 bcdDevice; ///< Device release number (in BCD) + uint8 iManufacturer; ///< Index of the string descriptor for manufacturer + uint8 iProduct; ///< Index of the string descriptor for product + uint8 iSerialNumber; ///< Index of the string descriptor for serial number + uint8 bNumConfigurations; ///< Number of possible configurations +} USB_DEVICE_DESCRIPTOR; + +/// USB configuration descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_CONFIG + uint16 wTotalLength; ///< Total length of data for this configuration + uint8 bNumInterfaces; ///< Number of interfaces supported by this configuration (one-based index) + uint8 bConfigurationValue; ///< Designator value for this configuration + uint8 iConfiguration; ///< Index of the string descriptor for this configuration + uint8 bmAttributes; ///< Configuration characteristics + uint8 bMaxPower; ///< Maximum power consumption in this configuration (bMaxPower * 2 mA) +} USB_CONFIGURATION_DESCRIPTOR; + +/// USB interface descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_INTERFACE + uint8 bInterfaceNumber; ///< Number of *this* interface (zero-based index) + uint8 bAlternateSetting; ///< Alternate setting index for this descriptor (zero-based index) + uint8 bNumEndpoints; ///< Number of endpoints for this interface (excl. EP0) + uint8 bInterfaceClass; ///< Interface class code + uint8 bInterfaceSubClass; ///< Interface subclass code + uint8 bInterfaceProtocol; ///< Interface protocol code + uint8 iInterface; ///< Index of the string descriptor for this interface +} USB_INTERFACE_DESCRIPTOR; + +/// USB endpoint descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_ENDPOINT + uint8 bEndpointAddress; ///< Endpoint address (direction[7] + number[3:0]) + uint8 bmAttributes; ///< Endpoint attributes (ISO / BULK / INT) + uint16 wMaxPacketSize; ///< Maximum endpoint packet size + uint8 bInterval; ///< \ref EP_ATTR_INT : Polling interval (in ms) +} USB_ENDPOINT_DESCRIPTOR; + +/// USB string descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_STRING + uint16 pString[1]; ///< Unicode string +} USB_STRING_DESCRIPTOR; + +/// USB HID descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< HID descriptor type + uint16 bscHID; ///< HID specification release number (in BCD) + uint8 bCountryCode; ///< Hardware target country + uint8 bNumDescriptors; ///< Number of HID class descriptors to follow + uint8 bRDescriptorType; ///< Report descriptor type + uint16 wDescriptorLength; ///< Total length of the associated report descriptor +} USB_HID_DESCRIPTOR; +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// Look-up table entry for non-standard descriptor types (used with \ref usbsrGetDescriptor) +typedef struct { + uint8 valueMsb; ///< LSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 valueLsb; ///< MSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 indexMsb; ///< LSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 indexLsb; ///< MSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 __code *pDescStart; ///< A pointer to the descriptor to be returned for the given index/value + uint16 length; ///< The length of the returned descriptor +} DESC_LUT_INFO; + +/// Look-up table for double-buffer settings +typedef struct { + USB_INTERFACE_DESCRIPTOR __code *pInterface; ///< Pointer to an interface descriptor + uint8 inMask; ///< Bitmask for IN endpoints (bit x maps to EPx IN) + uint8 outMask; ///< Bitmask for OUT endpoints (bit x maps to EPx OUT) +} DBLBUF_LUT_INFO; + +// From usb_interrupt.h +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + uint8 inSuspend; ///< Is currently in suspend? + uint16 irqMask; ///< USB interrupts to be enabled +} USBIRQ_DATA; + +//------------------------------------------------------------------------------------------------------- +/// USBDP internal module data +typedef struct { + const uint8 __code *pDesc; ///< Pointer to the current descriptor +} USBDP_DATA; +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_interrupt.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_interrupt.h new file mode 100644 index 0000000..226947c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_interrupt.h @@ -0,0 +1,213 @@ +/*********************************************************************************** + + Filename: usb_interrupt.h + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +#ifndef USBINTERRUPT_H +#define USBINTERRUPT_H +/** \addtogroup module_usb_interrupt USB Interrupt (usbirq) + * \brief This module contains the USB interrupt handler, which converts USB interrupts to USBIRQ events. + * + * This module contains two interrupt service routines: + * \li P0 ISR + * \li P2 ISR + * Both these are used by the USB part of the MCU. Hence it is recommended to only use P1 for + * interrupts from any peripherals connected to the MCU. Unless running low on GPIO pins, one should + * generally avoid using the P0 and P2 pins at all. + * + * The MCU contains three interrupt flag registers, USBCIE, USBIIE and USBOIE, which are all cleared + * upon read access. The \ref module_usb_interrupt module encapsulates the USB interrupts, and saves the + * three flag registers in a single 16-bit word. By doing that it becomes possible to process + * high-priority events in the interrupt context, and low-priority events in the main loop. + * + * \section section_usbirq_initialization Initialization + * After initializing the \ref module_usb_framework module, \c main() must call \ref usbirqInit(). The + * \c irqMask parameter of this function shall contain all \c USBIRQ_EVENT bits that will be handled + * either in the interrupt or in \c main(). Note, however, that the event reporting may not always be + * necessary. For instance, there is usually no reason to enable \c USBIRQ_EVENT_EPxIN or + * \c USBIRQ_EVENT_EPxOUT events when handling low-priority transfers in the \c main() loop. In these + * cases it is simpler and more efficient to check the arming condition of the endpoint in question. + * + * The following example enables the setup and reset events (which must always be enabled!), and turns on + * global interrupts: + * \code + * void main(void) { + * + * ... Initialize the crystal oscillator and USB framework first ... + * + * // Initialize the USB Interrupt module + * usbirqInit(USBIRQ_EVENT_RESET | USBIRQ_EVENT_SUSPEND | USBIRQ_EVENT_RESUME | USBIRQ_EVENT_SETUP); + * + * // Turn on interrupts + * INT_GLOBAL_ENABLE(); + * + * // Main loop + * while (1) { + * ... + * } + * \endcode + * + * \section section_usbirq_event_processing Event Processing + * Regardless of whether the interrupt event is processed in the interrupt or in the main loop, the code + * piece for doing it is the same (this example illustrates the processing of \ref USBIRQ_EVENT_RESET + * events): + * \code + * // Let the framework handle reset events :) + * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) { + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET); + * usbfwResetHandler(); + * } + * \endcode + * + * \section Hooks + * The following hook is called from the USB interrupt, and allows for event processing in the interrupt + * context: + * \code + * void usbirqHookProcessEvents(void) { + * // Process high-priority events here, or simply return if there are none + * } + * \endcode + * @{ + */ + +#include "usb_framework_structs.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBINTERRUPT_C + #define EXTERN ///< Definition used only for usb_interrupt.c to declare variable +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +/*typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + BOOL inSuspend; ///< Is currently in suspend? + uint16 irqMask; ///< USB interrupts to be enabled +} USBIRQ_DATA;*/ +#ifdef USBIRQ_DATA_ADDR + EXTERN __no_init __data USBIRQ_DATA usbirqData @ USBIRQ_DATA_ADDR; ///< USBIRQ internal module data at fixed address +#else + EXTERN USBIRQ_DATA __data usbirqData; ///< USBIRQ internal module data +#endif +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name USB Interrupt Events +//@{ + +/// Suspend signaling detected on the USB bus +/// Note that the chip should not enter PM1 while still in the interrupt routine (inside the usbirqHookProcessEvents() function ) +#define USBIRQ_EVENT_SUSPEND 0x0001 +/// Resume signaling detected on the USB bus +#define USBIRQ_EVENT_RESUME 0x0002 +/// Reset signaling detected on the USB bus (call \ref usbfwResetHandler() for processing) +#define USBIRQ_EVENT_RESET 0x0004 +/// Start of frame token received (synthesized by hardware when the next SOF token is expected, so that missing or corrupted tokens have no effect) +#define USBIRQ_EVENT_START_OF_FRAME 0x0008 +/// Endpoint 0 IN/OUT setup/data transfer complete / stall sent / premature completion (call \ref usbfwSetupHandler() for processing) +#define USBIRQ_EVENT_SETUP 0x0010 +/// Endpoint 1 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP1IN 0x0020 +/// Endpoint 2 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP2IN 0x0040 +/// Endpoint 3 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP3IN 0x0080 +/// Endpoint 4 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP4IN 0x0100 +/// Endpoint 5 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP5IN 0x0200 +/// Endpoint 1 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP1OUT 0x0400 +/// Endpoint 2 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP2OUT 0x0800 +/// Endpoint 3 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP3OUT 0x1000 +/// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP4OUT 0x2000 +/// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP5OUT 0x4000 +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Mask Access Macros +//@{ + +/// Clears one or more events (use one or more \c USBIRQ_EVENT bits OR'ed together) +#define USBIRQ_CLEAR_EVENTS(mask) (usbirqData.eventMask &= ~(mask)) +/// Get the bit mask containing all pending events +#define USBIRQ_GET_EVENT_MASK() (usbirqData.eventMask) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Event Hooks +//@{ + +/// Called upon all USB interrupts for high-priority event processing +void usbirqHookProcessEvents(void); + +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbirqInit(uint16 irqMask); +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void); +#else +__interrupt void usbirqHandler(void); +#endif +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_reg.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_reg.h new file mode 100644 index 0000000..03bcc42 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_reg.h @@ -0,0 +1,142 @@ +/*********************************************************************************** + + Filename: usb_reg.h + + Description: Register bit defintions for CCxx11 and CC2531. + +***********************************************************************************/ + +#ifndef USBREG_H +#define USBREG_H + + +// USBADDR +#define USBADDR_UPDATE 0x80 +#define USBADDR_USBADDR 0x7F + +// USBPOW +#define USBPOW_ISO_WAIT_SOF 0x80 +#define USBPOW_RST 0x08 +#define USBPOW_RESUME 0x04 +#define USBPOW_SUSPEND 0x02 +#define USBPOW_SUSPEND_EN 0x01 + +// USBIIF +#define USBIIF_INEP5IF 0x20 +#define USBIIF_INEP4IF 0x10 +#define USBIIF_INEP3IF 0x08 +#define USBIIF_INEP2IF 0x04 +#define USBIIF_INEP1IF 0x02 +#define USBIIF_EP0IF 0x01 + +// USBOIF +#define USBOIF_OUTEP5IF 0x20 +#define USBOIF_OUTEP4IF 0x10 +#define USBOIF_OUTEP3IF 0x08 +#define USBOIF_OUTEP2IF 0x04 +#define USBOIF_OUTEP1IF 0x02 + +// USBCIF +#define USBCIF_SOFIF 0x08 +#define USBCIF_RSTIF 0x04 +#define USBCIF_RESUMEIF 0x02 +#define USBCIF_SUSPENDIF 0x01 + +// USBIIE +#define USBIIE_INEP5IE 0x20 +#define USBIIE_INEP4IE 0x10 +#define USBIIE_INEP3IE 0x08 +#define USBIIE_INEP2IE 0x04 +#define USBIIE_INEP1IE 0x02 +#define USBIIE_EP0IE 0x01 + +// USBOIE +#define USBOIE_OUTEP5IE 0x20 +#define USBOIE_OUTEP4IE 0x10 +#define USBOIE_OUTEP3IE 0x08 +#define USBOIE_OUTEP2IE 0x04 +#define USBOIE_OUTEP1IE 0x02 + +// USBCIE +#define USBCIE_SOFIE 0x08 +#define USBCIE_RSTIE 0x04 +#define USBCIE_RESUMEIE 0x02 +#define USBCIE_SUSPENDIE 0x01 + +// USBCS0 +#define USBCS0_CLR_SETUP_END 0x80 +#define USBCS0_CLR_OUTPKT_RDY 0x40 +#define USBCS0_SEND_STALL 0x20 +#define USBCS0_SETUP_END 0x10 +#define USBCS0_DATA_END 0x08 +#define USBCS0_SENT_STALL 0x04 +#define USBCS0_INPKT_RDY 0x02 +#define USBCS0_OUTPKT_RDY 0x01 + +// USBCSIL +#define USBCSIL_CLR_DATA_TOG 0x40 +#define USBCSIL_SENT_STALL 0x20 +#define USBCSIL_SEND_STALL 0x10 +#define USBCSIL_FLUSH_PACKET 0x08 +#define USBCSIL_UNDERRUN 0x04 +#define USBCSIL_PKT_PRESENT 0x02 +#define USBCSIL_INPKT_RDY 0x01 + +// USBCSIH +#define USBCSIH_AUTOSET 0x80 +#define USBCSIH_ISO 0x40 +#define USBCSIH_FORCE_DATA_TOG 0x08 +#define USBCSIH_IN_DBL_BUF 0x01 + +// USBCSOL +#define USBCSOL_CLR_DATA_TOG 0x80 +#define USBCSOL_SENT_STALL 0x40 +#define USBCSOL_SEND_STALL 0x20 +#define USBCSOL_FLUSH_PACKET 0x10 +#define USBCSOL_DATA_ERROR 0x08 +#define USBCSOL_OVERRUN 0x04 +#define USBCSOL_FIFO_FULL 0x02 +#define USBCSOL_OUTPKT_RDY 0x01 + +// USBCSOH +#define USBCSOH_AUTOCLEAR 0x80 +#define USBCSOH_ISO 0x40 +#define USBCSOH_OUT_DBL_BUF 0x01 + +#define SLEEP_USB_EN 0x80 + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c new file mode 100644 index 0000000..f3a38c5 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c @@ -0,0 +1,659 @@ +/*********************************************************************************** + + Filename: usb_standard_request.c + + Description: Handle USB standard requests. + +***********************************************************************************/ + +/// \addtogroup module_usb_standard_requests +/// @{ +#include "usb_firmware_library_headers.h" +#include "hal_types.h" +#include "hal_board.h" + + + +/** \brief Processes the \ref GET_STATUS request (returns status for the specified recipient) + * + * The recipient bits in \ref USB_SETUP_HEADER.requestType specify the desired recipient. This is either the + * (one and only) device, a specific interface, or a specific endpoint. Some of the status bits can be + * changed with the SET_FEATURE and CLEAR_FEATURE requests. + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 2 + * + * Data (IN): + * Depends upon the recipient (the bit field illustrations are MSB first, LSB last): + * - DEVICE: 00000000.000000RS, where R(1) = DEVICE_REMOTE_WAKEUP and S(0) = SELF_POWERED + * - INTERFACE: 00000000.00000000 (all bits are reserved) + * - ENDPOINT: 00000000.0000000H, where H(0) = ENDPOINT_HALT + */ +void usbsrGetStatus(void) +{ + uint8 endpoint; + static uint16 __xdata status; + + // Common sanity check + if (usbSetupHeader.value || HI_UINT16(usbSetupHeader.index) || (usbSetupHeader.length != 2)) { + usbfwData.ep0Status = EP_STALL; + + // Return status for device, interface, or endpoint + } else { + switch (usbSetupHeader.requestType) { + + // Device status: + // Bit 0: Self powered + // Bit 1: Remote wake-up allowed + case RT_IN_DEVICE: + + // Sanity check + if (LO_UINT16(usbSetupHeader.index)) { + usbfwData.ep0Status = EP_STALL; + + // Get the bit values from the USBFW_DATA struct + } else { + + // Self powered? + status = usbfwData.selfPowered ? 0x0001 : 0x0000; + + // Remote wakeup? + if (usbfwData.remoteWakeup) status |= 0x0002; + } + break; + + // Interface status: + // All bits are reserved + case RT_IN_INTERFACE: + + // Sanity check + if (usbfwData.usbState != DEV_CONFIGURED) { + usbfwData.ep0Status = EP_STALL; + } else { + status = 0x0000; + } + break; + + // Endpoint status: + // Bit 0: Endpoint halted + case RT_IN_ENDPOINT: + endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F; + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (endpoint > 5)) { + usbfwData.ep0Status = EP_STALL; + + // Translate endpoint address to status index and return the status + } else { + + // IN + if (LO_UINT16(usbSetupHeader.index) & 0x80) { + status = (usbfwData.pEpInStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000; + + // OUT + } else { + status = (usbfwData.pEpOutStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000; + } + } + break; + + default: + usbfwData.ep0Status = EP_STALL; + break; + } + + if (usbfwData.ep0Status != EP_STALL) { + // Send it + usbSetupData.pBuffer = (uint8 __generic *)&status; + usbSetupData.bytesLeft = 2; + usbfwData.ep0Status = EP_TX; + } + } +} // usbsrGetStatus + + + + +/** \brief Internal function used for the very similar \ref SET_FEATURE and \ref CLEAR_FEATURE requests + * + * This function either sets or clears the specified feature on the specified recipient. + * + * \param[in] set + * When TRUE, the feature is set. When FALSE, the feature is cleared. + * + * \return + * TRUE if the selected feature is supported by the USB library. FALSE to indicate that + * \ref usbsrHookClearFeature() or \ref usbsrHookSetFeature() must be called. + */ +static uint8 ChangeFeature(uint8 set) +{ + uint8 endpoint; + + // Sanity check + if (usbSetupHeader.length || (usbfwData.usbState != DEV_CONFIGURED) && (usbSetupHeader.index != 0)) { + usbfwData.ep0Status = EP_STALL; + + // Handle based on recipient + } else { + switch (usbSetupHeader.requestType & RT_MASK_RECIP) { + + // Device + case RT_RECIP_DEV: + + // Sanity check + if (LO_UINT16(usbSetupHeader.value) != DEVICE_REMOTE_WAKEUP) { + return FALSE; + } else { + usbfwData.remoteWakeup = set; + usbsrHookProcessEvent(set ? USBSR_EVENT_REMOTE_WAKEUP_ENABLED : USBSR_EVENT_REMOTE_WAKEUP_DISABLED, 0); + } + break; + + // Endpoint + case RT_RECIP_IF: + return FALSE; + + // Endpoint + case RT_RECIP_EP: + endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F; + + // Sanity check + if (LO_UINT16(usbSetupHeader.value) != ENDPOINT_HALT) { + return FALSE; + } else if (endpoint > 5) { + usbfwData.ep0Status = EP_STALL; + } else { + USBFW_SELECT_ENDPOINT(endpoint); + + // IN + if (LO_UINT16(usbSetupHeader.index) & 0x80) { + USBCSIL = set ? USBCSIL_SEND_STALL : USBCSIL_CLR_DATA_TOG; + usbfwData.pEpInStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE; + usbsrHookProcessEvent(set ? USBSR_EVENT_EPIN_STALL_SET : USBSR_EVENT_EPIN_STALL_CLEARED, endpoint); + + // OUT + } else { + USBCSOL = set ? USBCSOL_SEND_STALL : USBCSOL_CLR_DATA_TOG; + usbfwData.pEpOutStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE; + usbsrHookProcessEvent(set ? USBSR_EVENT_EPOUT_STALL_SET : USBSR_EVENT_EPOUT_STALL_CLEARED, endpoint); + } + USBFW_SELECT_ENDPOINT(0); + } + break; + + default: + usbfwData.ep0Status = EP_STALL; + break; + } + } + return TRUE; +} // ChangeFeature + + + + +/** \brief Processes the \ref CLEAR_FEATURE request (clears or disables a specific feature) + * + * The feature selector value must be appropriate to the recipient. + * + * Parameters: + * - VALUE: Feature selector: + * - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup + * - \c ENDPOINT_HALT(0): Clear the halt feature for the specified endpoint (not endpoint 0!) + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 0 + */ +void usbsrClearFeature() +{ + if (!ChangeFeature(FALSE)) { + usbsrHookClearFeature(); + } +} // usbsrClearFeature + + + + +/** \brief Processes the \ref SET_FEATURE request (sets or enables a specific feature) + * + * The feature selector value must be appropriate to the recipient. + * + * Parameters: + * - VALUE: Feature selector: + * - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup + * - \c ENDPOINT_HALT(0): Set the halt feature for the specified endpoint (not endpoint 0!) + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 0 + */ +void usbsrSetFeature(void) +{ + if (!ChangeFeature(TRUE)) { + usbsrHookSetFeature(); + } +} // usbsrSetFeature + + + + +/** \brief Processes the \ref SET_ADDRESS request (sets the device address for all future device + * accesses) + * + * If the value is between 1 and 127 and the device is in the default state, it will enter the address + * state. If it already is in the address state, it starts to use the newly-specified address. + * + * If the value is 0 and the device is in the address state, it will enter the default state. If it + * already is in the default state, nothing happens. + * + * Parameters: + * - VALUE: The device address (0-127) + * - INDEX: Always 0 + * - LENGTH: Always 0 + */ +void usbsrSetAddress(void) +{ + + // Sanity check + if (usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value) || (LO_UINT16(usbSetupHeader.value) & 0x80)) { + usbfwData.ep0Status = EP_STALL; + + // Update the device address + } else { + USBADDR = LO_UINT16(usbSetupHeader.value); + if (LO_UINT16(usbSetupHeader.value) != 0) { + if (usbfwData.usbState == DEV_DEFAULT) usbfwData.usbState = DEV_ADDRESS; + } else { + if (usbfwData.usbState == DEV_ADDRESS) usbfwData.usbState = DEV_DEFAULT; + } + } + +} // usbsrSetAddress + + + + +/** \brief Processes the \ref GET_DESCRIPTOR request (returns the specified USB descriptor) + * + * The \ref module_usb_descriptor_parser module is used to locate device, configuration and string + * descriptors. Note that configuration descriptors also include interface, endpoint and other + * "similar" descriptor types (e.g. HID descriptor), with the total descriptor length specified by + * the \ref USB_CONFIGURATION_DESCRIPTOR.wTotalLength field. + * + * Other descriptor types that are not returned with the configuration descriptor, must be defined in + * the usbDescriptorMarker.pUsbDescLut lookup-table. This table specifies the values of the VALUE and INDEX fields, and + * gives a pointer to the descriptor along with it's length. + * + * Parameters: + * - VALUE.MSB: Descriptor type + * - VALUE.LSB: Descriptor index + * - INDEX: 0, or language ID for string descriptors (currently not supported) + * - LENGTH: Descriptor length (either the requested number of bytes, or the length of the descriptor, + * whichever is the smallest) + * + * Data (IN): + * The descriptor(s) + */ +void usbsrGetDescriptor(void) +{ + uint8 n; + + // Which descriptor? + switch (HI_UINT16(usbSetupHeader.value)) { + + // Device descriptor + case DESC_TYPE_DEVICE: + usbSetupData.pBuffer = (uint8 __code*) usbdpGetDeviceDesc(); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX]; + break; + + // Configuration descriptor + case DESC_TYPE_CONFIG: + usbSetupData.pBuffer = (uint8 __code*) usbdpGetConfigurationDesc(0, LO_UINT16(usbSetupHeader.value)); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_CONFIG_LENGTH_LSB_IDX] + + usbSetupData.pBuffer[DESC_CONFIG_LENGTH_MSB_IDX] * 256; + break; + + // String descriptor + case DESC_TYPE_STRING: + // OPT: Implement language ID + usbSetupData.pBuffer = (uint8 __code*) usbdpGetStringDesc(LO_UINT16(usbSetupHeader.value)); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX]; + break; + + // Other descriptor type + default: + // Perform a table search (on index and value) + usbSetupData.pBuffer = NULL; + for (n = 0; n < ((uint16)usbDescriptorMarker.pUsbDescLutEnd - (uint16)usbDescriptorMarker.pUsbDescLut) / sizeof(DESC_LUT_INFO); n++) { + if ((usbDescriptorMarker.pUsbDescLut[n].valueMsb == HI_UINT16(usbSetupHeader.value)) + && (usbDescriptorMarker.pUsbDescLut[n].valueLsb == LO_UINT16(usbSetupHeader.value)) + && (usbDescriptorMarker.pUsbDescLut[n].indexMsb == HI_UINT16(usbSetupHeader.index)) + && (usbDescriptorMarker.pUsbDescLut[n].indexLsb == LO_UINT16(usbSetupHeader.index)) ) + { + usbSetupData.pBuffer = usbDescriptorMarker.pUsbDescLut[n].pDescStart; + usbSetupData.bytesLeft = usbDescriptorMarker.pUsbDescLut[n].length; + } + } + } + + // Stall EP0 if no descriptor was found + if (usbSetupData.pBuffer == NULL) usbfwData.ep0Status = EP_STALL; + + if (usbfwData.ep0Status != EP_STALL) { + + // Limit the returned descriptor size (the PC wants to know about sizes before + // polling the complete descriptors) + if (usbSetupData.bytesLeft > usbSetupHeader.length) { + usbSetupData.bytesLeft = usbSetupHeader.length; + } + + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetDescriptor + + + +/** \brief Internally used function that configures all endpoints for the specified interface + * + * The new endpoint setup overwrites the old, without any warning. Unused endpoints keep their current + * setup. The user is responsible for ensuring that no endpoint buffers overwrite each other, and that + * interfaces do not cause conflicts. The pUsbDblbufLutInfo table must contain an entry for each + * interface descriptor to define endpoint double-buffering. + * + * \param[in] *pInterface + * A pointer to the interface descriptor + */ +static void ConfigureEndpoints(USB_INTERFACE_DESCRIPTOR __code *pInterface) +{ + uint8 n; + uint16 maxpRegValue; + uint8 csRegValue; + uint8 endpoint; + USB_ENDPOINT_DESCRIPTOR __code *pEndpoint; + DBLBUF_LUT_INFO __code *pUsbDblbufLutInfo; + + // Locate the double buffer settings + if (pInterface->bNumEndpoints) { + pUsbDblbufLutInfo = (DBLBUF_LUT_INFO __code*) usbDescriptorMarker.pUsbDblbufLut; + while (pUsbDblbufLutInfo->pInterface != pInterface) { + pUsbDblbufLutInfo++; + } + } + + // For each endpoint in this interface + for (n = 0; n < pInterface->bNumEndpoints; n++) { + if (pEndpoint = usbdpFindNext(DESC_TYPE_ENDPOINT, 0)) { + + // Get the endpoint index + endpoint = pEndpoint->bEndpointAddress & 0x0F; + USBFW_SELECT_ENDPOINT(endpoint); + + csRegValue = 0x00; + maxpRegValue = (pEndpoint->wMaxPacketSize + 7) >> 3; + + // For IN endpoints... + if (pEndpoint->bEndpointAddress & 0x80) { + + // Clear data toggle, and flush twice (due to double buffering) + USBCSIL = USBCSIL_CLR_DATA_TOG | USBCSIL_FLUSH_PACKET; + USBCSIL = USBCSIL_FLUSH_PACKET; + + // USBCSIH + if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSIH_ISO; // ISO flag + if (pUsbDblbufLutInfo->inMask & (1 << endpoint)) csRegValue |= USBCSIH_IN_DBL_BUF; // Double buffering + USBCSIH = csRegValue; + + // Max transfer size + USBMAXI = maxpRegValue; + + // Endpoint status + usbfwData.pEpInStatus[endpoint - 1] = EP_IDLE; + + // For OUT endpoints... + } else { + + // Clear data toggle, and flush twice (due to double buffering) + USBCSOL = USBCSOL_CLR_DATA_TOG | USBCSOL_FLUSH_PACKET; + USBCSOL = USBCSOL_FLUSH_PACKET; + + // USBCSOH + if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSOH_ISO; // ISO flag + if (pUsbDblbufLutInfo->outMask & (1 << endpoint)) csRegValue |= USBCSOH_OUT_DBL_BUF; // Double buffering + USBCSOH = csRegValue; + + // Max transfer size + USBMAXO = maxpRegValue; + + // Endpoint status + usbfwData.pEpOutStatus[endpoint - 1] = EP_IDLE; + } + USBFW_SELECT_ENDPOINT(0); + } + } +} // ConfigureEndpoints + + + + +/** \brief Processes the \ref GET_CONFIGURATION request (returns the current device configuration value) + * + * If the returned value is 0, the device is not configured (not in the configured state) + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Always 0 + * - LENGTH: Always 1 + * + * Data (IN): + * The non-zero \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue of the currently selected + * configuration. + */ +void usbsrGetConfiguration(void) +{ + + // Sanity check + if (usbSetupHeader.value || usbSetupHeader.index || (usbSetupHeader.length != 1)) { + usbfwData.ep0Status = EP_STALL; + + // Return the current configuration + } else { + usbSetupData.pBuffer = &usbfwData.configurationValue; + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetConfiguration + + + + +/** \brief Processes the \ref SET_CONFIGURATION request (sets the device configuration) + * + * The configuration value must either be 0, in which case the device enters the address state, or it + * must match a configuration value from one of the USB configuration descriptors. If there is a match, + * the device enters the configured state. + * + * This request resets all interfaces to alternate setting 0, and uses the \c ConfigureEndpoints() + * function to automatically setup all endpoint registers. + * + * Parameters: + * - VALUE: The configuration value (0-255) + * - INDEX: Always 0 + * - LENGTH: Always 0 + */ +void usbsrSetConfiguration(void) +{ + uint8 n; + USB_CONFIGURATION_DESCRIPTOR __code *pConfiguration; + USB_INTERFACE_DESCRIPTOR __code *pInterface; + + // Sanity check + if ((usbfwData.usbState == DEV_DEFAULT) || usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value)) { + usbfwData.ep0Status = EP_STALL; + + // Default endpoint setup + } else { + usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGING, 0); + + // Configure relevant endpoints + if (LO_UINT16(usbSetupHeader.value)) { + + // Find the correct configuration descriptor... + pConfiguration = usbdpGetConfigurationDesc(LO_UINT16(usbSetupHeader.value), 0); + + // If it exists... + if (pConfiguration) { + usbfwData.usbState = DEV_CONFIGURED; + usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value); + + // For each interface... + for (n = 0; n < pConfiguration->bNumInterfaces; n++) { + usbfwData.pAlternateSetting[n] = 0x00; + + // Look only for alternate setting 0 + do { + pInterface = usbdpFindNext(DESC_TYPE_INTERFACE, 0); + } while (pInterface->bAlternateSetting != usbfwData.pAlternateSetting[n]); + + // Configure all endpoints in this interface + ConfigureEndpoints(pInterface); + } + + // If not, then stall the endpoint + } else { + usbfwData.ep0Status = EP_STALL; + } + + // Unconfigure endpoints + } else { + usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value); + usbfwData.usbState = DEV_ADDRESS; + usbfwSetAllEpStatus(EP_HALT); + } + usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGED, 0); + } + +} // usbsrSetConfiguration + + + + +/** \brief Processes the \ref GET_INTERFACE request (returns the selected alternate setting for the + * specified interface) + * + * Some USB devices have configurations with mutually exclusive interface settings. This request allows + * the host to determine the currently selected alternate setting. + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Interface number + * - LENGTH: Always 1 + * + * Data (IN): + * The alternate setting for the selected interface + */ +void usbsrGetInterface(void) +{ + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_IN_INTERFACE) || usbSetupHeader.value || (usbSetupHeader.length != 1)) { + usbfwData.ep0Status = EP_STALL; + + // Return the current alternate setting + } else { + usbSetupData.pBuffer = &usbfwData.pAlternateSetting[usbSetupHeader.index]; + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetInterface + + + + +/** \brief Processes the \ref SET_INTERFACE request (selects an alternate setting for the specified + * interface) + * + * Some USB devices have configurations with mutually exclusive interface settings. This request allows + * the host to select the desired alternate setting. + * + * This function uses the \c ConfigureEndpoints() to automatically setup the relevant endpoint + * registers. + * + * Parameters: + * - VALUE: Alternate setting + * - INDEX: Interface number + * - LENGTH: Always 0 + */ +void usbsrSetInterface(void) +{ + USB_INTERFACE_DESCRIPTOR __code *pInterface; + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_OUT_INTERFACE) || usbSetupHeader.length) { + usbfwData.ep0Status = EP_STALL; + + // Verify that the desired alternate setting is available, and then make the switch + } else { + if (pInterface = usbdpGetInterfaceDesc(usbfwData.configurationValue, usbSetupHeader.index, usbSetupHeader.value)) { + usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGING, usbSetupHeader.index); + usbfwData.pAlternateSetting[usbSetupHeader.index] = usbSetupHeader.value; + + // Configure all endpoints in this interface + ConfigureEndpoints(pInterface); + usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGED, usbSetupHeader.index); + + // This interface does not exist + } else { + usbfwData.ep0Status = EP_STALL; + } + } + +} // usbsrSetInterface + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h new file mode 100644 index 0000000..8f70dd9 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h @@ -0,0 +1,201 @@ +/*********************************************************************************** + + Filename: usb_standard_request.h + + Description: Handle USB standard requests. + +***********************************************************************************/ + +#ifndef USBSTANDARDREQUESTS_H +#define USBSTANDARDREQUESTS_H +/** \addtogroup module_usb_standard_requests USB Standard Requests (usbsr) + * \brief This module contains automated functions for processing USB standard requests + * + * The processing functions are based on the \ref module_usb_framework, and access to the user-provided + * USB descriptors through the \ref module_usb_descriptor_parser. All device classes and descriptor + * combinations are supported, with no need to write or modify any source code. However, as described + * below, some standard request must be fully or partially implemented by the user. + * + * \section section_usbsr_hooks Hooks + * Standard requests that are not supported by the USB library or that refer to non-standard features, + * are forwarded to the application via function hooks. This includes: + * \li All \ref SET_DESCRIPTOR requests (see \ref usbsrHookSetDescriptor()) + * \li All \ref SYNCH_FRAME requests (see \ref usbsrHookSynchFrame()) + * \li \ref CLEAR_FEATURE requests that refer to unknown features (see \ref usbsrHookClearFeature()) + * \li \ref SET_FEATURE requests that refer to unknown features (see \ref usbsrHookSetFeature()) + * + * These hooks must always be provided, however if the application does not either support the requests, + * it should just stall endpoint 0. The processing uses the same mechanisms as for class and vendor + * requests (refer to the \ref module_usb_framework module for detailed description and examples). + * + * When the \ref GET_STATUS request is received, the \ref usbsrHookModifyGetStatus() hook is always + * called, so that additional status bits may be added. + * + * To have any practical purpose, "OUT data phase" standard requests need to notify the application of + * certain events. This is done by passing the event via yet another function hook, + * \ref usbsrHookProcessEvent(uint8 event, uint8 index). For events related to interfaces and endpoints, + * the \c index parameter refers to an interface number or the least significant nibble of the endpoint + * address. The following events can be generated: + * \li \ref USBSR_EVENT_CONFIGURATION_CHANGING (the device configuration is about to change) + * \li \ref USBSR_EVENT_CONFIGURATION_CHANGED (the device configuration has changed) + * \li \ref USBSR_EVENT_INTERFACE_CHANGING (the alternate setting of the given interface is about to + * change) + * \li \ref USBSR_EVENT_INTERFACE_CHANGED (the alternate setting of the given interface has changed) + * \li \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED (remote wakeup has been enabled by the host) + * \li \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED (remote wakeup has been disabled by the host) + * \li \ref USBSR_EVENT_EPIN_STALL_CLEARED (the given IN endpoint's stall condition has been cleared the + * host) + * \li \ref USBSR_EVENT_EPIN_STALL_SET (the given IN endpoint has been stalled by the host) + * \li \ref USBSR_EVENT_EPOUT_STALL_CLEARED (the given OUT endpoint's stall condition has been cleared + * the host) + * \li \ref USBSR_EVENT_EPOUT_STALL_SET (the given OUT endpoint has been stalled by the PC) + * @{ + */ + + +//------------------------------------------------------------------------------------------------------- +/// \name Standard Request Codes +//@{ + +/// Standard request that returns status for the specified recipient +#define GET_STATUS 0x00 +/// Standard request that clears or disables a specific feature +#define CLEAR_FEATURE 0x01 +/// Standard request that sets or enables a specific feature +#define SET_FEATURE 0x03 +/// Standard request that sets the device address for all future device accesses +#define SET_ADDRESS 0x05 +/// Standard request that returns the specified USB descriptor +#define GET_DESCRIPTOR 0x06 +/// Standard request that may be used to update exitsting descriptors or new descriptors may be added +#define SET_DESCRIPTOR 0x07 +/// Standard request that returns the current device configuration value +#define GET_CONFIGURATION 0x08 +/// Standard request that sets the device configuration +#define SET_CONFIGURATION 0x09 +/// Standard request that returns the selected alternate setting for the specified interface +#define GET_INTERFACE 0x0A +/// Standard request that selects an alternate setting for the specified interface +#define SET_INTERFACE 0x0B +/// Standard request that is used to set and then report an endpoint's synchronization frame +#define SYNCH_FRAME 0x0C +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Features Indexes +//@{ + +/// Endpoint feature: Halt +#define ENDPOINT_HALT 0x00 +/// Device feature: Remote wakeup +#define DEVICE_REMOTE_WAKEUP 0x01 +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Event Types +//@{ + +/// The device configuration is about to change +#define USBSR_EVENT_CONFIGURATION_CHANGING 0x01 +/// The device configuration has changed +#define USBSR_EVENT_CONFIGURATION_CHANGED 0x02 +/// The alternate setting of the given interface about to change (index = "interface index") +#define USBSR_EVENT_INTERFACE_CHANGING 0x03 +/// The alternate setting of the given interface has changed (index = "interface index") +#define USBSR_EVENT_INTERFACE_CHANGED 0x04 +/// Remote wakeup has been enabled by the host +#define USBSR_EVENT_REMOTE_WAKEUP_ENABLED 0x05 +/// Remote wakeup has been disabled by the host +#define USBSR_EVENT_REMOTE_WAKEUP_DISABLED 0x06 +/// The given IN endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPIN_STALL_CLEARED 0x07 /* Endpoint index */ +/// The given IN endpoint has been stalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPIN_STALL_SET 0x08 /* Endpoint index */ +/// The given OUT endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPOUT_STALL_CLEARED 0x09 /* Endpoint index */ +/// The given OUT endpoint has been stalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPOUT_STALL_SET 0x0A /* Endpoint index */ +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Standard Request Hooks +//@{ +/// Refer to the \ref section_setup_handler_usage section for a description on how to process standard +/// requests. + +/// Hook which is called upon reception of a \ref SET_DESCRIPTOR request +void usbsrHookSetDescriptor(void); +/// Hook which is called upon reception of a \ref SYNCH_FRAME request (unsupported). +void usbsrHookSynchFrame(void); +/// Hook which is called when a \ref CLEAR_FEATURE request refers to a an unsupported featureted. +void usbsrHookClearFeature(void); +/// Hook which is called when a \ref SET_FEATURE request refers to a an unsupported feature. +void usbsrHookSetFeature(void); +/// Hook for modifying a \ref GET_STATUS request before the status value is returned to the PC. +void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus); +/// Hook which is called upon a standard request generated event (unsupported). +void usbsrHookProcessEvent(uint8 event, uint8 index); +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Handled Standard Requests +//@{ +void usbsrGetStatus(void); +void usbsrClearFeature(void); +void usbsrSetFeature(void); +void usbsrSetAddress(void); +void usbsrGetDescriptor(void); +void usbsrGetConfiguration(void); +void usbsrSetConfiguration(void); +void usbsrGetInterface(void); +void usbsrSetInterface(void); +//@} +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_suspend.h b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_suspend.h new file mode 100644 index 0000000..8956b60 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2540USB/usb/library/usb_suspend.h @@ -0,0 +1,143 @@ +/*********************************************************************************** + + Filename: usb_suspend.h + + Description: Handle the USB suspend state. + +***********************************************************************************/ + +#ifndef USBSUSPEND_H +#define USBSUSPEND_H +/** \addtogroup module_usb_suspend USB Suspend (usbsusp) + * \brief This module contains the functionality for USB suspend, USB resume and USB remote wakeup. + * + * All USB devices must support the suspended state to fully comply with the USB specification. Special + * care must be taken to implement this functionality correctly, so follow the instructions below + * carefully. Refer to the USB specification for detailed information on current consumption in suspend + * mode (how power consumption shall be measured, averaging, peak value etc.). + * + * \section usb_suspend_resume USB Suspend and Resume + * If there is no activity on the USB bus for a period longer than 3 ms, the MCU will generate a + * \ref USBIRQ_EVENT_SUSPEND event. The USB device must then enter suspend mode within 10 ms, where it + * draws no more than: + * \li 500 uA for low-power devices or high-power devices operating at lower-power + * \li 2.5 mA for high-power devices with remote wake-up enabled + * + * The library supports the USB suspend and resume functionality through a simple interface: + * \li Make sure that the 48 MHz XOSC is never turned off anywhere in the application. + * \li In the call to \ref usbirqInit(), add \ref USBIRQ_EVENT_SUSPEND and \ref USBIRQ_EVENT_RESUME + * (optional) to the interrupt mask. + * \li Do NOT process \ref USBIRQ_EVENT_SUSPEND in \ref usbirqHookProcessEvents() or in any other + * interrupt service routine. This may (or in most cases will) prevent the USB device from getting + * out of suspend mode. + * + * \li In the main loop, add the code shown below. Make sure that this code is visited at least every + * 10 ms. If the worst-case path through the main loop uses more than 10 ms, the code block can be + * inserted in multiple places in the loop until the requirement is met. + * \code + * // Process USB suspend events + * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) { + * + * // Clear the suspend event + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND); + * + * ... Do what needs to be done before entering power mode 1 here (e.g. turn off the radio, configure + * I/O to minimize power consumption, start the sleep timer etc.) ... + * + * // This function call will take the USB device into power mode 1. It will not return until resume + * // signaling has been detected on the bus, or the remote wake-up function has been used. Other + * // interrupts (for instance from I/O ports or the sleep timer) can be used during this period. When + * // returning from these interrupts, the \ref usbsuspEnter() function (running here) will put the + * // MCU back into power mode 1. + * usbsuspEnter(); + * + * // At this point the event handler is up and running again. Clear the resume event. + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME); + * + * ... If a USBIRQ_EVENT_RESET event will affect the code that follows (before the event is processed + * elsewhere), then make sure to handle it here also ... + * + * ... Do what needs to be done to wake up from suspend mode (e.g. turn on the radio, reactivate I/O + * and peripherals, turn off the sleep timer ... + * } + * \endcode + * + * \li All interrupts that run during suspension mode must start with the following code: + * \code + * while (!XOSC_STABLE); + * \endcode + * + * \section usb_remote_wakeup USB Remote Wakeup: + * Remote wakeup should be used when the USB device desires to initiate the resume process and wake up + * the host. In a radio application this may happen when a particular radio packet is received, for + * instance from a wireless keyboard or mouse. + * + * USB remote wakeup can only be performed if the host has given the device the privilege to do so. The + * privilege to perform remote wakeup is requested by setting bit 5 in the \c bmAttributes field in + * the \ref USB_CONFIGURATION_DESCRIPTOR. The host will then grant or recall the privilege through a + * SET_FEATURE request, which is communicated through a \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED or + * \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED event, respectively. + * + * The USB library handles the remote wakeup sequence automatically. Do the following to incorporate it + * into the application: + * \li Implement suspend and resume as described above. + * \li In the USB descriptor, set bit 5 in bmAttributes in the configuration descriptor. + * \li While the USB MCU is in USB suspend mode, remote wakeup can be performed from interrupt context + * (e.g. the sleep timer interrupt) by calling \ref usbsuspDoRemoteWakeup(). This function will + * return TRUE if successful or FALSE if remote wakeup is not permitted (by the host). + * @{ + */ +#include "usb_firmware_library_headers.h" + +typedef void (*VFPTR)(void); + +//------------------------------------------------------------------------------------------------------- +// Suspend enter/exit hooks +extern __xdata VFPTR pFnSuspendEnterHook; +extern __xdata VFPTR pFnSuspendExitHook; + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbsuspEnter(void); +uint8 usbsuspDoRemoteWakeup(void); +void usbsuspStopPm1(void); +//------------------------------------------------------------------------------------------------------- + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.c new file mode 100644 index 0000000..2aef82f --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.c @@ -0,0 +1,319 @@ +/************************************************************************************************** + Filename: hal_acc.c + Revised: $Date: 2012-11-15 01:49:26 -0800 (Thu, 15 Nov 2012) $ + Revision: $Revision: 32193 $ + + Description: Driver for the Kionix KXTI9 Accelerometer. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ + +#include "hal_acc.h" +#include "hal_sensor.h" +#include "hal_i2c.h" +#include "hal_board_cfg.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +// Sensor I2C address +#define HAL_KXTI9_I2C_ADDRESS 0x0F + +// KXTI9 register addresses +#define ACC_REG_ADDR_XOUT_HPF_L 0x00 // R +#define ACC_REG_ADDR_XOUT_HPF_H 0x01 // R +#define ACC_REG_ADDR_YOUT_HPF_L 0x02 // R +#define ACC_REG_ADDR_YOUT_HPF_H 0x03 // R +#define ACC_REG_ADDR_ZOUT_HPF_L 0x04 // R +#define ACC_REG_ADDR_ZOUT_HPF_H 0x05 // R +#define ACC_REG_ADDR_XOUT_L 0x06 // R +#define ACC_REG_ADDR_XOUT_H 0x07 // R +#define ACC_REG_ADDR_YOUT_L 0x08 // R +#define ACC_REG_ADDR_YOUT_H 0x09 // R +#define ACC_REG_ADDR_ZOUT_L 0x0A // R +#define ACC_REG_ADDR_ZOUT_H 0x0B // R +#define ACC_REG_ADDR_DCST_RESP 0x0C // R +#define ACC_REG_ADDR_WHO_AM_I 0x0F // R +#define ACC_REG_ADDR_TILT_POS_CUR 0x10 // R +#define ACC_REG_ADDR_TILT_POS_PRE 0x11 // R + +#define ACC_REG_ADDR_INT_SRC_REG1 0x15 // R +#define ACC_REG_ADDR_INT_SRC_REG2 0x16 // R +#define ACC_REG_ADDR_STATUS_REG 0x18 // R +#define ACC_REG_ADDR_INT_REL 0x1A // R + +#define ACC_REG_ADDR_CTRL_REG1 0x1B // R/W +#define ACC_REG_ADDR_CTRL_REG2 0x1C // R/W +#define ACC_REG_ADDR_CTRL_REG3 0x1D // R/W + +#define ACC_REG_ADDR_INT_CTRL_REG1 0x1E // R/W +#define ACC_REG_ADDR_INT_CTRL_REG2 0x1F // R/W +#define ACC_REG_ADDR_INT_CTRL_REG3 0x20 // R/W +#define ACC_REG_ADDR_DATA_CTRL_REG 0x21 // R/W + +#define ACC_REG_ADDR_TILT_TIMER 0x28 // R/W +#define ACC_REG_ADDR_WUF_TIMER 0x29 // R/W +#define ACC_REG_ADDR_TDT_TIMER 0x2B // R/W +#define ACC_REG_ADDR_TDT_H_THRESH 0x2C // R/W +#define ACC_REG_ADDR_TDT_L_THRESH 0x2D // R/W +#define ACC_REG_ADDR_TDT_TAP_TIMER 0x2E // R/W +#define ACC_REG_ADDR_TDT_TOTAL_TIMER 0x2F // R/W +#define ACC_REG_ADDR_TDT_LATENCY_TIMER 0x30 // R/W +#define ACC_REG_ADDR_TDT_WINDOW_TIMER 0x31 // R/W + +#define ACC_REG_ADDR_BUF_CTRL1 0x32 // R/W +#define ACC_REG_ADDR_BUF_CTRL2 0x33 // R/W +#define ACC_REG_ADDR_BUF_STATUS_REG1 0x34 // R +#define ACC_REG_ADDR_BUF_STATUS_REG2 0x35 // R/W +#define ACC_REG_ADDR_BUF_CLEAR 0x36 // W + +#define ACC_REG_ADDR_SELF_TEST 0x3A // R/W + +#define ACC_REG_ADDR_WUF_THRESH 0x5A // R/W +#define ACC_REG_ADDR_TILT_ANGLE 0x5C // R/W +#define ACC_REG_ADDR_HYST_SET 0x5F // R/W +#define ACC_REG_ADDR_BUF_READ 0x7F // R/W + +// Select register valies +#define REG_VAL_WHO_AM_I 0x08 // (data sheet says 0x04) + +// CTRL1 BIT MASKS +#define ACC_REG_CTRL_PC 0x80 // Power control '1' On '0' Off +#define ACC_REG_CTRL_RES 0x40 // Resolution '1' High '0' Low +#define ACC_REG_CTRL_DRDYE 0x20 // Data Ready '1' On '0' Off +#define ACC_REG_CTRL_GSEL_HI 0x10 // Range '00' +/-2g '01' +/-4g +#define ACC_REG_CTRL_GSEL_LO 0x08 // '10' +/-8g '11' N/A +#define ACC_REG_CTRL_GSEL_TDTE 0x04 // Directional Tap '1' On '0' Off +#define ACC_REG_CTRL_GSEL_WUFE 0x02 // Wake Up '1' On '0' Off +#define ACC_REG_CTRL_GSEL_TPE 0x01 // Tilt Position '1' On '0' Off + +#ifdef ACC_RANGE_8G +// Range +- 8G +#define ACC_REG_CTRL_ON ( ACC_REG_CTRL_PC | ACC_REG_CTRL_GSEL_HI) +#define ACC_REG_CTRL_OFF ( ACC_REG_CTRL_GSEL_HI) +#else +// Range +- 2G +#define ACC_REG_CTRL_ON ( ACC_REG_CTRL_PC ) +#define ACC_REG_CTRL_OFF ( 0 ) +#endif + +/* ------------------------------------------------------------------------------------------------ +* Typedefs +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Macros +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalAccSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static Accelerometer_States_t accSensorState; +static uint8 accSensorConfig; +static uint8 accSensorOff; + +/************************************************************************************************** +* @fn HalAccInit +* +* @brief This function initializes the HAL Accelerometer abstraction layer. +* +* @return None. +*/ +void HalAccInit(void) +{ + accSensorState = KXTI9_OFF; + accSensorConfig = ACC_REG_CTRL_ON; + accSensorOff = ACC_REG_CTRL_OFF; +} + +/************************************************************************************************** + * @fn HalAccStatus + * + * @brief Accelerometer status + * + * @return Accelerometer status + */ +Accelerometer_States_t HalAccStatus( void ) +{ + return accSensorState; +} + +/************************************************************************************************** +* @fn HalAccTurnOn +* +* @brief Turn on the KXT19. +* +* @return none +*/ +void HalAccTurnOn(void) +{ + HalAccSelect(); + + HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG1, &accSensorConfig, sizeof(accSensorConfig)); + accSensorState = KXTI9_ON; +} + +/************************************************************************************************** +* @fn HalAccTurnOff +* +* @brief Turn off the KXT19 +* +* @return none +*/ +void HalAccTurnOff(void) +{ + HalAccSelect(); + + HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG1, &accSensorOff, sizeof(accSensorOff)); + accSensorState = KXTI9_OFF; +} + +/************************************************************************************************** +* @fn HalAccRead +* +* @brief Read data from the accelerometer - X, Y, Z - 3 bytes +* +* @return TRUE if valid data, FALSE if not +*/ +bool HalAccRead(uint8 *pBuf ) +{ + uint8 x; + uint8 y; + uint8 z; + bool success; + + // Select this sensor + HalAccSelect(); + + // Read the three registers + success = HalSensorReadReg( ACC_REG_ADDR_XOUT_H, &x, sizeof(x)); + if (success) + { + success = HalSensorReadReg( ACC_REG_ADDR_YOUT_H, &y, sizeof(y)); + if (success) + { + success = HalSensorReadReg( ACC_REG_ADDR_ZOUT_H, &z, sizeof(z)); + } + } + + if (success) + { + // Valid data + pBuf[0] = x; + pBuf[1] = y; + pBuf[2] = z; + } + + return success; +} + + +/************************************************************************************************** + * @fn HalAccTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + */ +bool HalAccTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalAccSelect(); + + // Check the DCST_RESP (pattern 0x55) + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_DCST_RESP, &val, 1)); + ST_ASSERT(val==0x55); + + // Check the DCST_RESP (pattern 0xAA) + val = 0x10; // Sets the DCST bit + ST_ASSERT(HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG3, &val, 1)); + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_DCST_RESP, &val, 1)); + ST_ASSERT(val==0xAA); + + // Check the WHO AM I register + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_WHO_AM_I, &val, 1)); + ST_ASSERT(val==REG_VAL_WHO_AM_I); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalAccSelect +* +* @brief Select the accelerometer on the I2C-bus +* +* @return +*/ +static void HalAccSelect(void) +{ + //Set up I2C that is used to communicate with SHT21 + HalI2CInit(HAL_KXTI9_I2C_ADDRESS,i2cClock_267KHZ); +} + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcAccel(int8 rawX) +{ + float v; + + //-- calculate acceleration, unit G, range -2, +2 + v = (rawX * 1.0) / (256/4); + + return v; +} +*/ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.h new file mode 100644 index 0000000..de80f25 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_acc.h @@ -0,0 +1,90 @@ +/************************************************************************************************** + Filename: hal_acc.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: This file contains the declaration to the HAL KXTI9 abstraction layer. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_ACC_H +#define HAL_ACC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + + /* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef enum +{ + KXTI9_OFF, // Accelerometer sleeping + KXTI9_ON, // Accelerometer on and configured +} Accelerometer_States_t; + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalAccInit(void); +void HalAccTurnOn(void); +void HalAccTurnOff(void); +bool HalAccRead(uint8 *pBuf); +bool HalAccTest(void); +Accelerometer_States_t HalAccStatus(void); + + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_assert.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_assert.c new file mode 100644 index 0000000..3e6097c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_assert.c @@ -0,0 +1,136 @@ +/************************************************************************************************** + Filename: hal_assert.c + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_types.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants and macros + * ------------------------------------------------------------------------------------------------ + */ +#ifdef HAL_LED_BLINK_DELAY +#undef HAL_LED_BLINK_DELAY +#endif + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x1450; i++) { }; } ) // was: 0x5800 + +/* ------------------------------------------------------------------------------------------------ + * Local Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHazardLights(void); + + +/************************************************************************************************** + * @fn halAssertHandler + * + * @brief Logic to handle an assert. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHandler(void) +{ + /* execute code that handles asserts */ +#ifdef ASSERT_RESET + HAL_SYSTEM_RESET(); +#elif !defined ASSERT_WHILE + halAssertHazardLights(); +#else + while(1); +#endif +} + +#if !defined ASSERT_WHILE +/************************************************************************************************** + * @fn halAssertHazardLights + * + * @brief Blink LEDs to indicate an error. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHazardLights(void) +{ + + /* disable all interrupts before anything else */ + HAL_DISABLE_INTERRUPTS(); + + /*------------------------------------------------------------------------------- + * Master infinite loop. + */ + for (;;) + { + HAL_LED_BLINK_DELAY(); + + /* toggle LEDS */ + HAL_TOGGLE_LED1(); + HAL_TOGGLE_LED2(); + } +} +#endif + +/* ------------------------------------------------------------------------------------------------ + * Compile Time Assertions + * ------------------------------------------------------------------------------------------------ + */ + +/* integrity check of type sizes */ +HAL_ASSERT_SIZE( int8, 1); +HAL_ASSERT_SIZE( uint8, 1); +HAL_ASSERT_SIZE( int16, 2); +HAL_ASSERT_SIZE(uint16, 2); +HAL_ASSERT_SIZE( int32, 4); +HAL_ASSERT_SIZE(uint32, 4); + + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.c new file mode 100644 index 0000000..54744c7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.c @@ -0,0 +1,354 @@ +/************************************************************************************************** + Filename: hal_bar.c + Revised: $Date: 2012-08-17 08:49:24 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31282 $ + + Description: Driver for the TDK/EPCOS T5400/C953 pressure sensor + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*************************************************************************************************/ + +/* ----------------------------------------------------------------------------------------------- +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_bar.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +// Sensor I2C address +#define HAL_C953_I2C_ADDRESS 0x77 + +// C953 data lengths +#define C953_DATA_LEN 2 +#define C953_CAL_LEN 16 + +// C953 Register Addresses +#define C953_REG_ADDR_IFACE_SETTINGS 0x87 // Read/Write +#define C953_REG_ADDR_I2C_SLAVE 0x88 // Read +#define C953_REG_ADDR_RESET 0xF0 // Read/Write +#define C953_REG_ADDR_COMMAND 0xF1 // Read/Write +#define C953_REG_ADDR_TEMP_LSB 0xF3 // Read +#define C953_REG_ADDR_TEMP_MSB 0xF4 // Read +#define C953_REG_ADDR_PRESS_LSB 0xF5 // Read +#define C953_REG_ADDR_PRESS_MSB 0xF6 // Read + +// C953 Register Addresses for calibration coefficients +#define C953_REG_CALIBRATION_1_LSB 0x8E +#define C953_REG_CALIBRATION_1_MSB 0x8F +#define C953_REG_CALIBRATION_2_LSB 0x90 +#define C953_REG_CALIBRATION_2_MSB 0x91 +#define C953_REG_CALIBRATION_3_LSB 0x92 +#define C953_REG_CALIBRATION_3_MSB 0x93 +#define C953_REG_CALIBRATION_4_LSB 0x94 +#define C953_REG_CALIBRATION_4_MSB 0x95 +#define C953_REG_CALIBRATION_5_LSB 0x96 +#define C953_REG_CALIBRATION_5_MSB 0x97 +#define C953_REG_CALIBRATION_6_LSB 0x98 +#define C953_REG_CALIBRATION_6_MSB 0x99 +#define C953_REG_CALIBRATION_7_LSB 0x9A +#define C953_REG_CALIBRATION_7_MSB 0x9B +#define C953_REG_CALIBRATION_8_LSB 0x9C +#define C953_REG_CALIBRATION_8_MSB 0x9D + +// C953 Resolution Setting Bit Masks +#define C953_LOW_RES_LOW 0x00 // 2 ms Conversion Time +#define C953_LOW_RES_STANDARD 0x08 // 8 ms Conversion Time +#define C953_LOW_RES_HIGH 0x10 // 16 ms Conversion Time +#define C953_LOW_RES_ULTRA_HIGH 0x18 // 64 ms Conversion Time + +// C953 Measurment Option Bit Masks +#define C953_PRESSURE_ONLY 0x00 // Execute Pressure Measurement Only +#define C953_TEMPERATURE_ONLY 0x02 // Execute Temperature Measurement Only + +// C953 Commands +#define C953_TEMP_READ_COMMAND ( C953_TEMPERATURE_ONLY | C953_LOW_RES_LOW | 0x01 ) +#define C953_PRESS_READ_COMMAND ( C953_PRESSURE_ONLY | C953_LOW_RES_LOW | 0x01 ) +#define C953_OFF_COMMAND 0x00 +#define C953_RESET_COMMAND 0x73 +#define C953_TEST_COMMAND 0x1E // For R/W test of register + +/* ------------------------------------------------------------------------------------------------ +* Type Definitions +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalBarSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 barData[4]; +static uint8 barCmd = C953_TEMP_READ_COMMAND; +static bool fCmdOk; + +/************************************************************************************************** + * @fn HalBarInit + * + * @brief Initalise the driver + * + * @return none + */ +void HalBarInit(void) +{ + uint8 val = C953_OFF_COMMAND; + + HalBarSelect(); + HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val)); + barCmd = C953_TEMP_READ_COMMAND; +} + + +/************************************************************************************************** + * @fn HalBarStartMeasurement + * + * @brief Start a conversion + * + * @return none + */ +void HalBarStartMeasurement(void) +{ + HalBarSelect(); + fCmdOk = HalSensorWriteReg(C953_REG_ADDR_COMMAND, &barCmd, sizeof(barCmd)); +} + + +/************************************************************************************************** + * @fn HalBarReadMeasurement + * + * @brief Get temperature and pressure data (alternate reads) + * + * @param pBuf - buffer for temperature and pressure (4 bytes) + * + * @return TRUE if valid data + */ +bool HalBarReadMeasurement(uint8 *pBuf) +{ + bool success; + uint8 dOffset = 0; + + if (!fCmdOk) + { + return FALSE; + } + + HalBarSelect(); + + if (barCmd==C953_PRESS_READ_COMMAND) + { + dOffset = 2; + } + + success = HalSensorReadReg( C953_REG_ADDR_PRESS_LSB, &barData[dOffset], C953_DATA_LEN ); + if (success) + { + pBuf[0] = barData[0]; + pBuf[1] = barData[1]; + pBuf[2] = barData[2]; + pBuf[3] = barData[3]; + + // Alternate + if (barCmd==C953_PRESS_READ_COMMAND) + { + barCmd = C953_TEMP_READ_COMMAND; + } else + { + barCmd = C953_PRESS_READ_COMMAND; + } + } + + return success; +} + + +/************************************************************************************************** + * @fn HalBarReadCalibration + * + * @brief Read calibration data + * + * @param pBuf - buffer for calibration data + * + * @return none + */ +void HalBarReadCalibration(uint8 *pBuf) +{ + HalBarSelect(); + HalSensorReadReg(C953_REG_CALIBRATION_1_LSB, pBuf, C953_CAL_LEN); +} + + +/************************************************************************************************** + * @fn HalBarTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + */ +bool HalBarTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalBarSelect(); + + // Check the I2C slave address + ST_ASSERT(HalSensorReadReg(C953_REG_ADDR_I2C_SLAVE, &val, sizeof(val))); + ST_ASSERT(val==HAL_C953_I2C_ADDRESS); + + // Check that registers can be written + val = C953_TEST_COMMAND; + ST_ASSERT(HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + ST_ASSERT(HalSensorReadReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + ST_ASSERT(val==C953_TEST_COMMAND); + + // Restore values + val = C953_OFF_COMMAND; + ST_ASSERT(HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalBarSelect + * + * @brief Select the barometer on the I2C-bus + * + * @return none + */ +static void HalBarSelect(void) +{ + //Set up I2C that is used to communicate with the sensor + HalI2CInit(HAL_C953_I2C_ADDRESS,i2cClock_267KHZ); +} + +/* Conversion algorithm for barometer temperature + * ============================================== + * Formula from application note, rev_X: + * Ta = ((c1 * Tr) / 2^24) + (c2 / 2^10) + * + * c1 - c8: calibration coefficients the can be read from the sensor + * c1 - c4: unsigned 16-bit integers + * c5 - c8: signed 16-bit integers + +double calcBarTmp(uint16 rawT) +{ + uint16 c1, c2; + + c1 = m_barCalib.c1; + c2 = m_barCalib.c2; + m_raw_temp = rawT; + + int64 temp, val; + val = ((int64)(c1 * m_raw_temp) * 100); + temp = (val >> 24); + val = ((int64)c2 * 100); + temp += (val >> 10); + + return ((double)temp) / 100; +} + + * Conversion algorithm for barometer pressure (hPa) + * ============================================== + * Formula from application note, rev_X: + * Sensitivity = (c3 + ((c4 * Tr) / 2^17) + ((c5 * Tr^2) / 2^34)) + * Offset = (c6 * 2^14) + ((c7 * Tr) / 2^3) + ((c8 * Tr^2) / 2^19) + * Pa = (Sensitivity * Pr + Offset) / 2^14 + +double TcalcBarPress(uint16 rawT) +{ + int64 s, o, pres, val; + uint16 c3, c4; + int16 c5, c6, c7, c8; + uint16 Pr; + int16 Tr; + + Pr = rawT; + Tr = m_raw_temp; + c3 = m_barCalib.c3; + c4 = m_barCalib.c4; + c5 = m_barCalib.c5; + c6 = m_barCalib.c6; + c7 = m_barCalib.c7; + c8 = m_barCalib.c8; + + // Sensitivity + s = (int64)c3; + val = (int64)c4 * Tr; + s += (val >> 17); + val = (int64)c5 * Tr * Tr; + s += (val >> 34); + + // Offset + o = (int64)c6 << 14; + val = (int64)c7 * Tr; + o += (val >> 3); + val = (int64)c8 * Tr * Tr; + o += (val >> 19); + + // Pressure (Pa) + pres = ((int64)(s * Pr) + o) >> 14; + + return (double)pres/100; +} + +#define BUILD_UINT16(loByte, hiByte) \ + ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +void storeCalibrationData(quint8 *pData) +{ + m_barCalib.c1 = BUILD_UINT16(pData[0],pData[1]); + m_barCalib.c2 = BUILD_UINT16(pData[2],pData[3]); + m_barCalib.c3 = BUILD_UINT16(pData[4],pData[5]); + m_barCalib.c4 = BUILD_UINT16(pData[6],pData[7]); + m_barCalib.c5 = BUILD_UINT16(pData[8],pData[9]); + m_barCalib.c6 = BUILD_UINT16(pData[10],pData[11]); + m_barCalib.c7 = BUILD_UINT16(pData[12],pData[13]); + m_barCalib.c8 = BUILD_UINT16(pData[14],pData[15]); +} +*/ +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.h new file mode 100644 index 0000000..17364ab --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_bar.h @@ -0,0 +1,76 @@ +/************************************************************************************************** + Filename: hal_bar.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the pressure sensor driver. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_BAR_H +#define HAL_BAR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * FUNCTIONS + */ +void HalBarInit(void); +void HalBarStartMeasurement(void); +bool HalBarReadMeasurement(uint8 *pBuf); +void HalBarReadCalibration(uint8 *pBuf); +bool HalBarTest(void); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BAR_H */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_board_cfg.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_board_cfg.h new file mode 100644 index 0000000..c8a9be0 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_board_cfg.h @@ -0,0 +1,345 @@ +/************************************************************************************************** + Filename: hal_board_cfg.h + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: Board configuration for CC2541 Sensor Tag + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +/* + * ============================================================= + * | Texas Instruments CC2541 Sensor Board | + * | --------------------------------------------------------- | + * | mcu : 8051 core | + * | clock : 32MHz | + * ============================================================= + */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" + +/* ------------------------------------------------------------------------------------------------ + * Board Indentifier + * + * Define the Board Identifier to CC2541_SB + * ------------------------------------------------------------------------------------------------ + */ + +#define CC2541_SB + +/* ------------------------------------------------------------------------------------------------ + * Clock Speed + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_CPU_CLOCK_MHZ 32 +#define EXTERNAL_CRYSTAL_OSC 0x00 +#define INTERNAL_RC_OSC 0x80 + +/* + * If not using power management, assume that the 32kHz crystal is not + * installed. Even if a 32kHz crystal is present on the board, it will + * never get used since device does not ever go to sleep. By forcing + * OSC32K_CRYSTAL_INSTALLED to FALSE, we avoid mismatches between + * libraries built with power management off, and applications in which + * power management is not used. + */ +#if ( !defined ( POWER_SAVING ) ) && ( !defined ( OSC32K_CRYSTAL_INSTALLED ) ) + #define OSC32K_CRYSTAL_INSTALLED FALSE +#endif + +/* 32 kHz clock source select in CLKCONCMD */ +#if !defined (OSC32K_CRYSTAL_INSTALLED) || (defined (OSC32K_CRYSTAL_INSTALLED) && (OSC32K_CRYSTAL_INSTALLED == TRUE)) + #define OSC_32KHZ EXTERNAL_CRYSTAL_OSC /* external 32 KHz xosc */ +#else + #define OSC_32KHZ INTERNAL_RC_OSC /* internal 32 KHz rcosc */ +#endif + +/* ------------------------------------------------------------------------------------------------ + * LED Configuration + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_NUM_LEDS 2 + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - D1 Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P1_0 +#define LED1_DDR P1DIR +#define LED1_POLARITY ACTIVE_LOW + +/* 2 - D2 Green */ +#define LED2_BV BV(4) +#define LED2_SBIT P0_4 +#define LED2_DDR P0DIR +#define LED2_POLARITY ACTIVE_LOW + +/* ------------------------------------------------------------------------------------------------ + * Sensor Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* Gyro power */ +#define GYRO_VDD_BV BV(1) +#define GYRO_VDD_SBIT P1_1 +#define GYRO_VDD_DDR P1DIR + +/* Gyro interrupt */ +#define GYRO_INT_BV BV(1) +#define GYRO_INT_SBIT P0_1 +#define GYRO_INT_DDR P0DIR + +/* IR temp data ready */ +#define IRTEMP_DRDY_BV BV(3) +#define IRTEMP_DRDY_SBIT P0_3 +#define IRTEMP_DRDY_DDR P0DIR + +/* Magnetometer interrupt */ +#define MAG_INT_BV BV(6) +#define MAG_INT_SBIT P0_6 +#define MAG_INT_DDR P0DIR + +/* DCDC control */ +#define DCDC_BV BV(7) +#define DCDC_SBIT P0_7 +#define DCDC_DDR P0DIR +#define DCDC_SEL P0SEL + +/* Accelerometer interrupt */ +#define ACC_INT_BV BV(2) +#define ACC_INT_SBIT P0_2 +#define ACC_INT_DDR P0DIR +#define ACC_INT_SEL P0SEL + +/* ------------------------------------------------------------------------------------------------ + * Push Button Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* See hal_keys.h */ + +/* ------------------------------------------------------------------------------------------------ + * OSAL NV implemented by internal flash pages. + * ------------------------------------------------------------------------------------------------ + */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_SIZE 2048 +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_FLASH_LOCK_BITS 16 +#define HAL_NV_PAGE_END 30 +#else +#define HAL_FLASH_LOCK_BITS 16 +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- Cache Prefetch control ---------- */ +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} +/* ----------- Board Initialization ---------- */ + +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Turn on cache prefetch mode */ \ + PREFETCH_ENABLE(); \ + \ + /* set direction for GPIO outputs */ \ + LED1_DDR |= LED1_BV; \ + LED2_DDR |= LED2_BV; \ + GYRO_VDD_DDR |= GYRO_VDD_BV; \ + DCDC_DDR |= DCDC_BV; /* Set P0_7 as output */ \ + GYRO_VDD_SBIT = 1; /* Gyro must be on for I2C to work */ \ + P0DIR |= BV(5); /* Unused pin as output */ \ + P2DIR |= BV(0); /* Unused pin as output */ \ + P1DIR |= 0x3C; /* UART pins as output */ \ + P0INP = 0x4E; /* Tri-state inputs */ \ +} + + +/* ----------- LED's ---------- */ + +#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) +#define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) + +#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) +#define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) + +#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) +#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) + +#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) +#define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) + +/* ------------------------------------------------------------------------------------------------ + * Driver Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC FALSE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES FALSE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA FALSE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD FALSE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + + +/******************************************************************************************************* +*/ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_flash.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.c new file mode 100644 index 0000000..d4e2c04 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.c @@ -0,0 +1,397 @@ +/************************************************************************************************** + Filename: hal_gyro.c + Revised: $Date: 2012-11-15 01:49:26 -0800 (Thu, 15 Nov 2012) $ + Revision: $Revision: 32193 $ + + Description: Driver for the InvenSense IMU-3000 3-Axis Gyroscope + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_gyro.h" +#include "hal_i2c.h" +#include "hal_sensor.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +/* Slave address */ +#define HAL_GYRO_I2C_ADDRESS 0x68 +#define HAL_GYRO_DATA_SIZE 6 + +/* GYRO register addresses */ + +#define HAL_GYRO_REG_WHOAMI 0x00 // R/W + +// Offset configuration registers +#define HAL_GYRO_REG_XOFFS_USRH 0x0C // R/W +#define HAL_GYRO_REG_XOFFS_USRL 0x0D // R/W +#define HAL_GYRO_REG_YOFFS_USRH 0x0E // R/W +#define HAL_GYRO_REG_YOFFS_USRL 0x0F // R/W +#define HAL_GYRO_REG_ZOFFS_USRH 0x10 // R/W +#define HAL_GYRO_REG_ZOFFS_USRL 0x11 // R/W + +// Configuration registers +#define HAL_GYRO_REG_FIFO_EN 0x12 // R/W +#define HAL_GYRO_REG_AUX_VDDIO 0x13 // R/W +#define HAL_GYRO_REG_AUX_SLV_ADDR 0x14 // R/W +#define HAL_GYRO_REG_SMPLRT_DIV 0x15 // R/W +#define HAL_GYRO_REG_DLPF_FS 0x16 // R/W +#define HAL_GYRO_REG_INT_CFG 0x17 // R/W +#define HAL_GYRO_REG_AUX_BURST_ADDR 0x18 // R/W +#define HAL_GYRO_REG_INT_STATUS 0x1A // R + +// Sensor data registers +#define HAL_GYRO_REG_TEMP_OUT_H 0x1B // R +#define HAL_GYRO_REG_TEMP_OUT_L 0x1C // R +#define HAL_GYRO_REG_GYRO_XOUT_H 0x1D // R +#define HAL_GYRO_REG_GYRO_XOUT_L 0x1E // R +#define HAL_GYRO_REG_GYRO_YOUT_H 0x1F // R +#define HAL_GYRO_REG_GYRO_YOUT_L 0x20 // R +#define HAL_GYRO_REG_GYRO_ZOUT_H 0x21 // R +#define HAL_GYRO_REG_GYRO_ZOUT_L 0x22 // R +#define HAL_GYRO_REG_AUX_XOUT_H 0x23 // R +#define HAL_GYRO_REG_AUX_XOUT_L 0x24 // R +#define HAL_GYRO_REG_AUX_YOUT_H 0x25 // R +#define HAL_GYRO_REG_AUX_YOUT_L 0x26 // R +#define HAL_GYRO_REG_AUX_ZOUT_H 0x27 // R +#define HAL_GYRO_REG_AUX_ZOUT_L 0x28 // R + +// FIFO registers +#define HAL_GYRO_REG_FIFO_COUNTH 0x3A // R +#define HAL_GYRO_REG_FIFO_COUNTL 0x3B // R +#define HAL_GYRO_REG_FIFO_R 0x3C // R + +// User control and Power Management registers +#define HAL_GYRO_REG_USER_CTRL 0x3D // R/W +#define HAL_GYRO_REG_PWR_MGM 0x3E // R/W + +/* GYRO Register Bit masks */ +#define HAL_GYRO_REG_FIFO_EN_TEMP_OUT 0x80 +#define HAL_GYRO_REG_FIFO_EN_GYRO_XOUT 0x40 +#define HAL_GYRO_REG_FIFO_EN_GYRO_YOUT 0x20 +#define HAL_GYRO_REG_FIFO_EN_GYRO_ZOUT 0x10 +#define HAL_GYRO_REG_FIFO_EN_AUX_XOUT 0x08 +#define HAL_GYRO_REG_FIFO_EN_AUX_YOUT 0x04 +#define HAL_GYRO_REG_FIFO_EN_AUX_ZOUT 0x02 +#define HAL_GYRO_REG_FIFO_EN_FIFO_FOOTER 0x01 + +#define HAL_GYRO_USER_CTRL_DMP_EN 0x80 +#define HAL_GYRO_USER_CTRL_FIFO_EN 0x40 +#define HAL_GYRO_USER_CTRL_AUX_IF_EN 0x20 +#define HAL_GYRO_USER_CTRL_AUX_IF_RST_EN 0x08 +#define HAL_GYRO_USER_CTRL_DMP_RST 0x04 +#define HAL_GYRO_USER_CTRL_FIFO_RST 0x02 +#define HAL_GYRO_USER_CTRL_GYRO_RST 0x01 + +#define HAL_GYRO_PWR_MGM_H_RESET 0x80 +#define HAL_GYRO_PWR_MGM_SLEEP 0x40 +#define HAL_GYRO_PWR_MGM_STBY_XG 0x20 +#define HAL_GYRO_PWR_MGM_STBY_YG 0x10 +#define HAL_GYRO_PWR_MGM_STBY_ZG 0x08 +#define HAL_GYRO_PWR_MGM_STBY_ALL 0x38 // All axes + +// Clock select +#define HAL_GYRO_PWR_MGM_CLOCK_INT_OSC 0x00 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_X 0x01 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_Y 0x02 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_Z 0x03 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_32768KHZ 0x04 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_19_2MHZ 0x05 +#define HAL_GYRO_PWR_MGM_CLOCK_STOP 0x07 + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalGyroSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 mStatus; +// Selected axes, as in HAL_GYRO_PWR_MGM register: +// Bit 0-2: 0 +// Bit 3: NOT X enabled +// Bit 4: NOT Y enabled +// Bit 5: NOT Z enabled +// Bit 6-7: 0 +static uint8 mDisabledAxes; + +/* ------------------------------------------------------------------------------------------------ +* Public functions +* ------------------------------------------------------------------------------------------------- +*/ + + +/************************************************************************************************** + * @fn HalGyroInit + * + * @brief Initialise the gyro sensor driver + * + * @return none + **************************************************************************************************/ +void HalGyroInit(void) +{ + mStatus = HAL_GYRO_STATE_STOPPED; + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + + HalGyroTurnOff(); +} + + +/************************************************************************************************** + * @fn HalGyroTurnOn + * + * @brief Turn the sensor on + * + * @return none + **************************************************************************************************/ +void HalGyroTurnOn(void) +{ + bool success; + uint8 val; + uint8 clk_select; + + HalDcDcControl(ST_GYRO,true); + + HalGyroSelect(); + + // Default to internal oscillator if no axis is enabled (should not happen) + clk_select = HAL_GYRO_PWR_MGM_CLOCK_INT_OSC; + if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_XG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_X; + } + else if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_YG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_Y; + } + else if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_ZG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_Z; + } + + // Wake up from sleep, disable standby for all gyros, select reference PLL according to selected axes + val = mDisabledAxes & (~HAL_GYRO_PWR_MGM_SLEEP | clk_select); + success = HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&val,1); + if(success) + { + mStatus = HAL_GYRO_STATE_RUNNING; + } + else + { + mStatus = HAL_GYRO_STATE_ERROR; + } +} + +/************************************************************************************************** + * @fn HalGyroTurnOff + * + * @brief Turn the sensor off + * + * @return none + **************************************************************************************************/ +void HalGyroTurnOff(void) +{ + bool success; + uint8 val; + + HalGyroSelect(); + + // Standby, 5 uA current consumption + val = HAL_GYRO_PWR_MGM_SLEEP; + success = HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&val,1); + + if(success) + { + uint8 rv; + + success = HalSensorReadReg(HAL_GYRO_REG_PWR_MGM,&rv,1); + if (success && rv == val) + { + mStatus = HAL_GYRO_STATE_STOPPED; + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + } + } + + if (!success) + { + mStatus = HAL_GYRO_STATE_ERROR; + } + + HalDcDcControl(ST_GYRO,false); +} + + +/************************************************************************************************** + * @fn HalGyroRead + * + * @brief Read gyro data + * + * @param Voltage and temperature in raw format [X_LOW, X_HIGH, Y_LOW, Y_HIGH, Z_LOW, Z_HIGH] + * + * @return TRUE if valid data + **************************************************************************************************/ +bool HalGyroRead(uint8 *pBuf) +{ + bool success; + uint8 buf[HAL_GYRO_DATA_SIZE]; + + HalGyroSelect(); + success = HalSensorReadReg(HAL_GYRO_REG_GYRO_XOUT_H,buf,HAL_GYRO_DATA_SIZE); + if (success) + { + // Result in LE + pBuf[0] = buf[1]; + pBuf[1] = buf[0]; + pBuf[2] = buf[3]; + pBuf[3] = buf[2]; + pBuf[4] = buf[5]; + pBuf[5] = buf[4]; + } + + return success; +} + + +/************************************************************************************************** + * @fn HalGyroStatus + * + * @brief Read the state of the sensor + * + * @return Gyro status + **************************************************************************************************/ +uint8 HalGyroStatus(void) +{ + return mStatus; +} + +/************************************************************************************************** + * @fn HalGyroSelectAxes + * + * @brief Select axes for gyroscope + * + * @param Bitmask representing enabled axes (1 enable, 0 disable) + * Bit 0: X axis + * Bit 1: Y axis + * Bit 2: Z axis + * Bit 3-7: reserved + * @return none + **************************************************************************************************/ +void HalGyroSelectAxes(uint8 axes) +{ + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + + if(axes & 0x01) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_XG; + } + + if(axes & 0x02) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_YG; + } + + if(axes & 0x04) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_ZG; + } + + if(HalGyroStatus() == HAL_GYRO_STATE_RUNNING) + { + HalGyroTurnOn(); + } +} + +/************************************************************************************************** + * @fn HalGyroTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalGyroTest(void) +{ + uint8 val; + + HalGyroSelect(); + + // Check the WHO AM I register + ST_ASSERT(HalSensorReadReg(HAL_GYRO_REG_WHOAMI, &val, 1)); + ST_ASSERT((val&HAL_GYRO_I2C_ADDRESS) == HAL_GYRO_I2C_ADDRESS); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalGyroSelect + * + * @brief Select the Gyro slave and set the I2C bus speed + * + * @return none + **************************************************************************************************/ +static void HalGyroSelect(void) +{ + // Select slave and set clock rate + HalI2CInit(HAL_GYRO_I2C_ADDRESS, i2cClock_533KHZ); +} + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcGyro(int16 rawX) +{ + float v; + + //-- calculate rotation, unit deg/s, range -250, +250 + v = (rawX * 1.0) / (65536 / 500); + + return v; +} +*/ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.h new file mode 100644 index 0000000..ef1ae1c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_gyro.h @@ -0,0 +1,81 @@ +/************************************************************************************************** + Filename: hal_gyro.h + Revised: $Date: 2012-08-30 01:50:22 -0700 (Thu, 30 Aug 2012) $ + Revision: $Revision: 31433 $ + + Description: Driver for the InvenSense IMU-3000 Motion processing Unit. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_GYRO_H +#define HAL_GYRO_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +/* GYRO states */ +#define HAL_GYRO_STATE_STOPPED 0x00 +#define HAL_GYRO_STATE_RUNNING 0x01 +#define HAL_GYRO_STATE_ERROR 0xFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * FUNCTIONS + */ +void HalGyroInit(void); +void HalGyroTurnOn(void); +void HalGyroTurnOff(void); +bool HalGyroRead(uint8 *irTempData); +bool HalGyroTest(void); +void HalGyroSelectAxes(uint8 axes); +uint8 HalGyroStatus(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_GYRO_H */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.c new file mode 100644 index 0000000..62aa959 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.c @@ -0,0 +1,267 @@ +/**************************************************************************************************' + Filename: hal_humi.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: Driver for the Sensirion SHT21 Humidity sensor + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_humi.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +// Sensor I2C address +#define HAL_SHT21_I2C_ADDRESS 0x40 + +#define S_REG_LEN 2 + +// Internal commands +#define SHT21_CMD_TEMP_T_H 0xE3 // command trig. temp meas. hold master +#define SHT21_CMD_HUMI_T_H 0xE5 // command trig. humidity meas. hold master +#define SHT21_CMD_TEMP_T_NH 0xF3 // command trig. temp meas. no hold master +#define SHT21_CMD_HUMI_T_NH 0xF5 // command trig. humidity meas. no hold master +#define SHT21_CMD_WRITE_U_R 0xE6 // command write user register +#define SHT21_CMD_READ_U_R 0xE7 // command read user register +#define SHT21_CMD_SOFT_RST 0xFE // command soft reset + +#define HUMIDITY 0x00 +#define TEMPERATURE 0x01 + +#define USR_REG_MASK 0x38 // Mask off reserved bits (3,4,5) +#define USR_REG_DEFAULT 0x02 // Disable OTP reload +#define USR_REG_RES_MASK 0x7E // Only change bits 0 and 7 (meas. res.) +#define USR_REG_11BITRES 0x81 // 11-bit resolution + +/* ------------------------------------------------------------------------------------------------ +* Type Definitions +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalHumiSelect(void); +static bool HalHumiReadData(uint8 *pBuf,uint8 nBytes); +static bool HalHumiWriteCmd(uint8 cmd); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 usr; // Keeps user register value + +/************************************************************************************************** +* @fn HalHumiInit +* +* @brief Initialise the humidity sensor driver +* +* @return none +**************************************************************************************************/ +void HalHumiInit(void) +{ + HalHumiSelect(); + + // Set 11 bit resolution + HalSensorReadReg(SHT21_CMD_READ_U_R,&usr,1); + usr &= USR_REG_RES_MASK; + usr |= USR_REG_11BITRES; + HalSensorWriteReg(SHT21_CMD_WRITE_U_R,&usr,1); +} + + +/************************************************************************************************** +* @fn HalHumiReadMeasurement +* +* @brief Get humidity sensor data +* +* @return none +*/ +bool HalHumiReadMeasurement(uint8 *pBuf) +{ + uint8 cmd; + uint8 buf[3]; + bool success; + + HalDcDcControl(ST_HUMID,true); + HalHumiSelect(); + + // Read temperature + CRC + cmd = SHT21_CMD_TEMP_T_H; + if (!HalHumiWriteCmd(cmd)) + { + return FALSE; + } + + success = HalHumiReadData(buf, sizeof(buf)); + if (success) + { + // Store temperature + pBuf[0] = buf[1]; + pBuf[1] = buf[0]; + + // Read humidity + CRC + cmd = SHT21_CMD_HUMI_T_H; + success = HalHumiWriteCmd(cmd); + + if (success) { + success = HalHumiReadData(buf, sizeof(buf)); + + if (success) { + // Store humidity + pBuf[2] = buf[1]; + pBuf[3] = buf[0]; + } + } + } + HalDcDcControl(ST_HUMID,false); + + return success; +} + + + +/************************************************************************************************** +* @fn HalHumiTest +* +* @brief Humidity sensor self test +* +* @return none +**************************************************************************************************/ +bool HalHumiTest(void) +{ + uint8 val; + + HalHumiSelect(); + + // Verify default value + ST_ASSERT(HalSensorReadReg(SHT21_CMD_READ_U_R,&val,1)); + ST_ASSERT(val==usr); + + return TRUE; +} + + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalHumiSelect +* +* @brief Select the humidity sensor on the I2C-bus +* +* @return +*/ +static void HalHumiSelect(void) +{ + //Set up I2C that is used to communicate with SHT21 + HalI2CInit(HAL_SHT21_I2C_ADDRESS,i2cClock_267KHZ); +} + + +/************************************************************************************************** +* @fn halHumiWriteCmd +* +* @brief Write a command to the humidity sensor +* +* @param cmd - command to write +* +* @return TRUE if the command has been transmitted successfully +**************************************************************************************************/ +static bool HalHumiWriteCmd(uint8 cmd) +{ + /* Send command */ + return HalI2CWrite(1,&cmd) == 1; +} + + +/************************************************************************************************** +* @fn HalHumiReadData +* +* @brief This function implements the I2C protocol to read from the SHT21. +* +* @param pBuf - pointer to buffer to place data +* +* @param nBytes - number of bytes to read +* +* @return TRUE if the required number of bytes are received +**************************************************************************************************/ +static bool HalHumiReadData(uint8 *pBuf, uint8 nBytes) +{ + /* Read data */ + return HalI2CRead(nBytes,pBuf ) == nBytes; +} + +/* Conversion algorithm, humidity + * +double calcHumRel(uint16 rawH) +{ + double v; + + rawH &= ~0x0003; // clear bits [1..0] (status bits) + //-- calculate relative humidity [%RH] -- + v = -6.0 + 125.0/65536 * (double)rawH; // RH= -6 + 125 * SRH/2^16 + + return v; +} + + * Conversion algorithm, temperature + * +double calcHumTmp(uint16 rawT) +{ + double v; + + //-- calculate temperature [°C] -- + v = -46.85 + 175.72/65536 *(double)(qint16)rawT; + + return v; +} + */ + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.h new file mode 100644 index 0000000..f04c631 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_humi.h @@ -0,0 +1,68 @@ +/************************************************************************************************** + Filename: hal_humi.h + Revised: $Date: 2012-08-17 08:49:24 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31282 $ + + Description: Interface to the humidity sensor driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_HUMI_H +#define HAL_HUMI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * FUNCTIONS + */ +void HalHumiInit(void); +bool HalHumiReadMeasurement(uint8 *pBuf); +bool HalHumiTest(void); + +/*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_HUMI_H */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.c new file mode 100644 index 0000000..cbda0bf --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.c @@ -0,0 +1,315 @@ +/************************************************************************************************** + Filename: hal_i2c.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This module defines the HAL I2C API for the CC2541ST. It + implements the I2C master. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_board_cfg.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define I2C_ENS1 BV(6) +#define I2C_STA BV(5) +#define I2C_STO BV(4) +#define I2C_SI BV(3) +#define I2C_AA BV(2) +#define I2C_MST_RD_BIT BV(0) // Master RD/WRn bit to be OR'ed with Slave address. + +#define I2C_CLOCK_MASK 0x83 + +#define I2C_PXIFG P2IFG +#define I2C_IF P2IF +#define I2C_IE BV(1) + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef enum +{ + // HAL_I2C_MASTER mode statuses. + mstStarted = 0x08, + mstRepStart = 0x10, + mstAddrAckW = 0x18, + mstAddrNackW = 0x20, + mstDataAckW = 0x28, + mstDataNackW = 0x30, + mstLostArb = 0x38, + mstAddrAckR = 0x40, + mstAddrNackR = 0x48, + mstDataAckR = 0x50, + mstDataNackR = 0x58, +} i2cStatus_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define I2C_WRAPPER_DISABLE() st( I2CWC = 0x00; ) +#define I2C_CLOCK_RATE(x) st( I2CCFG &= ~I2C_CLOCK_MASK; \ + I2CCFG |= x; ) +#define I2C_SET_NACK() st( I2CCFG &= ~I2C_AA; ) +#define I2C_SET_ACK() st( I2CCFG |= I2C_AA; ) + +// Enable I2C bus +#define I2C_ENABLE() st( I2CCFG |= (I2C_ENS1); ) +#define I2C_DISABLE() st( I2CCFG &= ~(I2C_ENS1); ) + +// Must clear SI before setting STA and then STA must be manually cleared. +#define I2C_STRT() st ( \ + I2CCFG &= ~I2C_SI; \ + I2CCFG |= I2C_STA; \ + while ((I2CCFG & I2C_SI) == 0); \ + I2CCFG &= ~I2C_STA; \ +) + +// Must set STO before clearing SI. +#define I2C_STOP() st ( \ + I2CCFG |= I2C_STO; \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_STO) != 0); \ +) + +// Stop clock-stretching and then read when it arrives. +#define I2C_READ(_X_) st ( \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ + (_X_) = I2CDATA; \ +) + +// First write new data and then stop clock-stretching. +#define I2C_WRITE(_X_) st ( \ + I2CDATA = (_X_); \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ +) + + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ +static uint8 i2cAddr; // Target Slave address pre-shifted up by one leaving RD/WRn LSB as zero. + +/************************************************************************************************** + * @fn i2cMstStrt + * + * @brief Attempt to send an I2C bus START and Slave Address as an I2C bus Master. + * + * input parameters + * + * @param RD_WRn - The LSB of the Slave Address as Read/~Write. + * + * @return The I2C status of the START request or of the Slave Address Ack. + */ +static uint8 i2cMstStrt(uint8 RD_WRn) +{ + I2C_STRT(); + + if (I2CSTAT == mstStarted) /* A start condition has been transmitted */ + { + I2C_WRITE(i2cAddr | RD_WRn); + } + + return I2CSTAT; +} + +/************************************************************************************************** + * @fn HalI2CInit + * + * @brief Initialize the I2C bus as a Master. + * + * input parameters + * + * @param address - I2C slave address. + * @param clockRate - I2C clock rate. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CInit(uint8 address, i2cClock_t clockRate) +{ + i2cAddr = address << 1; + + I2C_WRAPPER_DISABLE(); + I2CADDR = 0; // no multi master support at this time + I2C_CLOCK_RATE(clockRate); + I2C_ENABLE(); +} + +/************************************************************************************************** + * @fn HalI2CRead + * + * @brief Read from the I2C bus as a Master. + * + * input parameters + * + * @param len - Number of bytes to read. + * @param pBuf - Pointer to the data buffer to put read bytes. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully read. + */ +uint8 HalI2CRead(uint8 len, uint8 *pBuf) +{ + uint8 cnt = 0; + + if (i2cMstStrt(I2C_MST_RD_BIT) != mstAddrAckR) + { + len = 0; + } + + // All bytes are ACK'd except for the last one which is NACK'd. If only + // 1 byte is being read, a single NACK will be sent. Thus, we only want + // to enable ACK if more than 1 byte is going to be read. + if (len > 1) + { + I2C_SET_ACK(); + } + + while (len > 0) + { + // slave devices require NACK to be sent after reading last byte + if (len == 1) + { + I2C_SET_NACK(); + } + + // read a byte from the I2C interface + I2C_READ(*pBuf++); + cnt++; + len--; + + if (I2CSTAT != mstDataAckR) + { + if (I2CSTAT != mstDataNackR) + { + // something went wrong, so don't count last byte + cnt--; + } + break; + } + } + I2C_STOP(); + + return cnt; +} + +/************************************************************************************************** + * @fn HalI2CWrite + * + * @brief Write to the I2C bus as a Master. + * + * input parameters + * + * @param len - Number of bytes to write. + * @param pBuf - Pointer to the data buffer to write. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully written. + */ +uint8 HalI2CWrite(uint8 len, uint8 *pBuf) +{ + if (i2cMstStrt(0) != mstAddrAckW) + { + len = 0; + } + + for (uint8 cnt = 0; cnt < len; cnt++) + { + I2C_WRITE(*pBuf++); + + if (I2CSTAT != mstDataAckW) + { + if (I2CSTAT == mstDataNackW) + { + len = cnt + 1; + } + else + { + len = cnt; + } + break; + } + } + + I2C_STOP(); + + return len; +} + +/************************************************************************************************** + * @fn HalI2CDisable + * + * @brief Places the I2C bus in inactive mode + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CDisable(void) +{ + I2C_DISABLE(); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.h new file mode 100644 index 0000000..8f897ac --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_i2c.h @@ -0,0 +1,81 @@ +/************************************************************************************************** + Filename: hal_i2c.h + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: HAL I2C API for the CC2541ST. It implements the I2C master only. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_I2C_H +#define HAL_I2C_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_I2C_SLAVE_ADDR_DEF 0x41 + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef enum +{ + i2cClock_123KHZ = 0x00, + i2cClock_144KHZ = 0x01, + i2cClock_165KHZ = 0x02, + i2cClock_197KHZ = 0x03, + i2cClock_33KHZ = 0x80, + i2cClock_267KHZ = 0x81, + i2cClock_533KHZ = 0x82 +} i2cClock_t; + + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalI2CInit(uint8 address, i2cClock_t clockRate); +uint8 HalI2CRead(uint8 len, uint8 *pBuf); +uint8 HalI2CWrite(uint8 len, uint8 *pBuf); +void HalI2CDisable(void); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_interrupt.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_interrupt.c new file mode 100644 index 0000000..2d553ea --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_interrupt.c @@ -0,0 +1,113 @@ +/************************************************************************************************** + Filename: hal_interrupt.c + Revised: $Date: 2012-08-10 19:21:08 -0700 (Fri, 10 Aug 2012) $ + Revision: $Revision: 31192 $ + + Description: Interrupt services routines for sensors + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_keys.h" +#include "hal_acc.h" +#include "hal_mag.h" +#include "hal_i2c.h" +/*************************************************************************************************** +* INTERRUPT SERVICE ROUTINE +***************************************************************************************************/ + +HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) +{ + + HAL_ENTER_ISR(); + if (HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_0 + PxIFG has to be cleared before PxIF + */ + P0IFG = 0; + P0IF = 0; + HAL_EXIT_ISR(); +} + + +/************************************************************************************************** +* @fn halKeyPort1Isr +* +* @brief Port1 ISR +**************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR ) +{ + HAL_ENTER_ISR(); + if ((HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) || (HAL_KEY_SW_3_PXIFG & HAL_KEY_SW_3_BIT)) + { + halProcessKeyInterrupt(); + } + /* + Clear the CPU interrupt flag for Port_1 + PxIFG has to be cleared before PxIF + */ + HAL_KEY_SW_2_PXIFG = 0; + HAL_KEY_SW_3_PXIFG = 0; + P1IF = 0; + HAL_EXIT_ISR(); +} + + +/************************************************************************************************** +* @fn halKeyPort2Isr +* +* @brief Port2 ISR +**************************************************************************************************/ + +HAL_ISR_FUNCTION( halI2CIsr, I2C_VECTOR ) +{ + HAL_ENTER_ISR(); + + /* + Clear the CPU interrupt flag for Port_2 + PxIFG has to be cleared before PxIF + Notes: P2_1 and P2_2 are debug lines. + */ + P2IFG = 0; + P2IF = 0; + + HAL_EXIT_ISR(); +} diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.c new file mode 100644 index 0000000..19e2a8a --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.c @@ -0,0 +1,309 @@ +/************************************************************************************************** + Filename: hal_irtemp.c + Revised: $Date: 2012-09-25 06:25:32 -0700 (Tue, 25 Sep 2012) $ + Revision: $Revision: 31616 $ + + Description: Driver for the TI TMP06 infrared thermophile sensor. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_irtemp.h" +#include "hal_i2c.h" +#include "hal_sensor.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +/* Slave address */ +#define TMP006_I2C_ADDRESS 0x44 + +/* TMP006 register addresses */ +#define TMP006_REG_ADDR_VOLTAGE 0x00 +#define TMP006_REG_ADDR_TEMPERATURE 0x01 +#define TMP006_REG_ADDR_CONFIG 0x02 +#define TMP006_REG_MANF_ID 0xFE +#define TMP006_REG_PROD_ID 0xFE + +/* TMP006 register values */ +#define TMP006_VAL_CONFIG_ON 0x7400 // Sensor on state +#define TMP006_VAL_CONFIG_OFF 0x0000 // Sensor off state +#define TMP006_VAL_MANF_ID 0x5449 +#define TMP006_VAL_PROD_ID 0x0067 + +/* Register length */ +#define IRTEMP_REG_LEN 2 + + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalIRTempSelect(void); + + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static IRTemperature_States_t irtSensorState = TMP006_OFF; + +static uint8 configSensorReset[2] = {0x80, 0x00}; // Sensor reset +static uint8 configSensorOff[2] = {0x00, 0x80}; // Sensor standby +static uint8 configSensorOn[2] = {0x74, 0x00}; // One coversion a second (4 average), continuous mode + +/* ------------------------------------------------------------------------------------------------ +* Public functions +* ------------------------------------------------------------------------------------------------- +*/ + + +/************************************************************************************************** + * @fn HALIRTempInit + * + * @brief Initialise the temperature sensor driver + * + * @return none + **************************************************************************************************/ +void HALIRTempInit(void) +{ + irtSensorState = TMP006_OFF; +} + + +/************************************************************************************************** + * @fn HalIRTempTurnOn + * + * @brief Turn the sensor on + * + * @return none + **************************************************************************************************/ +void HalIRTempTurnOn(void) +{ + HalDcDcControl(ST_IRTEMP,true); + HalIRTempSelect(); + + if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN)) + { + irtSensorState = TMP006_DATA_READY; + } +} + +/************************************************************************************************** + * @fn HalIRTempTurnOff + * + * @brief Turn the sensor off + * @return none + **************************************************************************************************/ +void HalIRTempTurnOff(void) +{ + HalIRTempSelect(); + + if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN)) + { + irtSensorState = TMP006_OFF; + } + HalDcDcControl(ST_IRTEMP,false); +} + +/************************************************************************************************** + * @fn HalIRTempRead + * + * @brief Read the sensor voltage and sensor temperature registers + * + * @param Voltage and temperature in raw format (2 + 2 bytes) + * + * @return TRUE if valid data + **************************************************************************************************/ +bool HalIRTempRead(uint8 *pBuf) +{ + uint16 voltage; + uint16 temperature; + bool success; + + if (irtSensorState!=TMP006_DATA_READY) + { + return FALSE; + } + + HalIRTempSelect(); + + // Read the sensor registers + success = HalSensorReadReg(TMP006_REG_ADDR_VOLTAGE, (uint8 *)&voltage,IRTEMP_REG_LEN ); + if (success) + { + success = HalSensorReadReg(TMP006_REG_ADDR_TEMPERATURE, (uint8 *)&temperature,IRTEMP_REG_LEN ); + } + + if (success) + { + // Store values + pBuf[0] = HI_UINT16( voltage ); + pBuf[1] = LO_UINT16( voltage ); + pBuf[2] = HI_UINT16( temperature ); + pBuf[3] = LO_UINT16( temperature ); + } + + return success; +} + + +/************************************************************************************************** + * @fn HalIRTempStatus + * + * @brief Read the state of the sensor + * + * @return none + **************************************************************************************************/ +IRTemperature_States_t HalIRTempStatus(void) +{ + return irtSensorState; +} + + +/************************************************************************************************** + * @fn HalIRTempTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalIRTempTest(void) +{ + uint16 val; + + // Select this sensor on the I2C bus + HalIRTempSelect(); + + // Check manufacturer ID + ST_ASSERT(HalSensorReadReg(TMP006_REG_MANF_ID, (uint8 *)&val, IRTEMP_REG_LEN)); + val = (LO_UINT16(val) << 8) | HI_UINT16(val); + ST_ASSERT(val == TMP006_VAL_MANF_ID); + + // Reset sensor + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorReset, IRTEMP_REG_LEN)); + + // Check config register (reset) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_ON); + + // Turn sensor off + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff,IRTEMP_REG_LEN)); + + // Check config register (off) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_OFF); + + // Turn sensor on + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN)); + + // Check config register (on) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_ON); + + // Turn sensor off + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN)); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalIRTempSelect + * + * @brief Select the TMP006 slave and set the I2C bus speed + * + * @return none + **************************************************************************************************/ +static void HalIRTempSelect(void) +{ + // Select slave and set clock rate + HalI2CInit(TMP006_I2C_ADDRESS, i2cClock_533KHZ); +} + +/* Conversion algorithm for die temperature + * ================================================ + * +double calcTmpLocal(uint16 rawT) +{ + //-- calculate die temperature [°C] -- + m_tmpAmb = (double)((qint16)rawT)/128.0; + + return m_tmpAmb; +} + +* +* Conversion algorithm for target temperature +* +double calcTmpTarget(uint16 rawT) +{ + //-- calculate target temperature [°C] - + double Vobj2 = (double)(qint16)rawT; + Vobj2 *= 0.00000015625; + + double Tdie2 = m_tmpAmb + 273.15; + const double S0 = 6.4E-14; // Calibration factor + + const double a1 = 1.75E-3; + const double a2 = -1.678E-5; + const double b0 = -2.94E-5; + const double b1 = -5.7E-7; + const double b2 = 4.63E-9; + const double c2 = 13.4; + const double Tref = 298.15; + double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2)); + double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2); + double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2); + double tObj = pow(pow(Tdie2,4) + (fObj/S),.25); + tObj = (tObj - 273.15); + + return tObj; +} + +*/ + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.h new file mode 100644 index 0000000..c9547b6 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_irtemp.h @@ -0,0 +1,83 @@ +/************************************************************************************************** + Filename: hal_irtemp.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the IR temperature sensor driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_IRTEMP_H +#define HAL_IRTEMP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ +typedef enum +{ + TMP006_OFF, // IR Temperature Sleeping + TMP006_IDLE, // IR Temperature On and Configured + TMP006_DATA_READY // IR Temperature On, Configured and Data is Ready +} IRTemperature_States_t; + + +/********************************************************************* + * FUNCTIONS + */ +void HALIRTempInit(void); +void HalIRTempTurnOn(void); +void HalIRTempTurnOff(void); +bool HalIRTempRead(uint8 *irTempData); +bool HalIRTempTest(void); +IRTemperature_States_t HalIRTempStatus(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_IRTEMP_H */ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.c new file mode 100644 index 0000000..d477aaf --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.c @@ -0,0 +1,400 @@ +/************************************************************************************************** + Filename: hal_keys.c + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: This file contains the interface to the HAL KEY Service. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* +NOTE: If polling is used, the hal_driver task schedules the KeyRead() +to occur every 100ms. This should be long enough to naturally +debounce the keys. The KeyRead() function remembers the key +state of the previous poll and will only return a non-zero +value if the key state changes. + +NOTE: If interrupts are used, the KeyRead() function is scheduled +25ms after the interrupt occurs by the ISR. This delay is used +for key debouncing. The ISR disables any further Key interrupt +until KeyRead() is executed. KeyRead() will re-enable Key +interrupts after executing. Unlike polling, when interrupts +are enabled, the previous key state is not remembered. This +means that KeyRead() will return the current state of the keys +(not a change in state of the keys). + +NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by +the ISR. Therefore, the joystick movements will only be detected +during a pushbutton interrupt caused by S1 or the center joystick +pushbutton. + +NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally +high state to a low state. This transition is typically clean. The +duration of the low state is around 200ms. When the signal returns +to the high state, there is a high likelihood of signal bounce, which +causes a unwanted interrupts. Normally, we would set the interrupt +edge to falling edge to generate an interrupt when S1 is pushed, but +because of the signal bounce, it is better to set the edge to rising +edge to generate an interrupt when S1 is released. The debounce logic +can then filter out the signal bounce. The result is that we typically +get only 1 interrupt per button push. This mechanism is not totally +foolproof because occasionally, signal bound occurs during the falling +edge as well. A similar mechanism is used to handle the joystick +pushbutton on the DB. For the EB, we do not have independent control +of the interrupt edge for the S1 and center joystick pushbutton. As +a result, only one or the other pushbuttons work reasonably well with +interrupts. The default is the make the S1 switch on the EB work more +reliably. + +*********************************************************************/ + +/************************************************************************************************** +* INCLUDES +**************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_keys.h" +#include "osal.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/************************************************************************************************** +* MACROS +**************************************************************************************************/ + +/************************************************************************************************** +* CONSTANTS +**************************************************************************************************/ + + + + + + +/************************************************************************************************** +* TYPEDEFS +**************************************************************************************************/ + + +/************************************************************************************************** +* GLOBAL VARIABLES +**************************************************************************************************/ +static uint8 halKeySavedKeys; /* used to store previous key state in polling mode */ +static halKeyCBack_t pHalKeyProcessFunction; +static uint8 HalKeyConfigured; +bool Hal_KeyIntEnable; /* interrupt enable/disable flag */ + +/************************************************************************************************** +* FUNCTIONS - Local +**************************************************************************************************/ + + + +/************************************************************************************************** +* FUNCTIONS - API +**************************************************************************************************/ + + +/************************************************************************************************** +* @fn HalKeyInit +* +* @brief Initilize Key Service +* +* @param none +* +* @return None +**************************************************************************************************/ +void HalKeyInit( void ) +{ + /* Initialize previous key to 0 */ + halKeySavedKeys = 0; + + HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */ + + HAL_KEY_SW_2_SEL &= ~(HAL_KEY_SW_2_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_2_DIR &= ~(HAL_KEY_SW_2_BIT); /* Set pin direction to Input */ + + HAL_KEY_SW_3_SEL &= ~(HAL_KEY_SW_3_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_3_DIR &= ~(HAL_KEY_SW_3_BIT); /* Set pin direction to Input */ + + + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + /* Start with key is not configured */ + HalKeyConfigured = FALSE; +} + + +/************************************************************************************************** +* @fn HalKeyConfig +* +* @brief Configure the Key serivce +* +* @param interruptEnable - TRUE/FALSE, enable/disable interrupt +* cback - pointer to the CallBack function +* +* @return None +**************************************************************************************************/ +void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) +{ + /* Enable/Disable Interrupt or */ + Hal_KeyIntEnable = interruptEnable; + + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + + /* Determine if interrupt is enable or not */ + if (Hal_KeyIntEnable) + { + /* Rising/Falling edge configuratinn */ + PICTL |= (HAL_KEY_SW_1_EDGEBIT | HAL_KEY_SW_2_3_EDGEBIT); /* Set the edge bit to set falling edge to give int */ + + HAL_KEY_SW_1_ICTL |= HAL_KEY_SW_1_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_1_IEN |= HAL_KEY_SW_1_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear any pending interrupt */ + + HAL_KEY_SW_2_ICTL |= HAL_KEY_SW_2_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_2_IEN |= HAL_KEY_SW_2_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear any pending interrupt */ + + HAL_KEY_SW_3_ICTL |= HAL_KEY_SW_3_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_3_IEN |= HAL_KEY_SW_3_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_3_PXIFG = (uint8)(~(HAL_KEY_SW_3_BIT)); /* Clear any pending interrupt */ + + /* Do this only after the hal_key is configured - to work with sleep stuff */ + if (HalKeyConfigured == TRUE) + { + osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */ + } + } + else /* Interrupts NOT enabled */ + { + HAL_KEY_SW_1_ICTL &= ~(HAL_KEY_SW_1_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_1_IEN &= ~(HAL_KEY_SW_1_IENBIT); /* Clear interrupt enable bit */ + + HAL_KEY_SW_2_ICTL &= ~(HAL_KEY_SW_2_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_2_IEN &= ~(HAL_KEY_SW_2_IENBIT); /* Clear interrupt enable bit */ + + HAL_KEY_SW_3_ICTL &= ~(HAL_KEY_SW_3_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_3_IEN &= ~(HAL_KEY_SW_3_IENBIT); /* Clear interrupt enable bit */ + + osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + /* Key now is configured */ + HalKeyConfigured = TRUE; +} + + +/************************************************************************************************** +* @fn HalKeyRead +* +* @brief Read the current value of a key +* +* @param None +* +* @return keys - current keys status +**************************************************************************************************/ +uint8 HalKeyRead ( void ) +{ + uint8 keys = 0; + + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } + if (!(HAL_KEY_SW_3_PORT & HAL_KEY_SW_3_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_3; + } + + return keys; +} + + +/************************************************************************************************** +* @fn HalKeyPoll +* +* @brief Called by hal_driver to poll the keys +* +* @param None +* +* @return None +**************************************************************************************************/ +void HalKeyPoll (void) +{ + uint8 keys = 0; + uint8 notify = 0; + + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } + if (!(HAL_KEY_SW_3_PORT & HAL_KEY_SW_3_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_3; + } + + (void) keys; + + /* If interrupts are not enabled, previous key status and current key status + * are compared to find out if a key has changed status. + */ + if (!Hal_KeyIntEnable) + { + if (keys == halKeySavedKeys) + { + /* Exit - since no keys have changed */ + return; + } + else + { + notify = 1; + } + } + else + { + /* Key interrupt handled here */ + if (keys) + { + notify = 1; + } + } + + /* Store the current keys for comparation next time */ + halKeySavedKeys = keys; + + /* Invoke Callback if new keys were depressed */ + if (notify && (pHalKeyProcessFunction)) + { + (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); + + } +} + +/************************************************************************************************** +* @fn halProcessKeyInterrupt +* +* @brief Checks to see if it's a valid key interrupt, saves interrupt driven key states for +* processing by HalKeyRead(), and debounces keys by scheduling HalKeyRead() 25ms later. +* +* @param +* +* @return +**************************************************************************************************/ +void halProcessKeyInterrupt (void) +{ + bool valid=FALSE; + + if( HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) /* Interrupt Flag has been set by SW1 */ + { + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) /* Interrupt Flag has been set by SW2 */ + { + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + if (HAL_KEY_SW_3_PXIFG & HAL_KEY_SW_3_BIT) /* Interrupt Flag has been set by SW3 */ + { + HAL_KEY_SW_3_PXIFG = (uint8)(~(HAL_KEY_SW_3_BIT)); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (valid) + { + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); + } +} + +/************************************************************************************************** +* @fn HalKeyEnterSleep +* +* @brief - Get called to enter sleep mode +* +* @param +* +* @return +**************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** +* @fn HalKeyExitSleep +* +* @brief - Get called when sleep is over +* +* @param +* +* @return - return saved keys +**************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +#else + + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif /* HAL_KEY */ + + + + + +/************************************************************************************************** +**************************************************************************************************/ + + + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.h new file mode 100644 index 0000000..83336a4 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_keys.h @@ -0,0 +1,179 @@ +/************************************************************************************************** + Filename: hal_keys.h + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_KEYS_H +#define HAL_KEYS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ +#define HAL_KEY_INTERRUPT_DISABLE 0x00 +#define HAL_KEY_INTERRUPT_ENABLE 0x01 + +/* Key state - shift or nornal */ +#define HAL_KEY_STATE_NORMAL 0x00 +#define HAL_KEY_STATE_SHIFT 0x01 + +/* Switches (keys) */ +#define HAL_KEY_SW_1 0x01 // S1 Side Button +#define HAL_KEY_SW_2 0x02 // S2 Carbon button +#define HAL_KEY_SW_3 0x04 // S3 Carbon button + +#define HAL_KEY_DEBOUNCE_VALUE 25 + +/* CPU port interrupt */ +#define HAL_KEY_CPU_PORT_0_IF P0IF +#define HAL_KEY_CPU_PORT_2_IF P2IF + +/* S1 is at P0.0 */ +#define HAL_KEY_SW_1_PORT P0 +#define HAL_KEY_SW_1_BIT BV(0) +#define HAL_KEY_SW_1_SEL P0SEL +#define HAL_KEY_SW_1_DIR P0DIR + +/* S2 is at P1.6 */ +#define HAL_KEY_SW_2_PORT P1 +#define HAL_KEY_SW_2_BIT BV(6) +#define HAL_KEY_SW_2_SEL P1SEL +#define HAL_KEY_SW_2_DIR P1DIR + +/* S3 is at P1.7 */ +#define HAL_KEY_SW_3_PORT P1 +#define HAL_KEY_SW_3_BIT BV(7) +#define HAL_KEY_SW_3_SEL P1SEL +#define HAL_KEY_SW_3_DIR P1DIR + + +#define HAL_KEY_SW_1_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_1_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_1_ICTLBIT BV(0) /* P0IEN - P0.0 enable/disable bit */ +#define HAL_KEY_SW_1_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_1_PXIFG P0IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_2_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_SW_2_ICTL P1IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_2_ICTLBIT BV(6) /* P0IEN - P1.6 enable/disable bit */ +#define HAL_KEY_SW_2_IENBIT BV(4) /* Mask bit for all of Port_1 */ +#define HAL_KEY_SW_2_PXIFG P1IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_3_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_SW_3_ICTL P1IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_3_ICTLBIT BV(7) /* P0IEN - P1.7 enable/disable bit */ +#define HAL_KEY_SW_3_IENBIT BV(4) /* Mask bit for all of Port_1 */ +#define HAL_KEY_SW_3_PXIFG P1IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_1_EDGEBIT BV(0) +#define HAL_KEY_SW_2_3_EDGEBIT BV(2) + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +void halProcessKeyInterrupt(void); + + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_led.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_led.c new file mode 100644 index 0000000..85aa3d0 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_led.c @@ -0,0 +1,493 @@ +/************************************************************************************************** + Filename: hal_led.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This file contains the interface to the HAL LED Service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_led.h" +#include "osal.h" +#include "hal_board.h" + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +/* LED control structure */ +typedef struct { + uint8 mode; /* Operation mode */ + uint8 todo; /* Blink cycles left */ + uint8 onPct; /* On cycle percentage */ + uint16 time; /* On/off cycle time (msec) */ + uint32 next; /* Time for next change */ +} HalLedControl_t; + +typedef struct +{ + HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS]; + uint8 sleepActive; +} HalLedStatus_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +static uint8 HalLedState; // LED state at last set/clr/blink update + +#if HAL_LED == TRUE +static uint8 HalSleepLedState; // LED state at last set/clr/blink update +static uint8 preBlinkState; // Original State before going to blink mode + // bit 0, 1, 2, 3 represent led 0, 1, 2, 3 +#endif + +#ifdef BLINK_LEDS + static HalLedStatus_t HalLedStatusControl; +#endif + +/*************************************************************************************************** + * LOCAL FUNCTION + ***************************************************************************************************/ +#if (HAL_LED == TRUE) +void HalLedUpdate (void); +void HalLedOnOff (uint8 leds, uint8 mode); +#endif /* HAL_LED */ + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/*************************************************************************************************** + * @fn HalLedInit + * + * @brief Initialize LED Service + * + * @param init - pointer to void that contains the initialized value + * + * @return None + ***************************************************************************************************/ +void HalLedInit (void) +{ +#if (HAL_LED == TRUE) + /* Initialize all LEDs to OFF */ + HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ +#ifdef BLINK_LEDS + /* Initialize sleepActive to FALSE */ + HalLedStatusControl.sleepActive = FALSE; +#endif +} + +/*************************************************************************************************** + * @fn HalLedSet + * + * @brief Tun ON/OFF/TOGGLE given LEDs + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * mode - BLINK, FLASH, TOGGLE, ON, OFF + * @return None + ***************************************************************************************************/ +uint8 HalLedSet (uint8 leds, uint8 mode) +{ + +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + switch (mode) + { + case HAL_LED_MODE_BLINK: + /* Default blink, 1 time, D% duty cycle */ + HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + + case HAL_LED_MODE_FLASH: + /* Default flash, N times, D% duty cycle */ + HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + + case HAL_LED_MODE_ON: + case HAL_LED_MODE_OFF: + case HAL_LED_MODE_TOGGLE: + + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + if (mode != HAL_LED_MODE_TOGGLE) + { + sts->mode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); + +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->todo = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if (!(sts->mode & HAL_LED_MODE_FLASH)) + { + sts->todo--; /* Not continuous, reduce count */ + if (!sts->todo) + { + sts->mode ^= HAL_LED_MODE_BLINK; /* No more blinks */ + } + } + } + else + { + pct = sts->onPct; /* Percentage of cycle for on */ + sts->mode |= HAL_LED_MODE_ON; /* Say it's on */ + HalLedOnOff (led, HAL_LED_MODE_ON); /* Turn it on */ + } + + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); + +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.c new file mode 100644 index 0000000..a552791 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.c @@ -0,0 +1,299 @@ +/************************************************************************************************** + Filename: hal_mag.c + Revised: $Date: 2012-11-15 01:49:26 -0800 (Thu, 15 Nov 2012) $ + Revision: $Revision: 32193 $ + + Description: Driver for the Freescale MAG3110 Magnetometer + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_mag.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +#define MAG_REG_READ_ALL_LEN 6 +#define MAG_REG_FAST_READ_LEN 3 + +// MAG3110 register addresses +#define MAG_REG_ADDR_DR_STATUS 0x00 // Read +#define MAG_REG_ADDR_X_MSB 0x01 // Read +#define MAG_REG_ADDR_X_LSB 0x02 // Read +#define MAG_REG_ADDR_Y_MSB 0x03 // Read +#define MAG_REG_ADDR_Y_LSB 0x04 // Read +#define MAG_REG_ADDR_Z_MSB 0x05 // Read +#define MAG_REG_ADDR_Z_LSB 0x06 // Read +#define MAG_REG_ADDR_WHO_AM_I 0x07 // Read +#define MAG_REG_ADDR_SYSMOD 0x08 // Read +#define MAG_REG_ADDR_OFF_X_MSB 0x09 // Read/Write +#define MAG_REG_ADDR_OFF_X_LSB 0x0A // Read/Write +#define MAG_REG_ADDR_OFF_Y_MSB 0x0B // Read/Write +#define MAG_REG_ADDR_OFF_Y_LSB 0x0C // Read/Write +#define MAG_REG_ADDR_OFF_Z_MSB 0x0D // Read/Write +#define MAG_REG_ADDR_OFF_Z_LSB 0x0E // Read/Write +#define MAG_REG_ADDR_DIE_TEMP 0x0F // Read +#define MAG_REG_ADDR_CTRL_1 0x10 // Read/Write +#define MAG_REG_ADDR_CTRL_2 0x11 // Read/Write + +#define MAG_REG_ADDR_READ_START MAG_REG_ADDR_X_MSB + +// CTRL1 BIT MASKS +#define MAG_REG_CTRL_FR 0x04 // Fast Read Enable +#define MAG_REG_CTRL_TM 0x02 // Trigger Measurement Enable +#define MAG_REG_CTRL_EN 0x01 // Active Mode Enable + +#define MAG_REG_CTRL_DR_10HZ_OSR_1 0x60 +#define MAG_REG_CTRL_DR_10HZ_OSR_2 0x48 +#define MAG_REG_CTRL_DR_10HZ_OSR_4 0x30 +#define MAG_REG_CTRL_DR_10HZ_OSR_8 0x10 + +// Test values +#define WHO_AM_I_VALUE 0xC4 +#define CTRL1_TEST_VALUE 0xF8 + +// Control register values +#define MAG_REG_CTRL_ON MAG_REG_CTRL_DR_10HZ_OSR_1 | MAG_REG_CTRL_EN +#define MAG_REG_CTRL2_AMN 0x80 +#define MAG_REG_CTRL_OFF 0x00 + +/* ------------------------------------------------------------------------------------------------ +* Typedefs +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Macros +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalMagSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static Magnetometer_States_t sensorState = MAG3110_OFF; +static uint8 halMagSensorConfig = MAG_REG_CTRL_ON; +static uint8 halMagSensorOff = MAG_REG_CTRL_OFF; +static uint8 halMagAutoMrstEn = MAG_REG_CTRL2_AMN; + + +/************************************************************************************************** + * @fn HalMagInit + * + * @brief Initialise the magnetometer driver + * + * @return none + **************************************************************************************************/ +void HalMagInit(void) +{ + sensorState = MAG3110_OFF; +} + + +/************************************************************************************************** + * @fn HalMagStatus + * + * @brief Read the magnetometer status + * + * @return none + **************************************************************************************************/ +Magnetometer_States_t HalMagStatus( void ) +{ + if( sensorState == MAG3110_IDLE) + { + uint8 status = 0; + + HalMagSelect(); + HalSensorReadReg( MAG_REG_ADDR_DR_STATUS, &status, 1); + if(status!=0) + { + sensorState = MAG3110_DATA_READY; + } + } + + return sensorState; +} + +/************************************************************************************************** +* @fn HalMagTurnOn +* +* @brief Turn on the MAG3110. +* +* @return none +*/ +void HalMagTurnOn(void) +{ + HalMagSelect(); + + HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &halMagSensorConfig, sizeof(halMagSensorConfig)); + HalSensorWriteReg(MAG_REG_ADDR_CTRL_2, &halMagAutoMrstEn, sizeof(halMagAutoMrstEn)); + sensorState = MAG3110_IDLE; +} + + +/************************************************************************************************** +* @fn HalMagTurnOff +* +* @brief Turn off the MAG3110. +* +* @return none +*/ +void HalMagTurnOff(void) +{ + HalMagSelect(); + + HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &halMagSensorOff, sizeof(halMagSensorOff)); + sensorState = MAG3110_OFF; +} + + +/************************************************************************************************** +* @fn HalMagRead +* +* @brief Read data from the magnetometer +* +* @param pBuf - buffer to hold the data +* +* @return TRUE if valid data +*/ +bool HalMagRead(uint8 *pBuf) +{ + uint8 tmp[MAG_REG_READ_ALL_LEN]; + bool f; + + HalMagSelect(); + + f = HalSensorReadReg(MAG_REG_ADDR_READ_START,tmp,MAG_REG_READ_ALL_LEN); + if (f) + { + // Swap bytes in each value-pair + pBuf[0] = tmp[1]; + pBuf[1] = tmp[0]; + pBuf[2] = tmp[3]; + pBuf[3] = tmp[2]; + pBuf[4] = tmp[5]; + pBuf[5] = tmp[4]; + } + sensorState = MAG3110_IDLE; + + return f; +} + + +/************************************************************************************************** + * @fn HalMagTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalMagTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalMagSelect(); + + // Check who-am-i register + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_WHO_AM_I, &val, sizeof(val))); + ST_ASSERT(val==WHO_AM_I_VALUE); + + // Check CTRL_REG1 in standby mode + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(val==MAG_REG_CTRL_OFF); + + // Check that CTRL_REG1 can be written + val = CTRL1_TEST_VALUE; + ST_ASSERT(HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(val==CTRL1_TEST_VALUE); + + // Restore default value + val = MAG_REG_CTRL_OFF; + ST_ASSERT(HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + + // Check that the sensor is in standby mode + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_SYSMOD, &val, sizeof(val))); + ST_ASSERT(val==0); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalMagSelect +* +* @brief Select the magnetometer on the I2C-bus +* +* @return +*/ +static void HalMagSelect(void) +{ + //Set up I2C that is used to communicate with MAG3110 + HalI2CInit(HAL_MAG3110_I2C_ADDRESS,i2cClock_267KHZ); +} + + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcMagn(int16 rawX) +{ + float v; + + //-- calculate magnetic force, unit uT, range -1000, +1000 + v = (rawX * 1.0) / (65536 / 2000); + + return v; +} +*/ + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.h new file mode 100644 index 0000000..26f66e9 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mag.h @@ -0,0 +1,91 @@ +/************************************************************************************************** + Filename: hal_mag.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the magnometer driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_MAG_H +#define HAL_MAG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MAG3110_I2C_ADDRESS 0x0E +#define HAL_MAG3110_PERIOD_MASK 0x10 +#define HAL_MAG3110_ENABLE_MASK 0x01 + + /* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef enum +{ + MAG3110_OFF, // Magnetometer Sleeping + MAG3110_IDLE, // Magnetometer On and Configured + MAG3110_DATA_READY, // Magnetometer On, Configured and Data is Ready +} Magnetometer_States_t; + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalMagInit(void); +void HalMagTurnOn(void); +void HalMagTurnOff(void); +bool HalMagRead(uint8 *pBuf); +bool HalMagTest(void); +Magnetometer_States_t HalMagStatus( void ); + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_mcu.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_sensor.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_sensor.c new file mode 100644 index 0000000..51bd76c --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_sensor.c @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: hal_sensor.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This file contains code that is common to all sensor drivers. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_sensor.h" +#include "hal_i2c.h" +#include "hal_led.h" +#include "hal_irtemp.h" +#include "hal_humi.h" +#include "hal_bar.h" +#include "hal_mag.h" +#include "hal_acc.h" +#include "hal_gyro.h" + +/* ------------------------------------------------------------------------------------------------ +* Macros and constants +* ------------------------------------------------------------------------------------------------ +*/ +#define N_TEST_RUNS 10 + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 buffer[24]; +static uint8 halSensorEnableMap; + +/************************************************************************************************** + * @fn HalSensorReadReg + * + * @brief This function implements the I2C protocol to read from a sensor. The sensor must + * be selected before this routine is called. + * + * @param addr - which register to read + * @param pBuf - pointer to buffer to place data + * @param nBytes - numbver of bytes to read + * + * @return TRUE if the required number of bytes are reveived + **************************************************************************************************/ +bool HalSensorReadReg(uint8 addr, uint8 *pBuf, uint8 nBytes) +{ + uint8 i = 0; + + /* Send address we're reading from */ + if (HalI2CWrite(1,&addr) == 1) + { + /* Now read data */ + i = HalI2CRead(nBytes,pBuf); + } + + return i == nBytes; +} + +/************************************************************************************************** +* @fn HalSensorWriteReg +* @brief This function implements the I2C protocol to write to a sensor. he sensor must +* be selected before this routine is called. +* +* @param addr - which register to write +* @param pBuf - pointer to buffer containing data to be written +* @param nBytes - number of bytes to write +* +* @return TRUE if successful write +*/ +bool HalSensorWriteReg(uint8 addr, uint8 *pBuf, uint8 nBytes) +{ + uint8 i; + uint8 *p = buffer; + + /* Copy address and data to local buffer for burst write */ + *p++ = addr; + for (i = 0; i < nBytes; i++) + { + *p++ = *pBuf++; + } + nBytes++; + + /* Send address and data */ + i = HalI2CWrite(nBytes, buffer); + if ( i!= nBytes) + HAL_TOGGLE_LED2(); + + return (i == nBytes); +} + +/********************************************************************* + * @fn HalSensorTest + * + * @brief Run a self-test on all the sensors + * + * @param none + * + * @return bitmask of error flags + */ +uint16 HalSensorTest(void) +{ + uint16 i; + uint8 selfTestResult; + + halSensorEnableMap = 0; + selfTestResult = 0; + HalGyroTurnOn(); + + for (i=0; i MAX_16BIT_TIMEOUT) + { + osal_timeout = MAX_16BIT_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + + // Disable I2C to avoid driving lines + HalI2CDisable(); + + // Disable DCDC + DCDC_SBIT = 0; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // Enable DCDC + DCDC_SBIT = 1; + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_startup.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_timer.c b/Firmware/Radio/Components/hal/target/CC2541ST/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Components/hal/target/CC2541ST/hal_types.h b/Firmware/Radio/Components/hal/target/CC2541ST/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Components/hal/target/CC2541ST/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Components/osal/common/OSAL.c b/Firmware/Radio/Components/osal/common/OSAL.c new file mode 100644 index 0000000..d4bbeda --- /dev/null +++ b/Firmware/Radio/Components/osal/common/OSAL.c @@ -0,0 +1,1245 @@ +/************************************************************************************************** + Filename: OSAL.c + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: This API allows the software components in the Z-stack to be written + independently of the specifics of the operating system, kernel or tasking + environment (including control loops or connect-to-interrupt systems). + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include + +#include "comdef.h" +#include "hal_board.h" +#include "OSAL.h" +#include "OSAL_Tasks.h" +#include "OSAL_Memory.h" +#include "OSAL_PwrMgr.h" +#include "OSAL_Clock.h" + +#include "OnBoard.h" + +/* HAL */ +#include "hal_drivers.h" + +#ifdef IAR_ARMCM3_LM + #include "FreeRTOSConfig.h" + #include "osal_task.h" +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Message Pool Definitions +osal_msg_q_t osal_qHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Index of active task +static uint8 activeTaskID = TASK_NO_TASK; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 urgent ); + +/********************************************************************* + * HELPER FUNCTIONS + */ +/* very ugly stub so Keil can compile */ +#ifdef __KEIL__ +char * itoa ( int value, char * buffer, int radix ) +{ + return(buffer); +} +#endif + +/********************************************************************* + * @fn osal_strlen + * + * @brief + * + * Calculates the length of a string. The string must be null + * terminated. + * + * @param char *pString - pointer to text string + * + * @return int - number of characters + */ +int osal_strlen( char *pString ) +{ + return (int)( strlen( pString ) ); +} + +/********************************************************************* + * @fn osal_memcpy + * + * @brief + * + * Generic memory copy. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_memcpy( void *dst, const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 GENERIC *pSrc; + + pSrc = src; + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc++; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_revmemcpy + * + * @brief Generic reverse memory copy. Starts at the end of the + * source buffer, by taking the source address pointer and moving + * pointer ahead "len" bytes, then decrementing the pointer. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_revmemcpy( void *dst, const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 GENERIC *pSrc; + + pSrc = src; + pSrc += (len-1); + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc--; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_memdup + * + * @brief Allocates a buffer [with osal_mem_alloc()] and copies + * the src buffer into the newly allocated space. + * + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to the new allocated buffer, or NULL if + * allocation problem. + */ +void *osal_memdup( const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + + pDst = osal_mem_alloc( len ); + if ( pDst ) + { + VOID osal_memcpy( pDst, src, len ); + } + + return ( (void *)pDst ); +} + +/********************************************************************* + * @fn osal_memcmp + * + * @brief + * + * Generic memory compare. + * + * @param src1 - source 1 addrexx + * @param src2 - source 2 address + * @param len - number of bytes to compare + * + * @return TRUE - same, FALSE - different + */ +uint8 osal_memcmp( const void GENERIC *src1, const void GENERIC *src2, unsigned int len ) +{ + const uint8 GENERIC *pSrc1; + const uint8 GENERIC *pSrc2; + + pSrc1 = src1; + pSrc2 = src2; + + while ( len-- ) + { + if( *pSrc1++ != *pSrc2++ ) + return FALSE; + } + return TRUE; +} + + +/********************************************************************* + * @fn osal_memset + * + * @brief + * + * Set memory buffer to value. + * + * @param dest - pointer to buffer + * @param value - what to set each uint8 of the message + * @param size - how big + * + * @return pointer to destination buffer + */ +void *osal_memset( void *dest, uint8 value, int len ) +{ + return memset( dest, value, len ); +} + +/********************************************************************* + * @fn osal_build_uint16 + * + * @brief + * + * Build a uint16 out of 2 bytes (0 then 1). + * + * @param swapped - 0 then 1 + * + * @return uint16 + */ +uint16 osal_build_uint16( uint8 *swapped ) +{ + return ( BUILD_UINT16( swapped[0], swapped[1] ) ); +} + +/********************************************************************* + * @fn osal_build_uint32 + * + * @brief + * + * Build a uint32 out of sequential bytes. + * + * @param swapped - sequential bytes + * @param len - number of bytes in the uint8 array + * + * @return uint32 + */ +uint32 osal_build_uint32( uint8 *swapped, uint8 len ) +{ + if ( len == 2 ) + return ( BUILD_UINT32( swapped[0], swapped[1], 0L, 0L ) ); + else if ( len == 3 ) + return ( BUILD_UINT32( swapped[0], swapped[1], swapped[2], 0L ) ); + else if ( len == 4 ) + return ( BUILD_UINT32( swapped[0], swapped[1], swapped[2], swapped[3] ) ); + else + return ( (uint32)swapped[0] ); +} + +#if !defined ( ZBIT ) && !defined ( ZBIT2 ) && !defined (UBIT) +/********************************************************************* + * @fn _ltoa + * + * @brief + * + * convert a long unsigned int to a string. + * + * @param l - long to convert + * @param buf - buffer to convert to + * @param radix - 10 dec, 16 hex + * + * @return pointer to buffer + */ +unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix) +{ +#if defined( __GNUC__ ) + return ( (char*)ltoa( l, buf, radix ) ); +#else + unsigned char tmp1[10] = "", tmp2[10] = "", tmp3[10] = ""; + unsigned short num1, num2, num3; + unsigned char i; + + buf[0] = '\0'; + + if ( radix == 10 ) + { + num1 = l % 10000; + num2 = (l / 10000) % 10000; + num3 = (unsigned short)(l / 100000000); + + if (num3) _itoa(num3, tmp3, 10); + if (num2) _itoa(num2, tmp2, 10); + if (num1) _itoa(num1, tmp1, 10); + + if (num3) + { + strcpy((char*)buf, (char const*)tmp3); + for (i = 0; i < 4 - strlen((char const*)tmp2); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp2); + if (num3 || num2) + { + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num3 && !num2 && !num1) + strcpy((char*)buf, "0"); + } + else if ( radix == 16 ) + { + num1 = l & 0x0000FFFF; + num2 = l >> 16; + + if (num2) _itoa(num2, tmp2, 16); + if (num1) _itoa(num1, tmp1, 16); + + if (num2) + { + strcpy((char*)buf,(char const*)tmp2); + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num2 && !num1) + strcpy((char*)buf, "0"); + } + else + return NULL; + + return buf; +#endif +} +#endif // !defined(ZBIT) && !defined(ZBIT2) + +/********************************************************************* + * @fn osal_rand + * + * @brief Random number generator + * + * @param none + * + * @return uint16 - new random number + */ +uint16 osal_rand( void ) +{ + return ( Onboard_rand() ); +} + +/********************************************************************* + * API FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_msg_allocate + * + * @brief + * + * This function is called by a task to allocate a message buffer + * into which the task will encode the particular message it wishes + * to send. This common buffer scheme is used to strictly limit the + * creation of message buffers within the system due to RAM size + * limitations on the microprocessor. Note that all message buffers + * are a fixed size (at least initially). The parameter len is kept + * in case a message pool with varying fixed message sizes is later + * created (for example, a pool of message buffers of size LARGE, + * MEDIUM and SMALL could be maintained and allocated based on request + * from the tasks). + * + * + * @param uint8 len - wanted buffer length + * + * + * @return pointer to allocated buffer or NULL if allocation failed. + */ +uint8 * osal_msg_allocate( uint16 len ) +{ + osal_msg_hdr_t *hdr; + + if ( len == 0 ) + return ( NULL ); + + hdr = (osal_msg_hdr_t *) osal_mem_alloc( (short)(len + sizeof( osal_msg_hdr_t )) ); + if ( hdr ) + { + hdr->next = NULL; + hdr->len = len; + hdr->dest_id = TASK_NO_TASK; + return ( (uint8 *) (hdr + 1) ); + } + else + return ( NULL ); +} + +/********************************************************************* + * @fn osal_msg_deallocate + * + * @brief + * + * This function is used to deallocate a message buffer. This function + * is called by a task (or processing element) after it has finished + * processing a received message. + * + * + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_MSG_POINTER + */ +uint8 osal_msg_deallocate( uint8 *msg_ptr ) +{ + uint8 *x; + + if ( msg_ptr == NULL ) + return ( INVALID_MSG_POINTER ); + + // don't deallocate queued buffer + if ( OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK ) + return ( MSG_BUFFER_NOT_AVAIL ); + + x = (uint8 *)((uint8 *)msg_ptr - sizeof( osal_msg_hdr_t )); + + osal_mem_free( (void *)x ); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_msg_send + * + * @brief + * + * This function is called by a task to send a command message to + * another task or processing element. The sending_task field must + * refer to a valid task, since the task ID will be used + * for the response message. This function will also set a message + * ready event in the destination tasks event list. + * + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, FALSE ) ); +} + +/********************************************************************* + * @fn osal_msg_push_front + * + * @brief + * + * This function is called by a task to push a command message + * to the head of the OSAL queue. The destination_task field + * must refer to a valid task, since the task ID will be used to + * send the message to. This function will also set a message + * ready event in the destination task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, TRUE ) ); +} + +/********************************************************************* + * @fn osal_msg_enqueue_push + * + * @brief + * + * This function is called by a task to either enqueue (append to + * queue) or push (prepend to queue) a command message to the OSAL + * queue. The destination_task field must refer to a valid task, + * since the task ID will be used to send the message to. This + * function will also set a message ready event in the destination + * task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * @param uint8 push - TRUE to push, otherwise enqueue + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 push ) +{ + if ( msg_ptr == NULL ) + { + return ( INVALID_MSG_POINTER ); + } + + if ( destination_task >= tasksCnt ) + { + osal_msg_deallocate( msg_ptr ); + return ( INVALID_TASK ); + } + + // Check the message header + if ( OSAL_MSG_NEXT( msg_ptr ) != NULL || + OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK ) + { + osal_msg_deallocate( msg_ptr ); + return ( INVALID_MSG_POINTER ); + } + + OSAL_MSG_ID( msg_ptr ) = destination_task; + + if ( push == TRUE ) + { + // prepend the message + osal_msg_push( &osal_qHead, msg_ptr ); + } + else + { + // append the message + osal_msg_enqueue( &osal_qHead, msg_ptr ); + } + + // Signal the task that a message is waiting + osal_set_event( destination_task, SYS_EVENT_MSG ); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_msg_receive + * + * @brief + * + * This function is called by a task to retrieve a received command + * message. The calling task must deallocate the message buffer after + * processing the message using the osal_msg_deallocate() call. + * + * @param uint8 task_id - receiving tasks ID + * + * @return *uint8 - message information or NULL if no message + */ +uint8 *osal_msg_receive( uint8 task_id ) +{ + osal_msg_hdr_t *listHdr; + osal_msg_hdr_t *prevHdr = NULL; + osal_msg_hdr_t *foundHdr = NULL; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // Point to the top of the queue + listHdr = osal_qHead; + + // Look through the queue for a message that belongs to the asking task + while ( listHdr != NULL ) + { + if ( (listHdr - 1)->dest_id == task_id ) + { + if ( foundHdr == NULL ) + { + // Save the first one + foundHdr = listHdr; + } + else + { + // Second msg found, stop looking + break; + } + } + if ( foundHdr == NULL ) + { + prevHdr = listHdr; + } + listHdr = OSAL_MSG_NEXT( listHdr ); + } + + // Is there more than one? + if ( listHdr != NULL ) + { + // Yes, Signal the task that a message is waiting + osal_set_event( task_id, SYS_EVENT_MSG ); + } + else + { + // No more + osal_clear_event( task_id, SYS_EVENT_MSG ); + } + + // Did we find a message? + if ( foundHdr != NULL ) + { + // Take out of the link list + osal_msg_extract( &osal_qHead, foundHdr, prevHdr ); + } + + // Release interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return ( (uint8*) foundHdr ); +} + +/************************************************************************************************** + * @fn osal_msg_find + * + * @brief This function finds in place an OSAL message matching the task_id and event + * parameters. + * + * input parameters + * + * @param task_id - The OSAL task id that the enqueued OSAL message must match. + * @param event - The OSAL event id that the enqueued OSAL message must match. + * + * output parameters + * + * None. + * + * @return NULL if no match, otherwise an in place pointer to the matching OSAL message. + ************************************************************************************************** + */ +osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event) +{ + osal_msg_hdr_t *pHdr; + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts. + + pHdr = osal_qHead; // Point to the top of the queue. + + // Look through the queue for a message that matches the task_id and event parameters. + while (pHdr != NULL) + { + if (((pHdr-1)->dest_id == task_id) && (((osal_event_hdr_t *)pHdr)->event == event)) + { + break; + } + + pHdr = OSAL_MSG_NEXT(pHdr); + } + + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts. + + return (osal_event_hdr_t *)pHdr; +} + +/********************************************************************* + * @fn osal_msg_enqueue + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + void *list; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + OSAL_MSG_NEXT( msg_ptr ) = NULL; + // If first message in queue + if ( *q_ptr == NULL ) + { + *q_ptr = msg_ptr; + } + else + { + // Find end of queue + for ( list = *q_ptr; OSAL_MSG_NEXT( list ) != NULL; list = OSAL_MSG_NEXT( list ) ); + + // Add message to end of queue + OSAL_MSG_NEXT( list ) = msg_ptr; + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_dequeue + * + * @brief + * + * This function dequeues an OSAL message from an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * + * @return void * - pointer to OSAL message or NULL of queue is empty. + */ +void *osal_msg_dequeue( osal_msg_q_t *q_ptr ) +{ + void *msg_ptr = NULL; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + if ( *q_ptr != NULL ) + { + // Dequeue message + msg_ptr = *q_ptr; + *q_ptr = OSAL_MSG_NEXT( msg_ptr ); + OSAL_MSG_NEXT( msg_ptr ) = NULL; + OSAL_MSG_ID( msg_ptr ) = TASK_NO_TASK; + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return msg_ptr; +} + +/********************************************************************* + * @fn osal_msg_push + * + * @brief + * + * This function pushes an OSAL message to the head of an OSAL + * queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // Push message to head of queue + OSAL_MSG_NEXT( msg_ptr ) = *q_ptr; + *q_ptr = msg_ptr; + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_extract + * + * @brief + * + * This function extracts and removes an OSAL message from the + * middle of an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message to be extracted + * @param void *prev_ptr - OSAL message before msg_ptr in queue + * + * @return none + */ +void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + if ( msg_ptr == *q_ptr ) + { + // remove from first + *q_ptr = OSAL_MSG_NEXT( msg_ptr ); + } + else + { + // remove from middle + OSAL_MSG_NEXT( prev_ptr ) = OSAL_MSG_NEXT( msg_ptr ); + } + OSAL_MSG_NEXT( msg_ptr ) = NULL; + OSAL_MSG_ID( msg_ptr ) = TASK_NO_TASK; + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_enqueue_max + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue if + * the length of the queue is less than max. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * @param uint8 max - maximum length of queue + * + * @return TRUE if message was enqueued, FALSE otherwise + */ +uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ) +{ + void *list; + uint8 ret = FALSE; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // If first message in queue + if ( *q_ptr == NULL ) + { + *q_ptr = msg_ptr; + ret = TRUE; + } + else + { + // Find end of queue or max + list = *q_ptr; + max--; + while ( (OSAL_MSG_NEXT( list ) != NULL) && (max > 0) ) + { + list = OSAL_MSG_NEXT( list ); + max--; + } + + // Add message to end of queue if max not reached + if ( max != 0 ) + { + OSAL_MSG_NEXT( list ) = msg_ptr; + ret = TRUE; + } + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return ret; +} + +/********************************************************************* + * @fn osal_set_event + * + * @brief + * + * This function is called to set the event flags for a task. The + * event passed in is OR'd into the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to set + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_set_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts + tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts + return ( SUCCESS ); + } + else + { + return ( INVALID_TASK ); + } +} + +/********************************************************************* + * @fn osal_clear_event + * + * @brief + * + * This function is called to clear the event flags for a task. The + * event passed in is masked out of the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to clear + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_clear_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts + tasksEvents[task_id] &= ~(event_flag); // Clear the event bit(s) + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts + return ( SUCCESS ); + } + else + { + return ( INVALID_TASK ); + } +} + +/********************************************************************* + * @fn osal_isr_register + * + * @brief + * + * This function is called to register a service routine with an + * interrupt. When the interrupt occurs, this service routine is called. + * + * @param uint8 interrupt_id - Interrupt number + * @param void (*isr_ptr)( uint8* ) - function pointer to ISR + * + * @return SUCCESS, INVALID_INTERRUPT_ID, + */ +uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ) +{ + // Remove these statements when functionality is complete + (void)interrupt_id; + (void)isr_ptr; + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_int_enable + * + * @brief + * + * This function is called to enable an interrupt. Once enabled, + * occurrence of the interrupt causes the service routine associated + * with that interrupt to be called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are enabled. + * If a single interrupt is passed in, then interrupts still have + * to be enabled with another call to INTS_ALL. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_enable( uint8 interrupt_id ) +{ + + if ( interrupt_id == INTS_ALL ) + { + HAL_ENABLE_INTERRUPTS(); + return ( SUCCESS ); + } + else + { + return ( INVALID_INTERRUPT_ID ); + } +} + +/********************************************************************* + * @fn osal_int_disable + * + * @brief + * + * This function is called to disable an interrupt. When a disabled + * interrupt occurs, the service routine associated with that + * interrupt is not called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are disabled. + * If a single interrupt is passed in, then just that interrupt is disabled. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_disable( uint8 interrupt_id ) +{ + + if ( interrupt_id == INTS_ALL ) + { + HAL_DISABLE_INTERRUPTS(); + return ( SUCCESS ); + } + else + { + return ( INVALID_INTERRUPT_ID ); + } +} + +/********************************************************************* + * @fn osal_init_system + * + * @brief + * + * This function initializes the "task" system by creating the + * tasks defined in the task table (OSAL_Tasks.h). + * + * @param void + * + * @return SUCCESS + */ +uint8 osal_init_system( void ) +{ + // Initialize the Memory Allocation System + osal_mem_init(); + + // Initialize the message queue + osal_qHead = NULL; + + // Initialize the timers + osalTimerInit(); + + // Initialize the Power Management System + osal_pwrmgr_init(); + + // Initialize the system tasks. + osalInitTasks(); + + // Setup efficient search for the first free block of heap. + osal_mem_kick(); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_start_system + * + * @brief + * + * This function is the main loop function of the task system (if + * ZBIT and UBIT are not defined). This Function doesn't return. + * + * @param void + * + * @return none + */ +void osal_start_system( void ) +{ +#if !defined ( ZBIT ) && !defined ( UBIT ) + for(;;) // Forever Loop +#endif + { + osal_run_system(); + } +} + +/********************************************************************* + * @fn osal_run_system + * + * @brief + * + * This function will make one pass through the OSAL taskEvents table + * and call the task_event_processor() function for the first task that + * is found with at least one event pending. If there are no pending + * events (all tasks), this function puts the processor into Sleep. + * + * @param void + * + * @return none + */ +void osal_run_system( void ) +{ + uint8 idx = 0; + +#ifndef HAL_BOARD_CC2538 + osalTimeUpdate(); +#endif + + Hal_ProcessPoll(); + + do { + if (tasksEvents[idx]) // Task is highest priority that is ready. + { + break; + } + } while (++idx < tasksCnt); + + if (idx < tasksCnt) + { + uint16 events; + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); + events = tasksEvents[idx]; + tasksEvents[idx] = 0; // Clear the Events for this task. + HAL_EXIT_CRITICAL_SECTION(intState); + + activeTaskID = idx; + events = (tasksArr[idx])( idx, events ); + activeTaskID = TASK_NO_TASK; + + HAL_ENTER_CRITICAL_SECTION(intState); + tasksEvents[idx] |= events; // Add back unprocessed events to the current task. + HAL_EXIT_CRITICAL_SECTION(intState); + } +#if defined( POWER_SAVING ) + else // Complete pass through all task events with no activity? + { + osal_pwrmgr_powerconserve(); // Put the processor/system into sleep + } +#endif + + /* Yield in case cooperative scheduling is being used. */ +#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0) + { + osal_task_yield(); + } +#endif +} + +/********************************************************************* + * @fn osal_buffer_uint32 + * + * @brief + * + * Buffer an uint32 value - LSB first. + * + * @param buf - buffer + * @param val - uint32 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint32( uint8 *buf, uint32 val ) +{ + *buf++ = BREAK_UINT32( val, 0 ); + *buf++ = BREAK_UINT32( val, 1 ); + *buf++ = BREAK_UINT32( val, 2 ); + *buf++ = BREAK_UINT32( val, 3 ); + + return buf; +} + +/********************************************************************* + * @fn osal_buffer_uint24 + * + * @brief + * + * Buffer an uint24 value - LSB first. Note that type uint24 is + * typedef to uint32 in comdef.h + * + * @param buf - buffer + * @param val - uint24 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint24( uint8 *buf, uint24 val ) +{ + *buf++ = BREAK_UINT32( val, 0 ); + *buf++ = BREAK_UINT32( val, 1 ); + *buf++ = BREAK_UINT32( val, 2 ); + + return buf; +} + +/********************************************************************* + * @fn osal_isbufset + * + * @brief + * + * Is all of the array elements set to a value? + * + * @param buf - buffer to check + * @param val - value to check each array element for + * @param len - length to check + * + * @return TRUE if all "val" + * FALSE otherwise + */ +uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ) +{ + uint8 x; + + if ( buf == NULL ) + { + return ( FALSE ); + } + + for ( x = 0; x < len; x++ ) + { + // Check for non-initialized value + if ( buf[x] != val ) + { + return ( FALSE ); + } + } + return ( TRUE ); +} + +/********************************************************************* + * @fn osal_self + * + * @brief + * + * This function returns the task ID of the current (active) task. + * + * @param void + * + * @return active task ID or TASK_NO_TASK if no task is active + */ +uint8 osal_self( void ) +{ + return ( activeTaskID ); +} + +/********************************************************************* + */ diff --git a/Firmware/Radio/Components/osal/common/OSAL_ClockBLE.c b/Firmware/Radio/Components/osal/common/OSAL_ClockBLE.c new file mode 100644 index 0000000..0415053 --- /dev/null +++ b/Firmware/Radio/Components/osal/common/OSAL_ClockBLE.c @@ -0,0 +1,338 @@ +/************************************************************************************************** + Filename: OSAL_ClockBLE.c + Revised: $Date: 2008-12-15 15:42:47 -0800 (Mon, 15 Dec 2008) $ + Revision: $Revision: 18616 $ + + Description: OSAL Clock definition and manipulation functions for BLE projects. + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Clock.h" + +/********************************************************************* + * MACROS + */ + +#define YearLength(yr) (IsLeapYear(yr) ? 366 : 365) + +/********************************************************************* + * CONSTANTS + */ + +// (MAXCALCTICKS * 5) + (max remainder) must be <= (uint16 max), +// so: (13105 * 5) + 7 <= 65535 +#define MAXCALCTICKS ((uint16)(13105)) + +#define BEGYEAR 2000 // UTC started at 00:00:00 January 1, 2000 + +#define DAY 86400UL // 24 hours * 60 minutes * 60 seconds + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ +extern uint16 ll_McuPrecisionCount(void); + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint16 previousLLTimerTick = 0; +static uint16 remUsTicks = 0; +static uint16 timeMSec = 0; + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +UTCTime OSAL_timeSeconds = 0; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ); + +static void osalClockUpdate( uint16 elapsedMSec ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimeUpdate + * + * @brief Uses the free running rollover count of the MAC backoff timer; + * this timer runs freely with a constant 320 usec interval. The + * count of 320-usec ticks is converted to msecs and used to update + * the OSAL clock and Timers by invoking osalClockUpdate() and + * osalTimerUpdate(). This function is intended to be invoked + * from the background, not interrupt level. + * + * @param None. + * + * @return None. + */ +void osalTimeUpdate( void ) +{ + uint16 tmp; + uint16 ticks625us; + uint16 elapsedMSec = 0; + + // Get the free-running count of 625us timer ticks + tmp = ll_McuPrecisionCount(); + + if ( tmp != previousLLTimerTick ) + { + // Calculate the elapsed ticks of the free-running timer. + ticks625us = tmp - previousLLTimerTick; + + // Store the LL Timer tick count for the next time through this function. + previousLLTimerTick = tmp; + + /* It is necessary to loop to convert the usecs to msecs in increments so as + * not to overflow the 16-bit variables. + */ + while ( ticks625us > MAXCALCTICKS ) + { + ticks625us -= MAXCALCTICKS; + elapsedMSec += MAXCALCTICKS * 5 / 8; + remUsTicks += MAXCALCTICKS * 5 % 8; + } + + // update converted number with remaining ticks from loop and the + // accumulated remainder from loop + tmp = (ticks625us * 5) + remUsTicks; + + // Convert the 625 us ticks into milliseconds and a remainder + elapsedMSec += tmp / 8; + remUsTicks = tmp % 8; + + // Update OSAL Clock and Timers + if ( elapsedMSec ) + { + osalClockUpdate( elapsedMSec ); + osalTimerUpdate( elapsedMSec ); + } + } +} + +/********************************************************************* + * @fn osalClockUpdate + * + * @brief Updates the OSAL Clock time with elapsed milliseconds. + * + * @param elapsedMSec - elapsed milliseconds + * + * @return none + */ +static void osalClockUpdate( uint16 elapsedMSec ) +{ + // Add elapsed milliseconds to the saved millisecond portion of time + timeMSec += elapsedMSec; + + // Roll up milliseconds to the number of seconds + if ( timeMSec >= 1000 ) + { + OSAL_timeSeconds += timeMSec / 1000; + timeMSec = timeMSec % 1000; + } +} + +/********************************************************************* + * @fn osal_setClock + * + * @brief Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * + * @param newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_setClock( UTCTime newTime ) +{ + OSAL_timeSeconds = newTime; +} + +/********************************************************************* + * @fn osal_getClock + * + * @brief Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second + * counter. + * + * @param none + * + * @return number of seconds since 0 hrs, 0 minutes, 0 seconds, + * on the 1st of January 2000 UTC + */ +UTCTime osal_getClock( void ) +{ + return ( OSAL_timeSeconds ); +} + +/********************************************************************* + * @fn osal_ConvertUTCTime + * + * @brief Converts UTCTime to UTCTimeStruct + * + * @param tm - pointer to breakdown struct + * + * @param secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ) +{ + // calculate the time less than a day - hours, minutes, seconds + { + uint32 day = secTime % DAY; + tm->seconds = day % 60UL; + tm->minutes = (day % 3600UL) / 60UL; + tm->hour = day / 3600UL; + } + + // Fill in the calendar - day, month, year + { + uint16 numDays = secTime / DAY; + tm->year = BEGYEAR; + while ( numDays >= YearLength( tm->year ) ) + { + numDays -= YearLength( tm->year ); + tm->year++; + } + + tm->month = 0; + while ( numDays >= monthLength( IsLeapYear( tm->year ), tm->month ) ) + { + numDays -= monthLength( IsLeapYear( tm->year ), tm->month ); + tm->month++; + } + + tm->day = numDays; + } +} + +/********************************************************************* + * @fn monthLength + * + * @param lpyr - 1 for leap year, 0 if not + * + * @param mon - 0 - 11 (jan - dec) + * + * @return number of days in specified month + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ) +{ + uint8 days = 31; + + if ( mon == 1 ) // feb + { + days = ( 28 + lpyr ); + } + else + { + if ( mon > 6 ) // aug-dec + { + mon--; + } + + if ( mon & 1 ) + { + days = 30; + } + } + + return ( days ); +} + +/********************************************************************* + * @fn osal_ConvertUTCSecs + * + * @brief Converts a UTCTimeStruct to UTCTime + * + * @param tm - pointer to provided struct + * + * @return number of seconds since 00:00:00 on 01/01/2000 (UTC) + */ +UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ) +{ + uint32 seconds; + + /* Seconds for the partial day */ + seconds = (((tm->hour * 60UL) + tm->minutes) * 60UL) + tm->seconds; + + /* Account for previous complete days */ + { + /* Start with complete days in current month */ + uint16 days = tm->day; + + /* Next, complete months in current year */ + { + int8 month = tm->month; + while ( --month >= 0 ) + { + days += monthLength( IsLeapYear( tm->year ), month ); + } + } + + /* Next, complete years before current year */ + { + uint16 year = tm->year; + while ( --year >= BEGYEAR ) + { + days += YearLength( year ); + } + } + + /* Add total seconds before partial day */ + seconds += (days * DAY); + } + + return ( seconds ); +} diff --git a/Firmware/Radio/Components/osal/common/OSAL_Memory.c b/Firmware/Radio/Components/osal/common/OSAL_Memory.c new file mode 100644 index 0000000..b6527b5 --- /dev/null +++ b/Firmware/Radio/Components/osal/common/OSAL_Memory.c @@ -0,0 +1,635 @@ +/************************************************************************************************** + Filename: OSAL_Memory.c + Revised: $Date: 2010-09-20 14:59:43 -0700 (Mon, 20 Sep 2010) $ + Revision: $Revision: 23848 $ + + Description: OSAL Heap Memory management functions. There is an Application Note that + should be read before studying and/or modifying this module: + SWRA204 "Heap Memory Management" + + Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" +#include "OSAL.h" +#include "OSAL_Memory.h" +#include "OnBoard.h" +#include "hal_assert.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define OSALMEM_IN_USE 0x8000 +#if (MAXMEMHEAP & OSALMEM_IN_USE) +#error MAXMEMHEAP is too big to manage! +#endif + +#define OSALMEM_HDRSZ sizeof(osalMemHdr_t) + +// Round a value up to the ceiling of OSALMEM_HDRSZ for critical dependencies on even multiples. +#define OSALMEM_ROUND(X) ((((X) + OSALMEM_HDRSZ - 1) / OSALMEM_HDRSZ) * OSALMEM_HDRSZ) + +/* Minimum wasted bytes to justify splitting a block before allocation. + * Adjust accordingly to attempt to balance the tradeoff of wasted space and runtime throughput + * spent splitting blocks into sizes that may not be practically usable when sandwiched between + * two blocks in use (and thereby not able to be coalesced.) + * Ensure that this size is an even multiple of OSALMEM_HDRSZ. + */ +#if !defined OSALMEM_MIN_BLKSZ +#define OSALMEM_MIN_BLKSZ (OSALMEM_ROUND((OSALMEM_HDRSZ * 2))) +#endif + +#if !defined OSALMEM_LL_BLKSZ +#if defined NONWK +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(6) + (1 * OSALMEM_HDRSZ)) +#else +/* + * Profiling the sample apps with default settings shows the following long-lived allocations + * which should live at the bottom of the small-block bucket so that they are never iterated over + * by osal_mem_alloc/free(), nor ever considered for coalescing, etc. This saves significant + * run-time throughput (on 8051 SOC if not also MSP). This is dynamic "dead space" and is not + * available to the small-block bucket heap. + * + * Adjust this size accordingly to accomodate application-specific changes including changing the + * size of long-lived objects profiled by sample apps and long-lived objects added by application. + */ +#if defined ZCL_KEY_ESTABLISH // Attempt to capture worst-case for SE sample apps. +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(526) + (32 * OSALMEM_HDRSZ)) +#elif defined TC_LINKKEY_JOIN +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(454) + (21 * OSALMEM_HDRSZ)) +#elif ((defined SECURE) && (SECURE != 0)) +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(418) + (19 * OSALMEM_HDRSZ)) +#else +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(417) + (19 * OSALMEM_HDRSZ)) +#endif +#endif +#endif + +/* Adjust accordingly to attempt to accomodate the block sizes of the vast majority of + * very high frequency allocations/frees by profiling the system runtime. + * This default of 16 accomodates the OSAL timers block, osalTimerRec_t, and many others. + * Ensure that this size is an even multiple of OSALMEM_MIN_BLKSZ for run-time efficiency. + */ +#if !defined OSALMEM_SMALL_BLKSZ +#define OSALMEM_SMALL_BLKSZ (OSALMEM_ROUND(16)) +#endif +#if !defined OSALMEM_SMALL_BLKCNT +#define OSALMEM_SMALL_BLKCNT 8 +#endif + +/* + * These numbers setup the size of the small-block bucket which is reserved at the front of the + * heap for allocations of OSALMEM_SMALL_BLKSZ or smaller. + */ + +// Size of the heap bucket reserved for small block-sized allocations. +// Adjust accordingly to attempt to accomodate the vast majority of very high frequency operations. +#define OSALMEM_SMALLBLK_BUCKET ((OSALMEM_SMALL_BLKSZ * OSALMEM_SMALL_BLKCNT) + OSALMEM_LL_BLKSZ) +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in +// order to prevent the small-block bucket from being coalesced with the wilderness. +#define OSALMEM_SMALLBLK_HDRCNT (OSALMEM_SMALLBLK_BUCKET / OSALMEM_HDRSZ) +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in +#define OSALMEM_BIGBLK_IDX (OSALMEM_SMALLBLK_HDRCNT + 1) +// The size of the wilderness after losing the small-block heap, the wasted header to block the +// small-block heap from being coalesced, and the wasted header to mark the end of the heap. +#define OSALMEM_BIGBLK_SZ (MAXMEMHEAP - OSALMEM_SMALLBLK_BUCKET - OSALMEM_HDRSZ*2) +// Index of the last available osalMemHdr_t at the end of the heap which will be set to zero for +// fast comparisons with zero to determine the end of the heap. +#define OSALMEM_LASTBLK_IDX ((MAXMEMHEAP / OSALMEM_HDRSZ) - 1) + +// For information about memory profiling, refer to SWRA204 "Heap Memory Management", section 1.5. +#if !defined OSALMEM_PROFILER +#define OSALMEM_PROFILER FALSE // Enable/disable the memory usage profiling buckets. +#endif +#if !defined OSALMEM_PROFILER_LL +#define OSALMEM_PROFILER_LL FALSE // Special profiling of the Long-Lived bucket. +#endif + +#if OSALMEM_PROFILER +#define OSALMEM_INIT 'X' +#define OSALMEM_ALOC 'A' +#define OSALMEM_REIN 'F' +#endif + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef struct { + // The 15 LSB's of 'val' indicate the total item size, including the header, in 8-bit bytes. + unsigned len : 15; + // The 1 MSB of 'val' is used as a boolean to indicate in-use or freed. + unsigned inUse : 1; +} osalMemHdrHdr_t; + +typedef union { + /* Dummy variable so compiler forces structure to alignment of largest element while not wasting + * space on targets when the halDataAlign_t is smaller than a UINT16. + */ + halDataAlign_t alignDummy; + uint16 val; + osalMemHdrHdr_t hdr; +} osalMemHdr_t; + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +static __no_init osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ]; +static __no_init osalMemHdr_t *ff1; // First free block in the small-block bucket. + +static uint8 osalMemStat; // Discrete status flags: 0x01 = kicked. + +#if OSALMEM_METRICS +static uint16 blkMax; // Max cnt of all blocks ever seen at once. +static uint16 blkCnt; // Current cnt of all blocks. +static uint16 blkFree; // Current cnt of free blocks. +static uint16 memAlo; // Current total memory allocated. +static uint16 memMax; // Max total memory ever allocated at once. +#endif + +#if OSALMEM_PROFILER +#define OSALMEM_PROMAX 8 +/* The profiling buckets must differ by at least OSALMEM_MIN_BLKSZ; the + * last bucket must equal the max alloc size. Set the bucket sizes to + * whatever sizes necessary to show how your application is using memory. + */ +static uint16 proCnt[OSALMEM_PROMAX] = { +OSALMEM_SMALL_BLKSZ, 48, 112, 176, 192, 224, 256, 65535 }; +static uint16 proCur[OSALMEM_PROMAX] = { 0 }; +static uint16 proMax[OSALMEM_PROMAX] = { 0 }; +static uint16 proTot[OSALMEM_PROMAX] = { 0 }; +static uint16 proSmallBlkMiss; +#endif + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ + +#ifdef DPRINTF_HEAPTRACE +extern int dprintf(const char *fmt, ...); +#endif /* DPRINTF_HEAPTRACE */ + +/************************************************************************************************** + * @fn osal_mem_init + * + * @brief This function is the OSAL heap memory management initialization callback. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_init(void) +{ + HAL_ASSERT(((OSALMEM_MIN_BLKSZ % OSALMEM_HDRSZ) == 0)); + HAL_ASSERT(((OSALMEM_LL_BLKSZ % OSALMEM_HDRSZ) == 0)); + HAL_ASSERT(((OSALMEM_SMALL_BLKSZ % OSALMEM_HDRSZ) == 0)); + +#if OSALMEM_PROFILER + (void)osal_memset(theHeap, OSALMEM_INIT, MAXMEMHEAP); +#endif + + // Setup a NULL block at the end of the heap for fast comparisons with zero. + theHeap[OSALMEM_LASTBLK_IDX].val = 0; + + // Setup the small-block bucket. + ff1 = theHeap; + ff1->val = OSALMEM_SMALLBLK_BUCKET; // Set 'len' & clear 'inUse' field. + // Set 'len' & 'inUse' fields - this is a 'zero data bytes' lifetime allocation to block the + // small-block bucket from ever being coalesced with the wilderness. + theHeap[OSALMEM_SMALLBLK_HDRCNT].val = (OSALMEM_HDRSZ | OSALMEM_IN_USE); + + // Setup the wilderness. + theHeap[OSALMEM_BIGBLK_IDX].val = OSALMEM_BIGBLK_SZ; // Set 'len' & clear 'inUse' field. + +#if ( OSALMEM_METRICS ) + /* Start with the small-block bucket and the wilderness - don't count the + * end-of-heap NULL block nor the end-of-small-block NULL block. + */ + blkCnt = blkFree = 2; +#endif +} + +/************************************************************************************************** + * @fn osal_mem_kick + * + * @brief This function is the OSAL task initialization callback. + * @brief Kick the ff1 pointer out past the long-lived OSAL Task blocks. + * Invoke this once after all long-lived blocks have been allocated - + * presently at the end of osal_init_system(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_kick(void) +{ + halIntState_t intState; + osalMemHdr_t *tmp = osal_mem_alloc(1); + + HAL_ASSERT((tmp != NULL)); + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts. + + /* All long-lived allocations have filled the LL block reserved in the small-block bucket. + * Set 'osalMemStat' so searching for memory in this bucket from here onward will only be done + * for sizes meeting the OSALMEM_SMALL_BLKSZ criteria. + */ + ff1 = tmp - 1; // Set 'ff1' to point to the first available memory after the LL block. + osal_mem_free(tmp); + osalMemStat = 0x01; // Set 'osalMemStat' after the free because it enables memory profiling. + + HAL_EXIT_CRITICAL_SECTION(intState); // Re-enable interrupts. +} + +/************************************************************************************************** + * @fn osal_mem_alloc + * + * @brief This function implements the OSAL dynamic memory allocation functionality. + * + * input parameters + * + * @param size - the number of bytes to allocate from the HEAP. + * + * output parameters + * + * None. + * + * @return None. + */ +#ifdef DPRINTF_OSALHEAPTRACE +void *osal_mem_alloc_dbg( uint16 size, const char *fname, unsigned lnum ) +#else /* DPRINTF_OSALHEAPTRACE */ +void *osal_mem_alloc( uint16 size ) +#endif /* DPRINTF_OSALHEAPTRACE */ +{ + osalMemHdr_t *prev = NULL; + osalMemHdr_t *hdr; + halIntState_t intState; + uint8 coal = 0; + + size += OSALMEM_HDRSZ; + + // Calculate required bytes to add to 'size' to align to halDataAlign_t. + if ( sizeof( halDataAlign_t ) == 2 ) + { + size += (size & 0x01); + } + else if ( sizeof( halDataAlign_t ) != 1 ) + { + const uint8 mod = size % sizeof( halDataAlign_t ); + + if ( mod != 0 ) + { + size += (sizeof( halDataAlign_t ) - mod); + } + } + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Smaller allocations are first attempted in the small-block bucket, and all long-lived + // allocations are channeled into the LL block reserved within this bucket. + if ((osalMemStat == 0) || (size <= OSALMEM_SMALL_BLKSZ)) + { + hdr = ff1; + } + else + { + hdr = (theHeap + OSALMEM_BIGBLK_IDX); + } + + do + { + if ( hdr->hdr.inUse ) + { + coal = 0; + } + else + { + if ( coal != 0 ) + { +#if ( OSALMEM_METRICS ) + blkCnt--; + blkFree--; +#endif + + prev->hdr.len += hdr->hdr.len; + + if ( prev->hdr.len >= size ) + { + hdr = prev; + break; + } + } + else + { + if ( hdr->hdr.len >= size ) + { + break; + } + + coal = 1; + prev = hdr; + } + } + + hdr = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + + if ( hdr->val == 0 ) + { + hdr = NULL; + break; + } + } while (1); + + if ( hdr != NULL ) + { + uint16 tmp = hdr->hdr.len - size; + + // Determine whether the threshold for splitting is met. + if ( tmp >= OSALMEM_MIN_BLKSZ ) + { + // Split the block before allocating it. + osalMemHdr_t *next = (osalMemHdr_t *)((uint8 *)hdr + size); + next->val = tmp; // Set 'len' & clear 'inUse' field. + hdr->val = (size | OSALMEM_IN_USE); // Set 'len' & 'inUse' field. + +#if ( OSALMEM_METRICS ) + blkCnt++; + if ( blkMax < blkCnt ) + { + blkMax = blkCnt; + } + memAlo += size; +#endif + } + else + { +#if ( OSALMEM_METRICS ) + memAlo += hdr->hdr.len; + blkFree--; +#endif + + hdr->hdr.inUse = TRUE; + } + +#if ( OSALMEM_METRICS ) + if ( memMax < memAlo ) + { + memMax = memAlo; + } +#endif + +#if ( OSALMEM_PROFILER ) +#if !OSALMEM_PROFILER_LL + if (osalMemStat != 0) // Don't profile until after the LL block is filled. +#endif + { + uint8 idx; + + for ( idx = 0; idx < OSALMEM_PROMAX; idx++ ) + { + if ( hdr->hdr.len <= proCnt[idx] ) + { + break; + } + } + proCur[idx]++; + if ( proMax[idx] < proCur[idx] ) + { + proMax[idx] = proCur[idx]; + } + proTot[idx]++; + + /* A small-block could not be allocated in the small-block bucket. + * When this occurs significantly frequently, increase the size of the + * bucket in order to restore better worst case run times. Set the first + * profiling bucket size in proCnt[] to the small-block bucket size and + * divide proSmallBlkMiss by the corresponding proTot[] size to get % miss. + * Best worst case time on TrasmitApp was achieved at a 0-15% miss rate + * during steady state Tx load, 0% during idle and steady state Rx load. + */ + if ((hdr->hdr.len <= OSALMEM_SMALL_BLKSZ) && (hdr >= (theHeap + OSALMEM_BIGBLK_IDX))) + { + proSmallBlkMiss++; + } + } + + (void)osal_memset((uint8 *)(hdr+1), OSALMEM_ALOC, (hdr->hdr.len - OSALMEM_HDRSZ)); +#endif + + if ((osalMemStat != 0) && (ff1 == hdr)) + { + ff1 = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + } + + hdr++; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. +#pragma diag_suppress=Pe767 + HAL_ASSERT(((halDataAlign_t)hdr % sizeof(halDataAlign_t)) == 0); +#pragma diag_default=Pe767 + +#ifdef DPRINTF_OSALHEAPTRACE + dprintf("osal_mem_alloc(%u)->%lx:%s:%u\n", size, (unsigned) hdr, fname, lnum); +#endif /* DPRINTF_OSALHEAPTRACE */ + return (void *)hdr; +} + +/************************************************************************************************** + * @fn osal_mem_free + * + * @brief This function implements the OSAL dynamic memory de-allocation functionality. + * + * input parameters + * + * @param ptr - A valid pointer (i.e. a pointer returned by osal_mem_alloc()) to the memory to free. + * + * output parameters + * + * None. + * + * @return None. + */ +#ifdef DPRINTF_OSALHEAPTRACE +void osal_mem_free_dbg(void *ptr, const char *fname, unsigned lnum) +#else /* DPRINTF_OSALHEAPTRACE */ +void osal_mem_free(void *ptr) +#endif /* DPRINTF_OSALHEAPTRACE */ +{ + osalMemHdr_t *hdr = (osalMemHdr_t *)ptr - 1; + halIntState_t intState; + +#ifdef DPRINTF_OSALHEAPTRACE + dprintf("osal_mem_free(%lx):%s:%u\n", (unsigned) ptr, fname, lnum); +#endif /* DPRINTF_OSALHEAPTRACE */ + + HAL_ASSERT(((uint8 *)ptr >= (uint8 *)theHeap) && ((uint8 *)ptr < (uint8 *)theHeap+MAXMEMHEAP)); + HAL_ASSERT(hdr->hdr.inUse); + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + hdr->hdr.inUse = FALSE; + + if (ff1 > hdr) + { + ff1 = hdr; + } + +#if OSALMEM_PROFILER +#if !OSALMEM_PROFILER_LL + if (osalMemStat != 0) // Don't profile until after the LL block is filled. +#endif + { + uint8 idx; + + for (idx = 0; idx < OSALMEM_PROMAX; idx++) + { + if (hdr->hdr.len <= proCnt[idx]) + { + break; + } + } + + proCur[idx]--; + } + + (void)osal_memset((uint8 *)(hdr+1), OSALMEM_REIN, (hdr->hdr.len - OSALMEM_HDRSZ) ); +#endif +#if OSALMEM_METRICS + memAlo -= hdr->hdr.len; + blkFree++; +#endif + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. +} + +#if OSALMEM_METRICS +/********************************************************************* + * @fn osal_heap_block_max + * + * @brief Return the maximum number of blocks ever allocated at once. + * + * @param none + * + * @return Maximum number of blocks ever allocated at once. + */ +uint16 osal_heap_block_max( void ) +{ + return blkMax; +} + +/********************************************************************* + * @fn osal_heap_block_cnt + * + * @brief Return the current number of blocks now allocated. + * + * @param none + * + * @return Current number of blocks now allocated. + */ +uint16 osal_heap_block_cnt( void ) +{ + return blkCnt; +} + +/********************************************************************* + * @fn osal_heap_block_free + * + * @brief Return the current number of free blocks. + * + * @param none + * + * @return Current number of free blocks. + */ +uint16 osal_heap_block_free( void ) +{ + return blkFree; +} + +/********************************************************************* + * @fn osal_heap_mem_used + * + * @brief Return the current number of bytes allocated. + * + * @param none + * + * @return Current number of bytes allocated. + */ +uint16 osal_heap_mem_used( void ) +{ + return memAlo; +} +#endif + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) +/********************************************************************* + * @fn osal_heap_high_water + * + * @brief Return the highest byte ever allocated in the heap. + * + * @param none + * + * @return Highest number of bytes ever used by the stack. + */ +uint16 osal_heap_high_water( void ) +{ +#if ( OSALMEM_METRICS ) + return memMax; +#else + return MAXMEMHEAP; +#endif +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Components/osal/common/OSAL_PwrMgr.c b/Firmware/Radio/Components/osal/common/OSAL_PwrMgr.c new file mode 100644 index 0000000..a2b51b7 --- /dev/null +++ b/Firmware/Radio/Components/osal/common/OSAL_PwrMgr.c @@ -0,0 +1,193 @@ +/************************************************************************************************** + Filename: OSAL_pwrmgr.c + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Tasks.h" +#include "OSAL_Timers.h" +#include "OSAL_PwrMgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_pwrmgr_init + * + * @brief Initialize the power management system. + * + * @param none. + * + * @return none. + */ +void osal_pwrmgr_init( void ) +{ + pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation. + pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve +} + +/********************************************************************* + * @fn osal_pwrmgr_device + * + * @brief Sets the device power characteristic. + * + * @param pwrmgr_device - type of power devices. With PWRMGR_ALWAYS_ON + * selection, there is no power savings and the device is most + * likely on mains power. The PWRMGR_BATTERY selection allows the + * HAL sleep manager to enter sleep. + * + * @return none + */ +void osal_pwrmgr_device( uint8 pwrmgr_device ) +{ + pwrmgr_attribute.pwrmgr_device = pwrmgr_device; +} + +/********************************************************************* + * @fn osal_pwrmgr_task_state + * + * @brief This function is called by each task to state whether or + * not this task wants to conserve power. + * + * @param task_id - calling task ID. + * state - whether the calling task wants to + * conserve power or not. + * + * @return SUCCESS if task complete + */ +uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ) +{ + if ( task_id >= tasksCnt ) + return ( INVALID_TASK ); + + if ( state == PWRMGR_CONSERVE ) + { + // Clear the task state flag + pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id ); + } + else + { + // Set the task state flag + pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id); + } + + return ( SUCCESS ); +} + +#if defined( POWER_SAVING ) +/********************************************************************* + * @fn osal_pwrmgr_powerconserve + * + * @brief This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + * + * @param none. + * + * @return none. + */ +void osal_pwrmgr_powerconserve( void ) +{ + uint32 next; + halIntState_t intState; + + // Should we even look into power conservation + if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) + { + // Are all tasks in agreement to conserve + if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) + { + // Hold off interrupts. + HAL_ENTER_CRITICAL_SECTION( intState ); + + // Get next time-out + next = osal_next_timeout(); + + // Re-enable interrupts. + HAL_EXIT_CRITICAL_SECTION( intState ); + + // Put the processor into sleep mode + OSAL_SET_CPU_INTO_SLEEP( next ); + } + } +} +#endif /* POWER_SAVING */ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/osal/common/OSAL_Timers.c b/Firmware/Radio/Components/osal/common/OSAL_Timers.c new file mode 100644 index 0000000..9c4d16b --- /dev/null +++ b/Firmware/Radio/Components/osal/common/OSAL_Timers.c @@ -0,0 +1,613 @@ +/************************************************************************************************** + Filename: OSAL_Timers.c + Revised: $Date: 2012-11-28 00:37:02 -0800 (Wed, 28 Nov 2012) $ + Revision: $Revision: 32329 $ + + Description: OSAL Timer definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "hal_timer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +typedef union { + uint32 time32; + uint16 time16[2]; + uint8 time8[4]; +} osalTime_t; + +typedef struct +{ + void *next; + osalTime_t timeout; + uint16 event_flag; + uint8 task_id; + uint32 reloadTimeout; +} osalTimerRec_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +osalTimerRec_t *timerHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Milliseconds since last reboot +static uint32 osal_systemClock; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +osalTimerRec_t *osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ); +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ); +void osalDeleteTimer( osalTimerRec_t *rmTimer ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimerInit + * + * @brief Initialization for the OSAL Timer System. + * + * @param none + * + * @return + */ +void osalTimerInit( void ) +{ + osal_systemClock = 0; +} + +/********************************************************************* + * @fn osalAddTimer + * + * @brief Add a timer to the timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * @param timeout + * + * @return osalTimerRec_t * - pointer to newly created timer + */ +osalTimerRec_t * osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ) +{ + osalTimerRec_t *newTimer; + osalTimerRec_t *srchTimer; + + // Look for an existing timer first + newTimer = osalFindTimer( task_id, event_flag ); + if ( newTimer ) + { + // Timer is found - update it. + newTimer->timeout.time32 = timeout; + + return ( newTimer ); + } + else + { + // New Timer + newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) ); + + if ( newTimer ) + { + // Fill in new timer + newTimer->task_id = task_id; + newTimer->event_flag = event_flag; + newTimer->timeout.time32 = timeout; + newTimer->next = (void *)NULL; + newTimer->reloadTimeout = 0; + + // Does the timer list already exist + if ( timerHead == NULL ) + { + // Start task list + timerHead = newTimer; + } + else + { + // Add it to the end of the timer list + srchTimer = timerHead; + + // Stop at the last record + while ( srchTimer->next ) + srchTimer = srchTimer->next; + + // Add to the list + srchTimer->next = newTimer; + } + + return ( newTimer ); + } + else + { + return ( (osalTimerRec_t *)NULL ); + } + } +} + +/********************************************************************* + * @fn osalFindTimer + * + * @brief Find a timer in a timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * + * @return osalTimerRec_t * + */ +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ) +{ + osalTimerRec_t *srchTimer; + + // Head of the timer list + srchTimer = timerHead; + + // Stop when found or at the end + while ( srchTimer ) + { + if ( srchTimer->event_flag == event_flag && + srchTimer->task_id == task_id ) + { + break; + } + + // Not this one, check another + srchTimer = srchTimer->next; + } + + return ( srchTimer ); +} + +/********************************************************************* + * @fn osalDeleteTimer + * + * @brief Delete a timer from a timer list. + * + * @param table + * @param rmTimer + * + * @return none + */ +void osalDeleteTimer( osalTimerRec_t *rmTimer ) +{ + // Does the timer list really exist + if ( rmTimer ) + { + // Clear the event flag and osalTimerUpdate() will delete + // the timer from the list. + rmTimer->event_flag = 0; + } +} + +/********************************************************************* + * @fn osal_start_timerEx + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param uint32 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_start_reload_timer + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event + * and the timer will be reloaded with the timeout value. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param UNINT16 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + if ( newTimer ) + { + // Load the reload timeout value + newTimer->reloadTimeout = timeout_value; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_stop_timerEx + * + * @brief + * + * This function is called to stop a timer that has already been started. + * If ZSUCCESS, the function will cancel the timer and prevent the event + * associated with the timer from being set for the calling task. + * + * @param uint8 task_id - task id of timer to stop + * @param uint16 event_id - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALID_EVENT_ID + */ +uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + osalTimerRec_t *foundTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Find the timer to stop + foundTimer = osalFindTimer( task_id, event_id ); + if ( foundTimer ) + { + osalDeleteTimer( foundTimer ); + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (foundTimer != NULL) ? SUCCESS : INVALID_EVENT_ID ); +} + +/********************************************************************* + * @fn osal_get_timeoutEx + * + * @brief + * + * @param uint8 task_id - task id of timer to check + * @param uint16 event_id - identifier of timer to be checked + * + * @return Return the timer's tick count if found, zero otherwise. + */ +uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + uint32 rtrn = 0; + osalTimerRec_t *tmr; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + tmr = osalFindTimer( task_id, event_id ); + + if ( tmr ) + { + rtrn = tmr->timeout.time32; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return rtrn; +} + +/********************************************************************* + * @fn osal_timer_num_active + * + * @brief + * + * This function counts the number of active timers. + * + * @return uint8 - number of timers + */ +uint8 osal_timer_num_active( void ) +{ + halIntState_t intState; + uint8 num_timers = 0; + osalTimerRec_t *srchTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Head of the timer list + srchTimer = timerHead; + + // Count timers in the list + while ( srchTimer != NULL ) + { + num_timers++; + srchTimer = srchTimer->next; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return num_timers; +} + +/********************************************************************* + * @fn osalTimerUpdate + * + * @brief Update the timer structures for a timer tick. + * + * @param none + * + * @return none + *********************************************************************/ +void osalTimerUpdate( uint32 updateTime ) +{ + halIntState_t intState; + osalTimerRec_t *srchTimer; + osalTimerRec_t *prevTimer; + + osalTime_t timeUnion; + timeUnion.time32 = updateTime; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + // Update the system time + osal_systemClock += updateTime; + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + // Look for open timer slot + if ( timerHead != NULL ) + { + // Add it to the end of the timer list + srchTimer = timerHead; + prevTimer = (void *)NULL; + + // Look for open timer slot + while ( srchTimer ) + { + osalTimerRec_t *freeTimer = NULL; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // To minimize time in this critical section, avoid 32-bit math + if ((timeUnion.time16[1] == 0) && (timeUnion.time8[1] == 0)) + { + // If upper 24 bits are zero, check lower 8 bits for roll over + if (srchTimer->timeout.time8[0] >= timeUnion.time8[0]) + { + // 8-bit math + srchTimer->timeout.time8[0] -= timeUnion.time8[0]; + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + + // Check for reloading + if ( (srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0) && + (srchTimer->reloadTimeout) && (srchTimer->event_flag) ) + { + // Notify the task of a timeout + osal_set_event( srchTimer->task_id, srchTimer->event_flag ); + + // Reload the timer timeout value + srchTimer->timeout.time32 = srchTimer->reloadTimeout; + } + + // When timeout or delete (event_flag == 0) + if ( ((srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0)) || + (srchTimer->event_flag == 0) ) + { + // Take out of list + if ( prevTimer == NULL ) + { + timerHead = srchTimer->next; + } + else + { + prevTimer->next = srchTimer->next; + } + + // Setup to free memory + freeTimer = srchTimer; + + // Next + srchTimer = srchTimer->next; + } + else + { + // Get next + prevTimer = srchTimer; + srchTimer = srchTimer->next; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + if ( freeTimer ) + { + if ( (freeTimer->timeout.time16[0] == 0) && (freeTimer->timeout.time16[1] == 0) ) + { + osal_set_event( freeTimer->task_id, freeTimer->event_flag ); + } + osal_mem_free( freeTimer ); + } + } + } +} + +#ifdef POWER_SAVING +/********************************************************************* + * @fn osal_adjust_timers + * + * @brief Update the timer structures for elapsed ticks. + * + * @param none + * + * @return none + *********************************************************************/ +void osal_adjust_timers( void ) +{ + uint32 eTime; + + if ( timerHead != NULL ) + { + // Compute elapsed time (msec) + eTime = TimerElapsed() / TICK_COUNT; + + if ( eTime ) + { + osalTimerUpdate( eTime ); + } + } +} + +/********************************************************************* + * @fn osal_next_timeout + * + * @brief + * + * Search timer table to return the lowest timeout value. If the + * timer list is empty, then the returned timeout will be zero. + * + * @param none + * + * @return none + *********************************************************************/ +uint32 osal_next_timeout( void ) +{ + uint32 nextTimeout; + osalTimerRec_t *srchTimer; + + if ( timerHead != NULL ) + { + // Head of the timer list + srchTimer = timerHead; + nextTimeout = OSAL_TIMERS_MAX_TIMEOUT; + + // Look for the next timeout timer + while ( srchTimer != NULL ) + { + if (srchTimer->timeout.time32 < nextTimeout) + { + nextTimeout = srchTimer->timeout.time32; + } + // Check next timer + srchTimer = srchTimer->next; + } + } + else + { + // No timers + nextTimeout = 0; + } + + return ( nextTimeout ); +} +#endif // POWER_SAVING + +/********************************************************************* + * @fn osal_GetSystemClock() + * + * @brief Read the local system clock. + * + * @param none + * + * @return local clock in milliseconds + */ +uint32 osal_GetSystemClock( void ) +{ + return ( osal_systemClock ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/osal/common/osal_bufmgr.c b/Firmware/Radio/Components/osal/common/osal_bufmgr.c new file mode 100644 index 0000000..28f89b3 --- /dev/null +++ b/Firmware/Radio/Components/osal/common/osal_bufmgr.c @@ -0,0 +1,268 @@ +/************************************************************************************************** + Filename: osal_bufmgr.c + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the buffer management APIs. These APIs + are not reentrant hence cannot be called from an interrupt + contex. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#include "OSAL.h" +#include "OnBoard.h" + +#include "osal_bufmgr.h" + +/********************************************************************* + * MACROS + */ +// 'bd_ptr' used with these macros must be of the type 'bm_desc_t *' +#define START_PTR( bd_ptr ) ( (bd_ptr) + 1 ) +#define END_PTR( bd_ptr ) ( (uint8 *)START_PTR( bd_ptr ) + (bd_ptr)->payload_len ) + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ +typedef struct bm_desc +{ + struct bm_desc *next_ptr; // pointer to next buffer descriptor + uint16 payload_len; // length of user's buffer +} bm_desc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Linked list of allocated buffer descriptors +static bm_desc_t *bm_list_ptr = NULL; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ); + +/********************************************************************* + * @fn osal_bm_alloc + * + * @brief Implementation of the allocator functionality. + * + * WARNING: THIS FUNCTION CAN BE CALLED ONLY FROM THE BOTTOM + * LAYER OF THE STACK (HCI FOR DUAL MODE AND LINK + * LAYER FOR SINGLE MODE). + * + * @param size - number of bytes to allocate from the heap. + * + * @return pointer to the heap allocation; NULL if error or failure. + */ +void *osal_bm_alloc( uint16 size ) +{ + bm_desc_t *bd_ptr; + + bd_ptr = osal_mem_alloc( sizeof( bm_desc_t ) + size ); + if ( bd_ptr != NULL ) + { + // set the buffer descriptor info + bd_ptr->payload_len = size; + + // add item to the beginning of the list + bd_ptr->next_ptr = bm_list_ptr; + bm_list_ptr = bd_ptr; + + // return start of the buffer + return ( (void *)START_PTR( bd_ptr ) ); + } + + return ( (void *)NULL ); +} + +/********************************************************************* + * @fn osal_bm_free + * + * @brief Implementation of the de-allocator functionality. + * + * @param payload_ptr - pointer to the memory to free. + * + * @return none + */ +void osal_bm_free( void *payload_ptr ) +{ + bm_desc_t *loop_ptr; + bm_desc_t *prev_ptr = NULL; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != NULL ) + { + if ( payload_ptr >= (void *)START_PTR( loop_ptr ) && + payload_ptr <= (void *)END_PTR( loop_ptr) ) + { + // unlink item from the linked list + if ( prev_ptr == NULL ) + { + // it's the first item on the list + bm_list_ptr = loop_ptr->next_ptr; + } + else + { + prev_ptr->next_ptr = loop_ptr->next_ptr; + } + + // free the memory + osal_mem_free( loop_ptr ); + + // we're done here + break; + } + + // move on to next item + prev_ptr = loop_ptr; + loop_ptr = loop_ptr->next_ptr; + } +} + +/********************************************************************* + * @fn osal_bm_adjust_header + * + * @brief Add or remove header space for the payload pointer. A positive + * adjustment adds header space, and negative removes header space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_header( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != NULL ) + { + new_payload_ptr = (uint8 *)( (uint8 *)payload_ptr - size ); + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) && + new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn osal_bm_adjust_tail + * + * @brief Add or remove tail space for the payload pointer. A positive + * adjustment adds tail space, and negative removes tail space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_tail( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != NULL ) + { + new_payload_ptr = (uint8 *)END_PTR( bd_ptr ) - size; + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) && + new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn bm_desc_from_payload + * + * @brief Find buffer descriptor from payload pointer + * + * @param payload_ptr - pointer to payload + * + * @return pointer to buffer descriptor + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ) +{ + bm_desc_t *loop_ptr; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != NULL ) + { + if ( payload_ptr >= (uint8 *)START_PTR( loop_ptr ) && + payload_ptr <= (uint8 *)END_PTR( loop_ptr) ) + { + // item found + break; + } + + // move on to next item + loop_ptr = loop_ptr->next_ptr; + } + + return ( loop_ptr ); +} + + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Components/osal/common/osal_cbtimer.c b/Firmware/Radio/Components/osal/common/osal_cbtimer.c new file mode 100644 index 0000000..1bbd61d --- /dev/null +++ b/Firmware/Radio/Components/osal/common/osal_cbtimer.c @@ -0,0 +1,317 @@ +/************************************************************************************************* + Filename: osal_cbtimer.c + Revised: $Date: 2009-01-14 14:51:34 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18762 $ + + Description: This file contains the Callback Timer task(s). This module + provides 'callback' timers using the existing 'event' timers. + In other words, the registered callback function is called + instead of an OSAL event being sent to the owner of the timer + when it expires. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#include "OSAL.h" +#include "OSAL_Tasks.h" + +#include "osal_cbtimer.h" + +/********************************************************************* + * MACROS + */ +// Macros to convert one-dimensional index 'timer id' to two-dimensional indices +// 'task id' and 'event id'. + +// Find out event id using timer id +#define EVENT_ID( timerId ) ( 0x0001 << ( ( timerId ) % NUM_CBTIMERS_PER_TASK ) ) + +// Find out task id using timer id +#define TASK_ID( timerId ) ( ( ( timerId ) / NUM_CBTIMERS_PER_TASK ) + baseTaskID ) + +// Find out bank task id using task id +#define BANK_TASK_ID( taskId ) ( ( baseTaskID - ( taskId ) ) * NUM_CBTIMERS ) + +/********************************************************************* + * CONSTANTS + */ +// Number of callback timers supported per task (limited by the number of OSAL event timers) +#define NUM_CBTIMERS_PER_TASK 15 + +// Total number of callback timers +#define NUM_CBTIMERS ( OSAL_CBTIMER_NUM_TASKS * NUM_CBTIMERS_PER_TASK ) + +/********************************************************************* + * TYPEDEFS + */ +// Callback Timer structure +typedef struct +{ + pfnCbTimer_t pfnCbTimer; // callback function to be called when timer expires + uint8 *pData; // data to be passed in to callback function +} cbTimer_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Callback Timer base task id +uint16 baseTaskID = TASK_NO_TASK; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Callback Timers table. +#if ( NUM_CBTIMERS > 0 ) + cbTimer_t cbTimers[NUM_CBTIMERS]; +#endif + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn osal_CbTimerInit + * + * @brief Callback Timer task initialization function. This function + * can be called more than once (OSAL_CBTIMER_NUM_TASKS times). + * + * @param taskId - Message Timer task ID. + * + * @return void + */ +void osal_CbTimerInit( uint8 taskId ) +{ + if ( baseTaskID == TASK_NO_TASK ) + { + // Only initialize the base task id + baseTaskID = taskId; + + // Initialize all timer structures + osal_memset( cbTimers, 0, sizeof( cbTimers ) ); + } +} + +/********************************************************************* + * @fn osal_CbTimerProcessEvent + * + * @brief Callback Timer task event processing function. + * + * @param taskId - task ID. + * @param events - events. + * + * @return events not processed + */ +uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + // Process OSAL messages + + // return unprocessed events + return ( events ^ SYS_EVENT_MSG ); + } + + if ( events ) + { + uint8 i; + uint16 event; + + // Process event timers + for ( i = 0; i < NUM_CBTIMERS_PER_TASK; i++ ) + { + if ( ( events >> i ) & 0x0001 ) + { + cbTimer_t *pTimer = &cbTimers[BANK_TASK_ID( taskId )+i]; + + // Found the first event + event = 0x0001 << i; + + // Timer expired, call the registered callback function + pTimer->pfnCbTimer( pTimer->pData ); + + // Mark entry as free + pTimer->pfnCbTimer = NULL; + + // Null out data pointer + pTimer->pData = NULL; + + // We only process one event at a time + break; + } + } + + // return unprocessed events + return ( events ^ event ); + } + + // If reach here, the events are unknown + // Discard or make more handlers + return 0; +} + +/********************************************************************* + * @fn osal_CbTimerStart + * + * @brief This function is called to start a callback timer to expire + * in n mSecs. When the timer expires, the registered callback + * function will be called. + * + * @param pfnCbTimer - callback function to be called when timer expires + * @param pData - data to be passed in to callback function + * @param timeout - in milliseconds. + * @param pTimerId - will point to new timer Id (if not null) + * + * @return Success, or Failure. + */ +Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ) +{ + uint8 i; + + // Validate input parameters + if ( pfnCbTimer == NULL ) + { + return ( INVALIDPARAMETER ); + } + + // Look for an unused timer first + for ( i = 0; i < NUM_CBTIMERS; i++ ) + { + if ( cbTimers[i].pfnCbTimer == NULL ) + { + // Start the OSAL event timer first + if ( osal_start_timerEx( TASK_ID( i ), EVENT_ID( i ), timeout ) == SUCCESS ) + { + // Set up the callback timer + cbTimers[i].pfnCbTimer = pfnCbTimer; + cbTimers[i].pData = pData; + + if ( pTimerId != NULL ) + { + // Caller is intreseted in the timer id + *pTimerId = i; + } + + return ( SUCCESS ); + } + } + } + + // No timer available + return ( NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_CbTimerUpdate + * + * @brief This function is called to update a message timer that has + * already been started. If SUCCESS, the function will update + * the timer's timeout value. If INVALIDPARAMETER, the timer + * either doesn't exit. + * + * @param timerId - identifier of the timer that is to be updated + * @param timeout - new timeout in milliseconds. + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ) +{ + // Look for the existing timer + if ( timerId < NUM_CBTIMERS ) + { + if ( cbTimers[timerId].pfnCbTimer != NULL ) + { + // Make sure the corresponding OSAL event timer is still running + if ( osal_get_timeoutEx( TASK_ID( timerId ), EVENT_ID( timerId ) ) != 0 ) + { + // Timer exists; update it + osal_start_timerEx( TASK_ID( timerId ), EVENT_ID( timerId ), timeout ); + + return ( SUCCESS ); + } + } + } + + // Timer not found + return ( INVALIDPARAMETER ); +} + + +/********************************************************************* + * @fn osal_CbTimerStop + * + * @brief This function is called to stop a timer that has already been + * started. If SUCCESS, the function will cancel the timer. If + * INVALIDPARAMETER, the timer doesn't exit. + * + * @param timerId - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerStop( uint8 timerId ) +{ + // Look for the existing timer + if ( timerId < NUM_CBTIMERS ) + { + if ( cbTimers[timerId].pfnCbTimer != NULL ) + { + // Timer exists; stop the OSAL event timer first + osal_stop_timerEx( TASK_ID( timerId ), EVENT_ID( timerId ) ); + + // Mark entry as free + cbTimers[timerId].pfnCbTimer = NULL; + + // Null out data pointer + cbTimers[timerId].pData = NULL; + + return ( SUCCESS ); + } + } + + // Timer not found + return ( INVALIDPARAMETER ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Components/osal/include/OSAL.h b/Firmware/Radio/Components/osal/include/OSAL.h new file mode 100644 index 0000000..8b34adf --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL.h @@ -0,0 +1,308 @@ +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + +#ifndef OSAL_H +#define OSAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include + +#include "comdef.h" +#include "OSAL_Memory.h" +#include "OSAL_Timers.h" + +/********************************************************************* + * MACROS + */ +#if ( UINT_MAX == 65535 ) /* 8-bit and 16-bit devices */ + #define osal_offsetof(type, member) ((uint16) &(((type *) 0)->member)) +#else /* 32-bit devices */ + #define osal_offsetof(type, member) ((uint32) &(((type *) 0)->member)) +#endif + +#define OSAL_MSG_NEXT(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->next + +#define OSAL_MSG_Q_INIT(q_ptr) *(q_ptr) = NULL + +#define OSAL_MSG_Q_EMPTY(q_ptr) (*(q_ptr) == NULL) + +#define OSAL_MSG_Q_HEAD(q_ptr) (*(q_ptr)) + +#define OSAL_MSG_LEN(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->len + +#define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ +#define INTS_ALL 0xFF + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ +#if defined (ZBIT) + extern __declspec(dllexport) void osal_start_system( void ); +#else + extern void osal_start_system( void ); +#endif + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void GENERIC *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void GENERIC *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void GENERIC *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void GENERIC *src1, const void GENERIC *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + #if !defined ( ZBIT ) && !defined ( ZBIT2 ) && !defined (UBIT) + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + #endif + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_Clock.h b/Firmware/Radio/Components/osal/include/OSAL_Clock.h new file mode 100644 index 0000000..09dce7a --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_Clock.h @@ -0,0 +1,139 @@ +/****************************************************************************** + Filename: OSAL_Clock.h + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: OSAL Clock definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + +#ifndef OSAL_CLOCK_H +#define OSAL_CLOCK_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +#define IsLeapYear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4))) + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +typedef uint32 UTCTime; + +// To be used with +typedef struct +{ + uint8 seconds; // 0-59 + uint8 minutes; // 0-59 + uint8 hour; // 0-23 + uint8 day; // 0-30 + uint8 month; // 0-11 + uint16 year; // 2000+ +} UTCTimeStruct; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Updates the OSAL clock and Timers from the MAC 320us timer tick. + */ + extern void osalTimeUpdate( void ); + + /* + * Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern void osal_setClock( UTCTime newTime ); + + /* + * Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second counter. + * returns: number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern UTCTime osal_getClock( void ); + + /* + * Converts UTCTime to UTCTimeStruct + * + * secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * tm - pointer to breakdown struct + */ + extern void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ); + + /* + * Converts UTCTimeStruct to UTCTime (seconds since 00:00:00 01/01/2000) + * + * tm - pointer to UTC time struct + */ + extern UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ); + + /* + * Update/Adjust the osal clock and timers + * Msec - elapsed time in milli seconds + */ + extern void osalAdjustTimer( uint32 Msec ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_CLOCK_H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_Memory.h b/Firmware/Radio/Components/osal/include/OSAL_Memory.h new file mode 100644 index 0000000..c8984dd --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_Memory.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_MEMORY_H +#define OSAL_MEMORY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +#if !defined ( OSALMEM_METRICS ) + #define OSALMEM_METRICS FALSE +#endif + +/********************************************************************* + * MACROS + */ + +#define osal_stack_used() OnBoard_stack_used() + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ +#ifdef DPRINTF_OSALHEAPTRACE + void *osal_mem_alloc_dbg( uint16 size, const char *fname, unsigned lnum ); +#define osal_mem_alloc(_size ) osal_mem_alloc_dbg(_size, __FILE__, __LINE__) +#else /* DPRINTF_OSALHEAPTRACE */ + void *osal_mem_alloc( uint16 size ); +#endif /* DPRINTF_OSALHEAPTRACE */ + + /* + * Free a block of memory. + */ +#ifdef DPRINTF_OSALHEAPTRACE + void osal_mem_free_dbg( void *ptr, const char *fname, unsigned lnum ); +#define osal_mem_free(_ptr ) osal_mem_free_dbg(_ptr, __FILE__, __LINE__) +#else /* DPRINTF_OSALHEAPTRACE */ + void osal_mem_free( void *ptr ); +#endif /* DPRINTF_OSALHEAPTRACE */ + +#if ( OSALMEM_METRICS ) + /* + * Return the maximum number of blocks ever allocated at once. + */ + uint16 osal_heap_block_max( void ); + + /* + * Return the current number of blocks now allocated. + */ + uint16 osal_heap_block_cnt( void ); + + /* + * Return the current number of free blocks. + */ + uint16 osal_heap_block_free( void ); + + /* + * Return the current number of bytes allocated. + */ + uint16 osal_heap_mem_used( void ); +#endif + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + /* + * Return the highest number of bytes ever used in the heap. + */ + uint16 osal_heap_high_water( void ); +#endif + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef OSAL_MEMORY_H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_Nv.h b/Firmware/Radio/Components/osal/include/OSAL_Nv.h new file mode 100644 index 0000000..5532ac8 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_Nv.h @@ -0,0 +1,111 @@ +/************************************************************************************************** + Filename: OSAL_Nv.h + Revised: $Date: 2011-05-31 09:28:05 -0700 (Tue, 31 May 2011) $ + Revision: $Revision: 26152 $ + + Description: This module defines the OSAL non-volatile memory functions. + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_NV_H +#define OSAL_NV_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize NV service + */ +extern void osal_nv_init( void *p ); + +/* + * Initialize an item in NV + */ +extern uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ); + +/* + * Read an NV attribute + */ +extern uint8 osal_nv_read( uint16 id, uint16 offset, uint16 len, void *buf ); + +/* + * Write an NV attribute + */ +extern uint8 osal_nv_write( uint16 id, uint16 offset, uint16 len, void *buf ); + +/* + * Get the length of an NV item. + */ +extern uint16 osal_nv_item_len( uint16 id ); + +/* + * Delete an NV item. + */ +extern uint8 osal_nv_delete( uint16 id, uint16 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_NV.H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_PwrMgr.h b/Firmware/Radio/Components/osal/include/OSAL_PwrMgr.h new file mode 100644 index 0000000..cdbaaf9 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_PwrMgr.h @@ -0,0 +1,139 @@ +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_PWRMGR_H +#define OSAL_PWRMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ +#define PWRMGR_ALWAYS_ON 0 +#define PWRMGR_BATTERY 1 + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ +#define PWRMGR_CONSERVE 0 +#define PWRMGR_HOLD 1 + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_PWRMGR_H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_Tasks.h b/Firmware/Radio/Components/osal/include/OSAL_Tasks.h new file mode 100644 index 0000000..ac0beaf --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_Tasks.h @@ -0,0 +1,94 @@ +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_TASKS_H +#define OSAL_TASKS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +#define TASK_NO_TASK 0xFF + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_TASKS_H */ diff --git a/Firmware/Radio/Components/osal/include/OSAL_Timers.h b/Firmware/Radio/Components/osal/include/OSAL_Timers.h new file mode 100644 index 0000000..d4de494 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/OSAL_Timers.h @@ -0,0 +1,146 @@ +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_TIMERS_H +#define OSAL_TIMERS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + #define OSAL_TIMERS_MAX_TIMEOUT 0x28f5c28e /* unit is ms*/ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_TIMERS_H */ diff --git a/Firmware/Radio/Components/osal/include/ZComDef.h b/Firmware/Radio/Components/osal/include/ZComDef.h new file mode 100644 index 0000000..05f4692 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/ZComDef.h @@ -0,0 +1,439 @@ +/************************************************************************************************** + Filename: ZComDef.h + Revised: $Date: 2012-12-07 12:34:45 -0800 (Fri, 07 Dec 2012) $ + Revision: $Revision: 32490 $ + + Description: Type definitions and macros. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ZCOMDEF_H +#define ZCOMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" +#include "saddr.h" + + +/********************************************************************* + * CONSTANTS + */ +#define osal_cpyExtAddr(a, b) sAddrExtCpy((a), (const uint8 *)(b)) +#define osal_ExtAddrEqual(a, b) sAddrExtCmp((const uint8 *)(a), (const uint8 *)(b)) +#define osal_copyAddress(a, b) sAddrCpy( (sAddr_t *)(a), (const sAddr_t *)(b) ) + +/********************************************************************* + * CONSTANTS + */ + +// Build Device Types - Used during compilation +// These are the types of devices to build +// Bit masked into ZSTACK_DEVICE_BUILD +#define DEVICE_BUILD_COORDINATOR 0x01 +#define DEVICE_BUILD_ROUTER 0x02 +#define DEVICE_BUILD_ENDDEVICE 0x04 + +/*** Return Values ***/ +#define ZSUCCESS SUCCESS + +/*** Component IDs ***/ +#define COMPID_OSAL 0 +#define COMPID_MTEL 1 +#define COMPID_MTSPCI 2 +#define COMPID_NWK 3 +#define COMPID_NWKIF 4 +#define COMPID_MACCB 5 +#define COMPID_MAC 6 +#define COMPID_APP 7 +#define COMPID_TEST 8 + +#define COMPID_RTG 9 +#define COMPID_DATA 11 + +/* Temp CompIDs for testing */ +#define COMPID_TEST_NWK_STARTUP 20 +#define COMPID_TEST_SCAN_CONFIRM 21 +#define COMPID_TEST_ASSOC_CONFIRM 22 +#define COMPID_TEST_REMOTE_DATA_CONFIRM 23 + +// OSAL NV item IDs +#define ZCD_NV_EXTADDR 0x0001 +#define ZCD_NV_BOOTCOUNTER 0x0002 +#define ZCD_NV_STARTUP_OPTION 0x0003 +#define ZCD_NV_START_DELAY 0x0004 + +// NWK Layer NV item IDs +#define ZCD_NV_NIB 0x0021 +#define ZCD_NV_DEVICE_LIST 0x0022 +#define ZCD_NV_ADDRMGR 0x0023 +#define ZCD_NV_POLL_RATE 0x0024 +#define ZCD_NV_QUEUED_POLL_RATE 0x0025 +#define ZCD_NV_RESPONSE_POLL_RATE 0x0026 +#define ZCD_NV_REJOIN_POLL_RATE 0x0027 +#define ZCD_NV_DATA_RETRIES 0x0028 +#define ZCD_NV_POLL_FAILURE_RETRIES 0x0029 +#define ZCD_NV_STACK_PROFILE 0x002A +#define ZCD_NV_INDIRECT_MSG_TIMEOUT 0x002B +#define ZCD_NV_ROUTE_EXPIRY_TIME 0x002C +#define ZCD_NV_EXTENDED_PAN_ID 0x002D +#define ZCD_NV_BCAST_RETRIES 0x002E +#define ZCD_NV_PASSIVE_ACK_TIMEOUT 0x002F +#define ZCD_NV_BCAST_DELIVERY_TIME 0x0030 +#define ZCD_NV_NWK_MODE 0x0031 +#define ZCD_NV_CONCENTRATOR_ENABLE 0x0032 +#define ZCD_NV_CONCENTRATOR_DISCOVERY 0x0033 +#define ZCD_NV_CONCENTRATOR_RADIUS 0x0034 +#define ZCD_NV_CONCENTRATOR_RC 0x0036 +#define ZCD_NV_NWK_MGR_MODE 0x0037 +#define ZCD_NV_SRC_RTG_EXPIRY_TIME 0x0038 +#define ZCD_NV_ROUTE_DISCOVERY_TIME 0x0039 +#define ZCD_NV_NWK_ACTIVE_KEY_INFO 0x003A +#define ZCD_NV_NWK_ALTERN_KEY_INFO 0x003B +#define ZCD_NV_ROUTER_OFF_ASSOC_CLEANUP 0x003C +#define ZCD_NV_NWK_LEAVE_REQ_ALLOWED 0x003D +#define ZCD_NV_NWK_CHILD_AGE_ENABLE 0x003E +#define ZCD_NV_DEVICE_LIST_KA_TIMEOUT 0x003F + +// APS Layer NV item IDs +#define ZCD_NV_BINDING_TABLE 0x0041 +#define ZCD_NV_GROUP_TABLE 0x0042 +#define ZCD_NV_APS_FRAME_RETRIES 0x0043 +#define ZCD_NV_APS_ACK_WAIT_DURATION 0x0044 +#define ZCD_NV_APS_ACK_WAIT_MULTIPLIER 0x0045 +#define ZCD_NV_BINDING_TIME 0x0046 +#define ZCD_NV_APS_USE_EXT_PANID 0x0047 +#define ZCD_NV_APS_USE_INSECURE_JOIN 0x0048 +#define ZCD_NV_COMMISSIONED_NWK_ADDR 0x0049 + +#define ZCD_NV_APS_NONMEMBER_RADIUS 0x004B // Multicast non_member radius +#define ZCD_NV_APS_LINK_KEY_TABLE 0x004C +#define ZCD_NV_APS_DUPREJ_TIMEOUT_INC 0x004D +#define ZCD_NV_APS_DUPREJ_TIMEOUT_COUNT 0x004E +#define ZCD_NV_APS_DUPREJ_TABLE_SIZE 0x004F + +// Security NV Item IDs +#define ZCD_NV_SECURITY_LEVEL 0x0061 +#define ZCD_NV_PRECFGKEY 0x0062 +#define ZCD_NV_PRECFGKEYS_ENABLE 0x0063 +#define ZCD_NV_SECURITY_MODE 0x0064 +#define ZCD_NV_SECURE_PERMIT_JOIN 0x0065 +#define ZCD_NV_APS_LINK_KEY_TYPE 0x0066 +#define ZCD_NV_APS_ALLOW_R19_SECURITY 0x0067 + +#define ZCD_NV_IMPLICIT_CERTIFICATE 0x0069 +#define ZCD_NV_DEVICE_PRIVATE_KEY 0x006A +#define ZCD_NV_CA_PUBLIC_KEY 0x006B + +#define ZCD_NV_USE_DEFAULT_TCLK 0x006D +#define ZCD_NV_TRUSTCENTER_ADDR 0x006E +#define ZCD_NV_RNG_COUNTER 0x006F +#define ZCD_NV_RANDOM_SEED 0x0070 + +// ZDO NV Item IDs +#define ZCD_NV_USERDESC 0x0081 +#define ZCD_NV_NWKKEY 0x0082 +#define ZCD_NV_PANID 0x0083 +#define ZCD_NV_CHANLIST 0x0084 +#define ZCD_NV_LEAVE_CTRL 0x0085 +#define ZCD_NV_SCAN_DURATION 0x0086 +#define ZCD_NV_LOGICAL_TYPE 0x0087 +#define ZCD_NV_NWKMGR_MIN_TX 0x0088 +#define ZCD_NV_NWKMGR_ADDR 0x0089 + +#define ZCD_NV_ZDO_DIRECT_CB 0x008F + +// ZCL NV item IDs +#define ZCD_NV_SCENE_TABLE 0x0091 +#define ZCD_NV_MIN_FREE_NWK_ADDR 0x0092 +#define ZCD_NV_MAX_FREE_NWK_ADDR 0x0093 +#define ZCD_NV_MIN_FREE_GRP_ID 0x0094 +#define ZCD_NV_MAX_FREE_GRP_ID 0x0095 +#define ZCD_NV_MIN_GRP_IDS 0x0096 +#define ZCD_NV_MAX_GRP_IDS 0x0097 + +// Non-standard NV item IDs +#define ZCD_NV_SAPI_ENDPOINT 0x00A1 + +// NV Items Reserved for Commissioning Cluster Startup Attribute Set (SAS): +// 0x00B1 - 0x00BF: Parameters related to APS and NWK layers +// 0x00C1 - 0x00CF: Parameters related to Security +// 0x00D1 - 0x00DF: Current key parameters +#define ZCD_NV_SAS_SHORT_ADDR 0x00B1 +#define ZCD_NV_SAS_EXT_PANID 0x00B2 +#define ZCD_NV_SAS_PANID 0x00B3 +#define ZCD_NV_SAS_CHANNEL_MASK 0x00B4 +#define ZCD_NV_SAS_PROTOCOL_VER 0x00B5 +#define ZCD_NV_SAS_STACK_PROFILE 0x00B6 +#define ZCD_NV_SAS_STARTUP_CTRL 0x00B7 + +#define ZCD_NV_SAS_TC_ADDR 0x00C1 +#define ZCD_NV_SAS_TC_MASTER_KEY 0x00C2 +#define ZCD_NV_SAS_NWK_KEY 0x00C3 +#define ZCD_NV_SAS_USE_INSEC_JOIN 0x00C4 +#define ZCD_NV_SAS_PRECFG_LINK_KEY 0x00C5 +#define ZCD_NV_SAS_NWK_KEY_SEQ_NUM 0x00C6 +#define ZCD_NV_SAS_NWK_KEY_TYPE 0x00C7 +#define ZCD_NV_SAS_NWK_MGR_ADDR 0x00C8 + +#define ZCD_NV_SAS_CURR_TC_MASTER_KEY 0x00D1 +#define ZCD_NV_SAS_CURR_NWK_KEY 0x00D2 +#define ZCD_NV_SAS_CURR_PRECFG_LINK_KEY 0x00D3 + +// NV Items Reserved for Trust Center Link Key Table entries +// 0x0101 - 0x01FF +#define ZCD_NV_TCLK_TABLE_START 0x0101 +#define ZCD_NV_TCLK_TABLE_END 0x01FF + +// NV Items Reserved for APS Link Key Table entries +// 0x0201 - 0x02FF +#define ZCD_NV_APS_LINK_KEY_DATA_START 0x0201 // APS key data +#define ZCD_NV_APS_LINK_KEY_DATA_END 0x02FF + +// NV Items Reserved for Master Key Table entries +// 0x0301 - 0x03FF +#define ZCD_NV_MASTER_KEY_DATA_START 0x0301 // Master key data +#define ZCD_NV_MASTER_KEY_DATA_END 0x03FF + +// NV Items Reserved for applications (user applications) +// 0x0401 – 0x0FFF + + +// ZCD_NV_STARTUP_OPTION values +// These are bit weighted - you can OR these together. +// Setting one of these bits will set their associated NV items +// to code initialized values. +#define ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 +#define ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 +#define ZCD_STARTOPT_AUTO_START 0x04 +#define ZCD_STARTOPT_CLEAR_CONFIG ZCD_STARTOPT_DEFAULT_CONFIG_STATE +#define ZCD_STARTOPT_CLEAR_STATE ZCD_STARTOPT_DEFAULT_NETWORK_STATE + + +#define ZCL_KE_IMPLICIT_CERTIFICATE_LEN 48 +#define ZCL_KE_CA_PUBLIC_KEY_LEN 22 +#define ZCL_KE_DEVICE_PRIVATE_KEY_LEN 21 + +/********************************************************************* + * TYPEDEFS + */ + +/*** Data Types ***/ +typedef uint8 byte; +typedef uint16 UINT16; +typedef int16 INT16; + +enum +{ + AddrNotPresent = 0, + AddrGroup = 1, + Addr16Bit = 2, + Addr64Bit = 3, + AddrBroadcast = 15 +}; + +#define Z_EXTADDR_LEN 8 + +typedef byte ZLongAddr_t[Z_EXTADDR_LEN]; + +typedef struct +{ + union + { + uint16 shortAddr; + ZLongAddr_t extAddr; + } addr; + byte addrMode; +} zAddrType_t; + +// Redefined Generic Status Return Values for code backwards compatibility +#define ZSuccess SUCCESS +#define ZFailure FAILURE +#define ZInvalidParameter INVALIDPARAMETER + +// ZStack status values must start at 0x10, after the generic status values (defined in comdef.h) +#define ZMemError 0x10 +#define ZBufferFull 0x11 +#define ZUnsupportedMode 0x12 +#define ZMacMemError 0x13 + +#define ZSapiInProgress 0x20 +#define ZSapiTimeout 0x21 +#define ZSapiInit 0x22 + +#define ZNotAuthorized 0x7E + +#define ZMalformedCmd 0x80 +#define ZUnsupClusterCmd 0x81 + +// OTA Status values +#define ZOtaAbort 0x95 +#define ZOtaImageInvalid 0x96 +#define ZOtaWaitForData 0x97 +#define ZOtaNoImageAvailable 0x98 +#define ZOtaRequireMoreImage 0x99 + +// APS status values +#define ZApsFail 0xb1 +#define ZApsTableFull 0xb2 +#define ZApsIllegalRequest 0xb3 +#define ZApsInvalidBinding 0xb4 +#define ZApsUnsupportedAttrib 0xb5 +#define ZApsNotSupported 0xb6 +#define ZApsNoAck 0xb7 +#define ZApsDuplicateEntry 0xb8 +#define ZApsNoBoundDevice 0xb9 +#define ZApsNotAllowed 0xba +#define ZApsNotAuthenticated 0xbb + + // Security status values +#define ZSecNoKey 0xa1 +#define ZSecOldFrmCount 0xa2 +#define ZSecMaxFrmCount 0xa3 +#define ZSecCcmFail 0xa4 + + // NWK status values +#define ZNwkInvalidParam 0xc1 +#define ZNwkInvalidRequest 0xc2 +#define ZNwkNotPermitted 0xc3 +#define ZNwkStartupFailure 0xc4 +#define ZNwkAlreadyPresent 0xc5 +#define ZNwkSyncFailure 0xc6 +#define ZNwkTableFull 0xc7 +#define ZNwkUnknownDevice 0xc8 +#define ZNwkUnsupportedAttribute 0xc9 +#define ZNwkNoNetworks 0xca +#define ZNwkLeaveUnconfirmed 0xcb +#define ZNwkNoAck 0xcc // not in spec +#define ZNwkNoRoute 0xcd + + // MAC status values +#define ZMacSuccess 0x00 +#define ZMacBeaconLoss 0xe0 +#define ZMacChannelAccessFailure 0xe1 +#define ZMacDenied 0xe2 +#define ZMacDisableTrxFailure 0xe3 +#define ZMacFailedSecurityCheck 0xe4 +#define ZMacFrameTooLong 0xe5 +#define ZMacInvalidGTS 0xe6 +#define ZMacInvalidHandle 0xe7 +#define ZMacInvalidParameter 0xe8 +#define ZMacNoACK 0xe9 +#define ZMacNoBeacon 0xea +#define ZMacNoData 0xeb +#define ZMacNoShortAddr 0xec +#define ZMacOutOfCap 0xed +#define ZMacPANIDConflict 0xee +#define ZMacRealignment 0xef +#define ZMacTransactionExpired 0xf0 +#define ZMacTransactionOverFlow 0xf1 +#define ZMacTxActive 0xf2 +#define ZMacUnAvailableKey 0xf3 +#define ZMacUnsupportedAttribute 0xf4 +#define ZMacUnsupported 0xf5 +#define ZMacSrcMatchInvalidIndex 0xff + +typedef Status_t ZStatus_t; + +typedef struct +{ + uint8 txCounter; // Counter of transmission success/failures + uint8 txCost; // Average of sending rssi values if link staus is enabled + // i.e. NWK_LINK_STATUS_PERIOD is defined as non zero + uint8 rxLqi; // average of received rssi values + // needs to be converted to link cost (1-7) before used + uint8 inKeySeqNum; // security key sequence number + uint32 inFrmCntr; // security frame counter.. + uint16 txFailure; // higher values indicate more failures +} linkInfo_t; + +/********************************************************************* + * Global System Messages + */ + +#define SPI_INCOMING_ZTOOL_PORT 0x21 // Raw data from ZTool Port (not implemented) +#define SPI_INCOMING_ZAPP_DATA 0x22 // Raw data from the ZAPP port (see serialApp.c) +#define MT_SYS_APP_MSG 0x23 // Raw data from an MT Sys message +#define MT_SYS_APP_RSP_MSG 0x24 // Raw data output for an MT Sys message +#define MT_SYS_OTA_MSG 0x25 // Raw data output for an MT OTA Rsp + +#define AF_DATA_CONFIRM_CMD 0xFD // Data confirmation +#define AF_REFLECT_ERROR_CMD 0xFE // Reflected message error message +#define AF_INCOMING_MSG_CMD 0x1A // Incoming MSG type message +#define AF_INCOMING_KVP_CMD 0x1B // Incoming KVP type message +#define AF_INCOMING_GRP_KVP_CMD 0x1C // Incoming Group KVP type message + +//#define KEY_CHANGE 0xC0 // Key Events + +#define ZDO_NEW_DSTADDR 0xD0 // ZDO has received a new DstAddr for this app +#define ZDO_STATE_CHANGE 0xD1 // ZDO has changed the device's network state +#define ZDO_MATCH_DESC_RSP_SENT 0xD2 // ZDO match descriptor response was sent +#define ZDO_CB_MSG 0xD3 // ZDO incoming message callback +#define ZDO_NETWORK_REPORT 0xD4 // ZDO received a Network Report message +#define ZDO_NETWORK_UPDATE 0xD5 // ZDO received a Network Update message +#define ZDO_ADDR_CHANGE_IND 0xD6 // ZDO was informed of device address change + +#define NM_CHANNEL_INTERFERE 0x31 // NwkMgr received a Channel Interference message +#define NM_ED_SCAN_CONFIRM 0x32 // NwkMgr received an ED Scan Confirm message +#define SAPS_CHANNEL_CHANGE 0x33 // Stub APS has changed the device's channel +#define ZCL_INCOMING_MSG 0x34 // Incoming ZCL foundation message +#define ZCL_KEY_ESTABLISH_IND 0x35 // ZCL Key Establishment Completion Indication +#define ZCL_OTA_CALLBACK_IND 0x36 // ZCL OTA Completion Indication + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ZCOMDEF_H */ diff --git a/Firmware/Radio/Components/osal/include/comdef.h b/Firmware/Radio/Components/osal/include/comdef.h new file mode 100644 index 0000000..5ff73f8 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/comdef.h @@ -0,0 +1,152 @@ +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef COMDEF_H +#define COMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#include "hal_types.h" +#include "hal_defs.h" + +/********************************************************************* + * Lint Keywords + */ +#define VOID (void) + +#define NULL_OK +#define INP +#define OUTP +#define UNUSED +#define ONLY +#define READONLY +#define SHARED +#define KEEP +#define RELAX + +/********************************************************************* + * CONSTANTS + */ + +#ifndef false + #define false 0 +#endif + +#ifndef true + #define true 1 +#endif + +#ifndef CONST + #define CONST const +#endif + +#ifndef GENERIC + #define GENERIC +#endif + +/*** Generic Status Return Values ***/ +#define SUCCESS 0x00 +#define FAILURE 0x01 +#define INVALIDPARAMETER 0x02 +#define INVALID_TASK 0x03 +#define MSG_BUFFER_NOT_AVAIL 0x04 +#define INVALID_MSG_POINTER 0x05 +#define INVALID_EVENT_ID 0x06 +#define INVALID_INTERRUPT_ID 0x07 +#define NO_TIMER_AVAIL 0x08 +#define NV_ITEM_UNINIT 0x09 +#define NV_OPER_FAILED 0x0A +#define INVALID_MEM_SIZE 0x0B +#define NV_BAD_ITEM_LEN 0x0C + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + +#define SYS_EVENT_MSG 0x8000 // A message is waiting event + +/********************************************************************* + * Global Generic System Messages + */ + +#define KEY_CHANGE 0xC0 // Key Events + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* COMDEF_H */ diff --git a/Firmware/Radio/Components/osal/include/osal_bufmgr.h b/Firmware/Radio/Components/osal/include/osal_bufmgr.h new file mode 100644 index 0000000..fc6331e --- /dev/null +++ b/Firmware/Radio/Components/osal/include/osal_bufmgr.h @@ -0,0 +1,107 @@ +/************************************************************************************************** + Filename: osal_bufmgr.h + Revised: $Date: 2009-01-14 14:59:55 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18763 $ + + Description: This file contains the buffer management definitions. + + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_BUFMGR_H +#define OSAL_BUFMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * VARIABLES + */ + + +/********************************************************************* + * MACROS + */ + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Allocate a block of memory. + */ +extern void *osal_bm_alloc( uint16 size ); + +/* + * Add or remove header space for the payload pointer. + */ +extern void *osal_bm_adjust_header( void *payload_ptr, int16 size ); + +/* + * Add or remove tail space for the payload pointer. + */ +extern void *osal_bm_adjust_tail( void *payload_ptr, int16 size ); + +/* + * Free a block of memory. + */ +extern void osal_bm_free( void *payload_ptr ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_BUFMGR_H */ diff --git a/Firmware/Radio/Components/osal/include/osal_cbtimer.h b/Firmware/Radio/Components/osal/include/osal_cbtimer.h new file mode 100644 index 0000000..73bf724 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/osal_cbtimer.h @@ -0,0 +1,130 @@ +/************************************************************************************************** + Filename: osal_cbtimer.h + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the Callback Timer definitions. + + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_CBTIMER_H +#define OSAL_CBTIMER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ +// Invalid timer id +#define INVALID_TIMER_ID 0xFF + +// Timed out timer +#define TIMEOUT_TIMER_ID 0xFE + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ +#if ( OSAL_CBTIMER_NUM_TASKS == 0 ) + #error Callback Timer module shouldn't be included (no callback timer is needed)! +#elif ( OSAL_CBTIMER_NUM_TASKS == 1 ) + #define OSAL_CBTIMER_PROCESS_EVENT( a ) ( a ) +#elif ( OSAL_CBTIMER_NUM_TASKS == 2 ) + #define OSAL_CBTIMER_PROCESS_EVENT( a ) ( a ), ( a ) +#else + #error Maximum of 2 callback timer tasks are supported! Modify it here. +#endif + +/********************************************************************* + * TYPEDEFS + */ + +// Callback Timer function prototype. Callback function will be called +// when the associated timer expires. +// +// pData - pointer to data registered with timer +// +typedef void (*pfnCbTimer_t)( uint8 *pData ); + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Callback Timer task initialization function. + */ +extern void osal_CbTimerInit( uint8 taskId ); + +/* + * Callback Timer task event processing function. + */ +extern uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ); + +/* + * Function to start a timer to expire in n mSecs. + */ +extern Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ); + +/* + * Function to update a timer that has already been started. + */ +extern Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ); + +/* + * Function to stop a timer that has already been started. + */ +extern Status_t osal_CbTimerStop( uint8 timerId ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_CBTIMER_H */ diff --git a/Firmware/Radio/Components/osal/include/osal_snv.h b/Firmware/Radio/Components/osal/include/osal_snv.h new file mode 100644 index 0000000..57c6b24 --- /dev/null +++ b/Firmware/Radio/Components/osal/include/osal_snv.h @@ -0,0 +1,124 @@ +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2012-10-31 08:33:49 -0700 (Wed, 31 Oct 2012) $ + Revision: $Revision: 31988 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_SNV_H +#define OSAL_SNV_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ +#ifdef OSAL_SNV_UINT16_ID + typedef uint16 osalSnvId_t; + typedef uint16 osalSnvLen_t; +#else + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; +#endif + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_SNV.H */ diff --git a/Firmware/Radio/Components/osal/mcu/cc2540/osal_snv.c b/Firmware/Radio/Components/osal/mcu/cc2540/osal_snv.c new file mode 100644 index 0000000..86e717f --- /dev/null +++ b/Firmware/Radio/Components/osal/mcu/cc2540/osal_snv.c @@ -0,0 +1,835 @@ +/************************************************************************************************** + Filename: osal_snv.c + Revised: $Date: 2012-10-31 08:33:49 -0700 (Wed, 31 Oct 2012) $ + Revision: $Revision: 31988 $ + + Description: This module contains the OSAL simple non-volatile memory functions. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_adc.h" +#include "hal_flash.h" +#include "hal_types.h" +#include "comdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "hal_assert.h" +#include "saddr.h" + +#ifdef OSAL_SNV_UINT16_ID +# error "This OSAL SNV implementation does not support the extended ID space" +#endif + +/********************************************************************* + * CONSTANTS + */ + +// NV page configuration +#define OSAL_NV_PAGE_SIZE HAL_FLASH_PAGE_SIZE +#define OSAL_NV_PAGES_USED HAL_NV_PAGE_CNT +#define OSAL_NV_PAGE_BEG HAL_NV_PAGE_BEG +#define OSAL_NV_PAGE_END (OSAL_NV_PAGE_BEG + OSAL_NV_PAGES_USED - 1) + +// Default byte value when flash is erased +#define OSAL_NV_ERASED 0xFF + +// NV page header size in bytes +#define OSAL_NV_PAGE_HDR_SIZE 4 + +// In case pages 0-1 are ever used, define a null page value. +#define OSAL_NV_PAGE_NULL 0 + +// In case item Id 0 is ever used, define a null item value. +#define OSAL_NV_ITEM_NULL 0 + +// Length in bytes of a flash word +#define OSAL_NV_WORD_SIZE HAL_FLASH_WORD_SIZE + +// NV page header offset within a page +#define OSAL_NV_PAGE_HDR_OFFSET 0 + + +// Flag in a length field of an item header to indicate validity +// of the length field +#define OSAL_NV_INVALID_LEN_MARK 0x8000 + +// Flag in an ID field of an item header to indicate validity of +// the identifier field +#define OSAL_NV_INVALID_ID_MARK 0x8000 + + +// Bit difference between active page state indicator value and +// transfer page state indicator value +#define OSAL_NV_ACTIVE_XFER_DIFF 0x00100000 + +// active page state indicator value +#define OSAL_NV_ACTIVE_PAGE_STATE OSAL_NV_ACTIVE_XFER_DIFF + +// transfer page state indicator value +#define OSAL_NV_XFER_PAGE_STATE (OSAL_NV_ACTIVE_PAGE_STATE ^ OSAL_NV_ACTIVE_XFER_DIFF) + +/********************************************************************* + * MACROS + */ + +// Macro to check supply voltage +#if (defined HAL_MCU_CC2530 || defined HAL_MCU_CC2531) +# define OSAL_NV_CHECK_BUS_VOLTAGE (HalAdcCheckVdd(VDD_MIN_FLASH)) +#elif defined HAL_MCU_CC2533 +# define OSAL_NV_CHECK_BUS_VOLTAGE (HalBatMonRead( HAL_BATMON_MIN_FLASH )) +#else +// The radio chip does not support voltage monitoring +# define OSAL_NV_CHECK_BUS_VOLTAGE TRUE +#endif + +/********************************************************************* + * TYPEDEFS + */ + +// NV item header structure +typedef struct +{ + uint16 id; + uint16 len; +} osalNvItemHdr_t; +// Note that osalSnvId_t and osalSnvLen_t cannot be bigger than uint16 + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +extern bool HalAdcCheckVdd(uint8 limit); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +#ifndef OAD_KEEP_NV_PAGES +// When NV pages are to remain intact during OAD download, +// the image itself should not include NV pages. +#pragma location="BLENV_ADDRESS_SPACE" +__no_init uint8 _nvBuf[OSAL_NV_PAGES_USED * OSAL_NV_PAGE_SIZE]; +#pragma required=_nvBuf +#endif // OAD_KEEP_NV_PAGES + +#if defined MAKE_CRC_SHDW +#pragma location="CRC_SHDW" +const CODE uint16 _crcShdw = 0xFFFF; +#pragma required=_crcShdw +#endif + +/********************************************************************* + * LOCAL VARIABLES + */ + +// active page +static uint8 activePg; + +// active page offset +static uint16 pgOff; + +// flag to indicate that an error has occurred while writing to or erasing the +// flash device. Once this flag indicates failure, it is unsafe to attempt +// another write or erase. +static uint8 failF; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 initNV( void ); + +static void setActivePage( uint8 pg ); +static void setXferPage(void); +static void erasePage( uint8 pg ); +static void cleanErasedPage( uint8 pg ); +static void findOffset( void ); +static void compactPage( uint8 pg ); + +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ); +static void writeWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ); + + +// NOTE: Triggering erase upon power up may cause fast aging of the flash device +// if there is power switch debounce issue, etc. +// Improvement of this is to add a certain delay upon power up before +// osal_nv_init() is called. + +/********************************************************************* + * @fn initNV + * + * @brief Initialize the NV flash pages. + * + * @param none + * + * @return TRUE if initialization succeeds. FALSE, otherwise. + */ +static uint8 initNV( void ) +{ + uint32 pgHdr; + uint8 xferPg = OSAL_NV_PAGE_NULL; + uint8 pg; + + failF = FALSE; + activePg = OSAL_NV_PAGE_NULL; + + // Pick active page and clean up erased page if necessary + for ( pg = OSAL_NV_PAGE_BEG; pg <= OSAL_NV_PAGE_END; pg++ ) + { + HalFlashRead(pg, OSAL_NV_PAGE_HDR_OFFSET, (uint8 *)(&pgHdr), OSAL_NV_PAGE_HDR_SIZE); + + if ( pgHdr == OSAL_NV_ACTIVE_PAGE_STATE) + { + if (activePg != OSAL_NV_PAGE_NULL) + { + // Both pages are active only when power failed during flash erase and + // with very low probability. + // As it is hard (code size intensive) to figure out which page is the real active page, + // and theoretically impossible as well in lowest probability, erase both pages + // in this case + cleanErasedPage(activePg); + cleanErasedPage(pg); + activePg = OSAL_NV_PAGE_NULL; + } + else + { + activePg = pg; + } + } + else if ( pgHdr == OSAL_NV_XFER_PAGE_STATE) + { + xferPg = pg; + } + else + { + // Erase this page if it is not erased. + // This is to ensure that any page that were in the middle of + // compacting gets erased. + cleanErasedPage(pg); + } + } + + if (activePg == OSAL_NV_PAGE_NULL) + { + if (xferPg == OSAL_NV_PAGE_NULL) + { + // Both pages are erased. This must be initial state. + // Pick one page as active page. + setActivePage(OSAL_NV_PAGE_BEG); + pgOff = OSAL_NV_PAGE_HDR_SIZE; + + // If setting active page from a completely erased page failed, + // it is not recommended to operate any further. + // Other cases, even if non-active page is corrupt, NV module can still read + // the active page content and hence this function could return TRUE. + return (!failF); + } + else + { + // Compacting a page hasn't completed in previous power cycle. + // Complete the compacting. + activePg = xferPg; + findOffset(); + + compactPage(xferPg); + } + } + else + { + if (xferPg != OSAL_NV_PAGE_NULL) + { + // Compacting has completed except for the final step of erasing + // the xferPage. + erasePage(xferPg); + } + + // find the active page offset to write a new variable location item + findOffset(); + } + + return TRUE; +} + +/********************************************************************* + * @fn setActivePage + * + * @brief Set page header active state to be active. + * + * @param pg - Valid NV page to activate. + * + * @return none + */ +static void setActivePage( uint8 pg ) +{ + uint32 pgHdr; + + pgHdr = OSAL_NV_ACTIVE_PAGE_STATE; + + writeWord( pg, OSAL_NV_PAGE_HDR_OFFSET, (uint8*) &pgHdr ); + if (!failF) + { + activePg = pg; + } +} + +/********************************************************************* + * @fn setXferPage + * + * @brief Set active page header state to be transfer state. + * + * @param none + * + * @return none + */ +static void setXferPage(void) +{ + uint32 pgHdr; + + // erase difference bit between active state and xfer state + pgHdr = OSAL_NV_XFER_PAGE_STATE; + + writeWord( activePg, OSAL_NV_PAGE_HDR_OFFSET, (uint8*)&pgHdr ); +} + +/********************************************************************* + * @fn erasePage + * + * @brief Erases a page in Flash. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void erasePage( uint8 pg ) +{ + if ( !OSAL_NV_CHECK_BUS_VOLTAGE || failF) + { + failF = TRUE; + return; + } + + HalFlashErase(pg); + + { + // Verify the erase operation + uint16 offset; + uint8 tmp; + + for (offset = 0; offset < OSAL_NV_PAGE_SIZE; offset ++) + { + HalFlashRead(pg, offset, &tmp, 1); + if (tmp != OSAL_NV_ERASED) + { + failF = TRUE; + break; + } + } + } +} + +/********************************************************************* + * @fn cleanErasedPage + * + * @brief Erases a page in Flash if the page is not completely erased. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void cleanErasedPage( uint8 pg ) +{ + uint8 buf; + uint16 offset; + + for (offset = 0; offset < OSAL_NV_PAGE_SIZE; offset ++) + { + HalFlashRead(pg, offset, &buf, 1); + if (buf != OSAL_NV_ERASED) + { + erasePage(pg); + break; + } + } +} + +/********************************************************************* + * @fn findOffset + * + * @brief find an offset of an empty space in active page + * where to write a new item to. + * + * @param None + * + * @return none + */ +static void findOffset(void) +{ + uint16 offset; + for (offset = OSAL_NV_PAGE_SIZE - OSAL_NV_WORD_SIZE; + offset >= OSAL_NV_PAGE_HDR_SIZE; + offset -= OSAL_NV_WORD_SIZE) + { + uint32 tmp; + + HalFlashRead(activePg, offset, (uint8 *)&tmp, OSAL_NV_WORD_SIZE); + if (tmp != 0xFFFFFFFF) + { + break; + } + } + pgOff = offset + OSAL_NV_WORD_SIZE; +} + +/********************************************************************* + * @fn findItem + * + * @brief find a valid item from a designated page and offset + * + * @param pg - NV page + * @param offset - offset in the NV page from where to start + * search up. + * Usually this paramter is set to the empty space + * offset. + * @param id - NV item ID to search for + * + * @return offset of the item, 0 when not found + */ +static uint16 findItem(uint8 pg, uint16 offset, osalSnvId_t id) +{ + offset -= OSAL_NV_WORD_SIZE; + + while (offset >= OSAL_NV_PAGE_HDR_SIZE) + { + osalNvItemHdr_t hdr; + + HalFlashRead(pg, offset, (uint8 *) &hdr, OSAL_NV_WORD_SIZE); + + if (hdr.id == id) + { + // item found + // length field could be corrupt. Mask invalid length mark. + uint8 len = hdr.len & ~OSAL_NV_INVALID_LEN_MARK; + return offset - len; + } + else if (hdr.len & OSAL_NV_INVALID_LEN_MARK) + { + offset -= OSAL_NV_WORD_SIZE; + } + else + { + // valid length field + if (hdr.len + OSAL_NV_WORD_SIZE <= offset) + { + // valid length + offset -= hdr.len + OSAL_NV_WORD_SIZE; + } + else + { + // active page is corrupt + // This could happen if NV initialization failed upon failure to erase + // page and active page is set to uncleanly erased page. + HAL_ASSERT_FORCED(); + return 0; + } + } + } + return 0; +} + +/********************************************************************* + * @fn writeItem + * + * @brief Write a data item to NV. Function can write an entire item to NV + * + * @param pg - Page number + * @param offset - offset within the NV page where to write the new item + * @param id - NV item ID + * @param alignedLen - Length of data to write, alinged in flash word + * boundary + * @param *pBuf - Data to write. + * + * @return none + */ +static void writeItem( uint8 pg, uint16 offset, osalSnvId_t id, uint16 alignedLen, uint8 *pBuf ) +{ + osalNvItemHdr_t hdr; + + hdr.id = 0xFFFF; + hdr.len = alignedLen | OSAL_NV_INVALID_LEN_MARK; + + // Write the len portion of the header first + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // remove invalid len mark + hdr.len &= ~OSAL_NV_INVALID_LEN_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // Copy over the data + writeWordM(pg, offset, pBuf, alignedLen / OSAL_NV_WORD_SIZE); + + // value is valid. Write header except for the most significant bit. + hdr.id = id | OSAL_NV_INVALID_ID_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // write the most significant bit + hdr.id &= ~OSAL_NV_INVALID_ID_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); +} + +/********************************************************************* + * @fn xferItem + * + * @brief Copy an NV item from the active page to a designated page. + * + * @param pg - NV page where to copy the item to. + * @param offset - NV page offset where to copy the item to. + * @param alignedLen - Length of data to write, aligned in flash word + * boundary. + * @param srcOff - NV page offset of the original data in active page + * + * @return none. + */ +static void xferItem( uint8 pg, uint16 offset, uint16 alignedLen, uint16 srcOff ) +{ + uint8 tmp[OSAL_NV_WORD_SIZE]; + uint16 i = 0; + + // Copy over the data + while (i <= alignedLen) + { + HalFlashRead(activePg, srcOff + i, tmp, OSAL_NV_WORD_SIZE); + writeWord(pg, offset + i, tmp); + + i += OSAL_NV_WORD_SIZE; + } +} + +/********************************************************************* + * @fn compactPage + * + * @brief Compacts the page specified. + * + * @param srcPg - Valid NV page to compact from. + * The page must have changed its state (header) to xfer state + * prior to this function call. This function will not + * modify the state of its header to xfer state before starting + * to compact. + * + * @return none. + */ +static void compactPage( uint8 srcPg ) +{ + uint16 srcOff, dstOff; + uint8 dstPg; + osalSnvId_t lastId = (osalSnvId_t) 0xFFFF; + + dstPg = (srcPg == OSAL_NV_PAGE_BEG)? OSAL_NV_PAGE_END : OSAL_NV_PAGE_BEG; + + dstOff = OSAL_NV_PAGE_HDR_SIZE; + + // Read from the latest value + srcOff = pgOff - sizeof(osalNvItemHdr_t); + + while (srcOff >= OSAL_NV_PAGE_HDR_SIZE) + { + osalNvItemHdr_t hdr; + + if (failF) + { + // Failure during transfer item will make next findItem error prone. + return; + } + + HalFlashRead(srcPg, srcOff, (uint8 *) &hdr, OSAL_NV_WORD_SIZE); + + if (hdr.id == 0xFFFF) + { + // Invalid entry. Skip this one. + if (hdr.len & OSAL_NV_INVALID_LEN_MARK) + { + srcOff -= OSAL_NV_WORD_SIZE; + } + else + { + if (hdr.len + OSAL_NV_WORD_SIZE <= srcOff) + { + srcOff -= hdr.len + OSAL_NV_WORD_SIZE; + } + else + { + // invalid length. Source page must be a corrupt page. + // This is possible only if the NV initialization failed upon erasing + // what is selected as active page. + // This is supposed to be a very rare case, as power should be + // shutdown exactly during erase and then the page header is + // still retained as either the Xfer or the Active state. + + // For production code, it might be useful to attempt to erase the page + // so that at next power cycle at least the device is runnable + // (with all entries removed). + // However, it might be still better not to attempt erasing the page + // just to see if this very rare case actually happened. + //erasePage(srcPg); + + HAL_ASSERT_FORCED(); + return; + } + } + + continue; + } + + // Consider only valid item + if (!(hdr.id & OSAL_NV_INVALID_ID_MARK) && hdr.id != lastId) + { + // lastId is used to speed up compacting in case the same item ID + // items were neighboring each other contiguously. + lastId = (osalSnvId_t) hdr.id; + + // Check if the latest value of the item was already written + if (findItem(dstPg, dstOff, lastId) == 0) + { + // This item was not copied over yet. + // This must be the latest value. + // Write the latest value to the destination page + + xferItem(dstPg, dstOff, hdr.len, srcOff - hdr.len); + + dstOff += hdr.len + OSAL_NV_WORD_SIZE; + } + } + srcOff -= hdr.len + OSAL_NV_WORD_SIZE; + } + + // All items copied. + // Activate the new page + setActivePage(dstPg); + + if (!failF) + { + pgOff = dstOff; // update active page offset + } + + // Erase the currently active page + erasePage(srcPg); +} + +/********************************************************************* + * @fn verifyWordM + * + * @brief verify the written word. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to verify. + * + * @return none + */ +static void verifyWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ) +{ + uint8 tmp[OSAL_NV_WORD_SIZE]; + + while (cnt--) + { + // Reading byte per byte will reduce code size but will slow down + // and not sure it will meet the timing requirements. + HalFlashRead(pg, offset, tmp, OSAL_NV_WORD_SIZE); + if (FALSE == osal_memcmp(tmp, pBuf, OSAL_NV_WORD_SIZE)) + { + failF = TRUE; + return; + } + offset += OSAL_NV_WORD_SIZE; + pBuf += OSAL_NV_WORD_SIZE; + } +} + +/********************************************************************* + * @fn writeWord + * + * @brief Writes a Flash-WORD to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * + * @return none + */ +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, pBuf, 1); + verifyWordM(pg, offset, pBuf, 1); + } +} + +/********************************************************************* + * @fn writeWordM + * + * @brief Writes multiple Flash-WORDs to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param buf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to write. + * + * @return none + */ +static void writeWordM( uint8 pg, uint16 offset, uint8 *buf, osalSnvLen_t cnt ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, buf, cnt); + verifyWordM(pg, offset, buf, cnt); + } +} + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +uint8 osal_snv_init( void ) +{ + if (!initNV()) + { + // NV initialization failed + HAL_ASSERT_FORCED(); + + return FAILURE; + } + + return SUCCESS; +} + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 alignedLen; + + { + uint16 offset = findItem(activePg, pgOff, id); + + if (offset > 0) + { + uint8 tmp; + osalSnvLen_t i; + + for (i = 0; i < len; i++) + { + HalFlashRead(activePg, offset, &tmp, 1); + if (tmp != ((uint8 *)pBuf)[i]) + { + break; + } + offset++; + } + + if (i == len) + { + // Changed value is the same value as before. + // Return here instead of re-writing the same value to NV. + return SUCCESS; + } + } + } + + alignedLen = ((len + OSAL_NV_WORD_SIZE - 1) / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE; + + if ( pgOff + alignedLen + OSAL_NV_WORD_SIZE > OSAL_NV_PAGE_SIZE ) + { + setXferPage(); + compactPage(activePg); + } + + // pBuf shall be referenced beyond its valid length to save code size. + writeItem(activePg, pgOff, id, alignedLen, pBuf); + if (failF) + { + return NV_OPER_FAILED; + } + + pgOff += alignedLen + OSAL_NV_WORD_SIZE; + + return SUCCESS; +} + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 offset = findItem(activePg, pgOff, id); + + if (offset != 0) + { + HalFlashRead(activePg, offset, pBuf, len); + return SUCCESS; + } + return NV_OPER_FAILED; +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Components/services/saddr/saddr.h b/Firmware/Radio/Components/services/saddr/saddr.h new file mode 100644 index 0000000..0b4f646 --- /dev/null +++ b/Firmware/Radio/Components/services/saddr/saddr.h @@ -0,0 +1,175 @@ +/************************************************************************************************** + Filename: saddr.h + Revised: $Date: 2009-12-10 08:32:15 -0800 (Thu, 10 Dec 2009) $ + Revision: $Revision: 21311 $ + + Description: Zigbee and 802.15.4 device address utility functions. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SADDR_H +#define SADDR_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************************************************************** + * MACROS + */ + +/* Extended address length */ +#define SADDR_EXT_LEN 8 + +/* Address modes */ +#define SADDR_MODE_NONE 0 /* Address not present */ +#define SADDR_MODE_SHORT 2 /* Short address */ +#define SADDR_MODE_EXT 3 /* Extended address */ + +/**************************************************************************** + * TYPEDEFS + */ + +/* Extended address */ +typedef uint8 sAddrExt_t[SADDR_EXT_LEN]; + +/* Combined short/extended device address */ +typedef struct +{ + union + { + uint16 shortAddr; /* Short address */ + sAddrExt_t extAddr; /* Extended address */ + } addr; + uint8 addrMode; /* Address mode */ +} sAddr_t; + +/**************************************************************************** + * @fn sAddrCmp + * + * @brief Compare two device addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrCmp(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrIden + * + * @brief Check if two device addresses are identical. + * + * This routine is virtually the same as sAddrCmp, which is used + * to determine if two different addresses are the same. However, + * this routine can be used to determine if an address is the + * same as a previously stored address. The key difference is in + * the former case, if the address mode is "none", then the + * assumption is that the two addresses can not be the same. But + * in the latter case, the address mode itself is being compared. + * So two addresses can be identical even if the address mode is + * "none", as long as the address mode of both addresses being + * compared is the "none". + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are identical, FALSE otherwise + */ +extern bool sAddrIden(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrCpy + * + * @brief Copy a device address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return None. + */ +extern void sAddrCpy(sAddr_t *pDest, const sAddr_t *pSrc); + +/**************************************************************************** + * @fn sAddrExtCmp + * + * @brief Compare two extended addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrExtCmp(const uint8 * pAddr1, const uint8 * pAddr2); + +/**************************************************************************** + * @fn sAddrExtCpy + * + * @brief Copy an extended address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return pDest + SADDR_EXT_LEN. + */ +void *sAddrExtCpy(uint8 * pDest, const uint8 * pSrc); + +#ifdef __cplusplus +} +#endif + +#endif /* SADDR_H */ diff --git a/Firmware/Radio/Include/gapgattserver.h b/Firmware/Radio/Include/gapgattserver.h new file mode 100644 index 0000000..0da3682 --- /dev/null +++ b/Firmware/Radio/Include/gapgattserver.h @@ -0,0 +1,206 @@ +/************************************************************************************************** + Filename: gapgattserver.h + Revised: $Date: 2009-10-21 07:25:22 -0700 (Wed, 21 Oct 2009) $ + Revision: $Revision: 20946 $ + + Description: This file contains GAP GATT attribute definitions + and prototypes. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GAPGATTSERVER_H +#define GAPGATTSERVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +#define GAP_DEVICE_NAME_LEN (20+1) + +// Privacy Flag States +#define GAP_PRIVACY_DISABLED 0x00 +#define GAP_PRIVACY_ENABLED 0x01 + +// GAP GATT Server Parameters +#define GGS_DEVICE_NAME_ATT 0 // RW uint8[GAP_DEVICE_NAME_LEN] +#define GGS_APPEARANCE_ATT 1 // RW uint16 +#define GGS_PERI_PRIVACY_FLAG_ATT 2 // RW uint8 +#define GGS_RECONNCT_ADDR_ATT 3 // RW uint8[B_ADDR_LEN] +#define GGS_PERI_CONN_PARAM_ATT 4 // RW sizeof(gapPeriConnectParams_t) +#define GGS_PERI_PRIVACY_FLAG_PROPS 5 // RW uint8 +#define GGS_W_PERMIT_DEVICE_NAME_ATT 6 // W uint8 +#define GGS_W_PERMIT_APPEARANCE_ATT 7 // W uint8 + +// GAP Services bit fields +#define GAP_SERVICE 0x00000001 + +// Attribute ID used with application's callback when attribute value is changed OTA +#define GGS_DEVICE_NAME_ID 0 +#define GGS_APPEARANCE_ID 1 + +#if defined ( TESTMODES ) + // GGS TestModes + #define GGS_TESTMODE_OFF 0 // No Test mode + #define GGS_TESTMODE_W_PERMIT_DEVICE_NAME 1 // Make Device Name attribute writable + #define GGS_TESTMODE_W_PERMIT_APPEARANCE 2 // Make Appearance attribute writable +#endif // TESTMODES + +/********************************************************************* + * TYPEDEFS + */ +// Callback to notify when attribute value is changed over the air. +typedef void (*ggsAttrValueChange_t)( uint8 attrId ); + +// GAP GATT Server callback structure +typedef struct +{ + ggsAttrValueChange_t pfnAttrValueChange; // When attribute value is changed OTA +} ggsAppCBs_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8 param, uint8 len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8 param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32 services ); + +/** + * @brief Delete function for the GAP GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GGS_DelService( uint32 services ); + +/** + * @brief Registers the application callback function. + * + * Note: Callback registration is needed only when the + * Device Name is made writable. The application + * will be notified when the Device Name is changed + * over the air. + * + * @param appCallbacks - pointer to application callbacks. + * + * @return none + */ +extern void GGS_RegisterAppCBs( ggsAppCBs_t *appCallbacks ); + +/** + * @brief Set a GGS Parameter value. Use this function to change + * the default GGS parameter values. + * + * @param value - new GGS param value + * + * @return void + */ +extern void GGS_SetParamValue( uint16 value ); + +/** + * @brief Get a GGS Parameter value. + * + * @param none + * + * @return GGS Parameter value + */ +extern uint16 GGS_GetParamValue( void ); + +/********************************************************************* + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPGATTSERVER_H */ diff --git a/Firmware/Radio/Include/gattservapp.h b/Firmware/Radio/Include/gattservapp.h new file mode 100644 index 0000000..5b6d6fd --- /dev/null +++ b/Firmware/Radio/Include/gattservapp.h @@ -0,0 +1,690 @@ +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GATTSERVAPP_H +#define GATTSERVAPP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + +#define GATT_CLIENT_CHAR_CFG_UPDATED_EVENT 0x00 //!< Sent when a Client Characteristic Configuration is updated. This event is sent as an OSAL message defined as gattCharCfgUpdatedEvent_t. + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#define GATT_PROP_BCAST 0x01 //!< Permits broadcasts of the Characteristic Value +#define GATT_PROP_READ 0x02 //!< Permits reads of the Characteristic Value +#define GATT_PROP_WRITE_NO_RSP 0x04 //!< Permits writes of the Characteristic Value without response +#define GATT_PROP_WRITE 0x08 //!< Permits writes of the Characteristic Value with response +#define GATT_PROP_NOTIFY 0x10 //!< Permits notifications of a Characteristic Value without acknowledgement +#define GATT_PROP_INDICATE 0x20 //!< Permits indications of a Characteristic Value with acknowledgement +#define GATT_PROP_AUTHEN 0x40 //!< Permits signed writes to the Characteristic Value +#define GATT_PROP_EXTENDED 0x80 //!< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + +#define GATT_EXT_PROP_RELIABLE_WRITE 0x0001 //!< Permits reliable writes of the Characteristic Value +#define GATT_EXT_PROP_WRITABLE_AUX 0x0002 //!< Permits writes to the characteristic descriptor + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + +#define GATT_CLIENT_CFG_NOTIFY 0x0001 //!< The Characteristic Value shall be notified +#define GATT_CLIENT_CFG_INDICATE 0x0002 //!< The Characteristic Value shall be indicated + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + +#define GATT_SERV_CFG_BCAST 0x0001 //!< The Characteristic Value shall be broadcast when the server is in the broadcast procedure if advertising data resources are available + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + +#define GATT_CFG_NO_OPERATION 0x0000 // No operation + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#define GATT_FORMAT_BOOL 0x01 //!< Unsigned 1 bit; 0 = false, 1 = true +#define GATT_FORMAT_2BIT 0x02 //!< Unsigned 2 bit integer +#define GATT_FORMAT_NIBBLE 0x03 //!< Unsigned 4 bit integer +#define GATT_FORMAT_UINT8 0x04 //!< Unsigned 8 bit integer +#define GATT_FORMAT_UINT12 0x05 //!< Unsigned 12 bit integer +#define GATT_FORMAT_UINT16 0x06 //!< Unsigned 16 bit integer +#define GATT_FORMAT_UINT24 0x07 //!< Unsigned 24 bit integer +#define GATT_FORMAT_UINT32 0x08 //!< Unsigned 32 bit integer +#define GATT_FORMAT_UINT48 0x09 //!< Unsigned 48 bit integer +#define GATT_FORMAT_UINT64 0x0a //!< Unsigned 64 bit integer +#define GATT_FORMAT_UINT128 0x0b //!< Unsigned 128 bit integer +#define GATT_FORMAT_SINT8 0x0c //!< Signed 8 bit integer +#define GATT_FORMAT_SINT12 0x0d //!< Signed 12 bit integer +#define GATT_FORMAT_SINT16 0x0e //!< Signed 16 bit integer +#define GATT_FORMAT_SINT24 0x0f //!< Signed 24 bit integer +#define GATT_FORMAT_SINT32 0x10 //!< Signed 32 bit integer +#define GATT_FORMAT_SINT48 0x11 //!< Signed 48 bit integer +#define GATT_FORMAT_SINT64 0x12 //!< Signed 64 bit integer +#define GATT_FORMAT_SINT128 0x13 //!< Signed 128 bit integer +#define GATT_FORMAT_FLOAT32 0x14 //!< IEEE-754 32 bit floating point +#define GATT_FORMAT_FLOAT64 0x15 //!< IEEE-754 64 bit floating point +#define GATT_FORMAT_SFLOAT 0x16 //!< IEEE-11073 16 bit SFLOAT +#define GATT_FORMAT_FLOAT 0x17 //!< IEEE-11073 32 bit FLOAT +#define GATT_FORMAT_DUINT16 0x18 //!< IEEE-20601 format +#define GATT_FORMAT_UTF8S 0x19 //!< UTF-8 string +#define GATT_FORMAT_UTF16S 0x1a //!< UTF-16 string +#define GATT_FORMAT_STRUCT 0x1b //!< Opaque structure + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + +#define GATT_NS_NONE 0x00 //!< No namespace +#define GATT_NS_BT_SIG 0x01 //!< Bluetooth SIG namespace + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + +#define GATT_NS_BT_DESC_UNKNOWN 0x0000 //!< The description is unknown + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields +#define GATT_ALL_SERVICES 0xFFFFFFFF + +// GATT Services bit fields +#define GATT_SERVICE 0x00000001 + +#if defined ( TESTMODES ) + // GATT Test Modes + #define GATT_TESTMODE_OFF 0 // Test mode off + #define GATT_TESTMODE_NO_RSP 1 // Ignore incoming request + #define GATT_TESTMODE_PREPARE_WRITE 2 // Forward Prepare Write Request right away + #define GATT_TESTMODE_MAX_MTU_SIZE 3 // Use Max ATT MTU size with Exchange MTU Rsp + #define GATT_TESTMODE_CORRUPT_PW_DATA 4 // Corrupt incoming Prepare Write Request data +#endif + +// GATT Server Parameters +#define GATT_PARAM_NUM_PREPARE_WRITES 0 // RW uint8 + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table +#define GATT_NUM_ATTRS( attrs ) ( sizeof( attrs ) / sizeof( gattAttribute_t ) ) + +// The handle of a service is the handle of the first attribute +#define GATT_SERVICE_HANDLE( attrs ) ( (attrs)[0].handle ) + +// The handle of the first included service (i = 1) is the value of the second attribute +#define GATT_INCLUDED_HANDLE( attrs, i ) ( *((uint16 *)((attrs)[(i)].pValue)) ) + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + CONST gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATTSERVAPP_H */ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE.lib new file mode 100644 index 0000000..8fc607c Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib new file mode 100644 index 0000000..1d53740 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib new file mode 100644 index 0000000..10f32b8 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib new file mode 100644 index 0000000..dd1be1c Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib new file mode 100644 index 0000000..75e99b3 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib new file mode 100644 index 0000000..748d342 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib new file mode 100644 index 0000000..c0564bc Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib differ diff --git a/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib new file mode 100644 index 0000000..c361119 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE.lib new file mode 100644 index 0000000..1bf242b Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib new file mode 100644 index 0000000..ce7d3dc Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib new file mode 100644 index 0000000..4e04365 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib new file mode 100644 index 0000000..d189801 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib new file mode 100644 index 0000000..f8b9347 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib new file mode 100644 index 0000000..c4eb2a0 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib new file mode 100644 index 0000000..db14836 Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib differ diff --git a/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib new file mode 100644 index 0000000..ffca70f Binary files /dev/null and b/Firmware/Radio/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib differ diff --git a/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib new file mode 100644 index 0000000..7f37c4c Binary files /dev/null and b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib differ diff --git a/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib new file mode 100644 index 0000000..1862f3a Binary files /dev/null and b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib differ diff --git a/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib new file mode 100644 index 0000000..f881751 Binary files /dev/null and b/Firmware/Radio/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib differ diff --git a/Firmware/Radio/Profiles/Accelerometer/accelerometer.c b/Firmware/Radio/Profiles/Accelerometer/accelerometer.c new file mode 100644 index 0000000..29e39cf --- /dev/null +++ b/Firmware/Radio/Profiles/Accelerometer/accelerometer.c @@ -0,0 +1,728 @@ +/************************************************************************************************** + Filename: accelerometer.c + Revised: $Date: 2011-11-21 15:26:10 -0800 (Mon, 21 Nov 2011) $ + Revision: $Revision: 28439 $ + + Description: Accelerometer Profile + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "accelerometer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 19 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Accelerometer Service UUID +CONST uint8 accServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_SERVICE_UUID), HI_UINT16(ACCEL_SERVICE_UUID) +}; + +// Accelerometer Enabler UUID +CONST uint8 accEnablerUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_ENABLER_UUID), HI_UINT16(ACCEL_ENABLER_UUID) +}; + +// Accelerometer Range UUID +CONST uint8 rangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_RANGE_UUID), HI_UINT16(ACCEL_RANGE_UUID) +}; + +// Accelerometer X-Axis Data UUID +CONST uint8 xUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_X_UUID), HI_UINT16(ACCEL_X_UUID) +}; + +// Accelerometer Y-Axis Data UUID +CONST uint8 yUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_Y_UUID), HI_UINT16(ACCEL_Y_UUID) +}; + +// Accelerometer Z-Axis Data UUID +CONST uint8 zUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_Z_UUID), HI_UINT16(ACCEL_Z_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static accelCBs_t *accel_AppCBs = NULL; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// Accelerometer Service attribute +static CONST gattAttrType_t accelService = { ATT_BT_UUID_SIZE, accServUUID }; + + +// Enabler Characteristic Properties +static uint8 accelEnabledCharProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Enabler Characteristic Value +static uint8 accelEnabled = FALSE; + +// Enabler Characteristic user description +static uint8 accelEnabledUserDesc[14] = "Accel Enable\0"; + + +// Range Characteristic Properties +static uint8 accelRangeCharProps = GATT_PROP_READ; + +// Range Characteristic Value +static uint16 accelRange = ACCEL_RANGE_2G; + +// Range Characteristic user description +static uint8 accelRangeUserDesc[13] = "Accel Range\0"; + + +// Accel Coordinate Characteristic Properties +static uint8 accelXCharProps = GATT_PROP_NOTIFY; +static uint8 accelYCharProps = GATT_PROP_NOTIFY; +static uint8 accelZCharProps = GATT_PROP_NOTIFY; + +// Accel Coordinate Characteristics +static int8 accelXCoordinates = 0; +static int8 accelYCoordinates = 0; +static int8 accelZCoordinates = 0; + +// Client Characteristic configuration. Each client has its own instantiation +// of the Client Characteristic Configuration. Reads of the Client Characteristic +// Configuration only shows the configuration for that client and writes only +// affect the configuration of that client. + +// Accel Coordinate Characteristic Configs +static gattCharCfg_t accelXConfigCoordinates[GATT_MAX_NUM_CONN]; +static gattCharCfg_t accelYConfigCoordinates[GATT_MAX_NUM_CONN]; +static gattCharCfg_t accelZConfigCoordinates[GATT_MAX_NUM_CONN]; + +// Accel Coordinate Characteristic user descriptions +static uint8 accelXCharUserDesc[20] = "Accel X-Coordinate\0"; +static uint8 accelYCharUserDesc[20] = "Accel Y-Coordinate\0"; +static uint8 accelZCharUserDesc[20] = "Accel Z-Coordinate\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t accelAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Accelerometer Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&accelService /* pValue */ + }, + + // Accel Enabler Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelEnabledCharProps + }, + + // Accelerometer Enable Characteristic Value + { + { ATT_BT_UUID_SIZE, accEnablerUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accelEnabled + }, + + // Accelerometer Enable User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8*)&accelEnabledUserDesc + }, + + // Accel Range Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelRangeCharProps + }, + + // Accelerometer Range Char Value + { + { ATT_BT_UUID_SIZE, rangeUUID }, + GATT_PERMIT_READ, + 0, + (uint8*)&accelRange + }, + + // Accelerometer Range User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelRangeUserDesc + }, + + // X-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelXCharProps + }, + + // X-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, xUUID }, + 0, + 0, + (uint8 *)&accelXCoordinates + }, + + // X-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelXConfigCoordinates + }, + + // X-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelXCharUserDesc + }, + + // Y-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelYCharProps + }, + + // Y-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, yUUID }, + 0, + 0, + (uint8 *)&accelYCoordinates + }, + + // Y-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelYConfigCoordinates + }, + + // Y-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelYCharUserDesc + }, + + // Z-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelZCharProps + }, + + // Z-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, zUUID }, + 0, + 0, + (uint8 *)&accelZCoordinates + }, + + // Z-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelZConfigCoordinates + }, + + // Z-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelZCharUserDesc + }, + +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 accel_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t accel_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void accel_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Accelerometer Service Callbacks +CONST gattServiceCBs_t accelCBs = +{ + accel_ReadAttrCB, // Read callback function pointer + accel_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Accel_AddService + * + * @brief Initializes the Accelerometer service by + * registering GATT attributes with the GATT server. Only + * call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Accel_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelXConfigCoordinates ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelYConfigCoordinates ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelZConfigCoordinates ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( accel_HandleConnStatusCB ); + + if ( services & ACCEL_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( accelAttrTbl, + GATT_NUM_ATTRS( accelAttrTbl ), + &accelCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Accel_RegisterAppCBs + * + * @brief Does the profile initialization. Only call this function + * once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + accel_AppCBs = appCallbacks; + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + + +/********************************************************************* + * @fn Accel_SetParameter + * + * @brief Set an Accelerometer Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCEL_ENABLER: + if ( len == sizeof ( uint8 ) ) + { + accelEnabled = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_RANGE: + if ( (len == sizeof ( uint16 )) && ((*((uint8*)value)) <= ACCEL_RANGE_8G) ) + { + accelRange = *((uint16*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_X_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelXCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelXConfigCoordinates, (uint8 *)&accelXCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_Y_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelYCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelYConfigCoordinates, (uint8 *)&accelYCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_Z_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelZCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelZConfigCoordinates, (uint8 *)&accelZCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Accel_GetParameter + * + * @brief Get an Accelerometer Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case ACCEL_ENABLER: + *((uint8*)value) = accelEnabled; + break; + + case ACCEL_RANGE: + *((uint16*)value) = accelRange; + break; + + case ACCEL_X_ATTR: + *((int8*)value) = accelXCoordinates; + break; + + case ACCEL_Y_ATTR: + *((int8*)value) = accelYCoordinates; + break; + + case ACCEL_Z_ATTR: + *((int8*)value) = accelZCoordinates; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn accel_ReadAttr + * + * @brief Read an attribute. + * + * @param pAttr - pointer to attribute + * @param pLen - length of data to be read + * @param pValue - pointer to data to be read + * @param signature - whether to include Authentication Signature + * + * @return Success or Failure + */ +static uint8 accel_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + case ACCEL_RANGE_UUID: + *pLen = 2; + pValue[0] = LO_UINT16( *((uint16 *)pAttr->pValue) ); + pValue[1] = HI_UINT16( *((uint16 *)pAttr->pValue) ); + break; + + case ACCEL_ENABLER_UUID: + case ACCEL_X_UUID: + case ACCEL_Y_UUID: + case ACCEL_Z_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + + return ( status ); +} + +/********************************************************************* + * @fn accel_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle – connection message was received on + * @param pReq - pointer to request + * + * @return Success or Failure + */ +static bStatus_t accel_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notify = 0xFF; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case ACCEL_ENABLER_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len > 1 ) + status = ATT_ERR_INVALID_VALUE_SIZE; + else if ( pValue[0] != FALSE && pValue[0] != TRUE ) + status = ATT_ERR_INVALID_VALUE; + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + notify = ACCEL_ENABLER; + } + + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If an attribute changed then callback function to notify application of change + if ( (notify != 0xFF) && accel_AppCBs && accel_AppCBs->pfnAccelEnabler ) + accel_AppCBs->pfnAccelEnabler(); + + return ( status ); +} + +/********************************************************************* + * @fn accel_HandleConnStatusCB + * + * @brief Accelerometer Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void accel_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, accelXConfigCoordinates ); + GATTServApp_InitCharCfg( connHandle, accelYConfigCoordinates ); + GATTServApp_InitCharCfg( connHandle, accelZConfigCoordinates ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Accelerometer/accelerometer.h b/Firmware/Radio/Profiles/Accelerometer/accelerometer.h new file mode 100644 index 0000000..71b71bd --- /dev/null +++ b/Firmware/Radio/Profiles/Accelerometer/accelerometer.h @@ -0,0 +1,153 @@ +/************************************************************************************************** + Filename: accelerometer.h + Revised: $Date: 2011-11-11 15:13:08 -0800 (Fri, 11 Nov 2011) $ + Revision: $Revision: 28319 $ + + Description: This file contains Accelerometer Profile header file. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ACCELEROMETER_H +#define ACCELEROMETER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define ACCEL_ENABLER 0 // RW uint8 - Profile Attribute value +#define ACCEL_X_ATTR 1 // RW int16 - Profile Attribute value +#define ACCEL_Y_ATTR 2 // RW int16 - Profile Attribute value +#define ACCEL_Z_ATTR 3 // RW int16 - Profile Attribute value +#define ACCEL_RANGE 4 // RW uint16 - Profile Attribute value + +// Profile UUIDs +#define ACCEL_ENABLER_UUID 0xFFA1 +#define ACCEL_RANGE_UUID 0xFFA2 +#define ACCEL_X_UUID 0xFFA3 +#define ACCEL_Y_UUID 0xFFA4 +#define ACCEL_Z_UUID 0xFFA5 + +// Accelerometer Service UUID +#define ACCEL_SERVICE_UUID 0xFFA0 + +// Profile Range Values +#define ACCEL_RANGE_2G 20 +#define ACCEL_RANGE_8G 80 + +// Accelerometer Profile Services bit fields +#define ACCEL_SERVICE 0x00000001 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ +// Callback when the device has been started. Callback event to +// the ask for a battery check. +typedef NULL_OK void (*accelEnabler_t)( void ); + +typedef struct +{ + accelEnabler_t pfnAccelEnabler; // Called when Enabler attribute changes +} accelCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Accel_AddService- Initializes the Accelerometer service by registering + * GATT attributes with the GATT server. Only call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Accel_AddService( uint32 services ); + +/* + * Accel_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ); + + +/* + * Accel_SetParameter - Set an Accelerometer Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Accel_GetParameter - Get an Accelerometer Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ACCELEROMETER_H */ diff --git a/Firmware/Radio/Profiles/Batt/battservice.c b/Firmware/Radio/Profiles/Batt/battservice.c new file mode 100644 index 0000000..3a28d9a --- /dev/null +++ b/Firmware/Radio/Profiles/Batt/battservice.c @@ -0,0 +1,591 @@ +/************************************************************************************************** + Filename: battservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hal_adc.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "hid_uuid.h" +#include "hiddev.h" + +#include "battservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// ADC voltage levels +#define BATT_ADC_LEVEL_3V 409 +#define BATT_ADC_LEVEL_2V 273 + +#define BATT_LEVEL_VALUE_IDX 2 // Position of battery level in attribute array +#define BATT_LEVEL_VALUE_CCCD_IDX 3 // Position of battery level CCCD in attribute array + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Battery service +CONST uint8 battServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BATT_SERVICE_UUID), HI_UINT16(BATT_SERVICE_UUID) +}; + +// Battery level characteristic +CONST uint8 battLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Application callback +static battServiceCB_t battServiceCB; + +// Critical battery level setting +static uint8 battCriticalLevel; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Battery Service attribute +static CONST gattAttrType_t battService = { ATT_BT_UUID_SIZE, battServUUID }; + +// Battery level characteristic +static uint8 battLevelProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 battLevel = 100; +static gattCharCfg_t battLevelClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, battery level +static uint8 hidReportRefBattLevel[HID_REPORT_REF_LEN] = + { HID_RPT_ID_BATT_LEVEL_IN, HID_REPORT_TYPE_INPUT }; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t battAttrTbl[] = +{ + // Battery Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&battService /* pValue */ + }, + + // Battery Level Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &battLevelProps + }, + + // Battery Level Value + { + { ATT_BT_UUID_SIZE, battLevelUUID }, + GATT_PERMIT_READ, + 0, + &battLevel + }, + + // Battery Level Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &battLevelClientCharCfg + }, + + // HID Report Reference characteristic descriptor, batter level input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefBattLevel + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void battNotifyCB( linkDBItem_t *pLinkItem ); +static uint8 battMeasure( void ); +static void battNotifyLevel( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Battery Service Callbacks +CONST gattServiceCBs_t battCBs = +{ + battReadAttrCB, // Read callback function pointer + battWriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t Batt_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, battLevelClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( battAttrTbl, + GATT_NUM_ATTRS( battAttrTbl ), + &battCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void Batt_Register( battServiceCB_t pfnServiceCB ) +{ + battServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BATT_PARAM_CRITICAL_LEVEL: + battCriticalLevel = *((uint8*)value); + + // If below the critical level and critical state not set, notify it + if ( battLevel < battCriticalLevel ) + { + battNotifyLevel(); + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case BATT_PARAM_LEVEL: + *((uint8*)value) = battLevel; + break; + + case BATT_PARAM_CRITICAL_LEVEL: + *((uint8*)value) = battCriticalLevel; + break; + + case BATT_PARAM_SERVICE_HANDLE: + *((uint16*)value) = GATT_SERVICE_HANDLE( battAttrTbl ); + break; + + case BATT_PARAM_BATT_LEVEL_IN_REPORT: + { + hidRptMap_t *pRpt = (hidRptMap_t *)value; + + pRpt->id = hidReportRefBattLevel[0]; + pRpt->type = hidReportRefBattLevel[1]; + pRpt->handle = battAttrTbl[BATT_LEVEL_VALUE_IDX].handle; + pRpt->cccdHandle = battAttrTbl[BATT_LEVEL_VALUE_CCCD_IDX].handle; + pRpt->mode = HID_PROTOCOL_MODE_REPORT; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Batt_MeasLevel + * + * @brief Measure the battery level and update the battery + * level value in the service characteristics. If + * the battery level-state characteristic is configured + * for notification and the battery level has changed + * since the last measurement, then a notification + * will be sent. + * + * @return Success + */ +bStatus_t Batt_MeasLevel( void ) +{ + uint8 level; + + level = battMeasure(); + + // If level has gone down + if (level < battLevel) + { + // Update level + battLevel = level; + + // Send a notification + battNotifyLevel(); + } + + return SUCCESS; +} + +/********************************************************************* + * @fn battReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1] ); + + // Measure battery level if reading level + if ( uuid == BATT_LEVEL_UUID ) + { + uint8 level; + + level = battMeasure(); + + // If level has gone down + if (level < battLevel) + { + // Update level + battLevel = level; + } + + *pLen = 1; + pValue[0] = battLevel; + } + else if ( uuid == GATT_REPORT_REF_UUID ) + { + *pLen = HID_REPORT_REF_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_REPORT_REF_LEN ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn battWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + if ( battServiceCB ) + { + (*battServiceCB)( (charCfg == GATT_CFG_NO_OPERATION) ? + BATT_LEVEL_NOTI_DISABLED : + BATT_LEVEL_NOTI_ENABLED); + } + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn battNotifyCB + * + * @brief Send a notification of the level state characteristic. + * + * @param connHandle - linkDB item + * + * @return None. + */ +static void battNotifyCB( linkDBItem_t *pLinkItem ) +{ + if ( pLinkItem->stateFlags & LINK_CONNECTED ) + { + uint16 value = GATTServApp_ReadCharCfg( pLinkItem->connectionHandle, + battLevelClientCharCfg ); + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + attHandleValueNoti_t noti; + + noti.handle = battAttrTbl[BATT_LEVEL_VALUE_IDX].handle; + noti.len = 1; + noti.value[0] = battLevel; + + GATT_Notification( pLinkItem->connectionHandle, ¬i, FALSE ); + } + } +} + +/********************************************************************* + * @fn battMeasure + * + * @brief Measure the battery level with the ADC and return + * it as a percentage 0-100%. + * + * @return Battery level. + */ +static uint8 battMeasure( void ) +{ + uint16 adc; + uint8 percent; + + /** + * Battery level conversion from ADC to a percentage: + * + * The maximum ADC value for the battery voltage level is 511 for a + * 10-bit conversion. The ADC value is references vs. 1.25v and + * this maximum value corresponds to a voltage of 3.75v. + * + * For a coin cell battery 3.0v = 100%. The minimum operating + * voltage of the CC2540 is 2.0v so 2.0v = 0%. + * + * To convert a voltage to an ADC value use: + * + * (v/3)/1.25 * 511 = adc + * + * 3.0v = 409 ADC + * 2.0v = 273 ADC + * + * We need to map ADC values from 409-273 to 100%-0%. + * + * Normalize the ADC values to zero: + * + * 409 - 273 = 136 + * + * And convert ADC range to percentage range: + * + * percent/adc = 100/136 = 25/34 + * + * Resulting in the final equation, with round: + * + * percent = ((adc - 273) * 25) + 33 / 34 + */ + + // Configure ADC and perform a read + HalAdcSetReference( HAL_ADC_REF_125V ); + adc = HalAdcRead( HAL_ADC_CHANNEL_VDD, HAL_ADC_RESOLUTION_10 ); + + if (adc >= BATT_ADC_LEVEL_3V) + { + percent = 100; + } + else if (adc <= BATT_ADC_LEVEL_2V) + { + percent = 0; + } + else + { + percent = (uint8) ((((adc - BATT_ADC_LEVEL_2V) * 25) + 33) / 34); + } + + return percent; +} + +/********************************************************************* + * @fn battNotifyLevelState + * + * @brief Send a notification of the battery level state + * characteristic if a connection is established. + * + * @return None. + */ +static void battNotifyLevel( void ) +{ + // Execute linkDB callback to send notification + linkDB_PerformFunc( battNotifyCB ); +} + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, battLevelClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Batt/battservice.h b/Firmware/Radio/Profiles/Batt/battservice.h new file mode 100644 index 0000000..3779cf4 --- /dev/null +++ b/Firmware/Radio/Profiles/Batt/battservice.h @@ -0,0 +1,179 @@ +/************************************************************************************************** + Filename: battservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service definitions and + prototypes. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BATTSERVICE_H +#define BATTSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Battery Service UUIDs +#define BATT_SERVICE_UUID 0x180F // Battery Service +#define BATT_LEVEL_UUID 0x2A19 // Battery Level + +// Battery Service Get/Set Parameters +#define BATT_PARAM_LEVEL 0 +#define BATT_PARAM_CRITICAL_LEVEL 1 +#define BATT_PARAM_SERVICE_HANDLE 2 +#define BATT_PARAM_BATT_LEVEL_IN_REPORT 3 + +// Callback events +#define BATT_LEVEL_NOTI_ENABLED 1 +#define BATT_LEVEL_NOTI_DISABLED 2 + +// HID Report IDs for the service +#define HID_RPT_ID_BATT_LEVEL_IN 4 // Battery Level input report ID + +/********************************************************************* + * TYPEDEFS + */ + +// Battery Service callback function +typedef void (*battServiceCB_t)(uint8 event); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Batt_AddService( void ); + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void Batt_Register( battServiceCB_t pfnServiceCB ); + +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Batt_MeasLevel + * + * @brief Measure the battery level and update the battery + * level value in the service characteristics. If + * the battery level-state characteristic is configured + * for notification and the battery level has changed + * since the last measurement, then a notification + * will be sent. + * + * @return Success or Failure + */ +extern bStatus_t Batt_MeasLevel( void ); + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BATTSERVICE_H */ diff --git a/Firmware/Radio/Profiles/BloodPressure/bpservice.c b/Firmware/Radio/Profiles/BloodPressure/bpservice.c new file mode 100644 index 0000000..4612ada --- /dev/null +++ b/Firmware/Radio/Profiles/BloodPressure/bpservice.c @@ -0,0 +1,579 @@ +/************************************************************************************************** + Filename: bpservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the BloodPressure sample service + for use with the BloodPressure sample application. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "bpservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of bloodPressure measurement value in attribute array +#define BLOODPRESSURE_MEAS_VALUE_POS 2 +#define BLOODPRESSURE_MEAS_CONFIG_POS 3 +#define BLOODPRESSURE_IMEAS_VALUE_POS 6 +#define BLOODPRESSURE_IMEAS_CONFIG_POS 7 +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// BloodPressure service +CONST uint8 bloodPressureServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_SERV_UUID), HI_UINT16(BLOODPRESSURE_SERV_UUID) +}; + +// BloodPressure temperature characteristic +CONST uint8 bloodPressureTempUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_MEAS_UUID), HI_UINT16(BLOODPRESSURE_MEAS_UUID) +}; + +// BloodPressure Immediate Measurement +CONST uint8 bloodPressureImeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_IMEAS_UUID), HI_UINT16(BLOODPRESSURE_IMEAS_UUID) +}; + +// BloodPressure Feature +CONST uint8 bpFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_FEATURE_UUID), HI_UINT16(BLOODPRESSURE_FEATURE_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static bloodPressureServiceCB_t bloodPressureServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// BloodPressure Service attribute +static CONST gattAttrType_t bloodPressureService = { ATT_BT_UUID_SIZE, bloodPressureServUUID }; + +// BloodPressure Characteristic +static uint8 bloodPressureTempProps = GATT_PROP_INDICATE; +static gattCharCfg_t bloodPressureMeasConfig[GATT_MAX_NUM_CONN]; +static uint8 bloodPressureTemp = 0; +static uint8 bloodPressureTempFormat = 12; + +// Intermediate Measurement +static uint8 bloodPressureImeasProps = GATT_PROP_NOTIFY; +static uint8 bloodPressureImeas=0; +static gattCharCfg_t bloodPressureIMeasConfig[GATT_MAX_NUM_CONN]; + +// BP Feature + /* + bit 1 Body Movement Detection Support bit + bit 2 Cuff Fit Detection Support bit + bit 3 Irregular Pulse Detection Support bit + bit 4 Pulse Rate Range Detection Support bit + bit 5 Measurement Position Detection Support bit + bit 6 Multiple Bond Support bit + bit . Reserved for Future Use + */ +static uint8 bpFeatureProps = GATT_PROP_READ; +static uint16 bpFeature = 0; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t bloodPressureAttrTbl[] = +{ + // BloodPressure Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&bloodPressureService /* pValue */ + }, + + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bloodPressureTempProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, bloodPressureTempUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &bloodPressureTemp + }, + + // 3.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&bloodPressureMeasConfig + }, + // 4.Presentation Format + { + { ATT_BT_UUID_SIZE, charFormatUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&bloodPressureTempFormat + }, + + + ////////////////////////////////////////////// + // IMMEDIATE MEASUREMENT + ////////////////////////////////////////////// + + // 5.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bloodPressureImeasProps + }, + + // 6.Characteristic Value + { + { ATT_BT_UUID_SIZE, bloodPressureImeasUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &bloodPressureImeas + }, + + // 7.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&bloodPressureIMeasConfig + }, + + + ////////////////////////////////////////////// + // FEATURE + ////////////////////////////////////////////// + + // 8.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bpFeatureProps + }, + + // 9.Characteristic Value + { + { ATT_BT_UUID_SIZE, bpFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&bpFeature + }, + + + + +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 bloodPressure_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t bloodPressure_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void bloodPressure_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); +/********************************************************************* + * PROFILE CALLBACKS + */ +// Blood Pressure Service Callbacks +CONST gattServiceCBs_t bloodPressureCBs = +{ + bloodPressure_ReadAttrCB, // Read callback function pointer + bloodPressure_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn BloodPressure_AddService + * + * @brief Initializes the BloodPressure service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t BloodPressure_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, bloodPressureMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, bloodPressureIMeasConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( bloodPressure_HandleConnStatusCB ); + + if ( services & BLOODPRESSURE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( bloodPressureAttrTbl, + GATT_NUM_ATTRS( bloodPressureAttrTbl ), + &bloodPressureCBs ); + + } + return ( status ); +} + +/********************************************************************* + * @fn BloodPressure_Register + * + * @brief Register a callback function with the BloodPressure Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void BloodPressure_Register( bloodPressureServiceCB_t pfnServiceCB ) +{ + bloodPressureServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn BloodPressure_SetParameter + * + * @brief Set a thermomter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t BloodPressure_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn BloodPressure_GetParameter + * + * @brief Get a BloodPressure parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t BloodPressure_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn BloodPressure_MeasIndicate + * + * @brief Send a indication containing a bloodPressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t BloodPressure_MeasIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, bloodPressureMeasConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle + pNoti->handle = bloodPressureAttrTbl[BLOODPRESSURE_MEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + + +/********************************************************************* + * @fn BloodPressure_IMeasNotify + * + * @brief Send a notification containing a bloodPressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t BloodPressure_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, bloodPressureIMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = bloodPressureAttrTbl[BLOODPRESSURE_IMEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE); + + } + return bleIncorrectMode; + +} + +/********************************************************************* + * @fn bloodPressure_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 bloodPressure_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + + case BLOODPRESSURE_FEATURE_UUID: + { + *pLen = 2; + pValue[0] = 0; + pValue[1] = 0; + } + break; + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + return ( status ); +} + +/********************************************************************* + * @fn bloodPressure_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t bloodPressure_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + if ( pAttr->handle == bloodPressureAttrTbl[BLOODPRESSURE_MEAS_CONFIG_POS].handle ) + { + // BloodPressure Indications + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*bloodPressureServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + BLOODPRESSURE_MEAS_NOTI_DISABLED : + BLOODPRESSURE_MEAS_NOTI_ENABLED); + } + } + else if ( pAttr->handle == bloodPressureAttrTbl[BLOODPRESSURE_IMEAS_CONFIG_POS].handle ) + { + // BloodPressure Notifications + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*bloodPressureServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + BLOODPRESSURE_IMEAS_NOTI_DISABLED : + BLOODPRESSURE_IMEAS_NOTI_ENABLED ); + } + } + else + { + status = ATT_ERR_INVALID_HANDLE; + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); + +} + + +/********************************************************************* + * @fn bloodPressure_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void bloodPressure_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, bloodPressureMeasConfig ); + GATTServApp_InitCharCfg( connHandle, bloodPressureIMeasConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/BloodPressure/bpservice.h b/Firmware/Radio/Profiles/BloodPressure/bpservice.h new file mode 100644 index 0000000..4b8b9a6 --- /dev/null +++ b/Firmware/Radio/Profiles/BloodPressure/bpservice.h @@ -0,0 +1,205 @@ +/************************************************************************************************** + Filename: bpService.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the BloodPressure service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BLOODPRESSURESERVICE_H +#define BLOODPRESSURESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// BloodPressure Service Parameters +#define BLOODPRESSURE_MEAS 0 +#define BLOODPRESSURE_MEAS_CHAR_CFG 1 +#define BLOODPRESSURE_IMEAS_CHAR_CFG 2 +#define BLOODPRESSURE_TIMESTAMP 3 +#define BLOODPRESSURE_PULSE 4 +#define BLOODPRESSURE_INTERVAL 5 + +// Length of measurements +#define BLOODPRESSURE_TIMESTAMP_LEN 7 //length of timestamp +#define BLOODPRESSURE_TIME_LEN 7 //length of timestamp +#define BLOODPRESSURE_INTERVAL_LEN 1 + +// BloodPressure Service UUIDs +#define BLOODPRESSURE_SERV_UUID 0x1810 +#define BLOODPRESSURE_MEAS_UUID 0x2A35 //bp measurement +#define BLOODPRESSURE_IMEAS_UUID 0x2A36 //intermediate +#define BLOODPRESSURE_FEATURE_UUID 0x2A49 //intermediate + +// Maximum length of blood pressure measurement characteristic +#define BLOODPRESSURE_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define BLOODPRESSURE_FLAGS_MMHG 0x00 +#define BLOODPRESSURE_FLAGS_KPA 0x01 +#define BLOODPRESSURE_FLAGS_TIMESTAMP 0x02 +#define BLOODPRESSURE_FLAGS_PULSE 0x04 +#define BLOODPRESSURE_FLAGS_USER 0x08 +#define BLOODPRESSURE_FLAGS_STATUS 0x10 + + +// Values for sensor location +#define BLOODPRESSURE_SITE_ARMPIT 0x01 +#define BLOODPRESSURE_SITE_BODY 0x02 +#define BLOODPRESSURE_SITE_EAR 0x03 +#define BLOODPRESSURE_SITE_FINGER 0x04 +#define BLOODPRESSURE_SITE_GASTRO 0x05 +#define BLOODPRESSURE_SITE_MOUTH 0x06 +#define BLOODPRESSURE_SITE_RECTUM 0x07 +#define BLOODPRESSURE_SITE_TOE 0x08 +#define BLOODPRESSURE_SITE_TYMPNUM 0x09 + +// BloodPressure Service bit fields +#define BLOODPRESSURE_SERVICE 0x00000001 + +// Callback events +#define BLOODPRESSURE_MEAS_NOTI_ENABLED 1 +#define BLOODPRESSURE_MEAS_NOTI_DISABLED 2 +#define BLOODPRESSURE_IMEAS_NOTI_ENABLED 3 +#define BLOODPRESSURE_IMEAS_NOTI_DISABLED 4 +#define BLOODPRESSURE_TIME_SET 5 + +/********************************************************************* + * TYPEDEFS + */ + +// BloodPressure Service callback function +typedef void (*bloodPressureServiceCB_t)(uint8 event); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * BloodPressure_AddService- Initializes the BloodPressure service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t BloodPressure_AddService( uint32 services ); + +/* + * BloodPressure_Register - Register a callback function with the + * BloodPressure Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void BloodPressure_Register( bloodPressureServiceCB_t pfnServiceCB ); + +/* + * BloodPressure_SetParameter - Set a BloodPressure parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t BloodPressure_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * BloodPressure_GetParameter - Get a BloodPressure parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t BloodPressure_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn BloodPressure_MeasIndicate + * + * @brief Send a notification containing a blood pressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t BloodPressure_MeasIndicate( uint16 connHandle, attHandleValueInd_t *pNoti, uint8 taskId ); + + + + +/********************************************************************* + * @fn BloodPressure_IMeasNotify + * + * @brief Send a notification containing a blood pressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t BloodPressure_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BLOODPRESSURESERVICE_H */ diff --git a/Firmware/Radio/Profiles/DevInfo/devinfoservice.c b/Firmware/Radio/Profiles/DevInfo/devinfoservice.c new file mode 100644 index 0000000..c1af977 --- /dev/null +++ b/Firmware/Radio/Profiles/DevInfo/devinfoservice.c @@ -0,0 +1,668 @@ +/************************************************************************************************** + Filename: devinfoservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "devinfoservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Device information service +CONST uint8 devInfoServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SERV_UUID), HI_UINT16(DEVINFO_SERV_UUID) +}; + +// System ID +CONST uint8 devInfoSystemIdUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SYSTEM_ID_UUID), HI_UINT16(DEVINFO_SYSTEM_ID_UUID) +}; + +// Model Number String +CONST uint8 devInfoModelNumberUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_MODEL_NUMBER_UUID), HI_UINT16(DEVINFO_MODEL_NUMBER_UUID) +}; + +// Serial Number String +CONST uint8 devInfoSerialNumberUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SERIAL_NUMBER_UUID), HI_UINT16(DEVINFO_SERIAL_NUMBER_UUID) +}; + +// Firmware Revision String +CONST uint8 devInfoFirmwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_FIRMWARE_REV_UUID), HI_UINT16(DEVINFO_FIRMWARE_REV_UUID) +}; + +// Hardware Revision String +CONST uint8 devInfoHardwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_HARDWARE_REV_UUID), HI_UINT16(DEVINFO_HARDWARE_REV_UUID) +}; + +// Software Revision String +CONST uint8 devInfoSoftwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SOFTWARE_REV_UUID), HI_UINT16(DEVINFO_SOFTWARE_REV_UUID) +}; + +// Manufacturer Name String +CONST uint8 devInfoMfrNameUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_MANUFACTURER_NAME_UUID), HI_UINT16(DEVINFO_MANUFACTURER_NAME_UUID) +}; + +// IEEE 11073-20601 Regulatory Certification Data List +CONST uint8 devInfo11073CertUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_11073_CERT_DATA_UUID), HI_UINT16(DEVINFO_11073_CERT_DATA_UUID) +}; + +// PnP ID +CONST uint8 devInfoPnpIdUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_PNP_ID_UUID), HI_UINT16(DEVINFO_PNP_ID_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Device Information Service attribute +static CONST gattAttrType_t devInfoService = { ATT_BT_UUID_SIZE, devInfoServUUID }; + +// System ID characteristic +static uint8 devInfoSystemIdProps = GATT_PROP_READ; +static uint8 devInfoSystemId[DEVINFO_SYSTEM_ID_LEN] = {0, 0, 0, 0, 0, 0, 0, 0}; + +// Model Number String characteristic +static uint8 devInfoModelNumberProps = GATT_PROP_READ; +static const uint8 devInfoModelNumber[] = "Model Number"; + +// Serial Number String characteristic +static uint8 devInfoSerialNumberProps = GATT_PROP_READ; +static const uint8 devInfoSerialNumber[] = "Serial Number"; + +// Firmware Revision String characteristic +static uint8 devInfoFirmwareRevProps = GATT_PROP_READ; +static const uint8 devInfoFirmwareRev[] = "Firmware Revision"; + +// Hardware Revision String characteristic +static uint8 devInfoHardwareRevProps = GATT_PROP_READ; +static const uint8 devInfoHardwareRev[] = "Hardware Revision"; + +// Software Revision String characteristic +static uint8 devInfoSoftwareRevProps = GATT_PROP_READ; +static const uint8 devInfoSoftwareRev[] = "Software Revision"; + +// Manufacturer Name String characteristic +static uint8 devInfoMfrNameProps = GATT_PROP_READ; +static const uint8 devInfoMfrName[] = "Manufacturer Name"; + +// IEEE 11073-20601 Regulatory Certification Data List characteristic +static uint8 devInfo11073CertProps = GATT_PROP_READ; +static const uint8 devInfo11073Cert[] = +{ + DEVINFO_11073_BODY_EXP, // authoritative body type + 0x00, // authoritative body structure type + // authoritative body data follows below: + 'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l' +}; + +// System ID characteristic +static uint8 devInfoPnpIdProps = GATT_PROP_READ; +static uint8 devInfoPnpId[DEVINFO_PNP_ID_LEN] = +{ + 1, // Vendor ID source (1=Bluetooth SIG) + LO_UINT16(0x000D), HI_UINT16(0x000D), // Vendor ID (Texas Instruments) + LO_UINT16(0x0000), HI_UINT16(0x0000), // Product ID (vendor-specific) + LO_UINT16(0x0110), HI_UINT16(0x0110) // Product version (JJ.M.N) +}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t devInfoAttrTbl[] = +{ + // Device Information Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&devInfoService /* pValue */ + }, + + // System ID Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSystemIdProps + }, + + // System ID Value + { + { ATT_BT_UUID_SIZE, devInfoSystemIdUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSystemId + }, + + // Model Number String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoModelNumberProps + }, + + // Model Number Value + { + { ATT_BT_UUID_SIZE, devInfoModelNumberUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoModelNumber + }, + + // Serial Number String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSerialNumberProps + }, + + // Serial Number Value + { + { ATT_BT_UUID_SIZE, devInfoSerialNumberUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSerialNumber + }, + + // Firmware Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoFirmwareRevProps + }, + + // Firmware Revision Value + { + { ATT_BT_UUID_SIZE, devInfoFirmwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoFirmwareRev + }, + + // Hardware Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoHardwareRevProps + }, + + // Hardware Revision Value + { + { ATT_BT_UUID_SIZE, devInfoHardwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoHardwareRev + }, + + // Software Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSoftwareRevProps + }, + + // Software Revision Value + { + { ATT_BT_UUID_SIZE, devInfoSoftwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSoftwareRev + }, + + // Manufacturer Name String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoMfrNameProps + }, + + // Manufacturer Name Value + { + { ATT_BT_UUID_SIZE, devInfoMfrNameUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoMfrName + }, + + // IEEE 11073-20601 Regulatory Certification Data List Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfo11073CertProps + }, + + // IEEE 11073-20601 Regulatory Certification Data List Value + { + { ATT_BT_UUID_SIZE, devInfo11073CertUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfo11073Cert + }, + + // PnP ID Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoPnpIdProps + }, + + // PnP ID Value + { + { ATT_BT_UUID_SIZE, devInfoPnpIdUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoPnpId + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Device Info Service Callbacks +CONST gattServiceCBs_t devInfoCBs = +{ + devInfo_ReadAttrCB, // Read callback function pointer + NULL, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn DevInfo_AddService + * + * @brief Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t DevInfo_AddService( void ) +{ + // Register GATT attribute list and CBs with GATT Server App + return GATTServApp_RegisterService( devInfoAttrTbl, + GATT_NUM_ATTRS( devInfoAttrTbl ), + &devInfoCBs ); +} + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case DEVINFO_SYSTEM_ID: + osal_memcpy(devInfoSystemId, value, len); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn DevInfo_GetParameter + * + * @brief Get a Device Information parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case DEVINFO_SYSTEM_ID: + osal_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId)); + break; + + case DEVINFO_MODEL_NUMBER: + osal_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber)); + break; + case DEVINFO_SERIAL_NUMBER: + osal_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber)); + break; + + case DEVINFO_FIRMWARE_REV: + osal_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev)); + break; + + case DEVINFO_HARDWARE_REV: + osal_memcpy(value, devInfoHardwareRev, sizeof(devInfoHardwareRev)); + break; + + case DEVINFO_SOFTWARE_REV: + osal_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev)); + break; + + case DEVINFO_MANUFACTURER_NAME: + osal_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName)); + break; + + case DEVINFO_11073_CERT_DATA: + osal_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert)); + break; + + case DEVINFO_PNP_ID: + osal_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId)); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn devInfo_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch (uuid) + { + case DEVINFO_SYSTEM_ID_UUID: + // verify offset + if (offset >= sizeof(devInfoSystemId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoSystemId[offset], *pLen); + } + break; + + case DEVINFO_MODEL_NUMBER_UUID: + // verify offset + if (offset >= sizeof(devInfoModelNumber)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoModelNumber) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoModelNumber[offset], *pLen); + } + break; + + case DEVINFO_SERIAL_NUMBER_UUID: + // verify offset + if (offset >= sizeof(devInfoSerialNumber)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSerialNumber) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoSerialNumber[offset], *pLen); + } + break; + + case DEVINFO_FIRMWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoFirmwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoFirmwareRev) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoFirmwareRev[offset], *pLen); + } + break; + + case DEVINFO_HARDWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoHardwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoHardwareRev) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoHardwareRev[offset], *pLen); + } + break; + + case DEVINFO_SOFTWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoSoftwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSoftwareRev) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoSoftwareRev[offset], *pLen); + } + break; + + case DEVINFO_MANUFACTURER_NAME_UUID: + // verify offset + if (offset >= sizeof(devInfoMfrName)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoMfrName) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoMfrName[offset], *pLen); + } + break; + + case DEVINFO_11073_CERT_DATA_UUID: + // verify offset + if (offset >= sizeof(devInfo11073Cert)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset)); + + // copy data + osal_memcpy(pValue, &devInfo11073Cert[offset], *pLen); + } + break; + + case DEVINFO_PNP_ID_UUID: + // verify offset + if (offset >= sizeof(devInfoPnpId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoPnpId[offset], *pLen); + } + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/DevInfo/devinfoservice.h b/Firmware/Radio/Profiles/DevInfo/devinfoservice.h new file mode 100644 index 0000000..a62d4eb --- /dev/null +++ b/Firmware/Radio/Profiles/DevInfo/devinfoservice.h @@ -0,0 +1,151 @@ +/************************************************************************************************** + Filename: devinfoservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service definitions and + prototypes. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef DEVINFOSERVICE_H +#define DEVINFOSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Device Information Service Parameters +#define DEVINFO_SYSTEM_ID 0 +#define DEVINFO_MODEL_NUMBER 1 +#define DEVINFO_SERIAL_NUMBER 2 +#define DEVINFO_FIRMWARE_REV 3 +#define DEVINFO_HARDWARE_REV 4 +#define DEVINFO_SOFTWARE_REV 5 +#define DEVINFO_MANUFACTURER_NAME 6 +#define DEVINFO_11073_CERT_DATA 7 +#define DEVINFO_PNP_ID 8 + +// Device Information Service UUIDs +#define DEVINFO_SERV_UUID 0x180A // Service UUID +#define DEVINFO_SYSTEM_ID_UUID 0x2A23 // System ID +#define DEVINFO_MODEL_NUMBER_UUID 0x2A24 // Model Number String +#define DEVINFO_SERIAL_NUMBER_UUID 0x2A25 // Serial Number String +#define DEVINFO_FIRMWARE_REV_UUID 0x2A26 // Firmware Revision String +#define DEVINFO_HARDWARE_REV_UUID 0x2A27 // Hardware Revision String +#define DEVINFO_SOFTWARE_REV_UUID 0x2A28 // Software Revision String +#define DEVINFO_MANUFACTURER_NAME_UUID 0x2A29 // Manufacturer Name String +#define DEVINFO_11073_CERT_DATA_UUID 0x2A2A // IEEE 11073-20601 Regulatory Certification Data List +#define DEVINFO_PNP_ID_UUID 0x2A50 // PnP ID + +// IEEE 11073 authoritative body values +#define DEVINFO_11073_BODY_EMPTY 0 +#define DEVINFO_11073_BODY_IEEE 1 +#define DEVINFO_11073_BODY_CONTINUA 2 +#define DEVINFO_11073_BODY_EXP 254 + +// System ID length +#define DEVINFO_SYSTEM_ID_LEN 8 + + // PnP ID length +#define DEVINFO_PNP_ID_LEN 7 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * DevInfo_AddService- Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + */ + +extern bStatus_t DevInfo_AddService( void ); + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * DevInfo_GetParameter - Get a Device Information parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t DevInfo_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* DEVINFOSERVICE_H */ diff --git a/Firmware/Radio/Profiles/Glucose/glucservice.c b/Firmware/Radio/Profiles/Glucose/glucservice.c new file mode 100644 index 0000000..8aea523 --- /dev/null +++ b/Firmware/Radio/Profiles/Glucose/glucservice.c @@ -0,0 +1,681 @@ +/************************************************************************************************** + Filename: glucservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Glucose sample service + for use with the Glucose sample application. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "glucservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of glucose measurement value in attribute array +#define GLUCOSE_MEAS_VALUE_POS 2 +#define GLUCOSE_MEAS_CONFIG_POS 3 +#define GLUCOSE_CONTEXT_VALUE_POS 5 +#define GLUCOSE_CONTEXT_CONFIG_POS 6 +#define GLUCOSE_CTL_PNT_VALUE_POS 10 +#define GLUCOSE_CTL_PNT_CONFIG_POS 11 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Glucose service +CONST uint8 glucoseServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_SERV_UUID), HI_UINT16(GLUCOSE_SERV_UUID) +}; + +// Glucose characteristic +CONST uint8 glucoseMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_MEAS_UUID), HI_UINT16(GLUCOSE_MEAS_UUID) +}; + +// Glucose Measurement Context +CONST uint8 glucoseContextUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_CONTEXT_UUID), HI_UINT16(GLUCOSE_CONTEXT_UUID) +}; + +// Glucose Feature +CONST uint8 glucoseFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_FEATURE_UUID), HI_UINT16(GLUCOSE_FEATURE_UUID) +}; + +// Record Control Point +CONST uint8 recordControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RECORD_CONTROL_POINT_UUID), HI_UINT16(RECORD_CONTROL_POINT_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/* TRUE if record transfer in progress */ +extern bool glucoseSendAllRecords; + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static glucoseServiceCB_t glucoseServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Glucose Service attribute +static CONST gattAttrType_t glucoseService = { ATT_BT_UUID_SIZE, glucoseServUUID }; + +// Glucose Characteristic +static uint8 glucoseProps = GATT_PROP_NOTIFY; +static gattCharCfg_t glucoseMeasConfig[GATT_MAX_NUM_CONN]; +static uint8 glucoseMeas = 0; + +// Measurement Context +static uint8 glucoseContextProps = GATT_PROP_NOTIFY; +static uint8 glucoseContext=0; +static gattCharCfg_t glucoseContextConfig[GATT_MAX_NUM_CONN]; + +// Glucose Feature +static uint8 glucoseFeatureProps = GATT_PROP_READ; +static uint16 glucoseFeature = GLUCOSE_FEAT_ALL; + +// Glucose Control +static uint8 glucoseControlProps = GATT_PROP_INDICATE | GATT_PROP_WRITE; +static uint8 glucoseControl=0; +static gattCharCfg_t glucoseControlConfig[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t glucoseAttrTbl[] = +{ + // Glucose Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&glucoseService /* pValue */ + }, + + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseMeasUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &glucoseMeas + }, + + // 3.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseMeasConfig + }, + + ////////////////////////////////////////////// + // MEASUREMENT CONTEXT + ////////////////////////////////////////////// + + // 4.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseContextProps + }, + + // 5.Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseContextUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &glucoseContext + }, + + // 6.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseContextConfig + }, + + ////////////////////////////////////////////// + // GLUCOSE FEATURE + ////////////////////////////////////////////// + + // 7.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseFeatureProps + }, + + // 8.Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) &glucoseFeature + }, + + ////////////////////////////////////////////// + // GLUCOSE CONTROL POINT + ////////////////////////////////////////////// + + // 9.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseControlProps + }, + + // 10.Characteristic Value + { + { ATT_BT_UUID_SIZE, recordControlPointUUID }, + GATT_PERMIT_WRITE, + 0, + &glucoseControl + }, + + // 11.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseControlConfig + } +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 glucose_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t glucose_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void glucose_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Service Callbacks +CONST gattServiceCBs_t glucoseCBs = +{ + glucose_ReadAttrCB, // Read callback function pointer + glucose_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Glucose_AddService + * + * @brief Initializes the Glucose service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Glucose_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseContextConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseControlConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( glucose_HandleConnStatusCB ); + + if ( services & GLUCOSE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( glucoseAttrTbl, GATT_NUM_ATTRS( glucoseAttrTbl ), + &glucoseCBs ); + } + return ( status ); +} + +/********************************************************************* + * @fn Glucose_Register + * + * @brief Register a callback function with the Glucose Service. + * + * @param pfnServiceCB - Callback function. + * pfnCtlPntCB - Callback for control point + * + * @return None. + */ +extern void Glucose_Register( glucoseServiceCB_t pfnServiceCB) +{ + glucoseServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Glucose_SetParameter + * + * @brief Set a glucose parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Glucose_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GLUCOSE_FEATURE_PARAM: + glucoseFeature = *((uint16*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Glucose_GetParameter + * + * @brief Get a Glucose parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Glucose_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GLUCOSE_FEATURE_PARAM: + *((uint16*)value) = glucoseFeature; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Glucose_MeasSend + * + * @brief Send a glucose measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Glucose_MeasSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = glucoseAttrTbl[GLUCOSE_MEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleNotReady; +} + + +/********************************************************************* + * @fn Glucose_ContextSend + * + * @brief Send a glucose measurement context. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Glucose_ContextSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseContextConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = glucoseAttrTbl[GLUCOSE_CONTEXT_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleNotReady; +} + +/********************************************************************* + * @fn Glucose_CtlPntIndicate + * + * @brief Send an indication containing a control point + * message. + * + * @param connHandle - connection handle + * @param pInd - pointer to indication structure + * + * @return Success or Failure + */ +bStatus_t Glucose_CtlPntIndicate( uint16 connHandle, attHandleValueInd_t *pInd, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseControlConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle + pInd->handle = glucoseAttrTbl[GLUCOSE_CTL_PNT_VALUE_POS].handle; + + // Send the Indication + return GATT_Indication( connHandle, pInd, FALSE, taskId ); + } + + return bleNotReady; +} + +/********************************************************************* + * @fn glucose_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 glucose_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Require security for all characteristics + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ATT_ERR_INSUFFICIENT_ENCRYPT; + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + + case GLUCOSE_FEATURE_UUID: + *pLen = 2; + pValue[0] = LO_UINT16( glucoseFeature ); + pValue[1] = HI_UINT16( glucoseFeature ); + break; + + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + + return ( status ); +} + +/********************************************************************* + * @fn glucose_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t glucose_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + // Require security for all characteristics + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ATT_ERR_INSUFFICIENT_ENCRYPT; + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + + case GATT_CLIENT_CHAR_CFG_UUID: + // Glucose Notifications + if ((pAttr->handle == glucoseAttrTbl[GLUCOSE_MEAS_CONFIG_POS].handle || + pAttr->handle == glucoseAttrTbl[GLUCOSE_CONTEXT_CONFIG_POS].handle)) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + if(pAttr->handle == glucoseAttrTbl[GLUCOSE_MEAS_CONFIG_POS].handle) + { + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_MEAS_NTF_DISABLED : + GLUCOSE_MEAS_NTF_ENABLED, NULL, NULL); + } + else + { + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_CONTEXT_NTF_DISABLED : + GLUCOSE_CONTEXT_NTF_ENABLED, NULL, NULL); + } + } + } + // Glucose Indications + else if ( pAttr->handle == glucoseAttrTbl[GLUCOSE_CTL_PNT_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_CTL_PNT_IND_DISABLED : + GLUCOSE_CTL_PNT_IND_ENABLED, NULL, NULL); + } + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + break; + + case RECORD_CONTROL_POINT_UUID: + if(len >= GLUCOSE_CTL_PNT_MIN_SIZE && len <= GLUCOSE_CTL_PNT_MAX_SIZE) + { + uint8 opcode = pValue[0]; + + // if transfer in progress + if (opcode != CTL_PNT_OP_ABORT && glucoseSendAllRecords) + { + status = GLUCOSE_ERR_IN_PROGRESS; + } + // if CCC not configured for glucose measurement + if ( opcode == CTL_PNT_OP_REQ && + !( GATTServApp_ReadCharCfg( connHandle, glucoseMeasConfig ) & GATT_CLIENT_CFG_NOTIFY ) ) + { + status = GLUCOSE_ERR_CCC_CONFIG; + } + else + { + (*glucoseServiceCB)(GLUCOSE_CTL_PNT_CMD, pValue, len); + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn glucose_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void glucose_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, glucoseMeasConfig ); + GATTServApp_InitCharCfg( connHandle, glucoseContextConfig ); + GATTServApp_InitCharCfg( connHandle, glucoseControlConfig ); + } + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Glucose/glucservice.h b/Firmware/Radio/Profiles/Glucose/glucservice.h new file mode 100644 index 0000000..2a2437d --- /dev/null +++ b/Firmware/Radio/Profiles/Glucose/glucservice.h @@ -0,0 +1,338 @@ +/************************************************************************************************** + Filename: glucservice.h + Revised: $Date: 2011-12-16 15:46:52 -0800 (Fri, 16 Dec 2011) $ + Revision: $Revision: 58 $ + + Description: This file contains the Glucose service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GLUCOSESERVICE_H +#define GLUCOSESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "OSAL_clock.h" + +/********************************************************************* + * CONSTANTS + */ + +// Glucose Service Parameters +#define GLUCOSE_FEATURE_PARAM 3 + +// Characteristic Value sizes +#define GLUCOSE_CTL_PNT_MIN_SIZE 2 +#define GLUCOSE_CTL_PNT_MAX_SIZE 20 + +// Glucose Service UUIDs +#define GLUCOSE_SERV_UUID 0x1808 +#define GLUCOSE_MEAS_UUID 0x2A18 +#define GLUCOSE_CONTEXT_UUID 0x2A34 +#define GLUCOSE_FEATURE_UUID 0x2A51 +#define RECORD_CONTROL_POINT_UUID 0x2A52 + +// Values for meas flags + +#define GLUCOSE_MEAS_FLAG_TIME_OFFSET 0x01 +#define GLUCOSE_MEAS_FLAG_CONCENTRATION 0x02 +#define GLUCOSE_MEAS_FLAG_UNITS 0x04 +#define GLUCOSE_MEAS_FLAG_STATUS_ANNUNCIATION 0x08 +#define GLUCOSE_MEAS_FLAG_CONTEXT_INFO 0x10 + +#define GLUCOSE_MEAS_FLAG_ALL (GLUCOSE_MEAS_FLAG_TIME_OFFSET | GLUCOSE_MEAS_FLAG_CONCENTRATION | GLUCOSE_MEAS_FLAG_UNITS | GLUCOSE_MEAS_FLAG_STATUS_ANNUNCIATION | GLUCOSE_MEAS_FLAG_CONTEXT_INFO) + +// Values for Type Nibble +#define GLUCOSE_TYPE_CAPILLARY_WHOLE 0x1 +#define GLUCOSE_TYPE_CAPILLARY_PLASMA 0x2 +#define GLUCOSE_TYPE_VENOUS_WHOLE 0x3 +#define GLUCOSE_TYPE_VENOUS_PLASMA 0x4 +#define GLUCOSE_TYPE_ARTERIAL_WHOLE 0x5 +#define GLUCOSE_TYPE_ARTERIAL_PLASMA 0x6 +#define GLUCOSE_TYPE_UNDETER_WHOLE 0x7 +#define GLUCOSE_TYPE_UNDETER_PLASMA 0x8 +#define GLUCOSE_TYPE_ISF 0x9 +#define GLUCOSE_TYPE_CONTROL 0xA + +// Values for Location Nibble +#define GLUCOSE_LOCATION_FINGER 0x10 +#define GLUCOSE_LOCATION_AST 0x20 +#define GLUCOSE_LOCATION_EARLOBE 0x30 +#define GLUCOSE_LOCATION_CONTROL 0x40 +#define GLUCOSE_LOCATION_NOT_AVAIL 0xF0 + +// Values for Annunciation +#define GLUCOSE_ANNUNCIATION_BATT_LOW 0x0001 +#define GLUCOSE_ANNUNCIATION_SENS_BAD 0x0002 +#define GLUCOSE_ANNUNCIATION_SAMP_SIZE 0x0004 +#define GLUCOSE_ANNUNCIATION_INSERT 0x0008 +#define GLUCOSE_ANNUNCIATION_STRIP 0x0010 +#define GLUCOSE_ANNUNCIATION_TOO_HIGH 0x0020 +#define GLUCOSE_ANNUNCIATION_TOO_LOW 0x0040 +#define GLUCOSE_ANNUNCIATION_TEMP_HIGH 0x0080 +#define GLUCOSE_ANNUNCIATION_TEMP_LOW 0x0100 +#define GLUCOSE_ANNUNCIATION_INTERRUPTED 0x0200 +#define GLUCOSE_ANNUNCIATION_GENERAL 0x0400 +#define GLUCOSE_ANNUNCIATION_TIME 0x0800 + +// Values for context flags +#define GLUCOSE_CONTEXT_FLAG_CARBO 0x01 +#define GLUCOSE_CONTEXT_FLAG_MEAL 0x02 +#define GLUCOSE_CONTEXT_FLAG_TESTER_HEALTH 0x04 +#define GLUCOSE_CONTEXT_FLAG_EXERCISE 0x08 +#define GLUCOSE_CONTEXT_FLAG_MEDICATION 0x10 +#define GLUCOSE_CONTEXT_FLAG_MEDICATION_UNITS 0x20 +#define GLUCOSE_CONTEXT_FLAG_HbA1c 0x40 +#define GLUCOSE_CONTEXT_FLAG_EXTENDED 0x80 + +//We leave the extended flags out of this all, since there aren't any in the current spec +#define GLUCOSE_CONTEXT_FLAG_ALL (GLUCOSE_CONTEXT_FLAG_CARBO | GLUCOSE_CONTEXT_FLAG_MEAL | GLUCOSE_CONTEXT_FLAG_TESTER_HEALTH | GLUCOSE_CONTEXT_FLAG_EXERCISE | GLUCOSE_CONTEXT_FLAG_MEDICATION | GLUCOSE_CONTEXT_FLAG_MEDICATION_UNITS | GLUCOSE_CONTEXT_FLAG_HbA1c) + +// Values for Carbohydratea +#define GLUCOSE_CARBO_BREAKFAST 0x01 +#define GLUCOSE_CARBO_LUNCH 0x02 +#define GLUCOSE_CARBO_DINNER 0x03 +#define GLUCOSE_CARBO_SNACK 0x04 +#define GLUCOSE_CARBO_DRINK 0x05 +#define GLUCOSE_CARBO_SUPPER 0x06 +#define GLUCOSE_CARBO_BRUNCH 0x07 + +// Values for Meal +#define GLUCOSE_MEAL_PREPRANDIAL 0x1 +#define GLUCOSE_MEAL_POSTPRANDIAL 0x2 +#define GLUCOSE_MEAL_FASTING 0x3 +#define GLUCOSE_MEAL_CASUAL 0x4 + +// Values for Tester Nibble +#define GLUCOSE_TESTER_SELF 0x1 +#define GLUCOSE_TESTER_PROFESSIONAL 0x2 +#define GLUCOSE_TESTER_LAB_TEST 0x3 +#define GLUCOSE_TESTER_UNAVAILABLE 0xF + +// Values for Health Nibble +#define GLUCOSE_HEALTH_MINOR 0x10 +#define GLUCOSE_HEALTH_MAJOR 0x20 +#define GLUCOSE_HEALTH_MENSES 0x30 +#define GLUCOSE_HEALTH_STRESS 0x40 +#define GLUCOSE_HEALTH_NONE 0x50 +#define GLUCOSE_HEALTH_UNAVAILABLE 0xF0 + +// Values for Medication ID +#define GLUCOSE_MEDICATION_RAPID 0x1 +#define GLUCOSE_MEDICATION_SHORT 0x2 +#define GLUCOSE_MEDICATION_INTERMEDIATE 0x3 +#define GLUCOSE_MEDICATION_LONG 0x4 +#define GLUCOSE_MEDICATION_PRE_MIXED 0x5 + +// Values for Glucose Features +#define GLUCOSE_FEAT_LOW_BAT_SUP 0x0001 +#define GLUCOSE_FEAT_MALFUNC_SUP 0x0002 +#define GLUCOSE_FEAT_SAMPLE_SIZE_SUP 0x0004 +#define GLUCOSE_FEAT_INSERT_ERR_SUP 0x0008 +#define GLUCOSE_FEAT_TYPE_ERR_SUP 0x0010 +#define GLUCOSE_FEAT_RESULT_DET_SUP 0x0020 +#define GLUCOSE_FEAT_TEMP_DET_SUP 0x0040 +#define GLUCOSE_FEAT_READ_INT_SUP 0x0080 +#define GLUCOSE_FEAT_GENERAL_FAULT_SUP 0x0100 +#define GLUCOSE_FEAT_TIME_FAULT_SUP 0x0200 +#define GLUCOSE_FEAT_MULTIPLE_BOND_SUP 0x0400 + +#define GLUCOSE_FEAT_ALL (GLUCOSE_FEAT_LOW_BAT_SUP | GLUCOSE_FEAT_MALFUNC_SUP | GLUCOSE_FEAT_SAMPLE_SIZE_SUP | \ + GLUCOSE_FEAT_INSERT_ERR_SUP | GLUCOSE_FEAT_TYPE_ERR_SUP | GLUCOSE_FEAT_RESULT_DET_SUP | \ + GLUCOSE_FEAT_TEMP_DET_SUP | GLUCOSE_FEAT_READ_INT_SUP | GLUCOSE_FEAT_GENERAL_FAULT_SUP | \ + GLUCOSE_FEAT_TIME_FAULT_SUP | GLUCOSE_FEAT_MULTIPLE_BOND_SUP) + +// Glucose Service bit fields +#define GLUCOSE_SERVICE 0x00000001 + +//Record Control Point values +#define CTL_PNT_OP_REQ 0x01 +#define CTL_PNT_OP_CLR 0x02 +#define CTL_PNT_OP_ABORT 0x03 +#define CTL_PNT_OP_GET_NUM 0x04 +#define CTL_PNT_OP_NUM_RSP 0x05 +#define CTL_PNT_OP_REQ_RSP 0x06 + +//Record Control Point operator +#define CTL_PNT_OPER_NULL 0x00 +#define CTL_PNT_OPER_ALL 0x01 +#define CTL_PNT_OPER_LESS_EQUAL 0x02 +#define CTL_PNT_OPER_GREATER_EQUAL 0x03 +#define CTL_PNT_OPER_RANGE 0x04 +#define CTL_PNT_OPER_FIRST 0x05 +#define CTL_PNT_OPER_LAST 0x06 + +//Record Control Point Response Codes +#define CTL_PNT_RSP_SUCCESS 0x01 +#define CTL_PNT_RSP_OPCODE_NOT_SUPPORTED 0x02 +#define CTL_PNT_RSP_OPER_INVALID 0x03 +#define CTL_PNT_RSP_OPER_NOT_SUPPORTED 0x04 +#define CTL_PNT_RSP_OPERAND_INVALID 0x05 +#define CTL_PNT_RSP_NO_RECORDS 0x06 +#define CTL_PNT_RSP_ABORT_FAILED 0x07 +#define CTL_PNT_RSP_PROC_NOT_CMPL 0x08 +#define CTL_PNT_RSP_FILTER_NOT_SUPPORTED 0x09 + +//Record Control Point Filter Types +#define CTL_PNT_FILTER_SEQNUM 0x01 +#define CTL_PNT_FILTER_TIME 0x02 + +// Callback events +#define GLUCOSE_MEAS_NTF_ENABLED 1 +#define GLUCOSE_MEAS_NTF_DISABLED 2 +#define GLUCOSE_CONTEXT_NTF_ENABLED 3 +#define GLUCOSE_CONTEXT_NTF_DISABLED 4 +#define GLUCOSE_CTL_PNT_IND_ENABLED 5 +#define GLUCOSE_CTL_PNT_IND_DISABLED 6 +#define GLUCOSE_CTL_PNT_CMD 7 + +// Procedure timeout in ms +#define GLUCOSE_PROCEDURE_TIMEOUT 30000 + +// ATT status values +#define GLUCOSE_ERR_IN_PROGRESS 0x80 +#define GLUCOSE_ERR_CCC_CONFIG 0x81 + +/********************************************************************* + * TYPEDEFS + */ + +// Glucose Service callback function +typedef void (*glucoseServiceCB_t)(uint8 event, uint8* data, uint8 dataLen); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Glucose_AddService- Initializes the Glucose service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t Glucose_AddService( uint32 services ); + +/* + * Glucose_Register - Register a callback function with the + * Glucose Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void Glucose_Register( glucoseServiceCB_t pfnServiceCB); + +/* + * Glucose_SetParameter - Set a Glucose parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Glucose_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Glucose_GetParameter - Get a Glucose parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Glucose_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Glucose_MeasSend + * + * @brief Send a glucose measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_MeasSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Glucose_ContextSend + * + * @brief Send a glucose measurement context. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_ContextSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Glucose_CtlPntIndicate + * + * @brief Send an indication containing a glucose + * measurement. + * + * @param connHandle - connection handle + * @param pInd - pointer to indication structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_CtlPntIndicate( uint16 connHandle, attHandleValueInd_t *pInd, uint8 taskId ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GLUCOSESERVICE_H */ diff --git a/Firmware/Radio/Profiles/HIDDev/hid_uuid.h b/Firmware/Radio/Profiles/HIDDev/hid_uuid.h new file mode 100644 index 0000000..595f01f --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDev/hid_uuid.h @@ -0,0 +1,89 @@ +/************************************************************************************************** + Filename: hid_uuid.h + Revised: $Date: 2012-01-26 13:42:33 -0800 (Thu, 26 Jan 2012) $ + Revision: $Revision: 64 $ + + Description: This file contains UUIDs for the HID service. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HID_UUID_H +#define HID_UUID_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * CONSTANTS + */ + +/* HID service */ +#define HID_SERVICE_UUID 0x1812 + +/* HID characteristics */ +#define HID_BOOT_KEY_INPUT_UUID 0x2A22 // HID Boot Keyboard Input Report +#define HID_BOOT_KEY_OUTPUT_UUID 0x2A32 // HID Boot Keyboard Output Report +#define HID_BOOT_MOUSE_INPUT_UUID 0x2A33 // HID Boot Mouse Input Report +#define HID_INFORMATION_UUID 0x2A4A // HID Information +#define HID_REPORT_MAP_UUID 0x2A4B // HID Report Map +#define HID_CONTROL_POINT_UUID 0x2A4C // HID Control Point +#define HID_REPORT_UUID 0x2A4D // HID Report +#define HID_PROTOCOL_MODE_UUID 0x2A4E // HID Protocol Mode + +/* HID information flags */ +#define HID_FLAGS_REMOTE_WAKE 0x01 // RemoteWake +#define HID_FLAGS_NORMALLY_CONNECTABLE 0x02 // NormallyConnectable + +/* Control point commands */ +#define HID_CMD_SUSPEND 0x00 // Suspend +#define HID_CMD_EXIT_SUSPEND 0x01 // Exit Suspend + +/* HID protocol mode values */ +#define HID_PROTOCOL_MODE_BOOT 0x00 // Boot Protocol Mode +#define HID_PROTOCOL_MODE_REPORT 0x01 // Report Protocol Mode + +/* Attribute value lengths */ +#define HID_PROTOCOL_MODE_LEN 1 // HID Protocol Mode +#define HID_INFORMATION_LEN 4 // HID Information +#define HID_REPORT_REF_LEN 2 // HID Report Reference Descriptor +#define HID_EXT_REPORT_REF_LEN 2 // External Report Reference Descriptor + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HID_UUID_H */ diff --git a/Firmware/Radio/Profiles/HIDDev/hiddev.c b/Firmware/Radio/Profiles/HIDDev/hiddev.c new file mode 100644 index 0000000..3419342 --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDev/hiddev.c @@ -0,0 +1,1392 @@ +/************************************************************************************************** + Filename: hiddev.c + + Revised: $Date: 2012-01-26 13:42:33 -0800 (Thu, 26 Jan 2012) $ + Revision: $Revision: 64 $ + + Description: This file contains the common HID Device profile + for use with the CC2540 Bluetooth Low Energy Protocol Stack. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ + +#include "bcomdef.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "gatt.h" +#include "hci.h" +#include "gapgattserver.h" +#include "gattservapp.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "peripheral.h" +#include "gapbondmgr.h" +#include "devinfoservice.h" +#include "battservice.h" +#include "scanparamservice.h" +#include "hiddev.h" + +/********************************************************************* + * MACROS + */ + +// Battery measurement period in ms +#define DEFAULT_BATT_PERIOD 15000 + +// TRUE to run scan parameters refresh notify test +#define DEFAULT_SCAN_PARAM_NOTIFY_TEST TRUE + +// Advertising intervals (units of 625us, 160=100ms) +#define HID_INITIAL_ADV_INT_MIN 48 +#define HID_INITIAL_ADV_INT_MAX 80 +#define HID_HIGH_ADV_INT_MIN 32 +#define HID_HIGH_ADV_INT_MAX 48 +#define HID_LOW_ADV_INT_MIN 1600 +#define HID_LOW_ADV_INT_MAX 1600 + +// Advertising timeouts in msec +#define HID_INITIAL_ADV_TIMEOUT 60000 +#define HID_HIGH_ADV_TIMEOUT 5000 +#define HID_LOW_ADV_TIMEOUT 0 + +// Heart Rate Task Events +#define START_DEVICE_EVT 0x0001 +#define BATT_PERIODIC_EVT 0x0002 +#define HID_IDLE_EVT 0x0004 +#define HID_SEND_REPORT_EVT 0x0008 + +#define reportQEmpty() ( firstQIdx == lastQIdx ) + +/********************************************************************* + * CONSTANTS + */ + +#define HID_DEV_DATA_LEN 8 + +#ifdef HID_DEV_RPT_QUEUE_LEN + #define HID_DEV_REPORT_Q_SIZE (HID_DEV_RPT_QUEUE_LEN+1) +#else + #define HID_DEV_REPORT_Q_SIZE (10+1) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 id; + uint8 type; + uint8 len; + uint8 data[HID_DEV_DATA_LEN]; +} hidDevReport_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Task ID +uint8 hidDevTaskId; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// GAP State +static gaprole_States_t hidDevGapState = GAPROLE_INIT; + +// TRUE if connection is secure +static uint8 hidDevConnSecure = FALSE; + +// GAP connection handle +static uint16 gapConnHandle; + +// TRUE if pairing in progress +static uint8 hidDevPairingStarted = FALSE; + +// Status of last pairing +static uint8 pairingStatus = SUCCESS; + +static hidRptMap_t *pHidDevRptTbl; + +static uint8 hidDevRptTblLen; + +static hidDevCB_t *pHidDevCB; + +static hidDevCfg_t *pHidDevCfg; + +// Whether to change to the preferred connection parameters +static uint8 updateConnParams = TRUE; + +// Pending reports +static uint8 firstQIdx = 0; +static uint8 lastQIdx = 0; +static hidDevReport_t hidDevReportQ[HID_DEV_REPORT_Q_SIZE]; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void hidDev_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void hidDevProcessGattMsg( gattMsgEvent_t *pMsg ); +static void hidDevDisconnected( void ); +static void hidDevGapStateCB( gaprole_States_t newState ); +static void hidDevPairStateCB( uint16 connHandle, uint8 state, uint8 status ); +static void hidDevPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); +static void hidDevBattCB( uint8 event ); +static void hidDevScanParamCB( uint8 event ); +static void hidDevBattPeriodicTask( void ); +static hidRptMap_t *hidDevRptByHandle( uint16 handle ); +static hidRptMap_t *hidDevRptById( uint8 id, uint8 type ); +static hidRptMap_t *hidDevRptByCccdHandle( uint16 handle ); +static void hidDevEnqueueReport( uint8 id, uint8 type, uint8 len, uint8 *pData ); +static hidDevReport_t *hidDevDequeueReport( void ); +static void hidDevSendReport( uint8 id, uint8 type, uint8 len, uint8 *pData ); +static void hidDevHighAdvertising( void ); +static void hidDevLowAdvertising( void ); +static void hidDevInitialAdvertising( void ); +static uint8 hidDevBondCount( void ); +static void hidDevStartIdleTimer( void ); +static void hidDevStopIdleTimer( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// GAP Role Callbacks +static gapRolesCBs_t hidDev_PeripheralCBs = +{ + hidDevGapStateCB, // Profile State Change Callbacks + NULL // When a valid RSSI is read from controller +}; + +// Bond Manager Callbacks +static const gapBondCBs_t hidDevBondCB = +{ + hidDevPasscodeCB, + hidDevPairStateCB +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +void HidDev_Init( uint8 task_id ) +{ + hidDevTaskId = task_id; + + // Setup the GAP Bond Manager + { + uint8 syncWL = TRUE; + + // If a bond is created, the HID Device should write the address of the + // HID Host in the HID Device controller's white list and set the HID + // Device controller's advertising filter policy to 'process scan and + // connection requests only from devices in the White List'. + VOID GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_WL, sizeof( uint8 ), &syncWL ); + } + + // Set up services + GGS_AddService( GATT_ALL_SERVICES ); // GAP + GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes + DevInfo_AddService( ); + Batt_AddService( ); + ScanParam_AddService( ); + + // Register for Battery service callback + Batt_Register( hidDevBattCB ); + + // Register for Scan Parameters service callback + ScanParam_Register( hidDevScanParamCB ); + + // Setup a delayed profile startup + osal_set_event( hidDevTaskId, START_DEVICE_EVT ); +} + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ) +{ + + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( hidDevTaskId )) != NULL ) + { + hidDev_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & START_DEVICE_EVT ) + { + // Start the Device + VOID GAPRole_StartDevice( &hidDev_PeripheralCBs ); + + // Register with bond manager after starting device + GAPBondMgr_Register( (gapBondCBs_t *) &hidDevBondCB ); + + return ( events ^ START_DEVICE_EVT ); + } + + if ( events & HID_IDLE_EVT ) + { + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // if pairing in progress then restart timer + if ( hidDevPairingStarted ) + { + hidDevStartIdleTimer(); + } + // else disconnect + else + { + GAPRole_TerminateConnection(); + } + } + + return ( events ^ HID_IDLE_EVT ); + } + + if ( events & BATT_PERIODIC_EVT ) + { + // Perform periodic battery task + hidDevBattPeriodicTask(); + + return ( events ^ BATT_PERIODIC_EVT ); + } + + if ( events & HID_SEND_REPORT_EVT ) + { + // if connection is secure + if ( hidDevConnSecure ) + { + hidDevReport_t *pReport = hidDevDequeueReport(); + + if ( pReport != NULL ) + { + // Send report + hidDevSendReport( pReport->id, pReport->type, pReport->len, pReport->data ); + } + + return ( reportQEmpty() ? events ^ HID_SEND_REPORT_EVT : events ); + } + + return ( events ^ HID_SEND_REPORT_EVT ); + } + + return 0; +} + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ) +{ + pHidDevCB = pCBs; + pHidDevCfg = pCfg; +} + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ) +{ + pHidDevRptTbl = pRpt; + hidDevRptTblLen = numReports; +} + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8*pData ) +{ + // if connected + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // if connection is secure + if ( hidDevConnSecure ) + { + // After service discovery and encryption, the HID Device should request to + // change to the preferred connection parameters that best suit its use case. + if ( updateConnParams ) + { + GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_REQ, sizeof( uint8 ), &updateConnParams ); + updateConnParams = FALSE; + } + + // Make sure there're no pending reports + if ( reportQEmpty() ) + { + // send report + hidDevSendReport( id, type, len, pData ); + + return; // we're done + } + } + } + // else if not already advertising + else if ( hidDevGapState != GAPROLE_ADVERTISING ) + { + // if bonded + if ( hidDevBondCount() > 0 ) + { + // start high duty cycle advertising + hidDevHighAdvertising(); + } + // else not bonded + else + { + // start initial advertising + hidDevInitialAdvertising(); + } + } + + // hidDev task will send report when secure connection is established + hidDevEnqueueReport( id, type, len, pData ); +} + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +void HidDev_Close( void ) +{ + uint8 param; + + // if connected then disconnect + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + GAPRole_TerminateConnection(); + } + // else stop advertising + else + { + param = FALSE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); + } +} + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HIDDEV_ERASE_ALLBONDS: + if ( len == 0 ) + { + // Drop connection + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + GAPRole_TerminateConnection(); + } + + // Erase bonding info + GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, NULL ); + + // Flush report queue + firstQIdx = lastQIdx = 0; + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HidDev_GetParameter( uint8 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +void HidDev_PasscodeRsp( uint8 status, uint32 passcode ) +{ + // Send passcode response + GAPBondMgr_PasscodeRsp( gapConnHandle, status, passcode ); +} + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + hidRptMap_t *pRpt; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + // Only report map is long + if ( offset > 0 && uuid != HID_REPORT_MAP_UUID ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( uuid == HID_REPORT_UUID || + uuid == HID_BOOT_KEY_INPUT_UUID || + uuid == HID_BOOT_KEY_OUTPUT_UUID || + uuid == HID_BOOT_MOUSE_INPUT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // find report ID in table + if ( (pRpt = hidDevRptByHandle(pAttr->handle)) != NULL ) + { + // execute report callback + status = (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, HID_DEV_OPER_READ, + pLen, pValue ); + } + else + { + *pLen = 0; + } + } + else if ( uuid == HID_REPORT_MAP_UUID ) + { + // verify offset + if ( offset >= hidReportMapLen ) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN( maxLen, (hidReportMapLen - offset) ); + + // copy data + osal_memcpy( pValue, pAttr->pValue + offset, *pLen ); + } + } + else if ( uuid == HID_INFORMATION_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + *pLen = HID_INFORMATION_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_INFORMATION_LEN ); + } + else if ( uuid == GATT_REPORT_REF_UUID ) + { + *pLen = HID_REPORT_REF_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_REPORT_REF_LEN ); + } + else if ( uuid == HID_PROTOCOL_MODE_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + *pLen = HID_PROTOCOL_MODE_LEN; + pValue[0] = pAttr->pValue[0]; + } + else if ( uuid == GATT_EXT_REPORT_REF_UUID ) + { + *pLen = HID_EXT_REPORT_REF_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_EXT_REPORT_REF_LEN ); + } + + // restart idle timer + if ( status == SUCCESS ) + { + hidDevStartIdleTimer(); + } + + return ( status ); +} + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + hidRptMap_t *pRpt; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if ( uuid == HID_REPORT_UUID || + uuid == HID_BOOT_KEY_OUTPUT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // find report ID in table + if ((pRpt = hidDevRptByHandle(pAttr->handle)) != NULL) + { + // execute report callback + status = (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, HID_DEV_OPER_WRITE, + &len, pValue ); + } + } + else if ( uuid == HID_CONTROL_POINT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // Validate length and value range + if ( len == 1 ) + { + if ( pValue[0] == HID_CMD_SUSPEND || pValue[0] == HID_CMD_EXIT_SUSPEND ) + { + // execute HID app event callback + (*pHidDevCB->evtCB)( (pValue[0] == HID_CMD_SUSPEND) ? + HID_DEV_SUSPEND_EVT : HID_DEV_EXIT_SUSPEND_EVT ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( uuid == GATT_CLIENT_CHAR_CFG_UUID ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + // find report ID in table + if ( (pRpt = hidDevRptByCccdHandle(pAttr->handle)) != NULL ) + { + // execute report callback + (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, + (charCfg == GATT_CLIENT_CFG_NOTIFY) ? + HID_DEV_OPER_ENABLE : HID_DEV_OPER_DISABLE, + &len, pValue ); + } + } + } + else if ( uuid == HID_PROTOCOL_MODE_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + if ( len == HID_PROTOCOL_MODE_LEN ) + { + if ( pValue[0] == HID_PROTOCOL_MODE_BOOT || + pValue[0] == HID_PROTOCOL_MODE_REPORT ) + { + pAttr->pValue[0] = pValue[0]; + + // execute HID app event callback + (*pHidDevCB->evtCB)( (pValue[0] == HID_PROTOCOL_MODE_BOOT) ? + HID_DEV_SET_BOOT_EVT : HID_DEV_SET_REPORT_EVT ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + + // restart idle timer + if (status == SUCCESS) + { + hidDevStartIdleTimer(); + } + + return ( status ); +} + +/********************************************************************* + * @fn hidDev_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void hidDev_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GATT_MSG_EVENT: + hidDevProcessGattMsg( (gattMsgEvent_t *) pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn hidDevProcessGattMsg + * + * @brief Process GATT messages + * + * @return none + */ +static void hidDevProcessGattMsg( gattMsgEvent_t *pMsg ) +{ + +} + +/********************************************************************* + * @fn hidDevHandleConnStatusCB + * + * @brief Reset client char config. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void hidDevHandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + uint16 retHandle; + gattAttribute_t *pAttr; + + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->cccdHandle != 0 ) + { + if ( (pAttr = GATT_FindHandle(p->cccdHandle, &retHandle)) != NULL ) + { + GATTServApp_InitCharCfg( connHandle, (gattCharCfg_t *) pAttr->pValue ); + } + } + } + } + } +} + +/********************************************************************* + * @fn hidDevDisconnected + * + * @brief Handle disconnect. + * + * @return none + */ +static void hidDevDisconnected( void ) +{ + // Stop idle timer + hidDevStopIdleTimer(); + + // Reset client characteristic configuration descriptors + Batt_HandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + ScanParam_HandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + hidDevHandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + + // Reset state variables + hidDevConnSecure = FALSE; + hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + hidDevPairingStarted = FALSE; + + // if bonded and normally connectable start advertising + if ( ( hidDevBondCount() > 0 ) && + ( pHidDevCfg->hidFlags & HID_FLAGS_NORMALLY_CONNECTABLE ) ) + { + hidDevLowAdvertising(); + } +} + +/********************************************************************* + * @fn hidDevGapStateCB + * + * @brief Notification from the profile of a state change. + * + * @param newState - new state + * + * @return none + */ +static void hidDevGapStateCB( gaprole_States_t newState ) +{ + // if connected + if ( newState == GAPROLE_CONNECTED ) + { + // get connection handle + GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle ); + + // connection not secure yet + hidDevConnSecure = FALSE; + + // don't start advertising when connection is closed + uint8 param = FALSE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); + + // start idle timer + hidDevStartIdleTimer(); + } + // if disconnected + else if ( hidDevGapState == GAPROLE_CONNECTED && + newState != GAPROLE_CONNECTED ) + { + hidDevDisconnected(); + updateConnParams = TRUE; + + if ( pairingStatus == SMP_PAIRING_FAILED_CONFIRM_VALUE ) + { + // bonding failed due to mismatched confirm values + hidDevInitialAdvertising(); + + pairingStatus = SUCCESS; + } + } + // if started + else if ( newState == GAPROLE_STARTED ) + { + // nothing to do for now! + } + + hidDevGapState = newState; +} + +/********************************************************************* + * @fn hidDevPairStateCB + * + * @brief Pairing state callback. + * + * @return none + */ +static void hidDevPairStateCB( uint16 connHandle, uint8 state, uint8 status ) +{ + if ( state == GAPBOND_PAIRING_STATE_STARTED ) + { + hidDevPairingStarted = TRUE; + } + else if ( state == GAPBOND_PAIRING_STATE_COMPLETE ) + { + hidDevPairingStarted = FALSE; + + if ( status == SUCCESS ) + { + hidDevConnSecure = TRUE; + } + + pairingStatus = status; + } + else if ( state == GAPBOND_PAIRING_STATE_BONDED ) + { + if ( status == SUCCESS ) + { + hidDevConnSecure = TRUE; + +#if DEFAULT_SCAN_PARAM_NOTIFY_TEST == TRUE + ScanParam_RefreshNotify( gapConnHandle ); +#endif + } + } + + if ( !reportQEmpty() && hidDevConnSecure ) + { + // Notify our task to send out pending reports + osal_set_event( hidDevTaskId, HID_SEND_REPORT_EVT ); + } +} + +/********************************************************************* + * @fn hidDevPasscodeCB + * + * @brief Passcode callback. + * + * @param deviceAddr - address of device to pair with, and could be either public or random. + * @param connectionHandle - connection handle + * @param uiInputs - pairing User Interface Inputs - Ask user to input passcode + * @param uiOutputs - pairing User Interface Outputs - Display passcode + * + * @return none + */ +static void hidDevPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ) +{ + if ( pHidDevCB && pHidDevCB->passcodeCB ) + { + // execute HID app passcode callback + (*pHidDevCB->passcodeCB)( deviceAddr, connectionHandle, uiInputs, uiOutputs ); + } + else + { + // Send passcode response + GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, 0 ); + } +} + +/********************************************************************* + * @fn hidDevBattCB + * + * @brief Callback function for battery service. + * + * @param event - service event + * + * @return none + */ +static void hidDevBattCB( uint8 event ) +{ + if ( event == BATT_LEVEL_NOTI_ENABLED ) + { + // if connected start periodic measurement + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + osal_start_timerEx( hidDevTaskId, BATT_PERIODIC_EVT, DEFAULT_BATT_PERIOD ); + } + } + else if ( event == BATT_LEVEL_NOTI_DISABLED ) + { + // stop periodic measurement + osal_stop_timerEx( hidDevTaskId, BATT_PERIODIC_EVT ); + } +} + +/********************************************************************* + * @fn hidDevScanParamCB + * + * @brief Callback function for scan parameter service. + * + * @param event - service event + * + * @return none + */ +static void hidDevScanParamCB( uint8 event ) +{ + +} + +/********************************************************************* + * @fn hidDevBattPeriodicTask + * + * @brief Perform a periodic task for battery measurement. + * + * @param none + * + * @return none + */ +static void hidDevBattPeriodicTask( void ) +{ + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // perform battery level check + Batt_MeasLevel( ); + + // Restart timer + osal_start_timerEx( hidDevTaskId, BATT_PERIODIC_EVT, DEFAULT_BATT_PERIOD ); + } +} + +/********************************************************************* + * @fn hidDevRptByHandle + * + * @brief Find the HID report structure for the given handle. + * + * @param handle - ATT handle + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptByHandle( uint16 handle ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->handle == handle && p->mode == hidProtocolMode) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevRptByCccdHandle + * + * @brief Find the HID report structure for the given CCC handle. + * + * @param handle - ATT handle + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptByCccdHandle( uint16 handle ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->cccdHandle == handle) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevRptById + * + * @brief Find the HID report structure for the Report ID and type. + * + * @param id - HID report ID + * @param type - HID report type + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptById( uint8 id, uint8 type ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->id == id && p->type == type && p->mode == hidProtocolMode ) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevSendReport + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static void hidDevSendReport( uint8 id, uint8 type, uint8 len, uint8 *pData ) +{ + hidRptMap_t *pRpt; + gattAttribute_t *pAttr; + attHandleValueNoti_t noti; + uint16 retHandle; + + // get att handle for report + if ( (pRpt = hidDevRptById(id, type)) != NULL ) + { + // if notifications are enabled + if ( (pAttr = GATT_FindHandle(pRpt->cccdHandle, &retHandle)) != NULL ) + { + uint16 value; + + value = GATTServApp_ReadCharCfg( gapConnHandle, (gattCharCfg_t *) pAttr->pValue ); + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // send notification + noti.handle = pRpt->handle; + noti.len = len; + osal_memcpy(noti.value, pData, len); + GATT_Notification( gapConnHandle, ¬i, FALSE ); + + // start idle timer + hidDevStartIdleTimer(); + } + } + } +} + +/********************************************************************* + * @fn hidDevEnqueueReport + * + * @brief Enqueue a HID report to be sent later. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static void hidDevEnqueueReport( uint8 id, uint8 type, uint8 len, uint8 *pData ) +{ + // Enqueue only if bonded + if ( hidDevBondCount() > 0 ) + { + // Update last index + lastQIdx = ( lastQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + + if ( lastQIdx == firstQIdx ) + { + // Queue overflow; discard oldest report + firstQIdx = ( firstQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + } + + // Save report + hidDevReportQ[lastQIdx].id = id; + hidDevReportQ[lastQIdx].type = type; + hidDevReportQ[lastQIdx].len = len; + osal_memcpy( hidDevReportQ[lastQIdx].data, pData, len ); + + if ( hidDevConnSecure ) + { + // Notify our task to send out pending reports + osal_set_event( hidDevTaskId, HID_SEND_REPORT_EVT ); + } + } +} + +/********************************************************************* + * @fn hidDevDequeueReport + * + * @brief Dequeue a HID report to be sent out. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static hidDevReport_t *hidDevDequeueReport( void ) +{ + if ( reportQEmpty() ) + { + return NULL; + } + + // Update first index + firstQIdx = ( firstQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + + return ( &(hidDevReportQ[firstQIdx]) ); +} + +/********************************************************************* + * @fn hidDevHighAdvertising + * + * @brief Start advertising at a high duty cycle. + + * @param None. + * + * @return None. + */ +static void hidDevHighAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_HIGH_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_HIGH_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_HIGH_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_WHITE; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevLowAdvertising + * + * @brief Start advertising at a low duty cycle. + * + * @param None. + * + * @return None. + */ +static void hidDevLowAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_LOW_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_LOW_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_LOW_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_WHITE; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + VOID GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevInitialAdvertising + * + * @brief Start advertising for initial connection + * + * @return None. + */ +static void hidDevInitialAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_INITIAL_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_INITIAL_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_INITIAL_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_ALL; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + VOID GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevBondCount + * + * @brief Gets the total number of bonded devices. + * + * @param None. + * + * @return number of bonded devices. + */ +static uint8 hidDevBondCount( void ) +{ + uint8 bondCnt = 0; + + VOID GAPBondMgr_GetParameter( GAPBOND_BOND_COUNT, &bondCnt ); + + return ( bondCnt ); +} + +/********************************************************************* + * @fn hidDevStartIdleTimer + * + * @brief Start the idle timer. + * + * @return None. + */ +static void hidDevStartIdleTimer( void ) +{ + if ( pHidDevCfg->idleTimeout > 0 ) + { + osal_start_timerEx( hidDevTaskId, HID_IDLE_EVT, pHidDevCfg->idleTimeout ); + } +} + +/********************************************************************* + * @fn hidDevStopIdleTimer + * + * @brief Stop the idle timer. + * + * @return None. + */ +static void hidDevStopIdleTimer( void ) +{ + osal_stop_timerEx( hidDevTaskId, HID_IDLE_EVT ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/HIDDev/hiddev.h b/Firmware/Radio/Profiles/HIDDev/hiddev.h new file mode 100644 index 0000000..bd0d1d6 --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDev/hiddev.h @@ -0,0 +1,453 @@ +/************************************************************************************************** + Filename: hiddev.h + Revised: $Date: 2011-11-10 15:29:40 -0800 (Thu, 10 Nov 2011) $ + Revision: $Revision: 53 $ + + Description: This file contains the common HID Device profile. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDDEV_H +#define HIDDEV_H + +#include "hid_uuid.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// HID Device Parameters +#define HIDDEV_ERASE_ALLBONDS 0 // Erase all of the bonded devices. Write Only. No Size. + +// HID read/write operation +#define HID_DEV_OPER_WRITE 0 // Write operation +#define HID_DEV_OPER_READ 1 // Read operation +#define HID_DEV_OPER_ENABLE 2 // Notification enabled for report ID +#define HID_DEV_OPER_DISABLE 3 // Notifications disabled for report ID + +// HID callback events +#define HID_DEV_SUSPEND_EVT 0 // HID suspend +#define HID_DEV_EXIT_SUSPEND_EVT 1 // HID exit suspend +#define HID_DEV_SET_BOOT_EVT 2 // HID set boot mode +#define HID_DEV_SET_REPORT_EVT 3 // HID set report mode + +/* HID Report type */ +#define HID_REPORT_TYPE_INPUT 1 +#define HID_REPORT_TYPE_OUTPUT 2 +#define HID_REPORT_TYPE_FEATURE 3 + +// HID Keyboard/Keypad Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#define HID_KEYBOARD_RESERVED 0 // 0x00 - No event inidicated +#define HID_KEYBOARD_A 4 // 0x04 - Keyboard a and A +#define HID_KEYBOARD_B 5 // 0x05 - Keyboard b and B +#define HID_KEYBOARD_C 6 // 0x06 - Keyboard c and C +#define HID_KEYBOARD_D 7 // 0x07 - Keyboard d and D +#define HID_KEYBOARD_E 8 // 0x08 - Keyboard e and E +#define HID_KEYBOARD_F 9 // 0x09 - Keyboard f and F +#define HID_KEYBOARD_G 10 // 0x0A - Keyboard g and G +#define HID_KEYBOARD_H 11 // 0x0B - Keyboard h and H +#define HID_KEYBOARD_I 12 // 0x0C - Keyboard i and I +#define HID_KEYBOARD_J 13 // 0x0D - Keyboard j and J +#define HID_KEYBOARD_K 14 // 0x0E - Keyboard k and K +#define HID_KEYBOARD_L 15 // 0x0F - Keyboard l and L +#define HID_KEYBOARD_M 16 // 0x10 - Keyboard m and M +#define HID_KEYBOARD_N 17 // 0x11 - Keyboard n and N +#define HID_KEYBOARD_O 18 // 0x12 - Keyboard o and O +#define HID_KEYBOARD_P 19 // 0x13 - Keyboard p and p +#define HID_KEYBOARD_Q 20 // 0x14 - Keyboard q and Q +#define HID_KEYBOARD_R 21 // 0x15 - Keyboard r and R +#define HID_KEYBOARD_S 22 // 0x16 - Keyboard s and S +#define HID_KEYBOARD_T 23 // 0x17 - Keyboard t and T +#define HID_KEYBOARD_U 24 // 0x18 - Keyboard u and U +#define HID_KEYBOARD_V 25 // 0x19 - Keyboard v and V +#define HID_KEYBOARD_W 26 // 0x1A - Keyboard w and W +#define HID_KEYBOARD_X 27 // 0x1B - Keyboard x and X +#define HID_KEYBOARD_Y 28 // 0x1C - Keyboard y and Y +#define HID_KEYBOARD_Z 29 // 0x1D - Keyboard z and Z +#define HID_KEYBOARD_1 30 // 0x1E - Keyboard 1 and ! +#define HID_KEYBOARD_2 31 // 0x1F - Keyboard 2 and @ +#define HID_KEYBOARD_3 32 // 0x20 - Keyboard 3 and # +#define HID_KEYBOARD_4 33 // 0x21 - Keyboard 4 and % +#define HID_KEYBOARD_5 34 // 0x22 - Keyboard 5 and % +#define HID_KEYBOARD_6 35 // 0x23 - Keyboard 6 and ^ +#define HID_KEYBOARD_7 36 // 0x24 - Keyboard 7 and & +#define HID_KEYBOARD_8 37 // 0x25 - Keyboard 8 and * +#define HID_KEYBOARD_9 38 // 0x26 - Keyboard 9 and ( +#define HID_KEYBOARD_0 39 // 0x27 - Keyboard 0 and ) +#define HID_KEYBOARD_RETURN 40 // 0x28 - Keyboard Return (ENTER) +#define HID_KEYBOARD_ESCAPE 41 // 0x29 - Keyboard ESCAPE +#define HID_KEYBOARD_DELETE 42 // 0x2A - Keyboard DELETE (Backspace) +#define HID_KEYBOARD_TAB 43 // 0x2B - Keyboard Tab +#define HID_KEYBOARD_SPACEBAR 44 // 0x2C - Keyboard Spacebar +#define HID_KEYBOARD_MINUS 45 // 0x2D - Keyboard - and (underscore) +#define HID_KEYBOARD_EQUAL 46 // 0x2E - Keyboard = and + +#define HID_KEYBOARD_LEFT_BRKT 47 // 0x2F - Keyboard [ and { +#define HID_KEYBOARD_RIGHT_BRKT 48 // 0x30 - Keyboard ] and } +#define HID_KEYBOARD_BACK_SLASH 49 // 0x31 - Keyboard \ and | +#define HID_KEYBOARD_SEMI_COLON 51 // 0x33 - Keyboard ; and : +#define HID_KEYBOARD_SGL_QUOTE 52 // 0x34 - Keyboard ' and " +#define HID_KEYBOARD_GRV_ACCENT 53 // 0x35 - Keyboard Grave Accent and Tilde +#define HID_KEYBOARD_COMMA 54 // 0x36 - Keyboard , and < +#define HID_KEYBOARD_DOT 55 // 0x37 - Keyboard . and > +#define HID_KEYBOARD_FWD_SLASH 56 // 0x38 - Keyboard / and ? +#define HID_KEYBOARD_CAPS_LOCK 57 // 0x39 - Keyboard Caps Lock +#define HID_KEYBOARD_F1 58 // 0x3A - Keyboard F1 +#define HID_KEYBOARD_F2 59 // 0x3B - Keyboard F2 +#define HID_KEYBOARD_F3 60 // 0x3C - Keyboard F3 +#define HID_KEYBOARD_F4 61 // 0x3D - Keyboard F4 +#define HID_KEYBOARD_F5 62 // 0x3E - Keyboard F5 +#define HID_KEYBOARD_F6 63 // 0x3F - Keyboard F6 +#define HID_KEYBOARD_F7 64 // 0x40 - Keyboard F7 +#define HID_KEYBOARD_F8 65 // 0x41 - Keyboard F8 +#define HID_KEYBOARD_F9 66 // 0x42 - Keyboard F9 +#define HID_KEYBOARD_F10 67 // 0x43 - Keyboard F10 +#define HID_KEYBOARD_F11 68 // 0x44 - Keyboard F11 +#define HID_KEYBOARD_F12 69 // 0x45 - Keyboard F12 +#define HID_KEYBOARD_PRNT_SCREEN 70 // 0x46 - Keyboard Print Screen +#define HID_KEYBOARD_SCROLL_LOCK 71 // 0x47 - Keyboard Scroll Lock +#define HID_KEYBOARD_PAUSE 72 // 0x48 - Keyboard Pause +#define HID_KEYBOARD_INSERT 73 // 0x49 - Keyboard Insert +#define HID_KEYBOARD_HOME 74 // 0x4A - Keyboard Home +#define HID_KEYBOARD_PAGE_UP 75 // 0x4B - Keyboard PageUp +#define HID_KEYBOARD_DELETE_FWD 76 // 0x4C - Keyboard Delete Forward +#define HID_KEYBOARD_END 77 // 0x4D - Keyboard End +#define HID_KEYBOARD_PAGE_DOWN 78 // 0x4E - Keyboard PageDown +#define HID_KEYBOARD_RIGHT_ARROW 79 // 0x4F - Keyboard RightArrow +#define HID_KEYBOARD_LEFT_ARROW 80 // 0x50 - Keyboard LeftArrow +#define HID_KEYBOARD_DOWN_ARROW 81 // 0x51 - Keyboard DownArrow +#define HID_KEYBOARD_UP_ARROW 82 // 0x52 - Keyboard UpArrow +#define HID_KEYBPAD_NUM_LOCK 83 // 0x53 - Keypad Num Lock and Clear +#define HID_KEYBPAD_DIVIDE 84 // 0x54 - Keypad / +#define HID_KEYBOARD_MULTIPLY 85 // 0x55 - Keypad * +#define HID_KEYBOARD_SUBTRACT 86 // 0x56 - Keypad - +#define HID_KEYBPAD_ADD 87 // 0x57 - Keypad + +#define HID_KEYBPAD_ENTER 88 // 0x58 - Keypad ENTER +#define HID_KEYBPAD_1 89 // 0x59 - Keypad 1 and End +#define HID_KEYBPAD_2 90 // 0x5A - Keypad 2 and Down Arrow +#define HID_KEYBPAD_3 91 // 0x5B - Keypad 3 and PageDn +#define HID_KEYBPAD_4 92 // 0x5C - Keypad 4 and Lfet Arrow +#define HID_KEYBPAD_5 93 // 0x5D - Keypad 5 +#define HID_KEYBPAD_6 94 // 0x5E - Keypad 6 and Right Arrow +#define HID_KEYBPAD_7 95 // 0x5F - Keypad 7 and Home +#define HID_KEYBPAD_8 96 // 0x60 - Keypad 8 and Up Arrow +#define HID_KEYBPAD_9 97 // 0x61 - Keypad 9 and PageUp +#define HID_KEYBPAD_0 98 // 0x62 - Keypad 0 and Insert +#define HID_KEYBPAD_DOT 99 // 0x63 - Keypad . and Delete +#define HID_KEYBOARD_MUTE 127 // 0x7F - Keyboard Mute +#define HID_KEYBOARD_VOLUME_UP 128 // 0x80 - Keyboard Volume up +#define HID_KEYBOARD_VOLUME_DOWN 129 // 0x81 - Keyboard Volume down +#define HID_KEYBOARD_LEFT_CTRL 224 // 0xE0 - Keyboard LeftContorl +#define HID_KEYBOARD_LEFT_SHIFT 225 // 0xE1 - Keyboard LeftShift +#define HID_KEYBOARD_LEFT_ALT 226 // 0xE2 - Keyboard LeftAlt +#define HID_KEYBOARD_LEFT_GUI 227 // 0xE3 - Keyboard LeftGUI +#define HID_KEYBOARD_RIGHT_CTRL 228 // 0xE4 - Keyboard LeftContorl +#define HID_KEYBOARD_RIGHT_SHIFT 229 // 0xE5 - Keyboard LeftShift +#define HID_KEYBOARD_RIGHT_ALT 230 // 0xE6 - Keyboard LeftAlt +#define HID_KEYBOARD_RIGHT_GUI 231 // 0xE7 - Keyboard RightGUI + +#define HID_MOUSE_BUTTON_LEFT 253 +#define HID_MOUSE_BUTTON_MIDDLE 254 +#define HID_MOUSE_BUTTON_RIGHT 255 + +// HID Consumer Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#define HID_CONSUMER_POWER 48 // 0x30 - Power +#define HID_CONSUMER_RESET 49 // 0x31 - Reset +#define HID_CONSUMER_SLEEP 50 // 0x32 - Sleep + +#define HID_CONSUMER_MENU 64 // 0x40 - Menu +#define HID_CONSUMER_SELECTION 128 // 0x80 - Selection +#define HID_CONSUMER_ASSIGN_SEL 129 // 0x81 - Assign Selection +#define HID_CONSUMER_MODE_STEP 130 // 0x82 - Mode Step +#define HID_CONSUMER_RECALL_LAST 131 // 0x83 - Recall Last +#define HID_CONSUMER_QUIT 148 // 0x94 - Quit +#define HID_CONSUMER_HELP 149 // 0x95 - Help +#define HID_CONSUMER_CHANNEL_UP 156 // 0x9C - Channel Increment +#define HID_CONSUMER_CHANNEL_DOWN 157 // 0x9D - Channel Decrement + +#define HID_CONSUMER_PLAY 176 // 0xB0 - Play +#define HID_CONSUMER_PAUSE 177 // 0xB1 - Pause +#define HID_CONSUMER_RECORD 178 // 0xB2 - Record +#define HID_CONSUMER_FAST_FORWARD 179 // 0xB3 - Fast Forward +#define HID_CONSUMER_REWIND 180 // 0xB4 - Rewind +#define HID_CONSUMER_SCAN_NEXT_TRK 181 // 0xB5 - Scan Next Track +#define HID_CONSUMER_SCAN_PREV_TRK 182 // 0xB6 - Scan Previous Track +#define HID_CONSUMER_STOP 183 // 0xB7 - Stop +#define HID_CONSUMER_EJECT 184 // 0xB8 - Eject +#define HID_CONSUMER_RANDOM_PLAY 185 // 0xB9 - Random Play +#define HID_CONSUMER_SELECT_DISC 186 // 0xBA - Select Disk +#define HID_CONSUMER_ENTER_DISC 187 // 0xBB - Enter Disc +#define HID_CONSUMER_REPEAT 188 // 0xBC - Repeat +#define HID_CONSUMER_STOP_EJECT 204 // 0xCC - Stop/Eject +#define HID_CONSUMER_PLAY_PAUSE 205 // 0xCD - Play/Pause +#define HID_CONSUMER_PLAY_SKIP 206 // 0xCE - Play/Skip + +#define HID_CONSUMER_VOLUME 224 // 0xE0 - Volume +#define HID_CONSUMER_BALANCE 225 // 0xE1 - Balance +#define HID_CONSUMER_MUTE 226 // 0xE2 - Mute +#define HID_CONSUMER_BASS 227 // 0xE3 - Bass +#define HID_CONSUMER_VOLUME_UP 233 // 0xE9 - Volume Increment +#define HID_CONSUMER_VOLUME_DOWN 234 // 0xEA - Volume Decrement + +/********************************************************************* + * TYPEDEFS + */ + +// HID report mapping table +typedef struct +{ + uint16 handle; // Handle of report characteristic + uint16 cccdHandle; // Handle of CCCD for report characteristic + uint8 id; // Report ID + uint8 type; // Report type + uint8 mode; // Protocol mode (report or boot) +} hidRptMap_t; + +// HID dev configuration structure +typedef struct +{ + uint16 idleTimeout; // Idle timeout in milliseconds + uint8 hidFlags; // HID feature flags + +} hidDevCfg_t; + +/********************************************************************* + * Global Variables + */ + +// These variables are defined in the service .c file that uses HID Dev + +// HID report map length +extern uint8 hidReportMapLen; + +// HID protocol mode +extern uint8 hidProtocolMode; + +/********************************************************************* + * Profile Callbacks + */ + +// HID Report callback +typedef uint8 (*hidDevReportCB_t)( uint8 id, uint8 type, uint8 oper, + uint8 *pLen, uint8 *pData ); + +// HID event callback +typedef void (*hidDevEvtCB_t)( uint8 evt ); + +// HID passcode callback +typedef void (*hidDevPasscodeCB_t)( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); + +typedef struct +{ + hidDevReportCB_t reportCB; + hidDevEvtCB_t evtCB; + hidDevPasscodeCB_t passcodeCB; +} hidDevCB_t; + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +extern void HidDev_Init( uint8 task_id ); + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pCBs - Callback function. + * + * @return None. + */ +extern void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ); + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +extern void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ); + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +extern void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8 *pData ); + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +extern void HidDev_Close( void ); + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_GetParameter( uint8 param, void *pValue ); + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +extern void HidDev_PasscodeRsp( uint8 status, uint32 passcode ); + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +extern bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDDEV_H */ diff --git a/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.c b/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.c new file mode 100644 index 0000000..1968f5c --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.c @@ -0,0 +1,835 @@ +/************************************************************************************************** + Filename: hidkbmservice.c + Revised: $Date: 2012-05-29 15:29:05 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30647 $ + + Description: This file contains the HID service for a keyboard/mouse. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "gattservapp.h" +#include "hidkbmservice.h" +#include "hid_uuid.h" +#include "hiddev.h" +#include "battservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// HID service +CONST uint8 hidServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_SERVICE_UUID), HI_UINT16(HID_SERVICE_UUID) +}; + +// HID Boot Keyboard Input Report characteristic +CONST uint8 hidBootKeyInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_INPUT_UUID), HI_UINT16(HID_BOOT_KEY_INPUT_UUID) +}; + +// HID Boot Mouse Input Report characteristic +CONST uint8 hidBootMouseInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_MOUSE_INPUT_UUID), HI_UINT16(HID_BOOT_MOUSE_INPUT_UUID) +}; + +// HID Boot Keyboard Output Report characteristic +CONST uint8 hidBootKeyOutputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_OUTPUT_UUID), HI_UINT16(HID_BOOT_KEY_OUTPUT_UUID) +}; + +// HID Information characteristic +CONST uint8 hidInfoUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_INFORMATION_UUID), HI_UINT16(HID_INFORMATION_UUID) +}; + +// HID Report Map characteristic +CONST uint8 hidReportMapUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_MAP_UUID), HI_UINT16(HID_REPORT_MAP_UUID) +}; + +// HID Control Point characteristic +CONST uint8 hidControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_CONTROL_POINT_UUID), HI_UINT16(HID_CONTROL_POINT_UUID) +}; + +// HID Report characteristic +CONST uint8 hidReportUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_UUID), HI_UINT16(HID_REPORT_UUID) +}; + +// HID Protocol Mode characteristic +CONST uint8 hidProtocolModeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_PROTOCOL_MODE_UUID), HI_UINT16(HID_PROTOCOL_MODE_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// HID Information characteristic value +static CONST uint8 hidInfo[HID_INFORMATION_LEN] = +{ + LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) + 0x00, // bCountryCode + HID_KBD_FLAGS // Flags +}; + +// HID Report Map characteristic value +// Keyboard report descriptor (using format for Boot interface descriptor) +static CONST uint8 hidReportMap[] = +{ + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report Id (1) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Buttons) + 0x19, 0x01, // Usage Minimum (01) - Button 1 + 0x29, 0x03, // Usage Maximum (03) - Button 3 + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x03, // Report Count (3) + 0x81, 0x02, // Input (Data, Variable, Absolute) - Button states + 0x75, 0x05, // Report Size (5) + 0x95, 0x01, // Report Count (1) + 0x81, 0x01, // Input (Constant) - Padding or Reserved bits + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x38, // Usage (Wheel) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x03, // Report Count (3) + 0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate + 0xC0, // End Collection + 0xC0, // End Collection + + 0x05, 0x01, // Usage Pg (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection: (Application) + 0x85, 0x02, // Report Id (2) + // + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0xE0, // Usage Min (224) + 0x29, 0xE7, // Usage Max (231) + 0x15, 0x00, // Log Min (0) + 0x25, 0x01, // Log Max (1) + // + // Modifier byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input: (Data, Variable, Absolute) + // + // Reserved byte + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input: (Constant) + // + // LED report + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Pg (LEDs) + 0x19, 0x01, // Usage Min (1) + 0x29, 0x05, // Usage Max (5) + 0x91, 0x02, // Output: (Data, Variable, Absolute) + // + // LED report padding + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output: (Constant) + // + // Key arrays (6 bytes) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Log Min (0) + 0x25, 0x65, // Log Max (101) + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0x00, // Usage Min (0) + 0x29, 0x65, // Usage Max (101) + 0x81, 0x00, // Input: (Data, Array) + // + 0xC0, // End Collection + // + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x01, // Usage (Consumer Control) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x03, // Report Id (3) + 0x09, 0x02, // Usage (Numeric Key Pad) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x0A, // Usage Max (Button 10) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0A, // Logical Max (10) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x86, // Usage (Channel) + 0x15, 0xFF, // Logical Min (-1) + 0x25, 0x01, // Logical Max (1) + 0x75, 0x02, // Report Size (2) + 0x95, 0x01, // Report Count (1) + 0x81, 0x46, // Input (Data, Var, Rel, Null) + 0x09, 0xE9, // Usage (Volume Up) + 0x09, 0xEA, // Usage (Volume Down) + 0x15, 0x00, // Logical Min (0) + 0x75, 0x01, // Report Size (1) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data, Var, Abs) + 0x09, 0xE2, // Usage (Mute) + 0x09, 0x30, // Usage (Power) + 0x09, 0x83, // Usage (Recall Last) + 0x09, 0x81, // Usage (Assign Selection) + 0x09, 0xB0, // Usage (Play) + 0x09, 0xB1, // Usage (Pause) + 0x09, 0xB2, // Usage (Record) + 0x09, 0xB3, // Usage (Fast Forward) + 0x09, 0xB4, // Usage (Rewind) + 0x09, 0xB5, // Usage (Scan Next) + 0x09, 0xB6, // Usage (Scan Prev) + 0x09, 0xB7, // Usage (Stop) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0C, // Logical Max (12) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0x09, 0x80, // Usage (Selection) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x03, // Usage Max (Button 3) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x03, // Logical Max (3) + 0x75, 0x02, // Report Size (2) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x81, 0x03, // Input (Const, Var, Abs) + 0xC0 // End Collection +}; + +// HID report map length +uint8 hidReportMapLen = sizeof(hidReportMap); + +// HID report mapping table +static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; + +/********************************************************************* + * Profile Attributes - variables + */ + +// HID Service attribute +static CONST gattAttrType_t hidService = { ATT_BT_UUID_SIZE, hidServUUID }; + +// Include attribute (Battery service) +static uint16 include = GATT_INVALID_HANDLE; + +// HID Information characteristic +static uint8 hidInfoProps = GATT_PROP_READ; + +// HID Report Map characteristic +static uint8 hidReportMapProps = GATT_PROP_READ; + +// HID External Report Reference Descriptor +static uint8 hidExtReportRefDesc[ATT_BT_UUID_SIZE] = + { LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) }; + +// HID Control Point characteristic +static uint8 hidControlPointProps = GATT_PROP_WRITE_NO_RSP; +static uint8 hidControlPoint; + +// HID Protocol Mode characteristic +static uint8 hidProtocolModeProps = GATT_PROP_READ | GATT_PROP_WRITE_NO_RSP; +uint8 hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + +// HID Report characteristic, mouse input +static uint8 hidReportMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportMouseIn; +static gattCharCfg_t hidReportMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, mouse input +static uint8 hidReportRefMouseIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_MOUSE_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, key input +static uint8 hidReportKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportKeyIn; +static gattCharCfg_t hidReportKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, key input +static uint8 hidReportRefKeyIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, consumer control input +static uint8 hidReportCCInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportCCIn; +static gattCharCfg_t hidReportCCInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, consumer control input +static uint8 hidReportRefCCIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_CC_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, LED output +static uint8 hidReportLedOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportLedOut; + +// HID Report Reference characteristic descriptor, LED output +static uint8 hidReportRefLedOut[HID_REPORT_REF_LEN] = + { HID_RPT_ID_LED_OUT, HID_REPORT_TYPE_OUTPUT }; + +// HID Boot Keyboard Input Report +static uint8 hidReportBootKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootKeyIn; +static gattCharCfg_t hidReportBootKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Boot Keyboard Output Report +static uint8 hidReportBootKeyOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportBootKeyOut; + +// HID Boot Mouse Input Report +static uint8 hidReportBootMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootMouseIn; +static gattCharCfg_t hidReportBootMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Report +static uint8 hidReportFeatureProps = GATT_PROP_READ | GATT_PROP_WRITE; +static uint8 hidReportFeature; + +// HID Report Reference characteristic descriptor, Feature +static uint8 hidReportRefFeature[HID_REPORT_REF_LEN] = + { HID_RPT_ID_FEATURE, HID_REPORT_TYPE_FEATURE }; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t hidAttrTbl[] = +{ + // HID Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *) &hidService /* pValue */ + }, + + // Included service (battery) + { + { ATT_BT_UUID_SIZE, includeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&include + }, + + // HID Information characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidInfoProps + }, + + // HID Information characteristic + { + { ATT_BT_UUID_SIZE, hidInfoUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidInfo + }, + + // HID Control Point characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidControlPointProps + }, + + // HID Control Point characteristic + { + { ATT_BT_UUID_SIZE, hidControlPointUUID }, + GATT_PERMIT_WRITE, + 0, + &hidControlPoint + }, + + // HID Protocol Mode characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidProtocolModeProps + }, + + // HID Protocol Mode characteristic + { + { ATT_BT_UUID_SIZE, hidProtocolModeUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidProtocolMode + }, + + + // HID Report Map characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMapProps + }, + + // HID Report Map characteristic + { + { ATT_BT_UUID_SIZE, hidReportMapUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidReportMap + }, + + // HID External Report Reference Descriptor + { + { ATT_BT_UUID_SIZE, extReportRefUUID }, + GATT_PERMIT_READ, + 0, + hidExtReportRefDesc + }, + + // HID Report characteristic, mouse input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMouseInProps + }, + + // HID Report characteristic, mouse input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMouseIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportMouseInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, mouse input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefMouseIn + }, + + // HID Report characteristic, key input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyInProps + }, + + // HID Report characteristic, key input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportKeyInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, key input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefKeyIn + }, + + // HID Report characteristic, consumer control input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportCCInProps + }, + + // HID Report characteristic, consumer control input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportCCIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportCCInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, consumer control input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefCCIn + }, + + // HID Report characteristic, LED output declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportLedOutProps + }, + + // HID Report characteristic, LED output + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportLedOut + }, + + // HID Report Reference characteristic descriptor, LED output + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefLedOut + }, + + // HID Boot Keyboard Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyInProps + }, + + // HID Boot Keyboard Input Report + { + { ATT_BT_UUID_SIZE, hidBootKeyInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyIn + }, + + // HID Boot Keyboard Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootKeyInClientCharCfg + }, + + // HID Boot Keyboard Output Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyOutProps + }, + + // HID Boot Keyboard Output Report + { + { ATT_BT_UUID_SIZE, hidBootKeyOutputUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportBootKeyOut + }, + + // HID Boot Mouse Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseInProps + }, + + // HID Boot Mouse Input Report + { + { ATT_BT_UUID_SIZE, hidBootMouseInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseIn + }, + + // HID Boot Mouse Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootMouseInClientCharCfg + }, + + // Feature Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportFeatureProps + }, + + // Feature Report + { + { ATT_BT_UUID_SIZE, hidReportUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportFeature + }, + + // HID Report Reference characteristic descriptor, feature + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefFeature + }, +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + HID_SERVICE_IDX, // HID Service + HID_INCLUDED_SERVICE_IDX, // Included Service + HID_INFO_DECL_IDX, // HID Information characteristic declaration + HID_INFO_IDX, // HID Information characteristic + HID_CONTROL_POINT_DECL_IDX, // HID Control Point characteristic declaration + HID_CONTROL_POINT_IDX, // HID Control Point characteristic + HID_PROTOCOL_MODE_DECL_IDX, // HID Protocol Mode characteristic declaration + HID_PROTOCOL_MODE_IDX, // HID Protocol Mode characteristic + HID_REPORT_MAP_DECL_IDX, // HID Report Map characteristic declaration + HID_REPORT_MAP_IDX, // HID Report Map characteristic + HID_EXT_REPORT_REF_DESC_IDX, // HID External Report Reference Descriptor + HID_REPORT_MOUSE_IN_DECL_IDX, // HID Report characteristic, mouse input declaration + HID_REPORT_MOUSE_IN_IDX, // HID Report characteristic, mouse input + HID_REPORT_MOUSE_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_MOUSE_IN_IDX, // HID Report Reference characteristic descriptor, mouse input + HID_REPORT_KEY_IN_DECL_IDX, // HID Report characteristic, key input declaration + HID_REPORT_KEY_IN_IDX, // HID Report characteristic, key input + HID_REPORT_KEY_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_KEY_IN_IDX, // HID Report Reference characteristic descriptor, key input + HID_REPORT_CC_IN_DECL_IDX, // HID Report characteristic, consumer control input declaration + HID_REPORT_CC_IN_IDX, // HID Report characteristic, consumer control input + HID_REPORT_CC_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_CC_IN_IDX, // HID Report Reference characteristic descriptor, consumer control input + HID_REPORT_LED_OUT_DECL_IDX, // HID Report characteristic, LED output declaration + HID_REPORT_LED_OUT_IDX, // HID Report characteristic, LED output + HID_REPORT_REF_LED_OUT_IDX, // HID Report Reference characteristic descriptor, LED output + HID_BOOT_KEY_IN_DECL_IDX, // HID Boot Keyboard Input Report declaration + HID_BOOT_KEY_IN_IDX, // HID Boot Keyboard Input Report + HID_BOOT_KEY_IN_CCCD_IDX, // HID Boot Keyboard Input Report characteristic client characteristic configuration + HID_BOOT_KEY_OUT_DECL_IDX, // HID Boot Keyboard Output Report declaration + HID_BOOT_KEY_OUT_IDX, // HID Boot Keyboard Output Report + HID_BOOT_MOUSE_IN_DECL_IDX, // HID Boot Mouse Input Report declaration + HID_BOOT_MOUSE_IN_IDX, // HID Boot Mouse Input Report + HID_BOOT_MOUSE_IN_CCCD_IDX, // HID Boot Mouse Input Report characteristic client characteristic configuration + HID_FEATURE_DECL_IDX, // Feature Report declaration + HID_FEATURE_IDX, // Feature Report + HID_REPORT_REF_FEATURE_IDX // HID Report Reference characteristic descriptor, feature +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t hidKbdMsCBs = +{ + HidDev_ReadAttrCB, // Read callback function pointer + HidDev_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbM_AddService + * + * @brief Initializes the HID Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t HidKbM_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportMouseInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportCCInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootMouseInClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( hidAttrTbl, GATT_NUM_ATTRS( hidAttrTbl ), &hidKbdMsCBs ); + + // Set up included service + Batt_GetParameter( BATT_PARAM_SERVICE_HANDLE, + &GATT_INCLUDED_HANDLE( hidAttrTbl, HID_INCLUDED_SERVICE_IDX ) ); + + // Construct map of reports to characteristic handles + // Each report is uniquely identified via its ID and type + + // Mouse input report + hidRptMap[0].id = hidReportRefMouseIn[0]; + hidRptMap[0].type = hidReportRefMouseIn[1]; + hidRptMap[0].handle = hidAttrTbl[HID_REPORT_MOUSE_IN_IDX].handle; + hidRptMap[0].cccdHandle = hidAttrTbl[HID_REPORT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[0].mode = HID_PROTOCOL_MODE_REPORT; + + // Key input report + hidRptMap[1].id = hidReportRefKeyIn[0]; + hidRptMap[1].type = hidReportRefKeyIn[1]; + hidRptMap[1].handle = hidAttrTbl[HID_REPORT_KEY_IN_IDX].handle; + hidRptMap[1].cccdHandle = hidAttrTbl[HID_REPORT_KEY_IN_CCCD_IDX].handle; + hidRptMap[1].mode = HID_PROTOCOL_MODE_REPORT; + + // Consumer Control input report + hidRptMap[2].id = hidReportRefCCIn[0]; + hidRptMap[2].type = hidReportRefCCIn[1]; + hidRptMap[2].handle = hidAttrTbl[HID_REPORT_CC_IN_IDX].handle; + hidRptMap[2].cccdHandle = hidAttrTbl[HID_REPORT_CC_IN_CCCD_IDX].handle; + hidRptMap[2].mode = HID_PROTOCOL_MODE_REPORT; + + // LED output report + hidRptMap[3].id = hidReportRefLedOut[0]; + hidRptMap[3].type = hidReportRefLedOut[1]; + hidRptMap[3].handle = hidAttrTbl[HID_REPORT_LED_OUT_IDX].handle; + hidRptMap[3].cccdHandle = 0; + hidRptMap[3].mode = HID_PROTOCOL_MODE_REPORT; + + // Boot keyboard input report + // Use same ID and type as key input report + hidRptMap[4].id = hidReportRefKeyIn[0]; + hidRptMap[4].type = hidReportRefKeyIn[1]; + hidRptMap[4].handle = hidAttrTbl[HID_BOOT_KEY_IN_IDX].handle; + hidRptMap[4].cccdHandle = hidAttrTbl[HID_BOOT_KEY_IN_CCCD_IDX].handle; + hidRptMap[4].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot keyboard output report + // Use same ID and type as LED output report + hidRptMap[5].id = hidReportRefLedOut[0]; + hidRptMap[5].type = hidReportRefLedOut[1]; + hidRptMap[5].handle = hidAttrTbl[HID_BOOT_KEY_OUT_IDX].handle; + hidRptMap[5].cccdHandle = 0; + hidRptMap[5].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot mouse input report + hidRptMap[6].id = HID_RPT_ID_MOUSE_IN; + hidRptMap[6].type = HID_REPORT_TYPE_INPUT; + hidRptMap[6].handle = hidAttrTbl[HID_BOOT_MOUSE_IN_IDX].handle; + hidRptMap[6].cccdHandle = hidAttrTbl[HID_BOOT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[6].mode = HID_PROTOCOL_MODE_BOOT; + + // Feature report + hidRptMap[7].id = hidReportRefFeature[0]; + hidRptMap[7].type = hidReportRefFeature[1]; + hidRptMap[7].handle = hidAttrTbl[HID_FEATURE_IDX].handle; + hidRptMap[7].cccdHandle = 0; + hidRptMap[7].mode = HID_PROTOCOL_MODE_REPORT; + + // Battery level input report + VOID Batt_GetParameter( BATT_PARAM_BATT_LEVEL_IN_REPORT, &(hidRptMap[8]) ); + + // Setup report ID map + HidDev_RegisterReports( HID_NUM_REPORTS, hidRptMap ); + + return ( status ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.h b/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.h new file mode 100644 index 0000000..218ac8c --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDevKbM/hidkbmservice.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hidkbmservice.h + Revised: $Date: 2012-05-29 15:29:05 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30647 $ + + Description: This file contains the HID service for a keyboard/mouse. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDKBMSERVICE_H +#define HIDKBMSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Number of HID reports defined in the service +#define HID_NUM_REPORTS 9 + +// HID Report IDs for the service +#define HID_RPT_ID_MOUSE_IN 1 // Mouse input report ID +#define HID_RPT_ID_KEY_IN 2 // Keyboard input report ID +#define HID_RPT_ID_CC_IN 3 // Consumer Control input report ID +#define HID_RPT_ID_LED_OUT 0 // LED output report ID +#define HID_RPT_ID_FEATURE 0 // Feature report ID + +// HID feature flags +#define HID_KBD_FLAGS HID_FLAGS_REMOTE_WAKE + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbM_AddService + * + * @brief Initializes the HID service for keyboard/mouse by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t HidKbM_AddService( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDKBMSERVICE_H */ diff --git a/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.c b/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.c new file mode 100644 index 0000000..9b9367e --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.c @@ -0,0 +1,641 @@ +/************************************************************************************************** + Filename: hidkbdservice.c + Revised: $Date: 2012-02-09 14:40:40 -0800 (Thu, 09 Feb 2012) $ + Revision: $Revision: 65 $ + + Description: This file contains the HID service for a keyboard. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "gattservapp.h" +#include "hidkbdservice.h" +#include "hid_uuid.h" +#include "hiddev.h" +#include "battservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// HID service +CONST uint8 hidServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_SERVICE_UUID), HI_UINT16(HID_SERVICE_UUID) +}; + +// HID Boot Keyboard Input Report characteristic +CONST uint8 hidBootKeyInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_INPUT_UUID), HI_UINT16(HID_BOOT_KEY_INPUT_UUID) +}; + +// HID Boot Mouse Input Report characteristic +CONST uint8 hidBootMouseInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_MOUSE_INPUT_UUID), HI_UINT16(HID_BOOT_MOUSE_INPUT_UUID) +}; + +// HID Boot Keyboard Output Report characteristic +CONST uint8 hidBootKeyOutputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_OUTPUT_UUID), HI_UINT16(HID_BOOT_KEY_OUTPUT_UUID) +}; + +// HID Information characteristic +CONST uint8 hidInfoUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_INFORMATION_UUID), HI_UINT16(HID_INFORMATION_UUID) +}; + +// HID Report Map characteristic +CONST uint8 hidReportMapUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_MAP_UUID), HI_UINT16(HID_REPORT_MAP_UUID) +}; + +// HID Control Point characteristic +CONST uint8 hidControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_CONTROL_POINT_UUID), HI_UINT16(HID_CONTROL_POINT_UUID) +}; + +// HID Report characteristic +CONST uint8 hidReportUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_UUID), HI_UINT16(HID_REPORT_UUID) +}; + +// HID Protocol Mode characteristic +CONST uint8 hidProtocolModeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_PROTOCOL_MODE_UUID), HI_UINT16(HID_PROTOCOL_MODE_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// HID Information characteristic value +static CONST uint8 hidInfo[HID_INFORMATION_LEN] = +{ + LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) + 0x00, // bCountryCode + HID_KBD_FLAGS // Flags +}; + +// HID Report Map characteristic value +// Keyboard report descriptor (using format for Boot interface descriptor) +static CONST uint8 hidReportMap[] = +{ + 0x05, 0x01, // Usage Pg (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection: (Application) + // + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0xE0, // Usage Min (224) + 0x29, 0xE7, // Usage Max (231) + 0x15, 0x00, // Log Min (0) + 0x25, 0x01, // Log Max (1) + // + // Modifier byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input: (Data, Variable, Absolute) + // + // Reserved byte + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input: (Constant) + // + // LED report + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Pg (LEDs) + 0x19, 0x01, // Usage Min (1) + 0x29, 0x05, // Usage Max (5) + 0x91, 0x02, // Output: (Data, Variable, Absolute) + // + // LED report padding + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output: (Constant) + // + // Key arrays (6 bytes) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Log Min (0) + 0x25, 0x65, // Log Max (101) + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0x00, // Usage Min (0) + 0x29, 0x65, // Usage Max (101) + 0x81, 0x00, // Input: (Data, Array) + // + 0xC0 // End Collection +}; + +// HID report map length +uint8 hidReportMapLen = sizeof(hidReportMap); + +// HID report mapping table +static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; + +/********************************************************************* + * Profile Attributes - variables + */ + +// HID Service attribute +static CONST gattAttrType_t hidService = { ATT_BT_UUID_SIZE, hidServUUID }; + +// Include attribute (Battery service) +static uint16 include = GATT_INVALID_HANDLE; + +// HID Information characteristic +static uint8 hidInfoProps = GATT_PROP_READ; + +// HID Report Map characteristic +static uint8 hidReportMapProps = GATT_PROP_READ; + +// HID External Report Reference Descriptor +static uint8 hidExtReportRefDesc[ATT_BT_UUID_SIZE] = + { LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) }; + +// HID Control Point characteristic +static uint8 hidControlPointProps = GATT_PROP_WRITE_NO_RSP; +static uint8 hidControlPoint; + +// HID Protocol Mode characteristic +static uint8 hidProtocolModeProps = GATT_PROP_READ | GATT_PROP_WRITE_NO_RSP; +uint8 hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + +// HID Report characteristic, key input +static uint8 hidReportKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportKeyIn; +static gattCharCfg_t hidReportKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, key input +static uint8 hidReportRefKeyIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, LED output +static uint8 hidReportLedOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportLedOut; + +// HID Report Reference characteristic descriptor, LED output +static uint8 hidReportRefLedOut[HID_REPORT_REF_LEN] = + { HID_RPT_ID_LED_OUT, HID_REPORT_TYPE_OUTPUT }; + +// HID Boot Keyboard Input Report +static uint8 hidReportBootKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootKeyIn; +static gattCharCfg_t hidReportBootKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Boot Keyboard Output Report +static uint8 hidReportBootKeyOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportBootKeyOut; + +// HID Boot Mouse Input Report +static uint8 hidReportBootMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootMouseIn; +static gattCharCfg_t hidReportBootMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Report +static uint8 hidReportFeatureProps = GATT_PROP_READ | GATT_PROP_WRITE; +static uint8 hidReportFeature; + +// HID Report Reference characteristic descriptor, Feature +static uint8 hidReportRefFeature[HID_REPORT_REF_LEN] = + { HID_RPT_ID_FEATURE, HID_REPORT_TYPE_FEATURE }; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t hidAttrTbl[] = +{ + // HID Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *) &hidService /* pValue */ + }, + + // Included service (battery) + { + { ATT_BT_UUID_SIZE, includeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&include + }, + + // HID Information characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidInfoProps + }, + + // HID Information characteristic + { + { ATT_BT_UUID_SIZE, hidInfoUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidInfo + }, + + // HID Control Point characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidControlPointProps + }, + + // HID Control Point characteristic + { + { ATT_BT_UUID_SIZE, hidControlPointUUID }, + GATT_PERMIT_WRITE, + 0, + &hidControlPoint + }, + + // HID Protocol Mode characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidProtocolModeProps + }, + + // HID Protocol Mode characteristic + { + { ATT_BT_UUID_SIZE, hidProtocolModeUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidProtocolMode + }, + + + // HID Report Map characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMapProps + }, + + // HID Report Map characteristic + { + { ATT_BT_UUID_SIZE, hidReportMapUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidReportMap + }, + + // HID External Report Reference Descriptor + { + { ATT_BT_UUID_SIZE, extReportRefUUID }, + GATT_PERMIT_READ, + 0, + hidExtReportRefDesc + }, + + // HID Report characteristic, key input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyInProps + }, + + // HID Report characteristic, key input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportKeyInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, key input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefKeyIn + }, + + // HID Report characteristic, LED output declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportLedOutProps + }, + + // HID Report characteristic, LED output + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportLedOut + }, + + // HID Report Reference characteristic descriptor, LED output + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefLedOut + }, + + // HID Boot Keyboard Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyInProps + }, + + // HID Boot Keyboard Input Report + { + { ATT_BT_UUID_SIZE, hidBootKeyInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyIn + }, + + // HID Boot Keyboard Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootKeyInClientCharCfg + }, + + // HID Boot Keyboard Output Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyOutProps + }, + + // HID Boot Keyboard Output Report + { + { ATT_BT_UUID_SIZE, hidBootKeyOutputUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportBootKeyOut + }, + + // HID Boot Mouse Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseInProps + }, + + // HID Boot Mouse Input Report + { + { ATT_BT_UUID_SIZE, hidBootMouseInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseIn + }, + + // HID Boot Mouse Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootMouseInClientCharCfg + }, + + // Feature Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportFeatureProps + }, + + // Feature Report + { + { ATT_BT_UUID_SIZE, hidReportUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportFeature + }, + + // HID Report Reference characteristic descriptor, feature + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefFeature + }, +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + HID_SERVICE_IDX, // HID Service + HID_INCLUDED_SERVICE_IDX, // Included Service + HID_INFO_DECL_IDX, // HID Information characteristic declaration + HID_INFO_IDX, // HID Information characteristic + HID_CONTROL_POINT_DECL_IDX, // HID Control Point characteristic declaration + HID_CONTROL_POINT_IDX, // HID Control Point characteristic + HID_PROTOCOL_MODE_DECL_IDX, // HID Protocol Mode characteristic declaration + HID_PROTOCOL_MODE_IDX, // HID Protocol Mode characteristic + HID_REPORT_MAP_DECL_IDX, // HID Report Map characteristic declaration + HID_REPORT_MAP_IDX, // HID Report Map characteristic + HID_EXT_REPORT_REF_DESC_IDX, // HID External Report Reference Descriptor + HID_REPORT_KEY_IN_DECL_IDX, // HID Report characteristic, key input declaration + HID_REPORT_KEY_IN_IDX, // HID Report characteristic, key input + HID_REPORT_KEY_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_KEY_IN_IDX, // HID Report Reference characteristic descriptor, key input + HID_REPORT_LED_OUT_DECL_IDX, // HID Report characteristic, LED output declaration + HID_REPORT_LED_OUT_IDX, // HID Report characteristic, LED output + HID_REPORT_REF_LED_OUT_IDX, // HID Report Reference characteristic descriptor, LED output + HID_BOOT_KEY_IN_DECL_IDX, // HID Boot Keyboard Input Report declaration + HID_BOOT_KEY_IN_IDX, // HID Boot Keyboard Input Report + HID_BOOT_KEY_IN_CCCD_IDX, // HID Boot Keyboard Input Report characteristic client characteristic configuration + HID_BOOT_KEY_OUT_DECL_IDX, // HID Boot Keyboard Output Report declaration + HID_BOOT_KEY_OUT_IDX, // HID Boot Keyboard Output Report + HID_BOOT_MOUSE_IN_DECL_IDX, // HID Boot Mouse Input Report declaration + HID_BOOT_MOUSE_IN_IDX, // HID Boot Mouse Input Report + HID_BOOT_MOUSE_IN_CCCD_IDX, // HID Boot Mouse Input Report characteristic client characteristic configuration + HID_FEATURE_DECL_IDX, // Feature Report declaration + HID_FEATURE_IDX, // Feature Report + HID_REPORT_REF_FEATURE_IDX // HID Report Reference characteristic descriptor, feature +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t hidKbdCBs = +{ + HidDev_ReadAttrCB, // Read callback function pointer + HidDev_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbd_AddService + * + * @brief Initializes the HID Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t HidKbd_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootMouseInClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( hidAttrTbl, GATT_NUM_ATTRS( hidAttrTbl ), &hidKbdCBs ); + + // Set up included service + Batt_GetParameter( BATT_PARAM_SERVICE_HANDLE, + &GATT_INCLUDED_HANDLE( hidAttrTbl, HID_INCLUDED_SERVICE_IDX ) ); + + // Construct map of reports to characteristic handles + // Each report is uniquely identified via its ID and type + + // Key input report + hidRptMap[0].id = hidReportRefKeyIn[0]; + hidRptMap[0].type = hidReportRefKeyIn[1]; + hidRptMap[0].handle = hidAttrTbl[HID_REPORT_KEY_IN_IDX].handle; + hidRptMap[0].cccdHandle = hidAttrTbl[HID_REPORT_KEY_IN_CCCD_IDX].handle; + hidRptMap[0].mode = HID_PROTOCOL_MODE_REPORT; + + // LED output report + hidRptMap[1].id = hidReportRefLedOut[0]; + hidRptMap[1].type = hidReportRefLedOut[1]; + hidRptMap[1].handle = hidAttrTbl[HID_REPORT_LED_OUT_IDX].handle; + hidRptMap[1].cccdHandle = 0; + hidRptMap[1].mode = HID_PROTOCOL_MODE_REPORT; + + // Boot keyboard input report + // Use same ID and type as key input report + hidRptMap[2].id = hidReportRefKeyIn[0]; + hidRptMap[2].type = hidReportRefKeyIn[1]; + hidRptMap[2].handle = hidAttrTbl[HID_BOOT_KEY_IN_IDX].handle; + hidRptMap[2].cccdHandle = hidAttrTbl[HID_BOOT_KEY_IN_CCCD_IDX].handle; + hidRptMap[2].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot keyboard output report + // Use same ID and type as LED output report + hidRptMap[3].id = hidReportRefLedOut[0]; + hidRptMap[3].type = hidReportRefLedOut[1]; + hidRptMap[3].handle = hidAttrTbl[HID_BOOT_KEY_OUT_IDX].handle; + hidRptMap[3].cccdHandle = 0; + hidRptMap[3].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot mouse input report + hidRptMap[4].id = HID_RPT_ID_MOUSE_IN; + hidRptMap[4].type = HID_REPORT_TYPE_INPUT; + hidRptMap[4].handle = hidAttrTbl[HID_BOOT_MOUSE_IN_IDX].handle; + hidRptMap[4].cccdHandle = hidAttrTbl[HID_BOOT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[4].mode = HID_PROTOCOL_MODE_BOOT; + + // Feature report + hidRptMap[5].id = hidReportRefFeature[0]; + hidRptMap[5].type = hidReportRefFeature[1]; + hidRptMap[5].handle = hidAttrTbl[HID_FEATURE_IDX].handle; + hidRptMap[5].cccdHandle = 0; + hidRptMap[5].mode = HID_PROTOCOL_MODE_REPORT; + + // Battery level input report + VOID Batt_GetParameter( BATT_PARAM_BATT_LEVEL_IN_REPORT, &(hidRptMap[6]) ); + + // Setup report ID map + HidDev_RegisterReports( HID_NUM_REPORTS, hidRptMap ); + + return ( status ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.h b/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.h new file mode 100644 index 0000000..898e5e2 --- /dev/null +++ b/Firmware/Radio/Profiles/HIDDevKbd/hidkbdservice.h @@ -0,0 +1,101 @@ +/************************************************************************************************** + Filename: hidkbdservice.h + Revised: $Date: 2012-02-09 14:40:40 -0800 (Thu, 09 Feb 2012) $ + Revision: $Revision: 65 $ + + Description: This file contains the HID service for a keyboard. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDKBDSERVICE_H +#define HIDKBDSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Number of HID reports defined in the service +#define HID_NUM_REPORTS 7 + +// HID Report IDs for the service +#define HID_RPT_ID_KEY_IN 0 // Keyboard input report ID +#define HID_RPT_ID_MOUSE_IN 1 // Mouse input report ID +#define HID_RPT_ID_LED_OUT 0 // LED output report ID +#define HID_RPT_ID_FEATURE 0 // Feature report ID + +// HID feature flags +#define HID_KBD_FLAGS HID_FLAGS_REMOTE_WAKE + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbd_AddService + * + * @brief Initializes the HID service for keyboard by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t HidKbd_AddService( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDKBDSERVICE_H */ diff --git a/Firmware/Radio/Profiles/HeartRate/heartrateservice.c b/Firmware/Radio/Profiles/HeartRate/heartrateservice.c new file mode 100644 index 0000000..b2bde55 --- /dev/null +++ b/Firmware/Radio/Profiles/HeartRate/heartrateservice.c @@ -0,0 +1,475 @@ +/************************************************************************************************** + Filename: heartrateservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Heart Rate sample service + for use with the Heart Rate sample application. + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "heartrateservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of heart rate measurement value in attribute array +#define HEARTRATE_MEAS_VALUE_POS 2 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Heart rate service +CONST uint8 heartRateServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_SERV_UUID), HI_UINT16(HEARTRATE_SERV_UUID) +}; + +// Heart rate measurement characteristic +CONST uint8 heartRateMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_MEAS_UUID), HI_UINT16(HEARTRATE_MEAS_UUID) +}; + +// Sensor location characteristic +CONST uint8 heartRateSensLocUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_SENS_LOC_UUID), HI_UINT16(HEARTRATE_SENS_LOC_UUID) +}; + +// Command characteristic +CONST uint8 heartRateCommandUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_COMMAND_UUID), HI_UINT16(HEARTRATE_COMMAND_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static heartRateServiceCB_t heartRateServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Heart Rate Service attribute +static CONST gattAttrType_t heartRateService = { ATT_BT_UUID_SIZE, heartRateServUUID }; + +// Heart Rate Measurement Characteristic +// Note characteristic value is not stored here +static uint8 heartRateMeasProps = GATT_PROP_NOTIFY; +static uint8 heartRateMeas = 0; +static gattCharCfg_t heartRateMeasClientCharCfg[GATT_MAX_NUM_CONN]; + +// Sensor Location Characteristic +static uint8 heartRateSensLocProps = GATT_PROP_READ; +static uint8 heartRateSensLoc = 0; + +// Command Characteristic +static uint8 heartRateCommandProps = GATT_PROP_WRITE; +static uint8 heartRateCommand = 0; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t heartRateAttrTbl[] = +{ + // Heart Rate Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&heartRateService /* pValue */ + }, + + // Heart Rate Measurement Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateMeasProps + }, + + // Heart Rate Measurement Value + { + { ATT_BT_UUID_SIZE, heartRateMeasUUID }, + 0, + 0, + &heartRateMeas + }, + + // Heart Rate Measurement Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &heartRateMeasClientCharCfg + }, + + // Sensor Location Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateSensLocProps + }, + + // Sensor Location Value + { + { ATT_BT_UUID_SIZE, heartRateSensLocUUID }, + GATT_PERMIT_READ, + 0, + &heartRateSensLoc + }, + + // Command Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateCommandProps + }, + + // Command Value + { + { ATT_BT_UUID_SIZE, heartRateCommandUUID }, + GATT_PERMIT_WRITE, + 0, + &heartRateCommand + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 heartRate_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t heartRate_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Heart Rate Service Callbacks +CONST gattServiceCBs_t heartRateCBs = +{ + heartRate_ReadAttrCB, // Read callback function pointer + heartRate_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HeartRate_AddService + * + * @brief Initializes the Heart Rate service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t HeartRate_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, heartRateMeasClientCharCfg ); + + if ( services & HEARTRATE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( heartRateAttrTbl, + GATT_NUM_ATTRS( heartRateAttrTbl ), + &heartRateCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn HeartRate_Register + * + * @brief Register a callback function with the Heart Rate Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void HeartRate_Register( heartRateServiceCB_t pfnServiceCB ) +{ + heartRateServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn HeartRate_SetParameter + * + * @brief Set a Heart Rate parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HeartRate_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case HEARTRATE_MEAS_CHAR_CFG: + // Need connection handle + //heartRateMeasClientCharCfg.value = *((uint16*)value); + break; + + case HEARTRATE_SENS_LOC: + heartRateSensLoc = *((uint8*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HeartRate_GetParameter + * + * @brief Get a Heart Rate parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HeartRate_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case HEARTRATE_MEAS_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = heartRateMeasClientCharCfg.value; + break; + + case HEARTRATE_SENS_LOC: + *((uint8*)value) = heartRateSensLoc; + break; + + case HEARTRATE_COMMAND: + *((uint8*)value) = heartRateCommand; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HeartRate_MeasNotify + * + * @brief Send a notification containing a heart rate + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t HeartRate_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, heartRateMeasClientCharCfg ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = heartRateAttrTbl[HEARTRATE_MEAS_VALUE_POS].handle; + + // Send the notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn heartRate_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 heartRate_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if (uuid == HEARTRATE_SENS_LOC_UUID) + { + *pLen = 1; + pValue[0] = *pAttr->pValue; + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn heartRate_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t heartRate_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case HEARTRATE_COMMAND_UUID: + if ( offset > 0 ) + { + status = ATT_ERR_ATTR_NOT_LONG; + } + else if (len != 1) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + else if (*pValue != HEARTRATE_COMMAND_ENERGY_EXP) + { + status = HEARTRATE_ERR_NOT_SUP; + } + else + { + *(pAttr->pValue) = pValue[0]; + + (*heartRateServiceCB)(HEARTRATE_COMMAND_SET); + + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + (*heartRateServiceCB)( (charCfg == GATT_CFG_NO_OPERATION) ? + HEARTRATE_MEAS_NOTI_DISABLED : + HEARTRATE_MEAS_NOTI_ENABLED ); + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn HeartRate_HandleConnStatusCB + * + * @brief Heart Rate Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void HeartRate_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, heartRateMeasClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/HeartRate/heartrateservice.h b/Firmware/Radio/Profiles/HeartRate/heartrateservice.h new file mode 100644 index 0000000..ba8814b --- /dev/null +++ b/Firmware/Radio/Profiles/HeartRate/heartrateservice.h @@ -0,0 +1,169 @@ +/************************************************************************************************** + Filename: heartrateservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Heart Rate service definitions and + prototypes. + +**************************************************************************************************/ + +#ifndef HEARTRATESERVICE_H +#define HEARTRATESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Heart Rate Service Parameters +#define HEARTRATE_MEAS 0 +#define HEARTRATE_MEAS_CHAR_CFG 1 +#define HEARTRATE_SENS_LOC 2 +#define HEARTRATE_COMMAND 3 + +// Heart Rate Service UUIDs +#define HEARTRATE_SERV_UUID 0x180D +#define HEARTRATE_MEAS_UUID 0x2A37 +#define HEARTRATE_SENS_LOC_UUID 0x2A38 +#define HEARTRATE_COMMAND_UUID 0x2A39 + +// Maximum length of heart rate measurement characteristic +#define HEARTRATE_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define HEARTRATE_FLAGS_FORMAT_UINT16 0x01 +#define HEARTRATE_FLAGS_CONTACT_NOT_SUP 0x00 +#define HEARTRATE_FLAGS_CONTACT_NOT_DET 0x04 +#define HEARTRATE_FLAGS_CONTACT_DET 0x06 +#define HEARTRATE_FLAGS_ENERGY_EXP 0x08 +#define HEARTRATE_FLAGS_RR 0x10 + +// Values for sensor location +#define HEARTRATE_SENS_LOC_OTHER 0x00 +#define HEARTRATE_SENS_LOC_CHEST 0x01 +#define HEARTRATE_SENS_LOC_WRIST 0x02 +#define HEARTRATE_SENS_LOC_FINGER 0x03 +#define HEARTRATE_SENS_LOC_HAND 0x04 +#define HEARTRATE_SENS_LOC_EARLOBE 0x05 +#define HEARTRATE_SENS_LOC_FOOT 0x06 + +// Value for command characteristic +#define HEARTRATE_COMMAND_ENERGY_EXP 0x01 + +// ATT Error code +// Control point value not supported +#define HEARTRATE_ERR_NOT_SUP 0x80 + +// Heart Rate Service bit fields +#define HEARTRATE_SERVICE 0x00000001 + +// Callback events +#define HEARTRATE_MEAS_NOTI_ENABLED 1 +#define HEARTRATE_MEAS_NOTI_DISABLED 2 +#define HEARTRATE_COMMAND_SET 3 + +/********************************************************************* + * TYPEDEFS + */ + +// Heart Rate Service callback function +typedef void (*heartRateServiceCB_t)(uint8 event); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * HeartRate_AddService- Initializes the Heart Rate service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t HeartRate_AddService( uint32 services ); + +/* + * HeartRate_Register - Register a callback function with the + * Heart Rate Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void HeartRate_Register( heartRateServiceCB_t pfnServiceCB ); + +/* + * HeartRate_SetParameter - Set a Heart Rate parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t HeartRate_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * HeartRate_GetParameter - Get a Heart Rate parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t HeartRate_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn HeartRate_MeasNotify + * + * @brief Send a notification containing a heart rate + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t HeartRate_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/********************************************************************* + * @fn HeartRate_HandleConnStatusCB + * + * @brief Heart Rate Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +extern void HeartRate_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HEARTRATESERVICE_H */ diff --git a/Firmware/Radio/Profiles/Keys/simplekeys.c b/Firmware/Radio/Profiles/Keys/simplekeys.c new file mode 100644 index 0000000..a482f5e --- /dev/null +++ b/Firmware/Radio/Profiles/Keys/simplekeys.c @@ -0,0 +1,425 @@ +/************************************************************************************************** + Filename: simplekey.c + Revised: $Date: 2011-11-21 15:26:10 -0800 (Mon, 21 Nov 2011) $ + Revision: $Revision: 28439 $ + + Description: Simple Keys Profile + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "simplekeys.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 5 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// SK Service UUID: 0x1800 +CONST uint8 skServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SK_SERV_UUID), HI_UINT16(SK_SERV_UUID) +}; + +// Key Pressed UUID: 0x1801 +CONST uint8 keyPressedUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SK_KEYPRESSED_UUID), HI_UINT16(SK_KEYPRESSED_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// SK Service attribute +static CONST gattAttrType_t skService = { ATT_BT_UUID_SIZE, skServUUID }; + +// Keys Pressed Characteristic Properties +static uint8 skCharProps = GATT_PROP_NOTIFY; + +// Key Pressed State Characteristic +static uint8 skKeyPressed = 0; + +// Key Pressed Characteristic Configs +static gattCharCfg_t skConfig[GATT_MAX_NUM_CONN]; + +// Key Pressed Characteristic User Description +static uint8 skCharUserDesp[16] = "Key Press State\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t simplekeysAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Simple Keys Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&skService /* pValue */ + }, + + // Characteristic Declaration for Keys + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &skCharProps + }, + + // Characteristic Value- Key Pressed + { + { ATT_BT_UUID_SIZE, keyPressedUUID }, + 0, + 0, + &skKeyPressed + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)skConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + skCharUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t sk_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void sk_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// SK Service Callbacks +CONST gattServiceCBs_t skCBs = +{ + sk_ReadAttrCB, // Read callback function pointer + sk_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn SK_AddService + * + * @brief Initializes the Simple Key service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t SK_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, skConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( sk_HandleConnStatusCB ); + + + if ( services & SK_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( simplekeysAttrTbl, + GATT_NUM_ATTRS( simplekeysAttrTbl ), + &skCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn SK_SetParameter + * + * @brief Set a Simple Key Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SK_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SK_KEY_ATTR: + if ( len == sizeof ( uint8 ) ) + { + skKeyPressed = *((uint8*)pValue); + + // See if Notification/Indication has been enabled + GATTServApp_ProcessCharCfg( skConfig, &skKeyPressed, FALSE, + simplekeysAttrTbl, GATT_NUM_ATTRS( simplekeysAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn SK_GetParameter + * + * @brief Get a Simple Key Profile parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SK_GetParameter( uint8 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SK_KEY_ATTR: + *((uint8*)pValue) = skKeyPressed; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn sk_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles this type for reads + + // simple keys characteristic does not have read permissions, but because it + // can be sent as a notification, it must be included here + case SK_KEYPRESSED_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn sk_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t sk_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn sk_HandleConnStatusCB + * + * @brief Simple Keys Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void sk_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, skConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Keys/simplekeys.h b/Firmware/Radio/Profiles/Keys/simplekeys.h new file mode 100644 index 0000000..1e6ffbb --- /dev/null +++ b/Firmware/Radio/Profiles/Keys/simplekeys.h @@ -0,0 +1,132 @@ +/************************************************************************************************** + Filename: simplekeys.h + Revised: $Date: 2010-10-01 14:14:58 -0700 (Fri, 01 Oct 2010) $ + Revision: $Revision: 23960 $ + + Description: This file contains the Simple Keys Profile header file. + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SIMPLEKEYS_H +#define SIMPLEKEYS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define SK_KEY_ATTR 0 // RW uint8 - Profile Attribute value + +// SK Service UUID +#define SK_SERV_UUID 0xFFE0 + +// Key Pressed UUID +#define SK_KEYPRESSED_UUID 0xFFE1 + +// Key Values +#define SK_KEY_LEFT 0x01 +#define SK_KEY_RIGHT 0x02 + +// Simple Keys Profile Services bit fields +#define SK_SERVICE 0x00000001 + +/********************************************************************* + * TYPEDEFS + */ + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * SK_AddService- Initializes the Simple Key service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t SK_AddService( uint32 services ); + +/* + * SK_SetParameter - Set a Simple Key Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SK_SetParameter( uint8 param, uint8 len, void *pValue ); + +/* + * SK_GetParameter - Get a Simple Key Profile parameter. + * + * param - Profile parameter ID + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SK_GetParameter( uint8 param, void *pValue ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKEYS_H */ diff --git a/Firmware/Radio/Profiles/OAD/oad.h b/Firmware/Radio/Profiles/OAD/oad.h new file mode 100644 index 0000000..93bdc34 --- /dev/null +++ b/Firmware/Radio/Profiles/OAD/oad.h @@ -0,0 +1,144 @@ +/************************************************************************************************** + Filename: oad.h + Revised: $Date: 2012-12-06 13:16:36 -0800 (Thu, 06 Dec 2012) $ + Revision: $Revision: 32472 $ + + Description: This file contains OAD Profile header file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef OAD_H +#define OAD_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_aes.h" +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +#define OAD_SERVICE_UUID 0xFFC0 +#define OAD_IMG_IDENTIFY_UUID 0xFFC1 +#define OAD_IMG_BLOCK_UUID 0xFFC2 + +#define OAD_IMG_CRC_OSET 0x0000 +#if defined FEATURE_OAD_SECURE +#define OAD_IMG_HDR_OSET 0x0000 +#else // crc0 is calculated and placed by the IAR linker at 0x0, so img_hdr_t is 2 bytes offset. +#define OAD_IMG_HDR_OSET 0x0002 +#endif + +#define OAD_CHAR_CNT 2 + +// OAD Characteristic Indices +#define OAD_CHAR_IMG_IDENTIFY 0 +#define OAD_CHAR_IMG_BLOCK 1 + +// Image Identification size +#define OAD_IMG_ID_SIZE 4 + +// Image header size (version + length + image id size) +#define OAD_IMG_HDR_SIZE ( 2 + 2 + OAD_IMG_ID_SIZE ) + +// The Image is transporte in 16-byte blocks in order to avoid using blob operations. +#define OAD_BLOCK_SIZE 16 +#define OAD_BLOCKS_PER_PAGE (HAL_FLASH_PAGE_SIZE / OAD_BLOCK_SIZE) +#define OAD_BLOCK_MAX (OAD_BLOCKS_PER_PAGE * OAD_IMG_D_AREA) + +/********************************************************************* + * MACROS + */ + +// Macros to get Image ID (LSB) and Version Number +#define OAD_IMG_ID( ver ) ( (ver) & 0x01 ) +#define OAD_VER_NUM( ver ) ( (ver) >> 0x01 ) + +// Macro to set Image Version +#if defined (HAL_IMAGE_A) + #define OAD_IMG_VER( ver ) ( (uint16)( (ver) << 0x01 ) ) // Clear LSB for Image A +#else + #define OAD_IMG_VER( ver ) ( (uint16)( ( (ver) << 0x01 ) | 0x01 ) ) // Set LSB for Imange B +#endif + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * TYPEDEFS + */ + +// The Image Header will not be encrypted, but it will be included in a Signature. +typedef struct { +#if defined FEATURE_OAD_SECURE + // Secure OAD uses the Signature for image validation instead of calculating a CRC, but the use + // of CRC==CRC-Shadow for quick boot-up determination of a validated image is still used. + uint16 crc0; // CRC must not be 0x0000 or 0xFFFF. +#endif + uint16 crc1; // CRC-shadow must be 0xFFFF. + // User-defined Image Version Number - default logic uses simple a '!=' comparison to start an OAD. + uint16 ver; + uint16 len; // Image length in 4-byte blocks (i.e. HAL_FLASH_WORD_SIZE blocks). + uint8 uid[4]; // User-defined Image Identification bytes. + uint8 res[4]; // Reserved space for future use. +} img_hdr_t; + +#if defined FEATURE_OAD_SECURE +static_assert((sizeof(img_hdr_t) == 16), "Bad SBL_ADDR_AES_HDR definition."); +static_assert(((sizeof(img_hdr_t) % KEY_BLENGTH) == 0), + "img_hdr_t is not an even multiple of KEY_BLENGTH"); +#endif + +// The AES Header must be encrypted and the Signature must include the Image Header. +typedef struct { + uint8 signature[KEY_BLENGTH]; // The AES-128 CBC-MAC signature. + uint8 nonce12[12]; // The 12-byte Nonce for calculating the signature. + uint8 spare[4]; +} aes_hdr_t; + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OAD_H */ diff --git a/Firmware/Radio/Profiles/OAD/oad_target.c b/Firmware/Radio/Profiles/OAD/oad_target.c new file mode 100644 index 0000000..6635e76 --- /dev/null +++ b/Firmware/Radio/Profiles/OAD/oad_target.c @@ -0,0 +1,696 @@ +/************************************************************************************************** + Filename: oad_target.c + Revised: $Date: 2012-11-16 18:39:26 -0800 (Fri, 16 Nov 2012) $ + Revision: $Revision: 32218 $ + + Description: This file contains OAD Target implementation. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "bcomdef.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "hal_aes.h" +#include "hal_crc.h" +#include "hal_flash.h" +#if (defined HAL_LCD) && (HAL_LCD == TRUE) +#include "hal_lcd.h" +#endif +#include "hal_types.h" +#include "linkdb.h" +#include "oad.h" +#include "oad_target.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +#define OAD_FLASH_PAGE_MULT ((uint16)(HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)) + +#if defined (FEATURE_OAD_SECURE) && defined (HAL_IMAGE_A) + // Enabled to ONLY build a BOOTSTRAP Encrypted Image-A (for programming over + // BEM, not BIM). Comment line below to build a non-bootstrap Encrypted Image-A. + #define BOOTP_E_IMAGE_A +#endif + +#if !defined (OAD_IMAGE_VERSION) + #define OAD_IMAGE_VERSION 0x0000 +#endif + +#if !defined (OAD_IMAGE_A_USER_ID) + #define OAD_IMAGE_A_USER_ID {'A', 'A', 'A', 'A'} +#endif + +#if !defined (OAD_IMAGE_B_USER_ID) + #define OAD_IMAGE_B_USER_ID {'B', 'B', 'B', 'B'} +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// OAD Service UUID +static CONST uint8 oadServUUID[ATT_UUID_SIZE] = +{ + TI_BASE_UUID_128( OAD_SERVICE_UUID ) +}; + +static CONST uint8 oadCharUUID[OAD_CHAR_CNT][ATT_UUID_SIZE] = +{ + // OAD Image Identify UUID + TI_BASE_UUID_128( OAD_IMG_IDENTIFY_UUID ), + + // OAD Image Block Request/Response UUID + TI_BASE_UUID_128( OAD_IMG_BLOCK_UUID ) +}; + +/********************************************************************* + * Profile Attributes - variables + */ + +// OAD Service attribute +static CONST gattAttrType_t oadService = { ATT_UUID_SIZE, oadServUUID }; + +// Place holders for the GATT Server App to be able to lookup handles. +static uint8 oadCharVals[OAD_CHAR_CNT]; + +// OAD Characteristic Properties +static uint8 oadCharProps = GATT_PROP_WRITE_NO_RSP | GATT_PROP_WRITE | GATT_PROP_NOTIFY; + +// OAD Client Characteristic Configs +static gattCharCfg_t oadImgIdentifyConfig[GATT_MAX_NUM_CONN]; +static gattCharCfg_t oadImgBlockConfig[GATT_MAX_NUM_CONN]; + +// OAD Characteristic user descriptions +static CONST uint8 oadImgIdentifyDesc[] = "Img Identify"; +static CONST uint8 oadImgBlockDesc[] = "Img Block"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t oadAttrTbl[] = +{ + // OAD Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&oadService + }, + + // OAD Image Identify Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &oadCharProps + }, + + // OAD Image Identify Characteristic Value + { + { ATT_UUID_SIZE, oadCharUUID[0] }, + GATT_PERMIT_WRITE, + 0, + oadCharVals+0 + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)oadImgIdentifyConfig + }, + + // OAD Image Identify User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)oadImgIdentifyDesc + }, + + // OAD Image Block Request/Response Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &oadCharProps + }, + + // OAD Image Block Request/Response Characteristic Value + { + { ATT_UUID_SIZE, oadCharUUID[1] }, + GATT_PERMIT_WRITE, + 0, + oadCharVals+1 + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)oadImgBlockConfig + }, + + // OAD Image Block Request/Response User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)oadImgBlockDesc + } +}; + +#pragma location="IMAGE_HEADER" +const __code img_hdr_t _imgHdr = { +#if defined FEATURE_OAD_SECURE + 2012, // CRC must not be 0x0000 or 0xFFFF. +#endif +#if defined (BOOTP_E_IMAGE_A) +#warning "Forcing a CRC-shadow match with the BOOTP_E_IMAGE_A flag - is this bootstrap code?" + 2012, // CRC-shadow forced to match CRC for a bootstrap Encrypted Image-A +#else + 0xFFFF, // CRC-shadow must be 0xFFFF for everything else +#endif + OAD_IMG_VER( OAD_IMAGE_VERSION ), // 15-bit Version #, left-shifted 1; OR with Image-B/Not-A bit. + OAD_IMG_R_AREA * OAD_FLASH_PAGE_MULT, +#if defined HAL_IMAGE_A + OAD_IMAGE_A_USER_ID, // User-Id +#else + OAD_IMAGE_B_USER_ID, // User-Id +#endif + { 0xFF, 0xFF, 0xFF, 0xFF } // Reserved +}; +#pragma required=_imgHdr + +#pragma location="AES_HEADER" +static const __code aes_hdr_t _aesHdr = { + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B }, // Dummy Nonce + { 0xFF, 0xFF, 0xFF, 0xFF } // Spare +}; +#pragma required=_aesHdr + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uint16 oadBlkNum = 0, oadBlkTot = 0xFFFF; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 oadReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen); + +static bStatus_t oadWriteAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset); + +CONST gattServiceCBs_t oadCBs = +{ + oadReadAttrCB, // Read callback function pointer. + oadWriteAttrCB, // Write callback function pointer. + NULL // Authorization callback function pointer. +}; + +static void oadImgBlockReq(uint16 connHandle, uint16 blkNum); + +static void oadImgIdentifyReq(uint16 connHandle, img_hdr_t *pImgHdr); + +static bStatus_t oadImgIdentifyWrite( uint16 connHandle, uint8 *pValue ); + +static bStatus_t oadImgBlockWrite( uint16 connHandle, uint8 *pValue ); + +static void oadHandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +#if !defined FEATURE_OAD_SECURE +static uint8 checkDL(void); +#endif + +/********************************************************************* + * @fn OADTarget_AddService + * + * @brief Initializes the OAD Service by registering GATT attributes + * with the GATT server. Only call this function once. + * + * @return The return value of GATTServApp_RegisterForMsg(). + */ +bStatus_t OADTarget_AddService(void) +{ + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, oadImgIdentifyConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, oadImgBlockConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( oadHandleConnStatusCB ); + + return GATTServApp_RegisterService(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), &oadCBs); +} + +/********************************************************************* + * @fn oadReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 oadReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen) +{ + bStatus_t status = SUCCESS; + + // TBD: is there any use for supporting reads + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + + return status; +} + +/********************************************************************* + * @fn oadWriteAttrCB + * + * @brief Validate and Write attribute data + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t oadWriteAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + if ( uuid == GATT_CLIENT_CHAR_CFG_UUID) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; // Should never get here! + } + } + else + { + // 128-bit UUID + if (osal_memcmp(pAttr->type.uuid, oadCharUUID[OAD_CHAR_IMG_IDENTIFY], ATT_UUID_SIZE)) + { + status = oadImgIdentifyWrite( connHandle, pValue ); + } + else if (osal_memcmp(pAttr->type.uuid, oadCharUUID[OAD_CHAR_IMG_BLOCK], ATT_UUID_SIZE)) + { + status = oadImgBlockWrite( connHandle, pValue ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; // Should never get here! + } + } + + return status; +} + +/********************************************************************* + * @fn oadImgIdentifyWrite + * + * @brief Process the Image Identify Write. + * + * @param connHandle - connection message was received on + * @param pValue - pointer to data to be written + * + * @return status + */ +static bStatus_t oadImgIdentifyWrite( uint16 connHandle, uint8 *pValue ) +{ + img_hdr_t rxHdr; + img_hdr_t ImgHdr; + + rxHdr.ver = BUILD_UINT16( pValue[0], pValue[1] ); + rxHdr.len = BUILD_UINT16( pValue[2], pValue[3] ); + + (void)osal_memcpy(rxHdr.uid, pValue+4, sizeof(rxHdr.uid)); + + HalFlashRead(OAD_IMG_R_PAGE, OAD_IMG_HDR_OSET, (uint8 *)&ImgHdr, sizeof(img_hdr_t)); + + oadBlkTot = rxHdr.len / (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE); + + if ( (OAD_IMG_ID( ImgHdr.ver ) != OAD_IMG_ID( rxHdr.ver )) && // TBD: add customer criteria for initiating OAD here. + (oadBlkTot <= OAD_BLOCK_MAX) && + (oadBlkTot != 0) ) + { + oadBlkNum = 0; + oadImgBlockReq(connHandle, 0); + } + else + { + oadImgIdentifyReq(connHandle, &ImgHdr); + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn oadImgBlockWrite + * + * @brief Process the Image Block Write. + * + * @param connHandle - connection message was received on + * @param pValue - pointer to data to be written + * + * @return status + */ +static bStatus_t oadImgBlockWrite( uint16 connHandle, uint8 *pValue ) +{ + uint16 blkNum = BUILD_UINT16( pValue[0], pValue[1] ); + + // make sure this is the image we're expecting + if ( blkNum == 0 ) + { + img_hdr_t ImgHdr; + uint16 ver = BUILD_UINT16( pValue[6], pValue[7] ); + uint16 blkTot = BUILD_UINT16( pValue[8], pValue[9] ) / (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE); + + HalFlashRead(OAD_IMG_R_PAGE, OAD_IMG_HDR_OSET, (uint8 *)&ImgHdr, sizeof(img_hdr_t)); + + if ( ( oadBlkNum != blkNum ) || + ( oadBlkTot != blkTot ) || + ( OAD_IMG_ID( ImgHdr.ver ) == OAD_IMG_ID( ver ) ) ) + { + return ( ATT_ERR_WRITE_NOT_PERMITTED ); + } + } + + if (oadBlkNum == blkNum) + { + uint16 addr = oadBlkNum * (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE) + + (OAD_IMG_D_PAGE * OAD_FLASH_PAGE_MULT); + oadBlkNum++; + +#if defined FEATURE_OAD_SECURE + if (blkNum == 0) + { + // Stop attack with crc0==crc1 by forcing crc1=0xffff. + pValue[4] = 0xFF; + pValue[5] = 0xFF; + } +#endif + +#if defined HAL_IMAGE_B + // Skip the Image-B area which lies between the lower & upper Image-A parts. + if (addr >= (OAD_IMG_B_PAGE * OAD_FLASH_PAGE_MULT)) + { + addr += OAD_IMG_B_AREA * OAD_FLASH_PAGE_MULT; + } +#endif + if ((addr % OAD_FLASH_PAGE_MULT) == 0) + { + HalFlashErase(addr / OAD_FLASH_PAGE_MULT); + } + + HalFlashWrite(addr, pValue+2, (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE)); + } + + if (oadBlkNum == oadBlkTot) // If the OAD Image is complete. + { +#if defined FEATURE_OAD_SECURE + HAL_SYSTEM_RESET(); // Only the secure OAD boot loader has the security key to decrypt. +#else + if (checkDL()) + { +#if !defined HAL_IMAGE_A + // The BIM always checks for a valid Image-B before Image-A, + // so Image-A never has to invalidate itself. + uint16 crc[2] = { 0x0000, 0xFFFF }; + uint16 addr = OAD_IMG_R_PAGE * OAD_FLASH_PAGE_MULT + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE; + HalFlashWrite(addr, (uint8 *)crc, 1); +#endif + HAL_SYSTEM_RESET(); + } +#endif + } + else // Request the next OAD Image block. + { + oadImgBlockReq(connHandle, oadBlkNum); + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn oadImgIdentifyReq + * + * @brief Process the Image Identify Request. + * + * @param connHandle - connection message was received on + * @param pImgHdr - Pointer to the img_hdr_t data to send. + * + * @return None + */ +static void oadImgBlockReq(uint16 connHandle, uint16 blkNum) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, oadImgBlockConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + attHandleValueNoti_t noti; + gattAttribute_t *pAttr = GATTServApp_FindAttr(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), + oadCharVals+OAD_CHAR_IMG_BLOCK); + noti.handle = pAttr->handle; + noti.len = 2; + noti.value[0] = LO_UINT16(blkNum); + noti.value[1] = HI_UINT16(blkNum); + + VOID GATT_Notification(connHandle, ¬i, FALSE); + } +} + +/********************************************************************* + * @fn oadImgIdentifyReq + * + * @brief Process the Image Identify Request. + * + * @param connHandle - connection message was received on + * @param pImgHdr - Pointer to the img_hdr_t data to send. + * + * @return None + */ +static void oadImgIdentifyReq(uint16 connHandle, img_hdr_t *pImgHdr) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, oadImgIdentifyConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + attHandleValueNoti_t noti; + gattAttribute_t *pAttr = GATTServApp_FindAttr(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), + oadCharVals+OAD_CHAR_IMG_IDENTIFY); + noti.handle = pAttr->handle; + noti.len = OAD_IMG_HDR_SIZE; + noti.value[0] = LO_UINT16(pImgHdr->ver); + noti.value[1] = HI_UINT16(pImgHdr->ver); + + noti.value[2] = LO_UINT16(pImgHdr->len); + noti.value[3] = HI_UINT16(pImgHdr->len); + + (void)osal_memcpy(noti.value+4, pImgHdr->uid, sizeof(pImgHdr->uid)); + + VOID GATT_Notification(connHandle, ¬i, FALSE); + } +} + +#if !defined FEATURE_OAD_SECURE +/************************************************************************************************** + * @fn crcCalcDL + * + * @brief Run the CRC16 Polynomial calculation over the DL image. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The CRC16 calculated. + ************************************************************************************************** + */ +static uint16 crcCalcDL(void) +{ + uint8 pageEnd = oadBlkTot / OAD_BLOCKS_PER_PAGE; + uint16 osetEnd = (oadBlkTot - (pageEnd * OAD_BLOCKS_PER_PAGE)) * OAD_BLOCK_SIZE; + +#if defined HAL_IMAGE_B + pageEnd += OAD_IMG_D_PAGE + OAD_IMG_B_AREA; +#else + pageEnd += OAD_IMG_D_PAGE; +#endif + + HalCRCInit(0x0000); // Seed thd CRC calculation with zero. + + for (uint8 page = OAD_IMG_D_PAGE; ; page++) + { +#if defined HAL_IMAGE_B + // Skip the Image-B area which lies between the lower & upper Image-A parts. + if (page == OAD_IMG_B_PAGE) + { + page += OAD_IMG_B_AREA; + } +#endif + + for (uint16 oset = 0; oset < HAL_FLASH_PAGE_SIZE; oset += HAL_FLASH_WORD_SIZE) + { + if ((page == OAD_IMG_D_PAGE) && (oset == OAD_IMG_CRC_OSET)) + { + continue; // Skip the CRC and shadow. + } + else if ((page == pageEnd) && (oset == osetEnd)) + { + return HalCRCCalc(); + } + else + { + uint8 buf[HAL_FLASH_WORD_SIZE]; + HalFlashRead(page, oset, buf, HAL_FLASH_WORD_SIZE); + + for (uint8 idx = 0; idx < HAL_FLASH_WORD_SIZE; idx++) + { + HalCRCExec(buf[idx]); + } + } + } + } +} + +/************************************************************************************************** + * @fn checkDL + * + * @brief Check validity of the downloaded image. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return TRUE or FALSE for image valid. + ************************************************************************************************** + */ +static uint8 checkDL(void) +{ + uint16 crc[2]; + + HalFlashRead(OAD_IMG_D_PAGE, OAD_IMG_CRC_OSET, (uint8 *)crc, sizeof(crc)); + + if ((crc[0] == 0xFFFF) || (crc[0] == 0x0000)) + { + return FALSE; + } + + if (crc[1] == 0xFFFF) + { + crc[1] = crcCalcDL(); + +#if defined FEATURE_OAD_BIM // If download image is made to run in-place, enable it here. + uint16 addr = OAD_IMG_D_PAGE * OAD_FLASH_PAGE_MULT + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE; + crc[0] = 0xFFFF; + HalFlashWrite(addr, (uint8 *)crc, 1); + HalFlashRead(OAD_IMG_D_PAGE, OAD_IMG_CRC_OSET, (uint8 *)crc, sizeof(crc)); +#endif + } + + return (crc[0] == crc[1]); +} +#endif + +/********************************************************************* + * @fn oadHandleConnStatusCB + * + * @brief OAD Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void oadHandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, oadImgIdentifyConfig ); + GATTServApp_InitCharCfg( connHandle, oadImgBlockConfig ); + } + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/OAD/oad_target.h b/Firmware/Radio/Profiles/OAD/oad_target.h new file mode 100644 index 0000000..fb23a78 --- /dev/null +++ b/Firmware/Radio/Profiles/OAD/oad_target.h @@ -0,0 +1,117 @@ +/************************************************************************************************** + Filename: oad_target.h + Revised: $Date: 2012-11-16 18:39:26 -0800 (Fri, 16 Nov 2012) $ + Revision: $Revision: 32218 $ + + Description: This file contains OAD Target header file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef OAD_TARGET_H +#define OAD_TARGET_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_aes.h" +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +#if !defined OAD_IMG_A_PAGE +#define OAD_IMG_A_PAGE 1 +#define OAD_IMG_A_AREA 62 +#endif + +#if !defined OAD_IMG_B_PAGE +// Image-A/B can be very differently sized areas when implementing BIM vice OAD boot loader. +#if defined FEATURE_OAD_BIM +#define OAD_IMG_B_PAGE 8 +#else +#define OAD_IMG_B_PAGE 63 +#endif +#define OAD_IMG_B_AREA (124 - OAD_IMG_A_AREA) +#endif + +#if defined HAL_IMAGE_B +#define OAD_IMG_D_PAGE OAD_IMG_A_PAGE +#define OAD_IMG_D_AREA OAD_IMG_A_AREA +#define OAD_IMG_R_PAGE OAD_IMG_B_PAGE +#define OAD_IMG_R_AREA OAD_IMG_B_AREA +#else //#elif defined HAL_IMAGE_A or a non-BIM-enabled OAD Image-A w/ constants in Bank 1 vice 5. +#define OAD_IMG_D_PAGE OAD_IMG_B_PAGE +#define OAD_IMG_D_AREA OAD_IMG_B_AREA +#define OAD_IMG_R_PAGE OAD_IMG_A_PAGE +#define OAD_IMG_R_AREA OAD_IMG_A_AREA +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// OAD Image Header +extern const __code img_hdr_t _imgHdr; + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * @fn OADTarget_AddService + * + * @brief Initializes the OAD Service by registering GATT attributes + * with the GATT server. Only call this function once. + * + * @return Success or Failure + */ +bStatus_t OADTarget_AddService( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OAD_TARGET_H */ \ No newline at end of file diff --git a/Firmware/Radio/Profiles/Proximity/proxreporter.c b/Firmware/Radio/Profiles/Proximity/proxreporter.c new file mode 100644 index 0000000..1f321e5 --- /dev/null +++ b/Firmware/Radio/Profiles/Proximity/proxreporter.c @@ -0,0 +1,619 @@ +/************************************************************************************************** + Filename: proxreporter.c + Revised: $Date: 2011-11-21 15:26:10 -0800 (Mon, 21 Nov 2011) $ + Revision: $Revision: 28439 $ + + Description: Proximity Profile - Reporter Role + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "proxreporter.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +#define PP_DEFAULT_TX_POWER 0 +#define PP_DEFAULT_PATH_LOSS 0x7F + +#define SERVAPP_NUM_ATTR_SUPPORTED 5 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Link Loss Service UUID +CONST uint8 linkLossServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( LINK_LOSS_SERVICE_UUID ), HI_UINT16( LINK_LOSS_SERVICE_UUID ) +}; + +// Immediate Alert Service UUID +CONST uint8 imAlertServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( IMMEDIATE_ALERT_SERVICE_UUID ), HI_UINT16( IMMEDIATE_ALERT_SERVICE_UUID ) +}; + +// Tx Power Level Service UUID +CONST uint8 txPwrLevelServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( TX_PWR_LEVEL_SERVICE_UUID ), HI_UINT16( TX_PWR_LEVEL_SERVICE_UUID ) +}; + +// Alert Level Attribute UUID +CONST uint8 alertLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PROXIMITY_ALERT_LEVEL_UUID ), HI_UINT16( PROXIMITY_ALERT_LEVEL_UUID ) +}; + +// Tx Power Level Attribute UUID +CONST uint8 txPwrLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PROXIMITY_TX_PWR_LEVEL_UUID ), HI_UINT16( PROXIMITY_TX_PWR_LEVEL_UUID ) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static proxReporterCBs_t *pp_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Link Loss Service +static CONST gattAttrType_t linkLossService = { ATT_BT_UUID_SIZE, linkLossServUUID }; + +// Alert Level Characteristic Properties +static uint8 llAlertLevelCharProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Alert Level attribute +// This attribute enumerates the level of alert. +static uint8 llAlertLevel = PP_ALERT_LEVEL_NO; + +// Immediate Alert Service +static CONST gattAttrType_t imAlertService = { ATT_BT_UUID_SIZE, imAlertServUUID }; + +// Alert Level Characteristic Properties +static uint8 imAlertLevelCharProps = GATT_PROP_WRITE_NO_RSP; + +// Alert Level attribute +// This attribute enumerates the level of alert. +static uint8 imAlertLevel = PP_ALERT_LEVEL_NO; + +// Tx Power Level Service +static CONST gattAttrType_t txPwrLevelService = { ATT_BT_UUID_SIZE, txPwrLevelServUUID }; + +// Tx Power Level Characteristic Properties +static uint8 txPwrLevelCharProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +// Tx Power Level attribute +// This attribute represents the range of transmit power levels in dBm with +// a range from -20 to +20 to a resolution of 1 dBm. +static int8 txPwrLevel = PP_DEFAULT_TX_POWER; + +// Tx Power Level Characteristic Configs +static gattCharCfg_t txPwrLevelConfig[GATT_MAX_NUM_CONN]; + + +/********************************************************************* + * Profile Attributes - Table + */ +// Link Loss Service Atttribute Table +static gattAttribute_t linkLossAttrTbl[] = +{ + // Link Loss service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&linkLossService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &llAlertLevelCharProps + }, + + // Alert Level attribute + { + { ATT_BT_UUID_SIZE, alertLevelUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &llAlertLevel + }, +}; + +// Immediate Alert Service Atttribute Table +static gattAttribute_t imAlertAttrTbl[] = +{ + // Immediate Alert service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&imAlertService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &imAlertLevelCharProps + }, + + // Alert Level attribute + { + { ATT_BT_UUID_SIZE, alertLevelUUID }, + GATT_PERMIT_WRITE, + 0, + &imAlertLevel + }, +}; + +// Tx Power Level Service Atttribute Table +static gattAttribute_t txPwrLevelAttrTbl[] = +{ + // Tx Power Level service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&txPwrLevelService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &txPwrLevelCharProps + }, + + // Tx Power Level attribute + { + { ATT_BT_UUID_SIZE, txPwrLevelUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&txPwrLevel + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)txPwrLevelConfig + }, + +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 proxReporter_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t proxReporter_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void proxReporter_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Prox Reporter Service Callbacks +CONST gattServiceCBs_t proxReporterCBs = +{ + proxReporter_ReadAttrCB, // Read callback function pointer + proxReporter_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn proxReporter_AddService + * + * @brief Initializes the Proximity Reporter service by + * registering GATT attributes with the GATT server. + * Only call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t ProxReporter_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + if ( services & PP_LINK_LOSS_SERVICE ) + { + // Register Link Loss attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( linkLossAttrTbl, + GATT_NUM_ATTRS( linkLossAttrTbl ), + &proxReporterCBs ); + } + + if ( ( status == SUCCESS ) && ( services & PP_IM_ALETR_SERVICE ) ) + { + // Register Link Loss attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( imAlertAttrTbl, + GATT_NUM_ATTRS( imAlertAttrTbl ), + &proxReporterCBs ); + } + + if ( ( status == SUCCESS ) && ( services & PP_TX_PWR_LEVEL_SERVICE ) ) + { + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, txPwrLevelConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( proxReporter_HandleConnStatusCB ); + + + // Register Tx Power Level attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( txPwrLevelAttrTbl, + GATT_NUM_ATTRS( txPwrLevelAttrTbl ), + &proxReporterCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn proxReporter_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t ProxReporter_RegisterAppCBs( proxReporterCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + pp_AppCBs = appCallbacks; + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + + +/********************************************************************* + * @fn proxReporter_SetParameter + * + * @brief Set a Proximity Reporter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ProxReporter_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + case PP_LINK_LOSS_ALERT_LEVEL: + if ( (len == sizeof ( uint8 )) && ((*((uint8*)value) <= PP_ALERT_LEVEL_HIGH)) ) + { + llAlertLevel = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case PP_IM_ALERT_LEVEL: + if ( len == sizeof ( uint8 ) ) + { + imAlertLevel = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case PP_TX_POWER_LEVEL: + if ( len == sizeof ( int8 ) ) + { + txPwrLevel = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( txPwrLevelConfig, (uint8 *)&txPwrLevel, FALSE, + txPwrLevelAttrTbl, GATT_NUM_ATTRS( txPwrLevelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ProxReporter_GetParameter + * + * @brief Get a Proximity Reporter parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ProxReporter_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case PP_LINK_LOSS_ALERT_LEVEL: + *((uint8*)value) = llAlertLevel; + break; + + case PP_IM_ALERT_LEVEL: + *((uint8*)value) = imAlertLevel; + break; + + case PP_TX_POWER_LEVEL: + *((int8*)value) = txPwrLevel; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn proxReporter_ReadAttrCB + * + * @brief Read an attribute. + * + * @param + * + * @return Success or Failure + */ +static uint8 proxReporter_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + case PROXIMITY_ALERT_LEVEL_UUID: + case PROXIMITY_TX_PWR_LEVEL_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + //128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn proxReporter_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle – connection message was received on + * @param pReq - pointer to request + * + * @return Success or Failure + */ +static bStatus_t proxReporter_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notify = 0xFF; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case PROXIMITY_ALERT_LEVEL_UUID: + // Validate the value + // Make sure it's not a blob operation + if ( offset == 0 ) + { + if ( len > 1 ) + status = ATT_ERR_INVALID_VALUE_SIZE; + else + { + if ( pValue[0] > PP_ALERT_LEVEL_HIGH ) + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + if( pAttr->pValue == &llAlertLevel ) + notify = PP_LINK_LOSS_ALERT_LEVEL; + else + notify = PP_IM_ALERT_LEVEL; + } + + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If an attribute changed then callback function to notify application of change + if ( (notify != 0xFF) && pp_AppCBs && pp_AppCBs->pfnAttrChange ) + pp_AppCBs->pfnAttrChange( notify ); + + return ( status ); +} + +/********************************************************************* + * @fn proxReporter_HandleConnStatusCB + * + * @brief Tx Power Level Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void proxReporter_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, txPwrLevelConfig ); + } + } +} + + + + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Proximity/proxreporter.h b/Firmware/Radio/Profiles/Proximity/proxreporter.h new file mode 100644 index 0000000..36406a9 --- /dev/null +++ b/Firmware/Radio/Profiles/Proximity/proxreporter.h @@ -0,0 +1,154 @@ +/************************************************************************************************** + Filename: proxreporter.h + Revised: $Date: 2011-06-27 14:14:31 -0700 (Mon, 27 Jun 2011) $ + Revision: $Revision: 26482 $ + + Description: This file contains Proximity - Reporter header file. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef PROXIMITYREPORTER_H +#define PROXIMITYREPORTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define PP_LINK_LOSS_ALERT_LEVEL 0 // RW uint8 - Profile Attribute value +#define PP_IM_ALERT_LEVEL 1 // RW uint8 - Profile Attribute value +#define PP_TX_POWER_LEVEL 2 // RW int8 - Profile Attribute value + +// Proximity Profile Service UUIDs +#define LINK_LOSS_SERVICE_UUID 0x1803 +#define IMMEDIATE_ALERT_SERVICE_UUID 0x1802 +#define TX_PWR_LEVEL_SERVICE_UUID 0x1804 + +// Proximity Profile Attribute UUIDs +#define PROXIMITY_ALERT_LEVEL_UUID 0x2A06 +#define PROXIMITY_TX_PWR_LEVEL_UUID 0x2A07 + +// Alert Level Values +#define PP_ALERT_LEVEL_NO 0x00 +#define PP_ALERT_LEVEL_LOW 0x01 +#define PP_ALERT_LEVEL_HIGH 0x02 + +// Proximity Profile Services bit fields +#define PP_LINK_LOSS_SERVICE 0x00000001 // Link Loss Service +#define PP_IM_ALETR_SERVICE 0x00000002 // Immediate Alert Service +#define PP_TX_PWR_LEVEL_SERVICE 0x00000004 // Tx Power Level Service + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when the device has been started. Callback event to +// the Notify of an attribute change. +typedef NULL_OK void (*ppAttrChange_t)( uint8 attrParamID ); + +typedef struct +{ + ppAttrChange_t pfnAttrChange; // Whenever the Link Loss Alert attribute changes +} proxReporterCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * ProxReporter_InitService- Initializes the Proximity Reporter service by + * registering GATT attributes with the GATT server. Only call + * this function once. + + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t ProxReporter_AddService( uint32 services ); + +/* + * ProxReporter_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t ProxReporter_RegisterAppCBs( proxReporterCBs_t *appCallbacks ); + + +/* + * ProxReporter_SetParameter - Set a Proximity Reporter parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t ProxReporter_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * ProxReporter_GetParameter - Get a Proximity Reporter parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t ProxReporter_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* PROXIMITYREPORTER_H */ diff --git a/Firmware/Radio/Profiles/Roles/broadcaster.c b/Firmware/Radio/Profiles/Roles/broadcaster.c new file mode 100644 index 0000000..8f6c8c2 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/broadcaster.c @@ -0,0 +1,637 @@ +/************************************************************************************************** + Filename: broadcaster.c + Revised: $Date: 2011-05-05 10:12:10 -0700 (Thu, 05 May 2011) $ + Revision: $Revision: 25871 $ + + Description: GAP Broadcaster Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci_tl.h" + +#include "gap.h" + +#include "broadcaster.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // BR/EDR not supported + GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +// Application callbacks +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + if ( gapRole_state == GAPROLE_ADVERTISING ) + { + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in broadcaster.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = GAP_PROFILE_BROADCASTER; + + gapRole_AdvEventType = GAP_ADTYPE_ADV_NONCONN_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in broadcaster.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + + return ( events ^ START_ADVERTISING_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + //hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, TRUE, + gapRole_AdvertDataLen, + gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + gapRole_state = GAPROLE_ADVERTISING; + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + NULL, NULL, NULL ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/broadcaster.h b/Firmware/Radio/Profiles/Roles/broadcaster.h new file mode 100644 index 0000000..3aed6a9 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/broadcaster.h @@ -0,0 +1,220 @@ +/** + @headerfile: broadcaster.h + $Date: 2011-02-17 12:17:30 -0800 (Thu, 17 Feb 2011) $ + $Revision: 25119 $ + + @mainpage TI BLE GAP Broadcaster Role + + This GAP profile only advertises. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef BROADCASTER_H +#define BROADCASTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_BD_ADDR 0x301 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x302 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_OFF_TIME 0x303 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x304 //!< Advertisement Data. Read/Write. Size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x305 //!< Scan Response Data. Read/Write. Size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x306 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x307 //!< Direct Advertisement Address Type. Ready/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x308 //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x309 //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30A //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Broadcaster Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BROADCASTER_API GAP Broadcaster Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @} End GAPROLES_BROADCASTER_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* BROADCASTER_H */ diff --git a/Firmware/Radio/Profiles/Roles/central.c b/Firmware/Radio/Profiles/Roles/central.c new file mode 100644 index 0000000..4ce33c0 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/central.c @@ -0,0 +1,694 @@ +/************************************************************************************************** + Filename: central.c + Revised: $Date: 2012-05-18 09:00:17 -0700 (Fri, 18 May 2012) $ + Revision: $Revision: 30571 $ + + Description: GAP Central Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_cbTimer.h" +#include "osal_snv.h" +#include "hci_tl.h" +#include "l2cap.h" +#include "linkdb.h" +#include "gap.h" +#include "gapbondmgr.h" +#include "central.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Events +#define START_ADVERTISING_EVT 0x0001 +#define RSSI_READ_EVT 0x0002 +#define UPDATE_PARAMS_TIMEOUT_EVT 0x0004 + +// Profile OSAL Message IDs +#define GAPCENTRALROLE_RSSI_MSG_EVT 0xE0 + +/********************************************************************* + * TYPEDEFS + */ + +// RSSI read data structure +typedef struct +{ + uint16 period; + uint16 connHandle; + uint8 timerId; +} gapCentralRoleRssi_t; + +// OSAL event structure for RSSI timer events +typedef struct +{ + osal_event_hdr_t hdr; + gapCentralRoleRssi_t *pRssi; +} gapCentralRoleRssiEvent_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Task ID +static uint8 gapCentralRoleTaskId; + +// App callbacks +static gapCentralRoleCB_t *pGapCentralRoleCB; + +// Array of RSSI read structures +static gapCentralRoleRssi_t gapCentralRoleRssi[GAPCENTRALROLE_NUM_RSSI_LINKS]; + +/********************************************************************* + * Profile Parameters - reference GAPCENTRALROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapCentralRoleIRK[KEYLEN]; +static uint8 gapCentralRoleSRK[KEYLEN]; +static uint32 gapCentralRoleSignCounter; +static uint8 gapCentralRoleBdAddr[B_ADDR_LEN]; +static uint8 gapCentralRoleMaxScanRes = 0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapCentralRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapCentralRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static gapCentralRoleRssi_t *gapCentralRole_RssiAlloc( uint16 connHandle ); +static gapCentralRoleRssi_t *gapCentralRole_RssiFind( uint16 connHandle ); +static void gapCentralRole_RssiFree( uint16 connHandle ); +static void gapCentralRole_timerCB( uint8 *pData ); + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartDevice( gapCentralRoleCB_t *pAppCallbacks ) +{ + if ( pAppCallbacks ) + { + pGapCentralRoleCB = pAppCallbacks; + } + + return GAP_DeviceInit( gapCentralRoleTaskId, GAP_PROFILE_CENTRAL, + gapCentralRoleMaxScanRes, gapCentralRoleIRK, + gapCentralRoleSRK, &gapCentralRoleSignCounter ); +} + +/** + * @brief Set a parameter in the Central Profile. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPCENTRALROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapCentralRoleIRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapCentralRoleSRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapCentralRoleSignCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_MAX_SCAN_RES: + if ( len == sizeof ( uint8 ) ) + { + gapCentralRoleMaxScanRes = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Get a parameter in the Central Profile. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPCENTRALROLE_IRK: + VOID osal_memcpy( pValue, gapCentralRoleIRK, KEYLEN ) ; + break; + + case GAPCENTRALROLE_SRK: + VOID osal_memcpy( pValue, gapCentralRoleSRK, KEYLEN ) ; + break; + + case GAPCENTRALROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapCentralRoleSignCounter; + break; + + case GAPCENTRALROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapCentralRoleBdAddr, B_ADDR_LEN ) ; + break; + + case GAPCENTRALROLE_MAX_SCAN_RES: + *((uint8*)pValue) = gapCentralRoleMaxScanRes; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Terminate a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_TerminateLink( uint16 connHandle ) +{ + return GAP_TerminateLinkReq( gapCentralRoleTaskId, connHandle ) ; +} + +/** + * @brief Establish a link to a peer device. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_EstablishLink( uint8 highDutyCycle, uint8 whiteList, + uint8 addrTypePeer, uint8 *peerAddr ) +{ + gapEstLinkReq_t params; + + params.taskID = gapCentralRoleTaskId; + params.highDutyCycle = highDutyCycle; + params.whiteList = whiteList; + params.addrTypePeer = addrTypePeer; + VOID osal_memcpy( params.peerAddr, peerAddr, B_ADDR_LEN ); + + return GAP_EstablishLinkReq( ¶ms ); +} + +/** + * @brief Update the link connection parameters. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_UpdateLink( uint16 connHandle, uint16 connIntervalMin, + uint16 connIntervalMax, uint16 connLatency, + uint16 connTimeout ) +{ + return (bStatus_t) HCI_LE_ConnUpdateCmd( connHandle, connIntervalMin, + connIntervalMax, connLatency, + connTimeout, 0, 0 ); +} + +/** + * @brief Start a device discovery scan. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ) +{ + gapDevDiscReq_t params; + + params.taskID = gapCentralRoleTaskId; + params.mode = mode; + params.activeScan = activeScan; + params.whiteList = whiteList; + + return GAP_DeviceDiscoveryRequest( ¶ms ); +} + +/** + * @brief Cancel a device discovery scan. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_CancelDiscovery( void ) +{ + return GAP_DeviceDiscoveryCancel( gapCentralRoleTaskId ); +} + +/** + * @brief Start periodic RSSI reads on a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartRssi( uint16 connHandle, uint16 period ) +{ + gapCentralRoleRssi_t *pRssi; + + // Verify link is up + if (!linkDB_Up(connHandle)) + { + return bleIncorrectMode; + } + + // If already allocated + if ((pRssi = gapCentralRole_RssiFind( connHandle )) != NULL) + { + // Stop timer + osal_CbTimerStop( pRssi->timerId ); + } + // Allocate structure + else if ((pRssi = gapCentralRole_RssiAlloc( connHandle )) != NULL) + { + pRssi->period = period; + } + // Allocate failed + else + { + return bleNoResources; + } + + // Start timer + osal_CbTimerStart( gapCentralRole_timerCB, (uint8 *) pRssi, + period, &pRssi->timerId ); + + return SUCCESS; +} + +/** + * @brief Cancel periodic RSSI reads on a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_CancelRssi(uint16 connHandle ) +{ + gapCentralRoleRssi_t *pRssi; + + if ((pRssi = gapCentralRole_RssiFind( connHandle )) != NULL) + { + // Stop timer + osal_CbTimerStop( pRssi->timerId ); + + // Free RSSI structure + gapCentralRole_RssiFree( connHandle ); + + return SUCCESS; + } + + // Not found + return bleIncorrectMode; +} + +/** + * @brief Central Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +void GAPCentralRole_Init( uint8 taskId ) +{ + uint8 i; + + gapCentralRoleTaskId = taskId; + + // Initialize internal data + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + gapCentralRoleRssi[i].connHandle = GAP_CONNHANDLE_ALL; + gapCentralRoleRssi[i].timerId = INVALID_TIMER_ID; + } + + // Initialize parameters + + // Retore items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapCentralRoleIRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapCentralRoleSRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapCentralRoleSignCounter ); + + // Register for HCI messages (for RSSI) + GAP_RegisterForHCIMsgs( taskId ); +} + +/** + * @brief Central Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +uint16 GAPCentralRole_ProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapCentralRoleTaskId )) != NULL ) + { + gapCentralRole_ProcessOSALMsg( (osal_event_hdr_t *) pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapCentralRoleSignCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapCentralRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapCentralRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *) pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + uint16 connHandle = BUILD_UINT16( pPkt->pReturnParam[1], pPkt->pReturnParam[2] ); + int8 rssi = (int8) pPkt->pReturnParam[3]; + + // Report RSSI to app + if ( pGapCentralRoleCB && pGapCentralRoleCB->rssiCB ) + { + pGapCentralRoleCB->rssiCB( connHandle, rssi ); + } + } + } + break; + + case GAP_MSG_EVENT: + gapCentralRole_ProcessGAPMsg( (gapEventHdr_t *) pMsg ); + break; + + case GAPCENTRALROLE_RSSI_MSG_EVT: + { + gapCentralRoleRssi_t *pRssi = ((gapCentralRoleRssiEvent_t *) pMsg)->pRssi; + + // If link is up and RSSI reads active + if (pRssi->connHandle != GAP_CONNHANDLE_ALL && + linkDB_Up(pRssi->connHandle)) + { + // Restart timer + osal_CbTimerStart( gapCentralRole_timerCB, (uint8 *) pRssi, + pRssi->period, &pRssi->timerId ); + + // Read RSSI + VOID HCI_ReadRssiCmd( pRssi->connHandle ); + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapCentralRole_ProcessGAPMsg + * + * @brief Process an incoming task message from GAP. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapCentralRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *) pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapCentralRoleIRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapCentralRoleSRK ); + + // Save off the information + VOID osal_memcpy( gapCentralRoleBdAddr, pPkt->devAddr, B_ADDR_LEN ); + } + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *) pMsg; + + if (pPkt->hdr.status == SUCCESS) + { + // Notify the Bond Manager of the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, + pPkt->connectionHandle, GAP_PROFILE_CENTRAL ); + } + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + uint16 connHandle = ((gapTerminateLinkEvent_t *) pMsg)->connectionHandle; + + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + + // Cancel RSSI reads + GAPCentralRole_CancelRssi( connHandle ); + } + break; + + // temporary workaround + case GAP_SLAVE_REQUESTED_SECURITY_EVENT: + GAPBondMgr_ProcessGAPMsg( pMsg ); + break; + + default: + break; + } + + // Pass event to app + if ( pGapCentralRoleCB && pGapCentralRoleCB->eventCB ) + { + pGapCentralRoleCB->eventCB( (gapCentralRoleEvent_t *) pMsg ); + } +} + +/********************************************************************* + * @fn gapCentralRole_RssiAlloc + * + * @brief Allocate an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return pointer to structure or NULL if allocation failed. + */ +static gapCentralRoleRssi_t *gapCentralRole_RssiAlloc( uint16 connHandle ) +{ + uint8 i; + + // Find free RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == GAP_CONNHANDLE_ALL ) + { + gapCentralRoleRssi[i].connHandle = connHandle; + return &gapCentralRoleRssi[i]; + } + } + + // No free structure found + return NULL; +} + +/********************************************************************* + * @fn gapCentralRole_RssiFind + * + * @brief Find an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return pointer to structure or NULL if not found. + */ +static gapCentralRoleRssi_t *gapCentralRole_RssiFind( uint16 connHandle ) +{ + uint8 i; + + // Find free RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == connHandle ) + { + return &gapCentralRoleRssi[i]; + } + } + + // Not found + return NULL; +} + +/********************************************************************* + * @fn gapCentralRole_RssiFree + * + * @brief Free an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return none + */ +static void gapCentralRole_RssiFree( uint16 connHandle ) +{ + uint8 i; + + // Find RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == connHandle ) + { + gapCentralRoleRssi[i].connHandle = GAP_CONNHANDLE_ALL; + break; + } + } +} + +/********************************************************************* + * @fn gapCentralRole_timerCB + * + * @brief OSAL timer callback function + * + * @param pData - Data pointer + * + * @return none + */ +static void gapCentralRole_timerCB( uint8 *pData ) +{ + gapCentralRoleRssiEvent_t *pMsg; + + // Timer has expired so clear timer ID + ((gapCentralRoleRssi_t *) pData)->timerId = INVALID_TIMER_ID; + + // Send OSAL message + pMsg = (gapCentralRoleRssiEvent_t *) osal_msg_allocate( sizeof(gapCentralRoleRssiEvent_t) ); + if ( pMsg ) + { + pMsg->hdr.event = GAPCENTRALROLE_RSSI_MSG_EVT; + pMsg->pRssi = (gapCentralRoleRssi_t *) pData; + + osal_msg_send ( gapCentralRoleTaskId, (uint8 *) pMsg ); + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/central.h b/Firmware/Radio/Profiles/Roles/central.h new file mode 100644 index 0000000..d7d4709 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/central.h @@ -0,0 +1,308 @@ +/** + @headerfile: central.h + $Date: 2012-01-09 12:08:41 -0800 (Mon, 09 Jan 2012) $ + $Revision: 28871 $ + + @mainpage TI BLE GAP Central Role + + This GAP profile discovers and initiates connections. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef CENTRAL_H +#define CENTRAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "gap.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GAPCENTRALROLE_PROFILE_PARAMETERS GAP Central Role Parameters + * @{ + */ +#define GAPCENTRALROLE_IRK 0x400 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPCENTRALROLE_SRK 0x401 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPCENTRALROLE_SIGNCOUNTER 0x402 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPCENTRALROLE_BD_ADDR 0x403 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPCENTRALROLE_MAX_SCAN_RES 0x404 //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +/** @} End GAPCENTRALROLE_PROFILE_PARAMETERS */ + +/** + * Number of simultaneous links with periodic RSSI reads + */ +#ifndef GAPCENTRALROLE_NUM_RSSI_LINKS +#define GAPCENTRALROLE_NUM_RSSI_LINKS 4 +#endif + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Central Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. + gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. + gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. + gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure. +} gapCentralRoleEvent_t; + +/** + * RSSI Read Callback Function + */ +typedef void (*pfnGapCentralRoleRssiCB_t) +( + uint16 connHandle, //!< Connection handle. + int8 rssi //!< New RSSI value. +); + +/** + * Central Event Callback Function + */ +typedef void (*pfnGapCentralRoleEventCB_t) +( + gapCentralRoleEvent_t *pEvent //!< Pointer to event structure. +); + +/** + * Central Callback Structure + */ +typedef struct +{ + pfnGapCentralRoleRssiCB_t rssiCB; //!< RSSI callback. + pfnGapCentralRoleEventCB_t eventCB; //!< Event callback. +} gapCentralRoleCB_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * Central Profile Public APIs + */ + +/** + * @defgroup CENTRAL_PROFILE_API Central Profile API Functions + * + * @{ + */ + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPCentralRole_StartDevice( gapCentralRoleCB_t *pAppCallbacks ); + +/** + * @brief Set a parameter in the Central Profile. + * + * @param param - profile parameter ID: @ref GAPCENTRALROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type. + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPCentralRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a parameter in the Central Profile. + * + * @param param - profile parameter ID: @ref GAPCENTRALROLE_PROFILE_PARAMETERS + * @param pValue - pointer to buffer to contain the read data + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPCentralRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Terminate a link. + * + * @param connHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started.
+ * bleIncorrectMode: No link to terminate.
+ */ +extern bStatus_t GAPCentralRole_TerminateLink( uint16 connHandle ); + +/** + * @brief Establish a link to a peer device. + * + * @param highDutyCycle - TRUE to high duty cycle scan, FALSE if not + * @param whiteList - determines use of the white list: @ref GAP_WHITELIST_DEFINES + * @param addrTypePeer - address type of the peer device: @ref GAP_ADDR_TYPE_DEFINES + * @param peerAddr - peer device address + * + * @return SUCCESS: started establish link process.
+ * bleIncorrectMode: invalid profile role.
+ * bleNotReady: a scan is in progress.
+ * bleAlreadyInRequestedMode: can’t process now.
+ * bleNoResources: too many links.
+ */ +extern bStatus_t GAPCentralRole_EstablishLink( uint8 highDutyCycle, uint8 whiteList, + uint8 addrTypePeer, uint8 *peerAddr ); + +/** + * @brief Update the link connection parameters. + * + * @param connHandle - connection handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param connLatency - number of LL latency connection events + * @param connTimeout - connection timeout in 10ms units + * + * @return SUCCESS: Connection update started started.
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPCentralRole_UpdateLink( uint16 connHandle, uint16 connIntervalMin, + uint16 connIntervalMax, uint16 connLatency, + uint16 connTimeout ); +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPCentralRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPCentralRole_CancelDiscovery( void ); + +/** + * @brief Start periodic RSSI reads on a link. + * + * @param connHandle - connection handle of link + * @param period - RSSI read period in ms + * + * @return SUCCESS: Terminate started.
+ * bleIncorrectMode: No link.
+ * bleNoResources: No resources.
+ */ +extern bStatus_t GAPCentralRole_StartRssi( uint16 connHandle, uint16 period ); + +/** + * @brief Cancel periodic RSSI reads on a link. + * + * @param connHandle - connection handle of link + * + * @return SUCCESS: Operation successful.
+ * bleIncorrectMode: No link.
+ */ +extern bStatus_t GAPCentralRole_CancelRssi(uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Central Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +extern void GAPCentralRole_Init( uint8 taskId ); + +/** + * @internal + * + * @brief Central Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +extern uint16 GAPCentralRole_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* CENTRAL_H */ diff --git a/Firmware/Radio/Profiles/Roles/gap.c b/Firmware/Radio/Profiles/Roles/gap.c new file mode 100644 index 0000000..78970d6 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/gap.c @@ -0,0 +1,213 @@ +/************************************************************************************************* + Filename: gap.c + Revised: $Date: 2011-06-17 10:40:59 -0700 (Fri, 17 Jun 2011) $ + Revision: $Revision: 26366 $ + + Description: This file contains the GAP Configuration API. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#include "bcomdef.h" +#include "gap.h" +#include "sm.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * Called to setup the device. Call just once. + * + * Public function defined in gap.h. + */ +bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ) +{ + bStatus_t stat = INVALIDPARAMETER; // Return status + + // Valid profile roles and supported combinations + switch ( profileRole ) + { + case GAP_PROFILE_BROADCASTER: + #if ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_OBSERVER: + #if ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_PERIPHERAL: + #if ( HOST_CONFIG & PERIPHERAL_CFG ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_CENTRAL: + #if ( HOST_CONFIG & CENTRAL_CFG ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_BROADCASTER | GAP_PROFILE_OBSERVER): + #if ( ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) && \ + ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_PERIPHERAL | GAP_PROFILE_OBSERVER): + #if ( ( HOST_CONFIG & PERIPHERAL_CFG ) && \ + ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_CENTRAL | GAP_PROFILE_BROADCASTER): + #if ( ( HOST_CONFIG & CENTRAL_CFG ) && \ + ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + // Invalid profile roles + default: + stat = INVALIDPARAMETER; + break; + } + + if ( stat == SUCCESS ) + { + // Setup the device configuration parameters + stat = GAP_ParamsInit( taskID, profileRole ); + if ( stat == SUCCESS ) + { + #if ( HOST_CONFIG & ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + { + GAP_SecParamsInit( pIRK, pSRK, pSignCounter ); + } + #endif + + #if ( HOST_CONFIG & ( CENTRAL_CFG | OBSERVER_CFG ) ) + { + if ( (profileRole == GAP_PROFILE_BROADCASTER) || + (profileRole == GAP_PROFILE_PERIPHERAL) ) + { + maxScanResponses = 0; // Can't scan, so no need for responses. Force 0. + } + + // Initialize GAP Central Device Manager + VOID GAP_CentDevMgrInit( maxScanResponses ); + + #if ( HOST_CONFIG & CENTRAL_CFG ) + { + // Register GAP Central Connection processing functions + GAP_CentConnRegister(); + + // Initialize SM Initiator + VOID SM_InitiatorInit(); + } + #endif + } + #endif + + #if ( HOST_CONFIG & ( PERIPHERAL_CFG | BROADCASTER_CFG ) ) + { + // Initialize GAP Peripheral Device Manager + VOID GAP_PeriDevMgrInit(); + + #if ( HOST_CONFIG & PERIPHERAL_CFG ) + { + // Initialize SM Responder + VOID SM_ResponderInit(); + } + #endif + } + #endif + } + } + + return ( stat ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/gapbondmgr.c b/Firmware/Radio/Profiles/Roles/gapbondmgr.c new file mode 100644 index 0000000..e028537 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/gapbondmgr.c @@ -0,0 +1,1962 @@ +/************************************************************************************************** + Filename: gapbondmgr.c + Revised: $Date: 2011-02-24 15:46:53 -0800 (Thu, 24 Feb 2011) $ + Revision: $Revision: 10 $ + + Description: GAP peripheral profile manages bonded connections + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#if ( HOST_CONFIG & ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "gap.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "hci.h" +#include "gattservapp.h" +#include "gapgattserver.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events + +// Bonded State Flags +#define GAP_BONDED_STATE_AUTHENTICATED 0x0001 +#define GAP_BONDED_STATE_SERVICE_CHANGED 0x0002 + +/** + * GAP Bond Manager NV layout + * + * The NV definitions: + * BLE_NVID_GAP_BOND_START - starting NV ID + * GAP_BONDINGS_MAX - Maximum number of bonding allowed (10 is max for number of NV IDs allocated in bcomdef.h). + * + * A single bonding entry consists of 6 components (NV items): + * Bond Record - defined as gapBondRec_t and uses GAP_BOND_REC_ID_OFFSET for an NV ID + * local LTK Info - defined as gapBondLTK_t and uses GAP_BOND_LOCAL_LTK_OFFSET for an NV ID + * device LTK Info - defined as gapBondLTK_t and uses GAP_BOND_DEV_LTK_OFFSET for an NV ID + * device IRK - defined as "uint8 devIRK[KEYLEN]" and uses GAP_BOND_DEV_IRK_OFFSET for an NV ID + * device CSRK - defined as "uint8 devCSRK[KEYLEN]" and uses GAP_BOND_DEV_CSRK_OFFSET for an NV ID + * device Sign Counter - defined as a uint32 and uses GAP_BOND_DEV_SIGN_COUNTER_OFFSET for an NV ID + * + * When the device is initialized for the first time, all (GAP_BONDINGS_MAX) NV items are created and + * initialized to all 0xFF's. A bonding record of all 0xFF's indicates that the bonding record is empty + * and free to use. + * + * The calculation for each bonding records NV IDs: + * mainRecordNvID = ((bondIdx * GAP_BOND_REC_IDS) + BLE_NVID_GAP_BOND_START) + * localLTKNvID = (((bondIdx * GAP_BOND_REC_IDS) + GAP_BOND_LOCAL_LTK_OFFSET) + BLE_NVID_GAP_BOND_START) + * + */ +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter + +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// Macros to calculate the GATT index/offset in to NV space +#define gattCfgNvID(Idx) ((Idx) + BLE_NVID_GATT_CFG_START) + +// Key Size Limits +#define MIN_ENC_KEYSIZE 7 //!< Minimum number of bytes for the encryption key +#define MAX_ENC_KEYSIZE 16 //!< Maximum number of bytes for the encryption key + + +/********************************************************************* + * TYPEDEFS + */ + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8 LTK[KEYLEN]; // Long Term Key (LTK) + uint16 div; //lint -e754 // LTK eDiv + uint8 rand[B_RANDOM_NUM_SIZE]; // LTK random number + uint8 keySize; // LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8 publicAddr[B_ADDR_LEN]; // Master's address + uint8 reconnectAddr[B_ADDR_LEN]; // Privacy Reconnection Address + uint16 stateFlags; // State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING +} gapBondRec_t; + +// Structure of NV data for the connected device's characteristic configuration +typedef struct +{ + uint16 attrHandle; // attribute handle + uint8 value; // attribute value for this device +} gapBondCharCfg_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapBondMgr_TaskID; // Task ID for internal task/event processing + +// GAPBonding Parameters +static uint8 gapBond_PairingMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; +static uint16 gapBond_InitiateWait = 1000; // Default to 1 second +static uint8 gapBond_MITM = FALSE; +static uint8 gapBond_IOCap = GAPBOND_IO_CAP_DISPLAY_ONLY; +static uint8 gapBond_OOBDataFlag = FALSE; +static uint8 gapBond_OOBData[KEYLEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8 gapBond_Bonding = FALSE; +static uint8 gapBond_AutoFail = FALSE; +static uint8 gapBond_AutoFailReason = SMP_PAIRING_FAILED_NOT_SUPPORTED; +static uint8 gapBond_KeyDistList = +( + GAPBOND_KEYDIST_SENCKEY // sEncKey enabled, to send the encryption key + | GAPBOND_KEYDIST_SIDKEY // sIdKey enabled, to send the IRK, and BD_ADDR + | GAPBOND_KEYDIST_SSIGN // sSign enabled, to send the CSRK + | GAPBOND_KEYDIST_MENCKEY // mEncKey enabled, to get the master's encryption key + | GAPBOND_KEYDIST_MIDKEY // mIdKey enabled, to get the master's IRK and BD_ADDR + | GAPBOND_KEYDIST_MSIGN // mSign enabled, to get the master's CSRK +); +static uint32 gapBond_Passcode = 0; +static uint8 gapBond_KeySize = MAX_ENC_KEYSIZE; + +static const gapBondCBs_t *pGapBondCB = NULL; + +// Local RAM shadowed bond records +static gapBondRec_t bonds[GAP_BONDINGS_MAX] = {0}; + +static uint8 autoSyncWhiteList = FALSE; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ); +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ); +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ); +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ); +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ); +static uint8 gapBondMgrGetStateFlags( uint8 idx ); +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ); +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ); +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ); +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pAddr ); +static void gapBondMgrReadBonds( void ); +static uint8 gapBondMgrFindEmpty( void ); +static uint8 gapBondMgrBondTotal( void ); +static bStatus_t gapBondMgrEraseAllBondings( void ); +static bStatus_t gapBondMgrEraseBonding( uint8 idx ); +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ); +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ); +static void gapBondSetupPrivFlag( void ); +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ); +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ); +static void gapBondMgr_SyncWhiteList( void ); +static void gapBondMgr_SyncCharCfg( uint16 connHandle ); + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ); +#endif + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_PAIRING_MODE_INITIATE) ) + { + gapBond_PairingMode = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_INITIATE_WAIT: + if ( len == sizeof ( uint16 ) ) + { + gapBond_InitiateWait = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_MITM_PROTECTION: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_MITM = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_IO_CAPABILITIES: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_IO_CAP_KEYBOARD_DISPLAY) ) + { + gapBond_IOCap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_OOBDataFlag = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_DATA: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapBond_OOBData, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_BONDING_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_Bonding = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEY_DIST_LIST: + if ( len == sizeof ( uint8 ) ) + { + gapBond_KeyDistList = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_DEFAULT_PASSCODE: + if ( (len == sizeof ( uint32 )) + && (*((uint32*)pValue) <= GAP_PASSCODE_MAX) ) + { + gapBond_Passcode = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_ERASE_ALLBONDS: + if ( len == 0 ) + { + VOID gapBondMgrEraseAllBondings(); + gapBondMgrReadBonds(); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_AutoFail = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_REASON: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= SMP_PAIRING_FAILED_REPEATED_ATTEMPTS) ) + { + gapBond_AutoFailReason = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEYSIZE: + if ( (len == sizeof ( uint8 )) + && ((*((uint8*)pValue) >= MIN_ENC_KEYSIZE) && (*((uint8*)pValue) <= MAX_ENC_KEYSIZE)) ) + { + gapBond_KeySize = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_SYNC_WL: + if ( len == sizeof( uint8 ) ) + { + uint8 oldVal = autoSyncWhiteList; + + autoSyncWhiteList = *((uint8 *)pValue); + + // only call if parameter changes from FALSE to TRUE + if ( ( oldVal == FALSE ) && ( autoSyncWhiteList == TRUE ) ) + { + // make sure bond is updated from NV + gapBondMgrReadBonds(); + } + } + else + { + ret = bleInvalidRange; + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + *((uint8*)pValue) = gapBond_PairingMode; + break; + + case GAPBOND_INITIATE_WAIT: + *((uint16*)pValue) = gapBond_InitiateWait; + break; + + case GAPBOND_MITM_PROTECTION: + *((uint8*)pValue) = gapBond_MITM; + break; + + case GAPBOND_IO_CAPABILITIES: + *((uint8*)pValue) = gapBond_IOCap; + break; + + case GAPBOND_OOB_ENABLED: + *((uint8*)pValue) = gapBond_OOBDataFlag; + break; + + case GAPBOND_OOB_DATA: + VOID osal_memcpy( pValue, gapBond_OOBData, KEYLEN ) ; + break; + + case GAPBOND_BONDING_ENABLED: + *((uint8*)pValue) = gapBond_Bonding; + break; + + case GAPBOND_KEY_DIST_LIST: + *((uint8*)pValue) = gapBond_KeyDistList; + break; + + case GAPBOND_DEFAULT_PASSCODE: + *((uint32*)pValue) = gapBond_Passcode; + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + *((uint8*)pValue) = gapBond_AutoFail; + break; + + case GAPBOND_AUTO_FAIL_REASON: + *((uint8*)pValue) = gapBond_AutoFailReason; + break; + + case GAPBOND_KEYSIZE: + *((uint8*)pValue) = gapBond_KeySize; + break; + + case GAPBOND_AUTO_SYNC_WL: + *((uint8*)pValue) = autoSyncWhiteList; + break; + + case GAPBOND_BOND_COUNT: + *((uint8*)pValue) = gapBondMgrBondTotal(); + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Notify the Bond Manager that a connection has been made. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ) +{ + uint8 idx; // NV Index + uint8 publicAddr[B_ADDR_LEN] // Place to put the public address + = {0, 0, 0, 0, 0, 0}; + + idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + uint8 stateFlags = gapBondMgrGetStateFlags( idx ); + smSigningInfo_t signingInfo; + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; // Space to read a char cfg record from NV + + // On peripheral, load the key information for the bonding + // On central and initiaiting security, load key to initiate encyption + gapBondMgrBondReq( connHandle, idx, stateFlags, role, + ((gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) ? TRUE : FALSE) ); + + // Load the Signing Key + VOID osal_memset( &signingInfo, 0, sizeof ( smSigningInfo_t ) ); + if ( osal_snv_read( devCSRKNvID(idx), KEYLEN, signingInfo.srk ) == SUCCESS ) + { + if ( osal_isbufset( signingInfo.srk, 0xFF, KEYLEN ) == FALSE ) + { + // Load the signing information for this connection + VOID osal_snv_read( devSignCounterNvID(idx), sizeof ( uint32 ), &(signingInfo.signCounter) ); + VOID GAP_Signable( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &signingInfo ); + } + } + + // Load the characteristic configuration + if ( osal_snv_read( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ) == SUCCESS ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + gapBondCharCfg_t *pItem = &(charCfg[i]); + + // Apply the characteristic configuration for this connection + if ( pItem->attrHandle != GATT_INVALID_HANDLE ) + { + VOID GATTServApp_UpdateCharCfg( connHandle, pItem->attrHandle, + (uint16)(pItem->value) ); + } + } + } + + // Has there been a service change? + if ( stateFlags & GAP_BONDED_STATE_SERVICE_CHANGED ) + { + VOID GATTServApp_SendServiceChangedInd( connHandle, gapBondMgr_TaskID ); + } + } +#if ( HOST_CONFIG & CENTRAL_CFG ) + else if ( role == GAP_PROFILE_CENTRAL && + gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + // If Central and initiating and not bonded, then initiate pairing + gapBondMgrAuthenticate( connHandle, addrType, NULL ); + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( connHandle, GAPBOND_PAIRING_STATE_STARTED, SUCCESS ); + } + } +#endif + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) + // If Peripheral and initiating, send a slave security request to + // initiate either pairing or encryption + if ( role == GAP_PROFILE_PERIPHERAL && + gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + gapBondMgrSlaveSecurityReq( connHandle ); + } +#endif + + return ( SUCCESS ); +} + +/********************************************************************* + * @brief Resolve an address from bonding information. + * + * Public function defined in gapbondmgr.h. + */ +uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ) +{ + uint8 idx = GAP_BONDINGS_MAX; + + switch ( addrType ) + { + case ADDRTYPE_PUBLIC: + case ADDRTYPE_STATIC: + idx = gapBondMgrFindAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID osal_memcpy( pResolvedAddr, pDevAddr, B_ADDR_LEN ); + } + break; + + case ADDRTYPE_PRIVATE_NONRESOLVE: + // This could be a reconnection address + idx = gapBondMgrFindReconnectAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + case ADDRTYPE_PRIVATE_RESOLVE: + // Master's don't use Private Resolvable addresses but just in case + idx = gapBondMgrResolvePrivateAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + default: + break; + } + + return ( idx ); +} + +/********************************************************************* + * @brief Set/clear the service change indication in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Service Change indication + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ) ) + { + ret = SUCCESS; + } + } + + // If the service change indication is TRUE, tell the connected devices + if ( setParam ) + { + // Run connected database + linkDB_PerformFunc( gapBondMgrSendServiceChange ); + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx; // loop counter + idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ); + ret = SUCCESS; + } + + // If the service change indication is TRUE, tell the connected device + if ( setParam ) + { + gapBondMgrSendServiceChange( pLinkItem ); + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Update the Characteristic Configuration in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == INVALID_CONNHANDLE ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Characteristic Configuration + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrUpdateCharCfg( idx, attrHandle, value ) ) + { + ret = SUCCESS; + } + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrUpdateCharCfg( idx, attrHandle, value ); + ret = SUCCESS; + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Register callback functions with the bond manager. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_Register( gapBondCBs_t *pCB ) +{ + pGapBondCB = pCB; + + // Take over the processing of Authentication messages + VOID GAP_SetParamValue( TGAP_AUTH_TASK_ID, gapBondMgr_TaskID ); + + // Register with GATT Server App for event messages + GATTServApp_RegisterForMsg( gapBondMgr_TaskID ); +} + +/********************************************************************* + * @brief Respond to a passcode request. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ) +{ + bStatus_t ret = SUCCESS; + + if ( status == SUCCESS ) + { + // Truncate the passcode + passcode = passcode % (GAP_PASSCODE_MAX + 1); + + ret = GAP_PasscodeUpdate( passcode, connectionHandle ); + if ( ret != SUCCESS ) + { + VOID GAP_TerminateAuth( connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + else + { + VOID GAP_TerminateAuth( connectionHandle, status ); + } + + return ret; +} + +/********************************************************************* + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_PASSKEY_NEEDED_EVENT: + { + gapPasskeyNeededEvent_t *pPkt = (gapPasskeyNeededEvent_t *)pMsg; + + if ( pGapBondCB && pGapBondCB->passcodeCB ) + { + // Ask app for a passcode + pGapBondCB->passcodeCB( pPkt->deviceAddr, pPkt->connectionHandle, pPkt->uiInputs, pPkt->uiOutputs ); + } + else + { + // No app support, use the default passcode + if ( GAP_PasscodeUpdate( gapBond_Passcode, pPkt->connectionHandle ) != SUCCESS ) + { + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + } + break; + + case GAP_AUTHENTICATION_COMPLETE_EVENT: + { + gapAuthCompleteEvent_t *pPkt = (gapAuthCompleteEvent_t *)pMsg; + + // Should we save bonding information + if ( (pPkt->hdr.status == SUCCESS) && (pPkt->authState & SM_AUTH_STATE_BONDING) ) + { + gapBondRec_t bondRec; + + VOID osal_memset( &bondRec, 0, sizeof ( gapBondRec_t ) ) ; + + // Do we have a public address in the data? + if ( pPkt->pIdentityInfo ) + { + VOID osal_memcpy( bondRec.publicAddr, pPkt->pIdentityInfo->bd_addr, B_ADDR_LEN ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + VOID osal_memcpy( bondRec.publicAddr, pLinkItem->addr, B_ADDR_LEN ); + } + else + { + // We don't have an address, so ignore the message. + break; + } + } + + // Save off of the authentication state + bondRec.stateFlags |= (pPkt->authState & SM_AUTH_STATE_AUTHENTICATED) ? GAP_BONDED_STATE_AUTHENTICATED : 0; + + VOID gapBondMgrAddBond( &bondRec, + (gapBondLTK_t *)pPkt->pSecurityInfo, + (gapBondLTK_t *)pPkt->pDevSecInfo, + ((uint8 *)((pPkt->pIdentityInfo) ? pPkt->pIdentityInfo->irk : NULL )), + ((uint8 *)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->srk : NULL )), + ((uint32)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->signCounter : GAP_INIT_SIGN_COUNTER )) ); + + // Update NV to have same CCC values as GATT database + gapBondMgr_SyncCharCfg( pPkt->connectionHandle ); + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_COMPLETE, pPkt->hdr.status ); + } + } + break; + + case GAP_BOND_COMPLETE_EVENT: + // This message is received when the bonding is complete. If hdr.status is SUCCESS + // then call app state callback. If hdr.status is NOT SUCCESS, the connection will be + // dropped at the LL because of a MIC failure, so again nothing to do. + { + gapBondCompleteEvent_t *pPkt = (gapBondCompleteEvent_t *)pMsg; + + // Update NV to have same CCC values as GATT database + gapBondMgr_SyncCharCfg( pPkt->connectionHandle ); + + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_BONDED, pMsg->hdr.status ); + } + } + break; + + case GAP_SIGNATURE_UPDATED_EVENT: + { + uint8 idx; + gapSignUpdateEvent_t *pPkt = (gapSignUpdateEvent_t *)pMsg; + + idx = GAPBondMgr_ResolveAddr( pPkt->addrType, pPkt->devAddr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the sign counter + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &(pPkt->signCounter) ); + } + } + break; + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) + case GAP_PAIRING_REQ_EVENT: + { + gapPairingReqEvent_t *pPkt = (gapPairingReqEvent_t *)pMsg; + + if ( gapBond_AutoFail != FALSE ) + { + // Auto Fail TEST MODE (DON'T USE THIS) - Sends pre-setup reason + VOID GAP_TerminateAuth( pPkt->connectionHandle, gapBond_AutoFailReason ); + } + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // No Pairing - Send error + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + + // Requesting bonding? + if ( pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING ) + { + if ( pLinkItem ) + { + if ( (pLinkItem->addrType != ADDRTYPE_PUBLIC) && (pPkt->pairReq.keyDist.mIdKey == FALSE) ) + { + uint8 publicAddr[B_ADDR_LEN]; + + // Check if we already have the public address in NV + if ( GAPBondMgr_ResolveAddr(pLinkItem->addrType, pLinkItem->addr, publicAddr ) == FALSE ) + { + // Can't bond to a non-public address if we don't know the public address + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_AUTH_REQ ); + break; + } + } + } + else + { + // Can't find the connection, ignore the message + break; + } + } + + // Send pairing response + gapBondMgrAuthenticate( pPkt->connectionHandle, pLinkItem->addrType, &(pPkt->pairReq) ); + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_STARTED, SUCCESS ); + } + } + } + break; +#endif + +#if ( HOST_CONFIG & CENTRAL_CFG ) + case GAP_SLAVE_REQUESTED_SECURITY_EVENT: + { + uint16 connHandle = ((gapSlaveSecurityReqEvent_t *)pMsg)->connectionHandle; + uint8 idx; + uint8 publicAddr[B_ADDR_LEN] = {0, 0, 0, 0, 0, 0}; + linkDBItem_t *pLink = linkDB_Find( connHandle ); + + // If link found and not already initiating security + if (pLink != NULL && gapBond_PairingMode != GAPBOND_PAIRING_MODE_INITIATE) + { + // If already bonded initiate encryption + idx = GAPBondMgr_ResolveAddr( pLink->addrType, pLink->addr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + gapBondMgrBondReq( connHandle, idx, gapBondMgrGetStateFlags( idx ), + GAP_PROFILE_CENTRAL, TRUE ); + } + // Else if no pairing allowed + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // Send error + VOID GAP_TerminateAuth( connHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + // Else if waiting for request + else if (gapBond_PairingMode == GAPBOND_PAIRING_MODE_WAIT_FOR_REQ) + { + // Initiate pairing + gapBondMgrAuthenticate( connHandle, pLink->addrType, NULL ); + } + } + } + break; +#endif + + case GAP_LINK_TERMINATED_EVENT: + if ( GAP_NumActiveConnections() == 0 ) + { + // Make sure Bond RAM Shadow is up-to-date + gapBondMgrReadBonds(); + } + break; + + default: + break; + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @fn gapBondMgrChangeState + * + * @brief Change a state flag in the stateFlags field of the bond record. + * + * @param idx - Bond NV index + * @param state - state flage to set or clear + * @param set - TRUE to set the flag, FALSE to clear the flag + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + // Update the state of the bonded device. + uint8 stateFlags = bondRec.stateFlags; + if ( set ) + { + stateFlags |= state; + } + else + { + stateFlags &= ~(state); + } + + if ( stateFlags != bondRec.stateFlags ) + { + bondRec.stateFlags = stateFlags; + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + } + return ( TRUE ); + } + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrUpdateCharCfg + * + * @brief Update the Characteristic Configuration of the bond record. + * + * @param idx - Bond NV index + * @param attrHandle - attribute handle (0 means all handles) + * @param value - characteristic configuration value + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( ( osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS ) + && ( osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) ) + { + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; // Space to read a char cfg record from NV + + if ( osal_snv_read( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ) == SUCCESS ) + { + uint8 update = FALSE; + + gapBondMgrInvertCharCfgItem( charCfg ); + + if ( attrHandle == GATT_INVALID_HANDLE ) + { + if ( osal_isbufset( (uint8 *)charCfg, 0x00, sizeof ( charCfg ) ) == FALSE ) + { + // Clear all characteristic configuration for this device + VOID osal_memset( (void *)charCfg, 0x00, sizeof ( charCfg ) ); + update = TRUE; + } + } + else + { + gapBondCharCfg_t *pItem = gapBondMgrFindCharCfgItem( attrHandle, charCfg ); + if ( pItem == NULL ) + { + // Must be a new item; ignore if the value is no operation (default) + if ( ( value == GATT_CFG_NO_OPERATION ) || + ( ( pItem = gapBondMgrFindCharCfgItem( GATT_INVALID_HANDLE, charCfg ) ) == NULL ) ) + { + return ( FALSE ); // No empty entry found + } + + pItem->attrHandle = attrHandle; + } + + if ( pItem->value != value ) + { + // Update characteristic configuration + pItem->value = (uint8)value; + if ( value == GATT_CFG_NO_OPERATION ) + { + // Erease the item + pItem->attrHandle = GATT_INVALID_HANDLE; + } + + update = TRUE; + } + } + + // Update the characteristic configuration of the bonded device. + if ( update ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + VOID osal_snv_write( gattCfgNvID(idx), sizeof( charCfg ), charCfg ); + } + } + + return ( TRUE ); + } + + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Find the Characteristic Configuration for a given attribute. + * Uses the attribute handle to search the charactersitic + * configuration table of a bonded device. + * + * @param attrHandle - attribute handle. + * @param charCfgTbl - characteristic configuration table. + * + * @return pointer to the found item. NULL, otherwise. + */ +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + if ( charCfgTbl[i].attrHandle == attrHandle ) + { + return ( &(charCfgTbl[i]) ); + } + } + + return ( (gapBondCharCfg_t *)NULL ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Invert the Characteristic Configuration for a given client. + * + * @param charCfgTbl - characteristic configuration table. + * + * @return none. + */ +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + charCfgTbl[i].attrHandle = ~(charCfgTbl[i].attrHandle); + charCfgTbl[i].value = ~(charCfgTbl[i].value); + } +} + +/********************************************************************* + * @fn gapBondMgrAddBond + * + * @brief Save a bond from a GAP Auth Complete Event + * + * @param pBondRec - basic bond record + * @param pLocalLTK - LTK used by this device during pairing + * @param pDevLTK - LTK used by the connected device during pairing + * @param pIRK - IRK used by the connected device during pairing + * @param pSRK - SRK used by the connected device during pairing + * @param signCounter - Sign counter used by the connected device during pairing + * + * @return bond index + */ +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ) +{ + uint8 idx; + + if ( pBondRec == NULL ) + { + return ( GAP_BONDINGS_MAX ); + } + + // First see if we already have an existing bond for this device + idx = gapBondMgrFindAddr( pBondRec->publicAddr ); + if ( idx >= GAP_BONDINGS_MAX ) + { + idx = gapBondMgrFindEmpty(); + } + + if ( idx < GAP_BONDINGS_MAX ) + { + + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; + + // Save the main information + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), pBondRec ); + + // If available, save the LTK information + if ( pLocalLTK ) + { + VOID osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), pLocalLTK ); + } + + + // If availabe, save the connected device's LTK information + if ( pDevLTK ) + { + VOID osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), pDevLTK ); + } + + // If available, save the connected device's IRK + if ( pIRK ) + { + VOID osal_snv_write( devIRKNvID(idx), KEYLEN, pIRK ); + } + + // If available, save the connected device's Signature information + if ( pSRK ) + { + VOID osal_snv_write( devCSRKNvID(idx), KEYLEN, pSRK ); + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &signCounter ); + } + + // Write out FF's over the charactersitic configuration entry, to overwrite + // any previous bond data that may have been stored + VOID osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + VOID osal_snv_write( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ); + + // Update Bond RAM Shadow just with the newly added bond entry + VOID osal_memcpy( &(bonds[idx]), pBondRec, sizeof ( gapBondRec_t ) ); + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + } + + return ( idx ); +} + +/********************************************************************* + * @fn gapBondMgrGetStateFlags + * + * @brief Gets the state flags field of a bond record in NV + * + * @param idx + * + * @return stateFlags field + */ +static uint8 gapBondMgrGetStateFlags( uint8 idx ) +{ + gapBondRec_t bondRec; + + VOID osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + return ( bondRec.stateFlags ); + +} + +/********************************************************************* + * @fn gapBondMgrGetPublicAddr + * + * @brief Copy the public Address from a bonding record + * + * @param idx - Bond record index + * @param pAddr - a place to put the public address from NV + * + * @return SUCCESS if successful. + * Otherwise failure. + */ +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ) +{ + bStatus_t stat; // return value + gapBondRec_t bondRec; // Work space for main bond record + + // Check parameters + if ( (idx >= GAP_BONDINGS_MAX) || (pAddr == NULL) ) + { + return ( INVALIDPARAMETER ); + } + + stat = osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + if ( stat == SUCCESS ) + { + VOID osal_memcpy( pAddr, bondRec.publicAddr, B_ADDR_LEN ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrFindReconnectAddr + * + * @brief Look through the bonding entries to find a + * reconnection address. + * + * @param pReconnectAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // compare reconnection address + if ( osal_memcmp( bonds[idx].reconnectAddr, pReconnectAddr, B_ADDR_LEN ) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindAddr + * + * @brief Look through the bonding entries to find an address. + * + * @param pDevAddr - device address to look for + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Read in NV Main Bond Record and compare public address + if ( osal_memcmp( bonds[idx].publicAddr, pDevAddr, B_ADDR_LEN ) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrResolvePrivateAddr + * + * @brief Look through the NV bonding entries to resolve a private + * address. + * + * @param pDevAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no entry found + */ +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pDevAddr ) +{ + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + uint8 IRK[KEYLEN]; + + // Read in NV IRK Record and compare resovable address + VOID osal_snv_read( devIRKNvID(idx), KEYLEN, IRK ); + + if ( ( osal_isbufset( IRK, 0xFF, KEYLEN ) == FALSE ) && + ( GAP_ResolvePrivateAddr( IRK, pDevAddr ) == SUCCESS ) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrReadBonds + * + * @brief Read through NV and store them in RAM. + * + * @param none + * + * @return none + */ +static void gapBondMgrReadBonds( void ) +{ + VOID osal_memset( bonds, 0, (sizeof ( gapBondRec_t ) * GAP_BONDINGS_MAX) ); + + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Read in NV Main Bond Record and compare public address + VOID osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &(bonds[idx]) ); + } + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); +} + +/********************************************************************* + * @fn gapBondMgrFindEmpty + * + * @brief Look through the bonding NV entries to find an empty. + * + * @param none + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindEmpty( void ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Look for public address of all 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, B_ADDR_LEN ) ) + { + return ( idx ); // Found one + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrBondTotal + * + * @brief Look through the bonding NV entries calculate the number + * entries. + * + * @param none + * + * @return total number of bonds found + */ +static uint8 gapBondMgrBondTotal( void ) +{ + uint8 numBonds = 0; + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Look for public address that are not 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) + { + numBonds++; // Found one + } + } + + return ( numBonds ); +} + +/********************************************************************* + * @fn gapBondMgrEraseAllBondings + * + * @brief Write all 0xFF's to all of the bonding entries + * + * @param none + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseAllBondings( void ) +{ + bStatus_t stat = SUCCESS; // return value + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; (idx < GAP_BONDINGS_MAX) && (stat == SUCCESS); idx++ ) + { + // Erasing will write/create a bonding entry + stat = gapBondMgrEraseBonding( idx ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrEraseBonding + * + * @brief Write all 0xFF's to the complete bonding record + * + * @param idx - bonding index + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseBonding( uint8 idx ) +{ + bStatus_t ret; + gapBondRec_t bondRec; + gapBondLTK_t ltk; + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; + + VOID osal_memset( &bondRec, 0xFF, sizeof ( gapBondRec_t ) ); + VOID osal_memset( <k, 0xFF, sizeof ( gapBondLTK_t ) ); + + VOID osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + // Write out FF's over the entire bond entry. + ret = osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + ret |= osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devIRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devCSRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), ltk.LTK ); + + // Write out FF's over the charactersitic configuration entry. + ret |= osal_snv_write( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ); + + return ( ret ); +} + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in gapbondmgr.h. + */ +void GAPBondMgr_Init( uint8 task_id ) +{ + gapBondRec_t bondRec; // Work space for Bond Record + gapBondMgr_TaskID = task_id; // Save task ID + + // Initialize the NV needed for bonding + if ( osal_snv_read( mainRecordNvID(0), sizeof ( gapBondRec_t ), &bondRec ) != SUCCESS ) + { + // Can't read the first entry, assume that NV doesn't exist and erase all + // Bond NV entries (initialize) + VOID gapBondMgrEraseAllBondings(); + } + + // Since bond manager is using NV, NV usage must be declared to controller + VOID HCI_EXT_DeclareNvUsageCmd( HCI_EXT_NV_IN_USE ); + + // Setup Bond RAM Shadow + gapBondMgrReadBonds(); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in gapbondmgr.h. + */ +uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapBondMgr_TaskID )) != NULL ) + { + gapBondMgr_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapBondMgr_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GAP_MSG_EVENT: + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case GATT_MSG_EVENT: + gapBondMgr_ProcessGATTMsg( (gattMsgEvent_t *)pMsg ); + break; + + case GATT_SERV_MSG_EVENT: + gapBondMgr_ProcessGATTServMsg( (gattEventHdr_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn GAPBondMgr_CheckNVLen + * + * @brief This function will check the length of an NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ) +{ + uint8 stat = FAILURE; + + // Convert to index + switch ( (id - BLE_NVID_GAP_BOND_START) % GAP_BOND_REC_IDS ) + { + case GAP_BOND_REC_ID_OFFSET: + if ( len == sizeof ( gapBondRec_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_LOCAL_LTK_OFFSET: + case GAP_BOND_DEV_LTK_OFFSET: + if ( len == sizeof ( gapBondLTK_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_IRK_OFFSET: + case GAP_BOND_DEV_CSRK_OFFSET: + if ( len == KEYLEN ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_SIGN_COUNTER_OFFSET: + if ( len == sizeof ( uint32 ) ) + { + stat = SUCCESS; + } + break; + + default: + break; + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTMsg + * + * @brief Process an incoming GATT message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + // Process the GATT message + switch ( pMsg->method ) + { + case ATT_HANDLE_VALUE_CFM: + // Clear Service Changed flag for this client + VOID GAPBondMgr_ServiceChangeInd( pMsg->connHandle, 0x00 ); + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTServMsg + * + * @brief Process an incoming GATT Server App message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ) +{ + // Process the GATT Server App message + switch ( pMsg->method ) + { + case GATT_CLIENT_CHAR_CFG_UPDATED_EVENT: + { + gattClientCharCfgUpdatedEvent_t *pEvent = (gattClientCharCfgUpdatedEvent_t *)pMsg; + + VOID GAPBondMgr_UpdateCharCfg( pEvent->connHandle, pEvent->attrHandle, pEvent->value ); + } + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgrSendServiceChange + * + * @brief Tell the GATT that a service change is needed. + * + * @param pLinkItem - pointer to connection information + * + * @return none + */ +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ) +{ + VOID GATTServApp_SendServiceChangedInd( pLinkItem->connectionHandle, + gapBondMgr_TaskID ); +} + +/********************************************************************* + * @fn gapBondSetupPrivFlag + * + * @brief Setup the GAP Privacy Flag properties. + * + * @param none + * + * @return none + */ +static void gapBondSetupPrivFlag( void ) +{ + uint8 privFlagProp; + + if ( gapBondMgrBondTotal() > 1 ) + { + privFlagProp = GATT_PROP_READ; + } + else + { + privFlagProp = GATT_PROP_READ | GATT_PROP_WRITE; + } + + // Setup the + VOID GGS_SetParameter( GGS_PERI_PRIVACY_FLAG_PROPS, sizeof ( uint8 ), &privFlagProp ); +} + +/********************************************************************* + * @fn gapBondMgrAuthenticate + * + * @brief Initiate authentication + * + * @param connHandle - connection handle + * @param addrType - peer address type + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return none + */ +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ) +{ + gapAuthParams_t params; + + VOID osal_memset( ¶ms, 0, sizeof ( gapAuthParams_t ) ); + + // Setup the pairing parameters + params.connectionHandle = connHandle; + params.secReqs.ioCaps = gapBond_IOCap; + params.secReqs.oobAvailable = gapBond_OOBDataFlag; + params.secReqs.maxEncKeySize = gapBond_KeySize; + + params.secReqs.keyDist.sEncKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_SENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.sIdKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_SIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mEncKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_MENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mIdKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_MIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mSign = (gapBond_KeyDistList & GAPBOND_KEYDIST_MSIGN) ? TRUE : FALSE; + params.secReqs.keyDist.sSign = (gapBond_KeyDistList & GAPBOND_KEYDIST_SSIGN) ? TRUE : FALSE; + + // Is bond manager setup for OOB data? + if ( gapBond_OOBDataFlag ) + { + VOID osal_memcpy( params.secReqs.oob, gapBond_OOBData, KEYLEN ); + } + + if ( gapBond_Bonding && addrType != ADDRTYPE_PUBLIC ) + { + // Force a slave ID key + params.secReqs.keyDist.sIdKey = TRUE; + } + + params.secReqs.authReq |= (gapBond_Bonding) ? SM_AUTH_STATE_BONDING : 0; + params.secReqs.authReq |= (gapBond_MITM) ? SM_AUTH_STATE_AUTHENTICATED : 0; + + VOID GAP_Authenticate( ¶ms, pPairReq ); +} + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) +/********************************************************************* + * @fn gapBondMgrSlaveSecurityReq + * + * @brief Send a slave security request + * + * @param connHandle - connection handle + * + * @return none + */ +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ) +{ + uint8 authReq = 0; + + authReq |= (gapBond_Bonding) ? SM_AUTH_STATE_BONDING : 0; + authReq |= (gapBond_MITM) ? SM_AUTH_STATE_AUTHENTICATED : 0; + + VOID GAP_SendSlaveSecurityRequest( connHandle, authReq ); +} +#endif + +/********************************************************************* + * @fn gapBondMgrBondReq + * + * @brief Initiate a GAP bond request + * + * @param connHandle - connection handle + * @param idx - NV index of bond entry + * @param stateFlags - bond state flags + * @param role - master or slave role + * @param startEncryption - whether or not to start encryption + * + * @return none + */ +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ) +{ + smSecurityInfo_t ltk; + osalSnvId_t nvId; + + if ( role == GAP_PROFILE_CENTRAL ) + { + nvId = devLTKNvID( idx ); + } + else + { + nvId = localLTKNvID( idx ); + } + + // Initialize the NV structures + VOID osal_memset( <k, 0, sizeof ( smSecurityInfo_t ) ); + + if ( osal_snv_read( nvId, sizeof ( smSecurityInfo_t ), <k ) == SUCCESS ) + { + if ( (ltk.keySize >= MIN_ENC_KEYSIZE) && (ltk.keySize <= MAX_ENC_KEYSIZE) ) + { + VOID GAP_Bond( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + <k, startEncryption ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncWhiteList + * + * @brief syncronize the White List with the bonds + * + * @param none + * + * @return none + */ +static void gapBondMgr_SyncWhiteList( void ) +{ + //erase the White List + VOID HCI_LE_ClearWhiteListCmd(); + + // Write bond addresses into the White List + for( uint8 i = 0; i < GAP_BONDINGS_MAX; i++) + { + // Make sure empty addresses are not added to the White List + if ( osal_isbufset( bonds[i].publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) + { + VOID HCI_LE_AddWhiteListCmd( HCI_PUBLIC_DEVICE_ADDRESS, bonds[i].publicAddr ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncCharCfg + * + * @brief Update the Bond Manager to have the same configurations as + * the GATT database. + * + * @param connHandle - the current connection handle to find client configurations for + * + * @return none + */ +static void gapBondMgr_SyncCharCfg( uint16 connHandle ) +{ + gattAttribute_t *pAttr; + uint16 service; + + // Only attributes with attribute handles between and including the Starting + // Handle parameter and the Ending Handle parameter that match the requested + // attribute type and the attribute value will be returned. + + // All attribute types are effectively compared as 128-bit UUIDs, + // even if a 16-bit UUID is provided in this request or defined + // for an attribute. + pAttr = GATT_FindHandleUUID( GATT_MIN_HANDLE, GATT_MAX_HANDLE, + clientCharCfgUUID, ATT_BT_UUID_SIZE, &service ); + while ( ( pAttr != NULL ) ) + { + uint8 len; + uint8 attrVal[ATT_BT_UUID_SIZE]; + + // It is not possible to use this request on an attribute that has a value + // that is longer than 2. + if ( GATTServApp_ReadAttr( connHandle, pAttr, service, attrVal, + &len, 0, ATT_BT_UUID_SIZE ) == SUCCESS ) + { + uint16 value = BUILD_UINT16(attrVal[0], attrVal[1]); + + if ( value != GATT_CFG_NO_OPERATION ) + { + // NV must be updated to meet configuration of the database + VOID GAPBondMgr_UpdateCharCfg( connHandle, pAttr->handle, value ); + } + } + + // Try to find the next attribute + pAttr = GATT_FindNextAttr( pAttr, GATT_MAX_HANDLE, service, NULL ); + } // while +} + +#endif // ( CENTRAL_CFG | PERIPHERAL_CFG ) + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/gapbondmgr.h b/Firmware/Radio/Profiles/Roles/gapbondmgr.h new file mode 100644 index 0000000..6a8cd51 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/gapbondmgr.h @@ -0,0 +1,397 @@ +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GAPBONDMGR_H +#define GAPBONDMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "gap.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +#if !defined ( GAP_BONDINGS_MAX ) + #define GAP_BONDINGS_MAX 10 //!< Maximum number of bonds that can be saved in NV. +#endif + +#if !defined ( GAP_CHAR_CFG_MAX ) + #define GAP_CHAR_CFG_MAX 4 //!< Maximum number of characteristic configuration that can be saved in NV. +#endif +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#define GAPBOND_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_INITIATE_WAIT 0x401 //!< Pairing Mode Initiate wait timeout. This is the time it will wait for a Pairing Request before sending the Slave Initiate Request. Read/Write. Size is uint16. Default is 1000(in milliseconds). +#define GAPBOND_MITM_PROTECTION 0x402 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_IO_CAPABILITIES 0x403 //!< I/O capabilities. Read/Write. Size is uint8. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_OOB_ENABLED 0x404 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_OOB_DATA 0x405 //!< OOB Data. Read/Write. size uint8[16]. Default is all 0's. +#define GAPBOND_BONDING_ENABLED 0x406 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_KEY_DIST_LIST 0x407 //!< The key distribution list for bonding. size is uint8. @ref GAPBOND_KEY_DIST_DEFINES. Default is sEncKey, sIdKey, mIdKey, mSign enabled. +#define GAPBOND_DEFAULT_PASSCODE 0x408 //!< The default passcode for MITM protection. size is uint32. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x409 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x40A //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x40B //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x40C //!< Key Size used in pairing. Read/Write. size is uint8. Default is 16. +#define GAPBOND_AUTO_SYNC_WL 0x40D //!< Clears the White List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8. Default is FALSE. +#define GAPBOND_BOND_COUNT 0x40E //!< Gets the total number of bonds stored in NV. Read Only. Size is uint8. Default is 0 (no bonds). +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_MENCKEY 0x08 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x10 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x20 //!< Master CSRK +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authenication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPBONDMGR_H */ diff --git a/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.c b/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.c new file mode 100644 index 0000000..fd05c6b --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.c @@ -0,0 +1,1409 @@ +/************************************************************************************************** + Filename: gapperiphbondmgr.c + Revised: $Date: 2011-03-02 12:41:23 -0800 (Wed, 02 Mar 2011) $ + Revision: $Revision: 25256 $ + + Description: GAP peripheral profile manages bonded connections + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "gap.h" +#include "linkdb.h" +#include "gatt.h" + +#include "gattservapp.h" +#include "gapgattserver.h" +#include "gapperiphbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events + +// Bonded State Flags +#define GAP_BONDED_STATE_AUTHENTICATED 0x0001 +#define GAP_BONDED_STATE_SERVICE_CHANGED 0x0002 + +/** + * GAP Bond Manager NV layout + * + * The NV definitions: + * BLE_NVID_GAP_BOND_START - starting NV ID + * GAP_BONDINGS_MAX - Maximum number of bonding allowed (10 is max for number of NV IDs allocated in bcomdef.h). + * + * A single bonding entry consists of 6 components (NV items): + * Bond Record - defined as gapBondRec_t and uses GAP_BOND_REC_ID_OFFSET for an NV ID + * local LTK Info - defined as gapBondLTK_t and uses GAP_BOND_LOCAL_LTK_OFFSET for an NV ID + * device LTK Info - defined as gapBondLTK_t and uses GAP_BOND_DEV_LTK_OFFSET for an NV ID + * device IRK - defined as "uint8 devIRK[KEYLEN]" and uses GAP_BOND_DEV_IRK_OFFSET for an NV ID + * device CSRK - defined as "uint8 devCSRK[KEYLEN]" and uses GAP_BOND_DEV_CSRK_OFFSET for an NV ID + * device Sign Counter - defined as a uint32 and uses GAP_BOND_DEV_SIGN_COUNTER_OFFSET for an NV ID + * + * When the device is initialized for the first time, all (GAP_BONDINGS_MAX) NV items are created and + * initialized to all 0xFF's. A bonding record of all 0xFF's indicates that the bonding record is empty + * and free to use. + * + * The calculation for each bonding records NV IDs: + * mainRecordNvID = ((bondIdx * GAP_BOND_REC_IDS) + BLE_NVID_GAP_BOND_START) + * localLTKNvID = (((bondIdx * GAP_BOND_REC_IDS) + GAP_BOND_LOCAL_LTK_OFFSET) + BLE_NVID_GAP_BOND_START) + * + */ +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter + +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// Key Size Limits +#define MIN_ENC_KEYSIZE 7 //!< Minimum number of bytes for the encryption key +#define MAX_ENC_KEYSIZE 16 //!< Maximum number of bytes for the encryption key + + +/********************************************************************* + * TYPEDEFS + */ + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8 LTK[KEYLEN]; // Long Term Key (LTK) + uint16 div; // LTK eDiv + uint8 rand[B_RANDOM_NUM_SIZE]; // LTK random number + uint8 keySize; // LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8 publicAddr[B_ADDR_LEN]; // Master's address + uint8 reconnectAddr[B_ADDR_LEN]; // Privacy Reconnection Address + uint16 stateFlags; // State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING +} gapBondRec_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapBondMgr_TaskID; // Task ID for internal task/event processing + +// GAPBonding Parameters +static uint8 gapBond_PairingMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; +static uint16 gapBond_InitiateWait = 1000; // Default to 1 second +static uint8 gapBond_MITM = FALSE; +static uint8 gapBond_IOCap = GAPBOND_IO_CAP_DISPLAY_ONLY; +static uint8 gapBond_OOBDataFlag = FALSE; +static uint8 gapBond_OOBData[KEYLEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8 gapBond_Bonding = FALSE; +static uint8 gapBond_AutoFail = FALSE; +static uint8 gapBond_AutoFailReason = SMP_PAIRING_FAILED_NOT_SUPPORTED; +static uint8 gapBond_KeyDistList = +( + GAPBOND_KEYDIST_SENCKEY // sEncKey enabled, to send the encryption key + | GAPBOND_KEYDIST_SIDKEY // sIdKey enabled, to send the IRK, and BD_ADDR + // sSign disabled, + // mEncKey disabled, + | GAPBOND_KEYDIST_MIDKEY // mIdKey enabled, to get the master's IRK and BD_ADDR + | GAPBOND_KEYDIST_MSIGN // mSign enabled, to get the master's CSRK +); +static uint32 gapBond_Passcode = 0; +static uint8 gapBond_KeySize = MAX_ENC_KEYSIZE; + +static gapBondCBs_t *pGapBondCB = NULL; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ); +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ); +static uint8 gapBondMgrGetStateFlags( uint8 idx ); +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ); +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ); +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ); +static uint8 gapBondMgrFindEmpty( void ); +static uint8 gapBondMgrBondTotal( void ); +static bStatus_t gapBondMgrEraseAllBondings( void ); +static bStatus_t gapBondMgrEraseBonding( uint8 idx ); +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ); +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static void gapBondSetupPrivFlag( void ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Bond Manager parameter. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_PAIRING_MODE_INITIATE) ) + { + gapBond_PairingMode = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_INITIATE_WAIT: + if ( len == sizeof ( uint16 ) ) + { + gapBond_InitiateWait = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_MITM_PROTECTION: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_MITM = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_IO_CAPABILITIES: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_IO_CAP_KEYBOARD_DISPLAY) ) + { + gapBond_IOCap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_OOBDataFlag = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_DATA: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapBond_OOBData, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_BONDING_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_Bonding = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEY_DIST_LIST: + if ( len == sizeof ( uint8 ) ) + { + gapBond_KeyDistList = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_DEFAULT_PASSCODE: + if ( (len == sizeof ( uint32 )) + && (*((uint32*)pValue) <= GAP_PASSCODE_MAX) ) + { + gapBond_Passcode = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_ERASE_ALLBONDS: + if ( len == 0 ) + { + VOID gapBondMgrEraseAllBondings(); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_AutoFail = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_REASON: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= SMP_PAIRING_FAILED_REPEATED_ATTEMPTS) ) + { + gapBond_AutoFailReason = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEYSIZE: + if ( (len == sizeof ( uint8 )) + && ((*((uint8*)pValue) >= MIN_ENC_KEYSIZE) && (*((uint8*)pValue) <= MAX_ENC_KEYSIZE)) ) + { + gapBond_KeySize = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Bond Manager parameter. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + *((uint8*)pValue) = gapBond_PairingMode; + break; + + case GAPBOND_INITIATE_WAIT: + *((uint16*)pValue) = gapBond_InitiateWait; + break; + + case GAPBOND_MITM_PROTECTION: + *((uint8*)pValue) = gapBond_MITM; + break; + + case GAPBOND_IO_CAPABILITIES: + *((uint8*)pValue) = gapBond_IOCap; + break; + + case GAPBOND_OOB_ENABLED: + *((uint8*)pValue) = gapBond_OOBDataFlag; + break; + + case GAPBOND_OOB_DATA: + VOID osal_memcpy( pValue, gapBond_OOBData, KEYLEN ) ; + break; + + case GAPBOND_BONDING_ENABLED: + *((uint8*)pValue) = gapBond_Bonding; + break; + + case GAPBOND_KEY_DIST_LIST: + *((uint8*)pValue) = gapBond_KeyDistList; + break; + + case GAPBOND_DEFAULT_PASSCODE: + *((uint32*)pValue) = gapBond_Passcode; + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + *((uint8*)pValue) = gapBond_AutoFail; + break; + + case GAPBOND_AUTO_FAIL_REASON: + *((uint8*)pValue) = gapBond_AutoFailReason; + break; + + case GAPBOND_KEYSIZE: + *((uint8*)pValue) = gapBond_KeySize; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Notify the Bond Manager that a connection has been made. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle ) +{ + uint8 idx; // NV Index + uint8 publicAddr[B_ADDR_LEN] // Place to put the public address + = {0, 0, 0, 0, 0, 0}; + + idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bonding found + uint8 stateFlags; // Bond state flags + smSecurityInfo_t localLTK; // LTK information + smSigningInfo_t signingInfo; // Signature information + + // Initialize the NV structures + osal_memset( &localLTK, 0, sizeof ( smSecurityInfo_t ) ); + osal_memset( &signingInfo, 0, sizeof ( smSigningInfo_t ) ); + + // Check if key is valid, then load the key + stateFlags = gapBondMgrGetStateFlags( idx ); + if ( osal_snv_read( localLTKNvID(idx), sizeof ( smSecurityInfo_t ), &localLTK ) == SUCCESS ) + { + if ( (localLTK.keySize >= MIN_ENC_KEYSIZE) && (localLTK.keySize <= MAX_ENC_KEYSIZE) ) + { + // Load the key information for the bonding + VOID GAP_Bond( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &localLTK ); + } + } + + // Load the Signing Key + if ( osal_snv_read( devCSRKNvID(idx), KEYLEN, signingInfo.srk ) == SUCCESS ) + { + if ( osal_isbufset( signingInfo.srk, 0xFF, KEYLEN ) == FALSE ) + { + // Load the signing information for this connection + VOID osal_snv_read( devSignCounterNvID(idx), sizeof ( uint32 ), &(signingInfo.signCounter) ); + VOID GAP_Signable( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &signingInfo ); + } + } + + // Has there been a service change? + if ( stateFlags & GAP_BONDED_STATE_SERVICE_CHANGED ) + { + VOID GATT_ServiceChangedInd( connHandle, gapBondMgr_TaskID ); + } + } + else + { + // Not bound + if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + // Could add code to setup a timeout to initiate security + // with a Slave Security Request. + } + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @brief Resolve an address from bonding information. + * + * Public function defined in gapperiphbondmgr.h. + */ +uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ) +{ + uint8 idx = GAP_BONDINGS_MAX; + + switch ( addrType ) + { + case ADDRTYPE_PUBLIC: + case ADDRTYPE_STATIC: + idx = gapBondMgrFindAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID osal_memcpy( pResolvedAddr, pDevAddr, B_ADDR_LEN ); + } + break; + + case ADDRTYPE_PRIVATE_NONRESOLVE: + // This could be a reconnection address + idx = gapBondMgrFindReconnectAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + case ADDRTYPE_PRIVATE_RESOLVE: + // Master's don't use Private Resolvable addresses + break; + + default: + break; + } + + return ( idx ); +} + +/********************************************************************* + * @brief Set/clear the service change indication in a bond record. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Service Change indication + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ) ) + { + ret = SUCCESS; + } + } + + // If the service change indication is TRUE, tell the connected devices + if ( setParam ) + { + // Run connected database + linkDB_PerformFunc( gapBondMgrSendServiceChange ); + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx; // loop counter + idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ); + ret = SUCCESS; + } + + // If the service change indication is TRUE, tell the connected device + if ( setParam ) + { + gapBondMgrSendServiceChange( pLinkItem ); + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +void GAPBondMgr_Register( gapBondCBs_t *pCB ) +{ + pGapBondCB = pCB; +} + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ) +{ + bStatus_t ret = SUCCESS; + + if ( status == SUCCESS ) + { + // Truncate the passcode + passcode = passcode % (GAP_PASSCODE_MAX + 1); + + ret = GAP_PasscodeUpdate( passcode, connectionHandle ); + if ( ret != SUCCESS ) + { + VOID GAP_TerminateAuth( connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + else + { + VOID GAP_TerminateAuth( connectionHandle, status ); + } + + return ret; +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @fn gapBondMgrChangeState + * + * @brief Change a state flag in the stateFlags field of the bond record. + * + * @param idx - Bond NV index + * @param state - state flage to set or clear + * @param set - TRUE to set the flag, FALSE to clear the flag + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + // Update the state of the bonded device. + uint8 stateFlags = bondRec.stateFlags; + if ( set ) + { + stateFlags |= state; + } + else + { + stateFlags &= ~(state); + } + + if ( stateFlags != bondRec.stateFlags ) + { + bondRec.stateFlags = stateFlags; + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + } + return ( TRUE ); + } + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrAddBond + * + * @brief Save a bond from a GAP Auth Complete Event + * + * @param pBondRec - basic bond record + * @param pLocalLTK - LTK used by this device during pairing + * @param pDevLTK - LTK used by the connected device during pairing + * @param pIRK - IRK used by the connected device during pairing + * @param pSRK - SRK used by the connected device during pairing + * @param signCounter - Sign counter used by the connected device during pairing + * + * @return bond index + */ +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ) +{ + uint8 idx; + + if ( pBondRec == NULL ) + { + return ( GAP_BONDINGS_MAX ); + } + + // First see if we already have an existing bond for this device + idx = gapBondMgrFindAddr( pBondRec->publicAddr ); + if ( idx >= GAP_BONDINGS_MAX ) + { + idx = gapBondMgrFindEmpty(); + } + + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the main information + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), pBondRec ); + + // If available, save the LTK information + if ( pLocalLTK ) + { + VOID osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), pLocalLTK ); + } + + + // If availabe, save the connected device's LTK information + if ( pDevLTK ) + { + VOID osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), pDevLTK ); + } + + // If available, save the connected device's IRK + if ( pIRK ) + { + VOID osal_snv_write( devIRKNvID(idx), KEYLEN, pIRK ); + } + + // If available, save the connected device's Signature information + if ( pSRK ) + { + VOID osal_snv_write( devCSRKNvID(idx), KEYLEN, pSRK ); + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &signCounter ); + } + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( idx ); +} + +/********************************************************************* + * @fn gapBondMgrGetStateFlags + * + * @brief Gets the state flags field of a bond record in NV + * + * @param idx + * + * @return stateFlags field + */ +static uint8 gapBondMgrGetStateFlags( uint8 idx ) +{ + gapBondRec_t bondRec; + + VOID osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + return ( bondRec.stateFlags ); + +} + +/********************************************************************* + * @fn gapBondMgrGetPublicAddr + * + * @brief Copy the public Address from a bonding record + * + * @param idx - Bond record index + * @param pAddr - a place to put the public address from NV + * + * @return SUCCESS if successful. + * Otherwise failure. + */ +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ) +{ + bStatus_t stat; // return value + gapBondRec_t bondRec; // Work space for main bond record + + // Check parameters + if ( (idx >= GAP_BONDINGS_MAX) || (pAddr == NULL) ) + { + return ( INVALIDPARAMETER ); + } + + stat = osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + if ( stat == SUCCESS ) + { + VOID osal_memcpy( pAddr, bondRec.publicAddr, KEYLEN ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrFindReconnectAddr + * + * @brief Look through the bonding NV entries to find a + * reconnection address. + * + * @param pReconnectAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Read in NV Main Bond Record and compare reconnection address + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_memcmp( bondRec.reconnectAddr, pReconnectAddr, KEYLEN )) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindAddr + * + * @brief Look through the bonding NV entries to find an address. + * + * @param pDevAddr - device address to look for + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Read in NV Main Bond Record and compare public address + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_memcmp( bondRec.publicAddr, pDevAddr, B_ADDR_LEN )) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindEmpty + * + * @brief Look through the bonding NV entries to find an empty. + * + * @param none + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindEmpty( void ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Look for public address of all 0xFF's + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN )) ) + { + return ( idx ); // Found one + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrBondTotal + * + * @brief Look through the bonding NV entries calculate the number + * entries. + * + * @param none + * + * @return total number of bonds found + */ +static uint8 gapBondMgrBondTotal( void ) +{ + uint8 bonds = 0; + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Look for public address that are not 0xFF's + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + bonds++; // Found one + } + } + + return ( bonds ); +} + +/********************************************************************* + * @fn gapBondMgrEraseAllBondings + * + * @brief Write all 0xFF's to all of the bonding entries + * + * @param none + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseAllBondings( void ) +{ + bStatus_t stat = SUCCESS; // return value + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; (idx < GAP_BONDINGS_MAX) && (stat == SUCCESS); idx++ ) + { + // Erasing will write/create a bonding entry + stat = gapBondMgrEraseBonding( idx ); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrEraseBonding + * + * @brief Write all 0xFF's to the complete bonding record + * + * @param idx - bonding index + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseBonding( uint8 idx ) +{ + bStatus_t ret; + gapBondRec_t bondRec; + gapBondLTK_t ltk; + + VOID osal_memset( &bondRec, 0xFF, sizeof ( gapBondRec_t ) ); + VOID osal_memset( <k, 0xFF, sizeof ( gapBondLTK_t ) ); + + // Write out FF's over the entire bond entry. + ret = osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + ret |= osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devIRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devCSRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), ltk.LTK ); + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( ret ); +} + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in gapperiphbondmgr.h. + */ +void GAPBondMgr_Init( uint8 task_id ) +{ + gapBondRec_t bondRec; // Work space for Bond Record + gapBondMgr_TaskID = task_id; // Save task ID + + // Initialize the NV needed for bonding + if ( osal_snv_read( mainRecordNvID(0), sizeof ( gapBondRec_t ), &bondRec ) != SUCCESS ) + { + // Can't read the first entry, assume that NV doesn't exist and erase all + // Bond NV entries (initialize) + VOID gapBondMgrEraseAllBondings(); + } + + // Take over the processing of Authentication messages + VOID GAP_SetParamValue( TGAP_AUTH_TASK_ID, gapBondMgr_TaskID ); + + // Check the total number of bonds + gapBondSetupPrivFlag(); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in gapperiphbondmgr.h. + */ +uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapBondMgr_TaskID )) != NULL ) + { + gapBondMgr_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapBondMgr_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GAP_MSG_EVENT: + gapBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case GATT_MSG_EVENT: + gapBondMgr_ProcessGATTMsg( (gattMsgEvent_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +void gapBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_PASSKEY_NEEDED_EVENT: + { + gapPasskeyNeededEvent_t *pPkt = (gapPasskeyNeededEvent_t *)pMsg; + + if ( pGapBondCB && pGapBondCB->passcodeCB ) + { + // Ask app for a passcode + pGapBondCB->passcodeCB( pPkt->deviceAddr, pPkt->connectionHandle, pPkt->uiInputs, pPkt->uiOutputs ); + } + else + { + // No app support, use the default passcode + if ( GAP_PasscodeUpdate( gapBond_Passcode, pPkt->connectionHandle ) != SUCCESS ) + { + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + } + break; + + case GAP_AUTHENTICATION_COMPLETE_EVENT: + { + gapAuthCompleteEvent_t *pPkt = (gapAuthCompleteEvent_t *)pMsg; + + // Should we save bonding information + if ( (pPkt->hdr.status == SUCCESS) && (pPkt->authState & SM_AUTH_STATE_BONDING) ) + { + gapBondRec_t bondRec; + + VOID osal_memset( &bondRec, 0, sizeof ( gapBondRec_t ) ) ; + + // Do we have a public address in the data? + if ( pPkt->pIdentityInfo ) + { + VOID osal_memcpy( bondRec.publicAddr, pPkt->pIdentityInfo->bd_addr, B_ADDR_LEN ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + VOID osal_memcpy( bondRec.publicAddr, pLinkItem->addr, B_ADDR_LEN ); + } + else + { + // We don't have an address, so ignore the message. + break; + } + } + + // Save off of the authentication state + bondRec.stateFlags |= (pPkt->authState & SM_AUTH_STATE_AUTHENTICATED) ? GAP_BONDED_STATE_AUTHENTICATED : 0; + + VOID gapBondMgrAddBond( &bondRec, + (gapBondLTK_t *)pPkt->pSecurityInfo, + (gapBondLTK_t *)pPkt->pDevSecInfo, + ((uint8 *)((pPkt->pIdentityInfo) ? pPkt->pIdentityInfo->irk : NULL )), + ((uint8 *)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->srk : NULL )), + ((uint32)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->signCounter : GAP_INIT_SIGN_COUNTER )) ); + + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_COMPLETE, pPkt->hdr.status ); + } + } + break; + + case GAP_BOND_COMPLETE_EVENT: + // This message is received when the bonding is complete. If hdr.status is SUCCESS + // then call app state callback. If hdr.status is NOT SUCCESS, the connection will be + // dropped at the LL because of a MIC failure, so again nothing to do. + if ( pGapBondCB && pGapBondCB->pairStateCB && pMsg->hdr.status == SUCCESS ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_BONDED, pMsg->hdr.status ); + } + break; + + case GAP_SIGNATURE_UPDATED_EVENT: + { + uint8 idx; + gapSignUpdateEvent_t *pPkt = (gapSignUpdateEvent_t *)pMsg; + + idx = GAPBondMgr_ResolveAddr( pPkt->addrType, pPkt->devAddr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the sign counter + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &(pPkt->signCounter) ); + } + } + break; + + case GAP_PAIRING_REQ_EVENT: + { + gapPairingReqEvent_t *pPkt = (gapPairingReqEvent_t *)pMsg; + + if ( gapBond_AutoFail != FALSE ) + { + // Auto Fail TEST MODE (DON'T USE THIS) - Sends pre-setup reason + VOID GAP_TerminateAuth( pPkt->connectionHandle, gapBond_AutoFailReason ); + } + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // No Pairing - Send error + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + else + { + gapAuthParams_t params; + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + + // Requesting bonding? + if ( pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING ) + { + if ( pLinkItem ) + { + if ( (pLinkItem->addrType != ADDRTYPE_PUBLIC) && (pPkt->pairReq.keyDist.mIdKey == FALSE) ) + { + uint8 publicAddr[B_ADDR_LEN]; + + // Check if we already have the public address in NV + if ( GAPBondMgr_ResolveAddr(pLinkItem->addrType, pLinkItem->addr, publicAddr ) == FALSE ) + { + // Can't bond to a non-public address if we don't know the public address + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_AUTH_REQ ); + break; + } + } + } + else + { + // Can't find the connection, ignore the message + break; + } + } + + VOID osal_memset( ¶ms, 0, sizeof ( gapAuthParams_t ) ); + + // Setup the pairing parameters + params.connectionHandle = pPkt->connectionHandle; + params.secReqs.ioCaps = gapBond_IOCap; + params.secReqs.oobAvailable = gapBond_OOBDataFlag; + params.secReqs.maxEncKeySize = gapBond_KeySize; + + // TBD - Should we distribute keys if bonding is turned off??? + params.secReqs.keyDist.sEncKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_SENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.sIdKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_SIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mEncKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_MENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mIdKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_MIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mSign = (gapBond_KeyDistList | GAPBOND_KEYDIST_MSIGN) ? TRUE : FALSE; + params.secReqs.keyDist.sSign = (gapBond_KeyDistList | GAPBOND_KEYDIST_SSIGN) ? TRUE : FALSE; + + // Is bond manager setup for OOB data? + if ( gapBond_OOBDataFlag ) + { + VOID osal_memcpy( params.secReqs.oob, gapBond_OOBData, KEYLEN ); + } + + if ( (pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING) && (gapBond_Bonding) ) + { + params.secReqs.authReq |= SM_AUTH_STATE_BONDING; + if ( pLinkItem->addrType != ADDRTYPE_PUBLIC ) + { + // Force a master ID key + params.secReqs.keyDist.mIdKey = TRUE; + } + } + + // Is Bond Manager setup for passkey protection? + if ( gapBond_MITM ) + { + params.secReqs.authReq |= SM_AUTH_STATE_AUTHENTICATED; + } + + VOID GAP_Authenticate( ¶ms, &(pPkt->pairReq) ); + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_STARTED, pPkt->hdr.status ); + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn GAPBondMgr_CheckNVLen + * + * @brief This function will check the length of an NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ) +{ + uint8 stat = FAILURE; + + // Convert to index + switch ( (id - BLE_NVID_GAP_BOND_START) % GAP_BOND_REC_IDS ) + { + case GAP_BOND_REC_ID_OFFSET: + if ( len == sizeof ( gapBondRec_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_LOCAL_LTK_OFFSET: + case GAP_BOND_DEV_LTK_OFFSET: + if ( len == sizeof ( gapBondLTK_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_IRK_OFFSET: + case GAP_BOND_DEV_CSRK_OFFSET: + if ( len == KEYLEN ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_SIGN_COUNTER_OFFSET: + if ( len == sizeof ( uint32 ) ) + { + stat = SUCCESS; + } + break; + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTMsg + * + * @brief Process an incoming GATT message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + // Process the GATT message + switch ( pMsg->method ) + { + case ATT_HANDLE_VALUE_CFM: + // Clear Service Changed flag for this client + VOID GAPBondMgr_ServiceChangeInd( pMsg->connHandle, 0x00 ); + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgrSendServiceChange + * + * @brief Tell the GATT that a service change is needed. + * + * @param pLinkItem - pointer to connection information + * + * @return none + */ +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ) +{ + VOID GATT_ServiceChangedInd( pLinkItem->connectionHandle, gapBondMgr_TaskID ); +} + +/********************************************************************* + * @fn gapBondSetupPrivFlag + * + * @brief Setup the GAP Privacy Flag properties. + * + * @param none + * + * @return none + */ +static void gapBondSetupPrivFlag( void ) +{ + uint8 privFlagProp; + + if ( gapBondMgrBondTotal() > 1 ) + { + privFlagProp = GATT_PROP_READ; + } + else + { + privFlagProp = GATT_PROP_READ | GATT_PROP_WRITE; + } + + // Setup the + GGS_SetParameter( GGS_PERI_PRIVACY_FLAG_PROPS, sizeof ( uint8 ), &privFlagProp ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.h b/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.h new file mode 100644 index 0000000..d26b3ce --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/gapperiphbondmgr.h @@ -0,0 +1,365 @@ +/** + @headerfile: gapperiphbondmgr.h + $Date: 2011-09-20 15:43:20 -0700 (Tue, 20 Sep 2011) $ + $Revision: 27655 $ + + @mainpage TI BLE GAP Peripheral Bond Manager + + This GAP profile manages bonded connections between this slave device and + connected master devices.

+ + This profile will automatically respond to SM Pairing Requests from a + connected master (initiator) device. Then, after pairing, if keys were + exchanged and bonding was specified, save the device and key information + of the connected initiator, so that, on future connections, the bonded + devices can establish an encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GAPPERIPHBONDMGR_H +#define GAPPERIPHBONDMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "gap.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +#if !defined ( GAP_BONDINGS_MAX ) + #define GAP_BONDINGS_MAX 10 //!< Maximum number of bonds that can be saved in NV. +#endif + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#define GAPBOND_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_INITIATE_WAIT 0x401 //!< Pairing Mode Initiate wait timeout. This is the time it will wait for a Pairing Request before sending the Slave Initiate Request. Read/Write. Size is uint16. Default is 1000(in milliseconds). +#define GAPBOND_MITM_PROTECTION 0x402 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_IO_CAPABILITIES 0x403 //!< I/O capabilities. Read/Write. Size is uint8. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_OOB_ENABLED 0x404 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_OOB_DATA 0x405 //!< OOB Data. Read/Write. size uint8[16]. Default is all 0's. +#define GAPBOND_BONDING_ENABLED 0x406 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_KEY_DIST_LIST 0x407 //!< The key distribution list for bonding. size is uint8. @ref GAPBOND_KEY_DIST_DEFINES. Default is sEncKey, sIdKey, mIdKey, mSign enabled. +#define GAPBOND_DEFAULT_PASSCODE 0x408 //!< The default passcode for MITM protection. size is uint32. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x409 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x40A //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x40B //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x40C //!< Key Size used in pairing. Read/Write. size is uint8. Default is 16. +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_MENCKEY 0x08 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x10 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x20 //!< Master CSRK +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authenication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +typedef void (*pfnPairStateCB_t) +( + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * GAP Bond Manager Callbacks. + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral or Peripheral/Broadcaster Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void gapBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPPERIPHBONDMGR_H */ diff --git a/Firmware/Radio/Profiles/Roles/observer.c b/Firmware/Radio/Profiles/Roles/observer.c new file mode 100644 index 0000000..e1b647a --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/observer.c @@ -0,0 +1,316 @@ +/************************************************************************************************** + Filename: observer.c + Revised: $Date: 2011-05-05 10:12:10 -0700 (Thu, 05 May 2011) $ + Revision: $Revision: 25871 $ + + Description: GAP Observer Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_cbTimer.h" +#include "osal_snv.h" +#include "hci_tl.h" +#include "gap.h" + +#include "observer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Task ID +static uint8 gapObserverRoleTaskId; + +// App callbacks +static gapObserverRoleCB_t *pGapObserverRoleCB; + +/********************************************************************* + * Profile Parameters - reference GAPCENTRALROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapObserverRoleBdAddr[B_ADDR_LEN]; +static uint8 gapObserverRoleMaxScanRes = 0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapObserverRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapObserverRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_StartDevice( gapObserverRoleCB_t *pAppCallbacks ) +{ + if ( pAppCallbacks ) + { + pGapObserverRoleCB = pAppCallbacks; + } + + return GAP_DeviceInit( gapObserverRoleTaskId, GAP_PROFILE_OBSERVER, + gapObserverRoleMaxScanRes, NULL, NULL, NULL ); +} + +/** + * @brief Set a parameter in the Observer Profile. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPOBSERVERROLE_MAX_SCAN_RES: + if ( len == sizeof ( uint8 ) ) + { + gapObserverRoleMaxScanRes = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Get a parameter in the Observer Profile. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPOBSERVERROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapObserverRoleBdAddr, B_ADDR_LEN ) ; + break; + + case GAPOBSERVERROLE_MAX_SCAN_RES: + *((uint8*)pValue) = gapObserverRoleMaxScanRes; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Start a device discovery scan. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ) +{ + gapDevDiscReq_t params; + + params.taskID = gapObserverRoleTaskId; + params.mode = mode; + params.activeScan = activeScan; + params.whiteList = whiteList; + + return GAP_DeviceDiscoveryRequest( ¶ms ); +} + +/** + * @brief Cancel a device discovery scan. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_CancelDiscovery( void ) +{ + return GAP_DeviceDiscoveryCancel( gapObserverRoleTaskId ); +} + +/** + * @brief Observer Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +void GAPObserverRole_Init( uint8 taskId ) +{ + gapObserverRoleTaskId = taskId; + + // Register for HCI messages (for RSSI) + GAP_RegisterForHCIMsgs( taskId ); +} + +/** + * @brief Observer Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +uint16 GAPObserverRole_ProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapObserverRoleTaskId )) != NULL ) + { + gapObserverRole_ProcessOSALMsg( (osal_event_hdr_t *) pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapObserverRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapObserverRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + //hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *) pMsg; + } + break; + + case GAP_MSG_EVENT: + gapObserverRole_ProcessGAPMsg( (gapEventHdr_t *) pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapObserverRole_ProcessGAPMsg + * + * @brief Process an incoming task message from GAP. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapObserverRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *) pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + // Save off the information + VOID osal_memcpy( gapObserverRoleBdAddr, pPkt->devAddr, B_ADDR_LEN ); + } + } + break; + + default: + break; + } + + // Pass event to app + if ( pGapObserverRoleCB && pGapObserverRoleCB->eventCB ) + { + pGapObserverRoleCB->eventCB( (gapObserverRoleEvent_t *) pMsg ); + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/observer.h b/Firmware/Radio/Profiles/Roles/observer.h new file mode 100644 index 0000000..8dcdf4f --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/observer.h @@ -0,0 +1,230 @@ +/** + @headerfile: observer.h + $Date: 2011-03-11 15:48:31 -0800 (Fri, 11 Mar 2011) $ + $Revision: 25393 $ + + @mainpage TI BLE GAP Observer Role + + This GAP profile only discovers. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef OBSERVER_H +#define OBSERVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "gap.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GAPOBSERVERROLE_PROFILE_PARAMETERS GAP Observer Role Parameters + * @{ + */ +#define GAPOBSERVERROLE_BD_ADDR 0x400 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPOBSERVERROLE_MAX_SCAN_RES 0x401 //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +/** @} End GAPOBSERVERROLE_PROFILE_PARAMETERS */ + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Observer Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. +} gapObserverRoleEvent_t; + +/** + * RSSI Read Callback Function + */ +typedef void (*pfnGapObserverRoleRssiCB_t) +( + uint16 connHandle, //!< Connection handle. + int8 rssi //!< New RSSI value. +); + +/** + * Observer Event Callback Function + */ +typedef void (*pfnGapObserverRoleEventCB_t) +( + gapObserverRoleEvent_t *pEvent //!< Pointer to event structure. +); + +/** + * Observer Callback Structure + */ +typedef struct +{ + pfnGapObserverRoleRssiCB_t rssiCB; //!< RSSI callback. + pfnGapObserverRoleEventCB_t eventCB; //!< Event callback. +} gapObserverRoleCB_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * Observer Profile Public APIs + */ + +/** + * @defgroup OBSERVER_PROFILE_API Observer Profile API Functions + * + * @{ + */ + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPObserverRole_StartDevice( gapObserverRoleCB_t *pAppCallbacks ); + +/** + * @brief Set a parameter in the Observer Profile. + * + * @param param - profile parameter ID: @ref GAPOBSERVERROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type. + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPObserverRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a parameter in the Observer Profile. + * + * @param param - profile parameter ID: @ref GAPOBSERVERROLE_PROFILE_PARAMETERS + * @param pValue - pointer to buffer to contain the read data + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPObserverRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPObserverRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPObserverRole_CancelDiscovery( void ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Observer Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +extern void GAPObserverRole_Init( uint8 taskId ); + +/** + * @internal + * + * @brief Observer Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +extern uint16 GAPObserverRole_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OBSERVER_H */ diff --git a/Firmware/Radio/Profiles/Roles/peripheral.c b/Firmware/Radio/Profiles/Roles/peripheral.c new file mode 100644 index 0000000..160cec5 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/peripheral.c @@ -0,0 +1,1180 @@ +/************************************************************************************************** + Filename: peripheral.c + Revised: $Date: 2012-11-14 13:15:48 -0800 (Wed, 14 Nov 2012) $ + Revision: $Revision: 32186 $ + + Description: GAP Peripheral Role + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci_tl.h" +#include "l2cap.h" +#include "gap.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "osal_snv.h" + +#include "peripheral.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 +#define RSSI_READ_EVT 0x0002 +#define UPDATE_PARAMS_TIMEOUT_EVT 0x0004 + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +#define RSSI_NOT_AVAILABLE 127 + +#define DEFAULT_MIN_CONN_INTERVAL 0x0006 // 100 milliseconds +#define DEFAULT_MAX_CONN_INTERVAL 0x0C80 // 4 seconds + +#define MIN_CONN_INTERVAL 0x0006 +#define MAX_CONN_INTERVAL 0x0C80 + +#define DEFAULT_TIMEOUT_MULTIPLIER 1000 + +#define CONN_INTERVAL_MULTIPLIER 6 + +#define MIN_SLAVE_LATENCY 0 +#define MAX_SLAVE_LATENCY 500 + +#define MIN_TIMEOUT_MULTIPLIER 0x000a +#define MAX_TIMEOUT_MULTIPLIER 0x0c80 + +#define MAX_TIMEOUT_VALUE 0xFFFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_IRK[KEYLEN]; +static uint8 gapRole_SRK[KEYLEN]; +static uint32 gapRole_signCounter; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // Limited Discoverable & BR/EDR not supported + (GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED), + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +static uint16 gapRole_ConnectionHandle = INVALID_CONNHANDLE; +static uint16 gapRole_RSSIReadRate = 0; + +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; +static uint8 gapRole_ConnectedDevAddr[B_ADDR_LEN] = {0}; + +static uint8 gapRole_ParamUpdateEnable = FALSE; +static uint16 gapRole_MinConnInterval = DEFAULT_MIN_CONN_INTERVAL; +static uint16 gapRole_MaxConnInterval = DEFAULT_MAX_CONN_INTERVAL; +static uint16 gapRole_SlaveLatency = MIN_SLAVE_LATENCY; +static uint16 gapRole_TimeoutMultiplier = DEFAULT_TIMEOUT_MULTIPLIER; + +static uint16 gapRole_ConnInterval = 0; +static uint16 gapRole_ConnSlaveLatency = 0; +static uint16 gapRole_ConnTimeout = 0; + +static uint8 ParamUpdateNoSuccessOption = GAPROLE_NO_ACTION; + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapRole_signCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + if ( gapRole_state == GAPROLE_ADVERTISING ) + { + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING) + || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_RSSI_READ_RATE: + if ( len == sizeof ( uint16 ) ) + { + gapRole_RSSIReadRate = *((uint16*)pValue); + + if ( (gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED) ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapRole_ParamUpdateEnable = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_MIN_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL ) && + ( newInterval <= MAX_CONN_INTERVAL ) ) + { + gapRole_MinConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_MAX_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL) && + ( newInterval <= MAX_CONN_INTERVAL) ) + { + gapRole_MaxConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_SLAVE_LATENCY: + { + uint16 latency = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && (latency < MAX_SLAVE_LATENCY) ) + { + gapRole_SlaveLatency = latency; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + { + uint16 newTimeout = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) + && (newTimeout >= MIN_TIMEOUT_MULTIPLIER) && (newTimeout <= MAX_TIMEOUT_MULTIPLIER) ) + { + gapRole_TimeoutMultiplier = newTimeout; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_PARAM_UPDATE_REQ: + { + uint8 req = *((uint8*)pValue); + if ( len == sizeof ( uint8 ) && (req == TRUE) ) + { + // Check the connection parameters versus the configured parameters + if ( (gapRole_ConnInterval < gapRole_MinConnInterval) || + (gapRole_ConnInterval > gapRole_MaxConnInterval) || + (gapRole_ConnSlaveLatency != gapRole_SlaveLatency) || + (gapRole_ConnTimeout != gapRole_TimeoutMultiplier) ) + { + GAPRole_SendUpdateParam( gapRole_MinConnInterval, gapRole_MaxConnInterval, + gapRole_SlaveLatency, gapRole_TimeoutMultiplier, GAPROLE_NO_ACTION ); + } + } + else + { + ret = bleInvalidRange; + } + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_IRK: + VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ; + break; + + case GAPROLE_SRK: + VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ; + break; + + case GAPROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapRole_signCounter; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + case GAPROLE_CONNHANDLE: + *((uint16*)pValue) = gapRole_ConnectionHandle; + break; + + case GAPROLE_RSSI_READ_RATE: + *((uint16*)pValue) = gapRole_RSSIReadRate; + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + *((uint16*)pValue) = gapRole_ParamUpdateEnable; + break; + + case GAPROLE_MIN_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MinConnInterval; + break; + + case GAPROLE_MAX_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MaxConnInterval; + break; + + case GAPROLE_SLAVE_LATENCY: + *((uint16*)pValue) = gapRole_SlaveLatency; + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + *((uint16*)pValue) = gapRole_TimeoutMultiplier; + break; + + case GAPROLE_CONN_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_ConnInterval; + break; + + case GAPROLE_CONN_LATENCY: + *((uint16*)pValue) = gapRole_ConnSlaveLatency; + break; + + case GAPROLE_CONN_TIMEOUT: + *((uint16*)pValue) = gapRole_ConnTimeout; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * @brief Terminates the existing connection. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_TerminateConnection( void ) +{ + if ( gapRole_state == GAPROLE_CONNECTED ) + { + return ( GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ) ); + } + else + { + return ( bleIncorrectMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in peripheral.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = GAP_PROFILE_PERIPHERAL; + VOID osal_memset( gapRole_IRK, 0, KEYLEN ); + VOID osal_memset( gapRole_SRK, 0, KEYLEN ); + gapRole_signCounter = 0; + gapRole_AdvEventType = GAP_ADTYPE_ADV_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; + + // Restore Items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in peripheral.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + return ( events ^ START_ADVERTISING_EVT ); + } + + if ( events & RSSI_READ_EVT ) + { + // Only get RSSI when in a connection + if ( gapRole_state == GAPROLE_CONNECTED ) + { + // Ask for RSSI + VOID HCI_ReadRssiCmd( gapRole_ConnectionHandle ); + + // Setup next event + if ( gapRole_RSSIReadRate ) + { + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + return ( events ^ RSSI_READ_EVT ); + } + + if ( events & UPDATE_PARAMS_TIMEOUT_EVT ) + { + // Clear an existing timeout + if ( osal_get_timeoutEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ) ) + { + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // The Update Parameters Timeout occurred - Terminate connection + VOID GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ); + + return ( events ^ UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + int8 rssi = (int8)pPkt->pReturnParam[3]; + + if ( (gapRole_state == GAPROLE_CONNECTED) && (rssi != RSSI_NOT_AVAILABLE) ) + { + // Report RSSI to app + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead ) + { + pGapRoles_AppCGs->pfnRssiRead( rssi ); + } + } + } + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case L2CAP_SIGNAL_EVENT: + { + l2capSignalEvent_t *pPkt = (l2capSignalEvent_t *)pMsg; + + // Process the Parameter Update Response + if ( pPkt->opcode == L2CAP_PARAM_UPDATE_RSP ) + { + l2capParamUpdateRsp_t *pRsp = (l2capParamUpdateRsp_t *)&(pPkt->cmd.updateRsp); + if ( pRsp->result == SUCCESS ) + { + // All is good stop Update Parameters timeout + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, + TRUE, gapRole_AdvertDataLen, gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + gapRole_state = GAPROLE_ADVERTISING; + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN ); + gapRole_ConnectionHandle = pPkt->connectionHandle; + gapRole_state = GAPROLE_CONNECTED; + + if ( gapRole_RSSIReadRate ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + + // Store connection information + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + + // Check whether update parameter request is enabled, and check the connection parameters + if ( ( gapRole_ParamUpdateEnable == TRUE ) && + ( (pPkt->connInterval < gapRole_MinConnInterval) || + (pPkt->connInterval > gapRole_MaxConnInterval) || + (pPkt->connLatency != gapRole_SlaveLatency) || + (pPkt->connTimeout != gapRole_TimeoutMultiplier) )) + { + GAPRole_SendUpdateParam( gapRole_MinConnInterval, gapRole_MaxConnInterval, + gapRole_SlaveLatency, gapRole_TimeoutMultiplier, GAPROLE_NO_ACTION ); + } + + // Notify the Bond Manager to the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL ); + } + else if ( pPkt->hdr.status == bleGAPConnNotAcceptable ) + { + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + + // Go to WAITING state, and then start advertising + gapRole_state = GAPROLE_WAITING; + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg; + + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN ); + + // Erase connection information + gapRole_ConnInterval = 0; + gapRole_ConnSlaveLatency = 0; + gapRole_ConnTimeout = 0; + + // Go to WAITING state, and then start advertising + if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM ) + { + gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; + } + else + { + gapRole_state = GAPROLE_WAITING; + } + + notify = TRUE; + + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + } + break; + + case GAP_LINK_PARAM_UPDATE_EVENT: + { + gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg; + + if ( (pPkt->hdr.status != SUCCESS) + || (pPkt->connInterval < gapRole_MinConnInterval) + || (pPkt->connInterval > gapRole_MaxConnInterval) + || (pPkt->connTimeout != gapRole_TimeoutMultiplier) ) + { + // See which option was choosen for unsuccessful updates + switch ( ParamUpdateNoSuccessOption ) + { + case GAPROLE_RESEND_PARAM_UPDATE: + GAPRole_SendUpdateParam( gapRole_MinConnInterval, gapRole_MaxConnInterval, + gapRole_SlaveLatency, gapRole_TimeoutMultiplier, GAPROLE_RESEND_PARAM_UPDATE ); + break; + + case GAPROLE_TERMINATE_LINK: + GAPRole_TerminateConnection(); + break; + + case GAPROLE_NO_ACTION: + // fall through + default: + //do nothing + break; + } + } + else + { + // All is good, cancel update parameters timeout timer + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + + // Store connection information + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + } + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + gapRole_IRK, gapRole_SRK, + &gapRole_signCounter ); +} + +/******************************************************************** + * @fn GAPRole_SendUpdateParam + * + * @brief Update the parameters of an existing connection + * + * @param minConnInterval - the new min connection interval + * @param maxConnInterval - the new max connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected, or bleInvalidRange + */ +bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ) +{ + // If there is no existing connection no update need be sent + if ( gapRole_state != GAPROLE_CONNECTED ) + { + return ( bleNotConnected ); + } + + ParamUpdateNoSuccessOption = handleFailure; + + l2capParamUpdateReq_t updateReq; // Space for Conn Update parameters + uint32 timeout; // Calculated response timeout + + // Calculate the current interval + uint16 effectiveOldInterval = (gapRole_ConnInterval * (gapRole_ConnSlaveLatency + 1)); + + // Calculate the interval we want + uint16 effectiveNewMaxInterval = (maxConnInterval * (latency + 1)); + + // Check that all parameters are in range before sending request + if ( ( minConnInterval >= DEFAULT_MIN_CONN_INTERVAL ) && + ( minConnInterval < DEFAULT_MAX_CONN_INTERVAL ) && + ( maxConnInterval >= DEFAULT_MIN_CONN_INTERVAL ) && + ( maxConnInterval < DEFAULT_MAX_CONN_INTERVAL ) && + ( latency < MAX_SLAVE_LATENCY ) && + ( connTimeout >= MIN_TIMEOUT_MULTIPLIER ) && + ( connTimeout < MAX_TIMEOUT_MULTIPLIER ) ) + { + updateReq.intervalMin = gapRole_MinConnInterval = minConnInterval; + updateReq.intervalMax = gapRole_MaxConnInterval = maxConnInterval; + updateReq.slaveLatency = gapRole_SlaveLatency = latency; + updateReq.timeoutMultiplier = gapRole_TimeoutMultiplier = connTimeout; + } + else + { + return ( bleInvalidRange ); + } + + VOID L2CAP_ConnParamUpdateReq( gapRole_ConnectionHandle, &updateReq, gapRole_TaskID ); + + // Set up the timeout for expected response + if ( effectiveOldInterval > effectiveNewMaxInterval ) + { + timeout = (uint32)(effectiveOldInterval) * CONN_INTERVAL_MULTIPLIER; + } + else + { + timeout = (uint32)(effectiveNewMaxInterval) * CONN_INTERVAL_MULTIPLIER; + } + + if ( timeout > MAX_TIMEOUT_VALUE ) + { + timeout = MAX_TIMEOUT_VALUE; + } + + //start param update timeout timer + VOID osal_start_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT, (uint16)(timeout) ); + + return ( SUCCESS ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/peripheral.h b/Firmware/Radio/Profiles/Roles/peripheral.h new file mode 100644 index 0000000..debe082 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/peripheral.h @@ -0,0 +1,269 @@ +/** + @headerfile: peripheral.h + $Date: 2012-10-01 12:57:40 -0700 (Mon, 01 Oct 2012) $ + $Revision: 31663 $ + + @mainpage TI BLE GAP Peripheral Role + + This GAP profile advertises and allows connections. + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef PERIPHERAL_H +#define PERIPHERAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_OFF_TIME 0x306 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x307 //!< Advertisement Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x308 //!< Scan Response Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x309 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x30A //!< Direct Advertisement Address Type. Read/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x30B //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30C //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30D //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +#define GAPROLE_CONNHANDLE 0x30E //!< Connection Handle. Read Only. Size is uint16. +#define GAPROLE_RSSI_READ_RATE 0x30F //!< How often to read the RSSI during a connection. Read/Write. Size is uint16. The value is in milliseconds. Default is 0 = OFF. +#define GAPROLE_PARAM_UPDATE_ENABLE 0x310 //!< Slave Connection Parameter Update Enable. Read/Write. Size is uint8. If TRUE then automatic connection parameter update request is sent. Default is FALSE. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 4 seconds (0x0C80). +#define GAPROLE_SLAVE_LATENCY 0x313 //!< Update Parameter Slave Latency. Range: 0 - 499. Read/Write. Size is uint16. Default is 0. +#define GAPROLE_TIMEOUT_MULTIPLIER 0x314 //!< Update Parameter Timeout Multiplier (n * 10ms). Range: 100ms to 32 seconds (0x000a - 0x0c80). Read/Write. Size is uint16. Default is 1000. +#define GAPROLE_CONN_BD_ADDR 0x315 //!< Address of connected device. Read only. Size is uint8[B_MAX_ADV_LEN]. Set to all zeros when not connected. +#define GAPROLE_CONN_INTERVAL 0x316 //!< Current connection interval. Read only. Size is uint16. Range is 7.5ms to 4 seconds (0x0006 to 0x0C80). Default is 0 (no connection). +#define GAPROLE_CONN_LATENCY 0x317 //!< Current slave latency. Read only. Size is uint16. Range is 0 to 499. Default is 0 (no slave latency or no connection). +#define GAPROLE_CONN_TIMEOUT 0x318 //!< Current timeout value. Read only. size is uint16. Range is 100ms to 32 seconds. Default is 0 (no connection). +#define GAPROLE_PARAM_UPDATE_REQ 0x319 //!< Slave Connection Parameter Update Request. Write. Size is uint8. If TRUE then connection parameter update request is sent. +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/** + * Possible actions the peripheral device may take if an unsuccessful parameter + * update is received. + * + * Parameters for GAPRole_SendUpdateParam() only + */ + +#define GAPROLE_NO_ACTION 0 // Take no action upon unsuccessful parameter updates +#define GAPROLE_RESEND_PARAM_UPDATE 1 // Continue to resend request until successful update +#define GAPROLE_TERMINATE_LINK 2 // Terminate link upon unsuccessful parameter updates + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_API GAP Peripheral Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connInterval - the new connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ); + +/** + * @} End GAPROLES_PERIPHERAL_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PERIPHERAL_H */ diff --git a/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.c b/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.c new file mode 100644 index 0000000..a322485 --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.c @@ -0,0 +1,1111 @@ +/************************************************************************************************** + Filename: peripheralBroadcaster.c + Revised: $Date: 2011-08-04 12:05:19 -0700 (Thu, 04 Aug 2011) $ + Revision: $Revision: 27026 $ + + Description: GAP Peripheral + Broadcaster Role + + + Copyright 2010 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci.h" +#include "l2cap.h" +#include "gap.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "osal_snv.h" + +#include "peripheralBroadcaster.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 +#define RSSI_READ_EVT 0x0002 +#define UPDATE_PARAMS_TIMEOUT_EVT 0x0004 + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +#define RSSI_NOT_AVAILABLE 127 + +#define DEFAULT_MIN_CONN_INTERVAL 0x0006 // 100 milliseconds +#define DEFAULT_MAX_CONN_INTERVAL 0x0C80 // 4 seconds + +#define MIN_CONN_INTERVAL 0x0006 +#define MAX_CONN_INTERVAL 0x0C80 + +#define DEFAULT_SLAVE_LATENCY 0 +#define DEFAULT_TIMEOUT_MULTIPLIER 1000 + +#define CONN_INTERVAL_MULTIPLIER 6 + +#define MAX_SLAVE_LATENCY 500 +#define MIN_TIMEOUT_MULTIPLIER 0x000a +#define MAX_TIMEOUT_MULTIPLIER 0x0c80 + +#define MAX_TIMEOUT_VALUE 0xFFFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_IRK[KEYLEN]; +static uint8 gapRole_SRK[KEYLEN]; +static uint32 gapRole_signCounter; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // Limited Discoverable & BR/EDR not supported + (GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED), + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +static uint16 gapRole_ConnectionHandle = INVALID_CONNHANDLE; +static uint16 gapRole_RSSIReadRate = 0; + +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; +static uint8 gapRole_ConnectedDevAddr[B_ADDR_LEN] = {0}; + +static uint8 gapRole_ParamUpdateEnable = FALSE; +static uint16 gapRole_MinConnInterval = DEFAULT_MIN_CONN_INTERVAL; +static uint16 gapRole_MaxConnInterval = DEFAULT_MAX_CONN_INTERVAL; +static uint16 gapRole_SlaveLatency = DEFAULT_SLAVE_LATENCY; +static uint16 gapRole_TimeoutMultiplier = DEFAULT_TIMEOUT_MULTIPLIER; + + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); +static void gapRole_SendUpdateParam( uint16 connInterval, uint16 connLatency ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapRole_signCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + if ( (gapRole_state == GAPROLE_CONNECTED) || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + uint8 advEnabled = *((uint8*)pValue); + + if ( (gapRole_state == GAPROLE_CONNECTED) && (advEnabled == TRUE) ) + { + // Turn on advertising + osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + else if ( (gapRole_state == GAPROLE_CONNECTED_ADV) && (advEnabled == FALSE) ) + { + // Turn off Advertising + GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING ) + || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_RSSI_READ_RATE: + if ( len == sizeof ( uint16 ) ) + { + gapRole_RSSIReadRate = *((uint16*)pValue); + + if ( (gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED) ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapRole_ParamUpdateEnable = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_MIN_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL ) && + ( newInterval <= MAX_CONN_INTERVAL ) ) + { + gapRole_MinConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_MAX_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL) && + ( newInterval <= MAX_CONN_INTERVAL) ) + { + gapRole_MaxConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_SLAVE_LATENCY: + { + uint16 latency = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && (latency < MAX_SLAVE_LATENCY) ) + { + gapRole_SlaveLatency = latency; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + { + uint16 newTimeout = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) + && (newTimeout >= MIN_TIMEOUT_MULTIPLIER) && (newTimeout <= MAX_TIMEOUT_MULTIPLIER) ) + { + gapRole_TimeoutMultiplier = newTimeout; + } + else + { + ret = bleInvalidRange; + } + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_IRK: + VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ; + break; + + case GAPROLE_SRK: + VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ; + break; + + case GAPROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapRole_signCounter; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + case GAPROLE_CONNHANDLE: + *((uint16*)pValue) = gapRole_ConnectionHandle; + break; + + case GAPROLE_RSSI_READ_RATE: + *((uint16*)pValue) = gapRole_RSSIReadRate; + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + *((uint16*)pValue) = gapRole_ParamUpdateEnable; + break; + + case GAPROLE_MIN_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MinConnInterval; + break; + + case GAPROLE_MAX_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MaxConnInterval; + break; + + case GAPROLE_SLAVE_LATENCY: + *((uint16*)pValue) = gapRole_SlaveLatency; + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + *((uint16*)pValue) = gapRole_TimeoutMultiplier; + break; + + case GAPROLE_CONN_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * @brief Terminates the existing connection. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_TerminateConnection( void ) +{ + if ( (gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + return ( GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ) ); + } + else + { + return ( bleIncorrectMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in peripheral.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = (GAP_PROFILE_PERIPHERAL | GAP_PROFILE_BROADCASTER); + VOID osal_memset( gapRole_IRK, 0, KEYLEN ); + VOID osal_memset( gapRole_SRK, 0, KEYLEN ); + gapRole_signCounter = 0; + gapRole_AdvEventType = GAP_ADTYPE_ADV_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; + + // Restore Items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in peripheral.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + if ( gapRole_state == GAPROLE_CONNECTED ) + { + // While in a connection, we can only advertise non-connectable undirected. + params.eventType = GAP_ADTYPE_ADV_NONCONN_IND; + } + else + { + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + } + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + return ( events ^ START_ADVERTISING_EVT ); + } + + if ( events & RSSI_READ_EVT ) + { + // Only get RSSI when in a connection + if ( (gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + // Ask for RSSI + VOID HCI_ReadRssiCmd( gapRole_ConnectionHandle ); + + // Setup next event + if ( gapRole_RSSIReadRate ) + { + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + return ( events ^ RSSI_READ_EVT ); + } + + if ( events & UPDATE_PARAMS_TIMEOUT_EVT ) + { + // Clear an existing timeout + if ( osal_get_timeoutEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ) ) + { + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // The Update Parameters Timeout occurred - Terminate connection + VOID GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ); + + return ( events ^ UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + int8 rssi = (int8)pPkt->pReturnParam[3]; + + if ( ((gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV)) + && (rssi != RSSI_NOT_AVAILABLE) ) + { + // Report RSSI to app + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead ) + { + pGapRoles_AppCGs->pfnRssiRead( rssi ); + } + } + } + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case L2CAP_SIGNAL_EVENT: + { + l2capSignalEvent_t *pPkt = (l2capSignalEvent_t *)pMsg; + + // Process the Parameter Update Response + if ( pPkt->opcode == L2CAP_PARAM_UPDATE_RSP ) + { + l2capParamUpdateRsp_t *pRsp = (l2capParamUpdateRsp_t *)&(pPkt->cmd.updateRsp); + if ( pRsp->result == SUCCESS ) + { + // All is good stop Update Parameters timeout + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, + TRUE, gapRole_AdvertDataLen, gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + if ( gapRole_state == GAPROLE_CONNECTED ) + { + gapRole_state = GAPROLE_CONNECTED_ADV; + } + else + { + gapRole_state = GAPROLE_ADVERTISING; + } + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN ); + gapRole_ConnectionHandle = pPkt->connectionHandle; + gapRole_state = GAPROLE_CONNECTED; + + if ( gapRole_RSSIReadRate ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + + // Check whether update parameter request is enabled, and check the connection parameters + if ( ( gapRole_ParamUpdateEnable == TRUE ) && + ( (pPkt->connInterval < gapRole_MinConnInterval) || + (pPkt->connInterval > gapRole_MaxConnInterval) || + (pPkt->connLatency != gapRole_SlaveLatency) || + (pPkt->connTimeout != gapRole_TimeoutMultiplier) )) + { + gapRole_SendUpdateParam( pPkt->connInterval, pPkt->connLatency ); + } + + // Notify the Bond Manager to the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL ); + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN ); + + if ( gapRole_state == GAPROLE_CONNECTED_ADV ) + { + // End the non-connectable advertising + GAP_EndDiscoverable( gapRole_TaskID ); + gapRole_state = GAPROLE_CONNECTED; + } + else + { + gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg; + if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM ) + { + gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; + } + else + { + gapRole_state = GAPROLE_WAITING; + } + + notify = TRUE; + + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + } + break; + + case GAP_LINK_PARAM_UPDATE_EVENT: + { + gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg; + + if ( (pPkt->hdr.status != SUCCESS) + || (pPkt->connInterval < gapRole_MinConnInterval) + || (pPkt->connInterval > gapRole_MaxConnInterval) ) + { + // Ask to change the interval + gapRole_SendUpdateParam( pPkt->connInterval, pPkt->connLatency ); + } + else + { + // All is good stop Update Parameters timeout + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + gapRole_IRK, gapRole_SRK, + &gapRole_signCounter ); +} + +/********************************************************************* + * @fn gapRole_SendUpdateParam + * + * @brief Send an Update Connection Parameters. + * + * @param connInterval - current connection interval + * @param connLatency - current connection latency + * + * @return none + */ +static void gapRole_SendUpdateParam( uint16 connInterval, uint16 connLatency ) +{ + l2capParamUpdateReq_t updateReq; // Space for Conn Update parameters + uint32 timeout; // Calculated response timeout + + // Calculate the current interval + uint16 effectiveOldInterval = (connInterval * (connLatency + 1)); + + // Calculate the interval we want + uint16 effectiveNewMaxInterval = (gapRole_MaxConnInterval * (gapRole_SlaveLatency + 1)); + + // Fill in the wanted parameters + updateReq.intervalMin = gapRole_MinConnInterval; + updateReq.intervalMax = gapRole_MaxConnInterval; + updateReq.slaveLatency = gapRole_SlaveLatency; + updateReq.timeoutMultiplier = gapRole_TimeoutMultiplier; + + VOID L2CAP_ConnParamUpdateReq( gapRole_ConnectionHandle, &updateReq, gapRole_TaskID ); + + // Set up the timeout for expected response + if( effectiveOldInterval > effectiveNewMaxInterval ) + { + timeout = (uint32)(effectiveOldInterval) * CONN_INTERVAL_MULTIPLIER; + } + else + { + timeout = (uint32)(effectiveNewMaxInterval) * CONN_INTERVAL_MULTIPLIER; + } + + if( timeout > MAX_TIMEOUT_VALUE ) + { + timeout = MAX_TIMEOUT_VALUE; + } + + VOID osal_start_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT, (uint16)(timeout) ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.h b/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.h new file mode 100644 index 0000000..2b84cef --- /dev/null +++ b/Firmware/Radio/Profiles/Roles/peripheralBroadcaster.h @@ -0,0 +1,242 @@ +/** + @headerfile: peripheralBroadcaster.h + $Date: 2011-08-04 12:05:19 -0700 (Thu, 04 Aug 2011) $ + $Revision: 27026 $ + + @mainpage TI BLE GAP Peripheral + Broadcaster Roles + + This GAP profile advertises and allows connections and adds the ability to + advertise (non-connectable) during a connection. + + Copyright 2010 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef PERIPHERAL_BROADCASTER_H +#define PERIPHERAL_BROADCASTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. During a connection, this will enable and display advertising (non-connectable undirected). Setting this variable during a connection does not change the permanent state of the parameter. +#define GAPROLE_ADVERT_OFF_TIME 0x306 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x307 //!< Advertisement Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x308 //!< Scan Response Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x309 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x30A //!< Direct Advertisement Address Type. Read/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x30B //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30C //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30D //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +#define GAPROLE_CONNHANDLE 0x30E //!< Connection Handle. Read Only. Size is uint16. +#define GAPROLE_RSSI_READ_RATE 0x30F //!< How often to read the RSSI during a connection. Read/Write. Size is uint16. The value is in milliseconds. Default is 0 = OFF. +#define GAPROLE_PARAM_UPDATE_ENABLE 0x310 //!< Slave Connection Parameter Update Enable. Read/Write. Size is uint8. If TRUE then automatic connection parameter update request is sent. Default is FALSE. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 4 seconds (0x0C80). +#define GAPROLE_SLAVE_LATENCY 0x313 //!< Update Parameter Slave Latency. Range: 0 - 499. Read/Write. Size is uint16. Default is 0. +#define GAPROLE_TIMEOUT_MULTIPLIER 0x314 //!< Update Parameter Timeout Multiplier (n * 10ms). Range: 100ms to 32 seconds (0x000a - 0x0c80). Read/Write. Size is uint16. Default is 1000. +#define GAPROLE_CONN_BD_ADDR 0x315 //!< Address of connected device. Read only. Size is uint8[B_MAX_ADV_LEN]. Set to all zeros when not connected. +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral + Broadcaster Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_CONNECTED_ADV, //!< In a connection and advertising + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_BROADCASTER_API GAP Peripheral + Broadcaster Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @} End GAPROLES_PERIPHERAL_BROADCASTER_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PERIPHERAL_BROADCASTER_H */ diff --git a/Firmware/Radio/Profiles/ScanParam/scanparamservice.c b/Firmware/Radio/Profiles/ScanParam/scanparamservice.c new file mode 100644 index 0000000..022734b --- /dev/null +++ b/Firmware/Radio/Profiles/ScanParam/scanparamservice.c @@ -0,0 +1,451 @@ +/************************************************************************************************** + Filename: scanparamservice.c + Revised: $Date: 2011-12-16 15:46:52 -0800 (Fri, 16 Dec 2011) $ + Revision: $Revision: 58 $ + + Description: This file contains the Scan Parameters Service. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "linkdb.h" +#include "scanparamservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Scan parameters service +CONST uint8 scanParamServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_PARAM_SERVICE_UUID), HI_UINT16(SCAN_PARAM_SERVICE_UUID) +}; + +// Scan interval window characteristic +CONST uint8 scanIntervalWindowUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_INTERVAL_WINDOW_UUID), HI_UINT16(SCAN_INTERVAL_WINDOW_UUID) +}; + +// Scan parameter refresh characteristic +CONST uint8 scanParamRefreshUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_PARAM_REFRESH_UUID), HI_UINT16(SCAN_PARAM_REFRESH_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Application callback +static scanParamServiceCB_t scanParamServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Scan Parameters Service attribute +static CONST gattAttrType_t scanParamService = { ATT_BT_UUID_SIZE, scanParamServUUID }; + +// Scan Interval Window characteristic +static uint8 scanIntervalWindowProps = GATT_PROP_WRITE_NO_RSP; +static uint8 scanIntervalWindow[SCAN_INTERVAL_WINDOW_CHAR_LEN]; + +// Scan Parameter Refresh characteristic +static uint8 scanParamRefreshProps = GATT_PROP_NOTIFY; +static uint8 scanParamRefresh[SCAN_PARAM_REFRESH_LEN]; +static gattCharCfg_t scanParamRefreshClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t scanParamAttrTbl[] = +{ + // Scan Parameters Service attribute + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&scanParamService /* pValue */ + }, + + // Scan Interval Window declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &scanIntervalWindowProps + }, + + // Scan Interval Window characteristic + { + { ATT_BT_UUID_SIZE, scanIntervalWindowUUID }, + GATT_PERMIT_WRITE, + 0, + scanIntervalWindow + }, + + // Scan Parameter Refresh declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &scanParamRefreshProps + }, + + // Scan Parameter Refresh characteristic + { + { ATT_BT_UUID_SIZE, scanParamRefreshUUID }, + 0, + 0, + scanParamRefresh + }, + + // Scan Parameter Refresh characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &scanParamRefreshClientCharCfg + } +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + SCAN_PARAM_SERVICE_IDX, // Scan Parameters Service + SCAN_PARAM_INTERVAL_DECL_IDX, // Scan Interval Window declaration + SCAN_PARAM_INTERVAL_IDX, // Scan Interval Window characteristic + SCAN_PARAM_REFRESH_DECL_IDX, // Scan Parameter Refresh declaration + SCAN_PARAM_REFRESH_IDX, // Scan Parameter Refresh characteristic + SCAN_PARAM_REFRESH_CCCD_IDX // Scan Parameter Refresh characteristic client characteristic configuration +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bStatus_t scanParamWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static uint8 scanParamReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t scanParamCBs = +{ + scanParamReadAttrCB, // Read callback function pointer + scanParamWriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn ScanParam_AddService + * + * @brief Initializes the Battery Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t ScanParam_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, scanParamRefreshClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( scanParamAttrTbl, GATT_NUM_ATTRS( scanParamAttrTbl ), + &scanParamCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn ScanParam_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void ScanParam_Register( scanParamServiceCB_t pfnServiceCB ) +{ + scanParamServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn ScanParam_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ScanParam_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ScanParam_GetParameter + * + * @brief Get a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ScanParam_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SCAN_PARAM_PARAM_INTERVAL: + *((uint16*)value) = BUILD_UINT16(scanIntervalWindow[0], + scanIntervalWindow[1]); + break; + + case SCAN_PARAM_PARAM_WINDOW: + *((uint16*)value) = BUILD_UINT16(scanIntervalWindow[2], + scanIntervalWindow[3]); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ScanParam_RefreshNotify + * + * @brief Notify the peer to refresh the scan parameters. + * + * @param connHandle - connection handle + * + * @return None + */ +void ScanParam_RefreshNotify( uint16 connHandle ) +{ + attHandleValueNoti_t noti; + uint16 value; + + value = GATTServApp_ReadCharCfg( connHandle, scanParamRefreshClientCharCfg ); + + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // send notification + noti.handle = scanParamAttrTbl[SCAN_PARAM_REFRESH_CCCD_IDX].handle; + noti.len = SCAN_PARAM_REFRESH_LEN; + noti.value[0] = SCAN_PARAM_REFRESH_REQ; + GATT_Notification( connHandle, ¬i, FALSE ); + } +} + +/********************************************************************* + * @fn scanParamReadAttrCB + * + * @brief GATT read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 scanParamReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + return ( status ); +} + +/********************************************************************* + * @fn scanParamWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t scanParamWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + // Only one writeable attribute + if ( uuid == SCAN_INTERVAL_WINDOW_UUID ) + { + // require encryption + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + if ( len == SCAN_INTERVAL_WINDOW_CHAR_LEN ) + { + uint16 interval = BUILD_UINT16( pValue[0], pValue[1] ); + uint16 window = BUILD_UINT16( pValue[0], pValue[1] ); + + // Validate values + if ( window <= interval ) + { + osal_memcpy( pAttr->pValue, pValue, len ); + + (*scanParamServiceCB)( SCAN_INTERVAL_WINDOW_SET ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( uuid == GATT_CLIENT_CHAR_CFG_UUID ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn ScanParam_HandleConnStatusCB + * + * @brief Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void ScanParam_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, scanParamRefreshClientCharCfg ); + } + } +} diff --git a/Firmware/Radio/Profiles/ScanParam/scanparamservice.h b/Firmware/Radio/Profiles/ScanParam/scanparamservice.h new file mode 100644 index 0000000..6f2c88b --- /dev/null +++ b/Firmware/Radio/Profiles/ScanParam/scanparamservice.h @@ -0,0 +1,176 @@ +/************************************************************************************************** + Filename: cmdenumservice.h + Revised: $Date: 2011-12-16 15:46:52 -0800 (Fri, 16 Dec 2011) $ + Revision: $Revision: 58 $ + + Description: This file contains the Scan Parameters Service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SCANPARAMSERVICE_H +#define SCANPARAMSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Scan Parameters Service UUIDs +#define SCAN_PARAM_SERVICE_UUID 0x1813 +#define SCAN_INTERVAL_WINDOW_UUID 0x2A4F +#define SCAN_PARAM_REFRESH_UUID 0x2A31 + +// Scan Characteristic Lengths +#define SCAN_INTERVAL_WINDOW_CHAR_LEN 4 +#define SCAN_PARAM_REFRESH_LEN 1 + +// Scan Parameter Refresh Values +#define SCAN_PARAM_REFRESH_REQ 0x00 + +// Callback events +#define SCAN_INTERVAL_WINDOW_SET 1 + +// Get/Set parameters +#define SCAN_PARAM_PARAM_INTERVAL 0 +#define SCAN_PARAM_PARAM_WINDOW 1 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Scan Parameters Service callback function +typedef void (*scanParamServiceCB_t)( uint8 event ); + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn ScanParam_AddService + * + * @brief Initializes the Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t ScanParam_AddService( void ); + +/********************************************************************* + * @fn ScanParam_Register + * + * @brief Register a callback function with the Scan Parameters Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void ScanParam_Register( scanParamServiceCB_t pfnServiceCB ); + +/********************************************************************* + * @fn ScanParam_SetParameter + * + * @brief Set a Scan Parameters Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t ScanParam_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn ScanParam_GetParameter + * + * @brief Get a Scan Parameters Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t ScanParam_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn ScanParam_RefreshNotify + * + * @brief Notify the peer to refresh the scan parameters. + * + * @param connHandle - connection handle + * + * @return None + */ +extern void ScanParam_RefreshNotify( uint16 connHandle ); + +/********************************************************************* + * @fn ScanParam_HandleConnStatusCB + * + * @brief Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void ScanParam_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SCANPARAMSERVICE_H */ diff --git a/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.c b/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.c new file mode 100644 index 0000000..d17f168 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.c @@ -0,0 +1,637 @@ +/************************************************************************************************** + Filename: accelerometerservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Accelerometer service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "accelerometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Accelerometer Service UUID +CONST uint8 accelServUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_SERV_UUID), +}; + +// Accelerometer Characteristic value Data UUID +CONST uint8 accelDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_DATA_UUID), +}; + +// Accelerometer Characteristic value Configuration UUID +CONST uint8 accelCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_CONF_UUID), +}; + +// Accelerometer Characteristic value Configuration UUID +CONST uint8 accelPeriodUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_PERI_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static accelCBs_t *accel_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Accelerometer Profile Service attribute +static CONST gattAttrType_t accelService = { TI_UUID_SIZE, accelServUUID }; + +// Accelerometer Characteristic Properties +static uint8 accelDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 accelData[ACCELEROMETER_DATA_LEN] = { 0, 0, 0}; + +// Accelerometer Characteristic Configuration +static gattCharCfg_t accelDataConfig[GATT_MAX_NUM_CONN]; + +// Accelerometer Characteristic User Description +static uint8 accelDataUserDesp[12] = "Accel. Data\0"; + +// Accelerometer Characteristic Configuration Properties +static uint8 accelCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Accelerometer Characteristic Configuration Value +static uint8 accelCfg = 0; + +// Accelerometer Characteristic Configuration User Description +static uint8 accelCfgUserDesp[13] = "Accel. Conf.\0"; + +// Accelerometer Characteristic Period Properties +static uint8 accPerProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Accelerometer Characteristic Period Value +static uint8 accPer = 0; + +// Accelerometer Characteristic Period User Description +static uint8 accPerUserDesp[12] = "Acc. Period\0"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t accelAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&accelService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, accelDataUUID }, + GATT_PERMIT_READ, + 0, + accelData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, accelCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accelCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelCfgUserDesp + }, + // Characteristic Declaration "Period" + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accPerProps + }, + + // Characteristic Value "Period" + { + { TI_UUID_SIZE, accelPeriodUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accPer + }, + + // Characteristic User Description "Period" + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accPerUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 acc_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t acc_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void acc_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t accCBs = +{ + acc_ReadAttrCB, // Read callback function pointer + acc_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Accel_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Accel_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( acc_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelDataConfig ); + + if (services & ACCELEROMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( accelAttrTbl, + GATT_NUM_ATTRS( accelAttrTbl ), + &accCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Accel_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ) +{ + if ( accel_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + accel_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Accel_SetParameter + * + * @brief Set an Accelrometer parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCELEROMETER_DATA: + if ( len == ACCELEROMETER_DATA_LEN ) + { + VOID osal_memcpy( accelData, value, ACCELEROMETER_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelDataConfig, accelData, FALSE, + accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCELEROMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + accelCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCELEROMETER_PERI: + if ( len == sizeof ( uint8 ) ) + { + accPer = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Accel_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCELEROMETER_DATA: + VOID osal_memcpy( value, accelData, ACCELEROMETER_DATA_LEN ); + break; + + case ACCELEROMETER_CONF: + *((uint8*)value) = accelCfg; + break; + + case ACCELEROMETER_PERI: + *((uint8*)value) = accPer; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn acc_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 acc_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case ACCELEROMETER_DATA_UUID: + *pLen = ACCELEROMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, ACCELEROMETER_DATA_LEN ); + break; + + case ACCELEROMETER_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + case ACCELEROMETER_PERI_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn acc_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t acc_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + uint16 uuid; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case ACCELEROMETER_DATA_UUID: + //Should not get here + break; + + case ACCELEROMETER_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + + if( pAttr->pValue == &accelCfg ) + { + notifyApp = ACCELEROMETER_CONF; + } + else + { + + } + } + break; + + case ACCELEROMETER_PERI_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &accPer ) + { + notifyApp = ACCELEROMETER_PERI; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && accel_AppCBs && accel_AppCBs->pfnAccelChange ) + { + accel_AppCBs->pfnAccelChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn acc_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void acc_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, accelDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.h b/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.h new file mode 100644 index 0000000..1eb1532 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/accelerometerservice.h @@ -0,0 +1,147 @@ +/************************************************************************************************** + Filename: accelerometerservice.h + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Accelerometer service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ACCELEROMETERSERVICE_H +#define ACCELEROMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define ACCELEROMETER_DATA 2 // R uint8 - Profile Attribute value +#define ACCELEROMETER_CONF 3 // RW uint8 - Profile Attribute value +#define ACCELEROMETER_PERI 4 // RW uint8 - Profile Attribute Value + +// Service UUID +#define ACCELEROMETER_SERV_UUID 0xAA10 // F0000000-0451-4000-B000-00000000-AA10 +#define ACCELEROMETER_DATA_UUID 0xAA11 +#define ACCELEROMETER_CONF_UUID 0xAA12 +#define ACCELEROMETER_PERI_UUID 0xAA13 + +// Sensor Profile Services bit fields +#define ACCELEROMETER_SERVICE 0x00000002 + +// Length of sensor data in bytes +#define ACCELEROMETER_DATA_LEN 3 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*accelChange_t)( uint8 paramID ); + +typedef struct +{ + accelChange_t pfnAccelChange; // Called when characteristic value changes +} accelCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Acc_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Accel_AddService( uint32 services ); + +/* + * Acc_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ); + +/* + * Acc_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Acc_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ACCELEROMETERSERVICE_H */ + diff --git a/Firmware/Radio/Profiles/SensorProfile/barometerservice.c b/Firmware/Radio/Profiles/SensorProfile/barometerservice.c new file mode 100644 index 0000000..8acb323 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/barometerservice.c @@ -0,0 +1,634 @@ +/************************************************************************************************** + Filename: barometerservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Barometer service + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "barometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Barometer Service UUID +CONST uint8 barServUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_SERV_UUID), +}; + +// Barometer Characteristic value Data UUID +CONST uint8 barDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_DATA_UUID), +}; + +// Barometer Characteristic value Configuration UUID +CONST uint8 barCalUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_CALI_UUID), +}; + +// Barometer Characteristic value Configuration UUID +CONST uint8 barCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_CONF_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static barometerCBs_t *barometer_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Barometer Profile Service attribute +static CONST gattAttrType_t barService = { TI_UUID_SIZE, barServUUID }; + +// Barometer Characteristic Properties +static uint8 barDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 barData[BAROMETER_DATA_LEN] = { 0, 0, 0, 0}; + +// Barometer Data Characteristic Configuration +static gattCharCfg_t barDataConfig[GATT_MAX_NUM_CONN]; + +// Barometer Characteristic User Description +static uint8 barDataUserDesp[15] = "Barometer Data\0"; + +// Barometer Characteristic Configuration Properties +static uint8 barCalProps = GATT_PROP_READ; + +// Barometer Calibration Characteristic Configuration Value +static uint8 barCal[BAROMETER_CALI_LEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +// Barometer Calibration Characteristic Configuration +static gattCharCfg_t barCalConfig[GATT_MAX_NUM_CONN]; + +// Barometer Calibration Characteristic Configuration User Description +static uint8 barCalUserDesp[16] = "Barometer Cali.\0"; + +// Barometer Characteristic Configuration Properties +static uint8 barCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Barometer Characteristic Configuration Value +static uint8 barCfg = 0; + +// Barometer Characteristic Configuration User Description +static uint8 barCfgUserDesp[16] = "Barometer Conf.\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t sensorBarometerAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&barService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, barDataUUID }, + GATT_PERMIT_READ, + 0, + barData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)barDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barDataUserDesp + }, + + // Characteristic Config Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, barCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &barCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barCfgUserDesp + }, + + + // Characteristic Calibration Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barCalProps + }, + + // Characteristic Value "Calibration" + { + { TI_UUID_SIZE, barCalUUID }, + GATT_PERMIT_READ, + 0, + barCal + }, + + // Characteristic configuration "Calibration" + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)barCalConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barCalUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 barometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t barometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void barometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t sensorProfileCBs = +{ + barometer_ReadAttrCB, // Read callback function pointer + barometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Barometer_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Barometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, barDataConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, barCalConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( barometer_HandleConnStatusCB ); + + if ( services & BAROMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorBarometerAttrTbl, + GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + &sensorProfileCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Barometer_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Barometer_RegisterAppCBs( barometerCBs_t *appCallbacks ) +{ + if ( barometer_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + barometer_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Barometer_SetParameter + * + * @brief Set a Barometer service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Barometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BAROMETER_DATA: + if ( len == BAROMETER_DATA_LEN ) + { + VOID osal_memcpy( barData, value, BAROMETER_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( barDataConfig, barData, FALSE, + sensorBarometerAttrTbl, GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case BAROMETER_CALI: + if ( len == BAROMETER_CALI_LEN ) + { + VOID osal_memcpy( barCal, value, BAROMETER_CALI_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( barCalConfig, barCal, FALSE, + sensorBarometerAttrTbl, GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case BAROMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + barCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Barometer_GetParameter + * + * @brief Get a Barometer parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Barometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BAROMETER_DATA: + VOID osal_memcpy( value, barData, BAROMETER_DATA_LEN ); + break; + + case BAROMETER_CALI: + VOID osal_memcpy( value, barCal, BAROMETER_CALI_LEN ); + break; + + case BAROMETER_CONF: + *((uint8*)value) = barCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn barometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 barometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + // 16-bit UUID + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case BAROMETER_DATA_UUID: + *pLen = BAROMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, BAROMETER_DATA_LEN ); + break; + + case BAROMETER_CALI_UUID: + *pLen = BAROMETER_CALI_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, BAROMETER_CALI_LEN ); + break; + + case BAROMETER_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn barometer_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t barometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint16 uuid; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case BAROMETER_DATA_UUID: + //Should not get here + break; + + case BAROMETER_CALI_UUID: + //Should not get here + break; + + case BAROMETER_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &barCfg ) + { + notifyApp = BAROMETER_CONF; + } + + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && barometer_AppCBs && barometer_AppCBs->pfnBarometerChange ) + { + barometer_AppCBs->pfnBarometerChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn barometer_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void barometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, barDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/barometerservice.h b/Firmware/Radio/Profiles/SensorProfile/barometerservice.h new file mode 100644 index 0000000..6ca159b --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/barometerservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: barometerservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Barometer service definitions and prototypes + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BAROMETERSERVICE_H +#define BAROMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define BAROMETER_DATA 10 // R uint8 - Profile Attribute value +#define BAROMETER_CALI 11 // RW uint8 - Profile Attribute value +#define BAROMETER_CONF 12 // RW uint8 - Profile Attribute value + +// Service UUID +#define BAROMETER_SERV_UUID 0xAA40 // F0000000-0451-4000-B000-00000000-AA40 +#define BAROMETER_DATA_UUID 0xAA41 +#define BAROMETER_CONF_UUID 0xAA42 +#define BAROMETER_CALI_UUID 0xAA43 + +// Sensor Profile Services bit fields +#define BAROMETER_SERVICE 0x00000010 + +// Length of sensor data in bytes +#define BAROMETER_DATA_LEN 4 +#define BAROMETER_CALI_LEN 16 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*barometerChange_t)( uint8 paramID ); + +typedef struct +{ + barometerChange_t pfnBarometerChange; // Called when characteristic value changes +} barometerCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Barometer_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Barometer_AddService( uint32 services ); + +/* + * Barometer_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Barometer_RegisterAppCBs( barometerCBs_t *appCallbacks ); + +/* + * Barometer_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Barometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Barometer_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Barometer_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BAROMETERSERVICE_H */ diff --git a/Firmware/Radio/Profiles/SensorProfile/gyroservice.c b/Firmware/Radio/Profiles/SensorProfile/gyroservice.c new file mode 100644 index 0000000..bb7d2bc --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/gyroservice.c @@ -0,0 +1,547 @@ +/************************************************************************************************** + Filename: gyroservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Gyroscope Service + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "gyroservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Gyroscope Service UUID +CONST uint8 gyroServUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_SERV_UUID), +}; + +// Gyroscope Characteristic value Data UUID +CONST uint8 gyroDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_DATA_UUID), +}; + +// Gyroscooe Characteristic value Configuration UUID +CONST uint8 gyroCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_CONF_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static gyroCBs_t *gyro_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + + +// Gyroscope Profile Service attribute +static CONST gattAttrType_t gyroService = { TI_UUID_SIZE, gyroServUUID }; + +// Accelerometer Characteristic Properties +static uint8 gyroDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 gyroData[GYROSCOPE_DATA_LEN] = {0, 0, 0, 0, 0, 0}; + +// Gyroscope Characteristic Configuration +static gattCharCfg_t gyroDataConfig[GATT_MAX_NUM_CONN]; + +// Gyroscope Characteristic User Description +static uint8 gyroDataUserDesp[12] = "Gyro. Data\0"; + +// Gyroscope Characteristic Configuration Properties +static uint8 gyroCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Gyroscope Characteristic Configuration Value +static uint8 gyroCfg = 0; + +// Gyroscope Characteristic Configuration User Description +static uint8 gyroCfgUserDesp[13] = "Gyro. Conf.\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t sensorGyroscopeAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&gyroService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gyroDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, gyroDataUUID }, + GATT_PERMIT_READ, + 0, + gyroData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gyroDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + gyroDataUserDesp + }, + // Characteristic 2 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gyroCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, gyroCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &gyroCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + gyroCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gyro_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t gyro_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void gyro_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t gyroCBs = +{ + gyro_ReadAttrCB, // Read callback function pointer + gyro_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Gyro_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Gyro_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( gyro_HandleConnStatusCB ); + + if (services & GYROSCOPE_SERVICE ) + { + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorGyroscopeAttrTbl, + GATT_NUM_ATTRS( sensorGyroscopeAttrTbl ), + &gyroCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Gyro_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Gyro_RegisterAppCBs( gyroCBs_t *appCallbacks ) +{ + if ( gyro_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + gyro_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Gyro_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gyro_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GYROSCOPE_DATA: + if ( len == GYROSCOPE_DATA_LEN ) + { + VOID osal_memcpy( gyroData, value, GYROSCOPE_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gyroDataConfig, gyroData, FALSE, + sensorGyroscopeAttrTbl, GATT_NUM_ATTRS( sensorGyroscopeAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case GYROSCOPE_CONF: + if(len == sizeof ( uint8 ) ) + { + gyroCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Gyro_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gyro_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GYROSCOPE_DATA: + VOID osal_memcpy (value, gyroData, GYROSCOPE_DATA_LEN ); + break; + + case GYROSCOPE_CONF: + *((uint8*)value) = gyroCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn gyro_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 gyro_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case GYROSCOPE_DATA_UUID: + *pLen = GYROSCOPE_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, GYROSCOPE_DATA_LEN ); + break; + + case GYROSCOPE_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn gyro_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t gyro_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case GYROSCOPE_DATA_UUID: + //Should not get here + break; + + case GYROSCOPE_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &gyroCfg ) + { + notifyApp = GYROSCOPE_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && gyro_AppCBs && gyro_AppCBs->pfnGyroChange ) + { + gyro_AppCBs->pfnGyroChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn gyro_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void gyro_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, gyroDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/gyroservice.h b/Firmware/Radio/Profiles/SensorProfile/gyroservice.h new file mode 100644 index 0000000..97f5184 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/gyroservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: gyroservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Gyroscope service definitions and prototypes + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GYROSERVICE_H +#define GYROSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define GYROSCOPE_DATA 12 // R uint8 - Profile Attribute value +#define GYROSCOPE_CONF 13 // RW uint8 - Profile Attribute value + +// Service UUID +#define GYROSCOPE_SERV_UUID 0xAA50 // F0000000-0451-4000-B000-00000000-AA50 +#define GYROSCOPE_DATA_UUID 0xAA51 +#define GYROSCOPE_CONF_UUID 0xAA52 + +// Sensor Profile Services bit fields +#define GYROSCOPE_SERVICE 0x00000020 + +// Length of sensor data in bytes +#define GYROSCOPE_DATA_LEN 6 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*gyroChange_t)( uint8 paramID ); + +typedef struct +{ + gyroChange_t pfnGyroChange; // Called when characteristic value changes +} gyroCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Gyro_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Gyro_AddService( uint32 services ); + +/* + * Gyro_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Gyro_RegisterAppCBs( gyroCBs_t *appCallbacks ); + +/* + * Gyro_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gyro_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Gyro_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gyro_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GYROSERVICE_H */ diff --git a/Firmware/Radio/Profiles/SensorProfile/humidityservice.c b/Firmware/Radio/Profiles/SensorProfile/humidityservice.c new file mode 100644 index 0000000..fe4230c --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/humidityservice.c @@ -0,0 +1,548 @@ +/************************************************************************************************** + Filename: humidservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Humidity service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "humidityservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static humidityCBs_t *humid_AppCBs = NULL; + +// Humidity Service UUID +CONST uint8 humidServUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_SERV_UUID), +}; + +// Humidity Characteristic value Data UUID +CONST uint8 humidDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_DATA_UUID), +}; + +// Humidity Characteristic value Configuration UUID +CONST uint8 humidCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_CONF_UUID), +}; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// Humidity Profile Service attribute +static CONST gattAttrType_t humidService = { TI_UUID_SIZE, humidServUUID }; + +// Humidity Characteristic Properties +static uint8 humidDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 humidData[HUMIDITY_DATA_LEN] = { 0, 0, 0, 0}; + +// Humidity Characteristic Configuration +static gattCharCfg_t humidDataConfig[GATT_MAX_NUM_CONN]; + +// Humidity Characteristic User Description +static uint8 humidDataUserDesp[12] = "Humid. Data\0"; + +// Humidity Characteristic Configuration Properties +static uint8 humidCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Humidity Characteristic Configuration Value +static uint8 humidCfg = 0; + +// Humidity Characteristic Configuration User Description +static uint8 humidCfgUserDesp[13] = "Humid. Conf.\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t humidAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&humidService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &humidDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, humidDataUUID }, + GATT_PERMIT_READ, + 0, + humidData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)humidDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + humidDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &humidCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, humidCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &humidCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + humidCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 humid_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t humid_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void humid_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t humidCBs = +{ + humid_ReadAttrCB, // Read callback function pointer + humid_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Humidity_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Humidity_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( humid_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, humidDataConfig ); + + if (services & HUMIDITY_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( humidAttrTbl, + GATT_NUM_ATTRS( humidAttrTbl ), + &humidCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Humidity_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Humidity_RegisterAppCBs( humidityCBs_t *appCallbacks ) +{ + if ( humid_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + humid_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Humidity_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Humidity_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HUMIDITY_DATA: + if ( len == HUMIDITY_DATA_LEN ) + { + VOID osal_memcpy( humidData, value, HUMIDITY_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( humidDataConfig, humidData, FALSE, + humidAttrTbl, GATT_NUM_ATTRS( humidAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case HUMIDITY_CONF: + if ( len == sizeof ( uint8 ) ) + { + humidCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Humidity_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Humidity_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HUMIDITY_DATA: + VOID osal_memcpy( value, humidData, HUMIDITY_DATA_LEN ); + break; + + case HUMIDITY_CONF: + *((uint8*)value) = humidCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn humid_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 humid_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case HUMIDITY_DATA_UUID: + *pLen = HUMIDITY_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, HUMIDITY_DATA_LEN ); + break; + + case HUMIDITY_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn humid_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t humid_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case HUMIDITY_DATA_UUID: + //Should not get here + break; + + case HUMIDITY_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + if( pAttr->pValue == &humidCfg ) + { + notifyApp = HUMIDITY_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && humid_AppCBs && humid_AppCBs->pfnIrTempChange ) + { + humid_AppCBs->pfnIrTempChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn humid_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void humid_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, humidDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/humidityservice.h b/Firmware/Radio/Profiles/SensorProfile/humidityservice.h new file mode 100644 index 0000000..6dc2fdb --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/humidityservice.h @@ -0,0 +1,146 @@ +/************************************************************************************************** + Filename: humidityservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Humidity service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HUMIDITYSERVICE_H +#define HUMIDITYSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define HUMIDITY_DATA 5 // R uint8 - Profile Attribute value +#define HUMIDITY_CONF 6 // RW uint8 - Profile Attribute value + +// Service UUID +#define HUMIDITY_SERV_UUID 0xAA20 // F0000000-0451-4000-B000-00000000-AA20 +#define HUMIDITY_DATA_UUID 0xAA21 +#define HUMIDITY_CONF_UUID 0xAA22 + +// Sensor Profile Services bit fields +#define HUMIDITY_SERVICE 0x00000004 + +// Length of sensor data in bytes +#define HUMIDITY_DATA_LEN 4 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*humidityChange_t)( uint8 paramID ); + +typedef struct +{ + humidityChange_t pfnIrTempChange; // Called when characteristic value changes +} humidityCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Humidity_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Humidity_AddService( uint32 services ); + +/* + * Humidity_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Humidity_RegisterAppCBs( humidityCBs_t *appCallbacks ); + +/* + * Humidity_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Humidity_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Humidity_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Humidity_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HUMIDITYSERVICE_H */ + diff --git a/Firmware/Radio/Profiles/SensorProfile/irtempservice.c b/Firmware/Radio/Profiles/SensorProfile/irtempservice.c new file mode 100644 index 0000000..7a99350 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/irtempservice.c @@ -0,0 +1,554 @@ +/************************************************************************************************** + Filename: irtempservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: IR Temperature service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "irtempservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static irTempCBs_t *irTemp_AppCBs = NULL; + +// IR Temperatur Service UUID +CONST uint8 irTempServUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_SERV_UUID), +}; + +// IR Temp Characteristic value Data UUID +CONST uint8 irTempDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_DATA_UUID), +}; + +// IR Temp Characteristic value Configuration UUID +CONST uint8 irTempConfUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_CONF_UUID), +}; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// IR Temperature Profile Service attribute +static CONST gattAttrType_t irTempService = { TI_UUID_SIZE, irTempServUUID }; + +// IR Temperature Characteristic Properties +static uint8 irTempDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +// IR Temperature Characteristic Value +static uint8 irTempData[IRTEMPERATURE_DATA_LEN] = { 0, 0, 0, 0}; + +// IR Temperature Characteristic Configuration +static gattCharCfg_t irTempDataConfig[GATT_MAX_NUM_CONN]; + +// IR Temperature Characteristic User Description +static uint8 irTempDataUserDesp[14] = "IR Temp. Data\0"; + +// IR Temperature Characteristic Configuration Properties +static uint8 irTempCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// IR Temperature Characteristic Configuration Value +static uint8 irTempCfg = 0; + +// IR Temperature Characteristic Configuration User Description +static uint8 irTempCfgUserDesp[15] = "IR Temp. Conf.\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t irTempAttrTbl[] = +{ + // Sensor Profile Services + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&irTempService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &irTempDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, irTempDataUUID }, + GATT_PERMIT_READ, + 0, + irTempData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)irTempDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + irTempDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &irTempCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, irTempConfUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &irTempCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + irTempCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 irTemp_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t irTemp_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void irTemp_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t irTempCBs = +{ + irTemp_ReadAttrCB, // Read callback function pointer + irTemp_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn IRTemp_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t IRTemp_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( irTemp_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, irTempDataConfig ); + + if (services & IRTEMPERATURE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( irTempAttrTbl, + GATT_NUM_ATTRS( irTempAttrTbl ), + &irTempCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn IRTemp_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t IRTemp_RegisterAppCBs( irTempCBs_t *appCallbacks ) +{ + if ( irTemp_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + irTemp_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); + +} + + +/********************************************************************* + * @fn IRTemp_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t IRTemp_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case IRTEMPERATURE_DATA: + if ( len == IRTEMPERATURE_DATA_LEN ) + { + VOID osal_memcpy( irTempData, value, IRTEMPERATURE_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( irTempDataConfig, irTempData, FALSE, + irTempAttrTbl, GATT_NUM_ATTRS( irTempAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case IRTEMPERATURE_CONF: + if ( len == sizeof ( uint8 ) ) + { + irTempCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn IRTemp_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t IRTemp_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case IRTEMPERATURE_DATA: + VOID osal_memcpy (value, irTempData, IRTEMPERATURE_DATA_LEN ); + break; + + case IRTEMPERATURE_CONF: + *((uint8*)value) = irTempCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn irTemp_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 irTemp_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case IRTEMPERATURE_DATA_UUID: + *pLen = IRTEMPERATURE_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, IRTEMPERATURE_DATA_LEN ); + break; + + case IRTEMPERATURE_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn irTemp_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t irTemp_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case IRTEMPERATURE_DATA_UUID: + // Should not get here + break; + + case IRTEMPERATURE_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &irTempCfg ) + { + notifyApp = IRTEMPERATURE_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && irTemp_AppCBs && irTemp_AppCBs->pfnIrTempChange ) + { + irTemp_AppCBs->pfnIrTempChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn irTemp_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void irTemp_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, irTempDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/irtempservice.h b/Firmware/Radio/Profiles/SensorProfile/irtempservice.h new file mode 100644 index 0000000..84d9882 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/irtempservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: irtempservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: IR temperature service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef IRTEMPSERVICE_H +#define IRTEMPSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define IRTEMPERATURE_DATA 0 // R uint8 - Profile Attribute value +#define IRTEMPERATURE_CONF 1 // RW uint8 - Profile Attribute value + +// Service UUID +#define IRTEMPERATURE_SERV_UUID 0xAA00 // F0000000-0451-4000-B000-00000000-AA00 +#define IRTEMPERATURE_DATA_UUID 0xAA01 +#define IRTEMPERATURE_CONF_UUID 0xAA02 + +// Sensor Profile Services bit fields +#define IRTEMPERATURE_SERVICE 0x00000001 + +// Length of sensor data in bytes +#define IRTEMPERATURE_DATA_LEN 4 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*irTempChange_t)( uint8 paramID ); + +typedef struct +{ + irTempChange_t pfnIrTempChange; // Called when characteristic value changes +} irTempCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * IRTemp_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t IRTemp_AddService( uint32 services ); + +/* + * IRTemp_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t IRTemp_RegisterAppCBs( irTempCBs_t *appCallbacks ); + +/* + * IRTemp_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t IRTemp_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * IRTemp_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t IRTemp_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* IRTEMPSERVICE_H */ + diff --git a/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.c b/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.c new file mode 100644 index 0000000..4bc2ece --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.c @@ -0,0 +1,632 @@ +/************************************************************************************************** + Filename: magnetometerservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Magnetometer Service + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "magnetometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Magnetometer Service UUID +CONST uint8 magnetometerServUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_SERV_UUID), +}; + +// Magnetometer Characteristic value Data UUID +CONST uint8 magnetometerDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_DATA_UUID), +}; + +// Magnetometer Characteristic value Configuration UUID +CONST uint8 magnetometerCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_CONF_UUID), +}; + +// Magnetometer Characteristic value Period UUID +CONST uint8 magnetometerPerUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_PERI_UUID), +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static magnetometerCBs_t *magnetometer_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Magnetometer Profile Service attribute +static CONST gattAttrType_t magnetometerService = { TI_UUID_SIZE, magnetometerServUUID }; + +// Magnetometer Characteristic Properties +static uint8 magnetometerDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 magnetometerData[MAGNETOMETER_DATA_LEN] = { 0, 0, 0, 0, 0, 0}; + +// Magnetometer Characteristic Configuration +static gattCharCfg_t magnetometerDataConfig[GATT_MAX_NUM_CONN]; + +// Magnetometer Characteristic User Description +static uint8 magnetometerDataUserDesp[10] = "Mag. Data\0"; + +// Magnetometer Characteristic Configuration Properties +static uint8 magnetometerCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Magnetometer Characteristic Configuration Value +static uint8 magnetometerCfg = 0; + +// Magnetometer Characteristic Configuration User Description +static uint8 magnetometerCfgUserDesp[11] = "Mag. Conf.\0"; + +// Magnetometer Characteristic Period Properties +static uint8 magnetometerPerProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Magnetometer Characteristic Period Value +static uint8 magnetometerPer = 0; + +// Magnetometer Characteristic Period User Description +static uint8 magnetometerPerUserDesp[12] = "Mag. Period\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + + +static gattAttribute_t sensorMagnetometerAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&magnetometerService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, magnetometerDataUUID }, + GATT_PERMIT_READ, + 0, + magnetometerData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)magnetometerDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, magnetometerCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &magnetometerCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerCfgUserDesp + }, + + // Characteristic Declaration "Period" + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerPerProps + }, + + // Characteristic Value "Period" + { + { TI_UUID_SIZE, magnetometerPerUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &magnetometerPer + }, + + // Characteristic User Description "Period" + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerPerUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 magnetometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t magnetometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void magnetometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Magnetometer Profile Service Callbacks +CONST gattServiceCBs_t magnetometerCBs = +{ + magnetometer_ReadAttrCB, // Read callback function pointer + magnetometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Magnetometer_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Magnetometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, magnetometerDataConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( magnetometer_HandleConnStatusCB ); + + if ( services & MAGNETOMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorMagnetometerAttrTbl, + GATT_NUM_ATTRS( sensorMagnetometerAttrTbl ), + &magnetometerCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Magnetometer_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Magnetometer_RegisterAppCBs( magnetometerCBs_t *appCallbacks ) +{ + if ( magnetometer_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + magnetometer_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + + +/********************************************************************* + * @fn Magnetometer_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Magnetometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case MAGNETOMETER_DATA: + if ( len == MAGNETOMETER_DATA_LEN ) + { + VOID osal_memcpy( magnetometerData, value, MAGNETOMETER_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( magnetometerDataConfig, magnetometerData, FALSE, + sensorMagnetometerAttrTbl, GATT_NUM_ATTRS( sensorMagnetometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case MAGNETOMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + magnetometerCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case MAGNETOMETER_PERI: + if ( len == sizeof ( uint8 ) ) + { + magnetometerPer = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Magnetometer_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Magnetometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case MAGNETOMETER_DATA: + VOID osal_memcpy( value, magnetometerData, MAGNETOMETER_DATA_LEN ); + break; + + case MAGNETOMETER_CONF: + *((uint8*)value) = magnetometerCfg; + break; + + case MAGNETOMETER_PERI: + *((uint8*)value) = magnetometerPer; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn magnetometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 magnetometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case MAGNETOMETER_DATA_UUID: + *pLen = MAGNETOMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, MAGNETOMETER_DATA_LEN ); + break; + + case MAGNETOMETER_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + case MAGNETOMETER_PERI_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn magnetometer_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t magnetometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case MAGNETOMETER_DATA_UUID: + //Should not get here + break; + + case MAGNETOMETER_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &magnetometerCfg ) + { + notifyApp = MAGNETOMETER_CONF; + } + } + break; + + case MAGNETOMETER_PERI_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + if( pAttr->pValue == &magnetometerPer ) + { + notifyApp = MAGNETOMETER_PERI; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && magnetometer_AppCBs && magnetometer_AppCBs->pfnMagnetometerChange ) + { + magnetometer_AppCBs->pfnMagnetometerChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn magnetometer_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void magnetometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, magnetometerDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.h b/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.h new file mode 100644 index 0000000..2b121bd --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/magnetometerservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: magnetometerservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Magnetometer service definitions and prototypes + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef MAGNETOMETERSERVICE_H +#define MAGNETOMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define MAGNETOMETER_DATA 7 // R uint8 - Profile Attribute value +#define MAGNETOMETER_CONF 8 // RW uint8 - Profile Attribute value +#define MAGNETOMETER_PERI 9 // RW uint8 - Profile Attribute value + +// Service UUID +#define MAGNETOMETER_SERV_UUID 0xAA30 // F0000000-0451-4000-B000-00000000-AA30 +#define MAGNETOMETER_DATA_UUID 0xAA31 +#define MAGNETOMETER_CONF_UUID 0xAA32 +#define MAGNETOMETER_PERI_UUID 0xAA33 + +// Sensor Profile Services bit fields +#define MAGNETOMETER_SERVICE 0x00000008 + +// Length of sensor data in bytes +#define MAGNETOMETER_DATA_LEN 6 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*magnetometerChange_t)( uint8 paramID ); + +typedef struct +{ + magnetometerChange_t pfnMagnetometerChange; // Called when characteristic value changes +} magnetometerCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Magnetometer_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Magnetometer_AddService( uint32 services ); + +/* + * Magnetometer_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Magnetometer_RegisterAppCBs( magnetometerCBs_t *appCallbacks ); + +/* + * Magnetometer_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Magnetometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Magnetometer_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Magnetometer_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* MAGNETOMETERSERVICE_H */ diff --git a/Firmware/Radio/Profiles/SensorProfile/st_util.c b/Firmware/Radio/Profiles/SensorProfile/st_util.c new file mode 100644 index 0000000..036d78c --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/st_util.c @@ -0,0 +1,87 @@ +/************************************************************************************************** + Filename: st_util.c + Revised: $Date: 2012-09-25 06:26:26 -0700 (Tue, 25 Sep 2012) $ + Revision: $Revision: 31617 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "gatt.h" +#include "st_util.h" + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pUuid - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pUuid) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID direct + *pUuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); +#ifdef GATT_TI_UUID_128_BIT + } + else if (pAttr->type.len == ATT_UUID_SIZE) + { + // 16-bit UUID extracted bytes 12 and 13 + *pUuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]); +#endif + } else { + *pUuid = 0xFFFF; + status = FAILURE; + } + + return status; +} + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Profiles/SensorProfile/st_util.h b/Firmware/Radio/Profiles/SensorProfile/st_util.h new file mode 100644 index 0000000..a0c3a79 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/st_util.h @@ -0,0 +1,79 @@ +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ST_UTIL_H +#define ST_UTIL_H + +/********************************************************************* + * MACROS + */ +#ifdef GATT_TI_UUID_128_BIT + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 +#define TI_UUID_SIZE ATT_UUID_SIZE +#define TI_UUID(uuid) TI_BASE_UUID_128(uuid) + +#else + +// Using 16-bit UUID +#define TI_UUID_SIZE ATT_BT_UUID_SIZE +#define TI_UUID(uuid) LO_UINT16(uuid), HI_UINT16(uuid) + +#endif + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + +#endif /* ST_UTIL_H */ + diff --git a/Firmware/Radio/Profiles/SensorProfile/testservice.c b/Firmware/Radio/Profiles/SensorProfile/testservice.c new file mode 100644 index 0000000..da906ff --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/testservice.c @@ -0,0 +1,539 @@ +/************************************************************************************************** + Filename: testservice.c + Revised: $Date: 2012-08-16 11:43:20 -0700 (Thu, 16 Aug 2012) $ + Revision: $Revision: 31269 $ + + Description: Test Service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "testservice.h" +#include "st_util.h" + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Test GATT Profile Service UUID +CONST uint8 testServUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_SERV_UUID) +}; + +// Data Characteristic UUID +CONST uint8 testDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_DATA_UUID) +}; + +// Config Characteristic UUID +CONST uint8 testConfUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_CONF_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static testCBs_t *test_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Test Profile Service attribute +static CONST gattAttrType_t testService = { TI_UUID_SIZE, testServUUID }; + +// Test Profile Data Characteristic Properties +static uint8 testDataProps = GATT_PROP_READ; + +// Test Profile Data Characteristic Value +static uint8 testData[TEST_DATA_LEN] = {0,0}; + +// Test Characteristic Configuration +static gattCharCfg_t testDataConfig[GATT_MAX_NUM_CONN]; + +// Test Profile Data Characteristic User Description +static uint8 testDataUserDesp[] = "Test Data\0"; + +// Test Profile Config Characteristic Properties +static uint8 testConfProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Test Profile Config Characteristic Value +static uint8 testConf = 0; + +// Test Profile Config Characteristic User Description +static uint8 testConfUserDesp[] = "Test Config\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t testAttrTbl[] = +{ + // Test Profile Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&testService /* pValue */ + }, + + // Data Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &testDataProps + }, + + // Data Characteristic Value + { + { TI_UUID_SIZE, testDataUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + testData + }, + + // Data Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + testDataUserDesp + }, + + // Config Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &testConfProps + }, + + // Config Characteristic Value + { + { TI_UUID_SIZE, testConfUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &testConf + }, + + // Config Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + testConfUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 test_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t test_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void test_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Test Profile Service Callbacks +CONST gattServiceCBs_t testCBs = +{ + test_ReadAttrCB, // Read callback function pointer + test_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Test_AddService + * + * @brief Initializes the Test Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Test_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, testDataConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( test_HandleConnStatusCB ); + + if ( services & TEST_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( testAttrTbl, + GATT_NUM_ATTRS( testAttrTbl ), + &testCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Test_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Test_RegisterAppCBs( testCBs_t *appCallbacks ) +{ + if ( test_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + test_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); + +} + +/********************************************************************* + * @fn TestProfile_SetParameter + * + * @brief Set a Test Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Test_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case TEST_DATA_ATTR: + if ( len == TEST_DATA_LEN ) + { + VOID osal_memcpy( testData, value, TEST_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( testDataConfig, testData, FALSE, + testAttrTbl, GATT_NUM_ATTRS( testAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case TEST_CONF_ATTR: + if(len == sizeof ( uint8 ) ) + { + testConf = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn TestProfile_GetParameter + * + * @brief Get a Test Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Test_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case TEST_DATA_ATTR: + VOID osal_memcpy (value, testData, TEST_DATA_LEN ); + break; + + case TEST_CONF_ATTR: + *((uint8*)value) = testConf; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn test_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 test_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case TEST_DATA_UUID: + *pLen = TEST_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, TEST_DATA_LEN ); + break; + + case TEST_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn test_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t test_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + uint16 uuid; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case TEST_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &testConf ) + { + notifyApp = TEST_CONF_ATTR; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! (characteristics 2 and 4 do not have write permissions) + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && test_AppCBs && test_AppCBs->pfnTestChange ) + { + test_AppCBs->pfnTestChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn test_HandleConnStatusCB + * + * @brief Test Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void test_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, testDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SensorProfile/testservice.h b/Firmware/Radio/Profiles/SensorProfile/testservice.h new file mode 100644 index 0000000..e689589 --- /dev/null +++ b/Firmware/Radio/Profiles/SensorProfile/testservice.h @@ -0,0 +1,147 @@ +/************************************************************************************************** + Filename: testservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Test service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef TESTSERVICE_H +#define TESTSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Test Service Parameters +#define TEST_DATA_ATTR 0 // RW uint8 - Profile Attribute value +#define TEST_CONF_ATTR 1 // RW uint8 - Profile Attribute value + +// Service UUID +#define TEST_SERV_UUID 0xAA60 // F0000000-0451-4000-B000-00000000-AA60 +#define TEST_DATA_UUID 0xAA61 +#define TEST_CONF_UUID 0xAA62 + +// Test Profile Services bit fields +#define TEST_SERVICE 0x00000001 + +// Test Data Length +#define TEST_DATA_LEN 2 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*testChange_t)( uint8 paramID ); + +typedef struct +{ + testChange_t pfnTestChange; // Called when characteristic value changes +} testCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Test_AddService- Initializes the Test Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Test_AddService( uint32 services ); + +/* + * Test_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Test_RegisterAppCBs( testCBs_t *appCallbacks ); + +/* + * Test_SetParameter - Set a Test Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Test_SetParameter( uint8 param, uint8 len, void *pValue ); + +/* + * Test_GetParameter - Get a Test Profile parameter. + * + * param - Profile parameter ID + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Test_GetParameter( uint8 param, void *pValue ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* TESTPROFILE_H */ diff --git a/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.c b/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.c new file mode 100644 index 0000000..7707d6f --- /dev/null +++ b/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.c @@ -0,0 +1,745 @@ +/************************************************************************************************** + Filename: simpleGATTprofile.c + Revised: $Date: 2010-08-06 08:56:11 -0700 (Fri, 06 Aug 2010) $ + Revision: $Revision: 23333 $ + + Description: This file contains the Simple GATT profile sample GATT service + profile for use with the BLE sample application. + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "simpleGATTprofile.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 17 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Simple GATT Profile Service UUID: 0xFFF0 +CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID) +}; + +// Characteristic 1 UUID: 0xFFF1 +CONST uint8 simpleProfilechar1UUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_CHAR1_UUID), HI_UINT16(SIMPLEPROFILE_CHAR1_UUID) +}; + +// Characteristic 2 UUID: 0xFFF2 +CONST uint8 simpleProfilechar2UUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_CHAR2_UUID), HI_UINT16(SIMPLEPROFILE_CHAR2_UUID) +}; + +// Characteristic 3 UUID: 0xFFF3 +CONST uint8 simpleProfilechar3UUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_CHAR3_UUID), HI_UINT16(SIMPLEPROFILE_CHAR3_UUID) +}; + +// Characteristic 4 UUID: 0xFFF4 +CONST uint8 simpleProfilechar4UUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_CHAR4_UUID), HI_UINT16(SIMPLEPROFILE_CHAR4_UUID) +}; + +// Characteristic 5 UUID: 0xFFF5 +CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static simpleProfileCBs_t *simpleProfile_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Simple Profile Service attribute +static CONST gattAttrType_t simpleProfileService = { ATT_BT_UUID_SIZE, simpleProfileServUUID }; + + +// Simple Profile Characteristic 1 Properties +static uint8 simpleProfileChar1Props = GATT_PROP_READ | GATT_PROP_WRITE; + +// Characteristic 1 Value +static uint8 simpleProfileChar1 = 0; + +// Simple Profile Characteristic 1 User Description +static uint8 simpleProfileChar1UserDesp[17] = "Characteristic 1\0"; + + +// Simple Profile Characteristic 2 Properties +static uint8 simpleProfileChar2Props = GATT_PROP_READ; + +// Characteristic 2 Value +static uint8 simpleProfileChar2 = 0; + +// Simple Profile Characteristic 2 User Description +static uint8 simpleProfileChar2UserDesp[17] = "Characteristic 2\0"; + + +// Simple Profile Characteristic 3 Properties +static uint8 simpleProfileChar3Props = GATT_PROP_WRITE; + +// Characteristic 3 Value +static uint8 simpleProfileChar3 = 0; + +// Simple Profile Characteristic 3 User Description +static uint8 simpleProfileChar3UserDesp[17] = "Characteristic 3\0"; + + +// Simple Profile Characteristic 4 Properties +static uint8 simpleProfileChar4Props = GATT_PROP_NOTIFY; + +// Characteristic 4 Value +static uint8 simpleProfileChar4 = 0; + +// Simple Profile Characteristic 4 Configuration Each client has its own +// instantiation of the Client Characteristic Configuration. Reads of the +// Client Characteristic Configuration only shows the configuration for +// that client and writes only affect the configuration of that client. +static gattCharCfg_t simpleProfileChar4Config[GATT_MAX_NUM_CONN]; + +// Simple Profile Characteristic 4 User Description +static uint8 simpleProfileChar4UserDesp[17] = "Characteristic 4\0"; + + +// Simple Profile Characteristic 5 Properties +static uint8 simpleProfileChar5Props = GATT_PROP_READ; + +// Characteristic 5 Value +static uint8 simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = { 0, 0, 0, 0, 0 }; + +// Simple Profile Characteristic 5 User Description +static uint8 simpleProfileChar5UserDesp[17] = "Characteristic 5\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Simple Profile Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&simpleProfileService /* pValue */ + }, + + // Characteristic 1 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar1Props + }, + + // Characteristic Value 1 + { + { ATT_BT_UUID_SIZE, simpleProfilechar1UUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &simpleProfileChar1 + }, + + // Characteristic 1 User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + simpleProfileChar1UserDesp + }, + + // Characteristic 2 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar2Props + }, + + // Characteristic Value 2 + { + { ATT_BT_UUID_SIZE, simpleProfilechar2UUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar2 + }, + + // Characteristic 2 User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + simpleProfileChar2UserDesp + }, + + // Characteristic 3 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar3Props + }, + + // Characteristic Value 3 + { + { ATT_BT_UUID_SIZE, simpleProfilechar3UUID }, + GATT_PERMIT_WRITE, + 0, + &simpleProfileChar3 + }, + + // Characteristic 3 User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + simpleProfileChar3UserDesp + }, + + // Characteristic 4 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar4Props + }, + + // Characteristic Value 4 + { + { ATT_BT_UUID_SIZE, simpleProfilechar4UUID }, + 0, + 0, + &simpleProfileChar4 + }, + + // Characteristic 4 configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)simpleProfileChar4Config + }, + + // Characteristic 4 User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + simpleProfileChar4UserDesp + }, + + // Characteristic 5 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &simpleProfileChar5Props + }, + + // Characteristic Value 5 + { + { ATT_BT_UUID_SIZE, simpleProfilechar5UUID }, + GATT_PERMIT_AUTHEN_READ, + 0, + simpleProfileChar5 + }, + + // Characteristic 5 User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + simpleProfileChar5UserDesp + }, + + +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void simpleProfile_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t simpleProfileCBs = +{ + simpleProfile_ReadAttrCB, // Read callback function pointer + simpleProfile_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn SimpleProfile_AddService + * + * @brief Initializes the Simple Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t SimpleProfile_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, simpleProfileChar4Config ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( simpleProfile_HandleConnStatusCB ); + + if ( services & SIMPLEPROFILE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( simpleProfileAttrTbl, + GATT_NUM_ATTRS( simpleProfileAttrTbl ), + &simpleProfileCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn SimpleProfile_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t SimpleProfile_RegisterAppCBs( simpleProfileCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + simpleProfile_AppCBs = appCallbacks; + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + + +/********************************************************************* + * @fn SimpleProfile_SetParameter + * + * @brief Set a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SIMPLEPROFILE_CHAR1: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar1 = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR2: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar2 = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR3: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar3 = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR4: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar4 = *((uint8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( simpleProfileChar4Config, &simpleProfileChar4, FALSE, + simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case SIMPLEPROFILE_CHAR5: + if ( len == SIMPLEPROFILE_CHAR5_LEN ) + { + VOID osal_memcpy( simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn SimpleProfile_GetParameter + * + * @brief Get a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SIMPLEPROFILE_CHAR1: + *((uint8*)value) = simpleProfileChar1; + break; + + case SIMPLEPROFILE_CHAR2: + *((uint8*)value) = simpleProfileChar2; + break; + + case SIMPLEPROFILE_CHAR3: + *((uint8*)value) = simpleProfileChar3; + break; + + case SIMPLEPROFILE_CHAR4: + *((uint8*)value) = simpleProfileChar4; + break; + + case SIMPLEPROFILE_CHAR5: + VOID osal_memcpy( value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN ); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn simpleProfile_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + + // characteristics 1 and 2 have read permissions + // characteritisc 3 does not have read permissions; therefore it is not + // included here + // characteristic 4 does not have read permissions, but because it + // can be sent as a notification, it is included here + case SIMPLEPROFILE_CHAR1_UUID: + case SIMPLEPROFILE_CHAR2_UUID: + case SIMPLEPROFILE_CHAR4_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + case SIMPLEPROFILE_CHAR5_UUID: + *pLen = SIMPLEPROFILE_CHAR5_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN ); + break; + + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn simpleProfile_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case SIMPLEPROFILE_CHAR1_UUID: + case SIMPLEPROFILE_CHAR3_UUID: + + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &simpleProfileChar1 ) + { + notifyApp = SIMPLEPROFILE_CHAR1; + } + else + { + notifyApp = SIMPLEPROFILE_CHAR3; + } + } + + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! (characteristics 2 and 4 do not have write permissions) + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange ) + { + simpleProfile_AppCBs->pfnSimpleProfileChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn simpleProfile_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void simpleProfile_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, simpleProfileChar4Config ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.h b/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.h new file mode 100644 index 0000000..605e51a --- /dev/null +++ b/Firmware/Radio/Profiles/SimpleProfile/simpleGATTprofile.h @@ -0,0 +1,156 @@ +/************************************************************************************************** + Filename: simpleGATTprofile.h + Revised: $Date: 2010-08-06 08:56:11 -0700 (Fri, 06 Aug 2010) $ + Revision: $Revision: 23333 $ + + Description: This file contains the Simple GATT profile definitions and + prototypes. + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SIMPLEGATTPROFILE_H +#define SIMPLEGATTPROFILE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define SIMPLEPROFILE_CHAR1 0 // RW uint8 - Profile Characteristic 1 value +#define SIMPLEPROFILE_CHAR2 1 // RW uint8 - Profile Characteristic 2 value +#define SIMPLEPROFILE_CHAR3 2 // RW uint8 - Profile Characteristic 3 value +#define SIMPLEPROFILE_CHAR4 3 // RW uint8 - Profile Characteristic 4 value +#define SIMPLEPROFILE_CHAR5 4 // RW uint8 - Profile Characteristic 4 value + +// Simple Profile Service UUID +#define SIMPLEPROFILE_SERV_UUID 0xFFF0 + +// Key Pressed UUID +#define SIMPLEPROFILE_CHAR1_UUID 0xFFF1 +#define SIMPLEPROFILE_CHAR2_UUID 0xFFF2 +#define SIMPLEPROFILE_CHAR3_UUID 0xFFF3 +#define SIMPLEPROFILE_CHAR4_UUID 0xFFF4 +#define SIMPLEPROFILE_CHAR5_UUID 0xFFF5 + +// Simple Keys Profile Services bit fields +#define SIMPLEPROFILE_SERVICE 0x00000001 + +// Length of Characteristic 5 in bytes +#define SIMPLEPROFILE_CHAR5_LEN 5 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*simpleProfileChange_t)( uint8 paramID ); + +typedef struct +{ + simpleProfileChange_t pfnSimpleProfileChange; // Called when characteristic value changes +} simpleProfileCBs_t; + + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * SimpleProfile_AddService- Initializes the Simple GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t SimpleProfile_AddService( uint32 services ); + +/* + * SimpleProfile_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t SimpleProfile_RegisterAppCBs( simpleProfileCBs_t *appCallbacks ); + +/* + * SimpleProfile_SetParameter - Set a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * SimpleProfile_GetParameter - Get a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEGATTPROFILE_H */ diff --git a/Firmware/Radio/Profiles/Thermometer/thermometerservice.c b/Firmware/Radio/Profiles/Thermometer/thermometerservice.c new file mode 100644 index 0000000..f6967f9 --- /dev/null +++ b/Firmware/Radio/Profiles/Thermometer/thermometerservice.c @@ -0,0 +1,758 @@ +/************************************************************************************************** + Filename: thermometerService.c + Revised: $Date: 2011-05-05 08:56:11 -0700 (Thur, 05 MAY 2011) $ + Revision: $Revision: 23333 $ + + Description: This file contains the Simple BLE Peripheral sample application + for use with the CC2540 Bluetooth Low Energy Protocol Stack. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "thermometerservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Thermometer service +CONST uint8 thermometerServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_SERV_UUID), HI_UINT16(THERMOMETER_SERV_UUID) +}; + +// Thermometer temperature characteristic +CONST uint8 thermometerTempUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_TEMP_UUID), HI_UINT16(THERMOMETER_TEMP_UUID) +}; + +// Thermometer Site +CONST uint8 thermometerTypeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_TYPE_UUID), HI_UINT16(THERMOMETER_TYPE_UUID) +}; + +// Thermometer Immediate Measurement +CONST uint8 thermometerImeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_IMEAS_UUID), HI_UINT16(THERMOMETER_IMEAS_UUID) +}; + +// Thermometer Measurement Interval +CONST uint8 thermometerIntervalUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_INTERVAL_UUID), HI_UINT16(THERMOMETER_INTERVAL_UUID) +}; + +// Thermometer Test Commands +CONST uint8 thermometerIRangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_IRANGE_UUID), HI_UINT16(THERMOMETER_IRANGE_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static thermometerServiceCB_t thermometerServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Thermometer Service attribute +static CONST gattAttrType_t thermometerService = { ATT_BT_UUID_SIZE, thermometerServUUID }; + +// Client Characteristic configuration. Each client has its own instantiation +// of the Client Characteristic Configuration. Reads of the Client Characteristic +// Configuration only shows the configuration for that client and writes only +// affect the configuration of that client. + +// Thermometer Temperature Characteristic +static uint8 thermometerTempProps = GATT_PROP_INDICATE; +static uint8 thermometerTemp = 0; +static gattCharCfg_t thermometerTempConfig[GATT_MAX_NUM_CONN]; +static uint8 thermometerTempFormat = 12; + +// Site +static uint8 thermometerTypeProps = GATT_PROP_READ; +static uint8 thermometerType = 0; + +// Intermediate Measurement +static uint8 thermometerImeasProps = GATT_PROP_NOTIFY; +static uint8 thermometerImeas=0; +static gattCharCfg_t thermometerIMeasConfig[GATT_MAX_NUM_CONN]; + +// Measurement Interval +static uint8 thermometerIntervalProps = GATT_PROP_INDICATE|GATT_PROP_READ|GATT_PROP_WRITE; +static uint8 thermometerInterval=30; //default +static gattCharCfg_t thermometerIntervalConfig[GATT_MAX_NUM_CONN]; + +// Measurement Interval Range +static thermometerIRange_t thermometerIRange = {1,60}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t thermometerAttrTbl[] = +{ + // Thermometer Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&thermometerService /* pValue */ + }, + + + // TEMPERATURE + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerTempProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerTempUUID }, + 0, + 0, + &thermometerTemp + }, + + // 3. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerTempConfig + }, + // 4. Presentation Format + { + { ATT_BT_UUID_SIZE, charFormatUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&thermometerTempFormat + }, + + // MEASUREMENT TYPE + + // 5. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerTypeProps + }, + + // 6. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerTypeUUID }, + GATT_PERMIT_READ, + 0, + &thermometerType + }, + + // IMMEDIATE MEASUREMENT + + // 7. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerImeasProps + }, + + // 8. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerImeasUUID }, + 0, + 0, + &thermometerImeas + }, + + // 9. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerIMeasConfig + }, + + // INTERVAL + + // 10. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerIntervalProps + }, + + // 11. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerIntervalUUID }, + GATT_PERMIT_READ | GATT_PERMIT_AUTHEN_WRITE, + 0, + &thermometerInterval + }, + // 12. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerIntervalConfig + }, + // 13. Interval Range + { + { ATT_BT_UUID_SIZE, thermometerIRangeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&thermometerIRange + }, +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 thermometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t thermometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void thermometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Thermometer Service Callbacks +CONST gattServiceCBs_t thermometerCBs = +{ + thermometer_ReadAttrCB, // Read callback function pointer + thermometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Thermometer_AddService + * + * @brief Initializes the Thermometer service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Thermometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerTempConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerIMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerIntervalConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( thermometer_HandleConnStatusCB ); + + if ( services & THERMOMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( thermometerAttrTbl, + GATT_NUM_ATTRS( thermometerAttrTbl ), + &thermometerCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Thermometer_Register + * + * @brief Register a callback function with the Thermometer Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void Thermometer_Register( thermometerServiceCB_t pfnServiceCB ) +{ + thermometerServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Thermometer_SetParameter + * + * @brief Set a thermomter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Thermometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + case THERMOMETER_TYPE: + thermometerType = *((uint8*)value); + break; + + case THERMOMETER_INTERVAL: + thermometerInterval = *((uint8*)value); + break; + + case THERMOMETER_TEMP_CHAR_CFG: + // Need connection handle + //thermometerTempConfig.value = *((uint8*)value); + break; + + case THERMOMETER_IMEAS_CHAR_CFG: + // Need connection handle + //thermometerIMeasConfig.value = *((uint8*)value); + break; + + case THERMOMETER_INTERVAL_CHAR_CFG: + // Need connection handle + //thermometerIntervalConfig.value = *((uint8*)value); + break; + + case THERMOMETER_IRANGE: + thermometerIRange = *((thermometerIRange_t*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Thermometer_GetParameter + * + * @brief Get a Thermometer parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Thermometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case THERMOMETER_TYPE: + *((uint8*)value) = thermometerType; + break; + + case THERMOMETER_INTERVAL: + *((uint8*)value) = thermometerInterval; + break; + + case THERMOMETER_IRANGE: + *((thermometerIRange_t*)value) = thermometerIRange; + break; + + case THERMOMETER_TEMP_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerTempConfig.value; + break; + + case THERMOMETER_IMEAS_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerIMeasConfig.value; + break; + + case THERMOMETER_INTERVAL_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerIntervalConfig.value; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Thermometer_TempIndicate + * + * @brief Send a indication containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_TempIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerTempConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle (uses stored relative handle to lookup actual handle) + pNoti->handle = thermometerAttrTbl[pNoti->handle].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn Thermometer_IntervalIndicate + * + * @brief Send a interval change indication + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_IntervalIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerIntervalConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle (uses stored relative handle to lookup actual handle) + pNoti->handle = thermometerAttrTbl[pNoti->handle].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn Thermometer_IMeasNotify + * + * @brief Send a notification containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerIMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = thermometerAttrTbl[THERMOMETER_IMEAS_VALUE_POS].handle; + + // Send the Notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn thermometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 thermometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case THERMOMETER_TYPE_UUID: + *pLen = THERMOMETER_TYPE_LEN; + VOID osal_memcpy( pValue, &thermometerType, THERMOMETER_TYPE_LEN ) ; + break; + + case THERMOMETER_INTERVAL_UUID: + *pLen = THERMOMETER_INTERVAL_LEN; + VOID osal_memcpy( pValue, &thermometerInterval, THERMOMETER_INTERVAL_LEN ) ; + break; + + case THERMOMETER_IRANGE_UUID: + *pLen = THERMOMETER_IRANGE_LEN; + VOID osal_memcpy( pValue, &thermometerIRange, THERMOMETER_IRANGE_LEN ) ; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + + return ( status ); +} + +/********************************************************************* + * @fn thermometer_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * @param complete - whether this is the last packet + * @param oper - whether to validate and/or write attribute value + * + * @return Success or Failure + */ +static bStatus_t thermometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + // Validate/Write Temperature measurement setting + if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_TEMP_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_TEMP_IND_DISABLED : + THERMOMETER_TEMP_IND_ENABLED ); + } + } + // Validate/Write Intermediate measurement setting + else if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_IMEAS_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + // Notify application + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_IMEAS_NOTI_DISABLED : + THERMOMETER_IMEAS_NOTI_ENABLED); + } + } + // Validate/Write Interval Client Char Config + else if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_INTERVAL_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + // Notify application + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_INTERVAL_IND_DISABLED : + THERMOMETER_INTERVAL_IND_ENABLED); + } + else + { + status = ATT_ERR_INVALID_HANDLE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + case THERMOMETER_INTERVAL_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != THERMOMETER_INTERVAL_LEN ) + status = ATT_ERR_INVALID_VALUE_SIZE; + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //validate range + if ((*pValue >= thermometerIRange.high) | ((*pValue <= thermometerIRange.low) & (*pValue != 0))) + { + status = ATT_ERR_INVALID_VALUE; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + // *pCurValue = *pValue; + VOID osal_memcpy( pCurValue, pValue, THERMOMETER_INTERVAL_LEN ) ; + + //notify application of write + (*thermometerServiceCB)(THERMOMETER_INTERVAL_SET); + + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + + +/********************************************************************* + * @fn thermometer_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void thermometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, thermometerTempConfig ); + GATTServApp_InitCharCfg( connHandle, thermometerIMeasConfig ); + GATTServApp_InitCharCfg( connHandle, thermometerIntervalConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Profiles/Thermometer/thermometerservice.h b/Firmware/Radio/Profiles/Thermometer/thermometerservice.h new file mode 100644 index 0000000..a9f4a6f --- /dev/null +++ b/Firmware/Radio/Profiles/Thermometer/thermometerservice.h @@ -0,0 +1,238 @@ +/************************************************************************************************** + Filename: ThermomterService.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Thermometer service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef THERMOMETERSERVICE_H +#define THERMOMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Thermometer Service Parameters +#define THERMOMETER_TEMP 0 +#define THERMOMETER_TEMP_CHAR_CFG 1 +#define THERMOMETER_TYPE 2 +#define THERMOMETER_INTERVAL 3 +#define THERMOMETER_INTERVAL_CHAR_CFG 4 +#define THERMOMETER_IMEAS_CHAR_CFG 5 +#define THERMOMETER_IRANGE 6 + + +// Position in attribute array +#define THERMOMETER_TEMP_VALUE_POS 2 +#define THERMOMETER_TEMP_CHAR_CONFIG_POS 3 +#define THERMOMETER_IMEAS_VALUE_POS 8 +#define THERMOMETER_IMEAS_CHAR_CONFIG_POS 9 +#define THERMOMETER_INTERVAL_VALUE_POS 11 +#define THERMOMETER_INTERVAL_CHAR_CONFIG_POS 12 + + // Length of bytes +#define THERMOMETER_INTERVAL_LEN 1 +#define THERMOMETER_TYPE_LEN 1 +#define THERMOMETER_IRANGE_LEN 2 + +// Thermometer Service UUIDs +#define THERMOMETER_SERV_UUID 0x1809 //thermometer service +#define THERMOMETER_TEMP_UUID 0x2A1C //temperature +#define THERMOMETER_TYPE_UUID 0x2A1D //meas site, type +#define THERMOMETER_IMEAS_UUID 0x2A1E //immediate meas +#define THERMOMETER_INTERVAL_UUID 0x2A21 //meas interval +#define THERMOMETER_IRANGE_UUID 0x2906 //valid range UUID + +// Maximum length of thermometer +// measurement characteristic +#define THERMOMETER_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define THERMOMETER_FLAGS_CELCIUS 0x00 +#define THERMOMETER_FLAGS_FARENHEIT 0x01 +#define THERMOMETER_FLAGS_TIMESTAMP 0x02 +#define THERMOMETER_FLAGS_TYPE 0x04 + +// Values for sensor location +#define THERMOMETER_TYPE_ARMPIT 0x01 +#define THERMOMETER_TYPE_BODY 0x02 +#define THERMOMETER_TYPE_EAR 0x03 +#define THERMOMETER_TYPE_FINGER 0x04 +#define THERMOMETER_TYPE_GASTRO 0x05 +#define THERMOMETER_TYPE_MOUTH 0x06 +#define THERMOMETER_TYPE_RECTUM 0x07 +#define THERMOMETER_TYPE_TOE 0x08 +#define THERMOMETER_TYPE_TYMPNUM 0x09 + +// Thermometer Service bit fields +#define THERMOMETER_SERVICE 0x00000001 + +// Callback events +#define THERMOMETER_TEMP_IND_ENABLED 1 +#define THERMOMETER_TEMP_IND_DISABLED 2 +#define THERMOMETER_IMEAS_NOTI_ENABLED 3 +#define THERMOMETER_IMEAS_NOTI_DISABLED 4 +#define THERMOMETER_INTERVAL_IND_ENABLED 5 +#define THERMOMETER_INTERVAL_IND_DISABLED 6 +#define THERMOMETER_INTERVAL_SET 7 +#define THERMOMETER_TESTCMD_C 8 +#define THERMOMETER_TESTCMD_F 9 + +/********************************************************************* + * TYPEDEFS + */ + +// Thermometer Service callback function +typedef void (*thermometerServiceCB_t)(uint8 event); + +/** + * Thermometer Interval Range + */ +typedef struct +{ + uint8 low; + uint8 high; +} thermometerIRange_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Thermometer_AddService- Initializes the Thermometer service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t Thermometer_AddService( uint32 services ); + +/* + * Thermometer_Register - Register a callback function with the + * Thermometer Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void Thermometer_Register( thermometerServiceCB_t pfnServiceCB ); + +/* + * Thermometer_SetParameter - Set a Thermometer parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Thermometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Thermometer_GetParameter - Get a Thermometer parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Thermometer_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Thermometer_TempIndicate + * + * @brief Send a notification containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_TempIndicate( uint16 connHandle, attHandleValueInd_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Thermometer_IntervalIndicate + * + * @brief Send a interval change indication + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_IntervalIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ); + +/********************************************************************* + * @fn Thermometer_IMeasNotify + * + * @brief Send a intermediate temperature notification + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* THERMOMETERSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll.h new file mode 100644 index 0000000..e4ea949 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll.h @@ -0,0 +1,2682 @@ +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2013-05-15 05:57:26 -0700 (Wed, 15 May 2013) $ + Revision: $Revision: 34287 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_H +#define LL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" + +/******************************************************************************* + * MACROS + */ + +// check if connection parameter ranges for CI (min/max), SL, and LSTO are valid +#define LL_INVALID_CONN_TIME_PARAM( ciMin, ciMax, sl, lsto ) \ + (((ciMin) < LL_CONN_INTERVAL_MIN) || \ + ((ciMin) > LL_CONN_INTERVAL_MAX) || \ + ((ciMax) < LL_CONN_INTERVAL_MIN) || \ + ((ciMax) > LL_CONN_INTERVAL_MAX) || \ + ((ciMax) < (ciMin)) || \ + ((sl) > LL_SLAVE_LATENCY_MAX) || \ + ((lsto) < LL_CONN_TIMEOUT_MIN) || \ + ((lsto) > LL_CONN_TIMEOUT_MAX)) + +// check if the CI/SL/LSTO combination is valid +// based on: LSTO > (1 + Slave Latency) * (Connection Interval * 2) +// Note: The CI * 2 requirement based on ESR05 V1.0, Erratum 3904. +// Note: LSTO time is normalized to units of 1.25ms (i.e. 10ms = 8 * 1.25ms). +#define LL_INVALID_CONN_TIME_PARAM_COMBO( ci, sl, lsto ) \ + ((uint32)((lsto)*8) <= ((uint32)(1+(sl)) * (uint32)((ci)*2))) + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#define LL_STATUS_SUCCESS 0x00 // Success +#define LL_STATUS_ERROR_UNKNOWN_CONN_HANDLE 0x02 // Unknown Connection Identifier +#define LL_STATUS_ERROR_INACTIVE_CONNECTION 0x02 // Unknown Connection Identifier for now; may be needed for multiple connections +#define LL_STATUS_ERROR_AUTH_FAILURE 0x05 // Authentication Failure +#define LL_STATUS_ERROR_PIN_OR_KEY_MISSING 0x06 // Pin or Key Missing +#define LL_STATUS_ERROR_OUT_OF_CONN_RESOURCES 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_TX_MEM 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_RX_MEM 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_OUT_OF_HEAP 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_WL_TABLE_FULL 0x07 // Memory Capacity Exceeded +#define LL_STATUS_ERROR_CONNECTION_TIMEOUT 0x08 // Connection Timeout +#define LL_STATUS_ERROR_CONNECTION_LIMIT_EXCEEDED 0x09 // Connection Limit Exceeded +#define LL_STATUS_ERROR_COMMAND_DISALLOWED 0x0C // Command Disallowed +#define LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES 0x0D // Command Rejected Due To Limited Resources +#define LL_STATUS_ERROR_DUE_TO_DELAYED_RESOURCES 0x0D // Command Delayed Due To Limited Resources +#define LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED 0x11 // Unsupported Feature or Parameter Value +#define LL_STATUS_ERROR_UNEXPECTED_PARAMETER 0x12 // Invalid HCI Command Parameters +#define LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION 0x12 // Invalid HCI Command Parameters +#define LL_STATUS_ERROR_BAD_PARAMETER 0x12 // Invalid HCI Command Parameters or 0x30: Parameter Out of Mandatory Range? +#define LL_STATUS_ERROR_UNKNOWN_ADV_EVT_TYPE 0x12 // Invalid HCI Command Parameters or 0x30: Parameter Out of Mandatory Range? +#define LL_STATUS_ERROR_PEER_TERM 0x13 // Remote User Terminated Connection +#define LL_STATUS_ERROR_PEER_DEVICE_TERM_LOW_RESOURCES 0x14 // Remote Device Terminated Connection Due To Low Resources +#define LL_STATUS_ERROR_PEER_DEVICE_TERM_POWER_OFF 0x15 // Remote Device Terminated Connection Due To Power Off +#define LL_STATUS_ERROR_HOST_TERM 0x16 // Connection Terminated By Local Host +#define LL_STATUS_ERROR_UNSUPPORTED_REMOTE_FEATURE 0x1A // Unsupported Remote Feature +#define LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND 0x1F // Unspecified Error +#define LL_STATUS_ERROR_WL_TABLE_EMPTY 0x1F // Unspecified Error +#define LL_STATUS_ERROR_RNG_FAILURE 0x1F // Unspecified Error +#define LL_STATUS_ERROR_DISCONNECT_IMMEDIATE 0x1F // Unspecified Error +#define LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE 0x21 // Role Change Not Allowed +#define LL_STATUS_ERROR_LL_TIMEOUT 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_LL_TIMEOUT_HOST 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_LL_TIMEOUT_PEER 0x22 // Link Layer Response Timeout +#define LL_STATUS_ERROR_INSTANT_PASSED 0x28 // Instant Passed +#define LL_STATUS_ERROR_INSTANT_PASSED_HOST 0x28 // Instant Passed +#define LL_STATUS_ERROR_INSTANT_PASSED_PEER 0x28 // Instant Passed +#define LL_STATUS_ERROR_KEY_PAIRING_NOT_SUPPORTED 0x29 // Pairing With Unit Key Not Supported +#define LL_STATUS_ERROR_NO_ADV_CHAN_FOUND 0x30 // Parameter Out Of Mandatory Range +#define LL_STATUS_ERROR_PARAM_OUT_OF_RANGE 0x30 // Parameter Out Of Mandatory Range +#define LL_STATUS_ERROR_UPDATE_CTRL_PROC_PENDING 0x3A // Controller Busy +#define LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE 0x3A // Controller Busy +#define LL_STATUS_ERROR_VER_INFO_REQ_ALREADY_PENDING 0x3A // Controller Busy +#define LL_STATUS_ERROR_UNACCEPTABLE_CONN_INTERVAL 0x3B // Unacceptable Connection Interval +#define LL_STATUS_ERROR_DIRECTED_ADV_TIMEOUT 0x3C // Directed Advertising Timeout +#define LL_STATUS_ERROR_CONN_TERM_DUE_TO_MIC_FAILURE 0x3D // Connection Terminated Due To MIC Failure +#define LL_STATUS_ERROR_CONN_FAILED_TO_BE_ESTABLISHED 0x3E // Connection Failed To Be Established +#define LL_STATUS_ERROR_CONN_TIMING_FAILURE 0x3F // MAC Connection Failed +// Internal +#define LL_STATUS_WARNING_TX_DISABLED 0xFF // only used internally, so value doesn't matter +#define LL_STATUS_WARNING_FLAG_UNCHANGED 0xFF // only used internally, so value doesn't matter + +// Encryption Key Request Reason Codes +#define LL_ENC_KEY_REQ_ACCEPTED LL_STATUS_SUCCESS +#define LL_ENC_KEY_REQ_REJECTED LL_STATUS_ERROR_PIN_OR_KEY_MISSING +#define LL_ENC_KEY_REQ_UNSUPPORTED_FEATURE LL_STATUS_ERROR_UNSUPPORTED_REMOTE_FEATURE + +// Disconnect Reason Codes +#define LL_SUPERVISION_TIMEOUT_TERM LL_STATUS_ERROR_CONNECTION_TIMEOUT +#define LL_PEER_REQUESTED_TERM LL_STATUS_ERROR_PEER_TERM +#define LL_PEER_REQUESTED_LOW_RESOURCES_TERM LL_STATUS_ERROR_PEER_DEVICE_TERM_LOW_RESOURCES +#define LL_PEER_REQUESTED_POWER_OFF_TERM LL_STATUS_ERROR_PEER_DEVICE_TERM_POWER_OFF +#define LL_HOST_REQUESTED_TERM LL_STATUS_ERROR_HOST_TERM +#define LL_CTRL_PKT_TIMEOUT_TERM LL_STATUS_ERROR_LL_TIMEOUT +#define LL_CTRL_PKT_TIMEOUT_HOST_TERM LL_STATUS_ERROR_LL_TIMEOUT_HOST +#define LL_CTRL_PKT_TIMEOUT_PEER_TERM LL_STATUS_ERROR_LL_TIMEOUT_PEER +#define LL_CTRL_PKT_INSTANT_PASSED_TERM LL_STATUS_ERROR_INSTANT_PASSED +#define LL_CTRL_PKT_INSTANT_PASSED_HOST_TERM LL_STATUS_ERROR_INSTANT_PASSED_HOST +#define LL_CTRL_PKT_INSTANT_PASSED_PEER_TERM LL_STATUS_ERROR_INSTANT_PASSED_PEER +#define LL_UNACCEPTABLE_CONN_INTERVAL_TERM LL_STATUS_ERROR_UNACCEPTABLE_CONN_INTERVAL +#define LL_MIC_FAILURE_TERM LL_STATUS_ERROR_CONN_TERM_DUE_TO_MIC_FAILURE +#define LL_CONN_ESTABLISHMENT_FAILED_TERM LL_STATUS_ERROR_CONN_FAILED_TO_BE_ESTABLISHED + +// Disconnect API Parameter +#define LL_DISCONNECT_AUTH_FAILURE LL_STATUS_ERROR_AUTH_FAILURE +#define LL_DISCONNECT_REMOTE_USER_TERM LL_STATUS_ERROR_PEER_TERM +#define LL_DISCONNECT_REMOTE_DEV_LOW_RESOURCES LL_STATUS_ERROR_PEER_DEVICE_TERM_LOW_RESOURCES +#define LL_DISCONNECT_REMOTE_DEV_POWER_OFF LL_STATUS_ERROR_PEER_DEVICE_TERM_POWER_OFF +#define LL_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE LL_STATUS_ERROR_UNSUPPORTED_REMOTE_FEATURE +#define LL_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED LL_STATUS_ERROR_KEY_PAIRING_NOT_SUPPORTED +#define LL_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL LL_STATUS_ERROR_UNACCEPTABLE_CONN_INTERVAL + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#define LL_ADV_CONN_INTERVAL_MIN 32 // 20ms in 625us +#define LL_ADV_CONN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_ADV_NONCONN_INTERVAL_MIN 160 // 100ms in 625us +#define LL_ADV_NONCONN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_ADV_DELAY_MIN 0 // in ms +#define LL_ADV_DELAY_MAX 10 // in ms +#define LL_SCAN_INTERVAL_MIN 4 // 2.5ms in 625us +#define LL_SCAN_INTERVAL_MAX 16384 // 10.24s in 625us +#define LL_SCAN_WINDOW_MIN 4 // 2.5ms in 625us +#define LL_SCAN_WINDOW_MAX 16384 // 10.24s in 625us +#define LL_CONN_INTERVAL_MIN 6 // 7.5ms in 1.25ms +#define LL_CONN_INTERVAL_MAX 3200 // 4s in 1.25ms +#define LL_CONN_TIMEOUT_MIN 10 // 100ms in 10ms +#define LL_CONN_TIMEOUT_MAX 3200 // 32s in 10ms +#define LL_SLAVE_LATENCY_MIN 0 +#define LL_SLAVE_LATENCY_MAX 499 +#define LL_HOP_LENGTH_MIN 5 +#define LL_HOP_LENGTH_MAX 16 +#define LL_INSTANT_NUMBER_MIN 6 + +// LL Advertiser Channels +#define LL_ADV_CHAN_37 1 +#define LL_ADV_CHAN_38 2 +#define LL_ADV_CHAN_39 4 +#define LL_ADV_CHAN_ALL (LL_ADV_CHAN_37 | LL_ADV_CHAN_38 | LL_ADV_CHAN_39) + +// LL Advertiser Events +#define LL_ADV_CONNECTABLE_UNDIRECTED_EVT 0 +#define LL_ADV_CONNECTABLE_DIRECTED_EVT 1 +#define LL_ADV_SCANNABLE_UNDIRECTED_EVT 2 +#define LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT 3 + +// LL Address Type +#define LL_DEV_ADDR_TYPE_PUBLIC 0 +#define LL_DEV_ADDR_TYPE_RANDOM 1 + +// Advertiser White List Policy +#define LL_ADV_WL_POLICY_ANY_REQ 0 // any scan request or connect request +#define LL_ADV_WL_POLICY_WL_SCAN_REQ 1 // any connect request, white list scan request +#define LL_ADV_WL_POLICY_WL_CONNECT_REQ 2 // any scan request, white list connect request +#define LL_ADV_WL_POLICY_WL_ALL_REQ 3 // white list scan request and connect request + +// Scanner White List Policy +#define LL_SCAN_WL_POLICY_ANY_ADV_PKTS 0 +#define LL_SCAN_WL_POLICY_USE_WHITE_LIST 1 + +// Initiator White List Policy +#define LL_INIT_WL_POLICY_USE_PEER_ADDR 0 +#define LL_INIT_WL_POLICY_USE_WHITE_LIST 1 + +// Black List Control +#define LL_SET_BLACKLIST_DISABLE 0 +#define LL_SET_BLACKLIST_ENABLE 1 + +// Advertiser Commands +#define LL_ADV_MODE_OFF 0 +#define LL_ADV_MODE_ON 1 +#define LL_ADV_MODE_RESERVED 2 + +// LL Scan Commands +#define LL_SCAN_STOP 0 +#define LL_SCAN_START 1 + +// LL Scan Filtering +#define LL_FILTER_REPORTS_DISABLE 0 +#define LL_FILTER_REPORTS_ENABLE 1 + +// LL Scan Types +#define LL_SCAN_PASSIVE 0 +#define LL_SCAN_ACTIVE 1 + +// LL Tx Power Types +#define LL_READ_CURRENT_TX_POWER_LEVEL 0 +#define LL_READ_MAX_TX_POWER_LEVEL 1 + +// Data Fragmentation Flag +#define LL_DATA_FIRST_PKT_HOST_TO_CTRL 0 +#define LL_DATA_CONTINUATION_PKT 1 +#define LL_DATA_FIRST_PKT_CTRL_TO_HOST 2 + +// Connection Complete Role +#define LL_LINK_CONNECT_COMPLETE_MASTER 0 +#define LL_LINK_CONNECT_COMPLETE_SLAVE 1 + +// Encryption Related +#define LL_ENCRYPTION_OFF 0 +#define LL_ENCRYPTION_ON 1 + +// Feature Set Related +#define LL_MAX_FEATURE_SET_SIZE 8 // in bytes +// +#define LL_FEATURE_RFU 0 // all bits in a byte +#define LL_FEATURE_ENCRYPTION 1 // byte 0, bit 0 + +// Receive Flow Control +#define LL_DISABLE_RX_FLOW_CONTROL 0 +#define LL_ENABLE_RX_FLOW_CONTROL 1 + +// Direct Test Mode +#define LL_DIRECT_TEST_NUM_RF_CHANS 40 // PHY_NUM_RF_CHANS +#define LL_DIRECT_TEST_MAX_PAYLOAD_LEN 37 +// +#define LL_DIRECT_TEST_PAYLOAD_PRBS9 0 +#define LL_DIRECT_TEST_PAYLOAD_0x0F 1 +#define LL_DIRECT_TEST_PAYLOAD_0x55 2 +#define LL_DIRECT_TEST_PAYLOAD_PRBS15 3 +#define LL_DIRECT_TEST_PAYLOAD_0xFF 4 +#define LL_DIRECT_TEST_PAYLOAD_0x00 5 +#define LL_DIRECT_TEST_PAYLOAD_0xF0 6 +#define LL_DIRECT_TEST_PAYLOAD_0xAA 7 +#define LL_DIRECT_TEST_PAYLOAD_UNDEFINED 0xFF +// +#define LL_DIRECT_TEST_MODE_TX 0 +#define LL_DIRECT_TEST_MODE_RX 1 +// +#define LL_RF_RSSI_UNDEFINED PHY_RSSI_VALUE_INVALID + +// Vendor Specific +#define LL_EXT_RX_GAIN_STD 0 +#define LL_EXT_RX_GAIN_HIGH 1 +// +#define LL_EXT_TX_POWER_MINUS_23_DBM 0 +#define LL_EXT_TX_POWER_MINUS_6_DBM 1 +#define LL_EXT_TX_POWER_0_DBM 2 +#define LL_EXT_TX_POWER_4_DBM 3 + +#if defined( CC2541) || defined( CC2541S ) + +#define LL_EXT_MAX_TX_POWER LL_EXT_TX_POWER_0_DBM + +#else // CC2540 + +#define LL_EXT_MAX_TX_POWER LL_EXT_TX_POWER_4_DBM + +#endif // CC2541 || CC2541S + +// +#define LL_EXT_DISABLE_ONE_PKT_PER_EVT 0 +#define LL_EXT_ENABLE_ONE_PKT_PER_EVT 1 +// +#define LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT 0 +#define LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT 1 +// +#define LL_EXT_NV_NOT_IN_USE 0 +#define LL_EXT_NV_IN_USE 1 +// +#define LL_EXT_DISABLE_FAST_TX_RESP_TIME 0 +#define LL_EXT_ENABLE_FAST_TX_RESP_TIME 1 +// +#define LL_EXT_DISABLE_SL_OVERRIDE 0 +#define LL_EXT_ENABLE_SL_OVERRIDE 1 +// +#define LL_EXT_TX_MODULATED_CARRIER 0 +#define LL_EXT_TX_UNMODULATED_CARRIER 1 +// +#define LL_EXT_SET_FREQ_TUNE_DOWN 0 +#define LL_EXT_SET_FREQ_TUNE_UP 1 +// +#define LL_EXT_PM_IO_PORT_P0 0 +#define LL_EXT_PM_IO_PORT_P1 1 +#define LL_EXT_PM_IO_PORT_P2 2 +#define LL_EXT_PM_IO_PORT_NONE 0xFF +#define LL_EXT_PM_IO_DISABLE LL_EXT_PM_IO_PORT_NONE +// +#define LL_EXT_PM_IO_PORT_PIN0 0 +#define LL_EXT_PM_IO_PORT_PIN1 1 +#define LL_EXT_PM_IO_PORT_PIN2 2 +#define LL_EXT_PM_IO_PORT_PIN3 3 +#define LL_EXT_PM_IO_PORT_PIN4 4 +#define LL_EXT_PM_IO_PORT_PIN5 5 +#define LL_EXT_PM_IO_PORT_PIN6 6 +#define LL_EXT_PM_IO_PORT_PIN7 7 +// +#define LL_EXT_PER_RESET 0 +#define LL_EXT_PER_READ 1 +// +#define LL_EXT_HALT_DURING_RF_DISABLE 0 +#define LL_EXT_HALT_DURING_RF_ENABLE 1 +// +#define LL_EXT_SET_USER_REVISION 0 +#define LL_EXT_READ_BUILD_REVISION 1 + +// Packet Lengths +#define LL_DEVICE_ADDR_LEN 6 +#define LL_MAX_ADV_DATA_LEN 31 +#define LL_MAX_ADV_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_ADV_DATA_LEN) +#define LL_MAX_SCAN_DATA_LEN 31 +#define LL_MAX_SCAN_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_SCAN_DATA_LEN) +#define LL_MAX_LINK_DATA_LEN 27 + +/* +** Event Parameters +*/ + +// Advertising Report Data +#define LL_ADV_RPT_ADV_IND LL_ADV_CONNECTABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_ADV_DIRECT_IND LL_ADV_CONNECTABLE_DIRECTED_EVT +#define LL_ADV_RPT_ADV_SCANNABLE_IND LL_ADV_SCANNABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_ADV_NONCONN_IND LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT +#define LL_ADV_RPT_SCAN_RSP (LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT + 1) +#define LL_ADV_RPT_INVALID 0xFF +// +#define LL_RSSI_NOT_AVAILABLE 127 + +// Sleep Clock Accuracy (SCA) +#define LL_SCA_500_PPM 0 +#define LL_SCA_250_PPM 1 +#define LL_SCA_150_PPM 2 +#define LL_SCA_100_PPM 3 +#define LL_SCA_75_PPM 4 +#define LL_SCA_50_PPM 5 +#define LL_SCA_30_PPM 6 +#define LL_SCA_20_PPM 7 + +/* +** Miscellaneous +*/ + +#define LL_MAX_NUM_DATA_CHAN 37 // 0 - 36 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ LL_MAX_NUM_DATA_CHAN ]; + uint16 numCrcErr[ LL_MAX_NUM_DATA_CHAN ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_SetScanParam API + * + * @brief This API is called by the HCI to set the Scanner's parameters. + * + * input parameters + * + * @param scanType - Passive or Active scan type. + * @param scanInterval - Time between scan events. + * @param scanWindow - Duration of a scan. When the same as the scan + * interval, then scan continuously. + * @param ownAddrType - Address type (Public or Random) to use in the + * SCAN_REQ packet. + * @param advWlPolicy - Either allow all Adv packets, or only those that + * are in the white list. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanParam( uint8 scanType, + uint16 scanInterval, + uint16 scanWindow, + uint8 ownAddrType, + uint8 advWlPolicy ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_SetScanControl API + * + * @brief This API is called by the HCI to start or stop the Scanner. It + * also specifies whether the LL will filter duplicate advertising + * reports to the Host, or generate a report for each packet + * received. + * + * input parameters + * + * @param scanMode - LL_SCAN_START or LL_SCAN_STOP. + * @param filterReports - LL_FILTER_REPORTS_DISABLE or + * LL_FILTER_REPORTS_ENABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_SetScanControl( uint8 scanMode, + uint8 filterReports ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); +#endif // CTRL_CONFIG=INIT_CFG + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EXT_SetSlaveLatencyOverride API + * + * @brief This API is used to enable or disable the suspention of slave + * latency. This can be helpful when the Slave application knows + * it will soon receive something that needs to be handled without + * delay. + * + * input parameters + * + * @param control - LL_EXT_DISABLE_SL_OVERRIDE, + * LL_EXT_ENABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetSlaveLatencyOverride( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn LL_EXT_BuildRevision Vendor Specific API + * + * @brief This API is used to to set a user revision number or read the + * build revision number. + * + * input parameters + * + * @param mode - LL_EXT_SET_USER_REVISION | + * LL_EXT_READ_BUILD_REVISION + * @param userRevNum - A 16 bit value the user can set as their own + * revision number + * + * output parameters + * + * @param buildRev - Pointer to returned build revision, if any. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_BuildRevision( uint8 mode, uint16 userRevNum, uint8 *buildRev ); + + +/* +** LL Callbacks to HCI +*/ + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn LL_AdvReportCback Callback + * + * @brief This Callback is used by the LL to provide information about + * advertisers from which an advertising packet was received. + * + * input parameters + * + * @param eventType - Type of advertisement packet received by Scanner + * or Initiator, and scan response for Initiator. + * @param advAddrType - Advertiser address type (public or random). + * @param advAddr - Advertiser address. + * @param dataLen - Size in bytes of advertisement packet. + * @param data - Advertisement data. + * @param rssi - RSSI value (-127..20dBm), or not available + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_AdvReportCback( uint8 eventType, + uint8 advAddrType, + uint8 *advAddr, + uint8 dataLen, + uint8 *data, + int8 rssi ); +#endif // CTRL_CONIFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); +#endif // CTRL_CONIFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); +#endif // CTRL_CONIFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + +#ifdef __cplusplus +} +#endif + +#endif /* LL_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_math.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_math.h new file mode 100644 index 0000000..ed3ed7b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_math.h @@ -0,0 +1,84 @@ +/******************************************************************************* + Filename: ll_math.h + Revised: $Date: 2011-02-17 15:41:10 -0800 (Thu, 17 Feb 2011) $ + Revision: $Revision: 25131 $ + + Description: This file contains the types, contants, API's etc. for math + routines. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_MATH_H +#define LL_MATH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern NEAR_FUNC uint32 llDivide31By16To16( uint32 dividend, + uint16 divisor ); + + +#ifdef __cplusplus +} +#endif + +#endif /* LL_MATH_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_sleep.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_sleep.h new file mode 100644 index 0000000..58f72a1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_sleep.h @@ -0,0 +1,100 @@ +/******************************************************************************* + Filename: ll_sleep.h + Revised: $Date: 2013-02-27 09:25:28 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33310 $ + + Description: This file contains the Link Layer (LL) types, constants, + API's etc. for Sleep Management for the Bluetooth Low Energy + (ULE) Controller + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_SLEEP_H +#define LL_SLEEP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// NanoRisc Execution Mode +#define LL_NR_STATE_IDLE 0 +#define LL_NR_STATE_RUNNING 1 + +// Sleep Management +#define LL_SLEEP_REQUEST_ALLOWED 0 +#define LL_SLEEP_REQUEST_DENIED 1 + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +extern volatile DATA unsigned char phyState; +extern volatile DATA unsigned char clkState; + +/******************************************************************************* + * API + */ + +extern NEAR_FUNC void HaltMcuUsingPhyFlag(void); +// +extern NEAR_FUNC void LL_TimeToNextRfEvent( uint32 *sleepTimer, uint32 *timeout ); +extern NEAR_FUNC uint8 LL_PowerOffReq( uint8 mode ); +extern NEAR_FUNC void LL_PowerOnReq( uint8 wakeFromPM3, uint8 wakeForRF ); + +#ifdef __cplusplus +} +#endif + +#endif /* LL_SLEEP_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_timer2.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_timer2.h new file mode 100644 index 0000000..0b5605d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/ll_timer2.h @@ -0,0 +1,225 @@ +/******************************************************************************* + Filename: ll_timer2.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Link + Layer (LL) software timer management software for Timer2. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef LL_TIMER2_H +#define LL_TIMER2_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +#define llDisableT2Event1() (T2CSPCFG |= LL_T2_DISABLE_EVENT1;) +#define llDisableT2Event2() (T2CSPCFG |= LL_T2_DISABLE_EVENT2;) +#define llAddTime( time, val ) (((time) + (val)) & LL_T2OVF_PERIOD_VALUE) +#define llSubTime( time, val ) (((time) - (val)) & LL_T2OVF_PERIOD_VALUE) + +/******************************************************************************* + * CONSTANTS + */ + +// Timer 2 Control Register +#define LL_T2_CTRL_INIT_NO_SYNCH 0x08 +#define LL_T2_CTRL_INIT_SYNCH 0x0A + +/* +** Timer 2 Multiplex Select +*/ +#define LL_T2_TIMER_SEL 0x00 +#define LL_T2_CAPTURE_SEL 0x01 +#define LL_T2_PERIOD_SEL 0x02 +#define LL_T2_COMPARE1_SEL 0x03 +#define LL_T2_COMPARE2_SEL 0x04 +// +#define LL_T2OVF_TIMER_SEL 0x00 +#define LL_T2OVF_CAPTURE_SEL 0x10 +#define LL_T2OVF_PERIOD_SEL 0x20 +#define LL_T2OVF_COMPARE1_SEL 0x30 +#define LL_T2OVF_COMPARE2_SEL 0x40 + +/* +** Timer 2 Interrupt Masks and Flags +*/ +#define LL_T2_PERIOD_FLAG 0x01 +#define LL_T2_COMPARE1_FLAG 0x02 +#define LL_T2_COMPARE2_FLAG 0x04 +// +#define LL_T2OVF_PERIOD_FLAG 0x08 +#define LL_T2OVF_COMPARE1_FLAG 0x10 +#define LL_T2OVF_COMPARE2_FLAG 0x20 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2_LONG_COMPARE1_FLAG 0x40 +#define LL_T2_LONG_COMPARE2_FLAG 0x80 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Interrupt Masks +*/ +#define LL_T2_PERIOD_MASK 0x01 +#define LL_T2_COMPARE1_MASK 0x02 +#define LL_T2_COMPARE2_MASK 0x04 +// +#define LL_T2OVF_PERIOD_MASK 0x08 +#define LL_T2OVF_COMPARE1_MASK 0x10 +#define LL_T2OVF_COMPARE2_MASK 0x20 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2_LONG_COMPARE1_MASK 0x40 +#define LL_T2_LONG_COMPARE2_MASK 0x80 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Event Configuration +*/ +#define LL_T2_PERIOD_EVENT1 0x00 +#define LL_T2_COMPARE1_EVENT1 0x01 +#define LL_T2_COMPARE2_EVENT1 0x02 +// +#define LL_T2OVF_PERIOD_EVENT1 0x03 +#define LL_T2OVF_COMPARE1_EVENT1 0x04 +#define LL_T2OVF_COMPARE2_EVENT1 0x05 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2OVF_LONG_CMP1_EVENT1 0x08 +#define LL_T2OVF_LONG_CMP2_EVENT1 0x09 +#define LL_T2_DISABLE_EVENT1 0x0F +#else // CC2540 +#define LL_T2_DISABLE_EVENT1 0x07 +#endif // CC2541 || CC2541S +// +#define LL_T2_PERIOD_EVENT2 0x00 +#define LL_T2_COMPARE1_EVENT2 0x10 +#define LL_T2_COMPARE2_EVENT2 0x20 +// +#define LL_T2OVF_PERIOD_EVENT2 0x30 +#define LL_T2OVF_COMPARE1_EVENT2 0x40 +#define LL_T2OVF_COMPARE2_EVENT2 0x50 +// +#if defined( CC2541) || defined( CC2541S ) // CC2541_T2 +#define LL_T2OVF_LONG_CMP1_EVENT2 0x80 +#define LL_T2OVF_LONG_CMP2_EVENT2 0x90 +#define LL_T2_DISABLE_EVENT2 0xF0 +#else // CC2540 +#define LL_T2_DISABLE_EVENT2 0x70 +#endif // CC2541 || CC2541S + +/* +** Timer 2 Miscellanous +*/ + +#define LL_T2_RUN_BIT 0x01 // 0: stop timer; 1: run timer +#define LL_T2_SYNCH_BIT 0x02 // 0: start/stop immediate; 1: start/stop synch with 32kHz +#define LL_T2_STATE_BIT 0x04 +#define LL_T2_PERIOD_VALUE 0x4E20 // 20K 32MHz ticks = 625us +#define LL_T2_PERIOD_1US_VALUE 0x20 // 1us in 31.25ns ticks +#define LL_T2OVF_PERIOD_VALUE 0x00FFFFFF // full 24 bit range, or 2.913 hours +#define LL_T2_MAX_VALUE 0x01000000 // full 24 bit range + +/******************************************************************************* + * TYPEDEFS + */ + +/* +** Anchor Point +*/ +typedef struct +{ + uint32 coarse; // number of 625us ticks at SFD capture + uint16 fine; // number of 31.25ns ticks at SFD capture +} sysTime_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern void llInitTimer2( void ); +extern void llStopTimer2( void ); +extern void llStartTimer2( void ); +extern void llSetT2C1Timeout( uint16 timeout ); +extern void llSetT2C2Timeout( uint16 timeout ); +extern void llSetT2OVFC1Timeout( uint32 timeout ); +extern void llSetT2OVFC2Timeout( uint32 timeout ); +extern void llSetT2LongC1Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2LongC2Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2C1Event1( uint16 timeout ); +extern void llSetT2OVFC1Event1( uint32 timeout ); +extern void llSetT2LongC1Event1( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2OVFC2Event2( uint32 timeout ); +extern void llSetT2Delta( uint16 count ); +extern void llDisableT2Ints( void ); +extern void llDisableT2IntsEvts( void ); +extern void llDisableT2E1( void ); +extern void llGetTimer2Capture( uint32 *coarseTime, uint16 *fineTime ); +extern uint32 llGetCurrentTime( void ); +extern uint16 llGetCurrentFineTime( void ); +extern void llGetFullCurrentTime( uint32 *coarse, uint16 *fine ); +//extern void llGetFullCTandST( uint32 *coarseTime, uint16 *fineTime, uint32 *sleepTime ); +extern void llGetFullCTandST( sysTime_t *curTime, uint32 *sleepTime ); +extern uint32 llGetT2OVFC1( void ); +extern uint32 llGetT2OVFC2( void ); +extern uint16 ll_McuPrecisionCount( void ); +// +extern NEAR_FUNC uint8 ll24BitTimeCompare( uint32 time1, uint32 time2 ); +extern NEAR_FUNC uint32 ll24BitTimeDelta( uint32 time1, uint32 time2 ); +extern NEAR_FUNC uint32 ll24BitAbsTimeDelta( uint32 time1, uint32 time2 ); +extern NEAR_FUNC void llAdjustTimeForward( sysTime_t *curTime, sysTime_t *adjTime ); +extern NEAR_FUNC void llAdjustTimeBackward( sysTime_t *curTime, sysTime_t *adjTime ); + +#ifdef __cplusplus +} +#endif + +#endif /* LL_TIMER2_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy.h new file mode 100644 index 0000000..21915fe --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy.h @@ -0,0 +1,2355 @@ +/******************************************************************************* + Filename: phy.h + Revised: $Date: 2013-01-30 15:20:23 -0800 (Wed, 30 Jan 2013) $ + Revision: $Revision: 32951 $ + + Description: This is the header file of Physical Layer (PHY) module. All + the exported functions and data types will be defined here. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef PHY_H +#define PHY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "hal_types.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +#if defined( CC2541) || defined( CC2541S ) +#include "ioCC2541_extra.h" +#else // CC2540 +#include "ioCC2540_extra.h" +#endif // CC2541 || CC2541S + +/******************************************************************************* + * MACROS + */ + +#if !defined(USE_PHY_FUNCS) + +// default to PHY macros to speed up processing + +#define PHY_GET_CHIP_ID() (*(P_INFOPAGE+3)) + +#define PHY_WRITE_BYTE( data, len ) \ + { \ + uint8 z; \ + for (z=0; z<(len); z++) { RFD = (data)[z]; } \ + } + +#define PHY_WRITE_BYTE_VAL( value ) (RFD = (value)) + +#define PHY_READ_BYTE( ptr, len ) \ + st( uint8 z; \ + if ( (ptr) == NULL ) \ + { \ + for (z=0; z<(len); z++) \ + { RFD; } \ + } \ + else \ + { \ + for (z=0; z<(len); z++) \ + { (ptr)[z] = RFD; } \ + } \ + ) + +#define PHY_READ_BYTE_VAL() (RFD) + +#define PHY_RESET_TX_FIFO() (RFST = PHY_FIFO_TX_RESET) + +#define PHY_RESET_RX_FIFO() (RFST = PHY_FIFO_RX_RESET) + +#define PHY_RESET_TXRX_FIFO() (RFST = PHY_FIFO_RESET) + +#define PHY_COMMAND( cmd ) \ + st( while( RFST != 0 ); \ + if ( (cmd) != PHY_CMD_INVALID ) \ + { \ + RFST = (cmd); \ + } \ + ) + +#define PHY_CLEAR_COUNTERS() \ + st( BLE_NTXDONE = 0; \ + BLE_NTXACK = 0; \ + BLE_NTXCTRLACK = 0; \ + BLE_NTXCTRL = 0; \ + BLE_NTXRETRANS = 0; \ + BLE_NTX = 0; \ + BLE_NRXOK = 0; \ + BLE_NRXCTRL = 0; \ + BLE_NRXNOK = 0; \ + BLE_NRXIGNORED = 0; \ + BLE_NRXEMPTY = 0; \ + BLE_NRXFIFOFULL = 0; \ + ) + +#define PHY_READ_COUNTERS( ptr ) \ + st( (*((ptr)+0)) = BLE_NTXDONE; \ + (*((ptr)+1)) = BLE_NTXACK; \ + (*((ptr)+2)) = BLE_NTXCTRLACK; \ + (*((ptr)+3)) = BLE_NTXCTRL; \ + (*((ptr)+4)) = BLE_NTXRETRANS; \ + (*((ptr)+5)) = BLE_NTX; \ + (*((ptr)+6)) = BLE_NRXOK; \ + (*((ptr)+7)) = BLE_NRXCTRL; \ + (*((ptr)+8)) = BLE_NRXNOK; \ + (*((ptr)+9)) = BLE_NRXIGNORED; \ + (*((ptr)+10)) = BLE_NRXEMPTY; \ + (*((ptr)+11)) = BLE_NRXFIFOFULL; \ + ) + +#define PHY_TX_FIFO_LEN() (RFTXFLEN) + +#define PHY_RX_FIFO_LEN() (RFRXFLEN) + +#define PHY_INIT_LAST_RSSI() (BLE_LAST_RSSI = PHY_RSSI_VALUE_INVALID) + +#define PHY_GET_LAST_RSSI() (BLE_LAST_RSSI) + +#define PHY_GET_RSSI() (RSSI) + +#define PHY_CLR_WINCONF() (BLE_WINCONF = 0); + +#define PHY_SET_DYN_WINOFFSET( winOffset, connInterval ) \ + st( BLE_WINOFFSET_0 = (winOffset) & 0xFF; \ + BLE_WINOFFSET_1 = (winOffset) >> 8; \ + BLE_WINMOD_0 = (connInterval) & 0xFF; \ + BLE_WINMOD_1 = (connInterval) >> 8; \ + BLE_WINCONF = 0xC1; \ + ) + +#define PHY_TX_FIFO_BYTES_FREE() (PHY_FIFO_SIZE - RFTXFLEN) + +#define PHY_COMMIT_TX_FIFO() (RFST = PHY_FIFO_TX_COMMIT) + +#define PHY_ANCHOR_VALID() (BLE_ANCHOR_VALID) + +#define PHY_GET_DATA_CHAN() (BLE_CHAN) + +#else // PHY functions + +// PHY functions +#define PHY_GET_CHIP_ID() PHY_GetChipID() +#define PHY_WRITE_BYTE( data, len ) PHY_WriteByte( (data), (len) ) +#define PHY_WRITE_BYTE_VAL( value ) PHY_WriteByteVal( (value) ) +#define PHY_READ_BYTE( ptr, len ) PHY_ReadByte( (ptr), (len) ) +#define PHY_READ_BYTE_VAL() PHY_ReadByteVal() +#define PHY_RESET_TX_FIFO() PHY_ResetTxFifo() +#define PHY_RESET_RX_FIFO() PHY_ResetRxFifo() +#define PHY_RESET_TXRX_FIFO() PHY_ResetTxRxFifo() +#define PHY_COMMAND( cmd ) PHY_Command( (cmd) ) +#define PHY_CLEAR_COUNTERS() PHY_ClearCounters() +#define PHY_READ_COUNTERS( ptr ) PHY_ReadCounters( (ptr) ) +#define PHY_TX_FIFO_LEN() PHY_TxFifoLen() +#define PHY_RX_FIFO_LEN() PHY_RxFifoLen() +#define PHY_INIT_LAST_RSSI() PHY_InitLastRssi() +#define PHY_GET_LAST_RSSI() PHY_GetLastRssi() +#define PHY_GET_RSSI() PHY_GetRssi() +#define PHY_CLR_WINCONF() PHY_ClearWindowConfig() +#define PHY_SET_DYN_WINOFFSET( winOff, ci ) PHY_SetDynamicWinOffset( (winOff), (ci) ) +#define PHY_TX_FIFO_BYTES_FREE() PHY_TxFifoBytesFree() +#define PHY_COMMIT_TX_FIFO() PHY_CommitTxFifo() +#define PHY_GET_DATA_CHAN() PHY_GetDataChan() + +#endif // !USE_PHY_FUNCS + +/******************************************************************************* + * CONSTANTS + */ + +// Chip ID +#define PHY_CHIP_ID_CC2540 0x8D +#define PHY_CHIP_ID_CC2541 0x41 +#define PHY_CHIP_ID_CC2541S 0x42 + +// FIFO Size & Addresses +#define PHY_DATA_BANK_PTR RFCORE_RAM +#define PHY_RX_FIFO_PTR RXFIFO +#define PHY_TX_FIFO_PTR TXFIFO + +// nR RAM Registers +#define BLE_REG_BASE_ADDR (0x6000) +#define BLE_RX_FIFO_BASE_ADDR (0x6080) +#define BLE_TX_FIFO_BASE_ADDR (0x6100) +#define BLE_BANK_SIZE 128 +#define BLE_MAX_TX_FIFO_SIZE 128 +#define BLE_MAX_RX_FIFO_SIZE 128 + +#define BLE_CHAN XREG((BLE_REG_BASE_ADDR + 0)) // BLE_LSI_CHAN +#define BLE_CHANMAP XREG((BLE_REG_BASE_ADDR + 1)) // BLE_A_CHANMAP +#define BLE_FIFO_CONF XREG((BLE_REG_BASE_ADDR + 2)) // BLE_FIFO_CONF +#define BLE_CONF XREG((BLE_REG_BASE_ADDR + 3)) // BLE_L_CONF +#define BLE_MAXNACK XREG((BLE_REG_BASE_ADDR + 4)) // BLE_L_MAXNACK + +#define BLE_CRCINIT_0 XREG((BLE_REG_BASE_ADDR + 5)) // BLE_L_CRCINIT +#define BLE_CRCINIT_1 XREG((BLE_REG_BASE_ADDR + 6)) // BLE_L_CRCINIT +#define BLE_CRCINIT_2 XREG((BLE_REG_BASE_ADDR + 7)) // BLE_L_CRCINIT + +#define BLE_SEQSTAT XREG((BLE_REG_BASE_ADDR + 8)) // BLE_L_SEQSTAT + +#define BLE_BLACKLIST XREG((BLE_REG_BASE_ADDR + 9)) // BLE_S_BLACKLIST + +#define BLE_BACKOFFCNT_0 XREG((BLE_REG_BASE_ADDR + 10)) // BLE_S_BACKOFFCNT +#define BLE_BACKOFFCNT_1 XREG((BLE_REG_BASE_ADDR + 11)) // BLE_S_BACKOFFCNT + +#define BLE_SCANCONF XREG((BLE_REG_BASE_ADDR + 12)) // BLE_S_CONF + +#define BLE_WINCONF XREG((BLE_REG_BASE_ADDR + 13)) // BLE_I_WIN_CONF + +#define BLE_WINOFFSET_0 XREG((BLE_REG_BASE_ADDR + 14)) // BLE_I_WIN_OFFSET +#define BLE_WINOFFSET_1 XREG((BLE_REG_BASE_ADDR + 15)) // BLE_I_WIN_OFFSET + +#define BLE_WINMOD_0 XREG((BLE_REG_BASE_ADDR + 16)) // BLE_I_WIN_MOD +#define BLE_WINMOD_1 XREG((BLE_REG_BASE_ADDR + 17)) // BLE_I_WIN_MOD + +#define BLE_MAX_LEN XREG((BLE_REG_BASE_ADDR + 18)) // BLE_MAX_LEN +#define BLE_LEN_BIT_MASK XREG((BLE_REG_BASE_ADDR + 19)) // BLE_LEN_BIT_MASK + +#define BLE_WLPOLICY XREG((BLE_REG_BASE_ADDR + 20)) // BLE_ASI_WLPOLICY +#define BLE_ADDRTYPE XREG((BLE_REG_BASE_ADDR + 21)) // BLE_ASI_ADDRTYPE + +#define BLE_OWNADDR_0 XREG((BLE_REG_BASE_ADDR + 22)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_1 XREG((BLE_REG_BASE_ADDR + 23)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_2 XREG((BLE_REG_BASE_ADDR + 24)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_3 XREG((BLE_REG_BASE_ADDR + 25)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_4 XREG((BLE_REG_BASE_ADDR + 26)) // BLE_ASI_OWNADDR +#define BLE_OWNADDR_5 XREG((BLE_REG_BASE_ADDR + 27)) // BLE_ASI_OWNADDR + +#define BLE_PEERADDR_0 XREG((BLE_REG_BASE_ADDR + 28)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_1 XREG((BLE_REG_BASE_ADDR + 29)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_2 XREG((BLE_REG_BASE_ADDR + 30)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_3 XREG((BLE_REG_BASE_ADDR + 31)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_4 XREG((BLE_REG_BASE_ADDR + 32)) // BLE_AI_PEERADDR +#define BLE_PEERADDR_5 XREG((BLE_REG_BASE_ADDR + 33)) // BLE_AI_PEERADDR + +#define BLE_WLVALID XREG((BLE_REG_BASE_ADDR + 34)) // BLE_ASI_WLVALID +#define BLE_WLADDRTYPE XREG((BLE_REG_BASE_ADDR + 35)) // BLE_ASI_WLADTYPE +#define BLE_WL_PTR PXREG((BLE_REG_BASE_ADDR + 36)) // BLE_ASI_WHITELIST0..BLE_ASI_WHITELIST7 + +#define BLE_NTXDONE XREG((BLE_REG_BASE_ADDR + 84)) // BLE_L_NTXDONE +#define BLE_NTXACK XREG((BLE_REG_BASE_ADDR + 85)) // BLE_L_NTXACK +#define BLE_NTXCTRLACK XREG((BLE_REG_BASE_ADDR + 86)) // BLE_L_NTXCTRLACK +#define BLE_NTXCTRL XREG((BLE_REG_BASE_ADDR + 87)) // BLE_L_NTXCTRL +#define BLE_NTXRETRANS XREG((BLE_REG_BASE_ADDR + 88)) // BLE_L_NTXRETRANS +#define BLE_NTX XREG((BLE_REG_BASE_ADDR + 89)) // BLE_NTX +#define BLE_NRXOK XREG((BLE_REG_BASE_ADDR + 90)) // BLE_NRXOK +#define BLE_NRXCTRL XREG((BLE_REG_BASE_ADDR + 91)) // BLE_L_NRXCTRL +#define BLE_NRXNOK XREG((BLE_REG_BASE_ADDR + 92)) // BLE_NRXNOK +#define BLE_NRXIGNORED XREG((BLE_REG_BASE_ADDR + 93)) // BLE_NRXIGNORED +#define BLE_NRXEMPTY XREG((BLE_REG_BASE_ADDR + 94)) // BLE_L_NRXEMPTY +#define BLE_NRXFIFOFULL XREG((BLE_REG_BASE_ADDR + 95)) // BLE_NRXFIFOFULL + +//////////////////////////////////////////////////////////////////////////////// +// Raw Data Transmit and Receive Only +// Note: Only the following registers and BLE_ENDCAUSE are valid when the nR is +// configured to operate as a Raw Transmit/Receive task. This task is +// only used for Direct Test Mode. +// +#define BLE_RAW_CONF XREG((BLE_REG_BASE_ADDR + 81)) // BLE_RAW_CONF +#define BLE_RAW_FIFOCMD XREG((BLE_REG_BASE_ADDR + 82)) // BLE_RAW_FIFOCMD +#define BLE_RAW_WINIT XREG((BLE_REG_BASE_ADDR + 83)) // BLE_RAW_WINIT +#define BLE_RAW_CRCINIT0 XREG((BLE_REG_BASE_ADDR + 84)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT1 XREG((BLE_REG_BASE_ADDR + 85)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT2 XREG((BLE_REG_BASE_ADDR + 86)) // BLE_RAW_CRCINIT +#define BLE_RAW_CRCINIT3 XREG((BLE_REG_BASE_ADDR + 87)) // BLE_RAW_CRCINIT +// +#define BLE_RAW_NTX0 XREG((BLE_REG_BASE_ADDR + 88)) // BLE_RAW_NTX +#define BLE_RAW_NTX1 XREG((BLE_REG_BASE_ADDR + 89)) // BLE_RAW_NTX +#define BLE_RAW_NRXOK0 XREG((BLE_REG_BASE_ADDR + 90)) // BLE_RAW_NRXOK +#define BLE_RAW_NRXOK1 XREG((BLE_REG_BASE_ADDR + 91)) // BLE_RAW_NRXOK +#define BLE_RAW_NRXNOK0 XREG((BLE_REG_BASE_ADDR + 92)) // BLE_RAW_NRXNOK +#define BLE_RAW_NRXNOK1 XREG((BLE_REG_BASE_ADDR + 93)) // BLE_RAW_NRXNOK +// +#define BLE_RAW_TX_CRC_LEN XREG((BLE_REG_BASE_ADDR + 94)) // BLE_TX_CRC_LENGTH +#define BLE_RAW_RX_LEN XREG((BLE_REG_BASE_ADDR + 95)) // BLE_RX_LENGTH +// +//////////////////////////////////////////////////////////////////////////////// + +#define BLE_LAST_RSSI XREG((BLE_REG_BASE_ADDR + 96)) // BLE_RX_RSSI +#define BLE_ENDCAUSE XREG((BLE_REG_BASE_ADDR + 97)) // BLE_ENDCAUSE +#define BLE_ANCHOR_VALID XREG((BLE_REG_BASE_ADDR + 98)) // BLE_ANCHOR_VALID +#define BLE_DF_BYTES XREG((BLE_REG_BASE_ADDR + 99)) // BLE_A_DF_BYTES +#define BLE_RX_TIMEOUT0 XREG((BLE_REG_BASE_ADDR + 100)) // BLE_L_RXTIMEOUT LSO +#define BLE_RX_TIMEOUT1 XREG((BLE_REG_BASE_ADDR + 101)) // BLE_L_RXTIMEOUT MSO + +// White List Owner +#define PHY_SCAN_WL 0 +#define PHY_HOST_WL 1 + +// RF Constants +#define PHY_FIFO_SIZE 0x80 +#define PHY_RSSI_VALUE_INVALID 0x80 +#define PHY_NUM_RF_CHANS 40 +#define PHY_FIRST_RF_CHAN 0 +#define PHY_LAST_RF_CHAN (PHY_NUM_RF_CHANS-1) + +// RF FIFO Command Values +#define PHY_FIFO_RX_RESET 0x81 +#define PHY_FIFO_RX_DEALLOC 0x82 +#define PHY_FIFO_RX_RETRY 0x83 +#define PHY_FIFO_RX_DISCARD 0x84 +#define PHY_FIFO_RX_COMMIT 0x85 +// +#define PHY_FIFO_TX_RESET 0x91 +#define PHY_FIFO_TX_DEALLOC 0x92 +#define PHY_FIFO_TX_RETRY 0x93 +#define PHY_FIFO_TX_DISCARD 0x94 +#define PHY_FIFO_TX_COMMIT 0x95 +// +#define PHY_FIFO_RESET 0xF1 +#define PHY_FIFO_DEALLOC 0xF2 +#define PHY_FIFO_RETRY 0xF3 +#define PHY_FIFO_DISCARD 0xF4 +#define PHY_FIFO_COMMIT 0xF5 + +// RF Registers +#define PHY_PN7_WHITENER_BIT BV(0) +#define PHY_PN9_WHITENER_BIT BV(1) +// +#define PHY_MOD_NO_TONE 0x04 +#define PHY_MOD_GFSK_250KHZ_1MBPS_TONE 0x24 +#define PHY_MOD_GFSK_156KHZ_250KBPS_TONE 0x28 +#define PHY_MOD_GFSK_156KHZ_1MBPS_TONE 0x2C +#define PHY_MOD_MSK_250KBPS_TONE 0x30 +#define PHY_MOD_MSK_500KBPS_TONE 0x32 +#define PHY_MOD_MSK_1MBPS_TONE 0x34 +// +#define PHY_CORRELATION_THRESHOLD 0x48 +#define PHY_FREQ_OFFSET 0x40 + +#if defined( CC2541) || defined( CC2541S ) +#define PHY_TX_FILTER_CONFIG 0x03 +#define PHY_TX_CTRL_DAC_CURRENT 0x19 +#define PHY_TX_IV_CTRL 0x1B +#define PHY_PREAMBLE_SYNC 0x02 +#define PHY_RX_CHARGE_PUMP 0x0D +#else // CC2540 +#define PHY_TX_FILTER_CONFIG 0x07 +#define PHY_TX_CTRL_DAC_CURRENT 0x69 +#define PHY_TX_IV_CTRL 0xFF // Don't Care as Not Used! +#define PHY_PREAMBLE_SYNC 0x00 +#define PHY_COMP_QUAD_SKEW 0x16 +#endif // CC2541 || CC2541S + +// Frequency Tuning +#define PHY_FREQ_TUNE_NO_CAP_LOAD 0x0F + +// Rx Gain +#define PHY_RX_LNA_GAIN_STD 0x3A +#define PHY_RX_LNA_GAIN_HIGH 0x7F +#define PHY_RX_CTRL_STD 0x33 +#define PHY_RX_CTRL_HIGH 0x3F +#define PHY_RX_FSCTRL_STD 0x55 +#define PHY_RX_FSCTRL_HIGH 0x5A +// CC2590 +#define PHY_CC2590_HGM_LOW 0x00 +#define PHY_CC2590_HGM_HIGH 0x01 + +// RSSI Correction Based on Rx Gain +#define PHY_RSSI_DB2DBM_STD_GAIN 0x61 +#define PHY_RSSI_DB2DBM_HIGH_GAIN 0x6A + +// RSSI Correction Based on Rx Gain for CC2590 RF Range Extender +#define PHY_RSSI_DB2DBM_STD_GAIN_CC2590 0x67 +#define PHY_RSSI_DB2DBM_HIGH_GAIN_CC2590 0x71 + +// Tx Output Power +#if defined( CC2541) || defined( CC2541S ) +#define PHY_TX_POWER_REG_MINUS_23_DBM 0x31 +#define PHY_TX_POWER_REG_MINUS_6_DBM 0xB1 +#define PHY_TX_POWER_REG_0_DBM 0xE1 +#define PHY_TX_POWER_REG_4_DBM 0xFF // Don't Care as Not Used! +#else // CC2540 +#define PHY_TX_POWER_REG_MINUS_23_DBM 0x05 +#define PHY_TX_POWER_REG_MINUS_6_DBM 0x95 +#define PHY_TX_POWER_REG_0_DBM 0xD5 +#define PHY_TX_POWER_REG_4_DBM 0xF5 +#endif // CC2541 || CC2541S + +// RF Normal Interrupts +#define PHY_RFIRQ0_TXTHSHDN_BIT BV(0) +#define PHY_RFIRQ0_RXTHSHDN_BIT BV(1) +#define PHY_RFIRQ0_TXTHSHUP_BIT BV(2) +#define PHY_RFIRQ0_RXTHSHUP_BIT BV(3) +// +#define PHY_RFIRQ1_RXOK_BIT BV(0) +#define PHY_RFIRQ1_RXCTRL_BIT BV(1) +#define PHY_RFIRQ1_RXNOK_BIT BV(2) +#define PHY_RFIRQ1_RXIGNORED_BIT BV(3) +#define PHY_RFIRQ1_RXEMPTY_BIT BV(4) +#define PHY_RFIRQ1_TXDONE_BIT BV(5) +#define PHY_RFIRQ1_TASKDONE_BIT BV(6) +#define PHY_RFIRQ1_PINGRSP_BIT BV(7) + +// RF Error Interrupts +#define PHY_RFERR_TXUNDERF_BIT BV(0) +#define PHY_RFERR_RXUNDERF_BIT BV(1) +#define PHY_RFERR_TXOVERF_BIT BV(2) +#define PHY_RFERR_RXOVERF_BIT BV(3) +#define PHY_RFERR_RXTXABO_BIT BV(4) +#define PHY_RFERR_NRERR_BIT BV(5) +#define PHY_RFERR_RXFIFOFULL_BIT BV(6) + +/******************************************************************************* + * TYPEDEFS + */ + +typedef unsigned char volatile __xdata * phyXRegPtr_t; +typedef unsigned char volatile __xdata * phyXDataPtr_t; + +enum +{ + PHY_STATUS_SUCCESS, + PHY_STATUS_FAILURE, + PHY_STATUS_ERROR_BL_CKSUM_FAILURE, + PHY_STATUS_WL_FULL, + PHY_STATUS_WL_EMPTY, + PHY_STATUS_WL_ENTRY_NOT_FOUND, + PHY_STATUS_WL_ENTRY_FOUND +}; +typedef uint8 phyStatus_t; + +enum +{ + PHY_SEM_0, + PHY_SEM_1, + PHY_SEM_2 +}; +typedef uint8 phySemId_t; + + +enum +{ + PHY_ADDR_TYPE_PUBLIC, + PHY_ADDR_TYPE_RANDOM +}; +typedef uint8 phyAddrType_t; + + +enum +{ + PHY_ADV_CHANNEL_37 = BV(0), + PHY_ADV_CHANNEL_38 = BV(1), + PHY_ADV_CHANNEL_39 = BV(2) +}; +typedef uint8 phyChanMap_t; + + +enum +{ + PHY_SCAN_MODE_PASSIVE, + PHY_SCAN_MODE_ACTIVE +}; +typedef uint8 phyScanMode_t; + +enum +{ + PHY_SCAN_END_ON_ADV_REPORT_DISABLED, + PHY_SCAN_END_ON_ADV_REPORT_ENABLED +}; +typedef uint8 phyScanEnd_t; + +enum +{ + PHY_END_CONN_CONTINUE, // set ENDC = 0 + PHY_END_CONN_AFTER_NEXT_PKT // set ENDC = 1 +}; +typedef uint8 phyEndConn_t; + +enum +{ + PHY_MD_BIT_FROM_FIFO_ENTRY = (0 << 1), // use bit in packet + PHY_MD_BIT_BASED_ON_FIFO_CONTENTS = (1 << 1), // set MD based on data in TX FIFO + PHY_MD_BIT_ALWAYS_ZERO = (2 << 1), // always 0 + PHY_MD_BIT_ALWAYS_ONE = (3 << 1) // always 1 +}; +typedef uint8 phyConfMD_t; + +enum +{ + PHY_FIFO_DATA_DIABLE_ALL = 0, + PHY_FIFO_DATA_AUTO_FLUSH_IGNORED = BV(0), + PHY_FIFO_DATA_AUTO_FLUSH_CRC_ERROR = BV(1), + PHY_FIFO_DATA_AUTO_FLUSH_EMPTY_PKT = BV(2), + PHY_FIFO_DATA_APPEND_RX_STATUS = BV(3) +}; +typedef uint8 phyFifoData_t; + +enum +{ + PHY_FIFO_CONFIG_DISABLE_ALL = 0, + PHY_FIFO_CONFIG_AUTO_DEALLOC_RX = BV(0), + PHY_FIFO_CONFIG_AUTO_COMMIT_RX = BV(1), + PHY_FIFO_CONFIG_AUTO_DEALLOC_TX = BV(4), + PHY_FIFO_CONFIG_AUTO_COMMIT_TX = BV(5) +}; +typedef uint8 phyFifoConfig_t; + +enum +{ + PHY_ADVERTISER_WHITE_LIST_NONE, + PHY_ADVERTISER_WHITE_LIST_SCAN_REQ, + PHY_ADVERTISER_WHITE_LIST_CONNECT_REQ, + PHY_ADVERTISER_WHITE_LIST_ALL +}; +typedef uint8 phyAdvWlPolicy_t; + +enum +{ + PHY_SCANNER_ALLOW_ALL_ADV_PKTS, + PHY_SCANNER_USE_WHITE_LIST +}; +typedef uint8 phyScanWlPolicy_t; + +enum +{ + PHY_INITIATOR_USE_PEER_ADDR, + PHY_INITIATOR_USE_WL +}; +typedef uint8 phyInitWlPolicy_t; + +enum +{ + PHY_SET_BLACKLIST_DISABLE, + PHY_SET_BLACKLIST_ENABLE +}; +typedef uint8 phyBlacklist_t; + +enum +{ + PHY_DISABLE_ALL_WHITENER, + PHY_ENABLE_BLE_WHITENER, + PHY_DISABLE_BLE_WHITENER, + PHY_ENABLE_PN9_WHITENER, + PHY_DISABLE_PN9_WHITENER, + PHY_ENABLE_ONLY_BLE_WHITENER, + PHY_ENABLE_ONLY_PN9_WHITENER, + PHY_ENABLE_ALL_WHITENER +}; +typedef uint8 phyWhitener_t; + +enum +{ + PHY_ENABLE_APPEND_RF_STATUS, + PHY_DISABLE_APPEND_RF_STATUS +}; +typedef uint8 phyAppendRfStatus_t; + +enum +{ + PHY_RF_RAM_BANK_0, + PHY_RF_RAM_BANK_1, + PHY_RF_RAM_BANK_2, + PHY_RF_RAM_BANK_3, + PHY_RF_RAM_BANK_4, + PHY_RF_RAM_BANK_5, + PHY_RF_RAM_RX_FIFO, + PHY_RF_RAM_TX_FIFO +}; +typedef uint8 phyRfRamBank_t; + +enum +{ + PHY_CMD_SHUTDOWN = 1, // stop operation immediately + PHY_CMD_DEMOD_TEST = 2, // start demodulator w/o sync search + PHY_CMD_RX_TEST = 3, // start demodulator & sync search + PHY_CMD_TX_TEST = 4, // start TX, send zeros + PHY_CMD_TX_CAL_TEST = 5, // calibrate, start TX, send zeros + PHY_CMD_PING = 6, // ping RF + + PHY_CMD_BLE_SLAVE = 16, // Slave + PHY_CMD_BLE_MASTER = 17, // Master + + PHY_CMD_BLE_ADV = 18, // Connectable Undirected Advertiser + PHY_CMD_BLE_ADV_DIR = 19, // Connectable Directed Advertiser + PHY_CMD_BLE_ADV_NC = 20, // Nonconnectable Advertiser + PHY_CMD_BLE_ADV_DISC = 21, // Discoverable Undirected Advertiser + + PHY_CMD_BLE_SCAN = 22, // Scanner + PHY_CMD_BLE_INITIATOR = 23, // Initiator + + PHY_CMD_BLE_RX_RAW = 24, // RX raw data + PHY_CMD_BLE_TX_RAW = 25, // TX a raw data message + + PHY_CMD_SEND_EVENT1 = 33, // trigger Timer 2 Event 1 + PHY_CMD_SEND_EVENT2 = 34, // trigger Timer 2 Event 2 + + PHY_CMD_INVALID = 0xFF +}; +typedef uint8 phyCmd_t; + +enum +{ + PHY_TASK_ENDOK = 0, // task ended normally + PHY_TASK_RXTIMEOUT = 1, // timeout of first RX; slave, scan, init + PHY_TASK_NOSYNC = 2, // timeout of subsequent RX + PHY_TASK_RXERR = 3, // task ended due to RX error (CRC or other) + PHY_TASK_CONNECT = 4, // CONNECT_REQ received; adv + PHY_TASK_MAXNACK = 5, // max number retrans exceeded; master, slave + PHY_TASK_ABORT = 6, // task aborted by command + // + // Note: If the following values are changed to non-negative numbers, all + // table entry indices for taskErrorEndCauses will have to be changed + // as well. + // + PHY_TASKERR_RXFIFO = 250, // overfull RX FIFO; adv, scan, init + PHY_TASKERR_TXFIFO = 251, // empty TX FIFO when not permitted + PHY_TASKERR_PAR = 252, // illegal parameter + PHY_TASKERR_SEM = 253, // unable to obtain semaphore + PHY_TASKERR_CMD = 254, // unknown command + PHY_TASKERR_INTERNAL = 255 // internal program error +}; + +enum +{ + PHY_FREQ_MODE_MODULATED_CW, + PHY_FREQ_MODE_UNMODULATED_CW +}; +typedef uint8 phyFreqMode_t; + +enum +{ + PHY_RAW_RUN_ONCE, + PHY_RAW_RUN_REPEAT +}; +typedef uint8 phyRawRunMode_t; + +enum +{ + PHY_RAW_START_IMMEDIATE, + PHY_RAW_START_ON_TIMER_EVENT +}; +typedef uint8 phyRawStartMode_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * API + */ + +/******************************************************************************* + * @fn PHY_Init + * + * @brief Loads the nanoRisc image and initialises PHY module. + * + * Note: This routine does not verify the nR image after loading. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Init( void ); + + +/******************************************************************************* + * @fn PHY_Reset + * + * @brief Holds the nR in Reset, then releases it. + * + * Note: This will clear any nR pending interrupts. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Reset( void ); + + +/******************************************************************************* + * @fn PHY_LoadNR + * + * @brief Copies nanoRisc image from the array to nanoRisc memory + * location. + * + * Note: After the load, the nanoRisc is left in reset. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_LoadNR( void ); + + +/******************************************************************************* + * @fn PHY_VerifyNR + * + * @brief Verifies that the nanoRisc image in the memory is not corrupted. + * Compares the RAM memory data with the image array which is + * located in the code section. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_FAILURE + */ +phyStatus_t PHY_VerifyNR( void ); + + +/******************************************************************************* + * @fn PHY_ClearAllRegsAndFifos + * + * @brief Clears the nanoRisc register bank, and the TX and RX FIFO banks. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearAllRegsAndFifos( void ); + + +/******************************************************************************* + * @fn PHY_GetSem + * + * @brief Get the specified semaphore. + * + * input parameters + * + * @param semId - PHY_SEM_0, PHY_SEM_1, PHY_SEM_2. + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS: Semaphore was free and was taken. + * PHY_STATUS_FAILURE: Semaphore is not free. + */ +phyStatus_t PHY_GetSem( phySemId_t semId ); + + +/******************************************************************************* + * @fn PHY_ReleaseSem + * + * @brief Release the specified semaphore. + * + * input parameters + * + * @param semId - PHY_SEM_0, PHY_SEM_1, PHY_SEM_2 + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS: Semaphore was released. + * PHY_STATUS_FAILURE: Semaphore was already free. + */ +phyStatus_t PHY_ReleaseSem( phySemId_t semId ); + + +/******************************************************************************* + * @fn PHY_SetOwnAddr + * + * @brief Set Own device address and address type. + * + * input parameters + * + * @param addr - Pointer to Own device BLE address. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetOwnAddr( uint8 *addr, + phyAddrType_t addrType); + + +/******************************************************************************* + * @fn PHY_SetPeerAddr + * + * @brief Set Peer device address and address type. + * + * input parameters + * + * @param addr - Pointer to Peer device BLE address. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetPeerAddr( uint8 *addr, + phyAddrType_t addrType); + + +/******************************************************************************* + * @fn PHY_SetCRCInit + * + * @brief Set initial CRC value used in a connection. + * + * input parameters + * + * @param crcInit - Initial 3 byte CRC value. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetCRCInit( uint32 crcInit ); + + +/******************************************************************************* + * @fn PHY_GetAdvChans + * + * @brief Read the configured advertising channels to be used. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Three bit Advertising bit map of a combination of: + * PHY_ADV_CHANNEL_37, PHY_ADV_CHANNEL_38, and PHY_ADV_CHANNEL_39. + */ +phyChanMap_t PHY_GetAdvChans( void ); + + +/******************************************************************************* + * @fn PHY_SetAdvChans + * + * @brief Configure the advertising channels to be used. + * + * input parameters + * + * @param advChanMap - Three bit Advertising bit map of a combination of: + * PHY_ADV_CHANNEL_37, PHY_ADV_CHANNEL_38, and + * PHY_ADV_CHANNEL_39. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetAdvChans( uint8 advChanMap ); + + +/******************************************************************************* + * @fn PHY_SetDataChan + * + * @brief Configure the data channel to be used: + * Master/Slave use data channels 0-36. + * Scanner/Initiator use data channels 37-39. + * + * input parameters + * + * @param dataChan - Data channel value. + * + * output parameters + * + * @param None. + * + * @return None. + */ +NEAR_FUNC void PHY_SetDataChan( uint8 dataChan ); + + +/******************************************************************************* + * @fn PHY_GetDataChan + * + * @brief Read the configured data channel: + * Master/Slave use data channels 0-36. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return dataChan - Data channel value. + */ +NEAR_FUNC uint8 PHY_GetDataChan( void ); + + +/******************************************************************************* + * @fn PHY_SetEndConnection + * + * @brief Configure the ENDC bit in pkt. If set, the connection is closed + * after next packet is received from the slave. + * + * input parameters + * + * @param endConn - PHY_END_CONN_CONTINUE, PHY_END_CONN_AFTER_NEXT_PKT. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetEndConnection( phyEndConn_t endConn ); + + +/******************************************************************************* + * @fn PHY_ConfigureMD + * + * @brief Configures how the More Data (MD) bit is populated in the data + * PDU. + * + * input parameters + * + * @param moreData - PHY_MD_BIT_FROM_FIFO_ENTRY, + * PHY_MD_BIT_BASED_ON_FIFO_CONTENTS, + * PHY_MD_BIT_ALWAYS_ZERO, + * PHY_MD_BIT_ALWAYS_ONE + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureMD( phyConfMD_t moreData ); + + +/******************************************************************************* + * @fn PHY_SetBackoffCnt + * + * @brief Set the Scanner backoff count. + * + * input parameters + * + * @param count - Backoff count: 1-256. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetBackoffCnt( uint16 count ); + + +/******************************************************************************* + * @fn PHY_SetScanMode + * + * @brief Configure Scanner to scan active or passive. + * + * input parameters + * + * @param scanMode - PHY_SCAN_MODE_PASSIVE, PHY_SCAN_MODE_ACTIVE. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanMode( phyScanMode_t scanMode ); + + +/******************************************************************************* + * @fn PHY_SetScanEnd + * + * @brief Configure Scanner to end after a Scan Request is received for + * which no Scan Response will be sent. + * + * input parameters + * + * @param scanEnd - PHY_SCAN_END_ON_ADV_REPORT_DISABLED, + * PHY_SCAN_END_ON_ADV_REPORT_ENABLED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanEnd( phyScanEnd_t scanEnd ); + + +/******************************************************************************* + * @fn PHY_GetEndCause + * + * @brief Returns the task end cause. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The LLE nR task end cause. + */ +uint8 PHY_GetEndCause( void ); + + +/******************************************************************************* + * @fn PHY_AnchorValid + * + * @brief Check if there is a valid anchor point value. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: Valid anchor point value. + * FALSE: The anchor point is not valid. + */ +uint8 PHY_AnchorValid( void ); + + +/******************************************************************************* + * @fn PHY_InitSeqStat + * + * @brief Initialize the connection sequencing status to the default + * value. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_InitSeqStat( void ); + + +/******************************************************************************* + * @fn PHY_FirstPktReceived + * + * @brief Returns an indication of whether the first packet in a new + * connection, or updated connection, has been received. + * + * Note: The logic of returned value is true-low. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: First packet has not yet been received. + * FALSE: First packet has been received. + */ +uint8 PHY_FirstPktReceived( void ); + + +/******************************************************************************* + * @fn PHY_CtrlAckPending + * + * @brief Returns an indication of whether the last successfully received + * packet that was a LL control packet has been ACK'ed or not. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TRUE: ACK for last received control packet is pending. + * FALSE: Last received control packet has been ACK'ed. + */ +uint8 PHY_CtrlAckPending( void ); + + +/******************************************************************************* + * @fn PHY_SetSyncWord + * + * @brief Set synchronization word. + * + * Note: The synch word lenght is fixed at four bytes. + * + * input parameters + * + * @param syncWord - Synchronization word (a.k.a. access address). + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetSyncWord( uint32 syncWord ); + + +/******************************************************************************* + * @fn PHY_SetMaxNack + * + * @brief Set the maximum number of NACKs allowed to be received before + * ending the connection event. + * + * input parameters + * + * @param maxNackCount - Maximum number of NACKs allowed count, or zero + * to disable this feature. + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetMaxNack( uint8 maxNackCount ); + + +/******************************************************************************* + * @fn PHY_ClearWhitelist + * + * @brief Clears the white list table and the number of table entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWhitelist( void ); + + +/******************************************************************************* + * @fn PHY_ClearWlEntry + * + * @brief Clears the white list table entry. + * + * input parameters + * + * @param wlEntryIndex - Whhite list table entry index. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWlEntry( uint8 wlEntryIndex ); + + +/******************************************************************************* + * @fn PHY_ClearWlBasedOnBl + * + * @brief Clears the white list table entries that correspond to + * blacklist entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWlBasedOnBl( void ); + + +/******************************************************************************* + * @fn PHY_GetNumFreeWlEntries + * + * @brief Returns the number of available white list entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of available white list entries. + */ +uint8 PHY_GetNumFreeWlEntries( void ); + + +/******************************************************************************* + * @fn PHY_GetWlSize + * + * @brief Returns the number of white list entries. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of white list entries. + */ +uint8 PHY_GetWlSize( void ); + + +/******************************************************************************* + * @fn PHY_AddWlEntry + * + * @brief Adds a white list entry. The address is added at the next + * available index. If the table is full, it returns a failure. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * @param setBlacklist - PHY_SET_BLACKLIST_DISABLE, + * PHY_SET_BLACKLIST_ENABLE + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_WL_FULL, PHY_STATUS_FAILURE + */ +phyStatus_t PHY_AddWlEntry( uint8 *addr, + phyAddrType_t addrType, + phyBlacklist_t setBlacklist ); + + +/******************************************************************************* + * @fn PHY_RemoveWlEntry + * + * @brief Removes a white list entry based on its address and address + * type. If located, then the entry is set invalid, and the address + * is cleared. If the table is empty, or the address and address + * type is not located, it returns a failure. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return PHY_STATUS_SUCCESS, PHY_STATUS_WL_EMPTY, + * PHY_STATUS_WL_ENTRY_NOT_FOUND + */ +phyStatus_t PHY_RemoveWlEntry( uint8 *addr, + phyAddrType_t addrType ); + + +/******************************************************************************* + * @fn PHY_SetAdvWlPolicy + * + * @brief Set the Advertiser's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_ADVERTISER_WHITE_LIST_NONE, + * PHY_ADVERTISER_WHITE_LIST_SCAN_REQ, + * PHY_ADVERTISER_WHITE_LIST_CONNECT_REQ, + * PHY_ADVERTISER_WHITE_LIST_ALL + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetAdvWlPolicy( phyAdvWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetScanWlPolicy + * + * @brief Set the Advertiser's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_SCANNER_ALLOW_ALL_ADV_PKTS, + * PHY_SCANNER_USE_WHITE_LIST + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetScanWlPolicy( phyScanWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetInitWlPolicy + * + * @brief Set the Initiator's white list policy. + * + * input parameters + * + * @param wlPolicy - PHY_INITIATOR_USE_PEER_ADDR, + * PHY_INITIATOR_USE_WL + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetInitWlPolicy( phyInitWlPolicy_t wlPolicy ); + + +/******************************************************************************* + * @fn PHY_SetBlacklistIndex + * + * @brief Set a white list table entry as being black listed. That is, + * Advertising packets received with the address and address type + * of the white list table entry that is black listed are ignored. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param blackListIndex - The white list table entry that is blacklisted. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetBlacklistIndex( uint8 blackListIndex ); + + +/******************************************************************************* + * @fn PHY_SetBlacklistEntry + * + * @brief Search the white list table for an entry, and if found, set the + * corresponding blacklist entry index. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param addr - Pointer to device address to be added. + * @param addrType - PHY_ADDR_TYPE_PUBLIC, PHY_ADDR_TYPE_RANDOM + * + * output parameters + * + * @param None. + * + * @return None. + */ +phyStatus_t PHY_SetBlacklistEntry( uint8 *addr, + phyAddrType_t addrType ); + + +/******************************************************************************* + * @fn PHY_ClearBlacklistIndex + * + * @brief Clear a blacklist table entry based on a white list entry index. + * + * input parameters + * + * @param blackListIndex - The white list table entry that is blacklisted. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearBlacklistIndex( uint8 blackListIndex ); + + +/******************************************************************************* + * @fn PHY_ClearBlacklist + * + * @brief Clear the black list. All white list table entries are used as + * normal white list entries. + * + * Note: This feature is only used by the Scanner. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearBlacklist( void ); + + +/******************************************************************************* + * @fn PHY_SaveWhiteList + * + * @brief This routine saves any valid white list entries to Bank 1. This + * routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SaveWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_RestoreWhiteList + * + * @brief This routine restores any valid white list entries from Bank 1. + * This routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RestoreWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_ClearSavedWhiteList + * + * @brief This routine clears any valid white list entries from Bank 1. + * This routine is only used when Scanning with filter enabled and + * the white list policy is "Any". + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearSavedWhiteList( uint8 wlOwner ); + + +/******************************************************************************* + * @fn PHY_Command + * + * @brief Send a command to the LLE nanoRisc. + * + * input parameters + * + * @param cmd - LLE nanoRisc command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_Command( phyCmd_t cmd ); + + +/******************************************************************************* + * @fn PHY_ClearCounters + * + * @brief Clears all LLE nanoRisc counters. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearCounters( void ); + + +/******************************************************************************* + * @fn PHY_ReadCounters + * + * @brief Reads all LLE nanoRisc counters. + * + * input parameters + * + * @param cntPtr - Pointer to array to hold LLE nanoRisc counters. + * + * output parameters + * + * @param cntPtr - Pointer to populated array of LLE nanoRisc counters. + * + * @return None. + */ +void PHY_ReadCounters( uint8 *cntPtr ); + + +/******************************************************************************* + * @fn PHY_ConfigureFifoDataProcessing + * + * @brief Configure FIFO data processing. This includes flushing ignored + * packets, packets that fail the CRC, and empty packets. Also, + * whether a RX status containing the packets's data channel number + * and RSSI should be appended to the end of the packet. + * + * input parameters + * + * @param fifoDataConf - Bit mapped configuration value where each + * included bit enables a feature: + * PHY_FIFO_DATA_DIABLE_ALL or some combination of: + * PHY_FIFO_DATA_AUTO_FLUSH_IGNORED + * PHY_FIFO_DATA_AUTO_FLUSH_CRC_ERROR + * PHY_FIFO_DATA_AUTO_FLUSH_EMPTY_PKT + * PHY_FIFO_DATA_APPEND_RX_STATUS + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureFifoDataProcessing( phyFifoData_t fifoDataConf ); + + +/******************************************************************************* + * @fn PHY_ConfigureAppendRfStatus + * + * @brief Configure if nanoRisc should append the RF status to the end of + * received packets. + * + * input parameters + * + * @param appendRfStatus - PHY_ENABLE_APPEND_RF_STATUS, + * PHY_DISABLE_APPEND_RF_STATUS + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigureAppendRfStatus( phyAppendRfStatus_t appendRfStatus ); + + +/******************************************************************************* + * @fn PHY_SetFifoConfig + * + * @brief Configure FIFO configuration operations. This includes automatic + * dellocation of RX packet and commit of TX packet by MCU, and + * automatic commit of RX packet and deallocate of TX packet by nR. + * + * input parameters + * + * @param fifoConfig - Bit mapped configuration value where each included + * bit enables a FIFO automatic operation: + * PHY_FIFO_CONFIG_DISABLE_ALL or some combination of: + * PHY_FIFO_CONFIG_AUTO_DEALLOC_RX + * PHY_FIFO_CONFIG_AUTO_COMMIT_RX + * PHY_FIFO_CONFIG_AUTO_DEALLOC_TX + * PHY_FIFO_CONFIG_AUTO_COMMIT_TX + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetFifoConfig( phyFifoConfig_t fifoConfig ); + + +/******************************************************************************* + * @fn PHY_InitLastRssi + * + * @brief Set the Last RSSI value to invalid. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_InitLastRssi( void ); + + +/******************************************************************************* + * @fn PHY_GetLastRssi + * + * @brief Get the Last RSSI value captured by the nanoRisc. + * + * Note: The returned value is returned as an unsigned integer! + * Note: The returned value is not corrected for RX gain. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The last data RSSI received by the nanoRisc, as an unsigned + * integer. Invalid value: 0x80. + */ +uint8 PHY_GetLastRssi( void ); + + +/******************************************************************************* + * @fn PHY_GetRssi + * + * @brief Get the RF RSSI value. + * + * Note: The returned value is returned as an unsigned integer! + * Note: This call should only be made when RX is active. + * Note: An invalid value is -128. + * Note: The returned value is not corrected for RX gain. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return The RF RSSI, as an unsigned integer. Invalid value: 0x80. + */ +uint8 PHY_GetRssi( void ); + + +/******************************************************************************* + * @fn Clear Window Configuration + * + * @brief Clear the window connfiguration register so that the connect + * request packet uses the window offset stored in the packet. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ClearWinConfig( void ); + + +/******************************************************************************* + * @fn Set Dynamic Window Offset + * + * @brief This routine sets the window offset and connection interval + * used during dynamic window offset control when forming multiple + * connections. For this feature, once the Initiator has started, + * each T2E1 pulse will decrement the winOffset. When the Init + * responds with a CONNECT_REQ, it will contain the window offset + * based on this dynamic adjustment. This is needed to start the + * new connection at a precise time. But since it is not known + * when the CONNECT_REQ will happen, the window offset is adjusted + * (i.e. corrected) on each system tick. + * + * input parameters + * + * @param uint16 winOffset - Initial window offset, in 625us ticks. + * @param uint16 connInterval - New connection's interval in 625us ticks. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetDynamicWinOffset( uint16 winOffset, + uint16 connInterval ); + + +/******************************************************************************* + * @fn PHY_SetWhitener + * + * @brief Configure the whitener as none, only BLE Pseudo Number 7 (PN7), + * only the TI Pseudo Number 9 (PN9), or both. + * + * input parameters + * + * @param whitener - PHY_DISABLE_ALL_WHITENER, + * PHY_ENABLE_BLE_WHITENER, + * PHY_DISABLE_BLE_WHITENER, + * PHY_ENABLE_PN9_WHITENER, + * PHY_DISABLE_PN9_WHITENER, + * PHY_ENABLE_ONLY_BLE_WHITENER, + * PHY_ENABLE_ONLY_PN9_WHITENER, + * PHY_ENABLE_ALL_WHITENER + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ConfigWhitener( phyWhitener_t whitener ); + + +/******************************************************************************* + * @fn PHY_ResetTxFifo + * + * @brief Reset the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_ResetRxFifo + * + * @brief Reset the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_ResetTxRxFifo + * + * @brief Reset the TX and RX FIFOs. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ResetTxRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_TxFifoBytesFree + * + * @brief Reads the number of available bytes in the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of available bytes, 0..127. + */ +uint8 PHY_TxFifoBytesFree( void ); + + +/******************************************************************************* + * @fn PHY_TxFifoLen + * + * @brief Reads the number of used bytes in the TX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of used bytes, 0..127. + */ +uint8 PHY_TxFifoLen( void ); + + +/******************************************************************************* + * @fn PHY_RxFifoLen + * + * @brief Reads the number of used bytes in the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of used bytes, 0..127. + */ +uint8 PHY_RxFifoLen( void ); + + +/******************************************************************************* + * @fn PHY_RetryTxFifo + * + * @brief Issue a TX FIFO Retry operation. + * + * Note: Normally the TX FIFO read pointers are managed by the + * nanoRisc. However, for Raw mode, after the packet has + * been sent, then a retry must be issued to reuse the + * packet already in the TX FIFO. + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RetryTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_RetryRxFifo + * + * @brief Issue a RX FIFO Retry operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RetryRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_CommitTxFifo + * + * @brief Issue a TX FIFO Commit operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_CommitTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_CommitRxFifo + * + * @brief Issue a RX FIFO Commit operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_CommitRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_DiscardTxFifo + * + * @brief Issue a RX FIFO Discard operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_DiscardTxFifo( void ); + + +/******************************************************************************* + * @fn PHY_DeallocateRxFifo + * + * @brief Issue a RX FIFO Deallocate operation. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_DeallocateRxFifo( void ); + + +/******************************************************************************* + * @fn PHY_SetRxFifoThreshold + * + * @brief Set the RX FIFO Threshold. + * + * input parameters + * + * @param thresLen - FIFO watermark, 0..127. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetRxFifoThreshold( uint8 thresLen ); + + +/******************************************************************************* + * @fn PHY_GetTxSWP + * + * @brief Get the TX FIFO Start Write Pointer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return TX FIFO Start Write Pointer. + */ +uint8 *PHY_GetTxSWP( void ); + + +/******************************************************************************* + * @fn PHY_GetRxSRP + * + * @brief Get the RX FIFO Start Read Pointer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return RX FIFO Start Read Pointer. + */ +uint8 *PHY_GetRxSRP( void ); + + +/******************************************************************************* + * @fn PHY_WriteByte + * + * @brief Write multiple bytes of data to TX FIFO. + * + * Note: It is assumed the caller does not write more than the + * amount of free space available in the TX FIFO. + * + * input parameters + * + * @param data - Pointer to data to be written. + * @param len - Number of bytes to be written. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_WriteByte( uint8 *data, + uint8 len ); + + +/******************************************************************************* + * @fn PHY_WriteByteVal + * + * @brief Write a single byte of data to TX FIFO. + * + * Note: It is assumed the caller does not write more than the + * amount of free space available in the TX FIFO. + * + * input parameters + * + * @param value - A single byte of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_WriteByteVal( uint8 value ); + + +/******************************************************************************* + * @fn PHY_ReadByte + * + * @brief Read multiple bytes of data from the RX FIFO. + * + * Note: It is assumed the caller does not read more than the + * amount of available data in the RX FIFO. + * + * input parameters + * + * @param ptr - Pointer to buffer to place read data. If NULL, the read + * data is discarded, but RX FIFO read pointer is still + * advanced. + * @param len - Number of bytes to be read. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_ReadByte( uint8 *ptr, + uint8 len ); + + +/******************************************************************************* + * @fn PHY_ReadByteVal + * + * @brief Read a single byte of data from the RX FIFO. + * + * Note: It is assumed the caller does not read more than the + * amount of available data in the RX FIFO. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A single byte of data from the RX FIFO. + */ +uint8 PHY_ReadByteVal( void ); + + +/******************************************************************************* + * @fn PHY_MapDataBank + * + * @brief Map a data bank to the specified RF RAM bank. + * + * input parameters + * + * @param bankNum - The RF RAM bank given by one of the following values: + * PHY_RF_RAM_BANK_0, + * PHY_RF_RAM_BANK_1, + * PHY_RF_RAM_BANK_2, + * PHY_RF_RAM_BANK_3, + * PHY_RF_RAM_BANK_4, + * PHY_RF_RAM_BANK_5, + * PHY_RF_RAM_RX_FIFO, + * PHY_RF_RAM_TX_FIFO + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_MapDataBank( phyRfRamBank_t bankNum ); + + +/******************************************************************************* + * @fn PHY_SaveRestoreConn + * + * @brief Saves and restores the TX and RX FIFO for the specified + * connection to/from the LLE RAM bank memory. Called when the + * current connection's FIFO data is to be backed up and another + * connections FIFO is to be restored. The restored connection + * could be a connection that did not exist in the backup. In this + * case, the FIFO parameters will be set to reset conditions. + * + * input parameters + * + * @param saveConnId - Connection ID of FIFOs to be saved. + * @param restoreConnId - Connection ID of FIFOs to be restored. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SaveRestoreConn( uint8 saveConnId, + uint8 restoreConnId ); + + +/******************************************************************************* + * @fn PHY_RestoreConn + * + * @brief Restores TX and RX FIFOs for the specified connection. The data + * currently in the TX and RX FIFO is lost/overwritten. Call this + * when the current FIFO data does not need to be saved. + * + * input parameters + * + * @param connId - Connection ID of FIFOs to be restored. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RestoreConn( uint8 connId ); + + +/******************************************************************************* + * @fn PHY_RawTxInit + * + * @brief Initializes Raw TX Task start operation (immediate or based on + * a timer event) and run operation (single shot, or repeat). + * + * input parameters + * + * @param startMode - PHY_RAW_START_IMMEDIATE, + * PHY_RAW_START_ON_TIMER_EVENT + * @param runMode - PHY_RAW_RUN_ONCE, + * PHY_RAW_RUN_REPEAT + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RawTxInit( phyRawStartMode_t startMode, + phyRawRunMode_t runMode ); + + +/******************************************************************************* + * @fn PHY_RawRxInit + * + * @brief Initializes Raw RX Task start operation (immediate or based on + * a timer event) and run operation (single shot, or repeat). + * + * input parameters + * + * @param startMode - PHY_RAW_START_IMMEDIATE, + * PHY_RAW_START_ON_TIMER_EVENT + * @param runMode - PHY_RAW_RUN_ONCE, + * PHY_RAW_RUN_REPEAT + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_RawRxInit( phyRawStartMode_t startMode, + phyRawRunMode_t runMode ); + + +/******************************************************************************* + * @fn PHY_RawGetNumTxPkts + * + * @brief Gets the number of transmitted packets. + * + * input parameters + * + * @param numTxPkts - Word pointer. + * + * output parameters + * + * @param numTxPkts - The number of transmitted packets. + * + * @return None. + */ +void PHY_RawGetNumTxPkts( uint16 *numTxPkts ); + + +/******************************************************************************* + * @fn PHY_RawGetNumRxPkts + * + * @brief Gets the number of successfully received packets. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param numRxPkts - The number of successfully received packets. + * + * @return None. + */ +void PHY_RawGetNumRxPkts( uint16 *numRxPkts ); + + +/******************************************************************************* + * @fn PHY_RawGetRxData + * + * @brief Gets the number of successfully received packets, the number + * of packets received with a CRC error, and the last received + * RSSI (as an unsigned integer). + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param numRxPkts - Number of successfully received packets. + * @param numRxErrPkts - Number of received packets with a CRC error. + * @param rxRSSI - Last received RSSI (as an unsigned integer). + * + * @return None. + */ +void PHY_RawGetRxData( uint16 *numRxPkts, + uint16 *numRxErrPkts, + uint8 *rxRSSI ); + + +/******************************************************************************* + * @fn PHY_SetRfFreq + * + * @brief Sets the RF frequency for the given RF channel. + * + * Note: BLE frequency range is 2402..2480MHz over 40 RF channels. + * Note: The RF channel is given, not the BLE channel. + * + * input parameters + * + * @param rfChan - The RF channel to set the Tx or Rx frequency (0..39). + * @param freqMode - PHY_FREQ_MODE_MODULATED_CW, + * PHY_FREQ_MODE_UNMODULATED_CW + * + * output parameters + * + * @param None. + * + * @return None. + */ +void PHY_SetRfFreq( uint8 rfChan, + phyFreqMode_t freqMode ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PHY_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy_image.h b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy_image.h new file mode 100644 index 0000000..542d036 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/controller/include/phy_image.h @@ -0,0 +1,95 @@ +/******************************************************************************* + Filename: phy_image.h + + DesignSync revision information for LLE Firmware + Revised: $Date: Fri Jan 18 14:05:27 2013 GMT$ + Revision: $Revision: 1.8$ + $KeysEnd$ + + SVN revision information: + Revised: $Date: 2013-01-30 15:20:23 -0800 (Wed, 30 Jan 2013) $ + Revision: $Revision: 32951 $ + + Description: This file contains the TI nanoRisc Link Layer Engine (LLE) + binary image header used by the Physical Layer (PHY) + on the CC2540 + + LLE Firmware Information: + Release 1.5 + + NOTE: This file is autogenerated. + + Copyright 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef PHY_IMAGE_H +#define PHY_IMAGE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +#define NR_IMAGE_SIZE 3582 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef const unsigned char nrImage_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +extern nrImage_t NanoRiscImage[]; + +#ifdef __cplusplus +} +#endif + +#endif /* PHY_IMAGE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_data.h b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_data.h new file mode 100644 index 0000000..d4d7250 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_data.h @@ -0,0 +1,192 @@ +/******************************************************************************* + Filename: hci_c_data.h + Revised: $Date: 2011-08-22 08:41:40 -0700 (Mon, 22 Aug 2011) $ + Revision: $Revision: 27235 $ + + Description: This file handles HCI data for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_C_DATA_H +#define HCI_C_DATA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "osal_bufmgr.h" + +/******************************************************************************* + * MACROS + */ + +#define HCI_ResetControllerBuffers() HCI_TxDataBufferInit() + +/******************************************************************************* + * CONSTANTS + */ + +#define UNDEFINED_CONN_HANDLE 0xFFFF + +// Data State +#define DATA_BUF_FREE 0 +#define DATA_BUF_IN_USE 1 +#define DATA_BUF_PENDING 2 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 state; // DATA_BUF_FREE, DATA_BUF_IN_USE, DATA_BUF_PENDING + uint16 connHandle; // Connection Handle + uint8 fragFlag; // Packet Boundary Flag + uint16 len; // Data Length + uint8 *pData; // Pointer to Packet Payload +} hciTxData_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Data API +*/ + +/******************************************************************************* + * This function will initialize the buffers for transmit data. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataBufferInit( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_TxDataBufferInsert + * + * @brief This function will insert a transmit data packet into the free + * buffers. + * + * input parameters + * + * @param connHandle - Connection handle. + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED + */ +extern hciStatus_t HCI_TxDataBufferInsert( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_TxDataSend + * + * @brief This function sends an ACL transmit data packet to the LL. If + * the packet is successfully transferred to the TX FIFO by the + * LL, then the buffer can be freed. Otherwise, the packet is + * still pending in the LL, so it can't be released. If any error + * occurs (due to parametric checks), then the buffer is freed + * and a Number of Completed Packets event is generated with the + * number of completed packets set to zero. + * + * input parameters + * + * @param connHandle - Connection handle, or HCI_TX_DATA_ANY_CONNECTION. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataSend( uint8 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_ReverseBytes + * + * @brief This function is used to reverse the order of the bytes in + * an array in place. + * + * input parameters + * + * @param *buf - Pointer to buffer containing bytes to be reversed. + * @param len - Number of bytes in buffer. + * + * Note: The length must be even. + * + * Note: The maximum length is 128 bytes. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ReverseBytes( uint8 *buf, + uint8 len ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_C_DATA_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_event.h b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_event.h new file mode 100644 index 0000000..af2c50e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_event.h @@ -0,0 +1,299 @@ +/******************************************************************************* + Filename: hci_c_event.h + Revised: $Date: 2012-05-01 12:13:50 -0700 (Tue, 01 May 2012) $ + Revision: $Revision: 30418 $ + + Description: This file contains the HCI Event types, contants, + external functions etc. for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_C_EVENT_H +#define HCI_C_EVENT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "hci_tl.h" + +extern uint8 bleEvtMask; +extern uint8 pHciEvtMask[]; + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// Event Mask Default Values +#define BT_EVT_MASK_BYTE0 0xFF +#define BT_EVT_MASK_BYTE1 0xFF +#define BT_EVT_MASK_BYTE2 0xFF +#define BT_EVT_MASK_BYTE3 0xFF +#define BT_EVT_MASK_BYTE4 0xFF +#define BT_EVT_MASK_BYTE5 0x9F +#define BT_EVT_MASK_BYTE6 0x00 +#define BT_EVT_MASK_BYTE7 0x20 +// +#define LE_EVT_MASK_DEFAULT 0x1F + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** Internal Functions +*/ + +extern void hciInitEventMasks( void ); + +/* +** HCI Controller Events +*/ + +/******************************************************************************* + * @fn HCI_DataBufferOverflowEvent + * + * @brief This function sends the Data Buffer Overflow Event to the Host. + * + * input parameters + * + * @param linkType - HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW, + * HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_DataBufferOverflowEvent( uint8 linkType ); + + +/******************************************************************************* + * @fn HCI_NumOfCompletedPacketsEvent + * + * @brief This function sends the Number of Completed Packets Event to + * the Host. + * + * Note: Currently, the number of handles is always one. + * + * input parameters + * + * @param numHandles - Number of handles. + * @param handlers - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets for + * each handle. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_NumOfCompletedPacketsEvent( uint8 numHandles, + uint16 *handlers, + uint16 *numCompletedPackets ); + + +/******************************************************************************* + * @fn HCI_CommandCompleteEvent + * + * @brief This function sends a Command Complete Event to the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandCompleteEvent( uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_VendorSpecifcCommandCompleteEvent + * + * @brief This function sends a Vendor Specific Command Complete Event to + * the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_VendorSpecifcCommandCompleteEvent( uint16 opcode, + uint8 len, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_CommandStatusEvent + * + * @brief This function sends a Command Status Event to the Host. + * + * input parameters + * + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandStatusEvent( uint8 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_HardwareErrorEvent + * + * @brief This function sends a Hardware Error Event to the Host. + * + * input parameters + * + * @param hwErrorCode - The hardware error code. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_HardwareErrorEvent( uint8 hwErrorCode ); + + +/******************************************************************************* + * @fn HCI_SendCommandStatusEvent + * + * @brief This generic function sends a Command Status event to the Host. + * It is provided as a direct call so the Host can use it directly. + * + * input parameters + * + * @param eventCode - The event code. + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandStatusEvent ( uint8 eventCode, + uint16 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_SendCommandCompleteEvent + * + * @brief This generic function sends a Command Complete or a Vendor + * Specific Command Complete Event to the Host. + * + * input parameters + * + * @param eventCode - The event code. + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandCompleteEvent ( uint8 eventCode, + uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_SendControllerToHostEvent + * + * @brief This generic function sends a Controller to Host Event. + * + * input parameters + * + * @param eventCode - Bluetooth event code. + * @param dataLen - Length of dataField. + * @param pData - Pointer to data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendControllerToHostEvent( uint8 eventCode, + uint8 dataLen, + uint8 *pData ); + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_C_EVENT_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_tl.h b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_tl.h new file mode 100644 index 0000000..1e48eec --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/hci/hci_tl.h @@ -0,0 +1,331 @@ +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_TL_H +#define HCI_TL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +#include "hci.h" +#include "OSAL.h" +#include "hal_uart.h" +#include "hci_data.h" +#include "hci_event.h" + +extern uint8 hciTaskID; +// +extern uint8 hciTestTaskID; +extern uint8 hciGapTaskID; +extern uint8 hciL2capTaskID; +extern uint8 hciSmpTaskID; + +/******************************************************************************* + * MACROS + */ + +#define HCI_ASSERT(condition) HAL_ASSERT(condition) + +/******************************************************************************* + * CONSTANTS + */ + +// OSAL Task Events +#define HCI_TX_PROCESS_EVENT 0x0001 +#define HCI_TEST_UART_SEND_EVENT 0x0002 +#define HCI_BDADDR_UPDATED_EVENT 0x4000 +#define HCI_OSAL_MSG_EVENT SYS_EVENT_MSG + +// OSAL Message Header Events +#define HCI_CONTROLLER_TO_HOST_EVENT 0x01 +#define HCI_HOST_TO_CTRL_CMD_EVENT 0x02 +#define HCI_HOST_TO_CTRL_DATA_EVENT 0x03 + +#define HCI_BDADDR_LEN 6 + +// Max Buffers Supported +#define HCI_MAX_NUM_DATA_BUFFERS 0x04 +#define HCI_MAX_NUM_CMD_BUFFERS 0x01 + +// Max Allowed HCI Packet +#define HCI_MAX_CMD_PKT_SIZE 0xFF +#define HCI_MAX_DATA_PKT_SIZE 0xFFFF + +// Max Data Length in Packet +#define HCI_DATA_MAX_DATA_LENGTH 27 + +// +// Minimum length for CMD packet is 1+2+1 +// | Packet Type (1) | OPCode(2) | Length(1) | +// +#define HCI_CMD_MIN_LENGTH 4 + +// +// Minimum length for EVENT packet is 1+1+1 +// | Packet Type (1) | Event Code(1) | Length(1) | +// +#define HCI_EVENT_MIN_LENGTH 3 + +// +// Minimum length for DATA packet is 1+2+2 +// | Packet Type (1) | Handler(2) | Length(2) | +// +#define HCI_DATA_MIN_LENGTH 5 + +// Max Number of Connections +#define HCI_MAX_NUM_CONNECTIONS 0x03 +// +#define HCI_TX_DATA_ANY_CONNECTION 0xFF + +// HCI Packet Types +#define HCI_CMD_PACKET 0x01 +#define HCI_ACL_DATA_PACKET 0x02 +#define HCI_SCO_DATA_PACKET 0x03 +#define HCI_EVENT_PACKET 0x04 + +/* +** HCI Command Opcodes +*/ + +// Link Control Commands +#define HCI_DISCONNECT 0x0406 +#define HCI_READ_REMOTE_VERSION_INFO 0x041D + +// Controller and Baseband Commands +#define HCI_SET_EVENT_MASK 0x0C01 +#define HCI_RESET 0x0C03 +#define HCI_READ_TRANSMIT_POWER 0x0C2D +#define HCI_SET_CONTROLLER_TO_HOST_FLOW_CONTROL 0x0C31 +#define HCI_HOST_BUFFER_SIZE 0x0C33 +#define HCI_HOST_NUM_COMPLETED_PACKETS 0x0C35 + +// Information Parameters +#define HCI_READ_LOCAL_VERSION_INFO 0x1001 +#define HCI_READ_LOCAL_SUPPORTED_COMMANDS 0x1002 +#define HCI_READ_LOCAL_SUPPORTED_FEATURES 0x1003 +#define HCI_READ_BDADDR 0x1009 + +// Status Parameters +#define HCI_READ_RSSI 0x1405 + +// LE Commands +#define HCI_LE_SET_EVENT_MASK 0x2001 +#define HCI_LE_READ_BUFFER_SIZE 0x2002 +#define HCI_LE_READ_LOCAL_SUPPORTED_FEATURES 0x2003 +#define HCI_LE_SET_RANDOM_ADDR 0x2005 +#define HCI_LE_SET_ADV_PARAM 0x2006 +#define HCI_LE_READ_ADV_CHANNEL_TX_POWER 0x2007 +#define HCI_LE_SET_ADV_DATA 0x2008 +#define HCI_LE_SET_SCAN_RSP_DATA 0x2009 +#define HCI_LE_SET_ADV_ENABLE 0x200A +#define HCI_LE_SET_SCAN_PARAM 0x200B +#define HCI_LE_SET_SCAN_ENABLE 0x200C +#define HCI_LE_CREATE_CONNECTION 0x200D +#define HCI_LE_CREATE_CONNECTION_CANCEL 0x200E +#define HCI_LE_READ_WHITE_LIST_SIZE 0x200F +#define HCI_LE_CLEAR_WHITE_LIST 0x2010 +#define HCI_LE_ADD_WHITE_LIST 0x2011 +#define HCI_LE_REMOVE_WHITE_LIST 0x2012 +#define HCI_LE_CONNECTION_UPDATE 0x2013 +#define HCI_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x2014 +#define HCI_LE_READ_CHANNEL_MAP 0x2015 +#define HCI_LE_READ_REMOTE_USED_FEATURES 0x2016 +#define HCI_LE_ENCRYPT 0x2017 +#define HCI_LE_RAND 0x2018 +#define HCI_LE_START_ENCRYPTION 0x2019 +#define HCI_LE_LTK_REQ_REPLY 0x201A +#define HCI_LE_LTK_REQ_NEG_REPLY 0x201B +#define HCI_LE_READ_SUPPORTED_STATES 0x201C +#define HCI_LE_RECEIVER_TEST 0x201D +#define HCI_LE_TRANSMITTER_TEST 0x201E +#define HCI_LE_TEST_END 0x201F + +// LE Vendor Specific LL Extension Commands +#define HCI_EXT_SET_RX_GAIN 0xFC00 +#define HCI_EXT_SET_TX_POWER 0xFC01 +#define HCI_EXT_ONE_PKT_PER_EVT 0xFC02 +#define HCI_EXT_CLK_DIVIDE_ON_HALT 0xFC03 +#define HCI_EXT_DECLARE_NV_USAGE 0xFC04 +#define HCI_EXT_DECRYPT 0xFC05 +#define HCI_EXT_SET_LOCAL_SUPPORTED_FEATURES 0xFC06 +#define HCI_EXT_SET_FAST_TX_RESP_TIME 0xFC07 +#define HCI_EXT_MODEM_TEST_TX 0xFC08 +#define HCI_EXT_MODEM_HOP_TEST_TX 0xFC09 +#define HCI_EXT_MODEM_TEST_RX 0xFC0A +#define HCI_EXT_END_MODEM_TEST 0xFC0B +#define HCI_EXT_SET_BDADDR 0xFC0C +#define HCI_EXT_SET_SCA 0xFC0D +#define HCI_EXT_ENABLE_PTM 0xFC0E // Not a supported HCI command! Application only. +#define HCI_EXT_SET_FREQ_TUNE 0xFC0F +#define HCI_EXT_SAVE_FREQ_TUNE 0xFC10 +#define HCI_EXT_SET_MAX_DTM_TX_POWER 0xFC11 +#define HCI_EXT_MAP_PM_IO_PORT 0xFC12 +#define HCI_EXT_DISCONNECT_IMMED 0xFC13 +#define HCI_EXT_PER 0xFC14 +#define HCI_EXT_PER_BY_CHAN 0xFC15 // Not a supported HCI command! Application only. +#define HCI_EXT_EXTEND_RF_RANGE 0xFC16 +#define HCI_EXT_ADV_EVENT_NOTICE 0xFC17 // Not a supported HCI command! Application only. +#define HCI_EXT_CONN_EVENT_NOTICE 0xFC18 // Not a supported HCI command! Application only. +#define HCI_EXT_HALT_DURING_RF 0xFC19 +#define HCI_EXT_OVERRIDE_SL 0xFC1A +#define HCI_EXT_BUILD_REVISION 0xFC1B + +/* +** HCI Event Codes +*/ + +// BT Events +#define HCI_DISCONNECTION_COMPLETE_EVENT_CODE 0x05 +#define HCI_ENCRYPTION_CHANGE_EVENT_CODE 0x08 +#define HCI_READ_REMOTE_INFO_COMPLETE_EVENT_CODE 0x0C +#define HCI_COMMAND_COMPLETE_EVENT_CODE 0x0E +#define HCI_COMMAND_STATUS_EVENT_CODE 0x0F +#define HCI_BLE_HARDWARE_ERROR_EVENT_CODE 0x10 +#define HCI_NUM_OF_COMPLETED_PACKETS_EVENT_CODE 0x13 +#define HCI_DATA_BUFFER_OVERFLOW_EVENT 0x1A +#define HCI_KEY_REFRESH_COMPLETE_EVENT_CODE 0x30 + +// LE Event Code (for LE Meta Events) +#define HCI_LE_EVENT_CODE 0x3E + +// LE Meta Event Codes +#define HCI_BLE_CONNECTION_COMPLETE_EVENT 0x01 +#define HCI_BLE_ADV_REPORT_EVENT 0x02 +#define HCI_BLE_CONN_UPDATE_COMPLETE_EVENT 0x03 +#define HCI_BLE_READ_REMOTE_FEATURE_COMPLETE_EVENT 0x04 +#define HCI_BLE_LTK_REQUESTED_EVENT 0x05 + +// Vendor Specific Event Code +#define HCI_VE_EVENT_CODE 0xFF + +// LE Vendor Specific LL Extension Events +#define HCI_EXT_SET_RX_GAIN_EVENT 0x0400 +#define HCI_EXT_SET_TX_POWER_EVENT 0x0401 +#define HCI_EXT_ONE_PKT_PER_EVT_EVENT 0x0402 +#define HCI_EXT_CLK_DIVIDE_ON_HALT_EVENT 0x0403 +#define HCI_EXT_DECLARE_NV_USAGE_EVENT 0x0404 +#define HCI_EXT_DECRYPT_EVENT 0x0405 +#define HCI_EXT_SET_LOCAL_SUPPORTED_FEATURES_EVENT 0x0406 +#define HCI_EXT_SET_FAST_TX_RESP_TIME_EVENT 0x0407 +#define HCI_EXT_MODEM_TEST_TX_EVENT 0x0408 +#define HCI_EXT_MODEM_HOP_TEST_TX_EVENT 0x0409 +#define HCI_EXT_MODEM_TEST_RX_EVENT 0x040A +#define HCI_EXT_END_MODEM_TEST_EVENT 0x040B +#define HCI_EXT_SET_BDADDR_EVENT 0x040C +#define HCI_EXT_SET_SCA_EVENT 0x040D +#define HCI_EXT_ENABLE_PTM_EVENT 0x040E // Not a supported HCI command! Application only. +#define HCI_EXT_SET_FREQ_TUNE_EVENT 0x040F +#define HCI_EXT_SAVE_FREQ_TUNE_EVENT 0x0410 +#define HCI_EXT_SET_MAX_DTM_TX_POWER_EVENT 0x0411 +#define HCI_EXT_MAP_PM_IO_PORT_EVENT 0x0412 +#define HCI_EXT_DISCONNECT_IMMED_EVENT 0x0413 +#define HCI_EXT_PER_EVENT 0x0414 +#define HCI_EXT_PER_BY_CHAN_EVENT 0x0415 // Not a supported HCI command! Application only. +#define HCI_EXT_EXTEND_RF_RANGE_EVENT 0x0416 +#define HCI_EXT_ADV_EVENT_NOTICE_EVENT 0x0417 // Not a supported HCI command! Application only. +#define HCI_EXT_CONN_EVENT_NOTICE_EVENT 0x0418 // Not a supported HCI command! Application only. +#define HCI_EXT_HALT_DURING_RF_EVENT 0x0419 +#define HCI_EXT_OVERRIDE_SL_EVENT 0x041A +#define HCI_EXT_BUILD_REVISION_EVENT 0x041B + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI OSAL API +*/ + +/******************************************************************************* + * @fn HCI_Init + * + * @brief This is the HCI OSAL task initialization routine. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_Init( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ProcessEvent + * + * @brief This is the HCI OSAL task process event handler. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * @param events - HCI OSAL task events. + * + * output parameters + * + * @param None. + * + * @return Unprocessed events. + */ +extern uint16 HCI_ProcessEvent( uint8 task_id, + uint16 events ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_TL_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/host/gatt_uuid.c b/Firmware/Radio/Projects/Wimu/Components/ble/host/gatt_uuid.c new file mode 100644 index 0000000..9dc8990 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/host/gatt_uuid.c @@ -0,0 +1,348 @@ +/************************************************************************************************** + Filename: gatt_uuid.c + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" +#include "OSAL.h" + +#include "gatt.h" +#include "gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/** + * GATT Services + */ +// Generic Access Profile Service UUID +CONST uint8 gapServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GAP_SERVICE_UUID ), HI_UINT16( GAP_SERVICE_UUID ) +}; + +// Generic Attribute Profile Service UUID +CONST uint8 gattServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SERVICE_UUID ), HI_UINT16( GATT_SERVICE_UUID ) +}; + +/** + * GATT Declarations + */ +// Primary Service UUID +CONST uint8 primaryServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_PRIMARY_SERVICE_UUID ), HI_UINT16( GATT_PRIMARY_SERVICE_UUID ) +}; + +// Secondary Service UUID +CONST uint8 secondaryServiceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SECONDARY_SERVICE_UUID ), HI_UINT16( GATT_SECONDARY_SERVICE_UUID ) +}; + +// Include UUID +CONST uint8 includeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_INCLUDE_UUID ), HI_UINT16( GATT_INCLUDE_UUID ) +}; + +// Characteristic UUID +CONST uint8 characterUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHARACTER_UUID ), HI_UINT16( GATT_CHARACTER_UUID ) +}; + +/** + * GATT Descriptors + */ +// Characteristic Extended Properties UUID +CONST uint8 charExtPropsUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_EXT_PROPS_UUID ), HI_UINT16( GATT_CHAR_EXT_PROPS_UUID ) +}; + +// Characteristic User Description UUID +CONST uint8 charUserDescUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_USER_DESC_UUID ), HI_UINT16( GATT_CHAR_USER_DESC_UUID ) +}; + +// Client Characteristic Configuration UUID +CONST uint8 clientCharCfgUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CLIENT_CHAR_CFG_UUID ), HI_UINT16( GATT_CLIENT_CHAR_CFG_UUID ) +}; + +// Server Characteristic Configuration UUID +CONST uint8 servCharCfgUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_SERV_CHAR_CFG_UUID ), HI_UINT16( GATT_SERV_CHAR_CFG_UUID ) +}; + +// Characteristic Format UUID +CONST uint8 charFormatUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_FORMAT_UUID ), HI_UINT16( GATT_CHAR_FORMAT_UUID ) +}; + +// Characteristic Aggregate Format UUID +CONST uint8 charAggFormatUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_CHAR_AGG_FORMAT_UUID ), HI_UINT16( GATT_CHAR_AGG_FORMAT_UUID ) +}; + +/** + * GATT Characteristics + */ +// Device Name UUID +CONST uint8 deviceNameUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( DEVICE_NAME_UUID ), HI_UINT16( DEVICE_NAME_UUID ) +}; + +// Appearance UUID +CONST uint8 appearanceUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( APPEARANCE_UUID ), HI_UINT16( APPEARANCE_UUID ) +}; + +// Peripheral Privacy Flag UUID +CONST uint8 periPrivacyFlagUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PERI_PRIVACY_FLAG_UUID ), HI_UINT16( PERI_PRIVACY_FLAG_UUID ) +}; + +// Reconnection Address UUID +CONST uint8 reconnectAddrUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( RECONNECT_ADDR_UUID ), HI_UINT16( RECONNECT_ADDR_UUID ) +}; + +// Peripheral Preferred Connection Parameters UUID +CONST uint8 periConnParamUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PERI_CONN_PARAM_UUID ), HI_UINT16( PERI_CONN_PARAM_UUID ) +}; + +// Service Changed UUID +CONST uint8 serviceChangedUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( SERVICE_CHANGED_UUID ), HI_UINT16( SERVICE_CHANGED_UUID ) +}; + +// Valid Range UUID +CONST uint8 validRangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_VALID_RANGE_UUID ), HI_UINT16( GATT_VALID_RANGE_UUID ) +}; + +// External Report Reference Descriptor +CONST uint8 extReportRefUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_EXT_REPORT_REF_UUID ), HI_UINT16( GATT_EXT_REPORT_REF_UUID ) +}; + +// Report Reference characteristic descriptor +CONST uint8 reportRefUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( GATT_REPORT_REF_UUID ), HI_UINT16( GATT_REPORT_REF_UUID ) +}; + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn GATT_FindUUIDRec + * + * @brief Find the UUID record for a given UUID. + * + * @param pUUID - UUID to look for. + * @param len - length of UUID. + * + * @return Pointer to UUID record. NULL, otherwise. + */ +const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ) +{ + const uint8 *pRec = NULL; + + if ( len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pUUID[0], pUUID[1] ); + switch ( uuid ) + { + /*** GATT Services ***/ + + case GAP_SERVICE_UUID: + pRec = gapServiceUUID; + break; + + case GATT_SERVICE_UUID: + pRec = gattServiceUUID; + break; + + /*** GATT Declarations ***/ + + case GATT_PRIMARY_SERVICE_UUID: + pRec = primaryServiceUUID; + break; + + case GATT_SECONDARY_SERVICE_UUID: + pRec = secondaryServiceUUID; + break; + + case GATT_INCLUDE_UUID: + pRec = includeUUID; + break; + + case GATT_CHARACTER_UUID: + pRec = characterUUID; + break; + + /*** GATT Descriptors ***/ + + case GATT_CHAR_EXT_PROPS_UUID: + pRec = charExtPropsUUID; + break; + + case GATT_CHAR_USER_DESC_UUID: + pRec = charUserDescUUID; + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + pRec = clientCharCfgUUID; + break; + + case GATT_SERV_CHAR_CFG_UUID: + pRec = servCharCfgUUID; + break; + + case GATT_CHAR_FORMAT_UUID: + pRec = charFormatUUID; + break; + + case GATT_CHAR_AGG_FORMAT_UUID: + pRec = charAggFormatUUID; + break; + + case GATT_VALID_RANGE_UUID: + pRec = validRangeUUID; + break; + + case GATT_EXT_REPORT_REF_UUID: + pRec = extReportRefUUID; + break; + + case GATT_REPORT_REF_UUID: + pRec = reportRefUUID; + break; + + /*** GATT Characteristics ***/ + + case DEVICE_NAME_UUID: + pRec = deviceNameUUID; + break; + + case APPEARANCE_UUID: + pRec = appearanceUUID; + break; + + case RECONNECT_ADDR_UUID: + pRec = reconnectAddrUUID; + break; + + case PERI_PRIVACY_FLAG_UUID: + pRec = periPrivacyFlagUUID; + break; + + case PERI_CONN_PARAM_UUID: + pRec = periConnParamUUID; + break; + + case SERVICE_CHANGED_UUID: + pRec = serviceChangedUUID; + break; + + /*** GATT Units ***/ + + default: + break; + } + } + else if ( len == ATT_UUID_SIZE ) + { + // 128-bit UUID + } + + return ( pRec ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/host/linkdb.h b/Firmware/Radio/Projects/Wimu/Components/ble/host/linkdb.h new file mode 100644 index 0000000..3ab4a28 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/host/linkdb.h @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef LINKDB_H +#define LINKDB_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles +#define INVALID_CONNHANDLE 0xFFFF // Invalid connection handle, used for no connection handle +#define LOOPBACK_CONNHANDLE 0xFFFE // Loopback connection handle, used to loopback a message + +// Link state flags +#define LINK_NOT_CONNECTED 0x00 // Link isn't connected +#define LINK_CONNECTED 0x01 // Link is connected +#define LINK_AUTHENTICATED 0x02 // Link is authenticated +#define LINK_BOUND 0x04 // Link is bonded +#define LINK_ENCRYPTED 0x10 // Link is encrypted + +// Link Database Status callback changeTypes +#define LINKDB_STATUS_UPDATE_NEW 0 // New connection created +#define LINKDB_STATUS_UPDATE_REMOVED 1 // Connection was removed +#define LINKDB_STATUS_UPDATE_STATEFLAGS 2 // Connection state flag changed + +// Link Authentication Errors +#define LINKDB_ERR_INSUFFICIENT_AUTHEN 0x05 // Link isn't even encrypted +#define LINBDB_ERR_INSUFFICIENT_KEYSIZE 0x0c // Link is encrypted but the key size is too small +#define LINKDB_ERR_INSUFFICIENT_ENCRYPTION 0x0f // Link is encrypted but it's not authenticated + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[KEYLEN]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[KEYLEN]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[B_RANDOM_NUM_SIZE]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[B_ADDR_LEN]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + #define linkDB_Up( connectionHandle ) linkDB_State( (connectionHandle), LINK_CONNECTED ) + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + #define linkDB_Encrypted( connectionHandle ) linkDB_State( (connectionHandle), LINK_ENCRYPTED ) + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* LINKDB_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/att.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/att.h new file mode 100644 index 0000000..bb7d595 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/att.h @@ -0,0 +1,1241 @@ +/** + @headerfile: att.h + + +**************************************************************************************************/ + +#ifndef ATT_H +#define ATT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +#include "l2cap.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. +#define ATT_MTU_SIZE L2CAP_MTU_SIZE //!< Minimum ATT MTU size +#define ATT_MAX_MTU_SIZE 517 //!< Maximum ATT MTU size + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#define ATT_ERROR_RSP 0x01 //!< ATT Error Response +#define ATT_EXCHANGE_MTU_REQ 0x02 //!< ATT Exchange MTU Request +#define ATT_EXCHANGE_MTU_RSP 0x03 //!< ATT Exchange MTU Response +#define ATT_FIND_INFO_REQ 0x04 //!< ATT Find Information Request +#define ATT_FIND_INFO_RSP 0x05 //!< ATT Find Information Response +#define ATT_FIND_BY_TYPE_VALUE_REQ 0x06 //!< ATT Find By Type Vaue Request +#define ATT_FIND_BY_TYPE_VALUE_RSP 0x07 //!< ATT Find By Type Vaue Response +#define ATT_READ_BY_TYPE_REQ 0x08 //!< ATT Read By Type Request +#define ATT_READ_BY_TYPE_RSP 0x09 //!< ATT Read By Type Response +#define ATT_READ_REQ 0x0a //!< ATT Read Request +#define ATT_READ_RSP 0x0b //!< ATT Read Response +#define ATT_READ_BLOB_REQ 0x0c //!< ATT Read Blob Request +#define ATT_READ_BLOB_RSP 0x0d //!< ATT Read Blob Response +#define ATT_READ_MULTI_REQ 0x0e //!< ATT Read Multiple Request +#define ATT_READ_MULTI_RSP 0x0f //!< ATT Read Multiple Response +#define ATT_READ_BY_GRP_TYPE_REQ 0x10 //!< ATT Read By Group Type Request +#define ATT_READ_BY_GRP_TYPE_RSP 0x11 //!< ATT Read By Group Type Response +#define ATT_WRITE_REQ 0x12 //!< ATT Write Request +#define ATT_WRITE_RSP 0x13 //!< ATT Write Response +#define ATT_PREPARE_WRITE_REQ 0x16 //!< ATT Prepare Write Request +#define ATT_PREPARE_WRITE_RSP 0x17 //!< ATT Prepare Write Response +#define ATT_EXECUTE_WRITE_REQ 0x18 //!< ATT Execute Write Request +#define ATT_EXECUTE_WRITE_RSP 0x19 //!< ATT Execute Write Response +#define ATT_HANDLE_VALUE_NOTI 0x1b //!< ATT Handle Value Notification +#define ATT_HANDLE_VALUE_IND 0x1d //!< ATT Handle Value Indication +#define ATT_HANDLE_VALUE_CFM 0x1e //!< ATT Handle Value Confirmation + +#define ATT_WRITE_CMD 0x52 //!< ATT Write Command +#define ATT_SIGNED_WRITE_CMD 0xD2 //!< ATT Signed Write Command + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) +#define ATT_METHOD_BITS 0x3f + +// Command Flag (bit 6) +#define ATT_CMD_FLAG_BIT 0x40 + +// Authentication Signature Flag (bit 7) +#define ATT_AUTHEN_SIG_FLAG_BIT 0x80 + +// Size of 16-bit Bluetooth UUID +#define ATT_BT_UUID_SIZE 2 + +// Size of 128-bit UUID +#define ATT_UUID_SIZE 16 + +// ATT Response or Confirmation timeout +#define ATT_MSG_TIMEOUT 30 + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent +#define ATT_SIG_NOT_INCLUDED 0x00 // Signature not included +#define ATT_SIG_VALID 0x01 // Included signature valid +#define ATT_SIG_INVALID 0x02 // Included signature not valid + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#define ATT_ERR_INVALID_HANDLE 0x01 //!< Attribute handle value given was not valid on this attribute server +#define ATT_ERR_READ_NOT_PERMITTED 0x02 //!< Attribute cannot be read +#define ATT_ERR_WRITE_NOT_PERMITTED 0x03 //!< Attribute cannot be written +#define ATT_ERR_INVALID_PDU 0x04 //!< The attribute PDU was invalid +#define ATT_ERR_INSUFFICIENT_AUTHEN 0x05 //!< The attribute requires authentication before it can be read or written +#define ATT_ERR_UNSUPPORTED_REQ 0x06 //!< Attribute server doesn't support the request received from the attribute client +#define ATT_ERR_INVALID_OFFSET 0x07 //!< Offset specified was past the end of the attribute +#define ATT_ERR_INSUFFICIENT_AUTHOR 0x08 //!< The attribute requires an authorization before it can be read or written +#define ATT_ERR_PREPARE_QUEUE_FULL 0x09 //!< Too many prepare writes have been queued +#define ATT_ERR_ATTR_NOT_FOUND 0x0a //!< No attribute found within the given attribute handle range +#define ATT_ERR_ATTR_NOT_LONG 0x0b //!< Attribute cannot be read or written using the Read Blob Request or Prepare Write Request +#define ATT_ERR_INSUFFICIENT_KEY_SIZE 0x0c //!< The Encryption Key Size used for encrypting this link is insufficient +#define ATT_ERR_INVALID_VALUE_SIZE 0x0d //!< The attribute value length is invalid for the operation +#define ATT_ERR_UNLIKELY 0x0e //!< The attribute request that was requested has encountered an error that was very unlikely, and therefore could not be completed as requested +#define ATT_ERR_INSUFFICIENT_ENCRYPT 0x0f //!< The attribute requires encryption before it can be read or written +#define ATT_ERR_UNSUPPORTED_GRP_TYPE 0x10 //!< The attribute type is not a supported grouping attribute as defined by a higher layer specification +#define ATT_ERR_INSUFFICIENT_RESOURCES 0x11 //!< Insufficient Resources to complete the request + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + +#define ATT_ERR_INVALID_VALUE 0x80 //!< The attribute value is invalid for the operation + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID +#define ATT_HANDLE_BT_UUID_TYPE 0x01 + + // Handle and 128-bit UUID +#define ATT_HANDLE_UUID_TYPE 0x02 + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response +#define ATT_MAX_NUM_HANDLE_BT_UUID ( ( ATT_MTU_SIZE - 2 ) / ( 2 + ATT_BT_UUID_SIZE ) ) + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response +#define ATT_MAX_NUM_HANDLE_UUID ( ( ATT_MTU_SIZE - 2 ) / ( 2 + ATT_UUID_SIZE ) ) + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response +#define ATT_MAX_NUM_HANDLES_INFO ( ( ATT_MTU_SIZE - 1 ) / 4 ) + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request +#define ATT_MAX_NUM_HANDLES ( ( ATT_MTU_SIZE - 1 ) / 2 ) + + // Minimum number of handles in a single Read Multiple Request +#define ATT_MIN_NUM_HANDLES 2 + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes +#define ATT_CANCEL_PREPARED_WRITES 0x00 + + // Immediately write all pending prepared values +#define ATT_WRITE_PREPARED_VALUES 0x01 + +#if defined ( TESTMODES ) + // ATT Test Modes + #define ATT_TESTMODE_OFF 0 // Test mode off + #define ATT_TESTMODE_UNAUTHEN_SIG 1 // Do not authenticate incoming signature +#endif + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) +#define READ_BY_TYPE_REQ_FIXED_SIZE 4 + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) +#define PREPARE_WRITE_REQ_FIXED_SIZE 4 + +/********************************************************************* + * VARIABLES + */ +extern CONST uint8 btBaseUUID[ATT_UUID_SIZE]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[ATT_UUID_SIZE]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[ATT_BT_UUID_SIZE]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[ATT_BT_UUID_SIZE]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[ATT_UUID_SIZE]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[ATT_MAX_NUM_HANDLE_BT_UUID]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[ATT_MAX_NUM_HANDLE_UUID]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[ATT_MAX_NUM_HANDLES_INFO]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[ATT_MAX_NUM_HANDLES]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[ATT_MTU_SIZE-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ATT_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/bcomdef.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/bcomdef.h new file mode 100644 index 0000000..74c2c8a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/bcomdef.h @@ -0,0 +1,254 @@ +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + +#ifndef BCOMDEF_H +#define BCOMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +#if defined ( HOST_CONFIG ) + // Set the Controller Configuration + #if ( HOST_CONFIG == ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG | SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == ( CENTRAL_CFG | BROADCASTER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == ( PERIPHERAL_CFG | OBSERVER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG | SCAN_CFG ) + #elif ( HOST_CONFIG == ( BROADCASTER_CFG | OBSERVER_CFG ) ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | SCAN_CFG ) + #elif ( HOST_CONFIG == CENTRAL_CFG ) + #define CTRL_CONFIG ( SCAN_CFG | INIT_CFG ) + #elif ( HOST_CONFIG == PERIPHERAL_CFG ) + #define CTRL_CONFIG ( ADV_NCONN_CFG | ADV_CONN_CFG ) + #elif ( HOST_CONFIG == OBSERVER_CFG ) + #define CTRL_CONFIG SCAN_CFG + #elif ( HOST_CONFIG == BROADCASTER_CFG ) + #define CTRL_CONFIG ADV_NCONN_CFG + #else + #error "Build Configuration Error: Invalid Host Role!" + #endif +#else + // Controller Sanity Check: Stop build when no configuration is defined. + #if !defined( CTRL_CONFIG ) || !( CTRL_CONFIG & ( ADV_NCONN_CFG | \ + ADV_CONN_CFG | \ + SCAN_CFG | \ + INIT_CFG ) ) + #error "Build Configuration Error: At least one Controller build component required!" + #endif // no Controller build components defined +#endif + +#if !defined ( MAX_NUM_LL_CONN ) + #if ( CTRL_CONFIG & INIT_CFG ) + #define MAX_NUM_LL_CONN 3 + #elif ( !( CTRL_CONFIG & INIT_CFG ) && ( CTRL_CONFIG & ADV_CONN_CFG ) ) + #define MAX_NUM_LL_CONN 1 + #else // no connection needed + #define MAX_NUM_LL_CONN 0 + #endif // CTRL_CONFIG=INIT_CFG +#endif // !MAX_NUM_LL_CONN + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length +#define B_ADDR_LEN 6 + +//! Default key length +#define KEYLEN 16 + +//! BLE Channel Map length +#define B_CHANNEL_MAP_LEN 5 + +//! BLE Event mask length +#define B_EVENT_MASK_LEN 8 + +//! BLE Local Name length +#define B_LOCAL_NAME_LEN 248 + +//! BLE Maximum Advertising Packet Length +#define B_MAX_ADV_LEN 31 + +//! BLE Random Number Size +#define B_RANDOM_NUM_SIZE 8 + +//! BLE Feature Supported length +#define B_FEATURE_SUPPORT_LENGTH 8 + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#define bleInvalidTaskID INVALID_TASK //!< Task ID isn't setup properly +#define bleNotReady 0x10 //!< Not ready to perform task +#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task +#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task +#define bleMemAllocError 0x13 //!< Memory allocation error occurred +#define bleNotConnected 0x14 //!< Can't perform function when not in a connection +#define bleNoResources 0x15 //!< There are no resource available +#define blePending 0x16 //!< Waiting +#define bleTimeout 0x17 //!< Timed out performing function +#define bleInvalidRange 0x18 //!< A parameter is out of range +#define bleLinkEncrypted 0x19 //!< The link is already encrypted +#define bleProcedureComplete 0x1A //!< The Procedure is completed + +// GAP Status Return Values - returned as bStatus_t +#define bleGAPUserCanceled 0x30 //!< The user canceled the task +#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted +#define bleGAPBondRejected 0x32 //!< The bound information was rejected. + +// ATT Status Return Values - returned as bStatus_t +#define bleInvalidPDU 0x40 //!< The attribute PDU is invalid +#define bleInsufficientAuthen 0x41 //!< The attribute has insufficient authentication +#define bleInsufficientEncrypt 0x42 //!< The attribute has insufficient encryption +#define bleInsufficientKeySize 0x43 //!< The attribute has insufficient encryption key size + +// L2CAP Status Return Values - returned as bStatus_t + +#define INVALID_TASK_ID 0xFF //!< Task ID isn't setup properly +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F +#define BLE_NVID_IRK 0x02 //!< The Device's IRK +#define BLE_NVID_CSRK 0x03 //!< The Device's CSRK +#define BLE_NVID_SIGNCOUNTER 0x04 //!< The Device's Sign Counter + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings +#define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs +#define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries +#define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs +#define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ +#define GAP_EVENT_SIGN_COUNTER_CHANGED 0x4000 //!< The device level sign counter changed + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) +#define GAP_MSG_EVENT 0xD0 //!< Incoming GAP message + +// SM - Messages IDs (0xC1 - 0xCF) +#define SM_NEW_RAND_KEY_EVENT 0xC1 //!< New Rand Key Event message + +// GATT - Messages IDs (0xB0 - 0xBF) +#define GATT_MSG_EVENT 0xB0 //!< Incoming GATT message +#define GATT_SERV_MSG_EVENT 0xB1 //!< Incoming GATT Serv App message + +// L2CAP - Messages IDs (0xA0 - 0xAF) +#define L2CAP_DATA_EVENT 0xA0 //!< Incoming data on a channel +#define L2CAP_SIGNAL_EVENT 0xA2 //!< Incoming Signaling message + +// HCI - Messages IDs (0x90 - 0x9F) +#define HCI_DATA_EVENT 0x90 //!< HCI Data Event message +#define HCI_GAP_EVENT_EVENT 0x91 //!< GAP Event message +#define HCI_SMP_EVENT_EVENT 0x92 //!< SMP Event message +#define HCI_EXT_CMD_EVENT 0x93 //!< HCI Extended Command Event message +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 +#define TI_BASE_UUID_128( uuid ) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, \ + 0x00, 0x40, 0x51, 0x04, LO_UINT16( uuid ), HI_UINT16( uuid ), 0x00, 0xF0 + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BCOMDEF_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/gap.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/gap.h new file mode 100644 index 0000000..25603b0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/gap.h @@ -0,0 +1,1198 @@ +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + +#ifndef GAP_H +#define GAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "sm.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#define GAP_DEVICE_INIT_DONE_EVENT 0x00 //!< Sent when the Device Initialization is complete. This event is sent as an OSAL message defined as gapDeviceInitDoneEvent_t. +#define GAP_DEVICE_DISCOVERY_EVENT 0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an OSAL message defined as gapDevDiscEvent_t. +#define GAP_ADV_DATA_UPDATE_DONE_EVENT 0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an OSAL message defined as gapAdvDataUpdateEvent_t. +#define GAP_MAKE_DISCOVERABLE_DONE_EVENT 0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an OSAL message defined as gapMakeDiscoverableRspEvent_t. +#define GAP_END_DISCOVERABLE_DONE_EVENT 0x04 //!< Sent when the Advertising has ended. This event is sent as an OSAL message defined as gapEndDiscoverableRspEvent_t. +#define GAP_LINK_ESTABLISHED_EVENT 0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an OSAL message defined as gapEstLinkReqEvent_t. +#define GAP_LINK_TERMINATED_EVENT 0x06 //!< Sent when a connection was terminated. This event is sent as an OSAL message defined as gapTerminateLinkEvent_t. +#define GAP_LINK_PARAM_UPDATE_EVENT 0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an OSAL message defined as gapLinkUpdateEvent_t. +#define GAP_RANDOM_ADDR_CHANGED_EVENT 0x08 //!< Sent when a random address was changed. This event is sent as an OSAL message defined as gapRandomAddrEvent_t. +#define GAP_SIGNATURE_UPDATED_EVENT 0x09 //!< Sent when the device's signature counter is updated. This event is sent as an OSAL message defined as gapSignUpdateEvent_t. +#define GAP_AUTHENTICATION_COMPLETE_EVENT 0x0A //!< Sent when the Authentication (pairing) process is complete. This event is sent as an OSAL message defined as gapAuthCompleteEvent_t. +#define GAP_PASSKEY_NEEDED_EVENT 0x0B //!< Sent when a Passkey is needed. This is part of the pairing process. This event is sent as an OSAL message defined as gapPasskeyNeededEvent_t. +#define GAP_SLAVE_REQUESTED_SECURITY_EVENT 0x0C //!< Sent when a Slave Security Request is received. This event is sent as an OSAL message defined as gapSlaveSecurityReqEvent_t. +#define GAP_DEVICE_INFO_EVENT 0x0D //!< Sent during the Device Discovery Process when a device is discovered. This event is sent as an OSAL message defined as gapDeviceInfoEvent_t. +#define GAP_BOND_COMPLETE_EVENT 0x0E //!< Sent when the bonding(bound) process is complete. This event is sent as an OSAL message defined as gapBondCompleteEvent_t. +#define GAP_PAIRING_REQ_EVENT 0x0F //!< Sent when an unexpected Pairing Request is received. This event is sent as an OSAL message defined as gapPairingReqEvent_t. +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ +#define GAP_CONNHANDLE_INIT 0xFFFE //!< terminates a link create +#define GAP_CONNHANDLE_ALL 0xFFFF //!< terminates all links for the matching task ID. +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ +#define GAP_PROFILE_BROADCASTER 0x01 //!< A device that sends advertising events only. +#define GAP_PROFILE_OBSERVER 0x02 //!< A device that receives advertising events only. +#define GAP_PROFILE_PERIPHERAL 0x04 //!< A device that accepts the establishment of an LE physical link using the connection establishment procedure +#define GAP_PROFILE_CENTRAL 0x08 //!< A device that supports the Central role initiates the establishment of a physical connection +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode (mSec). Setting this parameter to 0 turns off the timeout (default). +#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode. In seconds (default 180 seconds) +#define TGAP_GEN_DISC_SCAN 2 //!< Minimum time to perform scanning, when performing General Discovery proc (mSec) +#define TGAP_LIM_DISC_SCAN 3 //!< Minimum time to perform scanning, when performing Limited Discovery proc (mSec) +#define TGAP_CONN_EST_ADV_TIMEOUT 4 //!< Advertising timeout, when performing Connection Establishment proc (mSec) +#define TGAP_CONN_PARAM_TIMEOUT 5 //!< Link Layer connection parameter update notification timer, connection parameter update proc (mSec) + +// Constants +#define TGAP_LIM_DISC_ADV_INT_MIN 6 //!< Minimum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_LIM_DISC_ADV_INT_MAX 7 //!< Maximum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MIN 8 //!< Minimum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MAX 9 //!< Maximum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MIN 10 //!< Minimum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MAX 11 //!< Maximum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_INT 12 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_WIND 13 //!< Scan window used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_INT 14 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_WIND 15 //!< Scan window used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_INT 16 //!< Scan interval used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_WIND 17 //!< Scan window used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_INT 18 //!< Scan interval used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_WIND 19 //!< Scan window used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_CONN_EST_ADV 20 //!< Advertising interval, when using Connection Establishment proc (n * 0.625 mSec). Obsolete - Do not use. +#define TGAP_CONN_EST_INT_MIN 21 //!< Minimum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_INT_MAX 22 //!< Maximum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_SCAN_INT 23 //!< Scan interval used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SCAN_WIND 24 //!< Scan window used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SUPERV_TIMEOUT 25 //!< Link Layer connection supervision timeout, when using Connection Establishment proc (n * 10 mSec) +#define TGAP_CONN_EST_LATENCY 26 //!< Link Layer connection slave latency, when using Connection Establishment proc (in number of connection events) +#define TGAP_CONN_EST_MIN_CE_LEN 27 //!< Local informational parameter about min len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_MAX_CE_LEN 28 //!< Local informational parameter about max len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_PRIVATE_ADDR_INT 29 //!< Minimum Time Interval between private (resolvable) address changes. In minutes (default 15 minutes) +#define TGAP_CONN_PAUSE_CENTRAL 30 //!< Central idle timer. In seconds (default 1 second) +#define TGAP_CONN_PAUSE_PERIPHERAL 31 //!< Minimum time upon connection establishment before the peripheral starts a connection update procedure. In seconds (default 5 seconds) + +// Proprietary +#define TGAP_SM_TIMEOUT 32 //!< SM Message Timeout (milliseconds). Default 30 seconds. +#define TGAP_SM_MIN_KEY_LEN 33 //!< SM Minimum Key Length supported. Default 7. +#define TGAP_SM_MAX_KEY_LEN 34 //!< SM Maximum Key Length supported. Default 16. +#define TGAP_FILTER_ADV_REPORTS 35 //!< Filter duplicate advertising reports. Default TRUE. +#define TGAP_SCAN_RSP_RSSI_MIN 36 //!< Minimum RSSI required for scan responses to be reported to the app. Default -127. + +#if !defined ( TESTMODES ) + #define TGAP_AUTH_TASK_ID 37 //!< Task ID override for Task Authentication control (for stack internal use only) + #define TGAP_PARAMID_MAX 38 //!< ID MAX-valid Parameter ID +#else + #define TGAP_GAP_TESTCODE 37 //!< GAP TestCodes - puts GAP into a test mode + #define TGAP_SM_TESTCODE 38 //!< SM TestCodes - puts SM into a test mode + #define TGAP_AUTH_TASK_ID 39 //!< Task ID override for Task Authentication control (for stack internal use only) + #define TGAP_PARAMID_MAX 40 //!< ID MAX-valid Parameter ID + + #define TGAP_GATT_TESTCODE 100 //!< GATT TestCodes - puts GATT into a test mode (paramValue maintained by GATT) + #define TGAP_ATT_TESTCODE 101 //!< ATT TestCodes - puts ATT into a test mode (paramValue maintained by ATT) + #define TGAP_GGS_TESTCODE 102 //!< GGS TestCodes - puts GGS into a test mode (paramValue maintained by GGS) +#endif + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ +#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting +#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices +#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices +#define DEVDISC_MODE_ALL 0x03 //!< Not filtered +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ +#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR +#define ADDRTYPE_STATIC 0x01 //!< Static address +#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address +#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ +#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement +#define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement +#define GAP_ADTYPE_ADV_DISCOVER_IND 0x02 //!< Discoverable undirected advertisement +#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement +#define GAP_ADTYPE_SCAN_RSP_IND 0x04 //!< Only used in gapDeviceInfoEvent_t +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ +#define GAP_FILTER_POLICY_ALL 0x00 //!< Allow Scan Request from Any, Allow Connect Request from Any (default). +#define GAP_FILTER_POLICY_WHITE_SCAN 0x01 //!< Allow Scan Request from White List Only, Allow Connect from Any +#define GAP_FILTER_POLICY_WHITE_CON 0x02 //!< Allow Scan Request from Any, Connect from White List Only +#define GAP_FILTER_POLICY_WHITE 0x03 //!< Allow Scan Request and Connect from White List Only +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map +#define ADV_CHANMAP_SIZE 5 + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. +#define GAP_PASSCODE_MAX 999999 + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ +#define GAP_INIT_SIGN_COUNTER 0xFFFFFFFF + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ +#define GAP_ADVCHAN_37 0x01 //!< Advertisement Channel 37 +#define GAP_ADVCHAN_38 0x02 //!< Advertisement Channel 38 +#define GAP_ADVCHAN_39 0x04 //!< Advertisement Channel 39 +#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //!< All Advertisement Channels Enabled +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ +#define WL_NOTUSED 0x00 //!< White list not used but the advertiser's address in this command is used +#define WL_USED 0x01 //!< White list is used and the advertiser's address in this command is not used. +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#define GAP_ADTYPE_FLAGS 0x01 //!< Discovery Mode: @ref GAP_ADTYPE_FLAGS_MODES +#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available +#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs +#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available +#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs +#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available +#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs +#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name +#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name +#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: 0xXX: -127 to +127 dBm +#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets) +#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets) +#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value +#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Secutiry Manager OOB Flags +#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max) +#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field +#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs +#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs +#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data +#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance +#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ +#define GAP_ADTYPE_FLAGS_LIMITED 0x01 //!< Discovery Mode: LE Limited Discoverable Mode +#define GAP_ADTYPE_FLAGS_GENERAL 0x02 //!< Discovery Mode: LE General Discoverable Mode +#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 0x04 //!< Discovery Mode: BR/EDR Not Supported +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#define GAP_APPEARE_UNKNOWN 0x0000 //!< Unknown +#define GAP_APPEARE_GENERIC_PHONE 0x0040 //!< Generic Phone +#define GAP_APPEARE_GENERIC_COMPUTER 0x0080 //!< Generic Computer +#define GAP_APPEARE_GENERIC_WATCH 0x00C0 //!< Generic Watch +#define GAP_APPEARE_WATCH_SPORTS 0x00C1 //!< Watch: Sports Watch +#define GAP_APPEARE_GENERIC_CLOCK 0x0100 //!< Generic Clock +#define GAP_APPEARE_GENERIC_DISPLAY 0x0140 //!< Generic Display +#define GAP_APPEARE_GENERIC_RC 0x0180 //!< Generic Remote Control +#define GAP_APPEARE_GENERIC_EYE_GALSSES 0x01C0 //!< Generic Eye-glasses +#define GAP_APPEARE_GENERIC_TAG 0x0200 //!< Generic Tag +#define GAP_APPEARE_GENERIC_KEYRING 0x0240 //!< Generic Keyring +#define GAP_APPEARE_GENERIC_MEDIA_PLAYER 0x0280 //!< Generic Media Player +#define GAP_APPEARE_GENERIC_BARCODE_SCANNER 0x02C0 //!< Generic Barcode Scanner +#define GAP_APPEARE_GENERIC_THERMOMETER 0x0300 //!< Generic Thermometer +#define GAP_APPEARE_GENERIC_THERMO_EAR 0x0301 //!< Thermometer: Ear +#define GAP_APPEARE_GENERIC_HR_SENSOR 0x0340 //!< Generic Heart rate Sensor +#define GAP_APPEARE_GENERIC_HRS_BELT 0x0341 //!< Heart Rate Sensor: Heart Rate Belt +#define GAP_APPEARE_GENERIC_BLOOD_PRESSURE 0x0380 //!< Generic Blood Pressure +#define GAP_APPEARE_GENERIC_BP_ARM 0x0381 //!< Blood Pressure: Arm +#define GAP_APPEARE_GENERIC_BP_WRIST 0x0382 //!< Blood Pressure: Wrist +#define GAP_APPEARE_GENERIC_HID 0x03C0 //!< Generic Human Interface Device (HID) +#define GAP_APPEARE_HID_KEYBOARD 0x03C1 //!< HID Keyboard +#define GAP_APPEARE_HID_MOUSE 0x03C2 //!< HID Mouse +#define GAP_APPEARE_HID_JOYSTIC 0x03C3 //!< HID Joystick +#define GAP_APPEARE_HID_GAMEPAD 0x03C4 //!< HID Gamepad +#define GAP_APPEARE_HID_DIGITIZER_TYABLET 0x03C5 //!< HID Digitizer Tablet +#define GAP_APPEARE_HID_DIGITAL_CARDREADER 0x03C6 //!< HID Card Reader +#define GAP_APPEARE_HID_DIGITAL_PEN 0x03C7 //!< HID Digital Pen +#define GAP_APPEARE_HID_BARCODE_SCANNER 0x03C8 //!< HID Barcode Scanner +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[B_ADDR_LEN]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[B_ADDR_LEN]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[B_ADDR_LEN]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[B_ADDR_LEN]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[B_ADDR_LEN]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[B_ADDR_LEN]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[B_ADDR_LEN]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[B_ADDR_LEN]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAP_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt.h new file mode 100644 index 0000000..30022ae --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt.h @@ -0,0 +1,1365 @@ +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GATT_H +#define GATT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +#include "att.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#define GATT_PERMIT_READ 0x01 //!< Attribute is Readable +#define GATT_PERMIT_WRITE 0x02 //!< Attribute is Writable +#define GATT_PERMIT_AUTHEN_READ 0x04 //!< Read requires Authentication +#define GATT_PERMIT_AUTHEN_WRITE 0x08 //!< Write requires Authentication +#define GATT_PERMIT_AUTHOR_READ 0x10 //!< Read requires Authorization +#define GATT_PERMIT_AUTHOR_WRITE 0x20 //!< Write requires Authorization + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + +#if !defined( GATT_MAX_NUM_PREPARE_WRITES ) + #define GATT_MAX_NUM_PREPARE_WRITES 5 //!< GATT Maximum number of attributes that Attribute Server can prepare for writing per Attribute Client +#endif + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + +#define GATT_ENCRYPT_KEY_SIZE 16 //!< GATT Encryption Key Size used for encrypting a link + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + +#define GATT_MAX_ATTR_SIZE 512 //!< GATT Maximum length of an attribute value + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) +#define GATT_MAX_NUM_CONN ( MAX_NUM_LL_CONN + 1 ) + + // GATT Base Method +#define GATT_BASE_METHOD 0x40 + +// Attribute handle defintions +#define GATT_INVALID_HANDLE 0x0000 // Invalid attribute handle +#define GATT_MIN_HANDLE 0x0001 // Minimum attribute handle +#define GATT_MAX_HANDLE 0xFFFF // Maximum attribute handle + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#define gattPermitRead( a ) ( (a) & GATT_PERMIT_READ ) +#define gattPermitWrite( a ) ( (a) & GATT_PERMIT_WRITE ) +#define gattPermitAuthenRead( a ) ( (a) & GATT_PERMIT_AUTHEN_READ ) +#define gattPermitAuthenWrite( a ) ( (a) & GATT_PERMIT_AUTHEN_WRITE ) +#define gattPermitAuthorRead( a ) ( (a) & GATT_PERMIT_AUTHOR_READ ) +#define gattPermitAuthorWrite( a ) ( (a) & GATT_PERMIT_AUTHOR_WRITE ) + +// Check for different UUID types +#define gattPrimaryServiceType( t ) ( ATT_CompareUUID( primaryServiceUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattSecondaryServiceType( t ) ( ATT_CompareUUID( secondaryServiceUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattCharacterType( t ) ( ATT_CompareUUID( characterUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattIncludeType( t ) ( ATT_CompareUUID( includeUUID, ATT_BT_UUID_SIZE, \ + (t).uuid, (t).len ) ) +#define gattServiceType( t ) ( gattPrimaryServiceType( (t) ) || \ + gattSecondaryServiceType( (t) ) ) + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATT_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt_uuid.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt_uuid.h new file mode 100644 index 0000000..f33ff5b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/gatt_uuid.h @@ -0,0 +1,236 @@ +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GATT_UUID_H +#define GATT_UUID_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ +#define GAP_SERVICE_UUID 0x1800 // Generic Access Profile +#define GATT_SERVICE_UUID 0x1801 // Generic Attribute Profile + +/** + * GATT Declarations + */ +#define GATT_PRIMARY_SERVICE_UUID 0x2800 // Primary Service +#define GATT_SECONDARY_SERVICE_UUID 0x2801 // Secondary Service +#define GATT_INCLUDE_UUID 0x2802 // Include +#define GATT_CHARACTER_UUID 0x2803 // Characteristic + +/** + * GATT Descriptors + */ +#define GATT_CHAR_EXT_PROPS_UUID 0x2900 // Characteristic Extended Properties +#define GATT_CHAR_USER_DESC_UUID 0x2901 // Characteristic User Description +#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 // Client Characteristic Configuration +#define GATT_SERV_CHAR_CFG_UUID 0x2903 // Server Characteristic Configuration +#define GATT_CHAR_FORMAT_UUID 0x2904 // Characteristic Format +#define GATT_CHAR_AGG_FORMAT_UUID 0x2905 // Characteristic Aggregate Format +#define GATT_VALID_RANGE_UUID 0x2906 // Valid Range +#define GATT_EXT_REPORT_REF_UUID 0x2907 // External Report Reference Descriptor +#define GATT_REPORT_REF_UUID 0x2908 // Report Reference Descriptor + +/** + * GATT Characteristics + */ +#define DEVICE_NAME_UUID 0x2A00 // Device Name +#define APPEARANCE_UUID 0x2A01 // Appearance +#define PERI_PRIVACY_FLAG_UUID 0x2A02 // Peripheral Privacy Flag +#define RECONNECT_ADDR_UUID 0x2A03 // Reconnection Address +#define PERI_CONN_PARAM_UUID 0x2A04 // Peripheral Preferred Connection Parameters +#define SERVICE_CHANGED_UUID 0x2A05 // Service Changed + +/** + * GATT Units + */ +#define GATT_UNITLESS_UUID 0x2700 // , +#define GATT_UNIT_LENGTH_METER_UUID 0x2701 // m, m +#define GATT_UNIT_MASS_KGRAM_UUID 0x2702 // kg, kg +#define GATT_UNIT_TIME_SECOND_UUID 0x2703 // s, s +#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID 0x2704 // A, A +#define GATT_UNIT_THERMODYNAMIC_TEMP_K_UUID 0x2705 // K, K +#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID 0x2706 // mol, mol +#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID 0x2707 // cd, cd + +#define GATT_UNIT_AREA_SQ_MTR_UUID 0x2710 // m^2, m^2 +#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID 0x2711 // m^3, m^3 +#define GATT_UNIT_VELOCITY_MPS_UUID 0x2712 // m/s, m s^-1 +#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID 0x2713 // m/s^2, m s^-2 +#define GATT_UNIT_WAVENUMBER_RM_UUID 0x2714 // ó, m^-1 +#define GATT_UNIT_DENSITY_KGPCM_UUID 0x2715 // p, kg m^-3 +#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID 0x2716 // pA, kg m^-2 +#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID 0x2717 // v, m^3 kg^-1 +#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID 0x2718 // j, A m^-2 +#define GATT_UNIT_MAGNETIC_FIELD_STRENGTH_UUID 0x2719 // H, A m +#define GATT_UNIT_AMOUNT_CONCENTRATE_MPCM_UUID 0x271A // c, mol m^-3 +#define GATT_UNIT_MASS_CONCENTRATE_KGPCM_UUID 0x271B // c, kg m^-3 +#define GATT_UNIT_LUMINANCE_CPSM_UUID 0x271C // Lv, cd m^-2 +#define GATT_UNIT_REFRACTIVE_INDEX_UUID 0x271D // n, 1 +#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID 0x271E // u, 1 +#define GATT_UNIT_PLANE_ANGLE_RAD_UUID 0x2720 // rad, m m-1 +#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID 0x2721 // sr, m2 m-2 +#define GATT_UNIT_FREQUENCY_HTZ_UUID 0x2722 // Hz, s-1 +#define GATT_UNIT_FORCE_NEWTON_UUID 0x2723 // N, m kg s-2 +#define GATT_UNIT_PRESSURE_PASCAL_UUID 0x2724 // Pa, N/m2 = m2 kg s-2 +#define GATT_UNIT_ENERGY_JOULE_UUID 0x2725 // J, N m = m2 kg s-2 +#define GATT_UNIT_POWER_WATT_UUID 0x2726 // W, J/s = m2 kg s-3 +#define GATT_UNIT_ELECTRIC_CHARGE_C_UUID 0x2727 // C, sA +#define GATT_UNIT_ELECTRIC_POTENTIAL_DIF_V_UUID 0x2728 // V, W/A = m2 kg s-3 A-1 + +#define GATT_UNIT_CELSIUS_TEMP_DC_UUID 0x272F // oC, t/oC = T/K - 273.15 + +#define GATT_UNIT_TIME_MINUTE_UUID 0x2760 // min, 60 s +#define GATT_UNIT_TIME_HOUR_UUID 0x2761 // h, 3600 s +#define GATT_UNIT_TIME_DAY_UUID 0x2762 // d, 86400 s +#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID 0x2763 // o, (pi/180) rad +#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID 0x2764 // ', (pi/10800) rad +#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID 0x2765 // '', (pi/648000) rad +#define GATT_UNIT_AREA_HECTARE_UUID 0x2766 // ha, 10^4 m^2 +#define GATT_UNIT_VOLUME_LITRE_UUID 0x2767 // l, 10^-3 m^3 +#define GATT_UNIT_MASS_TONNE_UUID 0x2768 // t, 10^3 kg + +#define GATT_UINT_LENGTH_YARD_UUID 0x27A0 // yd, 0.9144 m +#define GATT_UNIT_LENGTH_PARSEC_UUID 0x27A1 // pc, 3.085678 × 1016 m +#define GATT_UNIT_LENGTH_INCH_UUID 0x27A2 // in, 0.0254 m +#define GATT_UNIT_LENGTH_FOOT_UUID 0x27A3 // ft, 0.3048 m +#define GATT_UNIT_LENGTH_MILE_UUID 0x27A4 // mi, 1609.347 m +#define GATT_UNIT_PRESSURE_PFPSI_UUID 0x27A5 // psi, 6.894757 × 103 Pa +#define GATT_UNIT_VELOCITY_KMPH_UUID 0x27A6 // km/h, 0.2777778 m^s-1 +#define GATT_UNIT_VELOCITY_MPH_UUID 0x27A7 // mi/h, 0.44704 m^ s-1 +#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID 0x27A8 // r/min, 0.1047198 rad s-1 +#define GATT_UNIT_ENERGY_GCAL_UUID 0x27A9 // +#define GATT_UNIT_ENERGY_KCAL_UUID 0x27AA // kcal, 4190.02 J +#define GATT_UNIT_ENERGY_KWH_UUID 0x27AB // kWh, 3600000 J +#define GATT_UNIT_THERMODYNAMIC_TEMP_DF_UUID 0x27AC // oF, t/oF = T/K × 1.8 - 459.67 +#define GATT_UNIT_PERCENTAGE_UUID 0x27AD // % +#define GATT_UNIT_PER_MILE_UUID 0x27AE // +#define GATT_UNIT_PERIOD_BPM_UUID 0x27AF // +#define GATT_UNIT_ELECTRIC_CHARGE_AH_UUID 0x27B0 // +#define GATT_UNIT_MASS_DENSITY_MGPD_UUID 0x27B1 // +#define GATT_UNIT_MASS_DENSITY_MMPL_UUID 0x27B2 // +#define GATT_UNIT_TIME_YEAR_UUID 0x27B3 // +#define GATT_UNIT_TIME_MONTH_UUID 0x27B4 // + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern CONST uint8 gapServiceUUID[]; +extern CONST uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern CONST uint8 primaryServiceUUID[]; +extern CONST uint8 secondaryServiceUUID[]; +extern CONST uint8 includeUUID[]; +extern CONST uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern CONST uint8 charExtPropsUUID[]; +extern CONST uint8 charUserDescUUID[]; +extern CONST uint8 clientCharCfgUUID[]; +extern CONST uint8 clientCharCfg2UUID[]; +extern CONST uint8 servCharCfgUUID[]; +extern CONST uint8 charFormatUUID[]; +extern CONST uint8 charAggFormatUUID[]; +extern CONST uint8 validRangeUUID[]; +extern CONST uint8 extReportRefUUID[]; +extern CONST uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern CONST uint8 deviceNameUUID[]; +extern CONST uint8 appearanceUUID[]; +extern CONST uint8 periPrivacyFlagUUID[]; +extern CONST uint8 reconnectAddrUUID[]; +extern CONST uint8 periConnParamUUID[]; +extern CONST uint8 serviceChangedUUID[]; +extern CONST uint8 manuNameUUID[]; +extern CONST uint8 serialNumUUID[]; +extern CONST uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATT_UUID_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/hci.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/hci.h new file mode 100644 index 0000000..2567ad7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/hci.h @@ -0,0 +1,2462 @@ +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2013-05-14 12:23:59 -0700 (Tue, 14 May 2013) $ + Revision: $Revision: 34279 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef HCI_H +#define HCI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "ll.h" +#include "hal_assert.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#define HCI_SUCCESS 0x00 +#define HCI_ERROR_CODE_UNKNOWN_HCI_CMD 0x01 +#define HCI_ERROR_CODE_UNKNOWN_CONN_ID 0x02 +#define HCI_ERROR_CODE_HW_FAILURE 0x03 +#define HCI_ERROR_CODE_PAGE_TIMEOUT 0x04 +#define HCI_ERROR_CODE_AUTH_FAILURE 0x05 +#define HCI_ERROR_CODE_PIN_KEY_MISSING 0x06 +#define HCI_ERROR_CODE_MEM_CAP_EXCEEDED 0x07 +#define HCI_ERROR_CODE_CONN_TIMEOUT 0x08 +#define HCI_ERROR_CODE_CONN_LIMIT_EXCEEDED 0x09 +#define HCI_ERROR_CODE_SYNCH_CONN_LIMIT_EXCEEDED 0x0A +#define HCI_ERROR_CODE_ACL_CONN_ALREADY_EXISTS 0x0B +#define HCI_ERROR_CODE_CMD_DISALLOWED 0x0C +#define HCI_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES 0x0D +#define HCI_ERROR_CODE_CONN_REJECTED_SECURITY_REASONS 0x0E +#define HCI_ERROR_CODE_CONN_REJECTED_UNACCEPTABLE_BDADDR 0x0F +#define HCI_ERROR_CODE_CONN_ACCEPT_TIMEOUT_EXCEEDED 0x10 +#define HCI_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE 0x11 +#define HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS 0x12 +#define HCI_ERROR_CODE_REMOTE_USER_TERM_CONN 0x13 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES 0x14 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF 0x15 +#define HCI_ERROR_CODE_CONN_TERM_BY_LOCAL_HOST 0x16 +#define HCI_ERROR_CODE_REPEATED_ATTEMPTS 0x17 +#define HCI_ERROR_CODE_PAIRING_NOT_ALLOWED 0x18 +#define HCI_ERROR_CODE_UNKNOWN_LMP_PDU 0x19 +#define HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE 0x1A +#define HCI_ERROR_CODE_SCO_OFFSET_REJ 0x1B +#define HCI_ERROR_CODE_SCO_INTERVAL_REJ 0x1C +#define HCI_ERROR_CODE_SCO_AIR_MODE_REJ 0x1D +#define HCI_ERROR_CODE_INVALID_LMP_PARAMS 0x1E +#define HCI_ERROR_CODE_UNSPECIFIED_ERROR 0x1F +#define HCI_ERROR_CODE_UNSUPPORTED_LMP_PARAM_VAL 0x20 +#define HCI_ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21 +#define HCI_ERROR_CODE_LMP_LL_RESP_TIMEOUT 0x22 +#define HCI_ERROR_CODE_LMP_ERR_TRANSACTION_COLLISION 0x23 +#define HCI_ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24 +#define HCI_ERROR_CODE_ENCRYPT_MODE_NOT_ACCEPTABLE 0x25 +#define HCI_ERROR_CODE_LINK_KEY_CAN_NOT_BE_CHANGED 0x26 +#define HCI_ERROR_CODE_REQ_QOS_NOT_SUPPORTED 0x27 +#define HCI_ERROR_CODE_INSTANT_PASSED 0x28 +#define HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 +#define HCI_ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A +#define HCI_ERROR_CODE_RESERVED1 0x2B +#define HCI_ERROR_CODE_QOS_UNACCEPTABLE_PARAM 0x2C +#define HCI_ERROR_CODE_QOS_REJ 0x2D +#define HCI_ERROR_CODE_CHAN_ASSESSMENT_NOT_SUPPORTED 0x2E +#define HCI_ERROR_CODE_INSUFFICIENT_SECURITY 0x2F +#define HCI_ERROR_CODE_PARAM_OUT_OF_MANDATORY_RANGE 0x30 +#define HCI_ERROR_CODE_RESERVED2 0x31 +#define HCI_ERROR_CODE_ROLE_SWITCH_PENDING 0x32 +#define HCI_ERROR_CODE_RESERVED3 0x33 +#define HCI_ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34 +#define HCI_ERROR_CODE_ROLE_SWITCH_FAILED 0x35 +#define HCI_ERROR_CODE_EXTENDED_INQUIRY_RESP_TOO_LARGE 0x36 +#define HCI_ERROR_CODE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37 +#define HCI_ERROR_CODE_HOST_BUSY_PAIRING 0x38 +#define HCI_ERROR_CODE_CONN_REJ_NO_SUITABLE_CHAN_FOUND 0x39 +#define HCI_ERROR_CODE_CONTROLLER_BUSY 0x3A +#define HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL 0x3B +#define HCI_ERROR_CODE_DIRECTED_ADV_TIMEOUT 0x3C +#define HCI_ERROR_CODE_CONN_TERM_MIC_FAILURE 0x3D +#define HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH 0x3E +#define HCI_ERROR_CODE_MAC_CONN_FAILED 0x3F + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags +#define FIRST_PKT_HOST_TO_CTRL LL_DATA_FIRST_PKT_HOST_TO_CTRL +#define CONTINUING_PKT LL_DATA_CONTINUATION_PKT +#define FIRST_PKT_CTRL_TO_HOST LL_DATA_FIRST_PKT_CTRL_TO_HOST + +// Receive Data Packet +#define HCI_RSSI_NOT_AVAILABLE LL_RSSI_NOT_AVAILABLE + +// Disconnect Reasons +#define HCI_DISCONNECT_AUTH_FAILURE HCI_ERROR_CODE_AUTH_FAILURE +#define HCI_DISCONNECT_REMOTE_USER_TERM HCI_ERROR_CODE_REMOTE_USER_TERM_CONN +#define HCI_DISCONNECT_REMOTE_DEV_LOW_RESOURCES HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES +#define HCI_DISCONNECT_REMOTE_DEV_POWER_OFF HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF +#define HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE +#define HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED +#define HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL + +// Tx Power Types +#define HCI_READ_CURRENT_TX_POWER_LEVEL LL_READ_CURRENT_TX_POWER_LEVEL +#define HCI_READ_MAX_TX_POWER_LEVEL LL_READ_MAX_TX_POWER_LEVEL + +// Host Flow Control +#define HCI_CTRL_TO_HOST_FLOW_CTRL_OFF 0 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF 1 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON 2 +#define HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON 3 + +// Device Address Type +#define HCI_PUBLIC_DEVICE_ADDRESS LL_DEV_ADDR_TYPE_PUBLIC +#define HCI_RANDOM_DEVICE_ADDRESS LL_DEV_ADDR_TYPE_RANDOM + +// Advertiser Events +#define HCI_CONNECTABLE_UNDIRECTED_ADV LL_ADV_CONNECTABLE_UNDIRECTED_EVT +#define HCI_CONNECTABLE_DIRECTED_ADV LL_ADV_CONNECTABLE_DIRECTED_EVT +#define HCI_SCANNABLE_UNDIRECTED LL_ADV_SCANNABLE_UNDIRECTED_EVT +#define HCI_NONCONNECTABLE_UNDIRECTED_ADV LL_ADV_NONCONNECTABLE_UNDIRECTED_EVT + +// Advertiser Channels +#define HCI_ADV_CHAN_37 LL_ADV_CHAN_37 +#define HCI_ADV_CHAN_38 LL_ADV_CHAN_38 +#define HCI_ADV_CHAN_39 LL_ADV_CHAN_39 +#define HCI_ADV_CHAN_ALL (LL_ADV_CHAN_37 | LL_ADV_CHAN_38 | LL_ADV_CHAN_39) + +// Advertiser White List Policy +#define HCI_ADV_WL_POLICY_ANY_REQ LL_ADV_WL_POLICY_ANY_REQ +#define HCI_ADV_WL_POLICY_WL_SCAN_REQ LL_ADV_WL_POLICY_WL_SCAN_REQ +#define HCI_ADV_WL_POLICY_WL_CONNECT_REQ LL_ADV_WL_POLICY_WL_CONNECT_REQ +#define HCI_ADV_WL_POLICY_WL_ALL_REQ LL_ADV_WL_POLICY_WL_ALL_REQ + +// Advertiser Commands +#define HCI_ENABLE_ADV LL_ADV_MODE_ON +#define HCI_DISABLE_ADV LL_ADV_MODE_OFF + +// Scan Types +#define HCI_SCAN_PASSIVE LL_SCAN_PASSIVE +#define HCI_SCAN_ACTIVE LL_SCAN_ACTIVE + +// Scan White List Policy +#define HCI_SCAN_WL_POLICY_ANY_ADV_PKTS LL_SCAN_WL_POLICY_ANY_ADV_PKTS +#define HCI_SCAN_WL_POLICY_USE_WHITE_LIST LL_SCAN_WL_POLICY_USE_WHITE_LIST + +// Scan Filtering +#define HCI_FILTER_REPORTS_DISABLE LL_FILTER_REPORTS_DISABLE +#define HCI_FILTER_REPORTS_ENABLE LL_FILTER_REPORTS_ENABLE + +// Scan Commands +#define HCI_SCAN_STOP LL_SCAN_STOP +#define HCI_SCAN_START LL_SCAN_START + +// Initiator White List Policy +#define HCI_INIT_WL_POLICY_USE_PEER_ADDR LL_INIT_WL_POLICY_USE_PEER_ADDR +#define HCI_INIT_WL_POLICY_USE_WHITE_LIST LL_INIT_WL_POLICY_USE_WHITE_LIST + +// Encryption Related +#define HCI_ENCRYPTION_OFF LL_ENCRYPTION_OFF +#define HCI_ENCRYPTION_ON LL_ENCRYPTION_ON + +// Direct Test Mode +#define HCI_DTM_NUMBER_RF_CHANS LL_DIRECT_TEST_NUM_RF_CHANS +#define HCI_DIRECT_TEST_MAX_PAYLOAD_LEN LL_DIRECT_TEST_MAX_PAYLOAD_LEN +// +#define HCI_DIRECT_TEST_PAYLOAD_PRBS9 LL_DIRECT_TEST_PAYLOAD_PRBS9 +#define HCI_DIRECT_TEST_PAYLOAD_0x0F LL_DIRECT_TEST_PAYLOAD_0x0F +#define HCI_DIRECT_TEST_PAYLOAD_0x55 LL_DIRECT_TEST_PAYLOAD_0x55 +#define HCI_DIRECT_TEST_PAYLOAD_PRBS15 LL_DIRECT_TEST_PAYLOAD_PRBS15 +#define HCI_DIRECT_TEST_PAYLOAD_0xFF LL_DIRECT_TEST_PAYLOAD_0xFF +#define HCI_DIRECT_TEST_PAYLOAD_0x00 LL_DIRECT_TEST_PAYLOAD_0x00 +#define HCI_DIRECT_TEST_PAYLOAD_0xF0 LL_DIRECT_TEST_PAYLOAD_0xF0 +#define HCI_DIRECT_TEST_PAYLOAD_0xAA LL_DIRECT_TEST_PAYLOAD_0xAA + +// Vendor Specific +#define HCI_EXT_RX_GAIN_STD LL_EXT_RX_GAIN_STD +#define HCI_EXT_RX_GAIN_HIGH LL_EXT_RX_GAIN_HIGH +// +#define HCI_EXT_TX_POWER_MINUS_23_DBM LL_EXT_TX_POWER_MINUS_23_DBM +#define HCI_EXT_TX_POWER_MINUS_6_DBM LL_EXT_TX_POWER_MINUS_6_DBM +#define HCI_EXT_TX_POWER_0_DBM LL_EXT_TX_POWER_0_DBM +#define HCI_EXT_TX_POWER_4_DBM LL_EXT_TX_POWER_4_DBM +// +#define HCI_EXT_ENABLE_ONE_PKT_PER_EVT LL_EXT_ENABLE_ONE_PKT_PER_EVT +#define HCI_EXT_DISABLE_ONE_PKT_PER_EVT LL_EXT_DISABLE_ONE_PKT_PER_EVT +// +#define HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT +#define HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT +// +#define HCI_EXT_NV_IN_USE LL_EXT_NV_IN_USE +#define HCI_EXT_NV_NOT_IN_USE LL_EXT_NV_NOT_IN_USE +// +#define HCI_EXT_ENABLE_FAST_TX_RESP_TIME LL_EXT_ENABLE_FAST_TX_RESP_TIME +#define HCI_EXT_DISABLE_FAST_TX_RESP_TIME LL_EXT_DISABLE_FAST_TX_RESP_TIME +// +#define HCI_EXT_ENABLE_SL_OVERRIDE LL_EXT_ENABLE_SL_OVERRIDE +#define HCI_EXT_DISABLE_SL_OVERRIDE LL_EXT_DISABLE_SL_OVERRIDE +// +#define HCI_EXT_TX_MODULATED_CARRIER LL_EXT_TX_MODULATED_CARRIER +#define HCI_EXT_TX_UNMODULATED_CARRIER LL_EXT_TX_UNMODULATED_CARRIER +// +#define HCI_PTM_SET_FREQ_TUNE_DOWN LL_EXT_SET_FREQ_TUNE_DOWN +#define HCI_PTM_SET_FREQ_TUNE_UP LL_EXT_SET_FREQ_TUNE_UP +// +#define HCI_EXT_PM_IO_PORT_P0 LL_EXT_PM_IO_PORT_P0 +#define HCI_EXT_PM_IO_PORT_P1 LL_EXT_PM_IO_PORT_P1 +#define HCI_EXT_PM_IO_PORT_P2 LL_EXT_PM_IO_PORT_P2 +#define HCI_EXT_PM_IO_PORT_NONE LL_EXT_PM_IO_PORT_NONE +// +#define HCI_EXT_PM_IO_PORT_PIN0 LL_EXT_PM_IO_PORT_PIN0 +#define HCI_EXT_PM_IO_PORT_PIN1 LL_EXT_PM_IO_PORT_PIN1 +#define HCI_EXT_PM_IO_PORT_PIN2 LL_EXT_PM_IO_PORT_PIN2 +#define HCI_EXT_PM_IO_PORT_PIN3 LL_EXT_PM_IO_PORT_PIN3 +#define HCI_EXT_PM_IO_PORT_PIN4 LL_EXT_PM_IO_PORT_PIN4 +#define HCI_EXT_PM_IO_PORT_PIN5 LL_EXT_PM_IO_PORT_PIN5 +#define HCI_EXT_PM_IO_PORT_PIN6 LL_EXT_PM_IO_PORT_PIN6 +#define HCI_EXT_PM_IO_PORT_PIN7 LL_EXT_PM_IO_PORT_PIN7 +// +#define HCI_EXT_PER_RESET LL_EXT_PER_RESET +#define HCI_EXT_PER_READ LL_EXT_PER_READ +// +#define HCI_EXT_HALT_DURING_RF_DISABLE LL_EXT_HALT_DURING_RF_DISABLE +#define HCI_EXT_HALT_DURING_RF_ENABLE LL_EXT_HALT_DURING_RF_ENABLE +// +#define HCI_EXT_SET_USER_REVISION LL_EXT_SET_USER_REVISION +#define HCI_EXT_READ_BUILD_REVISION LL_EXT_READ_BUILD_REVISION + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow +#define HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW 0 +#define HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW 1 + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[B_ADDR_LEN]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[B_ADDR_LEN]; // device address + uint8 dataLen; // length of report data + uint8 rspData[B_MAX_ADV_LEN]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[B_RANDOM_NUM_SIZE]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_ValidConnTimeParams API + * + * @brief This API is used to check that the connection time parameter + * ranges are valid, and that the connection time parameter + * combination is valid. + * + * Note: Only connIntervalMax is used as part of the time parameter + * combination check. + * + * input parameters + * + * @param connIntervalMin - Minimum connection interval. + * @param connIntervalMax - Maximum connection interval. + * @param connLatency - Connection slave latency. + * @param connTimeout - Connection supervision timeout. + * + * output parameters + * + * @param None. + * + * @return TRUE: Connection time parameter check is valid. + * FALSE: Connection time parameter check is invalid. + */ +extern uint8 HCI_ValidConnTimeParams( uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/* +** HCI API +*/ + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn HCI_LE_SetScanParamCmd API + * + * @brief This LE API is used to set the Scan parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param scanType - HCI_SCAN_PASSIVE, HCI_SCAN_ACTIVE + * @param scanInterval - Time between scan events. + * @param scanWindow - Time of scan before scan event ends. + * Note: When the scanWindow equals the scanInterval + * then scanning is continuous. + * @param ownAddrType - This device's address. + * @param filterPolicy - HCI_SCAN_PASSIVE, HCI_SCAN_ACTIVE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanParamCmd( uint8 scanType, + uint16 scanInterval, + uint16 scanWindow, + uint8 ownAddrType, + uint8 filterPolicy ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & SCAN_CFG) +/******************************************************************************* + * @fn HCI_LE_SetScanEnableCmd API + * + * @brief This LE API is used to turn Scanning on or off. + * + * Related Events: HCI_CommandCompleteEvent, + * AdvReportEvent + * + * input parameters + * + * @param scanEnable - HCI_SCAN_START, HCI_SCAN_STOP + * @param filterDuplicates - HCI_FILTER_REPORTS_ENABLE, + * HCI_FILTER_REPORTS_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanEnableCmd( uint8 scanEnable, + uint8 filterDuplicates ); +#endif // CTRL_CONFIG=SCAN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); +#endif // CTRL_CONFIG=INIT_CFG + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=INIT_CFG + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & INIT_CFG) +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); +#endif // CTRL_CONFIG=INIT_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_EXT_SetSlaveLatencyOverrideCmd API + * + * @brief This HCI Extension API is used to to enable or disable + * suspending slave latency. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_SL_OVERRIDE, + * HCI_EXT_DISABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSlaveLatencyOverrideCmd( uint8 control ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_CONN_CFG) || (CTRL_CONFIG & INIT_CFG)) +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); +#endif // CTRL_CONFIG=(ADV_CONN_CFG | INIT_CFG) + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + +#if defined(CTRL_CONFIG) && ((CTRL_CONFIG & ADV_NCONN_CFG) || (CTRL_CONFIG & ADV_CONN_CFG)) +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=(ADV_NCONN_CFG | ADV_CONN_CFG) + + +#if defined(CTRL_CONFIG) && (CTRL_CONFIG & ADV_CONN_CFG) +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); +#endif // CTRL_CONFIG=ADV_CONN_CFG + + +/******************************************************************************* + * @fn HCI_EXT_BuildRevisionCmd Vendor Specific API + * + * @brief This HCI Extension API is used set a user revision number or + * read the build revision number. + * + * input parameters + * + * @param mode - HCI_EXT_SET_USER_REVISION | HCI_EXT_READ_BUILD_REVISION + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS + */ +extern hciStatus_t HCI_EXT_BuildRevisionCmd( uint8 mode, uint16 userRevNum ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HCI_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/l2cap.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/l2cap.h new file mode 100644 index 0000000..996cfae --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/l2cap.h @@ -0,0 +1,407 @@ +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef L2CAP_H +#define L2CAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) +#define L2CAP_MTU_SIZE 23 + +// Minimum supported information payload for the Control frame (C-frame) +#define L2CAP_SIG_MTU_SIZE 23 + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) +#define L2CAP_HDR_SIZE 4 + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). +#define L2CAP_PDU_SIZE ( L2CAP_HDR_SIZE + L2CAP_MTU_SIZE ) + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. +#define L2CAP_CID_NULL 0x0000 // Illegal Identifier +#define L2CAP_CID_ATT 0x0004 // Attribute Protocol +#define L2CAP_CID_SIG 0x0005 // L2CAP Signaling +#define L2CAP_CID_SMP 0x0006 // Security Management Protocol +#define L2CAP_CID_GENERIC 0x0007 // Generic Fixed Channel + +// L2CAP Dynamic Channel Identifiers +#define L2CAP_BASE_DYNAMIC_CID 0x0040 +#define L2CAP_LAST_DYNAMIC_CID ( BASE_DYNAMIC_CID + L2CAP_NUM_CHANNELS - 1 ) + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel +#define L2CAP_NUM_FIXED_CHANNELS 4 + +// Number of Protocols supported -- for future use +#define L2CAP_NUM_PROTOCOLS 0 + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request +#define L2CAP_NUM_AUX_CHANNELS 3 + +// Number of Dynamic channels: one per each protocol supported on each physical connection +#define L2CAP_NUM_DYNAMIC_CHANNELS ( L2CAP_NUM_PROTOCOLS * MAX_NUM_LL_CONN ) + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels +#define L2CAP_NUM_CHANNELS ( L2CAP_NUM_DYNAMIC_CHANNELS + L2CAP_NUM_AUX_CHANNELS ) + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. +#define L2CAP_RTX_TIMEOUT 30 + +// L2CAP Signaling Codes (type of commands) +#define L2CAP_CMD_REJECT 0x01 +#define L2CAP_ECHO_REQ 0x08 // No longer supported +#define L2CAP_ECHO_RSP 0x09 // No longer supported +#define L2CAP_INFO_REQ 0x0a // No longer supported +#define L2CAP_INFO_RSP 0x0b // No longer supported +#define L2CAP_PARAM_UPDATE_REQ 0x12 +#define L2CAP_PARAM_UPDATE_RSP 0x13 + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood +#define L2CAP_REJECT_CMD_NOT_UNDERSTOOD 0x0000 + + // Signaling MTU exceeded +#define L2CAP_REJECT_SIGNAL_MTU_EXCEED 0x0001 + + // Invalid CID in request +#define L2CAP_REJECT_INVALID_CID 0x0002 + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU +#define L2CAP_INFO_CONNLESS_MTU 0x0001 + + // Extended features supported +#define L2CAP_INFO_EXTENDED_FEATURES 0x0002 + + // Fixed channels supported +#define L2CAP_INFO_FIXED_CHANNELS 0x0003 + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported +#define L2CAP_FIXED_CHANNELS 0x00000080 + + // Length of Extended Features bit mask +#define L2CAP_EXTENDED_FEATURES_SIZE 4 + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported +#define L2CAP_FIXED_CHANNELS_ATT 0x10 + + // Fixed Channel L2CAP Signaling is supported +#define L2CAP_FIXED_CHANNELS_SIG 0x20 + + // Fixed Channel SMP is supported +#define L2CAP_FIXED_CHANNELS_SMP 0x40 + + // Length of Fixed Channels bit mask +#define L2CAP_FIXED_CHANNELS_SIZE 8 + +/********************************************************************* + * Information Response: Result Values + */ + // Success +#define L2CAP_INFO_SUCCESS 0x0000 + + // Not supported +#define L2CAP_INFO_NOT_SUPPORTED 0x0001 + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted +#define L2CAP_CONN_PARAMS_ACCEPTED 0x0000 + + // Connection Parameters rejected +#define L2CAP_CONN_PARAMS_REJECTED 0x0001 + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + #define maxSignalMTU reasonData.signalMTU + #define invalidLocalCID reasonData.invalidCID.localCID + #define invalidRemoteCID reasonData.invalidCID.remoteCID +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[L2CAP_FIXED_CHANNELS_SIZE]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* L2CAP_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/ble/include/sm.h b/Firmware/Radio/Projects/Wimu/Components/ble/include/sm.h new file mode 100644 index 0000000..5d6779b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/ble/include/sm.h @@ -0,0 +1,381 @@ +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef SM_H +#define SM_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ +#define DISPLAY_ONLY 0x00 //!< Display Only Device +#define DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End SM_IO_CAP_DEFINES */ + +#define SM_AUTH_MITM_MASK(a) (((a) & 0x04) >> 2) + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ +#define SM_PASSKEY_TYPE_INPUT 0x01 //!< Input the passkey +#define SM_PASSKEY_TYPE_DISPLAY 0x02 //!< Display the passkey +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ +#define SM_AUTH_REQ_NO_BONDING 0x00 //!< No bonding +#define SM_AUTH_REQ_BONDING 0x01 //!< Bonding +/** @} End SM_BONDING_FLAGS_DEFINES */ + +#define PASSKEY_LEN 6 //! Passkey Character Length (ASCII Characters) + +#define SM_AUTH_STATE_AUTHENTICATED 0x04 //! Authenticate requested +#define SM_AUTH_STATE_BONDING 0x01 //! Bonding requested + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[KEYLEN]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[KEYLEN]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[KEYLEN]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[B_RANDOM_NUM_SIZE]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[KEYLEN]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[B_ADDR_LEN]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[KEYLEN]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* SM_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_assert.c b/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_assert.c new file mode 100644 index 0000000..4aace00 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_assert.c @@ -0,0 +1,308 @@ +/************************************************************************************************** + Filename: hal_assert.c + Revised: $Date: 2010-11-22 08:13:43 -0800 (Mon, 22 Nov 2010) $ + Revision: $Revision: 24480 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_types.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) || (defined HAL_MCU_CC2530) || \ + (defined HAL_MCU_CC2533) || (defined HAL_MCU_MSP430) + /* for access to debug data */ +#include "mac_rx.h" +#include "mac_tx.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Local Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHazardLights(void); + + +/************************************************************************************************** + * @fn halAssertHandler + * + * @brief Logic to handle an assert. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHandler(void) +{ + /* execute code that handles asserts */ +#ifdef ASSERT_RESET + HAL_SYSTEM_RESET(); +#elif !defined ASSERT_WHILE + halAssertHazardLights(); +#else + while(1); +#endif +} + +#if !defined ASSERT_WHILE +/************************************************************************************************** + * @fn halAssertHazardLights + * + * @brief Blink LEDs to indicate an error. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHazardLights(void) +{ + enum + { + DEBUG_DATA_RSTACK_HIGH_OFS, + DEBUG_DATA_RSTACK_LOW_OFS, + DEBUG_DATA_TX_ACTIVE_OFS, + DEBUG_DATA_RX_ACTIVE_OFS, + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) + DEBUG_DATA_INT_MASK_OFS, +#elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) + DEBUG_DATA_INT_MASK0_OFS, + DEBUG_DATA_INT_MASK1_OFS, +#endif + + DEBUG_DATA_SIZE + }; + + uint8 buttonHeld; + uint8 debugData[DEBUG_DATA_SIZE]; + + /* disable all interrupts before anything else */ + HAL_DISABLE_INTERRUPTS(); + + /*------------------------------------------------------------------------------- + * Initialize LEDs and turn them off. + */ + HAL_BOARD_INIT(); + + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /*------------------------------------------------------------------------------- + * Master infinite loop. + */ + for (;;) + { + buttonHeld = 0; + + /*------------------------------------------------------------------------------- + * "Hazard lights" loop. A held keypress will exit this loop. + */ + do + { + HAL_LED_BLINK_DELAY(); + + /* toggle LEDS, the #ifdefs are in case HAL has logically remapped non-existent LEDs */ +#if (HAL_NUM_LEDS >= 1) + HAL_TOGGLE_LED1(); +#if (HAL_NUM_LEDS >= 2) + HAL_TOGGLE_LED2(); +#if (HAL_NUM_LEDS >= 3) + HAL_TOGGLE_LED3(); +#if (HAL_NUM_LEDS >= 4) + HAL_TOGGLE_LED4(); +#endif +#endif +#endif +#endif + + /* escape hatch to continue execution, set escape to '1' to continue execution */ + { + static uint8 escape = 0; + if (escape) + { + escape = 0; + return; + } + } + + /* break out of loop if button is held long enough */ + if (HAL_PUSH_BUTTON1()) + { + buttonHeld++; + } + else + { + buttonHeld = 0; + } + } + while (buttonHeld != 10); /* loop until button is held specified number of loops */ + + /*------------------------------------------------------------------------------- + * Just exited from "hazard lights" loop. + */ + + /* turn off all LEDs */ + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /* wait for button release */ + HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); + + /*------------------------------------------------------------------------------- + * Load debug data into memory. + */ +#ifdef HAL_MCU_AVR + { + uint8 * pStack; + pStack = (uint8 *) SP; + pStack++; /* point to return address on stack */ + debugData[DEBUG_DATA_RSTACK_HIGH_OFS] = *pStack; + pStack++; + debugData[DEBUG_DATA_RSTACK_LOW_OFS] = *pStack; + } + debugData[DEBUG_DATA_INT_MASK_OFS] = EIMSK; +#endif + +#if (defined HAL_MCU_CC2430) + debugData[DEBUG_DATA_INT_MASK_OFS] = RFIM; +#elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) + debugData[DEBUG_DATA_INT_MASK0_OFS] = RFIRQM0; + debugData[DEBUG_DATA_INT_MASK1_OFS] = RFIRQM1; +#endif + + +#if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) || (defined HAL_MCU_CC2530) || \ + (defined HAL_MCU_CC2533) || (defined HAL_MCU_MSP430) + debugData[DEBUG_DATA_TX_ACTIVE_OFS] = macTxActive; + debugData[DEBUG_DATA_RX_ACTIVE_OFS] = macRxActive; +#endif + + /* initialize for data dump loop */ + { + uint8 iBit; + uint8 iByte; + + iBit = 0; + iByte = 0; + + /*------------------------------------------------------------------------------- + * Data dump loop. A button press cycles data bits to an LED. + */ + while (iByte < DEBUG_DATA_SIZE) + { + /* wait for key press */ + while(!HAL_PUSH_BUTTON1()); + + /* turn on all LEDs for first bit of byte, turn on three LEDs if not first bit */ + HAL_TURN_ON_LED1(); + HAL_TURN_ON_LED2(); + HAL_TURN_ON_LED3(); + if (iBit == 0) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + + /* wait for debounced key release */ + HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); + + /* turn off all LEDs */ + HAL_TURN_OFF_LED1(); + HAL_TURN_OFF_LED2(); + HAL_TURN_OFF_LED3(); + HAL_TURN_OFF_LED4(); + + /* output value of data bit to LED1 */ + if (debugData[iByte] & (1 << (7 - iBit))) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + + /* advance to next bit */ + iBit++; + if (iBit == 8) + { + iBit = 0; + iByte++; + } + } + } + + /* + * About to enter "hazard lights" loop again. Turn off LED1 in case the last bit + * displayed happened to be one. This guarantees all LEDs are off at the start of + * the flashing loop which uses a toggle operation to change LED states. + */ + HAL_TURN_OFF_LED1(); + } +} +#endif + +/* ------------------------------------------------------------------------------------------------ + * Compile Time Assertions + * ------------------------------------------------------------------------------------------------ + */ + +/* integrity check of type sizes */ +HAL_ASSERT_SIZE( int8, 1); +HAL_ASSERT_SIZE( uint8, 1); +HAL_ASSERT_SIZE( int16, 2); +HAL_ASSERT_SIZE(uint16, 2); +HAL_ASSERT_SIZE( int32, 4); +HAL_ASSERT_SIZE(uint32, 4); + + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_drivers.c b/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_drivers.c new file mode 100644 index 0000000..458be77 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/common/hal_drivers.c @@ -0,0 +1,283 @@ +/************************************************************************************************** + Filename: hal_drivers.c + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Drivers Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#if (defined HAL_AES) && (HAL_AES == TRUE) +#include "hal_aes.h" +#endif +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) +#include "hal_buzzer.h" +#endif +#if (defined HAL_DMA) && (HAL_DMA == TRUE) +#include "hal_dma.h" +#endif +#include "hal_drivers.h" +#include "hal_key.h" +#include "hal_lcd.h" +#include "hal_led.h" +#include "hal_sleep.h" +#include "hal_timer.h" +#include "hal_types.h" +#include "hal_uart.h" +#ifdef CC2591_COMPRESSION_WORKAROUND +#include "mac_rx.h" +#endif +#include "OSAL.h" +#if defined POWER_SAVING +#include "OSAL_PwrMgr.h" +#endif +#if (defined HAL_HID) && (HAL_HID == TRUE) +#include "usb_hid.h" +#endif + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +uint8 Hal_TaskID; + +extern void HalLedUpdate( void ); /* Notes: This for internal only so it shouldn't be in hal_led.h */ + +/************************************************************************************************** + * @fn Hal_Init + * + * @brief Hal Initialization function. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_Init( uint8 task_id ) +{ + /* Register task ID */ + Hal_TaskID = task_id; + +#ifdef CC2591_COMPRESSION_WORKAROUND + osal_start_reload_timer( Hal_TaskID, PERIOD_RSSI_RESET_EVT, PERIOD_RSSI_RESET_TIMEOUT ); +#endif +} + +/************************************************************************************************** + * @fn Hal_DriverInit + * + * @brief Initialize HW - These need to be initialized before anyone. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void HalDriverInit (void) +{ + /* TIMER */ +#if (defined HAL_TIMER) && (HAL_TIMER == TRUE) +#endif + + /* ADC */ +#if (defined HAL_ADC) && (HAL_ADC == TRUE) + HalAdcInit(); +#endif + + /* DMA */ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + // Must be called before the init call to any module that uses DMA. + HalDmaInit(); +#endif + + /* AES */ +#if (defined HAL_AES) && (HAL_AES == TRUE) + HalAesInit(); +#endif + + /* LCD */ +#if (defined HAL_LCD) && (HAL_LCD == TRUE) + HalLcdInit(); +#endif + + /* LED */ +#if (defined HAL_LED) && (HAL_LED == TRUE) + HalLedInit(); +#endif + + /* UART */ +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTInit(); +#endif + + /* KEY */ +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + HalKeyInit(); +#endif + + /* HID */ +#if (defined HAL_HID) && (HAL_HID == TRUE) + usbHidInit(); +#endif +} + +/************************************************************************************************** + * @fn Hal_ProcessEvent + * + * @brief Hal Process Event + * + * @param task_id - Hal TaskId + * events - events + * + * @return None + **************************************************************************************************/ +uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) +{ + uint8 *msgPtr; + + (void)task_id; // Intentionally unreferenced parameter + + if ( events & SYS_EVENT_MSG ) + { + msgPtr = osal_msg_receive(Hal_TaskID); + + while (msgPtr) + { + /* Do something here - for now, just deallocate the msg and move on */ + + /* De-allocate */ + osal_msg_deallocate( msgPtr ); + /* Next */ + msgPtr = osal_msg_receive( Hal_TaskID ); + } + return events ^ SYS_EVENT_MSG; + } + +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) + if (events & HAL_BUZZER_EVENT) + { + HalBuzzerStop(); + return events ^ HAL_BUZZER_EVENT; + } +#endif + +#ifdef CC2591_COMPRESSION_WORKAROUND + if ( events & PERIOD_RSSI_RESET_EVT ) + { + macRxResetRssi(); + return (events ^ PERIOD_RSSI_RESET_EVT); + } +#endif + + if ( events & HAL_LED_BLINK_EVENT ) + { +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + HalLedUpdate(); +#endif /* BLINK_LEDS && HAL_LED */ + return events ^ HAL_LED_BLINK_EVENT; + } + + if (events & HAL_KEY_EVENT) + { +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + /* Check for keys */ + HalKeyPoll(); + + /* if interrupt disabled, do next polling */ + if (!Hal_KeyIntEnable) + { + osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); + } +#endif + return events ^ HAL_KEY_EVENT; + } + +#if defined POWER_SAVING + if ( events & HAL_SLEEP_TIMER_EVENT ) + { + halRestoreSleepLevel(); + return events ^ HAL_SLEEP_TIMER_EVENT; + } + + if ( events & HAL_PWRMGR_HOLD_EVENT ) + { + (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_HOLD); + + (void)osal_stop_timerEx(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + (void)osal_clear_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + + return (events & ~(HAL_PWRMGR_HOLD_EVENT | HAL_PWRMGR_CONSERVE_EVENT)); + } + + if ( events & HAL_PWRMGR_CONSERVE_EVENT ) + { + (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_CONSERVE); + return events ^ HAL_PWRMGR_CONSERVE_EVENT; + } +#endif + + return 0; +} + +/************************************************************************************************** + * @fn Hal_ProcessPoll + * + * @brief This routine will be called by OSAL to poll UART, TIMER... + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_ProcessPoll () +{ + /* UART Poll */ +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTPoll(); +#endif + + /* HID poll */ +#if (defined HAL_HID) && (HAL_HID == TRUE) + usbHidProcessEvents(); +#endif + +#if defined( POWER_SAVING ) + /* Allow sleep before the next OSAL event loop */ + ALLOW_SLEEP_MODE(); +#endif +} + +/************************************************************************************************** +**************************************************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_adc.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_adc.h new file mode 100644 index 0000000..2ddd743 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_adc.h @@ -0,0 +1,144 @@ +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_ADC_H +#define HAL_ADC_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_types.h" +#include "hal_board.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ +#define HAL_ADC_RESOLUTION_8 0x01 +#define HAL_ADC_RESOLUTION_10 0x02 +#define HAL_ADC_RESOLUTION_12 0x03 +#define HAL_ADC_RESOLUTION_14 0x04 + +/* Channels */ +#define HAL_ADC_CHANNEL_0 0x00 +#define HAL_ADC_CHANNEL_1 0x01 +#define HAL_ADC_CHANNEL_2 0x02 +#define HAL_ADC_CHANNEL_3 0x03 +#define HAL_ADC_CHANNEL_4 0x04 +#define HAL_ADC_CHANNEL_5 0x05 +#define HAL_ADC_CHANNEL_6 0x06 +#define HAL_ADC_CHANNEL_7 0x07 + +#define HAL_ADC_CHN_AIN0 0x00 /* AIN0 */ +#define HAL_ADC_CHN_AIN1 0x01 /* AIN1 */ +#define HAL_ADC_CHN_AIN2 0x02 /* AIN2 */ +#define HAL_ADC_CHN_AIN3 0x03 /* AIN3 */ +#define HAL_ADC_CHN_AIN4 0x04 /* AIN4 */ +#define HAL_ADC_CHN_AIN5 0x05 /* AIN5 */ +#define HAL_ADC_CHN_AIN6 0x06 /* AIN6 */ +#define HAL_ADC_CHN_AIN7 0x07 /* AIN7 */ +#define HAL_ADC_CHN_A0A1 0x08 /* AIN0,AIN1 */ +#define HAL_ADC_CHN_A2A3 0x09 /* AIN2,AIN3 */ +#define HAL_ADC_CHN_A4A5 0x0a /* AIN4,AIN5 */ +#define HAL_ADC_CHN_A6A7 0x0b /* AIN6,AIN7 */ +#define HAL_ADC_CHN_GND 0x0c /* GND */ +#define HAL_ADC_CHN_VREF 0x0d /* Positive voltage reference */ +#define HAL_ADC_CHN_TEMP 0x0e /* Temperature sensor */ +#define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */ +#define HAL_ADC_CHN_BITS 0x0f /* Bits [3:0] */ + +#define HAL_ADC_CHANNEL_TEMP HAL_ADC_CHN_TEMP +#define HAL_ADC_CHANNEL_VDD HAL_ADC_CHN_VDD3 /* channel VDD divided by 3 */ + +/* Vdd Limits */ +#define HAL_ADC_VDD_LIMIT_0 0x00 +#define HAL_ADC_VDD_LIMIT_1 0x01 +#define HAL_ADC_VDD_LIMIT_2 0x02 +#define HAL_ADC_VDD_LIMIT_3 0x03 +#define HAL_ADC_VDD_LIMIT_4 0x04 +#define HAL_ADC_VDD_LIMIT_5 0x05 +#define HAL_ADC_VDD_LIMIT_6 0x06 +#define HAL_ADC_VDD_LIMIT_7 0x07 + +/* Reference Voltages */ +#define HAL_ADC_REF_125V 0x00 /* Internal Reference (1.25V-CC2430)(1.15V-CC2530) */ +#define HAL_ADC_REF_AIN7 0x40 /* AIN7 Reference */ +#define HAL_ADC_REF_AVDD 0x80 /* AVDD_SOC Pin Reference */ +#define HAL_ADC_REF_DIFF 0xc0 /* AIN7,AIN6 Differential Reference */ +#define HAL_ADC_REF_BITS 0xc0 /* Bits [7:6] */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_assert.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_assert.h new file mode 100644 index 0000000..ddfb126 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_assert.h @@ -0,0 +1,110 @@ +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_ASSERT_H +#define HAL_ASSERT_H + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#ifdef HALNODEBUG +#define HAL_ASSERT(expr) +#define HAL_ASSERT_FORCED() +#define HAL_ASSERT_STATEMENT(statement) +#define HAL_ASSERT_DECLARATION(declaration) +#else +#define HAL_ASSERT(expr) st( if (!( expr )) halAssertHandler(); ) +#define HAL_ASSERT_FORCED() halAssertHandler() +#define HAL_ASSERT_STATEMENT(statement) st( statement ) +#define HAL_ASSERT_DECLARATION(declaration) declaration +#endif + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ +#define HAL_ASSERT_SIZE(x,y) typedef char x ## _assert_size_t[-1+10*(sizeof(x) == (y))] + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_board.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_board.h new file mode 100644 index 0000000..506e100 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_board.h @@ -0,0 +1 @@ +#include "hal_board_cfg.h" diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_defs.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_defs.h new file mode 100644 index 0000000..6a3119d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_defs.h @@ -0,0 +1,130 @@ +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DEFS_H +#define HAL_DEFS_H + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#ifndef BV +#define BV(n) (1 << (n)) +#endif + +#ifndef BF +#define BF(x,b,s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ +#define BREAK_UINT32( var, ByteNum ) \ + (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF)) + +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \ + ((uint32)((uint32)((Byte0) & 0x00FF) \ + + ((uint32)((Byte1) & 0x00FF) << 8) \ + + ((uint32)((Byte2) & 0x00FF) << 16) \ + + ((uint32)((Byte3) & 0x00FF) << 24))) + +#define BUILD_UINT16(loByte, hiByte) \ + ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +#define HI_UINT16(a) (((a) >> 8) & 0xFF) +#define LO_UINT16(a) ((a) & 0xFF) + +#define BUILD_UINT8(hiByte, loByte) \ + ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4))) + +#define HI_UINT8(a) (((a) >> 4) & 0x0F) +#define LO_UINT8(a) ((a) & 0x0F) + +#ifndef GET_BIT +#define GET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] & BV((IDX) % 8)) ? TRUE : FALSE) +#endif +#ifndef SET_BIT +#define SET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] |= BV((IDX) % 8))) +#endif +#ifndef CLR_BIT +#define CLR_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] &= (BV((IDX) % 8) ^ 0xFF))) +#endif + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ +#define st(x) do { x } while (__LINE__ == -1) + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_drivers.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_drivers.h new file mode 100644 index 0000000..847a12d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_drivers.h @@ -0,0 +1,105 @@ +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_DRIVER_H +#define HAL_DRIVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +#define HAL_BUZZER_EVENT 0x0080 +#define PERIOD_RSSI_RESET_EVT 0x0040 +#define HAL_LED_BLINK_EVENT 0x0020 +#define HAL_KEY_EVENT 0x0010 + +#if defined POWER_SAVING +#define HAL_SLEEP_TIMER_EVENT 0x0004 +#define HAL_PWRMGR_HOLD_EVENT 0x0002 +#define HAL_PWRMGR_CONSERVE_EVENT 0x0001 +#endif + +#define HAL_PWRMGR_CONSERVE_DELAY 10 +#define PERIOD_RSSI_RESET_TIMEOUT 10 + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + +#ifdef __cplusplus +} +#endif + +#endif + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_flash.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_flash.h new file mode 100644 index 0000000..f08c739 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_flash.h @@ -0,0 +1,122 @@ +/************************************************************************************************** + Filename: hal_flash.h + Revised: $Date:$ + Revision: $Revision:$ + + Description: This file contains the interface to the Flash Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_FLASH_H +#define HAL_FLASH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128). + * @param offset - Valid offset into the page (so < HAL_NV_PAGE_SIZE and byte-aligned is ok). + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to read: a read cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to write: a write cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases 'cnt' pages of the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128) to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg); + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_key.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_key.h new file mode 100644 index 0000000..6ba1b61 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_key.h @@ -0,0 +1,152 @@ +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_KEY_H +#define HAL_KEY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ +#define HAL_KEY_INTERRUPT_DISABLE 0x00 +#define HAL_KEY_INTERRUPT_ENABLE 0x01 + +/* Key state - shift or nornal */ +#define HAL_KEY_STATE_NORMAL 0x00 +#define HAL_KEY_STATE_SHIFT 0x01 + +#define HAL_KEY_SW_1 0x01 // Joystick up +#define HAL_KEY_SW_2 0x02 // Joystick right +#define HAL_KEY_SW_5 0x04 // Joystick center +#define HAL_KEY_SW_4 0x08 // Joystick left +#define HAL_KEY_SW_3 0x10 // Joystick down + +#define HAL_KEY_SW_6 0x20 // Button S1 if available +#define HAL_KEY_SW_7 0x40 // Button S2 if available + +/* Joystick */ +#define HAL_KEY_UP 0x01 // Joystick up +#define HAL_KEY_RIGHT 0x02 // Joystick right +#define HAL_KEY_CENTER 0x04 // Joystick center +#define HAL_KEY_LEFT 0x08 // Joystick left +#define HAL_KEY_DOWN 0x10 // Joystick down + +/* Buttons */ +#define HAL_PUSH_BUTTON_RIGHT 0x01 // Button right +#define HAL_PUSH_BUTTON_LEFT 0x02 // Button left +#define HAL_PUSH_BUTTON_SELECT 0x04 // Button select +#define HAL_KEY_BUTTON_UP 0x40 // Button up +#define HAL_KEY_BUTTON_DOWN 0x80 // Button down + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_lcd.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_lcd.h new file mode 100644 index 0000000..af3b8b2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_lcd.h @@ -0,0 +1,135 @@ +/************************************************************************************************** + Filename: hal_lcd.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LCD Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_LCD_H +#define HAL_LCD_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" +#if (defined HAL_LCD) && (HAL_LCD == TRUE) +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* These are used to specify which line the text will be printed */ +#define HAL_LCD_LINE_1 0x01 +#define HAL_LCD_LINE_2 0x02 +/* + This to support LCD with extended number of lines (more than 2). + Don't use these if LCD doesn't support more than 2 lines +*/ +#define HAL_LCD_LINE_3 0x03 +#define HAL_LCD_LINE_4 0x04 +#define HAL_LCD_LINE_5 0x05 +#define HAL_LCD_LINE_6 0x06 +#define HAL_LCD_LINE_7 0x07 +#define HAL_LCD_LINE_8 0x08 + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize LCD Service + */ +extern void HalLcdInit(void); + +/* + * Write a string to the LCD + */ +extern void HalLcdWriteString ( char *str, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteScreen( char *line1, char *line2 ); + +/* + * Write a string followed by a value to the LCD + */ +extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ); + +/* + * Write a string followed by 2 values to the LCD + */ +extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line ); + +/* + * Write a percentage bar to the LCD + */ +extern void HalLcdDisplayPercentBar( char *title, uint8 value ); + + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_led.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_led.h new file mode 100644 index 0000000..bb327f1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_led.h @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_LED_H +#define HAL_LED_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_board.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ +#define HAL_LED_1 0x01 +#define HAL_LED_2 0x02 +#define HAL_LED_3 0x04 +#define HAL_LED_4 0x08 +#define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4) + +/* Modes */ +#define HAL_LED_MODE_OFF 0x00 +#define HAL_LED_MODE_ON 0x01 +#define HAL_LED_MODE_BLINK 0x02 +#define HAL_LED_MODE_FLASH 0x04 +#define HAL_LED_MODE_TOGGLE 0x08 + +/* Defaults */ +#define HAL_LED_DEFAULT_MAX_LEDS 4 +#define HAL_LED_DEFAULT_DUTY_CYCLE 5 +#define HAL_LED_DEFAULT_FLASH_COUNT 50 +#define HAL_LED_DEFAULT_FLASH_TIME 1000 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_rpc.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_rpc.h new file mode 100644 index 0000000..cf8118e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_rpc.h @@ -0,0 +1,136 @@ +/************************************************************************************************** + Filename: hal_rpc.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains information required by services that + use the Remote Procedure Call (RPC) standard. + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_RPC_H +#define HAL_RPC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Common +/////////////////////////////////////////////////////////////////////////////////////////////////// + +// RPC Command Field Type +#define RPC_CMD_POLL 0x00 +#define RPC_CMD_SREQ 0x20 +#define RPC_CMD_AREQ 0x40 +#define RPC_CMD_SRSP 0x60 +#define RPC_CMD_RES4 0x80 +#define RPC_CMD_RES5 0xA0 +#define RPC_CMD_RES6 0xC0 +#define RPC_CMD_RES7 0xE0 + +// RPC Command Field Subsystem +#define RPC_SYS_RES0 0 +#define RPC_SYS_SYS 1 +#define RPC_SYS_MAC 2 +#define RPC_SYS_NWK 3 +#define RPC_SYS_AF 4 +#define RPC_SYS_ZDO 5 +#define RPC_SYS_SAPI 6 // Simple API +#define RPC_SYS_UTIL 7 +#define RPC_SYS_DBG 8 +#define RPC_SYS_APP 9 +#define RPC_SYS_RCAF 10 // Remote Control Application Framework +#define RPC_SYS_RCN 11 // Remote Control Network Layer +#define RPC_SYS_RCN_CLIENT 12 // Remote Control Network Layer Client +#define RPC_SYS_BOOT 13 // Serial Bootloader +#define RPC_SYS_MAX 14 // Maximum value, must be last + +/* 1st byte is the length of the data field, 2nd/3rd bytes are command field. */ +#define RPC_FRAME_HDR_SZ 3 + +/* The 3 MSB's of the 1st command field byte are for command type. */ +#define RPC_CMD_TYPE_MASK 0xE0 + +/* The 5 LSB's of the 1st command field byte are for the subsystem. */ +#define RPC_SUBSYSTEM_MASK 0x1F + +/* position of fields in the general format frame */ +#define RPC_POS_LEN 0 +#define RPC_POS_CMD0 1 +#define RPC_POS_CMD1 2 +#define RPC_POS_DAT0 3 + +/* Error codes */ +#define RPC_SUCCESS 0 /* success */ +#define RPC_ERR_SUBSYSTEM 1 /* invalid subsystem */ +#define RPC_ERR_COMMAND_ID 2 /* invalid command ID */ +#define RPC_ERR_PARAMETER 3 /* invalid parameter */ +#define RPC_ERR_LENGTH 4 /* invalid length */ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UART Specific +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#define RPC_UART_FRAME_OVHD 2 + +// Start of frame character value +#define RPC_UART_SOF 0xFE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// SPI Specific +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif /* HAL_RPC_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_sleep.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_sleep.h new file mode 100644 index 0000000..837c42c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_sleep.h @@ -0,0 +1,84 @@ +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_SLEEP_H +#define HAL_SLEEP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_timer.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_timer.h new file mode 100644 index 0000000..517b1e6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_timer.h @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_timer.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_TIMER_H +#define HAL_TIMER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_board.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + + + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ +/* Timer ID definitions */ +#define HAL_TIMER_0 0x00 // 8bit timer +#define HAL_TIMER_1 0x01 // 16bit Mac timer +#define HAL_TIMER_2 0x02 // 8bit timer +#define HAL_TIMER_3 0x03 // 16bit timer +#define HAL_TIMER_MAX 4 // Max number of timer + +/* Operation Modes for timer */ +#define HAL_TIMER_MODE_NORMAL 0x01 // Normal Mode +#define HAL_TIMER_MODE_CTC 0x02 // Clear Timer On Compare +#define HAL_TIMER_MODE_MASK (HAL_TIMER_MODE_NORMAL | HAL_TIMER_MODE_CTC) + +/* Timer1 channels */ +#define HAL_T1_CH0 0 +#define HAL_T1_CH1 1 +#define HAL_T1_CH2 2 +#define HAL_T1_CH3 3 +#define HAL_T1_CH4 4 + +/* Channel definitions */ +#define HAL_TIMER_CHANNEL_SINGLE 0x01 // Single Channel - default +#define HAL_TIMER_CHANNEL_A 0x02 // Channel A +#define HAL_TIMER_CHANNEL_B 0x04 // Channel B +#define HAL_TIMER_CHANNEL_C 0x08 // Channel C +#define HAL_TIMER_CHANNEL_D 0x10 // Channel D +#define HAL_TIMER_CHANNEL_E 0x20 // Channel E +#define HAL_TIMER_CHANNEL_MASK (HAL_TIMER_CHANNEL_SINGLE | \ + HAL_TIMER_CHANNEL_A | \ + HAL_TIMER_CHANNEL_B | \ + HAL_TIMER_CHANNEL_C | \ + HAL_TIMER_CHANNEL_D | \ + HAL_TIMER_CHANNEL_E) +#define HAL_TIMER_CH_MAX 0x06 + +/* Timer 1 Channel 0 Channel compare mode definitions */ +#define HAL_TIMER1_CH0_CMP_MODE_SET_ON_COMP 0x00 // 000: Set output on compare +#define HAL_TIMER1_CH0_CMP_MODE_CLR_ON_COMP 0x01 // 001: Clear output on compare +#define HAL_TIMER1_CH0_CMP_MODE_TOG_ON_COMP 0x02 // 010: Toggle output on compare +#define HAL_TIMER1_CH0_CMP_MODE_SET_ON_COMP_CLR_ON_0 0x03 // 011: Set output on compare-up, clear on 0 +#define HAL_TIMER1_CH0_CMP_MODE_CLR_ON_COMP_SET_ON_0 0x04 // 100: Clear output on compare-up, set on 0 +#define HAL_TIMER1_CH0_CMP_MODE_INIT 0x07 // 111: Initialize output pin. CMP[2:0] is not changed + +/* Timer 1 Channel 1-5 channel compare mode definitions */ +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_COMP 0x00 // 000: Set output on compare +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_COMP 0x01 // 001: Clear output on compare +#define HAL_TIMER1_CHn_CMP_MODE_TOG_ON_COMP 0x02 // 010: Toggle output on compare +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_COMP_CLR_ON_0 0x03 // 011: Set output on compare-up, clear on compare down in up-down mode. Otherwise set output on + // compare, clear on 0. +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_COMP_SET_ON_0 0x04 // 100: Clear output on compare-up, set on compare down in up-down mode. Otherwise clear output + // on compare, set on 0 +#define HAL_TIMER1_CHn_CMP_MODE_CLR_ON_CH0_SET_ON_CHn 0x05 // 101: Clear when equal T1CC0, set when equal T1CC2 +#define HAL_TIMER1_CHn_CMP_MODE_SET_ON_CH0_CLR_ON_CHn 0x06 // 110: Set when equal T1CC0, clear when equal T1CC2 +#define HAL_TIMER1_CHn_CMP_MODE_INIT 0x07 // 111: Initialize output pin. CMP[2:0] is not changed. +#define HAL_TIMER1_CH_CMP_MODE_BITS 0x38 // bits 5:3 + +/* Timer 1 Capture mode */ +#define HAL_TIMER1_CH_CAP_MODE_NO 0x00 // 00: No capture +#define HAL_TIMER1_CH_CAP_MODE_RISING 0x01 // 01: Capture on rising edge +#define HAL_TIMER1_CH_CAP_MODE_FALLING 0x02 // 10: Capture on falling edge +#define HAL_TIMER1_CH_CAP_MODE_ALL 0x03 // 11: Capture on all edges +#define HAL_TIMER1_CH_CAP_BITS 0x03 // bits 1:0 + +/* Channel mode definitions */ +#define HAL_TIMER_CH_MODE_INPUT_CAPTURE 0x01 // Channel Mode Input-Capture +#define HAL_TIMER_CH_MODE_OUTPUT_COMPARE 0x02 // Channel Mode Output_Compare +#define HAL_TIMER_CH_MODE_OVERFLOW 0x04 // Channel Mode Overflow +#define HAL_TIMER_CH_MODE_MASK (HAL_TIMER_CH_MODE_INPUT_CAPTURE | \ + HAL_TIMER_CH_MODE_OUTPUT_COMPARE | \ + HAL_TIMER_CH_MODE_OVERFLOW) + +/* Error Code */ +#define HAL_TIMER_OK 0x00 +#define HAL_TIMER_NOT_OK 0x01 +#define HAL_TIMER_PARAMS_ERROR 0x02 +#define HAL_TIMER_NOT_CONFIGURED 0x03 +#define HAL_TIMER_INVALID_ID 0x04 +#define HAL_TIMER_INVALID_CH_MODE 0x05 +#define HAL_TIMER_INVALID_OP_MODE 0x06 + +/* Timer clock pre-scaler definitions for 16bit timer1 and timer3 */ +#define HAL_TIMER3_16_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER3_16_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER3_16_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER3_16_TC_DIV64 0x03 // Clock pre-scaled by 64 +#define HAL_TIMER3_16_TC_DIV256 0x04 // Clock pre-scaled by 256 +#define HAL_TIMER3_16_TC_DIV1024 0x05 // Clock pre-scaled by 1024 +#define HAL_TIMER3_16_TC_EXTFE 0x06 // External clock (T2), falling edge +#define HAL_TIMER3_16_TC_EXTRE 0x07 // External clock (T2), rising edge + +/* Timer clock pre-scaler definitions for 8bit timer0 and timer2 */ +#define HAL_TIMER0_8_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER0_8_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER0_8_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER0_8_TC_DIV32 0x03 // Clock pre-scaled by 32 +#define HAL_TIMER0_8_TC_DIV64 0x04 // Clock pre-scaled by 64 +#define HAL_TIMER0_8_TC_DIV128 0x05 // Clock pre-scaled by 128 +#define HAL_TIMER0_8_TC_DIV256 0x06 // Clock pre-scaled by 256 +#define HAL_TIMER0_8_TC_DIV1024 0x07 // Clock pre-scaled by 1024 + +/* Timer clock pre-scaler definitions for 8bit timer2 */ +#define HAL_TIMER2_8_TC_STOP 0x00 // No clock, timer stopped +#define HAL_TIMER2_8_TC_DIV1 0x01 // No clock pre-scaling +#define HAL_TIMER2_8_TC_DIV8 0x02 // Clock pre-scaled by 8 +#define HAL_TIMER2_8_TC_DIV64 0x03 // Clock pre-scaled by 32 +#define HAL_TIMER2_8_TC_DIV256 0x04 // Clock pre-scaled by 64 +#define HAL_TIMER2_8_TC_DIV1024 0x05 // Clock pre-scaled by 128 +#define HAL_TIMER2_8_TC_EXTFE 0x06 // External clock (T2), falling edge +#define HAL_TIMER2_8_TC_EXTRE 0x07 // External clock (T2), rising edge + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +typedef void (*halTimerCBack_t) (uint8 timerId, uint8 channel, uint8 channelMode); + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/* + * Initialize Timer Service + */ +extern void HalTimerInit ( void ); + +/* + * Configure channel in different modes + */ +extern uint8 HalTimerConfig ( uint8 timerId, + uint8 opMode, + uint8 channel, + uint8 channelMode, + bool intEnable, + halTimerCBack_t cback ); + +/* + * Start a Timer + */ +extern uint8 HalTimerStart ( uint8 timerId, uint32 timePerTick ); + +/* + * Stop a Timer + */ +extern uint8 HalTimerStop ( uint8 timerId ); + + +/* + * This is used for polling, provide the tick increment + */ +extern void HalTimerTick ( void ); + +/* + * Enable and disable particular timer + */ +extern uint8 HalTimerInterruptEnable (uint8 timerId, uint8 channelMode, bool enable); + +/* + * Configures timer 1 to control 4 PWM outputs + */ +void HalTimer1Init (halTimerCBack_t cBack); + + +/* + * Set dutycycle on timer 1 PWM output channel + */ +void halTimer1SetChannelDuty (uint8 channel, uint16 promill); + +/*************************************************************************************************** +***************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_uart.h b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_uart.h new file mode 100644 index 0000000..48e180b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/include/hal_uart.h @@ -0,0 +1,241 @@ +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_UART_H +#define HAL_UART_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_board.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#define HAL_UART_BR_2400 0x05 +#define HAL_UART_BR_4800 0x06 +#define HAL_UART_BR_9600 0x00 +#define HAL_UART_BR_14400 0x07 +#define HAL_UART_BR_19200 0x01 +#define HAL_UART_BR_28800 0x08 +#define HAL_UART_BR_38400 0x02 +#define HAL_UART_BR_57600 0x03 +#define HAL_UART_BR_76800 0x09 +#define HAL_UART_BR_115200 0x04 +#define HAL_UART_BR_230400 0x0A + +/* Frame Format constant */ + +/* Stop Bits */ +#define HAL_UART_ONE_STOP_BIT 0x00 +#define HAL_UART_TWO_STOP_BITS 0x01 + +/* Parity settings */ +#define HAL_UART_NO_PARITY 0x00 +#define HAL_UART_EVEN_PARITY 0x01 +#define HAL_UART_ODD_PARITY 0x02 + +/* Character Size */ +#define HAL_UART_8_BITS_PER_CHAR 0x00 +#define HAL_UART_9_BITS_PER_CHAR 0x01 + +/* Flow control */ +#define HAL_UART_FLOW_OFF 0x00 +#define HAL_UART_FLOW_ON 0x01 + +/* Ports */ +#define HAL_UART_PORT_0 0x00 +#define HAL_UART_PORT_1 0x01 +#define HAL_UART_PORT_MAX 0x02 + +/* UART Status */ +#define HAL_UART_SUCCESS 0x00 +#define HAL_UART_UNCONFIGURED 0x01 +#define HAL_UART_NOT_SUPPORTED 0x02 +#define HAL_UART_MEM_FAIL 0x03 +#define HAL_UART_BAUDRATE_ERROR 0x04 + +/* UART Events */ +#define HAL_UART_RX_FULL 0x01 +#define HAL_UART_RX_ABOUT_FULL 0x02 +#define HAL_UART_RX_TIMEOUT 0x04 +#define HAL_UART_TX_FULL 0x08 +#define HAL_UART_TX_EMPTY 0x10 + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_dma.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_dma.c new file mode 100644 index 0000000..c0fc49e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_dma.c @@ -0,0 +1,1118 @@ +/************************************************************************************************** + Filename: _hal_uart_dma.c + Revised: $Date: 2012-12-12 13:58:27 -0800 (Wed, 12 Dec 2012) $ + Revision: $Revision: 32579 $ + + Description: This file contains the interface to the H/W UART driver by DMA. + + A known defect is that when flow control is enabled, the function HalUARTPollTxTrigDMA() can + prematurely invoke HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX) and clobber that last byte of one txBuf[] + block transfer with the first byte of the next txBuf[] block transfer. Additionally, Tx can + become permanently stalled during heavy use and/or simultaeous heavy radio traffic when using + DMA for the Tx and hardware flow control. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +// UxUCR - USART UART Generic Control +#define GCR_ORDER 0x20 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef UTXxIE +#undef UTXxIF +#if (HAL_UART_DMA == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF +#elif (HAL_UART_DMA == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_SEL +#if (HAL_UART_DMA == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0x0C // Peripheral I/O Select for Rx/Tx. +#elif (HAL_UART_DMA == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0xC0 // Peripheral I/O Select for Rx/Tx. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_DMA == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_DMA == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxDIR +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_DMA == 1) +#define PxDIR P0DIR +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#define DMA_RDYIn P0_4 +#define DMA_RDYOut P0_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_DMA == 2) +#define PxDIR P1DIR +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define DMA_RDYIn P1_4 +#define DMA_RDYOut P1_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#if !defined( DMA_PM ) +#if defined POWER_SAVING +#define DMA_PM 1 +#else +#define DMA_PM 0 +#endif // POWER_SAVING +#endif // !DMA_PM + +// For known defects described above in the moduel description, prefer to drive the Tx by ISR vice +// DMA unless H/W flow control is not used and full-throughput on Tx is absolutely essential. +#if !defined HAL_UART_TX_BY_ISR +#define HAL_UART_TX_BY_ISR 1 +#endif + +// TRUE or FALSE whether or not to flush the Rx queue when an Rx overrun is detected. +// Note that when HAL_UART_RX_FLUSH is set to TRUE, then uartRxBug and its hunt for where the Rx +// DMA is working is absolutely necessary because the flush can leave the dmaCfg.rxHead stranded. +#if !defined HAL_UART_RX_FLUSH +#define HAL_UART_RX_FLUSH TRUE +#endif + +// Minimum delay before allowing sleep and/or clearing DMA ready-out after a DMA ready-in ISR. +// ST-ticks for 6-msecs plus 1 tick added for when the dmaRdyDly is forced from zero to 0xFF. +// If a greater delay than 6-msec is configured, then the logic should be changed to use a uint16. +//efine DMA_PM_DLY 198 // 32768 * 0.006 + 1 -> 198. +// This delay should be set as short as possible to work with the max expected latency in the sender +// between its asserting ready-out and its checking of the ready-in response. The RBA Master +// logic in the internal uart-to-uart bridge app checks for ready-in immediately, +// so this is just set to zero. +#define DMA_PM_DLY 0 + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_DMA_RX_MAX +#define HAL_UART_DMA_RX_MAX 300 +#endif +#if !defined HAL_UART_DMA_TX_MAX +#define HAL_UART_DMA_TX_MAX 50//HAL_UART_DMA_RX_MAX +#endif +#if !defined HAL_UART_DMA_HIGH +#define HAL_UART_DMA_HIGH (HAL_UART_DMA_RX_MAX - 1) +#endif +#if !defined HAL_UART_DMA_IDLE +#define HAL_UART_DMA_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif +#if !defined HAL_UART_DMA_FULL +#define HAL_UART_DMA_FULL (HAL_UART_DMA_RX_MAX - 16) +#endif + +// ST-ticks for 1 byte @ 38.4-kB plus 1 tick added for when the txTick is forced from zero to 0xFF. +#define HAL_UART_TX_TICK_MIN 11 + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if HAL_UART_DMA_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_DMA_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint16 rxBuf[HAL_UART_DMA_RX_MAX]; + rxIdx_t rxHead; + rxIdx_t rxTail; +#if HAL_UART_DMA_IDLE + uint8 rxTick; +#endif + +#if HAL_UART_TX_BY_ISR + uint8 txBuf[HAL_UART_DMA_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; +#else + uint8 txBuf[2][HAL_UART_DMA_TX_MAX]; + txIdx_t txIdx[2]; + uint8 txMT; // Indication that at least one of two Tx buffers are free. + uint8 txTick; // ST ticks of delay to allow at least one byte-time at a given baud rate. + uint8 txTrig; // Flag indicating that Tx should be manually triggered after txTick expires. + + // Although all of the txVars above are modified by the Tx-done ISR, only this one should need + // the special volatile consideration by the optimizer (critical sections protect the rest). + volatile uint8 txSel; +#endif + + halUARTCBack_t uartCB; +} uartDMACfg_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_UART_DMA_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)])) +#define HAL_UART_DMA_GET_RX_BYTE(IDX) (*(volatile uint8 *)(dmaCfg.rxBuf+(IDX))) +#define HAL_UART_DMA_CLR_RX_BYTE(IDX) (dmaCfg.rxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) + +#define HAL_UART_DMA_CLR_RDY_OUT() (DMA_RDYOut = 1) +#define HAL_UART_DMA_SET_RDY_OUT() (DMA_RDYOut = 0) + +#define HAL_UART_DMA_RDY_IN() (DMA_RDYIn == 0) +#define HAL_UART_DMA_RDY_OUT() (DMA_RDYOut == 0) + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_DECR(IDX) (IDX)-- +#else +#define HAL_UART_RX_IDX_T_DECR(IDX) st ( \ + if ((IDX)-- == 0) \ + { \ + (IDX) = HAL_UART_DMA_RX_MAX-1; \ + } \ +) +#endif + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_INCR(IDX) (IDX)++ +#else +#define HAL_UART_RX_IDX_T_INCR(IDX) st ( \ + if (++(IDX) >= HAL_UART_DMA_RX_MAX) \ + { \ + (IDX) = 0; \ + } \ +) +#endif + +#define HAL_UART_DMA_TX_AVAIL() \ + (dmaCfg.txHead > dmaCfg.txTail) ? \ + (dmaCfg.txHead - dmaCfg.txTail - 1) : \ + (HAL_UART_DMA_TX_MAX - dmaCfg.txTail + dmaCfg.txHead - 1) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// The following two variables are only used when POWER_SAVING is defined. +static volatile uint8 dmaRdyIsr; +static uint8 dmaRdyDly; // Minimum delay before allowing sleep after detecting RdyIn de-asserted. + +static uartDMACfg_t dmaCfg; + +/* Used to walk the dmaCfg.rxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. + * Although not captured in this UART by DMA case, the _hal_uart_spi.c was able to show that the + * immediate buffer area around the spiRxIdx consists of "cleared" uint16 values, + * but 10-16 indices ahead, there are valid SPI packets ready to be parsed. + */ +static rxIdx_t uartRxBug; // Pre-emptive (not empirically determined necessary) use from SPI case. + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrDMA(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +// Invoked by functions in hal_uart.c when this file is included. +static void HalUARTInitDMA(void); +static void HalUARTOpenDMA(halUARTCfg_t *config); +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len); +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len); +static void HalUARTPollDMA(void); +static uint16 HalUARTRxAvailDMA(void); +static uint8 HalUARTBusyDMA(void); +#if !HAL_UART_TX_BY_ISR +static void HalUARTPollTxTrigDMA(void); +static void HalUARTArmTxDMA(void); +#endif + +/****************************************************************************** + * @fn HalUARTInitDMA + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitDMA(void) +{ + halDMADesc_t *ch; +#if (HAL_UART_DMA == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif + PxSEL |= HAL_UART_Px_SEL; // Enable Peripheral control of Rx/Tx on Px. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + if (DMA_PM) + { + // Setup GPIO for interrupts by falling edge on DMA_RDY_IN. + PxIEN |= DMA_RDYIn_BIT; + PICTL |= PICTL_BIT; + + HAL_UART_DMA_CLR_RDY_OUT(); + PxDIR |= DMA_RDYOut_BIT; + } + +#if !HAL_UART_TX_BY_ISR + // Setup Tx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); +#endif + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf ); + HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX); + HAL_DMA_ARM_CH(HAL_DMA_CH_RX); + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); +} + +/****************************************************************************** + * @fn HalUARTOpenDMA + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenDMA(halUARTCfg_t *config) +{ + dmaCfg.uartCB = config->callBackFunc; + + // Only supporting subset of baudrate for code size - other is possible. + /* + HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + */ + if (config->baudRate == HAL_UART_BR_14400 || + config->baudRate == HAL_UART_BR_28800 || + config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200 || + config->baudRate == HAL_UART_BR_230400) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_2400: + UxGCR = 6; + break; + case HAL_UART_BR_4800: + UxGCR = 7; + break; + case HAL_UART_BR_9600: + case HAL_UART_BR_14400: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + case HAL_UART_BR_28800: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + case HAL_UART_BR_76800: + case HAL_UART_BR_115200: + UxGCR = 11; + break; + case HAL_UART_BR_230400: + UxGCR = 12; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } +// UxBAUD = 0; +// UxBAUD = 59; +// UxBAUD = 216; +// UxGCR = 11; + + if (DMA_PM || config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + PxSEL |= HAL_UART_Px_CTS; // Enable Peripheral control of CTS flow control on Px. + } + else + { + UxUCR = UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. +// UxUCR = UCR_START; +// UxUCR = UCR_STOP | UCR_SPB; // 8 bits/char; no parity; 2 stop bits; stop bit hi. +// UxUCR = UCR_START | UCR_SPB; // 8 bits/char; no parity; 2 stop bits; stop bit lo. + + } + + + UxCSR = (CSR_MODE | CSR_RE); + + if (DMA_PM) + { + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; + } + else if (UxUCR & UCR_FLOW) + { + // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the + // circular Rx queue depth. Start by allowing flow. + HAL_UART_DMA_SET_RDY_OUT(); + PxDIR |= HAL_UART_Px_RTS; + } + +#if HAL_UART_TX_BY_ISR + UTXxIF = 1; // Prime the ISR pump. +#endif + +// UxGCR |= GCR_ORDER; +// UxUCR = 0; +// UxUCR |= UCR_FLUSH; +// UxUCR |= UCR_FLOW; +// UxUCR |= UCR_D9; +// UxUCR |= UCR_BIT9; +// UxUCR |= UCR_PARITY; +// UxUCR |= UCR_SPB; +// UxUCR |= UCR_STOP; +// UxUCR |= UCR_START; + +} + +/***************************************************************************** + * @fn HalUARTReadDMA + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len) +{ + uint16 cnt; + + for (cnt = 0; cnt < len; cnt++) + { + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + break; + } + *buf++ = HAL_UART_DMA_GET_RX_BYTE(dmaCfg.rxHead); + HAL_UART_DMA_CLR_RX_BYTE(dmaCfg.rxHead); + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + if (HalUARTRxAvailDMA() < HAL_UART_DMA_HIGH) + { + HAL_UART_DMA_SET_RDY_OUT(); // Re-enable the flow asap (i.e. not wait until next uart poll). + } + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteDMA + * + * @brief Write a buffer to the UART, enforcing an all or none policy if the requested length + * exceeds the space available. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len) +{ +#if HAL_UART_TX_BY_ISR + // Enforce all or none. + if (HAL_UART_DMA_TX_AVAIL() < len) + { + return 0; + } + + for (uint16 cnt = 0; cnt < len; cnt++) + { + dmaCfg.txBuf[dmaCfg.txTail] = *buf++; + dmaCfg.txMT = 0; + + if (dmaCfg.txTail >= HAL_UART_DMA_TX_MAX-1) + { + dmaCfg.txTail = 0; + } + else + { + dmaCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } +#else + txIdx_t txIdx; + uint8 txSel; + halIntState_t his; + + HAL_ENTER_CRITICAL_SECTION(his); + txSel = dmaCfg.txSel; + txIdx = dmaCfg.txIdx[txSel]; + HAL_EXIT_CRITICAL_SECTION(his); + + // Enforce all or none. + if ((len + txIdx) > HAL_UART_DMA_TX_MAX) + { + return 0; + } + + (void)memcpy(&(dmaCfg.txBuf[txSel][txIdx]), buf, len); + + HAL_ENTER_CRITICAL_SECTION(his); + /* If an ongoing DMA Tx finished while this buffer was being *appended*, then another DMA Tx + * will have already been started on this buffer, but it did not include the bytes just appended. + * Therefore these bytes have to be re-copied to the start of the new working buffer. + */ + if (txSel != dmaCfg.txSel) + { + HAL_EXIT_CRITICAL_SECTION(his); + txSel ^= 1; + + (void)memcpy(&(dmaCfg.txBuf[txSel][0]), buf, len); + HAL_ENTER_CRITICAL_SECTION(his); + dmaCfg.txIdx[txSel] = len; + } + else + { + dmaCfg.txIdx[txSel] = txIdx + len; + } + + // If there is no ongoing DMA Tx, then the channel must be armed here. + if (dmaCfg.txIdx[(txSel ^ 1)] == 0) + { + HAL_EXIT_CRITICAL_SECTION(his); + HalUARTArmTxDMA(); + } + else + { + dmaCfg.txMT = FALSE; + HAL_EXIT_CRITICAL_SECTION(his); + } +#endif + + return len; +} + +/****************************************************************************** + * @fn HalUARTPollDMA + * + * @brief Poll a USART module implemented by DMA, including the hybrid solution in which the Rx + * is driven by DMA but the Tx is driven by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollDMA(void) +{ + uint8 evt = 0; + uint16 cnt; + +#if DMA_PM + PxIEN &= ~DMA_RDYIn_BIT; // Clear to not race with DMA_RDY_IN ISR. + { + if (dmaRdyIsr || HAL_UART_DMA_RDY_IN() || HalUARTBusyDMA()) + { + // Master may have timed-out the SRDY asserted state & may need a new edge. +#if HAL_UART_TX_BY_ISR + if (!HAL_UART_DMA_RDY_IN() && (dmaCfg.txHead != dmaCfg.txTail)) +#else + if (!HAL_UART_DMA_RDY_IN() && ((dmaCfg.txIdx[0] != 0) || (dmaCfg.txIdx[1] != 0))) +#endif + { + HAL_UART_DMA_CLR_RDY_OUT(); + } + dmaRdyIsr = 0; + + if (dmaRdyDly == 0) + { + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + + if ((dmaRdyDly = ST0) == 0) // Reserve zero to signify that the delay expired. + { + dmaRdyDly = 0xFF; + } + HAL_UART_DMA_SET_RDY_OUT(); + } + else if ((dmaRdyDly != 0) && (!DMA_PM_DLY || ((uint8)(ST0 - dmaRdyDly) > DMA_PM_DLY))) + { + dmaRdyDly = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + PxIEN |= DMA_RDYIn_BIT; +#endif + +#if !HAL_UART_TX_BY_ISR + HalUARTPollTxTrigDMA(); +#endif + + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + if (HAL_UART_DMA_NEW_RX_BYTE(uartRxBug)) + { + do { + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } while (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + HAL_UART_RX_IDX_T_INCR(uartRxBug); + } + + cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around. + +#if HAL_UART_DMA_IDLE + if (dmaCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway) to measure the Rx timeout. + if ((ST0 - dmaCfg.rxTick) > HAL_UART_DMA_IDLE) + { + dmaCfg.rxTick = 0; + evt = HAL_UART_RX_TIMEOUT; + } + } + else if (cnt != 0) + { + if ((dmaCfg.rxTick = ST0) == 0) // Zero signifies that the Rx timeout is not running. + { + dmaCfg.rxTick = 0xFF; + } + } +#else + if (cnt != 0) + { + evt = HAL_UART_RX_TIMEOUT; + } +#endif + + if (cnt >= HAL_UART_DMA_FULL) + { + evt |= HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_DMA_HIGH) + { + evt |= HAL_UART_RX_ABOUT_FULL; + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + HAL_UART_DMA_CLR_RDY_OUT(); // Disable Rx flow. + } + } + + if (dmaCfg.txMT) + { + dmaCfg.txMT = FALSE; + evt |= HAL_UART_TX_EMPTY; + } + + if ((evt != 0) && (dmaCfg.uartCB != NULL)) + { + dmaCfg.uartCB(HAL_UART_DMA-1, evt); + } + + if (DMA_PM && (dmaRdyDly == 0) && !HalUARTBusyDMA()) + { + HAL_UART_DMA_CLR_RDY_OUT(); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailDMA() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailDMA(void) +{ + // First, synchronize the Rx tail marker with where the DMA Rx engine is working. + rxIdx_t tail = dmaCfg.rxTail; + + do + { + if (!HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + break; + } + + HAL_UART_RX_IDX_T_INCR(tail); + } while (tail != dmaCfg.rxHead); + + dmaCfg.rxTail = tail; + + uint16 cnt = tail - dmaCfg.rxHead; + + // If the DMA Rx may have overrun the circular queue, investigate further. + if ((cnt == 0) && HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + /* Ascertain whether this polling is racing with the DMA Rx which may have clocked in a byte + * since walking the tail. The Rx queue has wrapped only if the byte before the head is new. + */ + tail = dmaCfg.rxHead; + HAL_UART_RX_IDX_T_DECR(tail); + + if (HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + if (HAL_UART_RX_FLUSH) + { + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + else + { + cnt = HAL_UART_DMA_RX_MAX; + } + } + else + { + cnt = 1; + } + } + else if (cnt > HAL_UART_DMA_RX_MAX) // If the tail has wrapped at the end of the Rx queue. + { + cnt += HAL_UART_DMA_RX_MAX; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTBusyDMA + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +static uint8 HalUARTBusyDMA( void ) +{ +#if HAL_UART_TX_BY_ISR + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txHead == dmaCfg.txTail)); +#else + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txIdx[0] == 0) && (dmaCfg.txIdx[1] == 0)); +#endif +} + +#if !HAL_UART_TX_BY_ISR +/****************************************************************************** + * @fn HalUARTPollTxTrigDMA + * + * @brief Ascertain whether a manual trigger is required for the DMA Tx channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTPollTxTrigDMA(void) +{ + if ((UxCSR & CSR_TX_BYTE) == 0) // If no TXBUF to shift register transfer, then TXBUF may be MT. + { + if ((dmaCfg.txTick == 0) || ((uint8)(ST0 - dmaCfg.txTick) > HAL_UART_TX_TICK_MIN)) + { + dmaCfg.txTick = 0; + + if (dmaCfg.txTrig && HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)) + { + HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX); + } + dmaCfg.txTrig = 0; + } + } + else + { + UxCSR = (CSR_MODE | CSR_RE); // Clear the CSR_TX_BYTE flag. + dmaCfg.txTick = ST0; + + if (dmaCfg.txTick == 0) // Reserve zero to signify that the minimum delay has been met. + { + dmaCfg.txTick = 0xFF; + } + } +} + +/****************************************************************************** + * @fn HalUARTArmTxDMA + * + * @brief Arm the Tx DMA channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTArmTxDMA(void) +{ + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX); + HAL_DMA_SET_SOURCE(ch, dmaCfg.txBuf[dmaCfg.txSel]); + HAL_DMA_SET_LEN(ch, dmaCfg.txIdx[dmaCfg.txSel]); + + dmaCfg.txSel ^= 1; + dmaCfg.txTrig = 1; + HAL_DMA_ARM_CH(HAL_DMA_CH_TX); + + HalUARTPollTxTrigDMA(); + + if (DMA_PM) + { + HAL_UART_DMA_SET_RDY_OUT(); + } +} +#endif + +/****************************************************************************** + * @fn HalUART_DMAIsrDMA + * + * @brief Handle the Tx done DMA ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUART_DMAIsrDMA(void) +{ +#if !HAL_UART_TX_BY_ISR + if (dmaCfg.txIdx[dmaCfg.txSel]) + { + // If there is more Tx data ready to go, re-arm the DMA immediately on it. + HalUARTArmTxDMA(); + + // Indicate that the Tx buffer just finished is now free (re-arming did a ^= toggle of txSel). + dmaCfg.txIdx[dmaCfg.txSel] = 0; + } + else + { + dmaCfg.txIdx[(dmaCfg.txSel ^ 1)] = 0; // Indicate that the Tx buffer just finished is now free. + + // Clear the CSR_TX_BYTE flag & start the txTick to allow the possibility of an immediate + // manual trigger from the next Write(), if it occurs more than one character time later. + HalUARTPollTxTrigDMA(); + } + + dmaCfg.txMT = TRUE; // Notify CB that at least one Tx buffer is now free to use. +#endif +} + +#if DMA_PM +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + PxIFG = 0; + PxIF = 0; + + dmaRdyIsr = 1; + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +} +#endif + +#if HAL_UART_TX_BY_ISR +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (dmaCfg.txHead == dmaCfg.txTail) + { + IEN2 &= ~UTXxIE; + dmaCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; + + if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) + { + dmaCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_isr.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_isr.c new file mode 100644 index 0000000..60c81b4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_isr.c @@ -0,0 +1,662 @@ +/************************************************************************************************** + Filename: _hal_uart_isr.c + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the H/W UART driver by ISR. + + Note that when using this interrupt service based UART configuration (as opposed to DMA) the + higher baudrates, such as 115200bps, may suffer Rx overrun, especially when the radio is used + simultaneously and/or there is heavy to full throughout and/or full-duplex data. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_uart.h" + +/********************************************************************* + * MACROS + */ + +//#define HAL_UART_ASSERT(expr) HAL_ASSERT((expr)) +#define HAL_UART_ASSERT(expr) + +#define HAL_UART_ISR_RX_AVAIL() \ + (isrCfg.rxTail >= isrCfg.rxHead) ? \ + (isrCfg.rxTail - isrCfg.rxHead) : \ + (HAL_UART_ISR_RX_MAX - isrCfg.rxHead + isrCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ + (isrCfg.txHead > isrCfg.txTail) ? \ + (isrCfg.txHead - isrCfg.txTail - 1) : \ + (HAL_UART_ISR_TX_MAX - isrCfg.txTail + isrCfg.txHead - 1) + +/********************************************************************* + * CONSTANTS + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +// Incompatible redefinitions result with more than one UART driver sub-module. +#undef PxOUT +#undef PxDIR +#undef PxSEL +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef URXxIE +#undef URXxIF +#undef UTXxIE +#undef UTXxIF +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RX_TX +#undef HAL_UART_Px_RX +#undef PxIFG +#undef PxIF +#undef PxIEN +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_ISR == 1) +#define PxOUT P0 +#define PxIN P0 +#define PxDIR P0DIR +#define PxSEL P0SEL +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define URXxIE URX0IE +#define URXxIF URX0IF +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF + +#define PxIFG P0IFG +#define PxIF P0IF +#define PxIEN P0IEN +#define PICTL_BIT 0x01 +#define IENx IEN1 +#define IEN_BIT 0x20 + +#else +#define PxOUT P1 +#define PxIN P1 +#define PxDIR P1DIR +#define PxSEL P1SEL +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define URXxIE URX1IE +#define URXxIF URX1IF +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF + +#define PxIFG P1IFG +#define PxIF P1IF +#define PxIEN P1IEN +#define PICTL_BIT 0x04 +#define IENx IEN2 +#define IEN_BIT 0x10 +#endif + +#if (HAL_UART_ISR == 1) +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_Px_RX_TX 0x0C // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x04 // Peripheral I/O Select for Rx. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#else +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#define HAL_UART_Px_RX_TX 0xC0 // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x80 // Peripheral I/O Select for Rx. +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_ISR_RX_MAX +#define HAL_UART_ISR_RX_MAX 128 +#endif +#if !defined HAL_UART_ISR_TX_MAX +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX +#endif +#if !defined HAL_UART_ISR_HIGH +#define HAL_UART_ISR_HIGH (HAL_UART_ISR_RX_MAX / 2 - 16) +#endif +#if !defined HAL_UART_ISR_IDLE +#define HAL_UART_ISR_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +#if HAL_UART_ISR_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_ISR_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + rxIdx_t rxHead; + volatile rxIdx_t rxTail; + uint8 rxTick; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; + + halUARTCBack_t uartCB; +} uartISRCfg_t; + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uartISRCfg_t isrCfg; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void HalUARTInitISR(void); +static void HalUARTOpenISR(halUARTCfg_t *config); +static uint16 HalUARTReadISR(uint8 *buf, uint16 len); +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len); +static void HalUARTPollISR(void); +static uint16 HalUARTRxAvailISR(void); +static uint8 HalUARTBusyISR(void); +static void HalUARTSuspendISR(void); +static void HalUARTResumeISR(void); + +/****************************************************************************** + * @fn HalUARTInitISR + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitISR(void) +{ + // Set P2 priority - USART0 over USART1 if both are defined. + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + +#if (HAL_UART_ISR == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O location to P1. +#endif + PxSEL |= HAL_UART_Px_RX_TX; // Enable Tx and Rx on P1. + ADCCFG &= ~HAL_UART_Px_RX_TX; // Make sure ADC doesnt use this. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. +} + +/****************************************************************************** + * @fn HalUARTOpenISR + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenISR(halUARTCfg_t *config) +{ + isrCfg.uartCB = config->callBackFunc; + // Only supporting subset of baudrate for code size - other is possible. + HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + if (config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; + PxSEL |= HAL_UART_Px_RTS | HAL_UART_Px_CTS; + PxOUT &= ~HAL_UART_Px_RTS; + PxDIR |= HAL_UART_Px_RTS; + } + else + { + UxUCR = UCR_STOP; + } + + URXxIE = 1; + UTXxIF = 1; // Prime the ISR pump. + UxCSR = (CSR_MODE | CSR_RE); +} + +/***************************************************************************** + * @fn HalUARTReadISR + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadISR(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((isrCfg.rxHead != isrCfg.rxTail) && (cnt < len)) + { + *buf++ = isrCfg.rxBuf[isrCfg.rxHead++]; + if (isrCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteISR + * + * @brief Write a buffer to the UART. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Enforce all or none. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + isrCfg.txBuf[isrCfg.txTail] = *buf++; + isrCfg.txMT = 0; + + if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1) + { + isrCfg.txTail = 0; + } + else + { + isrCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTPollISR + * + * @brief Poll a USART module implemented by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollISR(void) +{ + uint16 cnt = HAL_UART_ISR_RX_AVAIL(); + uint8 evt = 0; + + if (isrCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - isrCfg.rxShdw; + + if (isrCfg.rxTick > decr) + { + isrCfg.rxTick -= decr; + } + else + { + isrCfg.rxTick = 0; + } + } + isrCfg.rxShdw = ST0; + + if (cnt >= HAL_UART_ISR_RX_MAX-1) + { + evt = HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_ISR_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !isrCfg.rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (isrCfg.txMT) + { + isrCfg.txMT = 0; + evt |= HAL_UART_TX_EMPTY; + } + + if (evt && (isrCfg.uartCB != NULL)) + { + isrCfg.uartCB(HAL_UART_ISR-1, evt); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailISR() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailISR(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +/****************************************************************************** + * @fn HalUARTBusyISR + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +uint8 HalUARTBusyISR( void ) +{ + return ((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && + (isrCfg.rxHead == isrCfg.rxTail) && (isrCfg.txHead == isrCfg.txTail)); +} + +/****************************************************************************** + * @fn HalUARTSuspendISR + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTSuspendISR( void ) +{ +#if defined POWER_SAVING + UxCSR = CSR_MODE; // Suspend Rx operations. + + if (UxUCR & UCR_FLOW) + { + PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow. + PxIFG = (HAL_UART_Px_CTS ^ 0xFF); + PxIEN |= HAL_UART_Px_CTS; // Enable the CTS ISR. + } + else + { + PxIFG = (HAL_UART_Px_RX ^ 0xFF); + PxIEN |= HAL_UART_Px_RX; // Enable the Rx ISR. + } + +#if defined HAL_UART_GPIO_ISR + PxIF = 0; // Clear the next level. + PICTL |= PICTL_BIT; // Interrupt on falling edge of input. + IENx |= IEN_BIT; +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTResumeISR + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTResumeISR( void ) +{ +#if defined POWER_SAVING +#if defined HAL_UART_GPIO_ISR + IENx &= (IEN_BIT ^ 0xFF); +#endif + + if (UxUCR & UCR_FLOW) + { + PxIEN &= (HAL_UART_Px_CTS ^ 0xFF); // Disable the CTS ISR. + PxOUT &= (HAL_UART_Px_RTS ^ 0xFF); // Re-enable Rx flow. + } + else + { + PxIEN &= (HAL_UART_Px_RX ^ 0xFF); // Enable the Rx ISR. + } + + UxUCR |= UCR_FLUSH; + UxCSR = (CSR_MODE | CSR_RE); +#endif +} + +/*************************************************************************************************** + * @fn halUartRxIsr + * + * @brief UART Receive Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + uint8 tmp = UxDBUF; + isrCfg.rxBuf[isrCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (isrCfg.rxHead == isrCfg.rxTail) + { + isrCfg.rxShdw = ST0; + } + + if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxTail = 0; + } + + isrCfg.rxTick = HAL_UART_ISR_IDLE; + + HAL_EXIT_ISR(); +} + +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (isrCfg.txHead == isrCfg.txTail) + { + IEN2 &= ~UTXxIE; + isrCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = isrCfg.txBuf[isrCfg.txHead++]; + + if (isrCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + isrCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} + +#if (defined POWER_SAVING && defined HAL_UART_GPIO_ISR) +/*************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + HalUARTResume(); + if (dmaCfg.uartCB != NULL) + { + dmaCfg.uartCB(HAL_UART_DMA-1, HAL_UART_RX_WAKEUP); + } + PxIFG = 0; + PxIF = 0; + + HAL_EXIT_ISR(); +} +#endif + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_spi.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_spi.c new file mode 100644 index 0000000..c2282cd --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/_hal_uart_spi.c @@ -0,0 +1,1075 @@ +/************************************************************************************************** + Filename: _hal_uart_spi.c + Revised: $Date: 2013-02-06 09:21:21 -0800 (Wed, 06 Feb 2013) $ + Revision: $Revision: 33001 $ + + Description: Implementation of a specialized SPI Transport driver for emulating a UART API. + + Concept of Operation for porting this code to act as a SPI Master: + + 5 GPIO lines are required: MOSI, MISO, SPI Clock, SPI CSn/MRDY, and SRDY. + MRDY = SPI Master Ready to send and serves as a SPI Slave wakeup from sleep. + SRDY = SPI Slave Ready to send and serves as a SPI Master wakeup from sleep. + + SRDY also serves as an indication that the Slave has awoken from sleep and is ready to recieve + as follows: when the Slave has no message ready, it will toggle the state of its SRDY on every + falling edge of the CSn/MRDY. The SPI Slave has a configurable time delay before re-enabling + sleep after being awoken. + + The SPI Slave does not re-enter sleep for the following conditions: + - Slave is asserting SRDY (i.e. it is waiting to send a SPI packet). + - Master is asserting MRDY. + - Slave has parsed the SOF byte of a SPI packet, but has not received the entire packet yet. + Note how important this case is to support a master that has to interrupt a SPI packet + transmission in order to service a higher priority SPI slave (i.e. the master has executed the + protocol to ensure that the SPI slave is awake, but cannot hold MRDY low for the entire, + contiguous packet for having to service some other SPI slave mid-packet). + + Any transfer, from one byte to SPI_MAX_DAT_LEN bytes is packetized by pre-pending an SOF & LEN + byte and appending an FCS byte. The FCS is calculated over the data payload and the LEN bytes. + + Only Full-Duplex transfers are supported - at any byte of a Tx transfer, + the incoming bytes may not be just garbage bytes clocked out by the synchronous transfer, but + instead be meaningful bytes of a Tx-packet from the other side. Thus, the necessity of concocting + the concept of the SPI transfer packet described above. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#elif defined HAL_SPI_QUEUED_TX && HAL_SPI_QUEUED_TX +#include "OSAL.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* The bridge utility application uses 4 DMA channels for 2 sets of Rx/Tx by DMA, and thereby also + * implements a special DMA ISR handler, which accomodates this extra definition. + */ +#if !defined HAL_SPI_CH_RX +#define HAL_SPI_CH_RX HAL_DMA_CH_RX +#endif +#if !defined HAL_SPI_CH_TX +#define HAL_SPI_CH_TX HAL_DMA_CH_TX +#endif + +// Overlay the SPI Rx/Tx buffers on the UART Rx/Tx buffers when running with a run-time selectable +// UART port by SPI or by UART in order to save XDATA space. +#if !defined HAL_SPI_ON_UART_BUFS +#define HAL_SPI_ON_UART_BUFS FALSE +#endif + +#if !defined HAL_SPI_QUEUED_TX +#define HAL_SPI_QUEUED_TX FALSE +#endif + +#define SPI_MAX_PKT_LEN 256 +#define SPI_MAX_DAT_LEN (SPI_MAX_PKT_LEN - SPI_FRM_LEN) + +#define SPI_SOF 0xFE // Start-of-frame delimiter for SPI transport. + +// The FCS is calculated over the SPI Frame Header and the Frame Data bytes. +#define SPI_HDR_LEN 1 // One byte LEN pre-pended to data byte array. +// SOF & Header bytes pre-pended and the FCS byte appended. +#define SPI_FRM_LEN (2 + SPI_HDR_LEN) + +#define SPI_SOF_IDX 0 +#define SPI_HDR_IDX 1 // The frame header consists only of the LEN byte for now. +#define SPI_LEN_IDX 1 // LEN byte is offset by the SOF byte. +#define SPI_DAT_IDX 2 // Data bytes are offset by the SOF & LEN bytes. + +#if defined HAL_SPI_MASTER +// If POWER_SAVING is enabled in the 8051-SOC slave, then any master transmit must be preceded by a +// dummy zero byte transfer to give the slave time to wake from PM2/3 & enable its 1.8V and signal +// such success by responding with its SRDY active low. +#if !defined HAL_SPI_WAKEUP +#define HAL_SPI_WAKEUP TRUE +#endif +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 2 +#elif (HAL_UART_SPI != 2) +#error Only supporting HAL_UART_SPI==2 for now. +#endif + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#if (HAL_UART_SPI == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#elif (HAL_UART_SPI == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_SEL_S +#undef HAL_UART_Px_SEL_M +#if (HAL_UART_SPI == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_SEL_S 0x3C // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0x2C // Peripheral I/O Select for Master: MI/MO/CLK. +#elif (HAL_UART_SPI == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_SEL_S 0xF0 // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0xE0 // Peripheral I/O Select for Master: MI/MO/CLK. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_SPI == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_SPI == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#if !defined SPI_RDYIn +#define SPI_RDYIn P0_1 +#define SPI_RDYIn_BIT BV(1) +#endif +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_SPI == 2) +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define SPI_RDYIn P1_4 +#define SPI_RDYIn_BIT BV(4) +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#undef PxDIR +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxDIR P1DIR +#define SPI_RDYOut P1_4 +#define SPI_RDYOut_BIT BV(4) +#elif (HAL_UART_SPI == 2) +#define PxDIR P0DIR +#define SPI_RDYOut P0_5 +#define SPI_RDYOut_BIT BV(5) +#endif + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if (SPI_MAX_PKT_LEN <= 256) +typedef uint8 spiLen_t; +#else +typedef uint16 spiLen_t; +#endif + +typedef enum +{ + spiRxSteSOF, + spiRxSteLen, + spiRxSteData, + spiRxSteFcs +} spiRxSte_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#if SPI_MAX_PKT_LEN == 256 +#define SPI_LEN_T_INCR(LEN) (LEN)++ +#define SPI_LEN_T_BOUNDS_CHECK(LEN) +#else +#define SPI_LEN_T_INCR(LEN) st ( \ + if (++(LEN) >= SPI_MAX_PKT_LEN) \ + { \ + (LEN) = 0; \ + } \ +) + +#define SPI_LEN_T_BOUNDS_CHECK(LEN) st ( \ + if (len > SPI_MAX_PKT_LEN) \ + { \ + len = SPI_MAX_PKT_LEN; \ + } \ +) +#endif + +#define SPI_CLR_RX_BYTE(IDX) (spiRxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) +#define SPI_GET_RX_BYTE(IDX) (*(volatile uint8 *)(spiRxBuf+(IDX))) +#define SPI_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(spiRxBuf[(IDX)])) + +#define SPI_DAT_LEN(PBUF) ((PBUF)[SPI_LEN_IDX]) +#define SPI_PKT_LEN(PBUF) (SPI_DAT_LEN((PBUF)) + SPI_FRM_LEN) + +#define SPI_RDY_IN() (SPI_RDYIn == 0) +#define SPI_RDY_OUT() (SPI_RDYOut == 0) + +#if defined HAL_SPI_MASTER +#define SPI_CLR_CSn_OUT() (SPI_RDYOut = 1) +#define SPI_SET_CSn_OUT() (SPI_RDYOut = 0) + +#define SPI_CLOCK_RX(CNT) st ( \ + SPI_SET_CSn_OUT(); \ + \ + for (spiLen_t cnt = 0; cnt <= (CNT); cnt++) \ + { \ + UxDBUF = 0; \ + while (UxCSR & CSR_ACTIVE); \ + } \ + \ + SPI_CLR_CSn_OUT(); \ +) +#define SPI_CLR_RDY_OUT() SPI_CLR_CSn_OUT() + +#elif !defined HAL_SPI_MASTER +#define SPI_CLR_RDY_OUT() (SPI_RDYOut = 1) +#define SPI_SET_RDY_OUT() (SPI_RDYOut = 0) +#define SPI_TOG_RDY_OUT() st ( \ + if (SPI_RDY_OUT()) \ + { \ + SPI_CLR_RDY_OUT(); \ + } \ + else \ + { \ + SPI_SET_RDY_OUT(); \ + } \ +) +#endif + +#define SPI_RX_RDY() (spiRxHead != spiRxTail) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// Convenient way to save RAM space when running with both SPI & UART ports enabled, +// but only using one at a time with a run-time choice. +#if HAL_SPI_ON_UART_BUFS +static uint16 *const spiRxBuf = dmaCfg.rxBuf; +#if (defined HAL_UART_TX_BY_ISR && HAL_UART_TX_BY_ISR) +static uint8 *const spiRxDat = dmaCfg.txBuf; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#else +static uint8 *const spiRxDat = dmaCfg.txBuf[0]; +static uint8 *const spiTxPkt = dmaCfg.txBuf[1]; +#endif +#else +static __no_init uint16 spiRxBuf[SPI_MAX_PKT_LEN]; // uint16 for trick with DMA Rx 2-for-1. +static __no_init uint8 spiRxDat[SPI_MAX_PKT_LEN]; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#endif + +#if HAL_SPI_QUEUED_TX +static osal_msg_q_t spiTxQ; +static volatile uint8 spiTxMT; +#endif + +static spiRxSte_t spiRxSte; // State of SPI packet parsing from spiRxBuf[]. +static spiLen_t spiRxIdx; // Index in spiRxBuf[] for SPI packet parsing. +static spiLen_t spiRxCnt; // Count payload data bytes parsed from spiRxBuf[]. +static spiLen_t spiRxLen; // Total length of payload data bytes to be parsed from spiRxBuf[]. +static spiLen_t spiRxFcs; // Running FCS calculation of bytes being parsed from spiRxBuf[]. + +static spiLen_t spiRxHead; // Index in spiRxDat[] from which to read with HalUARTReadSPI(). +static spiLen_t spiRxTail; // Index in spiRxDat[] up to which to read with HalUARTReadSPI(). +static spiLen_t spiRxTemp; // Index in spiRxDat[] to which to parse data from spiRxBuf[]. + +// Not supporting Tx packet buffering with a spiTxBuf[] for now to save XDATA/Flash space. + +static volatile spiLen_t spiTxLen; // Total length of payload data bytes to transmit. + +static halUARTCBack_t spiCB; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) +static volatile uint8 spiRdyIsr; // Sticky flag from SPI_RDY_IN ISR for background polling. +#endif + +#if defined POWER_SAVING +static uint8 spiHoldPM; // Boolean whether or not this module is holding off the PM. +#endif + +/* Used to walk the spiRxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. The immediate buffer area around + * the spiRxIdx consists of "cleared" uint16 values, but 10-16 indices ahead, there are valid SPI + * packets ready to be parsed. + */ +static spiLen_t spiRxBug; // DMA pointer is seen to jump ahead, or S/W bug corrupts spiRxIdx? + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrSPI(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +static uint8 spiCalcFcs(uint8 *pBuf); +static void spiParseRx(void); +#if defined POWER_SAVING +static uint8 spiSweepRx(void); +#endif + +/************************************************************************************************** + * @fn HalUARTInitSPI + * + * @brief Initialize the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTInitSPI(void) +{ +#if (HAL_UART_SPI == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif +#if defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_M; // SPI-Master peripheral select. + UxCSR = 0; // Mode is SPI-Master Mode. + UxGCR = 16; // Cfg for the max Rx/Tx baud of 4-MHz. + UxBAUD = 255; +#elif !defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_S; // SPI-Slave peripheral select. + UxCSR = CSR_SLAVE; // Mode is SPI-Slave Mode. +#endif + UxUCR = UCR_FLUSH; // Flush it. + UxGCR |= BV(5); // Set bit order to MSB. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + // Setup GPIO for interrupts by falling edge on SPI_RDY_IN. + PxIEN |= SPI_RDYIn_BIT; + PICTL |= PICTL_BIT; + + SPI_CLR_RDY_OUT(); + PxDIR |= SPI_RDYOut_BIT; + + // Setup Tx by DMA. + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + HAL_DMA_SET_SOURCE( ch, spiTxPkt ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, spiRxBuf ); + HAL_DMA_SET_LEN( ch, SPI_MAX_PKT_LEN ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_SPI_CH_RX); + HAL_DMA_ARM_CH(HAL_SPI_CH_RX); + (void)memset(spiRxBuf, (DMA_PAD ^ 0xFF), SPI_MAX_PKT_LEN * sizeof(uint16)); +} + +/************************************************************************************************** + * @fn HalUARTOpenSPI + * + * @brief Start the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTOpenSPI(halUARTCfg_t *config) +{ + spiCB = config->callBackFunc; + + UxCSR |= CSR_RE; + + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; +} + +/************************************************************************************************** + * @fn HalUARTReadSPI + * + * @brief Read data bytes from a received SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory to where to copy the received SPI data bytes. + * @param len - the length to copy (for now, must be the exact length of the received data). + * + * output parameters + * + * None. + * + * @return The number of bytes read from a received SPI packet. + */ +static spiLen_t HalUARTReadSPI(uint8 *buf, spiLen_t len) +{ + for (spiLen_t cnt = 0; cnt < len; cnt++) + { + if (spiRxHead == spiRxTail) + { + len = cnt; + break; + } + + *buf++ = spiRxDat[spiRxHead]; + SPI_LEN_T_INCR(spiRxHead); + } + + return len; +} + +/************************************************************************************************** + * @fn HalUARTWriteSPI + * + * @brief Transmit data bytes as a SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory of the data bytes to send. + * @param len - the length of the data bytes to send. + * + * output parameters + * + * None. + * + * @return Zero for any error; otherwise, 'len'. + */ +static spiLen_t HalUARTWriteSPI(uint8 *buf, spiLen_t len) +{ + if (spiTxLen != 0) + { +#if HAL_SPI_QUEUED_TX + uint8 *txMsg = osal_msg_allocate(len); + + if (txMsg != NULL) + { + (void)memcpy(txMsg, buf, len); + osal_msg_enqueue(&spiTxQ, txMsg); + + return len; + } +#endif + + return 0; + } + + if (len > SPI_MAX_DAT_LEN) + { + len = SPI_MAX_DAT_LEN; + } + spiTxLen = len; +#if HAL_SPI_QUEUED_TX + spiTxMT = FALSE; +#endif + + spiTxPkt[SPI_LEN_IDX] = len; + (void)memcpy(spiTxPkt + SPI_DAT_IDX, buf, len); + + spiCalcFcs(spiTxPkt); + spiTxPkt[SPI_SOF_IDX] = SPI_SOF; + + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_SPI_CH_TX); + HAL_DMA_SET_LEN(ch, SPI_PKT_LEN(spiTxPkt)); + +#if defined HAL_SPI_MASTER +#if HAL_SPI_WAKEUP + /* A Full-Duplex Slave will keep SRDY active low if it has Tx ready; otherwise it will toggle its + * SRDY with every falling edge of MRDY. So if SRDY is high and the wait after writing each byte + * is not long enough, the master may loop here, infinitely out of sync with the toggling SRDY. + * Thus in a threaded OS, it would be advisable to send one zero and yield for 1-msec or more, or + * be able to receive and check here for the SRDY ISR. + */ + spiRdyIsr = 0; + while (!SPI_RDY_IN() && (spiRdyIsr == 0)) + { + SPI_CLOCK_RX(1); + + for (uint16 cnt = 0; cnt < 512; cnt++) + { + if (SPI_RDY_IN() || (spiRdyIsr != 0)) + { + break; + } + } + } +#endif + SPI_SET_CSn_OUT(); + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + HAL_DMA_MAN_TRIGGER(HAL_SPI_CH_TX); + +#elif !defined HAL_SPI_MASTER + + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + SPI_SET_RDY_OUT(); +#endif + + return len; +} + +/************************************************************************************************** + * @fn HalUARTPollSPI + * + * @brief SPI Transport Polling Manager. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTPollSPI(void) +{ +#if HAL_SPI_QUEUED_TX + /* There should not be a race with the Tx-Done ISR checking the spiTxQ because if the background + * can first detect the volatile variable spiTxLen as zero and then detect the spiTxQ as not + * empty, then the Tx-Done ISR has already fired after the background write started to enqueue + * the message but before it was done doing so. + */ + if ((spiTxLen == 0) && (spiTxQ != NULL)) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else if (spiTxMT) + { + spiTxMT = FALSE; + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); + } +#endif + + spiParseRx(); + +#if HAL_SPI_QUEUED_TX || defined HAL_SPI_MASTER + if (SPI_RX_RDY()) +#else + // When there is no ability to queue Tx data and there is still Tx data pending, do not call the + // Application with new Rx data, as this may result in an attempt to respond. Although this + // failure will be actionable by the Application when HalUARTWriteSPI() returns zero, simple + // applications (like the SBL, which does not enable Tx queueing) do not handle the zero return. + if (SPI_RX_RDY() && !spiTxLen) +#endif + { + if (spiCB != NULL) + { + spiCB((HAL_UART_SPI - 1), HAL_UART_RX_TIMEOUT); + } + } + + PxIEN &= ~SPI_RDYIn_BIT; // Clear to not race with SPI_RDY_IN ISR. + + if (!SPI_RDY_IN() && !spiTxLen) + { + SPI_CLR_RDY_OUT(); // Clear the ready-out bit before re-enabling the ready-in ISR. + } + +#if defined POWER_SAVING + if (SPI_RDY_IN() || SPI_RX_RDY() || spiRxLen || spiTxLen || spiRdyIsr) + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM == 0) + { + spiHoldPM = 1; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + } + else + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM != 0) + { + PxIEN |= SPI_RDYIn_BIT; // Allow the ready-in ISR during the relatively long Rx sweep. + + if (spiSweepRx()) + { + spiHoldPM = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + } +#endif + + PxIEN |= SPI_RDYIn_BIT; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailSPI + * + * @brief Return the byte count of Rx data ready to be read HalUARTReadSPI(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return Number of bytes ready to be read with HalUARTReadSPI(). + */ +static spiLen_t HalUARTRxAvailSPI(void) +{ + return (spiRxTail > spiRxHead) ? (spiRxTail-spiRxHead) : (spiRxTail+(SPI_MAX_PKT_LEN-spiRxHead)); +} + +/************************************************************************************************** + * @fn spiCalcFcs + * + * @brief Calculate the FCS of a SPI Transport frame and append it to the packet. + * + * input parameters + * + * @param pBuf - Pointer to the SPI Transport frame over which to calculate the FCS. + * + * output parameters + * + * None. + * + * @return The FCS calculated. + */ +static uint8 spiCalcFcs(uint8 *pBuf) +{ + spiLen_t len = SPI_DAT_LEN(pBuf) + SPI_HDR_LEN + SPI_HDR_IDX; + spiLen_t idx = SPI_HDR_IDX; + uint8 fcs = 0; + + while (idx < len) + { + fcs ^= pBuf[idx++]; + } + pBuf[idx] = fcs; + + return fcs; +} + +/************************************************************************************************** + * @fn spiParseRx + * + * @brief Parse all available bytes from the spiRxBuf[]; parse Rx data into the spiRxDat[]. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void spiParseRx(void) +{ + while (1) + { + if (!SPI_NEW_RX_BYTE(spiRxIdx)) + { +#if defined HAL_SPI_MASTER + if (SPI_RDY_IN() && (spiTxLen == 0)) + { + SPI_CLOCK_RX(1); + continue; + } +#endif + + if (SPI_NEW_RX_BYTE(spiRxBug)) + { + while (!SPI_NEW_RX_BYTE(spiRxIdx)) + { + SPI_LEN_T_INCR(spiRxIdx); + } + + spiRxBug = spiRxIdx; + continue; + } + + SPI_LEN_T_INCR(spiRxBug); + break; + } + + uint8 ch = SPI_GET_RX_BYTE(spiRxIdx); + SPI_CLR_RX_BYTE(spiRxIdx); + SPI_LEN_T_INCR(spiRxIdx); + + switch (spiRxSte) + { + case spiRxSteSOF: + if (ch == SPI_SOF) + { + spiRxSte = spiRxSteLen; + + // At this point, the master has effected the protocol for ensuring that the SPI slave is + // awake, so set the spiRxLen to non-zero to prevent the slave from re-entering sleep until + // the entire packet is received - even if the master interrupts the sending of the packet + // by de-asserting/re-asserting MRDY one or more times. + spiRxLen = 1; + } + break; + + case spiRxSteLen: + if ((ch == 0) || (ch > SPI_MAX_DAT_LEN)) + { + spiRxSte = spiRxSteSOF; + spiRxLen = 0; + } + else + { + spiRxFcs = spiRxLen = ch; + spiRxTemp = spiRxTail; + spiRxCnt = 0; + spiRxSte = spiRxSteData; +#if defined HAL_SPI_MASTER + SPI_CLOCK_RX(ch + 1); // Clock out the SPI Frame Data bytes and FCS. +#endif + } + break; + + case spiRxSteData: + spiRxFcs ^= ch; + spiRxDat[spiRxTemp] = ch; + SPI_LEN_T_INCR(spiRxTemp); + + if (++spiRxCnt == spiRxLen) + { + spiRxSte = spiRxSteFcs; + } + break; + + case spiRxSteFcs: + spiRxSte = spiRxSteSOF; + + if (ch == spiRxFcs) + { + spiRxTail = spiRxTemp; + } + + spiRxCnt = spiRxLen = 0; + break; + + default: + HAL_ASSERT(0); + break; + } + } +} + +#if defined POWER_SAVING +/************************************************************************************************** + * @fn spiSweepRx + * + * @brief Sweep the entire spiRxBuf[] looking for buggy DMA Rx - this function is an + * enhancement to the 'spiRxBug' work-around that is required when POWER_SAVING is + * enabled because the 'spiRxBug' only looks at one byte per polling pass and the + * buggy DMA Rx may be further away and not encountered before allowing sleep. + * + * input parameters + * + * None. + * + * output parameters + * + * The local global variables spiRxIdx and spiRxBug are set to the index of the first valid Rx + * after the index where spiRxIdx had been set upon entering this function. + * + * @return TRUE for a clean sweep (spiRxBuf[] has no valid Rx); FALSE otherwise. + */ +static uint8 spiSweepRx(void) +{ + spiLen_t sweepIdx = spiRxIdx; + + do { + if (SPI_NEW_RX_BYTE(sweepIdx)) + { + spiRxBug = spiRxIdx = sweepIdx++; + break; + } + + SPI_LEN_T_INCR(sweepIdx); + + } while (sweepIdx != spiRxIdx); + + return (sweepIdx == spiRxIdx); +} +#endif + +/************************************************************************************************** + * @fn HalUART_DMAIsrSPI + * + * @brief Handle the Tx done DMA ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalUART_DMAIsrSPI(void) +{ +#if !defined HAL_SPI_MASTER + if (!SPI_RDY_IN()) +#endif + { + SPI_CLR_RDY_OUT(); + } + spiTxLen = 0; + +#if HAL_SPI_QUEUED_TX + if (spiTxQ != NULL) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else + { + spiTxMT = TRUE; + } +#else + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); +#endif +} + +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief Handler for the SPI_RDY_IN falling-edge ISR. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if defined HAL_SBL_BOOT_CODE +static void spiRdyIn(void) +{ +#else +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#elif (HAL_UART_SPI == 2) +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); +#endif + + PxIFG = 0; + PxIF = 0; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) + spiRdyIsr = 1; +#endif +#if !defined HAL_SPI_MASTER + if (spiTxLen == 0) + { + SPI_TOG_RDY_OUT(); + } +#endif + +#if !defined HAL_SBL_BOOT_CODE + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +#endif +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_adc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_adc.c new file mode 100644 index 0000000..392cd2a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_adc.c @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_adc.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the HAL ADC. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_ADC_EOC 0x80 /* End of Conversion bit */ +#define HAL_ADC_START 0x40 /* Starts Conversion */ + +#define HAL_ADC_STSEL_EXT 0x00 /* External Trigger */ +#define HAL_ADC_STSEL_FULL 0x10 /* Full Speed, No Trigger */ +#define HAL_ADC_STSEL_T1C0 0x20 /* Timer1, Channel 0 Compare Event Trigger */ +#define HAL_ADC_STSEL_ST 0x30 /* ADCCON1.ST =1 Trigger */ + +#define HAL_ADC_RAND_NORM 0x00 /* Normal Operation */ +#define HAL_ADC_RAND_LFSR 0x04 /* Clock LFSR */ +#define HAL_ADC_RAND_SEED 0x08 /* Seed Modulator */ +#define HAL_ADC_RAND_STOP 0x0c /* Stop Random Generator */ +#define HAL_ADC_RAND_BITS 0x0c /* Bits [3:2] */ + +#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */ +#define HAL_ADC_DEC_128 0x10 /* Decimate by 128 : 10-bit resolution */ +#define HAL_ADC_DEC_256 0x20 /* Decimate by 256 : 12-bit resolution */ +#define HAL_ADC_DEC_512 0x30 /* Decimate by 512 : 14-bit resolution */ +#define HAL_ADC_DEC_BITS 0x30 /* Bits [5:4] */ + +#define HAL_ADC_STSEL HAL_ADC_STSEL_ST +#define HAL_ADC_RAND_GEN HAL_ADC_RAND_STOP +#define HAL_ADC_REF_VOLT HAL_ADC_REF_AVDD +#define HAL_ADC_DEC_RATE HAL_ADC_DEC_064 +#define HAL_ADC_SCHN HAL_ADC_CHN_VDD3 +#define HAL_ADC_ECHN HAL_ADC_CHN_GND + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +#if (HAL_ADC == TRUE) +static uint8 adcRef; +#endif + +/************************************************************************************************** + * @fn HalAdcInit + * + * @brief Initialize ADC Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalAdcInit (void) +{ +#if (HAL_ADC == TRUE) + adcRef = HAL_ADC_REF_VOLT; +#endif +} + +/************************************************************************************************** + * @fn HalAdcRead + * + * @brief Read the ADC based on given channel and resolution + * + * @param channel - channel where ADC will be read + * @param resolution - the resolution of the value + * + * @return 16 bit value of the ADC in offset binary format. + * + * Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale. + * Note2: This function assumes that ADCCON3 contains the voltage reference. + **************************************************************************************************/ +uint16 HalAdcRead (uint8 channel, uint8 resolution) +{ + int16 reading = 0; + +#if (HAL_ADC == TRUE) + uint8 i, resbits; + uint8 adcChannel = 1; + + /* + * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled. The code + * does NOT disable the pin at the end of this function. I think it is better to leave the pin + * enabled because the results will be more accurate. Because of the inherent capacitance on the + * pin, it takes time for the voltage on the pin to charge up to its steady-state level. If + * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage + * than actuality because the pin did not have time to fully charge. + */ + if (channel < 8) + { + for (i=0; i < channel; i++) + { + adcChannel <<= 1; + } + } + + /* Enable channel */ + ADCCFG |= adcChannel; + + /* Convert resolution to decimation rate */ + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + resbits = HAL_ADC_DEC_064; + break; + case HAL_ADC_RESOLUTION_10: + resbits = HAL_ADC_DEC_128; + break; + case HAL_ADC_RESOLUTION_12: + resbits = HAL_ADC_DEC_256; + break; + case HAL_ADC_RESOLUTION_14: + default: + resbits = HAL_ADC_DEC_512; + break; + } + + /* writing to this register starts the extra conversion */ + ADCCON3 = channel | resbits | adcRef; + + /* Wait for the conversion to be done */ + while (!(ADCCON1 & HAL_ADC_EOC)); + + /* Disable channel after done conversion */ + ADCCFG &= (adcChannel ^ 0xFF); + + /* Read the result */ + reading = (int16) (ADCL); + reading |= (int16) (ADCH << 8); + + /* Treat small negative as 0 */ + if (reading < 0) + reading = 0; + + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + reading >>= 8; + break; + case HAL_ADC_RESOLUTION_10: + reading >>= 6; + break; + case HAL_ADC_RESOLUTION_12: + reading >>= 4; + break; + case HAL_ADC_RESOLUTION_14: + default: + reading >>= 2; + break; + } +#else + // unused arguments + (void) channel; + (void) resolution; +#endif + + return ((uint16)reading); +} + +/************************************************************************************************** + * @fn HalAdcSetReference + * + * @brief Sets the reference voltage for the ADC and initializes the service + * + * @param reference - the reference voltage to be used by the ADC + * + * @return none + * + **************************************************************************************************/ +void HalAdcSetReference ( uint8 reference ) +{ +#if (HAL_ADC == TRUE) + adcRef = reference; +#endif +} + +/********************************************************************* + * @fn HalAdcCheckVdd + * + * @brief Check for minimum Vdd specified. + * + * @param vdd - The board-specific Vdd reading to check for. + * + * @return TRUE if the Vdd measured is greater than the 'vdd' minimum parameter; + * FALSE if not. + * + *********************************************************************/ +bool HalAdcCheckVdd(uint8 vdd) +{ + ADCCON3 = 0x0F; + while (!(ADCCON1 & 0x80)); + return (ADCH > vdd); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.c new file mode 100644 index 0000000..0d98f52 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)0; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_board_cfg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_board_cfg.h new file mode 100644 index 0000000..ebdd422 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_board_cfg.h @@ -0,0 +1,468 @@ +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + +#if !defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_BOARD_CC2530EB_REV13) + #define HAL_BOARD_CC2530EB_REV17 +#endif + +/* Clock Speed */ + +#define HAL_CPU_CLOCK_MHZ 32 + +/* Sleep Clock */ + +#define EXTERNAL_CRYSTAL_OSC 0x00 // external 32kHz XOSC +#define INTERNAL_RC_OSC 0x80 // internal 32kHz RCOSC + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. +#if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == TRUE)) +#define OSC_32KHZ EXTERNAL_CRYSTAL_OSC +#else +#define OSC_32KHZ INTERNAL_RC_OSC +#endif + +// Minimum Time for Stable External 32kHz Clock (in ms) +#define MIN_TIME_TO_STABLE_32KHZ_XOSC 400 + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LED Configuration */ + +#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590) + #define HAL_NUM_LEDS 3 +#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590) + #define HAL_NUM_LEDS 1 +#else + #error Unknown Board Indentifier +#endif + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P1_0 +#define LED1_DDR P1DIR +#define LED1_POLARITY ACTIVE_HIGH + +#ifdef HAL_BOARD_CC2530EB_REV17 + /* 2 - Red */ + #define LED2_BV BV(1) + #define LED2_SBIT P1_1 + #define LED2_DDR P1DIR + #define LED2_POLARITY ACTIVE_HIGH + + /* 3 - Yellow */ + #define LED3_BV BV(4) + #define LED3_SBIT P1_4 + #define LED3_DDR P1DIR + #define LED3_POLARITY ACTIVE_HIGH +#endif + +/* Push Button Configuration */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* S1 */ +#define PUSH1_BV BV(1) +#define PUSH1_SBIT P0_1 + +#ifdef HAL_BOARD_CC2530EB_REV17 + #define PUSH1_POLARITY ACTIVE_HIGH +#elif defined (HAL_BOARD_CC2530EB_REV13) + #define PUSH1_POLARITY ACTIVE_LOW +#else + #error Unknown Board Indentifier +#endif + +/* Joystick Center Press */ +#define PUSH2_BV BV(0) +#define PUSH2_SBIT P2_0 +#define PUSH2_POLARITY ACTIVE_HIGH + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 + +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_PHYS 2048 + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. +#define HAL_FLASH_PAGE_SIZE HAL_FLASH_PAGE_PHYS +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +#define HAL_FLASH_LOCK_BITS 16 + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_NV_PAGE_END 30 +#elif defined HAL_BOARD_CC2541S +#define HAL_NV_PAGE_END 125 +#else +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 +#define VDD_2_0 74 // 2.0 V required to safely read/write internal flash. +#define VDD_2_7 100 // 2.7 V required for the Numonyx device. + +#define VDD_MIN_RUN VDD_2_0 +#define VDD_MIN_NV (VDD_2_0+4) // 5% margin over minimum to survive a page erase and compaction. +#define VDD_MIN_XNV (VDD_2_7+5) // 5% margin over minimum to survive a page erase and compaction. + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} + +/* Board Initialization */ +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} + +/* Debounce */ +#define HAL_DEBOUNCE(expr) { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } } + +/* ----------- Push Buttons ---------- */ +#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) +#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) +#define HAL_PUSH_BUTTON3() (0) +#define HAL_PUSH_BUTTON4() (0) +#define HAL_PUSH_BUTTON5() (0) +#define HAL_PUSH_BUTTON6() (0) + +/* LED's */ + +#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590) + + #define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) + #define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) + #define HAL_TURN_OFF_LED3() st( LED3_SBIT = LED3_POLARITY (0); ) + #define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1() + + #define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) + #define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) + #define HAL_TURN_ON_LED3() st( LED3_SBIT = LED3_POLARITY (1); ) + #define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1() + + #define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) + #define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) + #define HAL_TOGGLE_LED3() st( if (LED3_SBIT) { LED3_SBIT = 0; } else { LED3_SBIT = 1;} ) + #define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1() + + #define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) + #define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) + #define HAL_STATE_LED3() (LED3_POLARITY (LED3_SBIT)) + #define HAL_STATE_LED4() HAL_STATE_LED1() + +#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590) + + #define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) + #define HAL_TURN_OFF_LED2() HAL_TURN_OFF_LED1() + #define HAL_TURN_OFF_LED3() HAL_TURN_OFF_LED1() + #define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1() + + #define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) + #define HAL_TURN_ON_LED2() HAL_TURN_ON_LED1() + #define HAL_TURN_ON_LED3() HAL_TURN_ON_LED1() + #define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1() + + #define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) + #define HAL_TOGGLE_LED2() HAL_TOGGLE_LED1() + #define HAL_TOGGLE_LED3() HAL_TOGGLE_LED1() + #define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1() + + #define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) + #define HAL_STATE_LED2() HAL_STATE_LED1() + #define HAL_STATE_LED3() HAL_STATE_LED1() + #define HAL_STATE_LED4() HAL_STATE_LED1() + +#endif + +/* XNV */ + +#define XNV_SPI_BEGIN() st(P1_3 = 0;) +#define XNV_SPI_TX(x) st(U1CSR &= ~0x02; U1DBUF = (x);) +#define XNV_SPI_RX() U1DBUF +#define XNV_SPI_WAIT_RXRDY() st(while (!(U1CSR & 0x02));) +#define XNV_SPI_END() st(P1_3 = 1;) + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#define XNV_SPI_INIT() \ +st( \ + /* Mode select UART1 SPI Mode as master. */\ + U1CSR = 0; \ + \ + /* Setup for 115200 baud. */\ + U1GCR = 11; \ + U1BAUD = 216; \ + \ + /* Set bit order to MSB */\ + U1GCR |= BV(5); \ + \ + /* Set UART1 I/O to alternate 2 location on P1 pins. */\ + PERCFG |= 0x02; /* U1CFG */\ + \ + /* Select peripheral function on I/O pins but SS is left as GPIO for separate control. */\ + P1SEL |= 0xE0; /* SELP1_[7:4] */\ + /* P1.1,2,3: reset, LCD CS, XNV CS. */\ + P1SEL &= ~0x0E; \ + P1 |= 0x0E; \ + P1_1 = 0; \ + P1DIR |= 0x0E; \ + \ + /* Give UART1 priority over Timer3. */\ + P2SEL &= ~0x20; /* PRI2P1 */\ + \ + /* When SPI config is complete, enable it. */\ + U1CSR |= 0x40; \ + /* Release XNV reset. */\ + P1_1 = 1; \ +) + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC TRUE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES TRUE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA TRUE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD TRUE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + +/* Set to TRUE enable UART usage, FALSE disable it */ +#ifndef HAL_UART + #if (defined ZAPP_P1) || (defined ZAPP_P2) || (defined ZTOOL_P1) || (defined ZTOOL_P2) + #define HAL_UART TRUE + #else + #define HAL_UART FALSE + #endif +#endif + +#if HAL_UART + // Always prefer to use DMA over ISR. + #if HAL_DMA + #ifndef HAL_UART_DMA + #if (defined ZAPP_P1) || (defined ZTOOL_P1) + #define HAL_UART_DMA 1 + #elif (defined ZAPP_P2) || (defined ZTOOL_P2) + #define HAL_UART_DMA 2 + #else + #define HAL_UART_DMA 1 + #endif + #endif + #ifndef HAL_UART_ISR + #define HAL_UART_ISR 0 + #endif + #else + #ifndef HAL_UART_ISR + #if (defined ZAPP_P1) || (defined ZTOOL_P1) + #define HAL_UART_ISR 1 + #elif (defined ZAPP_P2) || (defined ZTOOL_P2) + #define HAL_UART_ISR 2 + #else + #define HAL_UART_ISR 1 + #endif + #endif + #ifndef HAL_UART_DMA + #define HAL_UART_DMA 0 + #endif + #endif + + // Used to set P2 priority - USART0 over USART1 if both are defined. + #if ((HAL_UART_DMA == 1) || (HAL_UART_ISR == 1)) + #define HAL_UART_PRIPO 0x00 + #else + #define HAL_UART_PRIPO 0x40 + #endif + + #else + #define HAL_UART_DMA 0 + #define HAL_UART_ISR 0 +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 0 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BOARD_CFG_H */ + +/******************************************************************************* +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_ccm.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_ccm.h new file mode 100644 index 0000000..2403d09 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_ccm.h @@ -0,0 +1,51 @@ +/************************************************************************************************** + Filename: hal_ccm.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_CCM_H_ +#define HAL_CCM_H_ + +Status_t SSP_CCM_Auth (uint8, uint8 *, uint8 *, uint16, uint8 *, uint16, uint8 *, uint8 *, uint8); +Status_t SSP_CCM_Encrypt (uint8, uint8 *, uint8 *, uint16, uint8 *, uint8 *, uint8); +Status_t SSP_CCM_Decrypt (uint8, uint8 *, uint8 *, uint16, uint8 *, uint8 *, uint8); +Status_t SSP_CCM_InvAuth (uint8, uint8 *, uint8 *, uint16, uint8 *, uint16, uint8 *, uint8 *, uint8); +Status_t SSP_CCM_Auth_Encrypt (bool, uint8, uint8 *, uint8 *, uint16, uint8 *, uint16, uint8 *, uint8 *, uint8); +Status_t SSP_CCM_InvAuth_Decrypt (bool, uint8, uint8 *, uint8 *, uint16, uint8 *, uint16, uint8 *, uint8 *, uint8); + +#endif // HAL_CCM_H_ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_flash.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_key.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_key.c new file mode 100644 index 0000000..365669d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_key.c @@ -0,0 +1,653 @@ +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-12-06 14:00:35 -0800 (Thu, 06 Dec 2012) $ + Revision: $Revision: 32474 $ + + Description: This file contains the interface to the HAL KEY Service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +/********************************************************************* + NOTE: If polling is used, the hal_driver task schedules the KeyRead() + to occur every 100ms. This should be long enough to naturally + debounce the keys. The KeyRead() function remembers the key + state of the previous poll and will only return a non-zero + value if the key state changes. + + NOTE: If interrupts are used, the KeyRead() function is scheduled + 25ms after the interrupt occurs by the ISR. This delay is used + for key debouncing. The ISR disables any further Key interrupt + until KeyRead() is executed. KeyRead() will re-enable Key + interrupts after executing. Unlike polling, when interrupts + are enabled, the previous key state is not remembered. This + means that KeyRead() will return the current state of the keys + (not a change in state of the keys). + + NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by + the ISR. Therefore, the joystick movements will only be detected + during a pushbutton interrupt caused by S1 or the center joystick + pushbutton. + + NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally + high state to a low state. This transition is typically clean. The + duration of the low state is around 200ms. When the signal returns + to the high state, there is a high likelihood of signal bounce, which + causes a unwanted interrupts. Normally, we would set the interrupt + edge to falling edge to generate an interrupt when S1 is pushed, but + because of the signal bounce, it is better to set the edge to rising + edge to generate an interrupt when S1 is released. The debounce logic + can then filter out the signal bounce. The result is that we typically + get only 1 interrupt per button push. This mechanism is not totally + foolproof because occasionally, signal bound occurs during the falling + edge as well. A similar mechanism is used to handle the joystick + pushbutton on the DB. For the EB, we do not have independent control + of the interrupt edge for the S1 and center joystick pushbutton. As + a result, only one or the other pushbuttons work reasonably well with + interrupts. The default is the make the S1 switch on the EB work more + reliably. + +*********************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_key.h" +#include "osal.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_KEY_RISING_EDGE 0 +#define HAL_KEY_FALLING_EDGE 1 + +#define HAL_KEY_DEBOUNCE_VALUE 25 + +/* CPU port interrupt */ +#define HAL_KEY_CPU_PORT_0_IF P0IF +#define HAL_KEY_CPU_PORT_2_IF P2IF + +#if defined ( CC2540_MINIDK ) +/* SW_1 is at P0.0 */ +#define HAL_KEY_SW_1_PORT P0 +#define HAL_KEY_SW_1_BIT BV(0) +#define HAL_KEY_SW_1_SEL P0SEL +#define HAL_KEY_SW_1_DIR P0DIR + +/* SW_2 is at P0.1 */ +#define HAL_KEY_SW_2_PORT P0 +#define HAL_KEY_SW_2_BIT BV(1) +#define HAL_KEY_SW_2_SEL P0SEL +#define HAL_KEY_SW_2_DIR P0DIR + +#define HAL_KEY_SW_1_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_1_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_1_ICTLBIT BV(0) /* P0IEN - P0.0 enable/disable bit */ +#define HAL_KEY_SW_1_IENBIT BV(5) /* Mask bit for all of Port_0 */ + +#define HAL_KEY_SW_1_PXIFG P0IFG /* Interrupt flag at source */ +#define HAL_KEY_SW_2_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_2_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_2_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */ +#define HAL_KEY_SW_2_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_2_PXIFG P0IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_1_EDGEBIT BV(0) + +#else + +/* SW_6 is at P0.1 */ +#define HAL_KEY_SW_6_PORT P0 +#define HAL_KEY_SW_6_BIT BV(1) +#define HAL_KEY_SW_6_SEL P0SEL +#define HAL_KEY_SW_6_DIR P0DIR + +/* edge interrupt */ +#define HAL_KEY_SW_6_EDGEBIT BV(0) +#define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE + +/* SW_6 interrupts */ +#define HAL_KEY_SW_6_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_6_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_6_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_6_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */ +#define HAL_KEY_SW_6_PXIFG P0IFG /* Interrupt flag at source */ + +/* Joy stick move at P2.0 */ +#define HAL_KEY_JOY_MOVE_PORT P2 +#define HAL_KEY_JOY_MOVE_BIT BV(0) +#define HAL_KEY_JOY_MOVE_SEL P2SEL +#define HAL_KEY_JOY_MOVE_DIR P2DIR + +/* edge interrupt */ +#define HAL_KEY_JOY_MOVE_EDGEBIT BV(3) +#define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE + +/* Joy move interrupts */ +#define HAL_KEY_JOY_MOVE_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_JOY_MOVE_IENBIT BV(1) /* Mask bit for all of Port_2 */ +#define HAL_KEY_JOY_MOVE_ICTL P2IEN /* Port Interrupt Control register */ +#define HAL_KEY_JOY_MOVE_ICTLBIT BV(0) /* P2IENL - P2.0<->P2.3 enable/disable bit */ +#define HAL_KEY_JOY_MOVE_PXIFG P2IFG /* Interrupt flag at source */ + +#define HAL_KEY_JOY_CHN HAL_ADC_CHANNEL_6 + +#endif + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +static uint8 halKeySavedKeys; /* used to store previous key state in polling mode */ +static halKeyCBack_t pHalKeyProcessFunction; +static uint8 HalKeyConfigured; +bool Hal_KeyIntEnable; /* interrupt enable/disable flag */ + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +void halProcessKeyInterrupt(void); +uint8 halGetJoyKeyInput(void); + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalKeyInit + * + * @brief Initilize Key Service + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalKeyInit( void ) +{ + halKeySavedKeys = 0; // Initialize previous key to 0. + +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */ + HAL_KEY_SW_2_SEL &= ~(HAL_KEY_SW_2_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_2_DIR &= ~(HAL_KEY_SW_2_BIT); /* Set pin direction to Input */ +#else + HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT); /* Set pin direction to Input */ + HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO */ + HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to Input */ + + P2INP |= PUSH2_BV; /* Configure GPIO tri-state. */ +#endif + + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + /* Start with key is not configured */ + HalKeyConfigured = FALSE; +} + + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief Configure the Key serivce + * + * @param interruptEnable - TRUE/FALSE, enable/disable interrupt + * cback - pointer to the CallBack function + * + * @return None + **************************************************************************************************/ +void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) +{ + /* Enable/Disable Interrupt or */ + Hal_KeyIntEnable = interruptEnable; + + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + + /* Determine if interrupt is enable or not */ + if (Hal_KeyIntEnable) + { +#if defined ( CC2540_MINIDK ) + /* Rising/Falling edge configuratinn */ + PICTL |= HAL_KEY_SW_1_EDGEBIT; /* Set the edge bit to set falling edge to give int */ + + HAL_KEY_SW_1_ICTL |= HAL_KEY_SW_1_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_1_IEN |= HAL_KEY_SW_1_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear any pending interrupt */ + HAL_KEY_SW_2_ICTL |= HAL_KEY_SW_2_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_2_IEN |= HAL_KEY_SW_2_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear any pending interrupt */ + +#else + /* Rising/Falling edge configuratinn */ + PICTL &= ~(HAL_KEY_SW_6_EDGEBIT); /* Clear the edge bit */ + /* For falling edge, the bit must be set. */ + #if (HAL_KEY_SW_6_EDGE == HAL_KEY_FALLING_EDGE) + PICTL |= HAL_KEY_SW_6_EDGEBIT; + #endif + + + /* Interrupt configuration: + * - Enable interrupt generation at the port + * - Enable CPU interrupt + * - Clear any pending interrupt + */ + HAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT; + HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT; + HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); + + + + /* Rising/Falling edge configuratinn */ + + HAL_KEY_JOY_MOVE_ICTL &= ~(HAL_KEY_JOY_MOVE_EDGEBIT); /* Clear the edge bit */ + /* For falling edge, the bit must be set. */ + #if (HAL_KEY_JOY_MOVE_EDGE == HAL_KEY_FALLING_EDGE) + HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_EDGEBIT; + #endif + + + /* Interrupt configuration: + * - Enable interrupt generation at the port + * - Enable CPU interrupt + * - Clear any pending interrupt + */ + HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_ICTLBIT; + HAL_KEY_JOY_MOVE_IEN |= HAL_KEY_JOY_MOVE_IENBIT; + HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); +#endif // !CC2540_MINIDK + + /* Do this only after the hal_key is configured - to work with sleep stuff */ + if (HalKeyConfigured == TRUE) + { + osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */ + } + } + else /* Interrupts NOT enabled */ + { +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_ICTL &= ~(HAL_KEY_SW_1_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_1_IEN &= ~(HAL_KEY_SW_1_IENBIT); /* Clear interrupt enable bit */ + HAL_KEY_SW_2_ICTL &= ~(HAL_KEY_SW_2_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_2_IEN &= ~(HAL_KEY_SW_2_IENBIT); /* Clear interrupt enable bit */ +#else + HAL_KEY_SW_6_ICTL &= ~(HAL_KEY_SW_6_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_6_IEN &= ~(HAL_KEY_SW_6_IENBIT); /* Clear interrupt enable bit */ +#endif // !CC2540_MINIDK + + osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + /* Key now is configured */ + HalKeyConfigured = TRUE; +} + + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief Read the current value of a key + * + * @param None + * + * @return keys - current keys status + **************************************************************************************************/ +uint8 HalKeyRead ( void ) +{ + uint8 keys = 0; + +#if defined (CC2540_MINIDK) + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } +#else +#ifdef HAL_BOARD_CC2530EB_REV17 + if ( (HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active high */ +#elif defined (HAL_BOARD_CC2530EB_REV13) + if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active low */ +#endif + { + keys |= HAL_KEY_SW_6; + } + + if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active low */ + { + keys |= halGetJoyKeyInput(); + } +#endif + return keys; +} + + +/************************************************************************************************** + * @fn HalKeyPoll + * + * @brief Called by hal_driver to poll the keys + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalKeyPoll (void) +{ + uint8 keys = 0; + uint8 notify = 0; +#if defined (CC2540_MINIDK) + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } +#else + if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_6; + } + + if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */ + { + keys = halGetJoyKeyInput(); + } +#endif + + /* If interrupts are not enabled, previous key status and current key status + * are compared to find out if a key has changed status. + */ + if (!Hal_KeyIntEnable) + { + if (keys == halKeySavedKeys) + { + /* Exit - since no keys have changed */ + return; + } + else + { + notify = 1; + } + } + else + { + /* Key interrupt handled here */ + if (keys) + { + notify = 1; + } + } + + /* Store the current keys for comparation next time */ + halKeySavedKeys = keys; + + /* Invoke Callback if new keys were depressed */ + if (notify && (pHalKeyProcessFunction)) + { + (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); + + } +} + +#if !defined ( CC2540_MINIDK ) +/************************************************************************************************** + * @fn halGetJoyKeyInput + * + * @brief Map the ADC value to its corresponding key. + * + * @param None + * + * @return keys - current joy key status + **************************************************************************************************/ +uint8 halGetJoyKeyInput(void) +{ + /* The joystick control is encoded as an analog voltage. + * Read the JOY_LEVEL analog value and map it to joy movement. + */ + uint8 adc; + uint8 ksave0 = 0; + uint8 ksave1; + + /* Keep on reading the ADC until two consecutive key decisions are the same. */ + do + { + ksave1 = ksave0; /* save previouse key reading */ + + adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8); + + if ((adc >= 2) && (adc <= 38)) + { + ksave0 |= HAL_KEY_UP; + } + else if ((adc >= 74) && (adc <= 88)) + { + ksave0 |= HAL_KEY_RIGHT; + } + else if ((adc >= 60) && (adc <= 73)) + { + ksave0 |= HAL_KEY_LEFT; + } + else if ((adc >= 39) && (adc <= 59)) + { + ksave0 |= HAL_KEY_DOWN; + } + else if ((adc >= 89) && (adc <= 100)) + { + ksave0 |= HAL_KEY_CENTER; + } + } while (ksave0 != ksave1); + + return ksave0; +} +#endif + +/************************************************************************************************** + * @fn halProcessKeyInterrupt + * + * @brief Checks to see if it's a valid key interrupt, saves interrupt driven key states for + * processing by HalKeyRead(), and debounces keys by scheduling HalKeyRead() 25ms later. + * + * @param + * + * @return + **************************************************************************************************/ +void halProcessKeyInterrupt (void) +{ + bool valid=FALSE; + +#if defined ( CC2540_MINIDK ) + if( HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) /* Interrupt Flag has been set by SW1 */ + { + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) /* Interrupt Flag has been set by SW2 */ + { + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } +#else + if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) /* Interrupt Flag has been set */ + { + HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT) /* Interrupt Flag has been set */ + { + HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } +#endif + if (valid) + { + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); + } +} + +/************************************************************************************************** + * @fn HalKeyEnterSleep + * + * @brief - Get called to enter sleep mode + * + * @param + * + * @return + **************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** + * @fn HalKeyExitSleep + * + * @brief - Get called when sleep is over + * + * @param + * + * @return - return saved keys + **************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +/*************************************************************************************************** + * INTERRUPT SERVICE ROUTINE + ***************************************************************************************************/ + +/************************************************************************************************** + * @fn halKeyPort0Isr + * + * @brief Port0 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) +{ + HAL_ENTER_ISR(); + +#if defined ( CC2540_MINIDK ) + if ((HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) || (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT)) +#else + if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) +#endif + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_0 + PxIFG has to be cleared before PxIF + */ +#if defined ( CC2540_MINIDK ) + HAL_KEY_SW_1_PXIFG = 0; + HAL_KEY_SW_2_PXIFG = 0; +#else + HAL_KEY_SW_6_PXIFG = 0; +#endif + HAL_KEY_CPU_PORT_0_IF = 0; + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +#if !defined ( CC2540_MINIDK ) +/************************************************************************************************** + * @fn halKeyPort2Isr + * + * @brief Port2 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT) + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_2 + PxIFG has to be cleared before PxIF + Notes: P2_1 and P2_2 are debug lines. + */ + HAL_KEY_JOY_MOVE_PXIFG = 0; + HAL_KEY_CPU_PORT_2_IF = 0; + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} +#endif +#else + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_lcd.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_lcd.c new file mode 100644 index 0000000..b29acf3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_lcd.c @@ -0,0 +1,767 @@ +/************************************************************************************************** + Filename: hal_lcd.c + Revised: $Date: 2012-08-03 14:28:46 -0700 (Fri, 03 Aug 2012) $ + Revision: $Revision: 31092 $ + + Description: This file contains the interface to the HAL LCD Service. + + + Copyright 2007 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "hal_lcd.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "hal_assert.h" + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + #include "DebugTrace.h" +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +/* + LCD pins + + //control + P0.0 - LCD_MODE + P1.1 - LCD_FLASH_RESET + P1.2 - LCD_CS + + //spi + P1.5 - CLK + P1.6 - MOSI + P1.7 - MISO +*/ + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LCD Control lines */ +#define HAL_LCD_MODE_PORT 0 +#define HAL_LCD_MODE_PIN 0 + +#define HAL_LCD_RESET_PORT 1 +#define HAL_LCD_RESET_PIN 1 + +#define HAL_LCD_CS_PORT 1 +#define HAL_LCD_CS_PIN 2 + +/* LCD SPI lines */ +#define HAL_LCD_CLK_PORT 1 +#define HAL_LCD_CLK_PIN 5 + +#define HAL_LCD_MOSI_PORT 1 +#define HAL_LCD_MOSI_PIN 6 + +#define HAL_LCD_MISO_PORT 1 +#define HAL_LCD_MISO_PIN 7 + +/* SPI settings */ +#define HAL_SPI_CLOCK_POL_LO 0x00 +#define HAL_SPI_CLOCK_PHA_0 0x00 +#define HAL_SPI_TRANSFER_MSB_FIRST 0x20 + +/* LCD lines */ +#define LCD_MAX_LINE_COUNT 3 + +/* Defines for HW LCD */ + +/* Set power save mode */ +#define OSC_OFF 0x00 +#define OSC_ON 0x01 +#define POWER_SAVE_OFF 0x00 +#define POWER_SAVE_ON 0x02 +#define SET_POWER_SAVE_MODE(options) HalLcd_HW_Control(0x0C | (options)) + +/* Function Set */ +#define CGROM 0x00 +#define CGRAM 0x01 +#define COM_FORWARD 0x00 +#define COM_BACKWARD 0x02 +#define TWO_LINE 0x00 +#define THREE_LINE 0x04 +#define FUNCTION_SET(options) HalLcd_HW_Control(0x10 | (options)) + +/* Set Display Start Line */ +#define LINE1 0x00 +#define LINE2 0x01 +#define LINE3 0x02 +#define LINE4 0x03 +#define SET_DISPLAY_START_LINE(line) HalLcd_HW_Control(0x18 | (line)) + +/* Bias control */ +#define BIAS_1_5 0x00 +#define BIAS_1_4 0x01 +#define SET_BIAS_CTRL(bias) HalLcd_HW_Control(0x1C | (bias)) + +/* Power control */ +#define VOLTAGE_DIVIDER_OFF 0x00 +#define VOLTAGE_DIVIDER_ON 0x01 +#define CONVERTER_AND_REG_OFF 0x00 +#define CONVERTER_AND_REG_ON 0x04 +#define SET_POWER_CTRL(options) HalLcd_HW_Control(0x20 | (options)) + +// Set display control +#define DISPLAY_CTRL_ON 0x01 +#define DISPLAY_CTRL_OFF 0x00 +#define DISPLAY_CTRL_BLINK_ON 0x02 +#define DISPLAY_CTRL_BLINK_OFF 0x00 +#define DISPLAY_CTRL_CURSOR_ON 0x04 +#define DISPLAY_CTRL_CURSOR_OFF 0x00 +#define SET_DISPLAY_CTRL(options) HalLcd_HW_Control(0x28 | (options)) + +/* Set DD/ CGRAM address */ +#define SET_DDRAM_ADDR(charIndex) HalLcd_HW_Control(0x80 | (charIndex)) +#define SET_GCRAM_CHAR(specIndex) HalLcd_HW_Control(0xC0 | (specIndex)) + +/* Set ICONRAM address */ +#define CONTRAST_CTRL_REGISTER 0x10 +#define SET_ICONRAM_ADDR(addr) HalLcd_HW_Control(0x40 | (addr)) + +/* Set double height */ +#define LINE_1_AND_2 0x01 +#define LINE_2_AND_3 0x02 +#define NORMAL_DISPLAY 0x00 +#define SET_DOUBLE_HEIGHT(options) HalLcd_HW_Control(0x08 | (options)) + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val) +#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) + +#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) +#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define HAL_CONFIG_IO_PERIPHERAL(port, pin) HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) +#define HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + + + +/* SPI interface control */ +#define LCD_SPI_BEGIN() HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 0); /* chip select */ +#define LCD_SPI_END() \ +{ \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); /* chip select */ \ +} +/* clear the received and transmit byte status, write tx data to buffer, wait till transmit done */ +#define LCD_SPI_TX(x) { U1CSR &= ~(BV(2) | BV(1)); U1DBUF = x; while( !(U1CSR & BV(1)) ); } +#define LCD_SPI_WAIT_RXRDY() { while(!(U1CSR & BV(1))); } + + +/* Control macros */ +#define LCD_DO_WRITE() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); +#define LCD_DO_CONTROL() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 0); + +#define LCD_ACTIVATE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0); +#define LCD_RELEASE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +static uint8 *Lcd_Line1; +#endif //LCD + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +void HalLcd_HW_Init(void); +void HalLcd_HW_WaitUs(uint16 i); +void HalLcd_HW_Clear(void); +void HalLcd_HW_ClearAllSpecChars(void); +void HalLcd_HW_Control(uint8 cmd); +void HalLcd_HW_Write(uint8 data); +void HalLcd_HW_SetContrast(uint8 value); +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text); +void HalLcd_HW_WriteLine(uint8 line, const char *pText); +#endif //LCD + +/************************************************************************************************** + * @fn HalLcdInit + * + * @brief Initilize LCD Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcdInit(void) +{ +#if (HAL_LCD == TRUE) + Lcd_Line1 = NULL; + HalLcd_HW_Init(); +#endif +} + +/************************************************************************************************* + * LCD EMULATION FUNCTIONS + * + * Some evaluation boards are equipped with Liquid Crystal Displays + * (LCD) which may be used to display diagnostic information. These + * functions provide LCD emulation, sending the diagnostic strings + * to Z-Tool via the RS232 serial port. These functions are enabled + * when the "LCD_SUPPORTED" compiler flag is placed in the makefile. + * + * Most applications update both lines (1 and 2) of the LCD whenever + * text is posted to the device. This emulator assumes that line 1 is + * updated first (saved locally) and the formatting and send operation + * is triggered by receipt of line 2. Nothing will be transmitted if + * only line 1 is updated. + * + *************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalLcdWriteString + * + * @brief Write a string to the LCD + * + * @param str - pointer to the string that will be displayed + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteString ( char *str, uint8 option) +{ +#if (HAL_LCD == TRUE) + + uint8 strLen = 0; + uint8 totalLen = 0; + uint8 *buf; + uint8 tmpLen; + + if ( Lcd_Line1 == NULL ) + { + Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 ); + HalLcdWriteString( "Texas Instruments", 1 ); + } + + strLen = (uint8)osal_strlen( (char*)str ); + + /* Check boundries */ + if ( strLen > HAL_LCD_MAX_CHARS ) + strLen = HAL_LCD_MAX_CHARS; + + if ( option == HAL_LCD_LINE_1 ) + { + /* Line 1 gets saved for later */ + osal_memcpy( Lcd_Line1, str, strLen ); + Lcd_Line1[strLen] = '\0'; + } + else + { + /* Line 2 triggers action */ + tmpLen = (uint8)osal_strlen( (char*)Lcd_Line1 ); + totalLen = tmpLen + 1 + strLen + 1; + buf = osal_mem_alloc( totalLen ); + if ( buf != NULL ) + { + /* Concatenate strings */ + osal_memcpy( buf, Lcd_Line1, tmpLen ); + buf[tmpLen++] = ' '; + osal_memcpy( &buf[tmpLen], str, strLen ); + buf[tmpLen+strLen] = '\0'; + + /* Send it out */ +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + +#if defined(SERIAL_DEBUG_SUPPORTED) + debug_str( (uint8*)buf ); +#endif //LCD_SUPPORTED + +#endif //ZTOOL_P1 + + /* Free mem */ + osal_mem_free( buf ); + } + } + + /* Display the string */ + HalLcd_HW_WriteLine (option, str); + +#endif //HAL_LCD + +} + +/************************************************************************************************** + * @fn HalLcdWriteValue + * + * @brief Write a value to the LCD + * + * @param value - value that will be displayed + * radix - 8, 10, 16 + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option) +{ +#if (HAL_LCD == TRUE) + uint8 buf[HAL_LCD_MAX_BUFF]; + + _ltoa( value, &buf[0], radix ); + HalLcdWriteString( (char*)buf, option ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteScreen + * + * @brief Write a value to the LCD + * + * @param line1 - string that will be displayed on line 1 + * line2 - string that will be displayed on line 2 + * + * @return None + **************************************************************************************************/ +void HalLcdWriteScreen( char *line1, char *line2 ) +{ +#if (HAL_LCD == TRUE) + HalLcdWriteString( line1, 1 ); + HalLcdWriteString( line2, 2 ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value - value + * format - redix + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ) +{ +#if (HAL_LCD == TRUE) + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen] = ' '; + err = (uint32)(value); + _ltoa( err, &buf[tmpLen+1], format ); + HalLcdWriteString( (char*)buf, line ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value1 - value #1 + * format1 - redix of value #1 + * value2 - value #2 + * format2 - redix of value #2 + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, + uint16 value2, uint8 format2, uint8 line ) +{ + +#if (HAL_LCD == TRUE) + + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + if ( tmpLen ) + { + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen++] = ' '; + } + + err = (uint32)(value1); + _ltoa( err, &buf[tmpLen], format1 ); + tmpLen = (uint8)osal_strlen( (char*)buf ); + + buf[tmpLen++] = ','; + buf[tmpLen++] = ' '; + err = (uint32)(value2); + _ltoa( err, &buf[tmpLen], format2 ); + + HalLcdWriteString( (char *)buf, line ); + +#endif +} + +/************************************************************************************************** + * @fn HalLcdDisplayPercentBar + * + * @brief Display percentage bar on the LCD + * + * @param title - + * value - + * + * @return None + **************************************************************************************************/ +void HalLcdDisplayPercentBar( char *title, uint8 value ) +{ +#if (HAL_LCD == TRUE) + + uint8 percent; + uint8 leftOver; + uint8 buf[17]; + uint32 err; + uint8 x; + + /* Write the title: */ + HalLcdWriteString( title, HAL_LCD_LINE_1 ); + + if ( value > 100 ) + value = 100; + + /* convert to blocks */ + percent = (uint8)(value / 10); + leftOver = (uint8)(value % 10); + + /* Make window */ + osal_memcpy( buf, "[ ] ", 15 ); + + for ( x = 0; x < percent; x ++ ) + { + buf[1+x] = '>'; + } + + if ( leftOver >= 5 ) + buf[1+x] = '+'; + + err = (uint32)value; + _ltoa( err, (uint8*)&buf[13], 10 ); + + HalLcdWriteString( (char*)buf, HAL_LCD_LINE_2 ); + +#endif + +} + + +#if (HAL_LCD == TRUE) +/************************************************************************************************** + * HARDWARE LCD + **************************************************************************************************/ + +/************************************************************************************************** + * @fn halLcd_ConfigIO + * + * @brief Configure IO lines needed for LCD control. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigIO(void) +{ + /* GPIO configuration */ + HAL_CONFIG_IO_OUTPUT(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); +} + +/************************************************************************************************** + * @fn halLcd_ConfigSPI + * + * @brief Configure SPI lines needed for talking to LCD. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigSPI(void) +{ + /* UART/SPI Peripheral configuration */ + + uint8 baud_exponent; + uint8 baud_mantissa; + + /* Set SPI on UART 1 alternative 2 */ + PERCFG |= 0x02; + + /* Configure clk, master out and master in lines */ + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_CLK_PORT, HAL_LCD_CLK_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MOSI_PORT, HAL_LCD_MOSI_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MISO_PORT, HAL_LCD_MISO_PIN); + + + /* Set SPI speed to 1 MHz (the values assume system clk of 32MHz) + * Confirm on board that this results in 1MHz spi clk. + */ + baud_exponent = 15; + baud_mantissa = 0; + + /* Configure SPI */ + U1UCR = 0x80; /* Flush and goto IDLE state. 8-N-1. */ + U1CSR = 0x00; /* SPI mode, master. */ + U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent; + U1BAUD = baud_mantissa; +} + +/************************************************************************************************** + * @fn HalLcd_HW_Init + * + * @brief Initilize HW LCD Driver. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Init(void) +{ + /* Initialize LCD IO lines */ + halLcd_ConfigIO(); + + /* Initialize SPI */ + halLcd_ConfigSPI(); + + /* Perform reset */ + LCD_ACTIVATE_RESET(); + HalLcd_HW_WaitUs(15000); // 15 ms + LCD_RELEASE_RESET(); + HalLcd_HW_WaitUs(15); // 15 us + + /* Perform the initialization sequence */ + FUNCTION_SET(CGRAM | COM_FORWARD | THREE_LINE); + + /* Set contrast */ + HalLcd_HW_SetContrast(15); + + /* Set power */ + SET_POWER_SAVE_MODE(OSC_OFF | POWER_SAVE_ON); + SET_POWER_CTRL(VOLTAGE_DIVIDER_ON | CONVERTER_AND_REG_ON); + SET_BIAS_CTRL(BIAS_1_5); + HalLcd_HW_WaitUs(21000);// 21 ms + + /* Clear the display */ + HalLcd_HW_Clear(); + HalLcd_HW_ClearAllSpecChars(); + SET_DISPLAY_CTRL(DISPLAY_CTRL_ON | DISPLAY_CTRL_BLINK_OFF | DISPLAY_CTRL_CURSOR_OFF); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Control + * + * @brief Write 1 command to the LCD + * + * @param uint8 cmd - command to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Control(uint8 cmd) +{ + LCD_SPI_BEGIN(); + LCD_DO_CONTROL(); + LCD_SPI_TX(cmd); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Write + * + * @brief Write 1 byte to the LCD + * + * @param uint8 data - data to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Write(uint8 data) +{ + LCD_SPI_BEGIN(); + LCD_DO_WRITE(); + LCD_SPI_TX(data); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_SetContrast + * + * @brief Set display contrast + * + * @param uint8 value - contrast value + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_SetContrast(uint8 value) +{ + SET_ICONRAM_ADDR(CONTRAST_CTRL_REGISTER); + HalLcd_HW_Write(value); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Clear + * + * @brief Clear the HW LCD + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Clear(void) +{ + uint8 n; + + SET_DDRAM_ADDR(0x00); + for (n = 0; n < (LCD_MAX_LINE_COUNT * HAL_LCD_MAX_CHARS); n++) + { + HalLcd_HW_Write(' '); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_ClearAllSpecChars + * + * @brief Clear all special chars + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_ClearAllSpecChars(void) +{ + uint8 n = 0; + + SET_GCRAM_CHAR(0); + for (n = 0; n < (8 * 8); n++) + { + HalLcd_HW_Write(0x00); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_WriteChar + * + * @brief Write one char to the display + * + * @param uint8 line - line number that the char will be displayed + * uint8 col - colum where the char will be displayed + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text) +{ + if (col < HAL_LCD_MAX_CHARS) + { + SET_DDRAM_ADDR((line - 1) * HAL_LCD_MAX_CHARS + col); + HalLcd_HW_Write(text); + } + else + { + return; + } +} + +/************************************************************************************************** + * @fn halLcdWriteLine + * + * @brief Write one line on display + * + * @param uint8 line - display line + * char *pText - text buffer to write + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_WriteLine(uint8 line, const char *pText) +{ + uint8 count; + uint8 totalLength = (uint8)osal_strlen( (char *)pText ); + + /* Write the content first */ + for (count=0; countmode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->left = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + // Cancel any overlapping timer for blink events + osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT); + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if ( !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->left--; // Not continuous, reduce count + } + } + else if ( !(sts->left) && !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->mode ^= HAL_LED_MODE_BLINK; // No more blinks + } + else + { + pct = sts->onPct; // Percentage of cycle for on + sts->mode |= HAL_LED_MODE_ON; // Say it's on + HalLedOnOff( led, HAL_LED_MODE_ON ); // Turn it on + } + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + if (leds & HAL_LED_3) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED3(); + } + else + { + HAL_TURN_OFF_LED3(); + } + } + + if (leds & HAL_LED_4) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + HalSleepLedState |= HAL_STATE_LED3() << 2; + HalSleepLedState |= HAL_STATE_LED4() << 3; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_mcu.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_sleep.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_sleep.c new file mode 100644 index 0000000..120188c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_sleep.c @@ -0,0 +1,616 @@ +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2013-03-07 06:38:43 -0800 (Thu, 07 Mar 2013) $ + Revision: $Revision: 33411 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#include "hal_types.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_sleep.h" +#include "hal_led.h" +#include "hal_key.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "hal_drivers.h" +#include "hal_assert.h" +#include "ll_sleep.h" +#include "ll_timer2.h" +#include "ll_math.h" + +/******************************************************************************* + * MACROS + */ + +#ifndef HAL_SLEEP_DEBUG_POWER_MODE +// Set CC2540 power mode; always use PM2. +#define HAL_SLEEP_PREP_POWER_MODE(mode) \ + st( SLEEPCMD &= ~PMODE; /* clear mode bits */ \ + SLEEPCMD |= mode; /* set mode bits */ \ + while (!(STLOAD & LDRDY)); \ + halSleepPconValue = PCON_IDLE; \ + ) +#define HAL_SLEEP_SET_POWER_MODE() \ + halSetSleepMode() + +#else // HAL_SLEEP_DEBUG_POWER_MODE + +// Debug: Don't set power mode, just block until sleep timer interrupt. +#define HAL_SLEEP_PREP_POWER_MODE(mode) /* nothing */ +#define HAL_SLEEP_SET_POWER_MODE() \ + st( while(halSleepInt == FALSE); \ + halSleepInt = FALSE; \ + HAL_DISABLE_INTERRUPTS(); \ + ) +#endif // !HAL_SLEEP_DEBUG_POWER_MODE + +// sleep timer interrupt control +#define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;) // enable sleep timer interrupt +#define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;) // disable sleep timer interrupt +#define HAL_SLEEP_TIMER_CLEAR_INT() st(IRCON &= ~0x80;) // clear sleep interrupt flag + +// backup interrupt enable registers before sleep +#define HAL_SLEEP_IE_BACKUP_AND_DISABLE( ien0, ien1, ien2 ) \ + st( (ien0) = IEN0; \ + (ien1) = IEN1; \ + (ien2) = IEN2; \ + IEN0 &= STIE_BV; \ + IEN1 &= P0IE_BV; \ + IEN2 &= (P1IE_BV|P2IE_BV); \ + ) + +// restore interrupt enable registers before sleep +#define HAL_SLEEP_IE_RESTORE( ien0, ien1, ien2 ) \ + st( IEN0 = (ien0); \ + IEN1 = (ien1); \ + IEN2 = (ien2); \ + ) + +// convert msec to 625 usec units with round +#define HAL_SLEEP_MS_TO_625US( ms ) (((((uint32) (ms)) * 8) + 4) / 5) + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 +#define HAL_SLEEP_MS_TO_32KHZ( ms ) ((((uint32) (ms)) * 4096) / 125) + +// max allowed sleep time in ms +// Note: When OSAL timer was updated to 32 bits, the call to halSleep was +// changed to take a 32-bit osal_timeout value. But since the CC2540 +// previously used a 16 bit ll_McuPrecisionCount, halSleep was modified +// to limit osal_timeout to 16 bits as well (please see SVN rev. 27618). +// However, the max value of the 16 bit ll_McuPrecisionCount is about 41s, +// which is shorter than the max sleep time of 65.535s! So it is possible +// Timer2 rollover could occur during sleep, which could affect when an +// OSAL timer event is generated. The OSAL timer software should +// be updated to use the full 24bit value of Timer2, allowing timer +// events of up to 2.9 hours, but until this can be done properly, the +// max sleep duration will be limited to less than ll_McuPrecisionCount. +// Note: Not an issue for BLE as the max sleep time would have to be less +// than 32s. +#define MAX_SLEEP_TIMEOUT 40000 + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). +#define CC2540_PM0 0 // PM0, Clock oscillators on, voltage regulator on +#define CC2540_PM1 1 // PM1, 32.768 kHz oscillators on, voltage regulator on +#define CC2540_PM2 2 // PM2, 32.768 kHz oscillators on, voltage regulator off +#define CC2540_PM3 3 // PM3, All clock oscillators off, voltage regulator off + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. +#define HAL_SLEEP_OFF CC2540_PM0 +#define HAL_SLEEP_TIMER CC2540_PM2 +#define HAL_SLEEP_DEEP CC2540_PM3 + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms +#define MAX_SLEEP_TIME 16711680 // max time to sleep allowed by ST, in 32kHz ticks + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period +#if !defined (PM_MIN_SLEEP_TIME) +#define PM_MIN_SLEEP_TIME 66 // default to min safe sleep time, in 32kHz ticks +#endif // !PM_MIN_SLEEP_TIME + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). +#if defined( CC2541) || defined( CC2541S ) +#define HAL_SLEEP_ADJ_TICKS 25 // default sleep adjustment, in 32kHz ticks +#else // CC2540 +#define HAL_SLEEP_ADJ_TICKS 35 // default sleep adjustment, in 32kHz ticks +#endif // CC2541 || CC2541S + +// sleep and external interrupt port masks +#define STIE_BV BV(5) +#define P0IE_BV BV(5) +#define P1IE_BV BV(4) +#define P2IE_BV BV(1) + +// for optimized indexing of uint32 +#if HAL_MCU_LITTLE_ENDIAN() +#define UINT32_NDX0 0 +#define UINT32_NDX1 1 +#define UINT32_NDX2 2 +#define UINT32_NDX3 3 +#else +#define UINT32_NDX0 3 +#define UINT32_NDX1 2 +#define UINT32_NDX2 1 +#define UINT32_NDX3 0 +#endif // HAL_MCU_LITTLE_ENDIAN() + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = HAL_SLEEP_OFF; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE +static bool halSleepInt = FALSE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = PCON_IDLE; + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + HAL_DISABLE_INTERRUPTS(); +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // max allowed sleep time in ms + if (osal_timeout > MAX_SLEEP_TIMEOUT) + { + osal_timeout = MAX_SLEEP_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( (halPwrMgtMode == CC2540_PM3), wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_startup.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_timer.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_types.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_uart.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_uart.c new file mode 100644 index 0000000..af90272 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540EB/hal_uart.c @@ -0,0 +1,374 @@ +/************************************************************************************************** + Filename: hal_uart.c + Revised: $Date: 2013-02-06 09:21:21 -0800 (Wed, 06 Feb 2013) $ + Revision: $Revision: 33001 $ + + Description: This file contains the interface to the H/W UART driver. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board_cfg.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#endif + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +void HalUARTIsrDMA(void); + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +#if HAL_UART_DMA +#include "_hal_uart_dma.c" +#endif +#if HAL_UART_ISR +#include "_hal_uart_isr.c" +#endif +#if HAL_UART_SPI +#include "_hal_uart_spi.c" +#endif +#if HAL_UART_USB +#include "_hal_uart_usb.c" +#endif + +/****************************************************************************** + * @fn HalUARTInit + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTInit(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTInitSPI(); + } + else + { + HalUARTInitDMA(); + } +#else +#if HAL_UART_DMA + HalUARTInitDMA(); +#endif +#if HAL_UART_ISR + HalUARTInitISR(); +#endif +#if HAL_UART_SPI + HalUARTInitSPI(); +#endif +#if HAL_UART_USB + HalUARTInitUSB(); +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTOpen + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param port - UART port + * config - contains configuration information + * + * @return Status of the function call + *****************************************************************************/ +uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenISR(config); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenISR(config); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_USB) + HalUARTOpenUSB(config); +#endif +#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) config; // unused argument +#endif + + return HAL_UART_SUCCESS; +} + +/***************************************************************************** + * @fn HalUARTRead + * + * @brief Read a buffer from the UART + * + * @param port - USART module designation + * buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadSPI(buf, len); +#endif + +#if HAL_UART_USB + return HalUARTRx(buf, len); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTWrite + * + * @brief Write a buffer to the UART. + * + * @param port - UART port + * buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteSPI(buf, len); +#endif + +#if HAL_UART_USB + HalUARTTx(buf, len); + return len; +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTSuspend + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTSuspend( void ) +{ +#if HAL_UART_ISR + HalUARTSuspendISR(); +#endif +} + +/****************************************************************************** + * @fn HalUARTResume + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTResume( void ) +{ +#if HAL_UART_ISR + HalUARTResumeISR(); +#endif +} + +/*************************************************************************************************** + * @fn HalUARTPoll + * + * @brief Poll the UART. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTPoll(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTPollSPI(); + } + else + { + HalUARTPollDMA(); + } +#else +#if HAL_UART_DMA + HalUARTPollDMA(); +#endif +#if HAL_UART_ISR + HalUARTPollISR(); +#endif +#if HAL_UART_SPI + HalUARTPollSPI(); +#endif +#if HAL_UART_USB + HalUARTPollUSB(); +#endif +#endif +} + +/************************************************************************************************** + * @fn Hal_UART_RxBufLen() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param port - UART port + * + * @return length of current Rx Buffer + **************************************************************************************************/ +uint16 Hal_UART_RxBufLen( uint8 port ) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailSPI(); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailSPI(); +#endif + +#if HAL_UART_USB + return HalUARTRxAvailUSB(); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + #endif + return 0; +#endif +} + +void HalUARTIsrDMA(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUART_DMAIsrSPI(); + } + else + { + HalUART_DMAIsrDMA(); + } +#elif HAL_UART_DMA + HalUART_DMAIsrDMA(); +#elif HAL_UART_SPI + HalUART_DMAIsrSPI(); +#endif +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_dma.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_dma.c new file mode 100644 index 0000000..ed2b49a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_dma.c @@ -0,0 +1,1074 @@ +/************************************************************************************************** + Filename: _hal_uart_dma.c + Revised: $Date: 2013-02-19 11:10:32 -0800 (Tue, 19 Feb 2013) $ + Revision: $Revision: 33202 $ + + Description: This file contains the interface to the H/W UART driver by DMA. + + A known defect is that when flow control is enabled, the function HalUARTPollTxTrigDMA() can + prematurely invoke HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX) and clobber that last byte of one txBuf[] + block transfer with the first byte of the next txBuf[] block transfer. Additionally, Tx can + become permanently stalled during heavy use and/or simultaeous heavy radio traffic when using + DMA for the Tx and hardware flow control. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef UTXxIE +#undef UTXxIF +#if (HAL_UART_DMA == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF +#elif (HAL_UART_DMA == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_SEL +#if (HAL_UART_DMA == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0x0C // Peripheral I/O Select for Rx/Tx. +#elif (HAL_UART_DMA == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS flow control. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS must be manual. +#define HAL_UART_Px_SEL 0xC0 // Peripheral I/O Select for Rx/Tx. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_DMA == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_DMA == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxDIR +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_DMA == 1) +#define PxDIR P0DIR +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#define DMA_RDYIn P0_4 +#define DMA_RDYOut P0_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_DMA == 2) +#define PxDIR P1DIR +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define DMA_RDYIn P1_4 +#define DMA_RDYOut P1_5 +#define DMA_RDYIn_BIT BV(4) // Same as the I/O Select for CTS flow control. +#define DMA_RDYOut_BIT BV(5) // Same as the I/O Select for manual RTS flow ctrl. +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#if !defined( DMA_PM ) +#if defined POWER_SAVING +#define DMA_PM 1 +#else +#define DMA_PM 0 +#endif // POWER_SAVING +#endif // !DMA_PM + +// For known defects described above in the moduel description, prefer to drive the Tx by ISR vice +// DMA unless H/W flow control is not used and full-throughput on Tx is absolutely essential. +#if !defined HAL_UART_TX_BY_ISR +#define HAL_UART_TX_BY_ISR 1 +#endif + +// TRUE or FALSE whether or not to flush the Rx queue when an Rx overrun is detected. +// Note that when HAL_UART_RX_FLUSH is set to TRUE, then uartRxBug and its hunt for where the Rx +// DMA is working is absolutely necessary because the flush can leave the dmaCfg.rxHead stranded. +#if !defined HAL_UART_RX_FLUSH +#define HAL_UART_RX_FLUSH TRUE +#endif + +// Minimum delay before allowing sleep and/or clearing DMA ready-out after a DMA ready-in ISR. +// ST-ticks for 6-msecs plus 1 tick added for when the dmaRdyDly is forced from zero to 0xFF. +// If a greater delay than 6-msec is configured, then the logic should be changed to use a uint16. +//efine DMA_PM_DLY 198 // 32768 * 0.006 + 1 -> 198. +// This delay should be set as short as possible to work with the max expected latency in the sender +// between its asserting ready-out and its checking of the ready-in response. The RBA Master +// logic in the internal uart-to-uart bridge app checks for ready-in immediately, +// so this is just set to zero. +#define DMA_PM_DLY 0 + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_DMA_RX_MAX +#define HAL_UART_DMA_RX_MAX 128 +#endif +#if !defined HAL_UART_DMA_TX_MAX +#define HAL_UART_DMA_TX_MAX HAL_UART_DMA_RX_MAX +#endif +#if !defined HAL_UART_DMA_HIGH +#define HAL_UART_DMA_HIGH (HAL_UART_DMA_RX_MAX - 1) +#endif +#if !defined HAL_UART_DMA_IDLE +#define HAL_UART_DMA_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif +#if !defined HAL_UART_DMA_FULL +#define HAL_UART_DMA_FULL (HAL_UART_DMA_RX_MAX - 16) +#endif + +// ST-ticks for 1 byte @ 38.4-kB plus 1 tick added for when the txTick is forced from zero to 0xFF. +#define HAL_UART_TX_TICK_MIN 11 + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if HAL_UART_DMA_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_DMA_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint16 rxBuf[HAL_UART_DMA_RX_MAX]; + rxIdx_t rxHead; + rxIdx_t rxTail; +#if HAL_UART_DMA_IDLE + uint8 rxTick; +#endif + +#if HAL_UART_TX_BY_ISR + uint8 txBuf[HAL_UART_DMA_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; +#else + uint8 txBuf[2][HAL_UART_DMA_TX_MAX]; + txIdx_t txIdx[2]; + uint8 txMT; // Indication that at least one of two Tx buffers are free. + uint8 txTick; // ST ticks of delay to allow at least one byte-time at a given baud rate. + uint8 txTrig; // Flag indicating that Tx should be manually triggered after txTick expires. + + // Although all of the txVars above are modified by the Tx-done ISR, only this one should need + // the special volatile consideration by the optimizer (critical sections protect the rest). + volatile uint8 txSel; +#endif + + halUARTCBack_t uartCB; +} uartDMACfg_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_UART_DMA_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(dmaCfg.rxBuf[(IDX)])) +#define HAL_UART_DMA_GET_RX_BYTE(IDX) (*(volatile uint8 *)(dmaCfg.rxBuf+(IDX))) +#define HAL_UART_DMA_CLR_RX_BYTE(IDX) (dmaCfg.rxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) + +#define HAL_UART_DMA_CLR_RDY_OUT() (DMA_RDYOut = 1) +#define HAL_UART_DMA_SET_RDY_OUT() (DMA_RDYOut = 0) + +#define HAL_UART_DMA_RDY_IN() (DMA_RDYIn == 0) +#define HAL_UART_DMA_RDY_OUT() (DMA_RDYOut == 0) + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_DECR(IDX) (IDX)-- +#else +#define HAL_UART_RX_IDX_T_DECR(IDX) st ( \ + if ((IDX)-- == 0) \ + { \ + (IDX) = HAL_UART_DMA_RX_MAX-1; \ + } \ +) +#endif + +#if HAL_UART_DMA_RX_MAX == 256 +#define HAL_UART_RX_IDX_T_INCR(IDX) (IDX)++ +#else +#define HAL_UART_RX_IDX_T_INCR(IDX) st ( \ + if (++(IDX) >= HAL_UART_DMA_RX_MAX) \ + { \ + (IDX) = 0; \ + } \ +) +#endif + +#define HAL_UART_DMA_TX_AVAIL() \ + (dmaCfg.txHead > dmaCfg.txTail) ? \ + (dmaCfg.txHead - dmaCfg.txTail - 1) : \ + (HAL_UART_DMA_TX_MAX - dmaCfg.txTail + dmaCfg.txHead - 1) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// The following two variables are only used when POWER_SAVING is defined. +static volatile uint8 dmaRdyIsr; +static uint8 dmaRdyDly; // Minimum delay before allowing sleep after detecting RdyIn de-asserted. + +static uartDMACfg_t dmaCfg; + +/* Used to walk the dmaCfg.rxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. + * Although not captured in this UART by DMA case, the _hal_uart_spi.c was able to show that the + * immediate buffer area around the spiRxIdx consists of "cleared" uint16 values, + * but 10-16 indices ahead, there are valid SPI packets ready to be parsed. + */ +static rxIdx_t uartRxBug; // Pre-emptive (not empirically determined necessary) use from SPI case. + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrDMA(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +// Invoked by functions in hal_uart.c when this file is included. +static void HalUARTInitDMA(void); +static void HalUARTOpenDMA(halUARTCfg_t *config); +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len); +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len); +static void HalUARTPollDMA(void); +static uint16 HalUARTRxAvailDMA(void); +static uint8 HalUARTBusyDMA(void); +#if !HAL_UART_TX_BY_ISR +static void HalUARTPollTxTrigDMA(void); +static void HalUARTArmTxDMA(void); +#endif + +/****************************************************************************** + * @fn HalUARTInitDMA + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitDMA(void) +{ + halDMADesc_t *ch; +#if (HAL_UART_DMA == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif + PxSEL |= HAL_UART_Px_SEL; // Enable Peripheral control of Rx/Tx on Px. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + if (DMA_PM) + { + // Setup GPIO for interrupts by falling edge on DMA_RDY_IN. + PxIEN |= DMA_RDYIn_BIT; + PICTL |= PICTL_BIT; + + HAL_UART_DMA_CLR_RDY_OUT(); + PxDIR |= DMA_RDYOut_BIT; + } + +#if !HAL_UART_TX_BY_ISR + // Setup Tx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); +#endif + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX ); + + // Abort any pending DMA operations (in case of a soft reset). + HAL_DMA_ABORT_CH( HAL_DMA_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf ); + HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX); + HAL_DMA_ARM_CH(HAL_DMA_CH_RX); + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); +} + +/****************************************************************************** + * @fn HalUARTOpenDMA + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenDMA(halUARTCfg_t *config) +{ + dmaCfg.uartCB = config->callBackFunc; + + // Only supporting subset of baudrate for code size - other is possible. + HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + if (DMA_PM || config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + PxSEL |= HAL_UART_Px_CTS; // Enable Peripheral control of CTS flow control on Px. + } + else + { + UxUCR = UCR_STOP; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + } + + UxCSR = (CSR_MODE | CSR_RE); + + if (DMA_PM) + { + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; + } + else if (UxUCR & UCR_FLOW) + { + // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the + // circular Rx queue depth. Start by allowing flow. + HAL_UART_DMA_SET_RDY_OUT(); + PxDIR |= HAL_UART_Px_RTS; + } + +#if HAL_UART_TX_BY_ISR + UTXxIF = 1; // Prime the ISR pump. +#endif +} + +/***************************************************************************** + * @fn HalUARTReadDMA + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len) +{ + uint16 cnt; + + for (cnt = 0; cnt < len; cnt++) + { + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + break; + } + *buf++ = HAL_UART_DMA_GET_RX_BYTE(dmaCfg.rxHead); + HAL_UART_DMA_CLR_RX_BYTE(dmaCfg.rxHead); + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + if (HalUARTRxAvailDMA() < HAL_UART_DMA_HIGH) + { + HAL_UART_DMA_SET_RDY_OUT(); // Re-enable the flow asap (i.e. not wait until next uart poll). + } + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteDMA + * + * @brief Write a buffer to the UART, enforcing an all or none policy if the requested length + * exceeds the space available. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len) +{ +#if HAL_UART_TX_BY_ISR + // Enforce all or none. + if (HAL_UART_DMA_TX_AVAIL() < len) + { + return 0; + } + + for (uint16 cnt = 0; cnt < len; cnt++) + { + dmaCfg.txBuf[dmaCfg.txTail] = *buf++; + dmaCfg.txMT = 0; + + if (dmaCfg.txTail >= HAL_UART_DMA_TX_MAX-1) + { + dmaCfg.txTail = 0; + } + else + { + dmaCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } +#else + txIdx_t txIdx; + uint8 txSel; + halIntState_t his; + + HAL_ENTER_CRITICAL_SECTION(his); + txSel = dmaCfg.txSel; + txIdx = dmaCfg.txIdx[txSel]; + HAL_EXIT_CRITICAL_SECTION(his); + + // Enforce all or none. + if ((len + txIdx) > HAL_UART_DMA_TX_MAX) + { + return 0; + } + + (void)memcpy(&(dmaCfg.txBuf[txSel][txIdx]), buf, len); + + HAL_ENTER_CRITICAL_SECTION(his); + /* If an ongoing DMA Tx finished while this buffer was being *appended*, then another DMA Tx + * will have already been started on this buffer, but it did not include the bytes just appended. + * Therefore these bytes have to be re-copied to the start of the new working buffer. + */ + if (txSel != dmaCfg.txSel) + { + HAL_EXIT_CRITICAL_SECTION(his); + txSel ^= 1; + + (void)memcpy(&(dmaCfg.txBuf[txSel][0]), buf, len); + HAL_ENTER_CRITICAL_SECTION(his); + dmaCfg.txIdx[txSel] = len; + } + else + { + dmaCfg.txIdx[txSel] = txIdx + len; + } + + // If there is no ongoing DMA Tx, then the channel must be armed here. + if (dmaCfg.txIdx[(txSel ^ 1)] == 0) + { + HAL_EXIT_CRITICAL_SECTION(his); + HalUARTArmTxDMA(); + } + else + { + dmaCfg.txMT = FALSE; + HAL_EXIT_CRITICAL_SECTION(his); + } +#endif + + return len; +} + +/****************************************************************************** + * @fn HalUARTPollDMA + * + * @brief Poll a USART module implemented by DMA, including the hybrid solution in which the Rx + * is driven by DMA but the Tx is driven by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollDMA(void) +{ + uint8 evt = 0; + uint16 cnt; + +#if DMA_PM + PxIEN &= ~DMA_RDYIn_BIT; // Clear to not race with DMA_RDY_IN ISR. + { + if (dmaRdyIsr || HAL_UART_DMA_RDY_IN() || HalUARTBusyDMA()) + { + // Master may have timed-out the SRDY asserted state & may need a new edge. +#if HAL_UART_TX_BY_ISR + if (!HAL_UART_DMA_RDY_IN() && (dmaCfg.txHead != dmaCfg.txTail)) +#else + if (!HAL_UART_DMA_RDY_IN() && ((dmaCfg.txIdx[0] != 0) || (dmaCfg.txIdx[1] != 0))) +#endif + { + HAL_UART_DMA_CLR_RDY_OUT(); + } + dmaRdyIsr = 0; + + if (dmaRdyDly == 0) + { + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + + if ((dmaRdyDly = ST0) == 0) // Reserve zero to signify that the delay expired. + { + dmaRdyDly = 0xFF; + } + HAL_UART_DMA_SET_RDY_OUT(); + } + else if ((dmaRdyDly != 0) && (!DMA_PM_DLY || ((uint8)(ST0 - dmaRdyDly) > DMA_PM_DLY))) + { + dmaRdyDly = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + PxIEN |= DMA_RDYIn_BIT; +#endif + +#if !HAL_UART_TX_BY_ISR + HalUARTPollTxTrigDMA(); +#endif + + if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)) + { + if (HAL_UART_DMA_NEW_RX_BYTE(uartRxBug)) + { + do { + HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead); + } while (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead)); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + HAL_UART_RX_IDX_T_INCR(uartRxBug); + } + + cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around. + +#if HAL_UART_DMA_IDLE + if (dmaCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway) to measure the Rx timeout. + if ((ST0 - dmaCfg.rxTick) > HAL_UART_DMA_IDLE) + { + dmaCfg.rxTick = 0; + evt = HAL_UART_RX_TIMEOUT; + } + } + else if (cnt != 0) + { + if ((dmaCfg.rxTick = ST0) == 0) // Zero signifies that the Rx timeout is not running. + { + dmaCfg.rxTick = 0xFF; + } + } +#else + if (cnt != 0) + { + evt = HAL_UART_RX_TIMEOUT; + } +#endif + + if (cnt >= HAL_UART_DMA_FULL) + { + evt |= HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_DMA_HIGH) + { + evt |= HAL_UART_RX_ABOUT_FULL; + + if (!DMA_PM && (UxUCR & UCR_FLOW)) + { + HAL_UART_DMA_CLR_RDY_OUT(); // Disable Rx flow. + } + } + + if (dmaCfg.txMT) + { + dmaCfg.txMT = FALSE; + evt |= HAL_UART_TX_EMPTY; + } + + if ((evt != 0) && (dmaCfg.uartCB != NULL)) + { + dmaCfg.uartCB(HAL_UART_DMA-1, evt); + } + + if (DMA_PM && (dmaRdyDly == 0) && !HalUARTBusyDMA()) + { + HAL_UART_DMA_CLR_RDY_OUT(); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailDMA() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailDMA(void) +{ + // First, synchronize the Rx tail marker with where the DMA Rx engine is working. + rxIdx_t tail = dmaCfg.rxTail; + + do + { + if (!HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + break; + } + + HAL_UART_RX_IDX_T_INCR(tail); + } while (tail != dmaCfg.rxHead); + + dmaCfg.rxTail = tail; + + uint16 cnt = tail - dmaCfg.rxHead; + + // If the DMA Rx may have overrun the circular queue, investigate further. + if ((cnt == 0) && HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + /* Ascertain whether this polling is racing with the DMA Rx which may have clocked in a byte + * since walking the tail. The Rx queue has wrapped only if the byte before the head is new. + */ + tail = dmaCfg.rxHead; + HAL_UART_RX_IDX_T_DECR(tail); + + if (HAL_UART_DMA_NEW_RX_BYTE(tail)) + { + if (HAL_UART_RX_FLUSH) + { + (void)memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*2); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + else + { + cnt = HAL_UART_DMA_RX_MAX; + } + } + else + { + cnt = 1; + } + } + else if (cnt > HAL_UART_DMA_RX_MAX) // If the tail has wrapped at the end of the Rx queue. + { + cnt += HAL_UART_DMA_RX_MAX; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTBusyDMA + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +static uint8 HalUARTBusyDMA( void ) +{ +#if HAL_UART_TX_BY_ISR + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txHead == dmaCfg.txTail)); +#else + return !((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txIdx[0] == 0) && (dmaCfg.txIdx[1] == 0)); +#endif +} + +#if !HAL_UART_TX_BY_ISR +/****************************************************************************** + * @fn HalUARTPollTxTrigDMA + * + * @brief Ascertain whether a manual trigger is required for the DMA Tx channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTPollTxTrigDMA(void) +{ + if ((UxCSR & CSR_TX_BYTE) == 0) // If no TXBUF to shift register transfer, then TXBUF may be MT. + { + if ((dmaCfg.txTick == 0) || ((uint8)(ST0 - dmaCfg.txTick) > HAL_UART_TX_TICK_MIN)) + { + dmaCfg.txTick = 0; + + if (dmaCfg.txTrig && HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)) + { + HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX); + } + dmaCfg.txTrig = 0; + } + } + else + { + UxCSR = (CSR_MODE | CSR_RE); // Clear the CSR_TX_BYTE flag. + dmaCfg.txTick = ST0; + + if (dmaCfg.txTick == 0) // Reserve zero to signify that the minimum delay has been met. + { + dmaCfg.txTick = 0xFF; + } + } +} + +/****************************************************************************** + * @fn HalUARTArmTxDMA + * + * @brief Arm the Tx DMA channel. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTArmTxDMA(void) +{ + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX); + HAL_DMA_SET_SOURCE(ch, dmaCfg.txBuf[dmaCfg.txSel]); + HAL_DMA_SET_LEN(ch, dmaCfg.txIdx[dmaCfg.txSel]); + + dmaCfg.txSel ^= 1; + dmaCfg.txTrig = 1; + HAL_DMA_ARM_CH(HAL_DMA_CH_TX); + + HalUARTPollTxTrigDMA(); + + if (DMA_PM) + { + HAL_UART_DMA_SET_RDY_OUT(); + } +} +#endif + +/****************************************************************************** + * @fn HalUART_DMAIsrDMA + * + * @brief Handle the Tx done DMA ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUART_DMAIsrDMA(void) +{ +#if !HAL_UART_TX_BY_ISR + if (dmaCfg.txIdx[dmaCfg.txSel]) + { + // If there is more Tx data ready to go, re-arm the DMA immediately on it. + HalUARTArmTxDMA(); + + // Indicate that the Tx buffer just finished is now free (re-arming did a ^= toggle of txSel). + dmaCfg.txIdx[dmaCfg.txSel] = 0; + } + else + { + dmaCfg.txIdx[(dmaCfg.txSel ^ 1)] = 0; // Indicate that the Tx buffer just finished is now free. + + // Clear the CSR_TX_BYTE flag & start the txTick to allow the possibility of an immediate + // manual trigger from the next Write(), if it occurs more than one character time later. + HalUARTPollTxTrigDMA(); + } + + dmaCfg.txMT = TRUE; // Notify CB that at least one Tx buffer is now free to use. +#endif +} + +#if DMA_PM +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + PxIFG = 0; + PxIF = 0; + + dmaRdyIsr = 1; + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +} +#endif + +#if HAL_UART_TX_BY_ISR +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_DMA == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (dmaCfg.txHead == dmaCfg.txTail) + { + IEN2 &= ~UTXxIE; + dmaCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; + + if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) + { + dmaCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_isr.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_isr.c new file mode 100644 index 0000000..60c81b4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_isr.c @@ -0,0 +1,662 @@ +/************************************************************************************************** + Filename: _hal_uart_isr.c + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the H/W UART driver by ISR. + + Note that when using this interrupt service based UART configuration (as opposed to DMA) the + higher baudrates, such as 115200bps, may suffer Rx overrun, especially when the radio is used + simultaneously and/or there is heavy to full throughout and/or full-duplex data. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_uart.h" + +/********************************************************************* + * MACROS + */ + +//#define HAL_UART_ASSERT(expr) HAL_ASSERT((expr)) +#define HAL_UART_ASSERT(expr) + +#define HAL_UART_ISR_RX_AVAIL() \ + (isrCfg.rxTail >= isrCfg.rxHead) ? \ + (isrCfg.rxTail - isrCfg.rxHead) : \ + (HAL_UART_ISR_RX_MAX - isrCfg.rxHead + isrCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ + (isrCfg.txHead > isrCfg.txTail) ? \ + (isrCfg.txHead - isrCfg.txTail - 1) : \ + (HAL_UART_ISR_TX_MAX - isrCfg.txTail + isrCfg.txHead - 1) + +/********************************************************************* + * CONSTANTS + */ + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define UTX1IE 0x08 + +#define P2DIR_PRIPO 0xC0 + +// Incompatible redefinitions result with more than one UART driver sub-module. +#undef PxOUT +#undef PxDIR +#undef PxSEL +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#undef URXxIE +#undef URXxIF +#undef UTXxIE +#undef UTXxIF +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_Px_RTS +#undef HAL_UART_Px_CTS +#undef HAL_UART_Px_RX_TX +#undef HAL_UART_Px_RX +#undef PxIFG +#undef PxIF +#undef PxIEN +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if (HAL_UART_ISR == 1) +#define PxOUT P0 +#define PxIN P0 +#define PxDIR P0DIR +#define PxSEL P0SEL +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#define URXxIE URX0IE +#define URXxIF URX0IF +#define UTXxIE UTX0IE +#define UTXxIF UTX0IF + +#define PxIFG P0IFG +#define PxIF P0IF +#define PxIEN P0IEN +#define PICTL_BIT 0x01 +#define IENx IEN1 +#define IEN_BIT 0x20 + +#else +#define PxOUT P1 +#define PxIN P1 +#define PxDIR P1DIR +#define PxSEL P1SEL +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#define URXxIE URX1IE +#define URXxIF URX1IF +#define UTXxIE UTX1IE +#define UTXxIF UTX1IF + +#define PxIFG P1IFG +#define PxIF P1IF +#define PxIEN P1IEN +#define PICTL_BIT 0x04 +#define IENx IEN2 +#define IEN_BIT 0x10 +#endif + +#if (HAL_UART_ISR == 1) +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_Px_RX_TX 0x0C // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x04 // Peripheral I/O Select for Rx. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#else +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS. +#define HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS. +#define HAL_UART_Px_RX_TX 0xC0 // Peripheral I/O Select for Rx/Tx. +#define HAL_UART_Px_RX 0x80 // Peripheral I/O Select for Rx. +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_ISR_RX_MAX +#define HAL_UART_ISR_RX_MAX 128 +#endif +#if !defined HAL_UART_ISR_TX_MAX +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX +#endif +#if !defined HAL_UART_ISR_HIGH +#define HAL_UART_ISR_HIGH (HAL_UART_ISR_RX_MAX / 2 - 16) +#endif +#if !defined HAL_UART_ISR_IDLE +#define HAL_UART_ISR_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +#if HAL_UART_ISR_RX_MAX <= 256 +typedef uint8 rxIdx_t; +#else +typedef uint16 rxIdx_t; +#endif + +#if HAL_UART_ISR_TX_MAX <= 256 +typedef uint8 txIdx_t; +#else +typedef uint16 txIdx_t; +#endif + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + rxIdx_t rxHead; + volatile rxIdx_t rxTail; + uint8 rxTick; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; + + halUARTCBack_t uartCB; +} uartISRCfg_t; + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uartISRCfg_t isrCfg; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void HalUARTInitISR(void); +static void HalUARTOpenISR(halUARTCfg_t *config); +static uint16 HalUARTReadISR(uint8 *buf, uint16 len); +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len); +static void HalUARTPollISR(void); +static uint16 HalUARTRxAvailISR(void); +static uint8 HalUARTBusyISR(void); +static void HalUARTSuspendISR(void); +static void HalUARTResumeISR(void); + +/****************************************************************************** + * @fn HalUARTInitISR + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitISR(void) +{ + // Set P2 priority - USART0 over USART1 if both are defined. + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + +#if (HAL_UART_ISR == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O location to P1. +#endif + PxSEL |= HAL_UART_Px_RX_TX; // Enable Tx and Rx on P1. + ADCCFG &= ~HAL_UART_Px_RX_TX; // Make sure ADC doesnt use this. + UxCSR = CSR_MODE; // Mode is UART Mode. + UxUCR = UCR_FLUSH; // Flush it. +} + +/****************************************************************************** + * @fn HalUARTOpenISR + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenISR(halUARTCfg_t *config) +{ + isrCfg.uartCB = config->callBackFunc; + // Only supporting subset of baudrate for code size - other is possible. + HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + if (config->baudRate == HAL_UART_BR_57600 || + config->baudRate == HAL_UART_BR_115200) + { + UxBAUD = 216; + } + else + { + UxBAUD = 59; + } + + switch (config->baudRate) + { + case HAL_UART_BR_9600: + UxGCR = 8; + break; + case HAL_UART_BR_19200: + UxGCR = 9; + break; + case HAL_UART_BR_38400: + case HAL_UART_BR_57600: + UxGCR = 10; + break; + default: + // HAL_UART_BR_115200 + UxGCR = 11; + break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + if (config->flowControl) + { + UxUCR = UCR_FLOW | UCR_STOP; + PxSEL |= HAL_UART_Px_RTS | HAL_UART_Px_CTS; + PxOUT &= ~HAL_UART_Px_RTS; + PxDIR |= HAL_UART_Px_RTS; + } + else + { + UxUCR = UCR_STOP; + } + + URXxIE = 1; + UTXxIF = 1; // Prime the ISR pump. + UxCSR = (CSR_MODE | CSR_RE); +} + +/***************************************************************************** + * @fn HalUARTReadISR + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadISR(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((isrCfg.rxHead != isrCfg.rxTail) && (cnt < len)) + { + *buf++ = isrCfg.rxBuf[isrCfg.rxHead++]; + if (isrCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteISR + * + * @brief Write a buffer to the UART. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteISR(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Enforce all or none. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + isrCfg.txBuf[isrCfg.txTail] = *buf++; + isrCfg.txMT = 0; + + if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1) + { + isrCfg.txTail = 0; + } + else + { + isrCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTXxIE; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTPollISR + * + * @brief Poll a USART module implemented by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollISR(void) +{ + uint16 cnt = HAL_UART_ISR_RX_AVAIL(); + uint8 evt = 0; + + if (isrCfg.rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - isrCfg.rxShdw; + + if (isrCfg.rxTick > decr) + { + isrCfg.rxTick -= decr; + } + else + { + isrCfg.rxTick = 0; + } + } + isrCfg.rxShdw = ST0; + + if (cnt >= HAL_UART_ISR_RX_MAX-1) + { + evt = HAL_UART_RX_FULL; + } + else if (cnt >= HAL_UART_ISR_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !isrCfg.rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (isrCfg.txMT) + { + isrCfg.txMT = 0; + evt |= HAL_UART_TX_EMPTY; + } + + if (evt && (isrCfg.uartCB != NULL)) + { + isrCfg.uartCB(HAL_UART_ISR-1, evt); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailISR() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailISR(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +/****************************************************************************** + * @fn HalUARTBusyISR + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +uint8 HalUARTBusyISR( void ) +{ + return ((!(UxCSR & (CSR_ACTIVE | CSR_RX_BYTE))) && + (isrCfg.rxHead == isrCfg.rxTail) && (isrCfg.txHead == isrCfg.txTail)); +} + +/****************************************************************************** + * @fn HalUARTSuspendISR + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTSuspendISR( void ) +{ +#if defined POWER_SAVING + UxCSR = CSR_MODE; // Suspend Rx operations. + + if (UxUCR & UCR_FLOW) + { + PxOUT |= HAL_UART_Px_RTS; // Disable Rx flow. + PxIFG = (HAL_UART_Px_CTS ^ 0xFF); + PxIEN |= HAL_UART_Px_CTS; // Enable the CTS ISR. + } + else + { + PxIFG = (HAL_UART_Px_RX ^ 0xFF); + PxIEN |= HAL_UART_Px_RX; // Enable the Rx ISR. + } + +#if defined HAL_UART_GPIO_ISR + PxIF = 0; // Clear the next level. + PICTL |= PICTL_BIT; // Interrupt on falling edge of input. + IENx |= IEN_BIT; +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTResumeISR + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +static void HalUARTResumeISR( void ) +{ +#if defined POWER_SAVING +#if defined HAL_UART_GPIO_ISR + IENx &= (IEN_BIT ^ 0xFF); +#endif + + if (UxUCR & UCR_FLOW) + { + PxIEN &= (HAL_UART_Px_CTS ^ 0xFF); // Disable the CTS ISR. + PxOUT &= (HAL_UART_Px_RTS ^ 0xFF); // Re-enable Rx flow. + } + else + { + PxIEN &= (HAL_UART_Px_RX ^ 0xFF); // Enable the Rx ISR. + } + + UxUCR |= UCR_FLUSH; + UxCSR = (CSR_MODE | CSR_RE); +#endif +} + +/*************************************************************************************************** + * @fn halUartRxIsr + * + * @brief UART Receive Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + uint8 tmp = UxDBUF; + isrCfg.rxBuf[isrCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (isrCfg.rxHead == isrCfg.rxTail) + { + isrCfg.rxShdw = ST0; + } + + if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + isrCfg.rxTail = 0; + } + + isrCfg.rxTick = HAL_UART_ISR_IDLE; + + HAL_EXIT_ISR(); +} + +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) +#else +HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR ) +#endif +{ + HAL_ENTER_ISR(); + + if (isrCfg.txHead == isrCfg.txTail) + { + IEN2 &= ~UTXxIE; + isrCfg.txMT = 1; + } + else + { + UTXxIF = 0; + UxDBUF = isrCfg.txBuf[isrCfg.txHead++]; + + if (isrCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + isrCfg.txHead = 0; + } + } + + HAL_EXIT_ISR(); +} + +#if (defined POWER_SAVING && defined HAL_UART_GPIO_ISR) +/*************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief This function is the PortX interrupt service routine. + * + * @param None. + * + * @return None. + ***************************************************************************************************/ +#if (HAL_UART_ISR == 1) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#else +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + HalUARTResume(); + if (dmaCfg.uartCB != NULL) + { + dmaCfg.uartCB(HAL_UART_DMA-1, HAL_UART_RX_WAKEUP); + } + PxIFG = 0; + PxIF = 0; + + HAL_EXIT_ISR(); +} +#endif + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_spi.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_spi.c new file mode 100644 index 0000000..c2282cd --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_spi.c @@ -0,0 +1,1075 @@ +/************************************************************************************************** + Filename: _hal_uart_spi.c + Revised: $Date: 2013-02-06 09:21:21 -0800 (Wed, 06 Feb 2013) $ + Revision: $Revision: 33001 $ + + Description: Implementation of a specialized SPI Transport driver for emulating a UART API. + + Concept of Operation for porting this code to act as a SPI Master: + + 5 GPIO lines are required: MOSI, MISO, SPI Clock, SPI CSn/MRDY, and SRDY. + MRDY = SPI Master Ready to send and serves as a SPI Slave wakeup from sleep. + SRDY = SPI Slave Ready to send and serves as a SPI Master wakeup from sleep. + + SRDY also serves as an indication that the Slave has awoken from sleep and is ready to recieve + as follows: when the Slave has no message ready, it will toggle the state of its SRDY on every + falling edge of the CSn/MRDY. The SPI Slave has a configurable time delay before re-enabling + sleep after being awoken. + + The SPI Slave does not re-enter sleep for the following conditions: + - Slave is asserting SRDY (i.e. it is waiting to send a SPI packet). + - Master is asserting MRDY. + - Slave has parsed the SOF byte of a SPI packet, but has not received the entire packet yet. + Note how important this case is to support a master that has to interrupt a SPI packet + transmission in order to service a higher priority SPI slave (i.e. the master has executed the + protocol to ensure that the SPI slave is awake, but cannot hold MRDY low for the entire, + contiguous packet for having to service some other SPI slave mid-packet). + + Any transfer, from one byte to SPI_MAX_DAT_LEN bytes is packetized by pre-pending an SOF & LEN + byte and appending an FCS byte. The FCS is calculated over the data payload and the LEN bytes. + + Only Full-Duplex transfers are supported - at any byte of a Tx transfer, + the incoming bytes may not be just garbage bytes clocked out by the synchronous transfer, but + instead be meaningful bytes of a Tx-packet from the other side. Thus, the necessity of concocting + the concept of the SPI transfer packet described above. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include + +#include "hal_assert.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#elif defined HAL_SPI_QUEUED_TX && HAL_SPI_QUEUED_TX +#include "OSAL.h" +#endif + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* The bridge utility application uses 4 DMA channels for 2 sets of Rx/Tx by DMA, and thereby also + * implements a special DMA ISR handler, which accomodates this extra definition. + */ +#if !defined HAL_SPI_CH_RX +#define HAL_SPI_CH_RX HAL_DMA_CH_RX +#endif +#if !defined HAL_SPI_CH_TX +#define HAL_SPI_CH_TX HAL_DMA_CH_TX +#endif + +// Overlay the SPI Rx/Tx buffers on the UART Rx/Tx buffers when running with a run-time selectable +// UART port by SPI or by UART in order to save XDATA space. +#if !defined HAL_SPI_ON_UART_BUFS +#define HAL_SPI_ON_UART_BUFS FALSE +#endif + +#if !defined HAL_SPI_QUEUED_TX +#define HAL_SPI_QUEUED_TX FALSE +#endif + +#define SPI_MAX_PKT_LEN 256 +#define SPI_MAX_DAT_LEN (SPI_MAX_PKT_LEN - SPI_FRM_LEN) + +#define SPI_SOF 0xFE // Start-of-frame delimiter for SPI transport. + +// The FCS is calculated over the SPI Frame Header and the Frame Data bytes. +#define SPI_HDR_LEN 1 // One byte LEN pre-pended to data byte array. +// SOF & Header bytes pre-pended and the FCS byte appended. +#define SPI_FRM_LEN (2 + SPI_HDR_LEN) + +#define SPI_SOF_IDX 0 +#define SPI_HDR_IDX 1 // The frame header consists only of the LEN byte for now. +#define SPI_LEN_IDX 1 // LEN byte is offset by the SOF byte. +#define SPI_DAT_IDX 2 // Data bytes are offset by the SOF & LEN bytes. + +#if defined HAL_SPI_MASTER +// If POWER_SAVING is enabled in the 8051-SOC slave, then any master transmit must be preceded by a +// dummy zero byte transfer to give the slave time to wake from PM2/3 & enable its 1.8V and signal +// such success by responding with its SRDY active low. +#if !defined HAL_SPI_WAKEUP +#define HAL_SPI_WAKEUP TRUE +#endif +#endif + +#if !defined HAL_UART_SPI +#define HAL_UART_SPI 2 +#elif (HAL_UART_SPI != 2) +#error Only supporting HAL_UART_SPI==2 for now. +#endif + +// UxCSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// UxUCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define P2DIR_PRIPO 0xC0 + +#define HAL_DMA_U0DBUF 0x70C1 +#define HAL_DMA_U1DBUF 0x70F9 + +#undef UxCSR +#undef UxUCR +#undef UxDBUF +#undef UxBAUD +#undef UxGCR +#if (HAL_UART_SPI == 1) +#define UxCSR U0CSR +#define UxUCR U0UCR +#define UxDBUF U0DBUF +#define UxBAUD U0BAUD +#define UxGCR U0GCR +#elif (HAL_UART_SPI == 2) +#define UxCSR U1CSR +#define UxUCR U1UCR +#define UxDBUF U1DBUF +#define UxBAUD U1BAUD +#define UxGCR U1GCR +#endif + +#undef PxSEL +#undef HAL_UART_PERCFG_BIT +#undef HAL_UART_PRIPO +#undef HAL_UART_Px_SEL_S +#undef HAL_UART_Px_SEL_M +#if (HAL_UART_SPI == 1) +#define PxSEL P0SEL +#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P0, Alt-1; so clear this bit. +#define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. +#define HAL_UART_Px_SEL_S 0x3C // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0x2C // Peripheral I/O Select for Master: MI/MO/CLK. +#elif (HAL_UART_SPI == 2) +#define PxSEL P1SEL +#define HAL_UART_PERCFG_BIT 0x02 // USART1 on P1, Alt-2; so set this bit. +#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0. +#define HAL_UART_Px_SEL_S 0xF0 // Peripheral I/O Select for Slave: SO/SI/CLK/CSn. +#define HAL_UART_Px_SEL_M 0xE0 // Peripheral I/O Select for Master: MI/MO/CLK. +#endif + +#undef DMA_PAD +#undef DMA_UxDBUF +#undef DMATRIG_RX +#undef DMATRIG_TX +#if (HAL_UART_SPI == 1) +#define DMA_PAD U0BAUD +#define DMA_UxDBUF HAL_DMA_U0DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX0 +#define DMATRIG_TX HAL_DMA_TRIG_UTX0 +#elif (HAL_UART_SPI == 2) +#define DMA_PAD U1BAUD +#define DMA_UxDBUF HAL_DMA_U1DBUF +#define DMATRIG_RX HAL_DMA_TRIG_URX1 +#define DMATRIG_TX HAL_DMA_TRIG_UTX1 +#endif + +#undef PxIEN +#undef PxIFG +#undef PxIF +#undef PICTL_BIT +#undef IENx +#undef IEN_BIT +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxIEN P0IEN +#define PxIFG P0IFG +#define PxIF P0IF +#if !defined SPI_RDYIn +#define SPI_RDYIn P0_1 +#define SPI_RDYIn_BIT BV(1) +#endif +// Falling edge ISR on P0 pins. +#define PICTL_BIT BV(0) +#define IENx IEN1 +#define IEN_BIT BV(5) +#elif (HAL_UART_SPI == 2) +#define PxIEN P1IEN +#define PxIFG P1IFG +#define PxIF P1IF +#define SPI_RDYIn P1_4 +#define SPI_RDYIn_BIT BV(4) +// Falling edge ISR on P1.4-7 pins. +#define PICTL_BIT BV(2) +#define IENx IEN2 +#define IEN_BIT BV(4) +#endif + +#undef PxDIR +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +#define PxDIR P1DIR +#define SPI_RDYOut P1_4 +#define SPI_RDYOut_BIT BV(4) +#elif (HAL_UART_SPI == 2) +#define PxDIR P0DIR +#define SPI_RDYOut P0_5 +#define SPI_RDYOut_BIT BV(5) +#endif + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + +#if (SPI_MAX_PKT_LEN <= 256) +typedef uint8 spiLen_t; +#else +typedef uint16 spiLen_t; +#endif + +typedef enum +{ + spiRxSteSOF, + spiRxSteLen, + spiRxSteData, + spiRxSteFcs +} spiRxSte_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#if SPI_MAX_PKT_LEN == 256 +#define SPI_LEN_T_INCR(LEN) (LEN)++ +#define SPI_LEN_T_BOUNDS_CHECK(LEN) +#else +#define SPI_LEN_T_INCR(LEN) st ( \ + if (++(LEN) >= SPI_MAX_PKT_LEN) \ + { \ + (LEN) = 0; \ + } \ +) + +#define SPI_LEN_T_BOUNDS_CHECK(LEN) st ( \ + if (len > SPI_MAX_PKT_LEN) \ + { \ + len = SPI_MAX_PKT_LEN; \ + } \ +) +#endif + +#define SPI_CLR_RX_BYTE(IDX) (spiRxBuf[(IDX)] = BUILD_UINT16(0, (DMA_PAD ^ 0xFF))) +#define SPI_GET_RX_BYTE(IDX) (*(volatile uint8 *)(spiRxBuf+(IDX))) +#define SPI_NEW_RX_BYTE(IDX) ((uint8)DMA_PAD == HI_UINT16(spiRxBuf[(IDX)])) + +#define SPI_DAT_LEN(PBUF) ((PBUF)[SPI_LEN_IDX]) +#define SPI_PKT_LEN(PBUF) (SPI_DAT_LEN((PBUF)) + SPI_FRM_LEN) + +#define SPI_RDY_IN() (SPI_RDYIn == 0) +#define SPI_RDY_OUT() (SPI_RDYOut == 0) + +#if defined HAL_SPI_MASTER +#define SPI_CLR_CSn_OUT() (SPI_RDYOut = 1) +#define SPI_SET_CSn_OUT() (SPI_RDYOut = 0) + +#define SPI_CLOCK_RX(CNT) st ( \ + SPI_SET_CSn_OUT(); \ + \ + for (spiLen_t cnt = 0; cnt <= (CNT); cnt++) \ + { \ + UxDBUF = 0; \ + while (UxCSR & CSR_ACTIVE); \ + } \ + \ + SPI_CLR_CSn_OUT(); \ +) +#define SPI_CLR_RDY_OUT() SPI_CLR_CSn_OUT() + +#elif !defined HAL_SPI_MASTER +#define SPI_CLR_RDY_OUT() (SPI_RDYOut = 1) +#define SPI_SET_RDY_OUT() (SPI_RDYOut = 0) +#define SPI_TOG_RDY_OUT() st ( \ + if (SPI_RDY_OUT()) \ + { \ + SPI_CLR_RDY_OUT(); \ + } \ + else \ + { \ + SPI_SET_RDY_OUT(); \ + } \ +) +#endif + +#define SPI_RX_RDY() (spiRxHead != spiRxTail) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// Convenient way to save RAM space when running with both SPI & UART ports enabled, +// but only using one at a time with a run-time choice. +#if HAL_SPI_ON_UART_BUFS +static uint16 *const spiRxBuf = dmaCfg.rxBuf; +#if (defined HAL_UART_TX_BY_ISR && HAL_UART_TX_BY_ISR) +static uint8 *const spiRxDat = dmaCfg.txBuf; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#else +static uint8 *const spiRxDat = dmaCfg.txBuf[0]; +static uint8 *const spiTxPkt = dmaCfg.txBuf[1]; +#endif +#else +static __no_init uint16 spiRxBuf[SPI_MAX_PKT_LEN]; // uint16 for trick with DMA Rx 2-for-1. +static __no_init uint8 spiRxDat[SPI_MAX_PKT_LEN]; +static __no_init uint8 spiTxPkt[SPI_MAX_PKT_LEN]; +#endif + +#if HAL_SPI_QUEUED_TX +static osal_msg_q_t spiTxQ; +static volatile uint8 spiTxMT; +#endif + +static spiRxSte_t spiRxSte; // State of SPI packet parsing from spiRxBuf[]. +static spiLen_t spiRxIdx; // Index in spiRxBuf[] for SPI packet parsing. +static spiLen_t spiRxCnt; // Count payload data bytes parsed from spiRxBuf[]. +static spiLen_t spiRxLen; // Total length of payload data bytes to be parsed from spiRxBuf[]. +static spiLen_t spiRxFcs; // Running FCS calculation of bytes being parsed from spiRxBuf[]. + +static spiLen_t spiRxHead; // Index in spiRxDat[] from which to read with HalUARTReadSPI(). +static spiLen_t spiRxTail; // Index in spiRxDat[] up to which to read with HalUARTReadSPI(). +static spiLen_t spiRxTemp; // Index in spiRxDat[] to which to parse data from spiRxBuf[]. + +// Not supporting Tx packet buffering with a spiTxBuf[] for now to save XDATA/Flash space. + +static volatile spiLen_t spiTxLen; // Total length of payload data bytes to transmit. + +static halUARTCBack_t spiCB; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) +static volatile uint8 spiRdyIsr; // Sticky flag from SPI_RDY_IN ISR for background polling. +#endif + +#if defined POWER_SAVING +static uint8 spiHoldPM; // Boolean whether or not this module is holding off the PM. +#endif + +/* Used to walk the spiRxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. The immediate buffer area around + * the spiRxIdx consists of "cleared" uint16 values, but 10-16 indices ahead, there are valid SPI + * packets ready to be parsed. + */ +static spiLen_t spiRxBug; // DMA pointer is seen to jump ahead, or S/W bug corrupts spiRxIdx? + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrSPI(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +static uint8 spiCalcFcs(uint8 *pBuf); +static void spiParseRx(void); +#if defined POWER_SAVING +static uint8 spiSweepRx(void); +#endif + +/************************************************************************************************** + * @fn HalUARTInitSPI + * + * @brief Initialize the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTInitSPI(void) +{ +#if (HAL_UART_SPI == 1) + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0. +#else + PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1. +#endif +#if defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_M; // SPI-Master peripheral select. + UxCSR = 0; // Mode is SPI-Master Mode. + UxGCR = 16; // Cfg for the max Rx/Tx baud of 4-MHz. + UxBAUD = 255; +#elif !defined HAL_SPI_MASTER + PxSEL |= HAL_UART_Px_SEL_S; // SPI-Slave peripheral select. + UxCSR = CSR_SLAVE; // Mode is SPI-Slave Mode. +#endif + UxUCR = UCR_FLUSH; // Flush it. + UxGCR |= BV(5); // Set bit order to MSB. + + P2DIR &= ~P2DIR_PRIPO; + P2DIR |= HAL_UART_PRIPO; + + // Setup GPIO for interrupts by falling edge on SPI_RDY_IN. + PxIEN |= SPI_RDYIn_BIT; + PICTL |= PICTL_BIT; + + SPI_CLR_RDY_OUT(); + PxDIR |= SPI_RDYOut_BIT; + + // Setup Tx by DMA. + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_TX ); + + // The start address of the destination. + HAL_DMA_SET_DEST( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + // One byte is transferred each time. + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); + + // The bytes are transferred 1-by-1 on Tx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX ); + + // The source address is incremented by 1 byte after each transfer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); + HAL_DMA_SET_SOURCE( ch, spiTxPkt ); + + // The destination address is constant - the Tx Data Buffer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); + + // The DMA Tx done is serviced by ISR in order to maintain full thruput. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + // Setup Rx by DMA. + ch = HAL_DMA_GET_DESC1234( HAL_SPI_CH_RX ); + + // The start address of the source. + HAL_DMA_SET_SOURCE( ch, DMA_UxDBUF ); + + // Using the length field to determine how many bytes to transfer. + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED ); + HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); + + // The source address is constant - the Rx Data Buffer. + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); + + // The destination address is incremented by 1 word after each transfer. + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); + HAL_DMA_SET_DEST( ch, spiRxBuf ); + HAL_DMA_SET_LEN( ch, SPI_MAX_PKT_LEN ); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); + + // Xfer all 8 bits of a byte xfer. + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); + + // DMA has highest priority for memory access. + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); + + volatile uint8 dummy = *(volatile uint8 *)DMA_UxDBUF; // Clear the DMA Rx trigger. + HAL_DMA_CLEAR_IRQ(HAL_SPI_CH_RX); + HAL_DMA_ARM_CH(HAL_SPI_CH_RX); + (void)memset(spiRxBuf, (DMA_PAD ^ 0xFF), SPI_MAX_PKT_LEN * sizeof(uint16)); +} + +/************************************************************************************************** + * @fn HalUARTOpenSPI + * + * @brief Start the SPI UART Transport. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTOpenSPI(halUARTCfg_t *config) +{ + spiCB = config->callBackFunc; + + UxCSR |= CSR_RE; + + PxIFG = 0; + PxIF = 0; + IENx |= IEN_BIT; +} + +/************************************************************************************************** + * @fn HalUARTReadSPI + * + * @brief Read data bytes from a received SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory to where to copy the received SPI data bytes. + * @param len - the length to copy (for now, must be the exact length of the received data). + * + * output parameters + * + * None. + * + * @return The number of bytes read from a received SPI packet. + */ +static spiLen_t HalUARTReadSPI(uint8 *buf, spiLen_t len) +{ + for (spiLen_t cnt = 0; cnt < len; cnt++) + { + if (spiRxHead == spiRxTail) + { + len = cnt; + break; + } + + *buf++ = spiRxDat[spiRxHead]; + SPI_LEN_T_INCR(spiRxHead); + } + + return len; +} + +/************************************************************************************************** + * @fn HalUARTWriteSPI + * + * @brief Transmit data bytes as a SPI packet. + * + * input parameters + * + * @param buf - pointer to the memory of the data bytes to send. + * @param len - the length of the data bytes to send. + * + * output parameters + * + * None. + * + * @return Zero for any error; otherwise, 'len'. + */ +static spiLen_t HalUARTWriteSPI(uint8 *buf, spiLen_t len) +{ + if (spiTxLen != 0) + { +#if HAL_SPI_QUEUED_TX + uint8 *txMsg = osal_msg_allocate(len); + + if (txMsg != NULL) + { + (void)memcpy(txMsg, buf, len); + osal_msg_enqueue(&spiTxQ, txMsg); + + return len; + } +#endif + + return 0; + } + + if (len > SPI_MAX_DAT_LEN) + { + len = SPI_MAX_DAT_LEN; + } + spiTxLen = len; +#if HAL_SPI_QUEUED_TX + spiTxMT = FALSE; +#endif + + spiTxPkt[SPI_LEN_IDX] = len; + (void)memcpy(spiTxPkt + SPI_DAT_IDX, buf, len); + + spiCalcFcs(spiTxPkt); + spiTxPkt[SPI_SOF_IDX] = SPI_SOF; + + halDMADesc_t *ch = HAL_DMA_GET_DESC1234(HAL_SPI_CH_TX); + HAL_DMA_SET_LEN(ch, SPI_PKT_LEN(spiTxPkt)); + +#if defined HAL_SPI_MASTER +#if HAL_SPI_WAKEUP + /* A Full-Duplex Slave will keep SRDY active low if it has Tx ready; otherwise it will toggle its + * SRDY with every falling edge of MRDY. So if SRDY is high and the wait after writing each byte + * is not long enough, the master may loop here, infinitely out of sync with the toggling SRDY. + * Thus in a threaded OS, it would be advisable to send one zero and yield for 1-msec or more, or + * be able to receive and check here for the SRDY ISR. + */ + spiRdyIsr = 0; + while (!SPI_RDY_IN() && (spiRdyIsr == 0)) + { + SPI_CLOCK_RX(1); + + for (uint16 cnt = 0; cnt < 512; cnt++) + { + if (SPI_RDY_IN() || (spiRdyIsr != 0)) + { + break; + } + } + } +#endif + SPI_SET_CSn_OUT(); + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + HAL_DMA_MAN_TRIGGER(HAL_SPI_CH_TX); + +#elif !defined HAL_SPI_MASTER + + HAL_DMA_ARM_CH(HAL_SPI_CH_TX); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); + SPI_SET_RDY_OUT(); +#endif + + return len; +} + +/************************************************************************************************** + * @fn HalUARTPollSPI + * + * @brief SPI Transport Polling Manager. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void HalUARTPollSPI(void) +{ +#if HAL_SPI_QUEUED_TX + /* There should not be a race with the Tx-Done ISR checking the spiTxQ because if the background + * can first detect the volatile variable spiTxLen as zero and then detect the spiTxQ as not + * empty, then the Tx-Done ISR has already fired after the background write started to enqueue + * the message but before it was done doing so. + */ + if ((spiTxLen == 0) && (spiTxQ != NULL)) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else if (spiTxMT) + { + spiTxMT = FALSE; + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); + } +#endif + + spiParseRx(); + +#if HAL_SPI_QUEUED_TX || defined HAL_SPI_MASTER + if (SPI_RX_RDY()) +#else + // When there is no ability to queue Tx data and there is still Tx data pending, do not call the + // Application with new Rx data, as this may result in an attempt to respond. Although this + // failure will be actionable by the Application when HalUARTWriteSPI() returns zero, simple + // applications (like the SBL, which does not enable Tx queueing) do not handle the zero return. + if (SPI_RX_RDY() && !spiTxLen) +#endif + { + if (spiCB != NULL) + { + spiCB((HAL_UART_SPI - 1), HAL_UART_RX_TIMEOUT); + } + } + + PxIEN &= ~SPI_RDYIn_BIT; // Clear to not race with SPI_RDY_IN ISR. + + if (!SPI_RDY_IN() && !spiTxLen) + { + SPI_CLR_RDY_OUT(); // Clear the ready-out bit before re-enabling the ready-in ISR. + } + +#if defined POWER_SAVING + if (SPI_RDY_IN() || SPI_RX_RDY() || spiRxLen || spiTxLen || spiRdyIsr) + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM == 0) + { + spiHoldPM = 1; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT); + } + } + else + { + spiRdyIsr = 0; // Clear the ISR-trap flag before re-enabling the corresponding ISR. + + if (spiHoldPM != 0) + { + PxIEN |= SPI_RDYIn_BIT; // Allow the ready-in ISR during the relatively long Rx sweep. + + if (spiSweepRx()) + { + spiHoldPM = 0; + (void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); + } + } + } +#endif + + PxIEN |= SPI_RDYIn_BIT; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailSPI + * + * @brief Return the byte count of Rx data ready to be read HalUARTReadSPI(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return Number of bytes ready to be read with HalUARTReadSPI(). + */ +static spiLen_t HalUARTRxAvailSPI(void) +{ + return (spiRxTail > spiRxHead) ? (spiRxTail-spiRxHead) : (spiRxTail+(SPI_MAX_PKT_LEN-spiRxHead)); +} + +/************************************************************************************************** + * @fn spiCalcFcs + * + * @brief Calculate the FCS of a SPI Transport frame and append it to the packet. + * + * input parameters + * + * @param pBuf - Pointer to the SPI Transport frame over which to calculate the FCS. + * + * output parameters + * + * None. + * + * @return The FCS calculated. + */ +static uint8 spiCalcFcs(uint8 *pBuf) +{ + spiLen_t len = SPI_DAT_LEN(pBuf) + SPI_HDR_LEN + SPI_HDR_IDX; + spiLen_t idx = SPI_HDR_IDX; + uint8 fcs = 0; + + while (idx < len) + { + fcs ^= pBuf[idx++]; + } + pBuf[idx] = fcs; + + return fcs; +} + +/************************************************************************************************** + * @fn spiParseRx + * + * @brief Parse all available bytes from the spiRxBuf[]; parse Rx data into the spiRxDat[]. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static void spiParseRx(void) +{ + while (1) + { + if (!SPI_NEW_RX_BYTE(spiRxIdx)) + { +#if defined HAL_SPI_MASTER + if (SPI_RDY_IN() && (spiTxLen == 0)) + { + SPI_CLOCK_RX(1); + continue; + } +#endif + + if (SPI_NEW_RX_BYTE(spiRxBug)) + { + while (!SPI_NEW_RX_BYTE(spiRxIdx)) + { + SPI_LEN_T_INCR(spiRxIdx); + } + + spiRxBug = spiRxIdx; + continue; + } + + SPI_LEN_T_INCR(spiRxBug); + break; + } + + uint8 ch = SPI_GET_RX_BYTE(spiRxIdx); + SPI_CLR_RX_BYTE(spiRxIdx); + SPI_LEN_T_INCR(spiRxIdx); + + switch (spiRxSte) + { + case spiRxSteSOF: + if (ch == SPI_SOF) + { + spiRxSte = spiRxSteLen; + + // At this point, the master has effected the protocol for ensuring that the SPI slave is + // awake, so set the spiRxLen to non-zero to prevent the slave from re-entering sleep until + // the entire packet is received - even if the master interrupts the sending of the packet + // by de-asserting/re-asserting MRDY one or more times. + spiRxLen = 1; + } + break; + + case spiRxSteLen: + if ((ch == 0) || (ch > SPI_MAX_DAT_LEN)) + { + spiRxSte = spiRxSteSOF; + spiRxLen = 0; + } + else + { + spiRxFcs = spiRxLen = ch; + spiRxTemp = spiRxTail; + spiRxCnt = 0; + spiRxSte = spiRxSteData; +#if defined HAL_SPI_MASTER + SPI_CLOCK_RX(ch + 1); // Clock out the SPI Frame Data bytes and FCS. +#endif + } + break; + + case spiRxSteData: + spiRxFcs ^= ch; + spiRxDat[spiRxTemp] = ch; + SPI_LEN_T_INCR(spiRxTemp); + + if (++spiRxCnt == spiRxLen) + { + spiRxSte = spiRxSteFcs; + } + break; + + case spiRxSteFcs: + spiRxSte = spiRxSteSOF; + + if (ch == spiRxFcs) + { + spiRxTail = spiRxTemp; + } + + spiRxCnt = spiRxLen = 0; + break; + + default: + HAL_ASSERT(0); + break; + } + } +} + +#if defined POWER_SAVING +/************************************************************************************************** + * @fn spiSweepRx + * + * @brief Sweep the entire spiRxBuf[] looking for buggy DMA Rx - this function is an + * enhancement to the 'spiRxBug' work-around that is required when POWER_SAVING is + * enabled because the 'spiRxBug' only looks at one byte per polling pass and the + * buggy DMA Rx may be further away and not encountered before allowing sleep. + * + * input parameters + * + * None. + * + * output parameters + * + * The local global variables spiRxIdx and spiRxBug are set to the index of the first valid Rx + * after the index where spiRxIdx had been set upon entering this function. + * + * @return TRUE for a clean sweep (spiRxBuf[] has no valid Rx); FALSE otherwise. + */ +static uint8 spiSweepRx(void) +{ + spiLen_t sweepIdx = spiRxIdx; + + do { + if (SPI_NEW_RX_BYTE(sweepIdx)) + { + spiRxBug = spiRxIdx = sweepIdx++; + break; + } + + SPI_LEN_T_INCR(sweepIdx); + + } while (sweepIdx != spiRxIdx); + + return (sweepIdx == spiRxIdx); +} +#endif + +/************************************************************************************************** + * @fn HalUART_DMAIsrSPI + * + * @brief Handle the Tx done DMA ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalUART_DMAIsrSPI(void) +{ +#if !defined HAL_SPI_MASTER + if (!SPI_RDY_IN()) +#endif + { + SPI_CLR_RDY_OUT(); + } + spiTxLen = 0; + +#if HAL_SPI_QUEUED_TX + if (spiTxQ != NULL) + { + uint8 *txMsg = osal_msg_dequeue(&spiTxQ); + + (void)HalUARTWriteSPI(txMsg, OSAL_MSG_LEN(txMsg)); + (void)osal_msg_deallocate(txMsg); + } + else + { + spiTxMT = TRUE; + } +#else + spiCB((HAL_UART_SPI - 1), HAL_UART_TX_EMPTY); +#endif +} + +/************************************************************************************************** + * @fn PortX Interrupt Handler + * + * @brief Handler for the SPI_RDY_IN falling-edge ISR. + * + * @param None. + * + * @return None. + *************************************************************************************************/ +#if defined HAL_SBL_BOOT_CODE +static void spiRdyIn(void) +{ +#else +#if ((HAL_UART_SPI == 1) || defined HAL_SPI_MASTER) +HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR) +#elif (HAL_UART_SPI == 2) +HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR) +#endif +{ + HAL_ENTER_ISR(); +#endif + + PxIFG = 0; + PxIF = 0; + +#if (defined POWER_SAVING || (defined HAL_SPI_MASTER && HAL_SPI_WAKEUP)) + spiRdyIsr = 1; +#endif +#if !defined HAL_SPI_MASTER + if (spiTxLen == 0) + { + SPI_TOG_RDY_OUT(); + } +#endif + +#if !defined HAL_SBL_BOOT_CODE + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); +#endif +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_usb.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_usb.c new file mode 100644 index 0000000..85d5d64 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/_hal_uart_usb.c @@ -0,0 +1,389 @@ +/************************************************************************************************** + Filename: _hal_uart_usb.c + Revised: $Date: 2012-08-17 16:36:33 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31296 $ + + Description: This file contains the interface to the H/W UART driver by USB. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_uart.h" + +#include "usb_board_cfg.h" +#include "usb_cdc.h" +#include "usb_cdc_hooks.h" +#include "usb_firmware_library_config.h" +#include "usb_firmware_library_headers.h" + +/********************************************************************* + * MACROS + */ + +#if !defined HAL_UART_BAUD_RATE +#define HAL_UART_BAUD_RATE 115200 +#endif + +// The timeout tick is at 32-kHz, so multiply msecs by 33. +#define HAL_UART_MSECS_TO_TICKS 33 + +#if !defined HAL_UART_USB_HIGH +#define HAL_UART_USB_HIGH (256 / 2 - 16) +#endif +#if !defined HAL_UART_USB_IDLE +#define HAL_UART_USB_IDLE (0 * HAL_UART_MSECS_TO_TICKS) +#endif + +// Max USB packet size, per specification; see also usb_cdc_descriptor.s51 +#define HAL_UART_USB_TX_MAX 64 + +/*********************************************************************************** + * EXTERNAL VARIABLES + */ + +/*********************************************************************************** + * GLOBAL VARIABLES + */ + +/*********************************************************************************** + * LOCAL DATA + */ + +__no_init static uint8 halUartRxQ[256]; +__no_init static uint8 halUartTxQ[256]; + +static uint8 halUartRxH, halUartRxT; +static uint8 halUartTxH, halUartTxT; + +#if !defined HAL_SB_BOOT_CODE +static uint8 rxTick; +static uint8 rxShdw; +static uint8 usbTxMT; +static halUARTCBack_t usbCB; +#endif + +/*********************************************************************************** + * LOCAL FUNCTIONS + */ + +static void HalUARTInitUSB(void); +static void HalUARTPollUSB(void); +static void halUartPollEvt(void); +static void halUartPollRx(void); +static void halUartPollTx(void); + +/****************************************************************************** + * FUNCTIONS + */ + +/*********************************************************************************** +* @fn usbUartInitUSB +* +* @brief USB UART init function. +* - Set initial line decoding to 8/NONE/1. +* - Initialise the USB Firmware Library and the USB controller. +* +* @param none +* +* @return none +*/ +void HalUARTInitUSB(void) +{ + // Set default line coding. + currentLineCoding.dteRate = HAL_UART_BAUD_RATE; + currentLineCoding.charFormat = CDC_CHAR_FORMAT_1_STOP_BIT; + currentLineCoding.parityType = CDC_PARITY_TYPE_NONE; + currentLineCoding.dataBits = 8; + + // Init USB library + usbfwInit(); + + // Initialize the USB interrupt handler with bit mask containing all processed USBIRQ events + usbirqInit(0xFFFF); + +#if defined HAL_SB_BOOT_CODE + HAL_USB_PULLUP_ENABLE(); // Enable pullup on D+. +#endif +} + +#if !defined HAL_SB_BOOT_CODE +/****************************************************************************** + * @fn HalUARTOpenUSB + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenUSB(halUARTCfg_t *config) +{ + usbCB = config->callBackFunc; + HAL_USB_PULLUP_ENABLE(); // Enable pullup on D+ +} +#endif + +/*********************************************************************************** +* @fn HalUartPollUSB +* +* @brief The USB UART main task function. Should be called from the OSAL main loop. +* +* @param none +* +* @return none +*/ +void HalUARTPollUSB(void) +{ +#if defined HAL_SB_BOOT_CODE + while (USBIF) usbirqHandler(); +#endif + halUartPollEvt(); + halUartPollRx(); + halUartPollTx(); +} + +uint8 HalUARTRx(uint8 *buf, uint8 max); +uint8 HalUARTRx(uint8 *buf, uint8 max) +{ + uint8 cnt = 0; + + while ((halUartRxH != halUartRxT) && (cnt < max)) + { + *buf++ = halUartRxQ[halUartRxH++]; + cnt++; + } + + return cnt; +} + +uint8 HalUARTTx(uint8 *buf, uint8 cnt); +uint8 HalUARTTx(uint8 *buf, uint8 cnt) +{ + while (cnt--) + { + halUartTxQ[halUartTxT++] = *buf++; + } + +#if !defined HAL_SB_BOOT_CODE + usbTxMT = FALSE; +#endif + return 1; +} + +/************************************************************************************************** + * @fn HalUARTRxAvailUSB() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailUSB(void) +{ + return ((halUartRxT >= halUartRxH)? + halUartRxT - halUartRxH : sizeof(halUartRxQ) - halUartRxH + halUartRxT); +} + +/*********************************************************************************** +* @fn halUartPollEvt +* +* @brief Poll for USB events which are not directly related to the UART. +* +* @param none +* +* @return none +*/ +static void halUartPollEvt(void) +{ + // Handle reset signaling on the bus + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) + { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET); + usbfwResetHandler(); + } + + // Handle packets on EP0 + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SETUP) + { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SETUP); + usbfwSetupHandler(); + } + + // Handle USB suspend + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) + { + // Clear USB suspend interrupt + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND); + +#if HAL_UART_USB_SUSPEND + // Take the chip into PM1 until a USB resume is deteceted. + usbsuspEnter(); +#endif + + // Running again; first clear RESUME interrupt + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME); + } +} + +/*********************************************************************************** +* @fn halUartPollRx +* +* @brief Poll for data from USB. +* +* @param none +* +* @return none +*/ +static void halUartPollRx(void) +{ + uint8 cnt; + uint8 ep = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(4); + + // If the OUT endpoint has received a complete packet. + if (USBFW_OUT_ENDPOINT_DISARMED()) + { + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); + // Get length of USB packet, this operation must not be interrupted. + cnt = USBFW_GET_OUT_ENDPOINT_COUNT_LOW(); + cnt += USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() >> 8; + HAL_EXIT_CRITICAL_SECTION(intState); + + while (cnt--) + { + halUartRxQ[halUartRxT++] = USBF4; + } + USBFW_ARM_OUT_ENDPOINT(); + +#if !defined HAL_SB_BOOT_CODE + // If the USB has transferred in more Rx bytes, reset the Rx idle timer. + + // Re-sync the shadow on any 1st byte(s) received. + if (rxTick == 0) + { + rxShdw = ST0; + } + rxTick = HAL_UART_USB_IDLE; +#endif + } +#if !defined HAL_SB_BOOT_CODE + else if (rxTick) + { + // Use the LSB of the sleep timer (ST0 must be read first anyway). + uint8 decr = ST0 - rxShdw; + + if (rxTick > decr) + { + rxTick -= decr; + rxShdw = ST0; + } + else + { + rxTick = 0; + } + } + + { + uint8 evt = 0; + cnt = halUartRxT - halUartRxH; + + if (cnt >= HAL_UART_USB_HIGH) + { + evt = HAL_UART_RX_ABOUT_FULL; + } + else if (cnt && !rxTick) + { + evt = HAL_UART_RX_TIMEOUT; + } + + if (evt && (NULL != usbCB)) + { + usbCB(0, evt); + } + } +#endif + + USBFW_SELECT_ENDPOINT(ep); +} + +/*********************************************************************************** +* @fn halUartPollTx +* +* @brief Poll for data to USB. +* +* @param none +* +* @return none +*/ +static void halUartPollTx(void) +{ + uint8 ep = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(4); + + // If the IN endpoint is ready to accept data. + if (USBFW_IN_ENDPOINT_DISARMED()) + { + if (halUartTxT == halUartTxH) + { +#if !defined HAL_SB_BOOT_CODE + if (!usbTxMT && usbCB) + { + usbTxMT = TRUE; + usbCB(0, HAL_UART_TX_EMPTY); + } +#endif + } + else + { + uint8 max = HAL_UART_USB_TX_MAX; + + do + { + USBF4 = halUartTxQ[halUartTxH++]; + } while ((halUartTxH != halUartTxT) && (0 != --max)); + + USBFW_ARM_IN_ENDPOINT(); + } + } + + USBFW_SELECT_ENDPOINT(ep); +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_adc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_adc.c new file mode 100644 index 0000000..392cd2a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_adc.c @@ -0,0 +1,240 @@ +/************************************************************************************************** + Filename: hal_adc.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the HAL ADC. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#include "hal_adc.h" +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_types.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +#define HAL_ADC_EOC 0x80 /* End of Conversion bit */ +#define HAL_ADC_START 0x40 /* Starts Conversion */ + +#define HAL_ADC_STSEL_EXT 0x00 /* External Trigger */ +#define HAL_ADC_STSEL_FULL 0x10 /* Full Speed, No Trigger */ +#define HAL_ADC_STSEL_T1C0 0x20 /* Timer1, Channel 0 Compare Event Trigger */ +#define HAL_ADC_STSEL_ST 0x30 /* ADCCON1.ST =1 Trigger */ + +#define HAL_ADC_RAND_NORM 0x00 /* Normal Operation */ +#define HAL_ADC_RAND_LFSR 0x04 /* Clock LFSR */ +#define HAL_ADC_RAND_SEED 0x08 /* Seed Modulator */ +#define HAL_ADC_RAND_STOP 0x0c /* Stop Random Generator */ +#define HAL_ADC_RAND_BITS 0x0c /* Bits [3:2] */ + +#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */ +#define HAL_ADC_DEC_128 0x10 /* Decimate by 128 : 10-bit resolution */ +#define HAL_ADC_DEC_256 0x20 /* Decimate by 256 : 12-bit resolution */ +#define HAL_ADC_DEC_512 0x30 /* Decimate by 512 : 14-bit resolution */ +#define HAL_ADC_DEC_BITS 0x30 /* Bits [5:4] */ + +#define HAL_ADC_STSEL HAL_ADC_STSEL_ST +#define HAL_ADC_RAND_GEN HAL_ADC_RAND_STOP +#define HAL_ADC_REF_VOLT HAL_ADC_REF_AVDD +#define HAL_ADC_DEC_RATE HAL_ADC_DEC_064 +#define HAL_ADC_SCHN HAL_ADC_CHN_VDD3 +#define HAL_ADC_ECHN HAL_ADC_CHN_GND + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +#if (HAL_ADC == TRUE) +static uint8 adcRef; +#endif + +/************************************************************************************************** + * @fn HalAdcInit + * + * @brief Initialize ADC Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalAdcInit (void) +{ +#if (HAL_ADC == TRUE) + adcRef = HAL_ADC_REF_VOLT; +#endif +} + +/************************************************************************************************** + * @fn HalAdcRead + * + * @brief Read the ADC based on given channel and resolution + * + * @param channel - channel where ADC will be read + * @param resolution - the resolution of the value + * + * @return 16 bit value of the ADC in offset binary format. + * + * Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale. + * Note2: This function assumes that ADCCON3 contains the voltage reference. + **************************************************************************************************/ +uint16 HalAdcRead (uint8 channel, uint8 resolution) +{ + int16 reading = 0; + +#if (HAL_ADC == TRUE) + uint8 i, resbits; + uint8 adcChannel = 1; + + /* + * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled. The code + * does NOT disable the pin at the end of this function. I think it is better to leave the pin + * enabled because the results will be more accurate. Because of the inherent capacitance on the + * pin, it takes time for the voltage on the pin to charge up to its steady-state level. If + * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage + * than actuality because the pin did not have time to fully charge. + */ + if (channel < 8) + { + for (i=0; i < channel; i++) + { + adcChannel <<= 1; + } + } + + /* Enable channel */ + ADCCFG |= adcChannel; + + /* Convert resolution to decimation rate */ + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + resbits = HAL_ADC_DEC_064; + break; + case HAL_ADC_RESOLUTION_10: + resbits = HAL_ADC_DEC_128; + break; + case HAL_ADC_RESOLUTION_12: + resbits = HAL_ADC_DEC_256; + break; + case HAL_ADC_RESOLUTION_14: + default: + resbits = HAL_ADC_DEC_512; + break; + } + + /* writing to this register starts the extra conversion */ + ADCCON3 = channel | resbits | adcRef; + + /* Wait for the conversion to be done */ + while (!(ADCCON1 & HAL_ADC_EOC)); + + /* Disable channel after done conversion */ + ADCCFG &= (adcChannel ^ 0xFF); + + /* Read the result */ + reading = (int16) (ADCL); + reading |= (int16) (ADCH << 8); + + /* Treat small negative as 0 */ + if (reading < 0) + reading = 0; + + switch (resolution) + { + case HAL_ADC_RESOLUTION_8: + reading >>= 8; + break; + case HAL_ADC_RESOLUTION_10: + reading >>= 6; + break; + case HAL_ADC_RESOLUTION_12: + reading >>= 4; + break; + case HAL_ADC_RESOLUTION_14: + default: + reading >>= 2; + break; + } +#else + // unused arguments + (void) channel; + (void) resolution; +#endif + + return ((uint16)reading); +} + +/************************************************************************************************** + * @fn HalAdcSetReference + * + * @brief Sets the reference voltage for the ADC and initializes the service + * + * @param reference - the reference voltage to be used by the ADC + * + * @return none + * + **************************************************************************************************/ +void HalAdcSetReference ( uint8 reference ) +{ +#if (HAL_ADC == TRUE) + adcRef = reference; +#endif +} + +/********************************************************************* + * @fn HalAdcCheckVdd + * + * @brief Check for minimum Vdd specified. + * + * @param vdd - The board-specific Vdd reading to check for. + * + * @return TRUE if the Vdd measured is greater than the 'vdd' minimum parameter; + * FALSE if not. + * + *********************************************************************/ +bool HalAdcCheckVdd(uint8 vdd) +{ + ADCCON3 = 0x0F; + while (!(ADCCON1 & 0x80)); + return (ADCH > vdd); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_board_cfg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_board_cfg.h new file mode 100644 index 0000000..6e2baa6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_board_cfg.h @@ -0,0 +1,367 @@ +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC2540USB (8051 core). + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "usb_board_cfg.h" + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + +#define HAL_BOARD_CC2540USB + +/* Clock Speed */ + +#define HAL_CPU_CLOCK_MHZ 32 + +/* Sleep Clock */ + +#define EXTERNAL_CRYSTAL_OSC 0x00 // external 32kHz XOSC +#define INTERNAL_RC_OSC 0x80 // internal 32kHz RCOSC + +// For USB, assume internal, unless an external crystal is explicitly indicated. +#if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == FALSE)) +#define OSC_32KHZ INTERNAL_RC_OSC +#else +#define OSC_32KHZ EXTERNAL_CRYSTAL_OSC +#endif + +// Minimum Time for Stable External 32kHz Clock (in ms) +#define MIN_TIME_TO_STABLE_32KHZ_XOSC 400 + + /* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LED Configuration */ + +#define HAL_NUM_LEDS 2 + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P0_0 +#define LED1_DDR P0DIR +#define LED1_POLARITY ACTIVE_LOW + +/* 2 - Red */ +#define LED2_BV BV(1) +#define LED2_SBIT P1_1 +#define LED2_DDR P1DIR +#define LED2_POLARITY ACTIVE_HIGH + +/* Push Button Configuration */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* S1 */ +#define PUSH1_BV BV(2) +#define PUSH1_SBIT P1_2 +#define PUSH1_POLARITY ACTIVE_LOW + +/* S2 */ +#define PUSH2_BV BV(3) +#define PUSH2_SBIT P1_3 +#define PUSH2_POLARITY ACTIVE_LOW + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 + +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_SIZE 2048 +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +#define HAL_FLASH_LOCK_BITS 16 + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_NV_PAGE_END 30 +#elif defined FEATURE_UBL_MSD +#define HAL_NV_PAGE_END 121 +#else +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + +/* Reserving 1st 3 pages and last page for USB-CDC boot loader. */ + +#define HAL_USB_IMG_ADDR 0x1800 +#define HAL_USB_CRC_ADDR 0x1890 +// Size of internal flash less 4 pages for boot loader and 6 pages for NV. +#define HAL_USB_IMG_SIZE (0x40000 - 0x2000 - 0x3000) + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} + +/* Board Initialization */ +#if defined HAL_USB_BOOT_CODE +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Disconnect D+ signal to host. */ \ + HAL_USB_PULLUP_DISABLE(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} + +#else +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Enable cache prefetch mode. */ \ + PREFETCH_ENABLE(); \ +} +#endif + +/* Debounce */ + +#define HAL_DEBOUNCE(expr) { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } } + +/* Push Buttons */ + +#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) +#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) +#define HAL_PUSH_BUTTON3() (0) +#define HAL_PUSH_BUTTON4() (0) +#define HAL_PUSH_BUTTON5() (0) +#define HAL_PUSH_BUTTON6() (0) + +/* LED's */ + +#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) +#define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) +#define HAL_TURN_OFF_LED3() HAL_TURN_OFF_LED1() +#define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED2() + +#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) +#define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) +#define HAL_TURN_ON_LED3() HAL_TURN_ON_LED1() +#define HAL_TURN_ON_LED4() HAL_TURN_ON_LED2() + +#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) +#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) +#define HAL_TOGGLE_LED3() HAL_TOGGLE_LED1() +#define HAL_TOGGLE_LED4() HAL_TOGGLE_LED2() + +#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) +#define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) +#define HAL_STATE_LED3() HAL_STATE_LED1() +#define HAL_STATE_LED4() HAL_STATE_LED2() + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC TRUE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES TRUE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA TRUE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD FALSE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + +/* Set to TRUE enable UART usage, FALSE disable it */ +#ifndef HAL_UART +#define HAL_UART TRUE +#define HAL_UART_DMA 0 +#define HAL_UART_ISR 0 +#define HAL_UART_USB 1 +#endif + +#ifndef HAL_UART_DMA +#define HAL_UART_DMA 0 +#endif +#ifndef HAL_UART_ISR +#define HAL_UART_ISR 0 +#endif + +#ifndef HAL_UART_USB +# if HAL_UART +# define HAL_UART_USB 1 +# else +# define HAL_UART_USB 0 +# endif +#endif + +/* Set to TRUE enable HID usage, FALSE disable it */ +#ifndef HAL_HID +#define HAL_HID FALSE +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BOARD_CFG_H */ + +/******************************************************************************* +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_flash.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_key.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_key.c new file mode 100644 index 0000000..1b2966b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_key.c @@ -0,0 +1,308 @@ +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-06-22 10:04:42 -0700 (Fri, 22 Jun 2012) $ + Revision: $Revision: 30773 $ + + Description: This file contains the interface to the H/W Key driver. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_drivers.h" +#include "hal_key.h" +#include "hal_types.h" +#include "osal.h" +#include "usb_interrupt.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_KEY_CLR_INT() \ +st ( \ + /* PxIFG has to be cleared before PxIF. */\ + P1IFG = 0; \ + P1IF = 0; \ +) + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ + +uint8 Hal_KeyIntEnable; + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +static halKeyCBack_t pHalKeyProcessFunction; +static volatile uint8 isrKeys; +static uint8 halKeys; + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalKeyInit + * + * @brief This function is called by HalDriverInit to initialize the H/W keys. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyInit(void) +{ +} + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief This function is called by HalDriverInit to initialize the H/W keys. + * + * input parameters + * + * @param interruptEnable - TRUE/FALSE to enable the key interrupt. + * @param cback - The callback function for the key change event. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback) +{ + if ((Hal_KeyIntEnable = interruptEnable)) + { + HAL_KEY_CLR_INT(); // Clear spurious ints. + PICTL |= 0x01; // P1ICONL: Falling edge ints on pins 0-3. + P1IEN |= PUSH1_BV | PUSH2_BV; // Enable specific P1 bits for ints by bit mask. + IEN2 |= 0x10; // Enable general P1 interrupts. + } + else + { + (void)osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + pHalKeyProcessFunction = cback; +} + +/************************************************************************************************** + * @fn HalKeyPoll + * + * @brief This function is called by Hal_ProcessEvent() on a HAL_KEY_EVENT. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalKeyPoll(void) +{ + uint8 newKeys; + + if (Hal_KeyIntEnable) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); + newKeys = isrKeys; + isrKeys = 0; + HAL_EXIT_CRITICAL_SECTION(intState); + } + else + { + uint8 keys = HalKeyRead(); + newKeys = (halKeys ^ keys) & keys; + halKeys = keys; + } + + if (newKeys && pHalKeyProcessFunction) + { + (pHalKeyProcessFunction)(newKeys, HAL_KEY_STATE_NORMAL); + } +} + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief This function is called anywhere. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The bit mask of all keys pressed. + ************************************************************************************************** + */ +uint8 HalKeyRead(void) +{ + uint8 keys = 0; + + if (HAL_PUSH_BUTTON1()) + { + keys |= HAL_KEY_SW_1; + } + + if (HAL_PUSH_BUTTON2()) + { + keys |= HAL_KEY_SW_2; + } + + return keys; +} + +/************************************************************************************************** + * @fn HalKeyEnterSleep + * + * @brief - Get called to enter sleep mode + * + * @param + * + * @return + **************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** + * @fn HalKeyExitSleep + * + * @brief - Get called when sleep is over + * + * @param + * + * @return - return saved keys + **************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +/************************************************************************************************** + * @fn usbKeyISR + * + * @brief This function is the ISR for the Port2 USB/Key interrupt. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +HAL_ISR_FUNCTION( usbKeyISR, P1INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + if (P1IFG & PUSH1_BV) + { + isrKeys |= HAL_KEY_SW_1; + } + + if (P1IFG & PUSH2_BV) + { + isrKeys |= HAL_KEY_SW_2; + } + + HAL_KEY_CLR_INT(); + (void)osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +#else + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif /* HAL_KEY */ + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_lcd.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_lcd.c new file mode 100644 index 0000000..b29acf3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_lcd.c @@ -0,0 +1,767 @@ +/************************************************************************************************** + Filename: hal_lcd.c + Revised: $Date: 2012-08-03 14:28:46 -0700 (Fri, 03 Aug 2012) $ + Revision: $Revision: 31092 $ + + Description: This file contains the interface to the HAL LCD Service. + + + Copyright 2007 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "hal_lcd.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "hal_assert.h" + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + #include "DebugTrace.h" +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +/* + LCD pins + + //control + P0.0 - LCD_MODE + P1.1 - LCD_FLASH_RESET + P1.2 - LCD_CS + + //spi + P1.5 - CLK + P1.6 - MOSI + P1.7 - MISO +*/ + +/* LCD Max Chars and Buffer */ +#define HAL_LCD_MAX_CHARS 16 +#define HAL_LCD_MAX_BUFF 25 + +/* LCD Control lines */ +#define HAL_LCD_MODE_PORT 0 +#define HAL_LCD_MODE_PIN 0 + +#define HAL_LCD_RESET_PORT 1 +#define HAL_LCD_RESET_PIN 1 + +#define HAL_LCD_CS_PORT 1 +#define HAL_LCD_CS_PIN 2 + +/* LCD SPI lines */ +#define HAL_LCD_CLK_PORT 1 +#define HAL_LCD_CLK_PIN 5 + +#define HAL_LCD_MOSI_PORT 1 +#define HAL_LCD_MOSI_PIN 6 + +#define HAL_LCD_MISO_PORT 1 +#define HAL_LCD_MISO_PIN 7 + +/* SPI settings */ +#define HAL_SPI_CLOCK_POL_LO 0x00 +#define HAL_SPI_CLOCK_PHA_0 0x00 +#define HAL_SPI_TRANSFER_MSB_FIRST 0x20 + +/* LCD lines */ +#define LCD_MAX_LINE_COUNT 3 + +/* Defines for HW LCD */ + +/* Set power save mode */ +#define OSC_OFF 0x00 +#define OSC_ON 0x01 +#define POWER_SAVE_OFF 0x00 +#define POWER_SAVE_ON 0x02 +#define SET_POWER_SAVE_MODE(options) HalLcd_HW_Control(0x0C | (options)) + +/* Function Set */ +#define CGROM 0x00 +#define CGRAM 0x01 +#define COM_FORWARD 0x00 +#define COM_BACKWARD 0x02 +#define TWO_LINE 0x00 +#define THREE_LINE 0x04 +#define FUNCTION_SET(options) HalLcd_HW_Control(0x10 | (options)) + +/* Set Display Start Line */ +#define LINE1 0x00 +#define LINE2 0x01 +#define LINE3 0x02 +#define LINE4 0x03 +#define SET_DISPLAY_START_LINE(line) HalLcd_HW_Control(0x18 | (line)) + +/* Bias control */ +#define BIAS_1_5 0x00 +#define BIAS_1_4 0x01 +#define SET_BIAS_CTRL(bias) HalLcd_HW_Control(0x1C | (bias)) + +/* Power control */ +#define VOLTAGE_DIVIDER_OFF 0x00 +#define VOLTAGE_DIVIDER_ON 0x01 +#define CONVERTER_AND_REG_OFF 0x00 +#define CONVERTER_AND_REG_ON 0x04 +#define SET_POWER_CTRL(options) HalLcd_HW_Control(0x20 | (options)) + +// Set display control +#define DISPLAY_CTRL_ON 0x01 +#define DISPLAY_CTRL_OFF 0x00 +#define DISPLAY_CTRL_BLINK_ON 0x02 +#define DISPLAY_CTRL_BLINK_OFF 0x00 +#define DISPLAY_CTRL_CURSOR_ON 0x04 +#define DISPLAY_CTRL_CURSOR_OFF 0x00 +#define SET_DISPLAY_CTRL(options) HalLcd_HW_Control(0x28 | (options)) + +/* Set DD/ CGRAM address */ +#define SET_DDRAM_ADDR(charIndex) HalLcd_HW_Control(0x80 | (charIndex)) +#define SET_GCRAM_CHAR(specIndex) HalLcd_HW_Control(0xC0 | (specIndex)) + +/* Set ICONRAM address */ +#define CONTRAST_CTRL_REGISTER 0x10 +#define SET_ICONRAM_ADDR(addr) HalLcd_HW_Control(0x40 | (addr)) + +/* Set double height */ +#define LINE_1_AND_2 0x01 +#define LINE_2_AND_3 0x02 +#define NORMAL_DISPLAY 0x00 +#define SET_DOUBLE_HEIGHT(options) HalLcd_HW_Control(0x08 | (options)) + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val) +#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) + +#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) +#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define HAL_CONFIG_IO_PERIPHERAL(port, pin) HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) +#define HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + + + +/* SPI interface control */ +#define LCD_SPI_BEGIN() HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 0); /* chip select */ +#define LCD_SPI_END() \ +{ \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + asm("NOP"); \ + HAL_IO_SET(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); /* chip select */ \ +} +/* clear the received and transmit byte status, write tx data to buffer, wait till transmit done */ +#define LCD_SPI_TX(x) { U1CSR &= ~(BV(2) | BV(1)); U1DBUF = x; while( !(U1CSR & BV(1)) ); } +#define LCD_SPI_WAIT_RXRDY() { while(!(U1CSR & BV(1))); } + + +/* Control macros */ +#define LCD_DO_WRITE() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); +#define LCD_DO_CONTROL() HAL_IO_SET(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 0); + +#define LCD_ACTIVATE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0); +#define LCD_RELEASE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +static uint8 *Lcd_Line1; +#endif //LCD + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +#if (HAL_LCD == TRUE) +void HalLcd_HW_Init(void); +void HalLcd_HW_WaitUs(uint16 i); +void HalLcd_HW_Clear(void); +void HalLcd_HW_ClearAllSpecChars(void); +void HalLcd_HW_Control(uint8 cmd); +void HalLcd_HW_Write(uint8 data); +void HalLcd_HW_SetContrast(uint8 value); +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text); +void HalLcd_HW_WriteLine(uint8 line, const char *pText); +#endif //LCD + +/************************************************************************************************** + * @fn HalLcdInit + * + * @brief Initilize LCD Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcdInit(void) +{ +#if (HAL_LCD == TRUE) + Lcd_Line1 = NULL; + HalLcd_HW_Init(); +#endif +} + +/************************************************************************************************* + * LCD EMULATION FUNCTIONS + * + * Some evaluation boards are equipped with Liquid Crystal Displays + * (LCD) which may be used to display diagnostic information. These + * functions provide LCD emulation, sending the diagnostic strings + * to Z-Tool via the RS232 serial port. These functions are enabled + * when the "LCD_SUPPORTED" compiler flag is placed in the makefile. + * + * Most applications update both lines (1 and 2) of the LCD whenever + * text is posted to the device. This emulator assumes that line 1 is + * updated first (saved locally) and the formatting and send operation + * is triggered by receipt of line 2. Nothing will be transmitted if + * only line 1 is updated. + * + *************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalLcdWriteString + * + * @brief Write a string to the LCD + * + * @param str - pointer to the string that will be displayed + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteString ( char *str, uint8 option) +{ +#if (HAL_LCD == TRUE) + + uint8 strLen = 0; + uint8 totalLen = 0; + uint8 *buf; + uint8 tmpLen; + + if ( Lcd_Line1 == NULL ) + { + Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 ); + HalLcdWriteString( "Texas Instruments", 1 ); + } + + strLen = (uint8)osal_strlen( (char*)str ); + + /* Check boundries */ + if ( strLen > HAL_LCD_MAX_CHARS ) + strLen = HAL_LCD_MAX_CHARS; + + if ( option == HAL_LCD_LINE_1 ) + { + /* Line 1 gets saved for later */ + osal_memcpy( Lcd_Line1, str, strLen ); + Lcd_Line1[strLen] = '\0'; + } + else + { + /* Line 2 triggers action */ + tmpLen = (uint8)osal_strlen( (char*)Lcd_Line1 ); + totalLen = tmpLen + 1 + strLen + 1; + buf = osal_mem_alloc( totalLen ); + if ( buf != NULL ) + { + /* Concatenate strings */ + osal_memcpy( buf, Lcd_Line1, tmpLen ); + buf[tmpLen++] = ' '; + osal_memcpy( &buf[tmpLen], str, strLen ); + buf[tmpLen+strLen] = '\0'; + + /* Send it out */ +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + +#if defined(SERIAL_DEBUG_SUPPORTED) + debug_str( (uint8*)buf ); +#endif //LCD_SUPPORTED + +#endif //ZTOOL_P1 + + /* Free mem */ + osal_mem_free( buf ); + } + } + + /* Display the string */ + HalLcd_HW_WriteLine (option, str); + +#endif //HAL_LCD + +} + +/************************************************************************************************** + * @fn HalLcdWriteValue + * + * @brief Write a value to the LCD + * + * @param value - value that will be displayed + * radix - 8, 10, 16 + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option) +{ +#if (HAL_LCD == TRUE) + uint8 buf[HAL_LCD_MAX_BUFF]; + + _ltoa( value, &buf[0], radix ); + HalLcdWriteString( (char*)buf, option ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteScreen + * + * @brief Write a value to the LCD + * + * @param line1 - string that will be displayed on line 1 + * line2 - string that will be displayed on line 2 + * + * @return None + **************************************************************************************************/ +void HalLcdWriteScreen( char *line1, char *line2 ) +{ +#if (HAL_LCD == TRUE) + HalLcdWriteString( line1, 1 ); + HalLcdWriteString( line2, 2 ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value - value + * format - redix + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ) +{ +#if (HAL_LCD == TRUE) + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen] = ' '; + err = (uint32)(value); + _ltoa( err, &buf[tmpLen+1], format ); + HalLcdWriteString( (char*)buf, line ); +#endif +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value1 - value #1 + * format1 - redix of value #1 + * value2 - value #2 + * format2 - redix of value #2 + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, + uint16 value2, uint8 format2, uint8 line ) +{ + +#if (HAL_LCD == TRUE) + + uint8 tmpLen; + uint8 buf[HAL_LCD_MAX_BUFF]; + uint32 err; + + tmpLen = (uint8)osal_strlen( (char*)title ); + if ( tmpLen ) + { + osal_memcpy( buf, title, tmpLen ); + buf[tmpLen++] = ' '; + } + + err = (uint32)(value1); + _ltoa( err, &buf[tmpLen], format1 ); + tmpLen = (uint8)osal_strlen( (char*)buf ); + + buf[tmpLen++] = ','; + buf[tmpLen++] = ' '; + err = (uint32)(value2); + _ltoa( err, &buf[tmpLen], format2 ); + + HalLcdWriteString( (char *)buf, line ); + +#endif +} + +/************************************************************************************************** + * @fn HalLcdDisplayPercentBar + * + * @brief Display percentage bar on the LCD + * + * @param title - + * value - + * + * @return None + **************************************************************************************************/ +void HalLcdDisplayPercentBar( char *title, uint8 value ) +{ +#if (HAL_LCD == TRUE) + + uint8 percent; + uint8 leftOver; + uint8 buf[17]; + uint32 err; + uint8 x; + + /* Write the title: */ + HalLcdWriteString( title, HAL_LCD_LINE_1 ); + + if ( value > 100 ) + value = 100; + + /* convert to blocks */ + percent = (uint8)(value / 10); + leftOver = (uint8)(value % 10); + + /* Make window */ + osal_memcpy( buf, "[ ] ", 15 ); + + for ( x = 0; x < percent; x ++ ) + { + buf[1+x] = '>'; + } + + if ( leftOver >= 5 ) + buf[1+x] = '+'; + + err = (uint32)value; + _ltoa( err, (uint8*)&buf[13], 10 ); + + HalLcdWriteString( (char*)buf, HAL_LCD_LINE_2 ); + +#endif + +} + + +#if (HAL_LCD == TRUE) +/************************************************************************************************** + * HARDWARE LCD + **************************************************************************************************/ + +/************************************************************************************************** + * @fn halLcd_ConfigIO + * + * @brief Configure IO lines needed for LCD control. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigIO(void) +{ + /* GPIO configuration */ + HAL_CONFIG_IO_OUTPUT(HAL_LCD_MODE_PORT, HAL_LCD_MODE_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); + HAL_CONFIG_IO_OUTPUT(HAL_LCD_CS_PORT, HAL_LCD_CS_PIN, 1); +} + +/************************************************************************************************** + * @fn halLcd_ConfigSPI + * + * @brief Configure SPI lines needed for talking to LCD. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void halLcd_ConfigSPI(void) +{ + /* UART/SPI Peripheral configuration */ + + uint8 baud_exponent; + uint8 baud_mantissa; + + /* Set SPI on UART 1 alternative 2 */ + PERCFG |= 0x02; + + /* Configure clk, master out and master in lines */ + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_CLK_PORT, HAL_LCD_CLK_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MOSI_PORT, HAL_LCD_MOSI_PIN); + HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MISO_PORT, HAL_LCD_MISO_PIN); + + + /* Set SPI speed to 1 MHz (the values assume system clk of 32MHz) + * Confirm on board that this results in 1MHz spi clk. + */ + baud_exponent = 15; + baud_mantissa = 0; + + /* Configure SPI */ + U1UCR = 0x80; /* Flush and goto IDLE state. 8-N-1. */ + U1CSR = 0x00; /* SPI mode, master. */ + U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent; + U1BAUD = baud_mantissa; +} + +/************************************************************************************************** + * @fn HalLcd_HW_Init + * + * @brief Initilize HW LCD Driver. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Init(void) +{ + /* Initialize LCD IO lines */ + halLcd_ConfigIO(); + + /* Initialize SPI */ + halLcd_ConfigSPI(); + + /* Perform reset */ + LCD_ACTIVATE_RESET(); + HalLcd_HW_WaitUs(15000); // 15 ms + LCD_RELEASE_RESET(); + HalLcd_HW_WaitUs(15); // 15 us + + /* Perform the initialization sequence */ + FUNCTION_SET(CGRAM | COM_FORWARD | THREE_LINE); + + /* Set contrast */ + HalLcd_HW_SetContrast(15); + + /* Set power */ + SET_POWER_SAVE_MODE(OSC_OFF | POWER_SAVE_ON); + SET_POWER_CTRL(VOLTAGE_DIVIDER_ON | CONVERTER_AND_REG_ON); + SET_BIAS_CTRL(BIAS_1_5); + HalLcd_HW_WaitUs(21000);// 21 ms + + /* Clear the display */ + HalLcd_HW_Clear(); + HalLcd_HW_ClearAllSpecChars(); + SET_DISPLAY_CTRL(DISPLAY_CTRL_ON | DISPLAY_CTRL_BLINK_OFF | DISPLAY_CTRL_CURSOR_OFF); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Control + * + * @brief Write 1 command to the LCD + * + * @param uint8 cmd - command to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Control(uint8 cmd) +{ + LCD_SPI_BEGIN(); + LCD_DO_CONTROL(); + LCD_SPI_TX(cmd); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Write + * + * @brief Write 1 byte to the LCD + * + * @param uint8 data - data to be written to the LCD + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Write(uint8 data) +{ + LCD_SPI_BEGIN(); + LCD_DO_WRITE(); + LCD_SPI_TX(data); + LCD_SPI_WAIT_RXRDY(); + LCD_SPI_END(); +} + +/************************************************************************************************** + * @fn HalLcd_HW_SetContrast + * + * @brief Set display contrast + * + * @param uint8 value - contrast value + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_SetContrast(uint8 value) +{ + SET_ICONRAM_ADDR(CONTRAST_CTRL_REGISTER); + HalLcd_HW_Write(value); +} + +/************************************************************************************************** + * @fn HalLcd_HW_Clear + * + * @brief Clear the HW LCD + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_Clear(void) +{ + uint8 n; + + SET_DDRAM_ADDR(0x00); + for (n = 0; n < (LCD_MAX_LINE_COUNT * HAL_LCD_MAX_CHARS); n++) + { + HalLcd_HW_Write(' '); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_ClearAllSpecChars + * + * @brief Clear all special chars + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_ClearAllSpecChars(void) +{ + uint8 n = 0; + + SET_GCRAM_CHAR(0); + for (n = 0; n < (8 * 8); n++) + { + HalLcd_HW_Write(0x00); + } +} + +/************************************************************************************************** + * @fn HalLcd_HW_WriteChar + * + * @brief Write one char to the display + * + * @param uint8 line - line number that the char will be displayed + * uint8 col - colum where the char will be displayed + * + * @return None + **************************************************************************************************/ +void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text) +{ + if (col < HAL_LCD_MAX_CHARS) + { + SET_DDRAM_ADDR((line - 1) * HAL_LCD_MAX_CHARS + col); + HalLcd_HW_Write(text); + } + else + { + return; + } +} + +/************************************************************************************************** + * @fn halLcdWriteLine + * + * @brief Write one line on display + * + * @param uint8 line - display line + * char *pText - text buffer to write + * + * @return none + **************************************************************************************************/ +void HalLcd_HW_WriteLine(uint8 line, const char *pText) +{ + uint8 count; + uint8 totalLength = (uint8)osal_strlen( (char *)pText ); + + /* Write the content first */ + for (count=0; countmode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->left = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + // Cancel any overlapping timer for blink events + osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT); + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if ( !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->left--; // Not continuous, reduce count + } + } + else if ( !(sts->left) && !(sts->mode & HAL_LED_MODE_FLASH) ) + { + sts->mode ^= HAL_LED_MODE_BLINK; // No more blinks + } + else + { + pct = sts->onPct; // Percentage of cycle for on + sts->mode |= HAL_LED_MODE_ON; // Say it's on + HalLedOnOff( led, HAL_LED_MODE_ON ); // Turn it on + } + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + if (leds & HAL_LED_3) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED3(); + } + else + { + HAL_TURN_OFF_LED3(); + } + } + + if (leds & HAL_LED_4) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED4(); + } + else + { + HAL_TURN_OFF_LED4(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + HalSleepLedState |= HAL_STATE_LED3() << 2; + HalSleepLedState |= HAL_STATE_LED4() << 3; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_mcu.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_sleep.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_sleep.c new file mode 100644 index 0000000..120188c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_sleep.c @@ -0,0 +1,616 @@ +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2013-03-07 06:38:43 -0800 (Thu, 07 Mar 2013) $ + Revision: $Revision: 33411 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#include "hal_types.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_sleep.h" +#include "hal_led.h" +#include "hal_key.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "hal_drivers.h" +#include "hal_assert.h" +#include "ll_sleep.h" +#include "ll_timer2.h" +#include "ll_math.h" + +/******************************************************************************* + * MACROS + */ + +#ifndef HAL_SLEEP_DEBUG_POWER_MODE +// Set CC2540 power mode; always use PM2. +#define HAL_SLEEP_PREP_POWER_MODE(mode) \ + st( SLEEPCMD &= ~PMODE; /* clear mode bits */ \ + SLEEPCMD |= mode; /* set mode bits */ \ + while (!(STLOAD & LDRDY)); \ + halSleepPconValue = PCON_IDLE; \ + ) +#define HAL_SLEEP_SET_POWER_MODE() \ + halSetSleepMode() + +#else // HAL_SLEEP_DEBUG_POWER_MODE + +// Debug: Don't set power mode, just block until sleep timer interrupt. +#define HAL_SLEEP_PREP_POWER_MODE(mode) /* nothing */ +#define HAL_SLEEP_SET_POWER_MODE() \ + st( while(halSleepInt == FALSE); \ + halSleepInt = FALSE; \ + HAL_DISABLE_INTERRUPTS(); \ + ) +#endif // !HAL_SLEEP_DEBUG_POWER_MODE + +// sleep timer interrupt control +#define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;) // enable sleep timer interrupt +#define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;) // disable sleep timer interrupt +#define HAL_SLEEP_TIMER_CLEAR_INT() st(IRCON &= ~0x80;) // clear sleep interrupt flag + +// backup interrupt enable registers before sleep +#define HAL_SLEEP_IE_BACKUP_AND_DISABLE( ien0, ien1, ien2 ) \ + st( (ien0) = IEN0; \ + (ien1) = IEN1; \ + (ien2) = IEN2; \ + IEN0 &= STIE_BV; \ + IEN1 &= P0IE_BV; \ + IEN2 &= (P1IE_BV|P2IE_BV); \ + ) + +// restore interrupt enable registers before sleep +#define HAL_SLEEP_IE_RESTORE( ien0, ien1, ien2 ) \ + st( IEN0 = (ien0); \ + IEN1 = (ien1); \ + IEN2 = (ien2); \ + ) + +// convert msec to 625 usec units with round +#define HAL_SLEEP_MS_TO_625US( ms ) (((((uint32) (ms)) * 8) + 4) / 5) + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 +#define HAL_SLEEP_MS_TO_32KHZ( ms ) ((((uint32) (ms)) * 4096) / 125) + +// max allowed sleep time in ms +// Note: When OSAL timer was updated to 32 bits, the call to halSleep was +// changed to take a 32-bit osal_timeout value. But since the CC2540 +// previously used a 16 bit ll_McuPrecisionCount, halSleep was modified +// to limit osal_timeout to 16 bits as well (please see SVN rev. 27618). +// However, the max value of the 16 bit ll_McuPrecisionCount is about 41s, +// which is shorter than the max sleep time of 65.535s! So it is possible +// Timer2 rollover could occur during sleep, which could affect when an +// OSAL timer event is generated. The OSAL timer software should +// be updated to use the full 24bit value of Timer2, allowing timer +// events of up to 2.9 hours, but until this can be done properly, the +// max sleep duration will be limited to less than ll_McuPrecisionCount. +// Note: Not an issue for BLE as the max sleep time would have to be less +// than 32s. +#define MAX_SLEEP_TIMEOUT 40000 + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). +#define CC2540_PM0 0 // PM0, Clock oscillators on, voltage regulator on +#define CC2540_PM1 1 // PM1, 32.768 kHz oscillators on, voltage regulator on +#define CC2540_PM2 2 // PM2, 32.768 kHz oscillators on, voltage regulator off +#define CC2540_PM3 3 // PM3, All clock oscillators off, voltage regulator off + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. +#define HAL_SLEEP_OFF CC2540_PM0 +#define HAL_SLEEP_TIMER CC2540_PM2 +#define HAL_SLEEP_DEEP CC2540_PM3 + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms +#define MAX_SLEEP_TIME 16711680 // max time to sleep allowed by ST, in 32kHz ticks + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period +#if !defined (PM_MIN_SLEEP_TIME) +#define PM_MIN_SLEEP_TIME 66 // default to min safe sleep time, in 32kHz ticks +#endif // !PM_MIN_SLEEP_TIME + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). +#if defined( CC2541) || defined( CC2541S ) +#define HAL_SLEEP_ADJ_TICKS 25 // default sleep adjustment, in 32kHz ticks +#else // CC2540 +#define HAL_SLEEP_ADJ_TICKS 35 // default sleep adjustment, in 32kHz ticks +#endif // CC2541 || CC2541S + +// sleep and external interrupt port masks +#define STIE_BV BV(5) +#define P0IE_BV BV(5) +#define P1IE_BV BV(4) +#define P2IE_BV BV(1) + +// for optimized indexing of uint32 +#if HAL_MCU_LITTLE_ENDIAN() +#define UINT32_NDX0 0 +#define UINT32_NDX1 1 +#define UINT32_NDX2 2 +#define UINT32_NDX3 3 +#else +#define UINT32_NDX0 3 +#define UINT32_NDX1 2 +#define UINT32_NDX2 1 +#define UINT32_NDX3 0 +#endif // HAL_MCU_LITTLE_ENDIAN() + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = HAL_SLEEP_OFF; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE +static bool halSleepInt = FALSE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = PCON_IDLE; + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + HAL_DISABLE_INTERRUPTS(); +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // max allowed sleep time in ms + if (osal_timeout > MAX_SLEEP_TIMEOUT) + { + osal_timeout = MAX_SLEEP_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( (halPwrMgtMode == CC2540_PM3), wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_startup.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_timer.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_types.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_uart.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_uart.c new file mode 100644 index 0000000..af90272 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/hal_uart.c @@ -0,0 +1,374 @@ +/************************************************************************************************** + Filename: hal_uart.c + Revised: $Date: 2013-02-06 09:21:21 -0800 (Wed, 06 Feb 2013) $ + Revision: $Revision: 33001 $ + + Description: This file contains the interface to the H/W UART driver. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board_cfg.h" +#include "hal_defs.h" +#include "hal_drivers.h" +#include "hal_types.h" +#include "hal_uart.h" +#if defined POWER_SAVING +#include "OSAL.h" +#include "OSAL_PwrMgr.h" +#endif + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +void HalUARTIsrDMA(void); + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +#if HAL_UART_DMA +#include "_hal_uart_dma.c" +#endif +#if HAL_UART_ISR +#include "_hal_uart_isr.c" +#endif +#if HAL_UART_SPI +#include "_hal_uart_spi.c" +#endif +#if HAL_UART_USB +#include "_hal_uart_usb.c" +#endif + +/****************************************************************************** + * @fn HalUARTInit + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTInit(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTInitSPI(); + } + else + { + HalUARTInitDMA(); + } +#else +#if HAL_UART_DMA + HalUARTInitDMA(); +#endif +#if HAL_UART_ISR + HalUARTInitISR(); +#endif +#if HAL_UART_SPI + HalUARTInitSPI(); +#endif +#if HAL_UART_USB + HalUARTInitUSB(); +#endif +#endif +} + +/****************************************************************************** + * @fn HalUARTOpen + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param port - UART port + * config - contains configuration information + * + * @return Status of the function call + *****************************************************************************/ +uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenDMA(config); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenISR(config); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenISR(config); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) HalUARTOpenSPI(config); +#endif +#if (HAL_UART_USB) + HalUARTOpenUSB(config); +#endif +#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) config; // unused argument +#endif + + return HAL_UART_SUCCESS; +} + +/***************************************************************************** + * @fn HalUARTRead + * + * @brief Read a buffer from the UART + * + * @param port - USART module designation + * buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTReadSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTReadSPI(buf, len); +#endif + +#if HAL_UART_USB + return HalUARTRx(buf, len); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTWrite + * + * @brief Write a buffer to the UART. + * + * @param port - UART port + * buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteDMA(buf, len); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTWriteSPI(buf, len); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTWriteSPI(buf, len); +#endif + +#if HAL_UART_USB + HalUARTTx(buf, len); + return len; +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + (void) buf; // unused argument + (void) len; // unused argument + #endif + return 0; +#endif +} + +/****************************************************************************** + * @fn HalUARTSuspend + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTSuspend( void ) +{ +#if HAL_UART_ISR + HalUARTSuspendISR(); +#endif +} + +/****************************************************************************** + * @fn HalUARTResume + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTResume( void ) +{ +#if HAL_UART_ISR + HalUARTResumeISR(); +#endif +} + +/*************************************************************************************************** + * @fn HalUARTPoll + * + * @brief Poll the UART. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTPoll(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUARTPollSPI(); + } + else + { + HalUARTPollDMA(); + } +#else +#if HAL_UART_DMA + HalUARTPollDMA(); +#endif +#if HAL_UART_ISR + HalUARTPollISR(); +#endif +#if HAL_UART_SPI + HalUARTPollSPI(); +#endif +#if HAL_UART_USB + HalUARTPollUSB(); +#endif +#endif +} + +/************************************************************************************************** + * @fn Hal_UART_RxBufLen() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param port - UART port + * + * @return length of current Rx Buffer + **************************************************************************************************/ +uint16 Hal_UART_RxBufLen( uint8 port ) +{ +#if (HAL_UART_DMA == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_DMA == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailDMA(); +#endif +#if (HAL_UART_ISR == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_ISR == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailISR(); +#endif +#if (HAL_UART_SPI == 1) + if (port == HAL_UART_PORT_0) return HalUARTRxAvailSPI(); +#endif +#if (HAL_UART_SPI == 2) + if (port == HAL_UART_PORT_1) return HalUARTRxAvailSPI(); +#endif + +#if HAL_UART_USB + return HalUARTRxAvailUSB(); +#else + #if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0) + // UART is not enabled. Do nothing. + (void) port; // unused argument + #endif + return 0; +#endif +} + +void HalUARTIsrDMA(void) +{ +#if (HAL_UART_DMA && HAL_UART_SPI) // When both are defined, port is run-time choice. + if (HAL_UART_PORT) + { + HalUART_DMAIsrSPI(); + } + else + { + HalUART_DMAIsrDMA(); + } +#elif HAL_UART_DMA + HalUART_DMAIsrDMA(); +#elif HAL_UART_SPI + HalUART_DMAIsrSPI(); +#endif +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h new file mode 100644 index 0000000..195d123 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc.h @@ -0,0 +1,118 @@ +/*********************************************************************************** + + Filename: usb_cdc.h + + Description: USB CDC definitions. + +***********************************************************************************/ + +#ifndef USB_CDC_H +#define USB_CDC_H + +/* Device Class Code */ +#define CDC_DEVICE 0x02 + +/* Communication Interface Class Code */ +#define COMM_INTF 0x02 + +/* Communication Interface Class SubClass Codes */ +#define ABSTRACT_CONTROL_MODEL 0x02 + +/* Communication Interface Class Control Protocol Codes */ +#define V25TER 0x01 // Common AT commands ("Hayes(TM)") + + +/* Data Interface Class Codes */ +#define DATA_INTF 0x0A + +/* Data Interface Class Protocol Codes */ +#define NO_PROTOCOL 0x00 // No class specific protocol required + + +/* Communication Feature Selector Codes */ +#define ABSTRACT_STATE 0x01 +#define COUNTRY_SETTING 0x02 + +/* Functional Descriptors */ +/* Type Values for the bDescType Field */ +#define CS_INTERFACE 0x24 +#define CS_ENDPOINT 0x25 + +/* bDescSubType in Functional Descriptors */ +#define DSC_FN_HEADER 0x00 +#define DSC_FN_CALL_MGT 0x01 +#define DSC_FN_ACM 0x02 // ACM - Abstract Control Management +#define DSC_FN_DLM 0x03 // DLM - Direct Line Managment +#define DSC_FN_TELEPHONE_RINGER 0x04 +#define DSC_FN_RPT_CAPABILITIES 0x05 +#define DSC_FN_UNION 0x06 +#define DSC_FN_COUNTRY_SELECTION 0x07 +#define DSC_FN_TEL_OP_MODES 0x08 +#define DSC_FN_USB_TERMINAL 0x09 +/* more.... see Table 25 in USB CDC Specification 1.1 */ + + +#define CDC_COMM_INTF_ID 0x00 +#define CDC_DATA_INTF_ID 0x01 + + + +// CLASS REQUESTS +#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_SET_COMM_FEATURE 0x02 //optional +#define CDC_GET_COMM_FEATURE 0x03 //optional +#define CDC_CLEAR_COMM_FEATURE 0x04 //optional +#define CDC_SET_LINE_CODING 0x20 //optional +#define CDC_GET_LINE_CODING 0x21 //optional +#define CDC_SET_CONTROL_LINE_STATE 0x22 //optional +#define CDC_SEND_BREAK 0x23 //optional + + + +#define CDC_CHAR_FORMAT_1_STOP_BIT 0 +#define CDC_CHAR_FORMAT_1_5_STOP_BIT 1 +#define CDC_CHAR_FORMAT_2_STOP_BIT 2 + +#define CDC_PARITY_TYPE_NONE 0 +#define CDC_PARITY_TYPE_ODD 1 +#define CDC_PARITY_TYPE_EVEN 2 +#define CDC_PARITY_TYPE_MARK 3 +#define CDC_PARITY_TYPE_SPACE 4 + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS†WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 new file mode 100644 index 0000000..00ee177 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_descriptor.s51 @@ -0,0 +1,235 @@ +/*********************************************************************************** + + Filename: usb_cdc_descriptor.s51 + + Description: Descriptor for USB CDC class. + +***********************************************************************************/ +/* ++------------------------------------------------------------------------------ +|The default USB descriptor defines a minimum configuration, with no endpoints +|apart from EP0. The application can define 3 IN and OUT endpoints, and override +|the configuration and interface descriptor (only one of each). +|The device and string descriptors are locked. ++------------------------------------------------------------------------------*/ + + +#define ASM_FILE +#include "..\library\usb_descriptor.h" +#include "usb_cdc.h" + +#if !defined chip +#define chip 2540 +#endif + + MODULE usb_descriptor + + RSEG RCODE + + PUBLIC usbDescStart; + PUBLIC usbDescEnd; + PUBLIC usbDescLut; + PUBLIC usbDescLutEnd; + PUBLIC usbDblbufLut; + PUBLIC usbDblbufLutEnd; + +;;------------------------------------------------------------------------------------------------------- +;; USB descriptors +usbDescStart: +deviceDesc: ; Device descriptor + DB deviceDescEnd - deviceDesc + DB DESC_TYPE_DEVICE ; bDescriptorType + DB 00H, 02H ; bcdUSB + DB CDC_DEVICE ; bDeviceClass + DB 00H ; bDeviceSubClass + DB 00H ; bDeviceProtocol + DB EP0_PACKET_SIZE + DB 51H, 04H ; idVendor Texas Instruments + #if (chip==2540) + DB 0AAH, 16H ; idProduct CC2540 + #elif (chip==2531) + DB 0A8H, 16H ; idProduct CC2531 + #elif (chip==2511) + DB 0A4H, 16H ; idProduct CC2511 + #else + DB 0A6H, 16H ; idProduct CC1111 + #endif + DB 09H, 00H ; bcdDevice + DB 01H ; iManufacturer + DB 02H ; iProduct + DB 03H ; iSerialNumber (OR set to zero) + DB 01H ; bNumConfigurations +deviceDescEnd: + +config1LengthStart: +configDesc: ; Configuration descriptor + DB configDescEnd - configDesc + DB DESC_TYPE_CONFIG ; bDescriptorType + DB config1LengthEnd - config1LengthStart, 00H + DB 02H ; NumInterfaces + DB 01H ; bConfigurationValue + DB 00H ; iConfiguration + DB 80H ; bmAttributes + DB 25 ; MaxPower +configDescEnd: + + +; +; INTERFACE 0 +; + + +interface0Desc: ; Interface descriptor + DB interface0DescEnd - interface0Desc + DB DESC_TYPE_INTERFACE ; bDescriptorType + DB 00H ; bInterfaceNumber + DB 00H ; bAlternateSetting + DB 01H ; bNumEndpoints + DB COMM_INTF ; bInterfaceClass + DB ABSTRACT_CONTROL_MODEL ; bInterfaceSubClass + DB V25TER ; bInterfaceProcotol + DB 00H ; iInterface +interface0DescEnd: + +;; CDC Class-Specific Descriptors + +headerFunctionalDesc: ; Header Functional Descriptor + DB headerFunctionalDescEnd - headerFunctionalDesc + DB CS_INTERFACE + DB DSC_FN_HEADER + DB 10H, 01H +headerFunctionalDescEnd: + + +absCtrlManFuncDesc: ; Abstract Control Management Functional Descriptor + DB absCtrlManFuncDescEnd - absCtrlManFuncDesc + DB CS_INTERFACE + DB DSC_FN_ACM + DB 02H ;set the supported class requests +absCtrlManFuncDescEnd: + +unionFunctionalDesc: ; Union Functional Descriptor + DB unionFunctionalDescEnd - unionFunctionalDesc + DB CS_INTERFACE + DB DSC_FN_UNION + DB CDC_COMM_INTF_ID + DB CDC_DATA_INTF_ID +unionFunctionalDescEnd: + + +callMngFuncDesc: ; Call Management Functional Descriptor + DB callMngFuncDescEnd - callMngFuncDesc + DB CS_INTERFACE + DB DSC_FN_CALL_MGT + DB 00H + DB CDC_DATA_INTF_ID +callMngFuncDescEnd: + + + +endpoint0Desc: ; Endpoint descriptor (EP2 IN) + DB endpoint0DescEnd - endpoint0Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 82H ; bEndpointAddress + DB EP_ATTR_INT ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 40H ; bInterval +endpoint0DescEnd: + +; +; INTERFACE 1 +; + +interface1Desc: ; Interface descriptor + DB interface1DescEnd - interface1Desc + DB DESC_TYPE_INTERFACE ; Interface descriptor type + DB 01H ; Interface Number + DB 00H ; Alternate Setting Number + DB 02H ; Number of endpoints in this intf + DB DATA_INTF ; Class code + DB 00H ; Subclass code + DB NO_PROTOCOL ; Protocol code + DB 00H ; Interface string index +interface1DescEnd: + + +endpoint1Desc: ; Endpoint descriptor (EP4 OUT) + DB endpoint1DescEnd - endpoint1Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 84H ; bEndpointAddress + DB EP_ATTR_BULK ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 01H ; bInterval +endpoint1DescEnd: + +endpoint2Desc: ; Endpoint descriptor (EP4 IN) + DB endpoint2DescEnd - endpoint2Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 04H ; bEndpointAddress + DB EP_ATTR_BULK ; bmAttributes + DB 40H, 00H ; wMaxPacketSize + DB 01H ; bInterval +endpoint2DescEnd: +config1LengthEnd: +;;------------------------------------------------------------------------------------------------------- + +usbDescEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for descriptors that are not returned through requests for DSC_DEVICE, DSC_CONFIG or +;; DSC_STRING (e.g. HID report descriptors) +usbDescLut: +usbDescLutEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for double buffer settings (one set of bit masks for each defined interface) +usbDblbufLut: DW interface0Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask + DW interface1Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask +usbDblbufLutEnd: +;;------------------------------------------------------------------------------------------------------- + + + END; + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c new file mode 100644 index 0000000..ffd65e9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.c @@ -0,0 +1,156 @@ +/*********************************************************************************** + + Filename: usb_cdc_hooks.c + + Contains the necessary hook functions for various USB request processing + that is featured from the USB firmware library. Some + functions are empty. + +***********************************************************************************/ + + +/********************************************************************************** + * INCLUDES + */ + +#include "usb_cdc.h" +#include "usb_cdc_hooks.h" +#include "usb_firmware_library_headers.h" + +#include "hal_types.h" + +/* Global data */ + +CDC_LINE_CODING_STRUCTURE currentLineCoding; + + +// ********************************************************************************* +// All Hooks and functions required by the USB library. +// ********************************************************************************* + +// **************** Process USB class requests with OUT data phase ***************** +void usbcrHookProcessOut(void) +{ + // Process USB class requests with OUT data phase, or stall endpoint 0 when unsupported + if (usbSetupHeader.request == CDC_SET_CONTROL_LINE_STATE) { + // Control line state from host + if(usbfwData.ep0Status == EP_IDLE) + { + usbfwData.ep0Status = EP_RX; + } + + + } else if(usbSetupHeader.request == CDC_SET_LINE_CODING) { + + if(usbfwData.ep0Status == EP_IDLE) + { + usbSetupData.pBuffer = (uint8 __xdata *) ¤tLineCoding; + usbfwData.ep0Status = EP_RX; + } + else if(usbfwData.ep0Status == EP_RX) { } + } + // Unknown request? + else { + usbfwData.ep0Status = EP_STALL; + } +} + +// **************** Process USB class requests with IN data phase ****************** +void usbcrHookProcessIn(void) +{ + // Process USB class requests with IN data phase, or stall endpoint 0 when unsupported + if (usbSetupHeader.request == CDC_GET_LINE_CODING) { + // First the endpoint status is EP_IDLE... + if (usbfwData.ep0Status == EP_IDLE) { + usbSetupData.pBuffer = (uint8 __xdata *) ¤tLineCoding; + usbSetupData.bytesLeft = 7; + usbfwData.ep0Status = EP_TX; + // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer) + } else if (usbfwData.ep0Status == EP_TX) { + // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + } + } else { + usbfwData.ep0Status = EP_STALL; + } +} + +// ******************************** Unsupported USB hooks ************************* +void usbvrHookProcessOut(void) {usbfwData.ep0Status = EP_STALL; } +void usbvrHookProcessIn(void) {usbfwData.ep0Status = EP_STALL; } + +// ************************ unsupported/unhandled standard requests *************** +void usbsrHookSetDescriptor(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSynchFrame(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookClearFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSetFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus) { } + + +// ************************ USB standard request event processing ****************** +void usbsrHookProcessEvent(uint8 event, uint8 index) +{ + // Process relevant events, one at a time. + switch (event) { + case USBSR_EVENT_CONFIGURATION_CHANGING : //(the device configuration is about to change) + break; + case USBSR_EVENT_CONFIGURATION_CHANGED :// (the device configuration has changed) + break; + case USBSR_EVENT_INTERFACE_CHANGING ://(the alternate setting of the given interface is about to change) + break; + case USBSR_EVENT_INTERFACE_CHANGED : //(the alternate setting of the given interface has changed) + break; + case USBSR_EVENT_REMOTE_WAKEUP_ENABLED ://(remote wakeup has been enabled by the host) + break; + case USBSR_EVENT_REMOTE_WAKEUP_DISABLED ://(remote wakeup has been disabled by the host) + break; + case USBSR_EVENT_EPIN_STALL_CLEARED ://(the given IN endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPIN_STALL_SET ://(the given IN endpoint has been stalled by the host) + break; + case USBSR_EVENT_EPOUT_STALL_CLEARED ://(the given OUT endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPOUT_STALL_SET ://(the given OUT endpoint has been stalled by the PC) + break; + } +} + +// ************************ USB interrupt event processing ************************* +void usbirqHookProcessEvents(void) +{ + // Handle events that require immediate processing here +} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h new file mode 100644 index 0000000..9f90800 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_cdc_hooks.h @@ -0,0 +1,23 @@ +/*********************************************************************************** + + Filename: usb_cdc_hooks.h + + Description: USB Virtual UART interface. + +***********************************************************************************/ +#ifndef USB_CDC_HOOKS_H +#define USB_CDC_HOOKS_H + +#include "hal_types.h" + +typedef struct { + uint32 dteRate; + uint8 charFormat; + uint8 parityType; + uint8 dataBits; +} CDC_LINE_CODING_STRUCTURE; + +extern CDC_LINE_CODING_STRUCTURE currentLineCoding; + + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c new file mode 100644 index 0000000..4a68d5a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.c @@ -0,0 +1,68 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.c + + Description: USB library configuration. + +***********************************************************************************/ + +/// \addtogroup module_usb_firmware_library_config +/// @{ +#define USBFIRMWARELIBRARYCONFIG_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" + +//----------------------------------------------------------------------------- +// READ THIS!! +// +// This file configures the USB Firmware Library. +// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.c", and +// put it in the project catalog. Then edit the code below as needed: +//----------------------------------------------------------------------------- + +// Declaration of global USB descriptor pointers +USB_DESCRIPTOR_MARKER usbDescriptorMarker= { + (uint8 __code *)&usbDescStart, + (uint8 __code *)&usbDescEnd, + (DESC_LUT_INFO __code *) &usbDescLut, + (DESC_LUT_INFO __code *) &usbDescLutEnd, + (DBLBUF_LUT_INFO __code *) &usbDblbufLut, + (DBLBUF_LUT_INFO __code *) &usbDblbufLutEnd +}; + +/// @} + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h new file mode 100644 index 0000000..336440b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_config.h @@ -0,0 +1,64 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.h + + Description: USB library configuration. + +***********************************************************************************/ +#ifndef USBFIRMWARELIBRARYCONFIG_H // Don't modify +#define USBFIRMWARELIBRARYCONFIG_H // Don't modify + +//----------------------------------------------------------------------------- +// READ THIS!! +// +// This file configures the USB Firmware Library. +// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.h", and +// put it in the project catalog. Then edit the definitions below: +//----------------------------------------------------------------------------- +// Includes + + +//----------------------------------------------------------------------------- +// Defines + +// Enter the maximum number of interfaces that are used in the configurations (used to calculate the size +// of the table that stores the currently selected alternate setting for each interface) +#define USB_SETUP_MAX_NUMBER_OF_INTERFACES 5 + + +#endif //#ifndef USBFIRMWARELIBRARYCONFIG_H +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h new file mode 100644 index 0000000..cb9bfce --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_cdc/usb_firmware_library_headers.h @@ -0,0 +1,64 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_headers.h + + Description: Common inclusion of all USB library headers. + +***********************************************************************************/ + +#ifndef USB_FIRMWARE_LIBRARY_HEADERS_H +#define USB_FIRMWARE_LIBRARY_HEADERS_H + + +// This file includes all of the USB Library header files. +// When using the library, include this file only. + +// Also make a copy of usb_firmware_library_config_template.c and usb_firmware_library_config_template.h +// and add it to your project as usb_firmware_library_config.c and +// usb_firmware_library_config.h. The definitions in these files should be adapted to your project. + +#include "usb_firmware_library_config.h" +#include "usb_descriptor.h" +#include "usb_descriptor_parser.h" +#include "usb_interrupt.h" +#include "usb_framework.h" +#include "usb_reg.h" +#include "usb_standard_requests.h" +#include "usb_suspend.h" + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif //USB_FIRMWARE_LIBRARY_HEADERS_H + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.c new file mode 100644 index 0000000..fa3479d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.c @@ -0,0 +1,308 @@ +/*********************************************************************************** + + Filename: usb_class_request.c + + Description: USB class request handler. + +***********************************************************************************/ + + +/*********************************************************************************** +* INCLUDES +*/ +#include "usb_class_requests.h" +#include "usb_hid_reports.h" +#include "usb_framework.h" + + +/*********************************************************************************** +* @fn usbcrSetReport +* +* @brief Implements support for the HID class request SET_REPORT. +* +* @return none +*/ +void usbcrSetReport(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Sanity check the incoming setup header: + // Only accept output report for keyboard LED status + if ((HI_UINT16(usbSetupHeader.value) == HID_REP_TYPE_OUTPUT) && + (usbSetupHeader.index == KEYBOARD_INDEX) && + (usbSetupHeader.length == sizeof(KEYBOARD_OUT_REPORT))) { + + // Prepare to receive the data + usbfwData.ep0Status = EP_RX; + usbSetupData.pBuffer = (uint8 *) &hidData.keyboardOutReport.ledStatus; + usbSetupData.bytesLeft = usbSetupHeader.length; + return; + + } else { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + } + + // Received data? + } else if (usbfwData.ep0Status == EP_RX) { + + // The USB firmware library will return here after the data has been + // received. This USB example only implements one-way RF link protocol + // (i.e. keyboard device -> USB device), but can optionally be extended + // by transmitting the received LED status (now stored in + // hidData.keyboardOutReport.ledStatus) back to keyboard for it to + // update itself. + + } + +} // usbcrSetReport + + +/*********************************************************************************** +* @fn usbcrGetReport +* +* @brief Implements support for the HID class request GET_REPORT. +* +* @return none +*/ +void usbcrGetReport(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + + // Data transmitted? + } else if (usbfwData.ep0Status == EP_TX) { + + // The USB firmware library will return here after the keyboard/mouse + // report has been transmitted, but there is nothing for us to do here. + } + +} // usbcrGetReport + + +/*********************************************************************************** +* @fn usbcrSetProtocol +* +* @brief Implements support for the HID class request SET_PROTOCOL. +* This request is only required for HID devices in the "boot" subclass. +* +* @return none +*/ +void usbcrSetProtocol(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Sanity check setup request parameters + if ((usbSetupHeader.value & 0xFFFE) || + (usbSetupHeader.length != 0) || + (usbSetupHeader.index > MOUSE_INDEX)) { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + + } else { + // Check which interface is addressed and store the new protocol + switch (LO_UINT16(usbSetupHeader.index)) { + + case KEYBOARD_INDEX: + hidData.keyboardProtocol = LO_UINT16(usbSetupHeader.value); + break; + case MOUSE_INDEX: + hidData.mouseProtocol = LO_UINT16(usbSetupHeader.value); + break; + default: + break; + } + + // This request has only a setup stage (no data stage) + return; + } + } + +} // usbcrSetProtocol + + +/*********************************************************************************** +* @fn usbcrGetProtocol +* +* @brief Implements support for the HID class request GET_PROTOCOL. +* This request is only required for HID devices in the "boot" subclass. +* +* @return none +*/ +void usbcrGetProtocol(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Sanity check setup request parameters + if ((usbSetupHeader.value != 0) || + (usbSetupHeader.length != 1) || + (usbSetupHeader.index > MOUSE_INDEX)) { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + + } else { + // Check which interface is addressed and prepare to send the data + switch (LO_UINT16(usbSetupHeader.index)) { + + case KEYBOARD_INDEX: + usbSetupData.pBuffer = &hidData.keyboardProtocol; + break; + case MOUSE_INDEX: + usbSetupData.pBuffer = &hidData.mouseProtocol; + break; + default: + break; + } + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + return; + } + + // Data transmitted? + } else if (usbfwData.ep0Status == EP_TX) { + + // The USB firmware library will return here after the protocol data + // has been transmitted, but there is no need for us to do anything here. + } + +} // usbcrGetProtocol + + +/*********************************************************************************** +* @fn usbcrSetIdle +* +* @brief Implements support for the HID class request SET_IDLE. +* This request is optional for mouse devices, but required by keyboards. +* +* @return none +*/ +void usbcrSetIdle(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Sanity check setup request parameters + if ((usbSetupHeader.length != 0) || + (usbSetupHeader.index > MOUSE_INDEX)) { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + + } else { + // Check which interface is addressed and save the new idle rate + switch (LO_UINT16(usbSetupHeader.index)) { + + case KEYBOARD_INDEX: + hidData.keyboardIdleRate = usbSetupHeader.value; + break; + case MOUSE_INDEX: + hidData.mouseIdleRate = usbSetupHeader.value; + break; + default: + break; + } + + // This request has only a setup stage (no data stage) + return; + } + } + +} // usbcrSetIdle + + +/*********************************************************************************** +* @fn usbcrGetIdle +* +* @brief Implements support for the HID class request GET_IDLE. +* This request is optional for mouse devices, but required by keyboards. +* +* @return none +*/ +void usbcrGetIdle(void) +{ + // Received setup header? + if (usbfwData.ep0Status == EP_IDLE) { + + // Sanity check setup request parameters + if ((usbSetupHeader.length != 1) || + (usbSetupHeader.index > MOUSE_INDEX)) { + + // Unsupported: Stall the request + usbfwData.ep0Status = EP_STALL; + return; + + } else { + // Check which interface is addressed and prepare to send the data + switch (LO_UINT16(usbSetupHeader.index)) { + + case KEYBOARD_INDEX: + usbSetupData.pBuffer = LOBYTEPTR(hidData.keyboardIdleRate); + break; + case MOUSE_INDEX: + usbSetupData.pBuffer = LOBYTEPTR(hidData.mouseIdleRate); + break; + default: + break; + } + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + return; + } + + // Data transmitted? + } else if (usbfwData.ep0Status == EP_TX) { + + // The USB firmware library will return here after the idle data + // has been transmitted, but there is no need for us to do anything here. + } + +} // usbcrGetIdle + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.h new file mode 100644 index 0000000..cd44a30 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_class_requests.h @@ -0,0 +1,80 @@ +/*********************************************************************************** + + Filename: usb_class_request.h + + Description: Handle USB class requests for HID class. + +***********************************************************************************/ + +#ifndef USB_CLASS_REQUEST +#define USB_CLASS_REQUEST + +// HID Interface indices (as used in USB descriptor) for class request parsing +#define KEYBOARD_INDEX 0 +#define MOUSE_INDEX 1 + +// Constants specifying HID Class requests (bRequest) +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B + +// Report types for use with the GET_/SET_REPORT request +#define HID_REP_TYPE_INPUT 1 +#define HID_REP_TYPE_OUTPUT 2 +#define HID_REP_TYPE_FEATURE 3 + +// Idle rate constants used for GET_/SET_IDLE request +#define HID_IDLE_INDEFINITE 0x0000 +#define HID_IDLE_NOT_SET 0x00FF // Used as dummy init value + +// Protocol constants for use with GET_/SET_PROTOCOL request +#define HID_PROTOCOL_BOOT 0 +#define HID_PROTOCOL_REPORT 1 + + +// Function prototypes +void usbcrSetReport(void); +void usbcrSetProtocol(void); +void usbcrSetIdle(void); +void usbcrGetReport(void); +void usbcrGetProtocol(void); +void usbcrGetIdle(void); + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.c new file mode 100644 index 0000000..e5c210a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.c @@ -0,0 +1,68 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.c + + Description: USB library configuration. + +***********************************************************************************/ + +/// \addtogroup module_usb_firmware_library_config +/// @{ +#define USBFIRMWARELIBRARYCONFIG_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" + +//----------------------------------------------------------------------------- +// READ THIS!! +// +// This file configures the USB Firmware Library. +// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.c", and +// put it in the project catalog. Then edit the code below as needed: +//----------------------------------------------------------------------------- + +// Declaration of global USB descriptor pointers + +USB_DESCRIPTOR_MARKER usbDescriptorMarker= { + (uint8 __code *)&usbDescStart, + (uint8 __code *)&usbDescEnd, + (DESC_LUT_INFO __code *) &usbDescLut, + (DESC_LUT_INFO __code *) &usbDescLutEnd, + (DBLBUF_LUT_INFO __code *) &usbDblbufLut, +}; + +/// @} + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.h new file mode 100644 index 0000000..ed54f2e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_config.h @@ -0,0 +1,77 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_config.h + + Description: Configuration of USB firmware library. + +***********************************************************************************/ + +#ifndef USB_FIRMWARE_LIBRARY_CONFIG_H +#define USB_FIRMWARE_LIBRARY_CONFIG_H + + +/* + * + * Description: + * This file is used to configures the RF USB library. + * The definitions not needed in a project can be commented out. + * + * + * ********** IMPORTANT! ************* + * + * If the RF USB library are to be used, copy the rf_usb_library_config_template.h file + * into the project catalog. + * Rename it to rf_usb_library_config.h, and edit it to get the desired setup of the framework + * + * *********************************** + * + */ + + + +//------------------------------------------------------------------------------------------------------- +// USB framework setup + +// Enter the maximum number of interfaces that are used in the configurations (used to calculate the size +// of the table that stores the currently selected alternate setting for each interface) + +#if !defined USB_SETUP_MAX_NUMBER_OF_INTERFACES +#define USB_SETUP_MAX_NUMBER_OF_INTERFACES 2 +#endif + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif //RF_USB_LIBRARY_CONFIG_H diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_headers.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_headers.h new file mode 100644 index 0000000..10534a2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_firmware_library_headers.h @@ -0,0 +1,67 @@ +/*********************************************************************************** + + Filename: usb_firmware_library_headers.h + + Description: Collects all USB firmware library headers + +***********************************************************************************/ + +#ifndef RF_USB_LIBRARY_HEADERS_H +#define RF_USB_LIBRARY_HEADERS_H + + +// This file includes all of the USB Library header files. +// When using the library, include this file only. + +// Also make a copy of rf_usb_library_config_template.h and add it to your project as +// rf_usb_library_config.h. The definitions in this file should be adapted to your project. + + +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_board.h" +#include "usb_firmware_library_config.h" +#include "usb_descriptor.h" +#include "usb_descriptor_parser.h" +#include "usb_interrupt.h" +#include "usb_framework.h" +#include "usb_reg.h" +#include "usb_standard_requests.h" +#include "usb_suspend.h" + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.c new file mode 100644 index 0000000..b664b80 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.c @@ -0,0 +1,106 @@ +/*********************************************************************************** + + Filename: usb_hid.c + + Description: Application support for the HID class + +***********************************************************************************/ + +/*********************************************************************************** +* INCLUDES +*/ + +#include "usb_firmware_library_headers.h" +#include "usb_hid_reports.h" +#include "usb_class_requests.h" +#include "usb_hid.h" + +/*********************************************************************************** +* GLOBAL DATA +*/ + +/** \brief Initializes the \ref module_usb_firmware_library_config module +* +* This function should be called first. +*/ +void usbHidInit(void) +{ + // Initialize the USB interrupt handler with bit mask containing all processed USBIRQ events + usbirqInit(0xFFFF); + usbfwInit(); // Init USB library. +} + +/// @} + +void usbHidProcessEvents(void) +{ + // Handle USB resume + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESUME) { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME); // Clear USB resume interrupt + if (pFnSuspendExitHook!=NULL) + { + pFnSuspendExitHook(); + } + } + + // Handle USB reset + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) { + USBIRQ_CLEAR_EVENTS(0xFFFF); + usbfwResetHandler(); + } + + // Handle USB suspend + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND); // Clear USB suspend interrupt + if (pFnSuspendEnterHook!=NULL) + { + pFnSuspendEnterHook(); + } + } + + // Handle USB packets on EP0 + if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SETUP) { + USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SETUP); + usbfwSetupHandler(); + } +} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.h new file mode 100644 index 0000000..2f9edd1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid.h @@ -0,0 +1,57 @@ +/*********************************************************************************** + + Filename: usb_hid.h + + Description: Application support for the HID class + +***********************************************************************************/ + +#ifndef USB_HID_H +#define USB_HID_H + +#include "usb_firmware_library_config.h" +#include "usb_hid_reports.h" +#include "usb_class_requests.h" + +void usbHidInit(void); +void usbHidProcessEvents(void); + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_descriptor.s51 b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_descriptor.s51 new file mode 100644 index 0000000..6c2976c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_descriptor.s51 @@ -0,0 +1,489 @@ +/*********************************************************************************** + + Filename: usb_hid_descriptor.s51 + + Description: USB descriptor for HID-devices. + +***********************************************************************************/ +#define ASM_FILE +#include "../library/usb_descriptor.h" + + + MODULE usb_descriptor + + RSEG RCODE + + PUBLIC usbDescStart; + PUBLIC usbDescEnd; + PUBLIC deviceDesc; + PUBLIC configDesc; + PUBLIC interface0Desc; + PUBLIC interface1Desc; + PUBLIC interface3Desc; + PUBLIC endpoint0Desc; + PUBLIC endpoint2Desc; + PUBLIC endpoint5Desc; + PUBLIC hid0Desc; + PUBLIC hid1Desc; + PUBLIC hid3Desc; + PUBLIC entity0Desc; + PUBLIC entity1Desc; + PUBLIC entity3Desc; + PUBLIC entity0DescEnd; + PUBLIC entity1DescEnd; + PUBLIC entity3DescEnd; + PUBLIC string0Desc; + PUBLIC string1Desc; + PUBLIC string2Desc; + PUBLIC string3Desc; + PUBLIC usbDescLut; + PUBLIC usbDescLutEnd; + PUBLIC usbDblbufLut; + PUBLIC usbDblbufLutEnd; + +;;------------------------------------------------------------------------------------------------------- +;; USB descriptors + + +usbDescStart: +deviceDesc: ; Device descriptor + DB deviceDescEnd - deviceDesc ; bLength + DB DESC_TYPE_DEVICE ; bDescriptorType + DW 0200H ; bcdUSB (USB 2.0) + DB 00H ; bDeviceClass (given by interface) + DB 00H ; bDeviceSubClass + DB 00H ; bDeviceProtocol + DB EP0_PACKET_SIZE + DW 0451H ; idVendor (Texas Instruments) + DW 16B4H ; idProduct (CC2540 HID) + DW 0100H ; bcdDevice (v1.0) + DB 01H ; iManufacturer + DB 02H ; iProduct + DB 03H ; iSerialNumber + DB 01H ; bNumConfigurations +deviceDescEnd: + +config1LengthStart: +configDesc: ; Configuration descriptor + DB configDescEnd - configDesc ; bLength + DB DESC_TYPE_CONFIG ; bDescriptorType + DW config1LengthEnd - config1LengthStart ; wTotalLength + DB 03H ; bNumInterfaces + DB 01H ; bConfigurationValue + DB 00H ; iConfiguration + DB 0xA0 ; bmAttributes (bit 5 remote wakeup) + DB 25 ; bMaxPower (max 2 * 25 = 50 mA) +configDescEnd: + +interface0Desc: ; Keyboard interface descriptor + DB interface0DescEnd - interface0Desc ; bLength + DB DESC_TYPE_INTERFACE ; bDescriptorType + DB 00H ; bInterfaceNumber + DB 00H ; bAlternateSetting (none) + DB 01H ; bNumEndpoints + DB 03H ; bInterfaceClass (HID) + DB 01H ; bInterfaceSubClass (Boot) + DB 01H ; bInterfaceProcotol (Keyboard) + DB 00H ; iInterface +interface0DescEnd: + +hid0Desc: ; Keyboard HID descriptor + DB hid0DescEnd - hid0Desc ; bLength + DB DESC_TYPE_HID ; bDescriptorType + DW 0111H ; bcdHID (HID v1.11) + DB 00H ; bCountryCode (not localized) + DB 01H ; bNumDescriptors + DB DESC_TYPE_HIDREPORT ; bDescriptorType + DW entity0DescEnd - entity0Desc ; wDescriptorLength +hid0DescEnd: + +endpoint0Desc: ; Keyboard endpoint descriptor (EP1 IN) + DB endpoint0DescEnd - endpoint0Desc ; bLength + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 81H ; bEndpointAddress + DB EP_ATTR_INT ; bmAttributes (INT) + DW 0008H ; wMaxPacketSize + DB 0AH ; bInterval (10 full-speed frames = 10 ms) +endpoint0DescEnd: + +interface1Desc: ; Consumer interface descriptor + DB interface1DescEnd - interface1Desc ; bLength + DB DESC_TYPE_INTERFACE ; bDescriptorType + DB 01H ; bInterfaceNumber + DB 00H ; bAlternateSetting (none) + DB 01H ; bNumEndpoints + DB 03H ; bInterfaceClass (HID) + DB 00H ; bInterfaceSubClass (None) + DB 00H ; bInterfaceProcotol (Don't Care) + DB 00H ; iInterface +interface1DescEnd: + +hid1Desc: ; Consumer HID descriptor + DB hid1DescEnd - hid1Desc ; bLength + DB DESC_TYPE_HID ; bDescriptor + DW 0111H ; bcdHID (HID v1.11) + DB 00H ; bCountryCode (not localized) + DB 01H ; bNumDescriptors + DB DESC_TYPE_HIDREPORT ; bDescriptorType + DW entity1DescEnd - entity1Desc ; wDescriptorLength +hid1DescEnd: + +; Add output end-point if necessary (e.g., LED output) +; Note that uncommenting the following block itself do not enable output +; the end-point. + +;endpoint1Desc: ; Keyboard endpoint descriptor (EP1 OUT) +; DB endpoint1DescEnd - endpoint1Desc +; DB DESC_TYPE_ENDPOINT ; bDescriptorType +; DB 01H ; bEndpointAddress +; DB EP_ATTR_INT ; bmAttributes (INT) +; DB 01H, 00H ; wMaxPacketSize +; DB 0AH ; bInterval +;endpoint1DescEnd: + +endpoint2Desc: ; Consumer endpoint descriptor (EP2 IN) + DB endpoint2DescEnd - endpoint2Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 82H ; bEndpointAddress + DB EP_ATTR_INT ; bmAttributes (INT) + DB 0CH, 00H ; wMaxPacketSize + DB 0AH ; bInterval +endpoint2DescEnd: + +interface3Desc: ; Mouse interface descriptor + DB interface3DescEnd - interface3Desc + DB DESC_TYPE_INTERFACE ; bDescriptorType + DB 03H ; bInterfaceNumber + DB 00H ; bAlternateSetting + DB 01H ; bNumEndpoints + DB 03H ; bInterfaceClass (HID) + DB 01H ; bInterfaceSubClass (Boot) + DB 02H ; bInterfaceProcotol (Mouse) + DB 00H ; iInterface +interface3DescEnd: + +hid3Desc: ; Mouse HID descriptor + DB hid3DescEnd - hid3Desc + DB DESC_TYPE_HID ; bDescriptor (MemPhis) + DW 0111H ; bcdHID (HID v1.11) + DB 00H ; bCountryCode + DB 01H ; bNumDescriptors + DB DESC_TYPE_HIDREPORT ; bDescriptorType + DB entity3DescEnd - entity3Desc, 00H +hid3DescEnd: + +endpoint5Desc: ; Mouse endpoint descriptor (EP4 IN) + DB endpoint5DescEnd - endpoint5Desc + DB DESC_TYPE_ENDPOINT ; bDescriptorType + DB 84H ; bEndpointAddress + DB EP_ATTR_INT ; bmAttributes (INT) + DB 0FH, 00H ; wMaxPacketSize + DB 0AH ; bInterval +endpoint5DescEnd: + +config1LengthEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; String descriptors +string0Desc: ; Language ID + DB string0DescEnd - string0Desc ; bLength + DB DESC_TYPE_STRING ; bDescriptorType + DW 0409H ; wLangID (English-US) +string0DescEnd: + +string1Desc: ; Manufacturer + DB string1DescEnd - string1Desc ; bLength + DB DESC_TYPE_STRING ; bDescriptorType + DB 'T', 0 ; unicode string + DB 'e', 0 + DB 'x', 0 + DB 'a', 0 + DB 's', 0 + DB ' ', 0 + DB 'I', 0 + DB 'n', 0 + DB 's', 0 + DB 't', 0 + DB 'r', 0 + DB 'u', 0 + DB 'm', 0 + DB 'e', 0 + DB 'n', 0 + DB 't', 0 + DB 's', 0 +string1DescEnd: + +string2Desc: ; Product + DB string2DescEnd - string2Desc ; bLength + DB DESC_TYPE_STRING ; bDescriptorType + DB 'U', 0 ; unicode string + DB 'S', 0 + DB 'B', 0 + DB ' ', 0 + DB 'C', 0 + DB 'C', 0 + DB '2', 0 + DB '5', 0 + DB '4', 0 + DB '0', 0 + DB ' ', 0 + DB 'H', 0 + DB 'I', 0 + DB 'D', 0 +string2DescEnd: + +; To enable multiple HID dongles to connect to a PC, +; program a unique serial number for each dongle. +string3Desc: ; Serial Number + DB string3DescEnd - string3Desc + DB DESC_TYPE_STRING ; bDescriptorType + DB '0', 0 + DB '0', 0 + DB '1', 0 +string3DescEnd: +usbDescEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; HID report descriptors + +entity0Desc: ; Keyboard report descriptor (using format for Boot interface descriptor) + DB 0005H, 0001H ; Usage Pg (Generic Desktop) + DB 0009H, 0006H ; Usage (Keyboard) + DB 00A1H, 0001H ; Collection: (Application) + ; + ; 8 bits: Modifier keys + DB 0095H, 0008H ; Report Count (8) + DB 0075H, 0001H ; Report Size (1) + DB 0005H, 0007H ; Usage Pg (Key Codes) + DB 0019H, 00E0H ; Usage Min (224) + DB 0029H, 00E7H ; Usage Max (231) + DB 0015H, 0000H ; Log Min (0) + DB 0025H, 0001H ; Log Max (1) + DB 0081H, 0002H ; Input: (Data, Variable, Absolute) + ; + ; 1 byte: Reserved + DB 0095H, 0001H ; Report Count (1) + DB 0075H, 0008H ; Report Size (8) + DB 0081H, 0001H ; Input: (Constant) + ; + ; 5 bits: LED report (NumLock, CapsLock, ScrollLock, Compose, Kana) + DB 0095H, 0005H ; Report Count (5) + DB 0075H, 0001H ; Report Size (1) + DB 0005H, 0008H ; Usage Pg (LEDs) + DB 0019H, 0001H ; Usage Min (1) + DB 0029H, 0005H ; Usage Max (5) + DB 0091H, 0002H ; Output: (Data, Variable, Absolute) + ; + ; 3 bits: LED report padding + DB 0095H, 0001H ; Report Count (1) + DB 0075H, 0003H ; Report Size (3) + DB 0091H, 0001H ; Output: (Constant) + ; + ; 6 bytes: Keycode1 - Keycode6 + DB 0095H, 0006H ; Report Count (6) + DB 0075H, 0008H ; Report Size (8) + DB 0005H, 0007H ; Usage Pg (Key Codes) + DB 0019H, 0000H ; Usage Min (0) + DB 0029H, 0065H ; Usage Max (101) + DB 0015H, 0000H ; Log Min (0) + DB 0025H, 0065H ; Log Max (101) + DB 0081H, 0000H ; Input: (Data, Array) + ; + DB 00C0H ; End Collection +entity0DescEnd: + +entity1Desc: ; Consumer report descriptor + DB 005H, 00CH ; Usage Pg (Consumer Devices) + DB 009H, 001H ; Usage (Consumer Control) + DB 0A1H, 001H ; Collection (Application) + DB 009H, 002H ; Usage (Numeric Key Pad) + DB 0A1H, 002H ; Collection (Logical) + DB 005H, 009H ; Usage Pg (Button) + DB 019H, 001H ; Usage Min (Button 1) + DB 029H, 00AH ; Usage Max (Button 10) + DB 015H, 001H ; Logical Min (1) + DB 025H, 00AH ; Logical Max (10) + DB 075H, 004H ; Report Size (4) + DB 095H, 001H ; Report Count (1) + DB 081H, 000H ; Input (Data, Ary, Abs) + DB 0C0H ; End Collection + DB 005H, 00CH ; Usage Pg (Consumer Devices) + DB 009H, 086H ; Usage (Channel) + DB 015H, 0FFH ; Logical Min (-1) + DB 025H, 001H ; Logical Max (1) + DB 075H, 002H ; Report Size (2) + DB 095H, 001H ; Report Count (1) + DB 081H, 046H ; Input (Data, Var, Rel, Null) + DB 009H, 0E9H ; Usage (Volume Up) + DB 009H, 0EAH ; Usage (Volume Down) + DB 015H, 000H ; Logical Min (0) + DB 075H, 001H ; Report Size (1) + DB 095H, 002H ; Report Count (2) + DB 081H, 002H ; Input (Data, Var, Abs) + DB 009H, 0E2H ; Usage (Mute) + DB 009H, 030H ; Usage (Power) + DB 009H, 083H ; Usage (Recall Last) + DB 009H, 081H ; Usage (Assign Selection) + DB 009H, 0CDH ; Usage (Play/Pause) // HACKED CHANGE + DB 009H, 040H ; Usage (Menu) // HACKED CHANGE + DB 009H, 0B2H ; Usage (Record) + DB 009H, 0B3H ; Usage (Fast Forward) + DB 009H, 0B4H ; Usage (Rewind) + DB 009H, 0B5H ; Usage (Scan Next) + DB 009H, 0B6H ; Usage (Scan Prev) + DB 009H, 0B7H ; Usage (Stop) + DB 015H, 001H ; Logical Min (1) + DB 025H, 00CH ; Logical Max (12) + DB 075H, 004H ; Report Size (4) + DB 095H, 001H ; Report Count (1) + DB 081H, 000H ; Input (Data, Ary, Abs) + DB 009H, 080H ; Usage (Selection) + DB 0A1H, 002H ; Collection (Logical) + DB 005H, 009H ; Usage Pg (Button) + DB 019H, 001H ; Usage Min (Button 1) + DB 029H, 003H ; Usage Max (Button 3) + DB 015H, 001H ; Logical Min (1) + DB 025H, 003H ; Logical Max (3) + DB 075H, 002H ; Report Size (2) + DB 081H, 000H ; Input (Data, Ary, Abs) + DB 0C0H ; End Collection + DB 081H, 003H ; Input (Const, Var, Abs) + + DB 0C0H ; End Collection +entity1DescEnd: + +entity3Desc: + DB 0x05, 0x01 ; Usage Page (Generic Desktop) + DB 0x09, 0x02 ; Usage (Mouse) + DB 0xA1, 0x01 ; Collection (Application) + DB 0x09, 0x01 ; Usage (Pointer) + DB 0xA1, 0x00 ; Collection (Physical) + DB 0x05, 0x09 ; Usage Page (Buttons) + DB 0x19, 0x01 ; Usage Minimum (01) - Button 1 + DB 0x29, 0x03 ; Usage Maximum (03) - Button 3 + DB 0x15, 0x00 ; Logical Minimum (0) + DB 0x25, 0x01 ; Logical Maximum (1) + DB 0x75, 0x01 ; Report Size (1) + DB 0x95, 0x03 ; Report Count (3) + DB 0x81, 0x02 ; Input (Data, Variable, Absolute) - Button states + DB 0x75, 0x05 ; Report Size (5) + DB 0x95, 0x01 ; Report Count (1) + DB 0x81, 0x01 ; Input (Constant) - Padding or Reserved bits + + DB 0x05, 0x01 ; Usage Page (Generic Desktop) + DB 0x09, 0x30 ; Usage (X) + DB 0x09, 0x31 ; Usage (Y) + DB 0x09, 0x38 ; Usage (Z) + DB 0x15, 0x81 ; Logical Minimum (-127) + DB 0x25, 0x7F ; Logical Maximum (127) + DB 0x75, 0x08 ; Report Size (8) + DB 0x95, 0x03 ; Report Count (3) + DB 0x81, 0x06 ; Input (Data, Variable, Relative) - X & Y coordinate + + DB 0xC0 ; End Collection + DB 0xC0 ; End Collection +entity3DescEnd: + +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for descriptors that are not returned through requests for DSC_DEVICE, DSC_CONFIG or +;; DSC_STRING (e.g. HID report descriptors) +usbDescLut: DB DESC_TYPE_HIDREPORT, 00H ; value (MSB:LSB) + DB 00H, 00H ; index (MSB:LSB) + DW entity0Desc ; pDesc + DW entity0DescEnd - entity0Desc ; length + + DB DESC_TYPE_HIDREPORT, 00H ; value (MSB:LSB) + DB 00H, 01H ; index (MSB:LSB) + DW entity1Desc ; pDesc + DW entity1DescEnd - entity1Desc ; length + + DB DESC_TYPE_HIDREPORT, 00H ; value (MSB:LSB) + DB 00H, 03H ; index (MSB:LSB) + DW entity3Desc ; pDesc + DW entity3DescEnd - entity3Desc ; length + + DB DESC_TYPE_HID, 00H ; value (MSB:LSB) + DB 00H, 00H ; index (MSB:LSB) + DW hid0Desc ; pDesc + DW hid0DescEnd - hid0Desc ; length + + DB DESC_TYPE_HID, 00H ; value (MSB:LSB) + DB 00H, 01H ; index (MSB:LSB) + DW hid1Desc ; pDesc + DW hid1DescEnd - hid1Desc ; length + + DB DESC_TYPE_HID, 00H ; value (MSB:LSB) + DB 00H, 03H ; index (MSB:LSB) + DW hid3Desc ; pDesc + DW hid3DescEnd - hid3Desc ; length + +usbDescLutEnd: +;;------------------------------------------------------------------------------------------------------- + + +;;------------------------------------------------------------------------------------------------------- +;; Look-up table for double buffer settings (one set of bit masks for each defined interface) +usbDblbufLut: DW interface0Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask + + DW interface1Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask + + DW interface3Desc ; pInterface + DB 00H ; inMask + DB 00H ; outMask +usbDblbufLutEnd: +;;------------------------------------------------------------------------------------------------------- + + + END; + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +|The default USB descriptor defines a minimum configuration, with no endpoints +|apart from EP0. The application can define 3 IN and OUT endpoints, and override +|the configuration and interface descriptor (only one of each). +|The device and string descriptors are locked. ++------------------------------------------------------------------------------*/ + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_hooks.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_hooks.c new file mode 100644 index 0000000..6f26dde --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_hooks.c @@ -0,0 +1,148 @@ +/*********************************************************************************** + + Filename: usb_hid_hooks.c + + Contains the necessary hook functions for various USB request processing + that is featured from the USB firmware library. Some + functions are empty. + +***********************************************************************************/ + +/*********************************************************************************** +* INCLUDES +*/ + +#include "usb_firmware_library_headers.h" +#include "usb_class_requests.h" + + +/*********************************************************************************** +* GLOBAL DATA +*/ + + + +// **************************************************************************************** +// All Hooks and functions required by the USB library. +// **************************************************************************************** + +// **************** Process USB class requests with OUT data phase ************************ +void usbcrHookProcessOut(void) +{ + // Process USB class requests with OUT data phase, or stall endpoint 0 when unsupported + switch (usbSetupHeader.request) { + case SET_REPORT: usbcrSetReport(); break; + case SET_PROTOCOL: usbcrSetProtocol(); break; + case SET_IDLE: usbcrSetIdle(); break; + default: usbfwData.ep0Status = EP_STALL; break; + } +} + + +// **************** Process USB class requests with IN data phase ************************* +void usbcrHookProcessIn(void) +{ + // Process USB class requests with IN data phase, or stall endpoint 0 when unsupported + switch (usbSetupHeader.request) { + case GET_REPORT: usbcrGetReport(); break; + case GET_PROTOCOL: usbcrGetProtocol(); break; + case GET_IDLE: usbcrGetIdle(); break; + default: usbfwData.ep0Status = EP_STALL; break; + } +} + + +// ******************************** Unsupported USB hooks ******************************** +void usbvrHookProcessOut(void) { usbfwData.ep0Status = EP_STALL; } +void usbvrHookProcessIn(void) { usbfwData.ep0Status = EP_STALL; } + +// ************************ unsupported/unhandled standard requests ********************** +void usbsrHookSetDescriptor(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSynchFrame(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookClearFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookSetFeature(void) { usbfwData.ep0Status = EP_STALL; } +void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus) +{ + (void)recipient; + (void)index; + (void)pStatus; +} + + +// ************************ USB standard request event processing ************************* +void usbsrHookProcessEvent(uint8 event, uint8 index) +{ + (void)index; + + // Process relevant events, one at a time. + switch (event) { + case USBSR_EVENT_CONFIGURATION_CHANGING : //(the device configuration is about to change) + break; + case USBSR_EVENT_CONFIGURATION_CHANGED :// (the device configuration has changed) + break; + case USBSR_EVENT_INTERFACE_CHANGING ://(the alternate setting of the given interface is about to change) + break; + case USBSR_EVENT_INTERFACE_CHANGED : //(the alternate setting of the given interface has changed) + break; + case USBSR_EVENT_REMOTE_WAKEUP_ENABLED ://(remote wakeup has been enabled by the host) + break; + case USBSR_EVENT_REMOTE_WAKEUP_DISABLED ://(remote wakeup has been disabled by the host) + break; + case USBSR_EVENT_EPIN_STALL_CLEARED ://(the given IN endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPIN_STALL_SET ://(the given IN endpoint has been stalled by the host) + break; + case USBSR_EVENT_EPOUT_STALL_CLEARED ://(the given OUT endpoint's stall condition has been cleared the host) + break; + case USBSR_EVENT_EPOUT_STALL_SET ://(the given OUT endpoint has been stalled by the PC) + break; + } +} + + +// ************************ USB interrupt event processing ******************************** +void usbirqHookProcessEvents(void) +{ + // Handle events that require immediate processing here +} + + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.c new file mode 100644 index 0000000..4fdadcc --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.c @@ -0,0 +1,103 @@ +/*********************************************************************************** + + Filename: usb_hid_reports.h + + Description: Implementation of HID reports + +***********************************************************************************/ + +#include "usb_firmware_library_headers.h" +#include "usb_class_requests.h" +#include "usb_hid_reports.h" + + +HID_DATA hidData = { + .keyboardOutReport.ledStatus= 0, + .keyboardProtocol = HID_PROTOCOL_REPORT, // Default, as suggested by HID spec + .mouseProtocol = HID_PROTOCOL_REPORT, + .keyboardIdleRate = HID_IDLE_NOT_SET, // Use this as init value, until it is set by USB host + .mouseIdleRate = HID_IDLE_NOT_SET, +}; + +#define halIntUnlock(HIS) HAL_EXIT_CRITICAL_SECTION((HIS)) +static halIntState_t halIntLock(void); +static halIntState_t halIntLock(void) +{ + halIntState_t intState = EA; + HAL_DISABLE_INTERRUPTS(); + return intState; +} + +/************************************************************************************************** + * @fn hidSendHidInReport + * + * @brief Send HID Consumer Control report. + * + * input parameters + * + * @param pReport - report to be sent + * @param endPoint - endPoint associated with report. + * @param len - length of report + * + * output parameters + * + * None. + * + * @return TRUE if report was sent; FALSE otherwise. + */ +uint8 hidSendHidInReport(uint8 *pReport, uint8 endPoint, uint8 len) +{ + uint8 result = FALSE; + + if (endPoint < 6) + { + uint8 ea = halIntLock(); + + USBFW_SELECT_ENDPOINT(endPoint); + if (!(USBCSIL & USBCSIL_INPKT_RDY)) + { + usbfwWriteFifo(((&USBF0) + (endPoint << 1)), len, pReport); + USBCSIL |= USBCSIL_INPKT_RDY; + result = TRUE; + } + halIntUnlock(ea); + } + + return result; +} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.h new file mode 100644 index 0000000..7cc7286 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/class_hid/usb_hid_reports.h @@ -0,0 +1,85 @@ +/*********************************************************************************** + + Filename: usb_hid_reports.h + + Description: Definitions and prototypes for HID reports + +***********************************************************************************/ + +#ifndef USBHIDREPORTS_H +#define USBHIDREPORTS_H + +#include "hal_types.h" + +#define USB_HID_KBD_EP 1 // USB Keyboard Endpoint +#define USB_HID_CC_EP 2 // USB Consumer Control Endpoint +#define USB_HID_MOUSE_EP 4 // USB Mouse Endpoint + +typedef struct { + uint8 ledStatus; +} KEYBOARD_OUT_REPORT; + +typedef struct { + uint8 modifiers; + uint8 reserved; + uint8 pKeyCodes[6]; +} KEYBOARD_IN_REPORT; + +typedef struct { + uint8 buttons; + int8 dX; + int8 dY; + int8 dZ; +} MOUSE_IN_REPORT; + + +typedef struct { + KEYBOARD_OUT_REPORT keyboardOutReport; + uint8 keyboardProtocol; + uint8 mouseProtocol; + uint16 keyboardIdleRate; + uint16 mouseIdleRate; +} HID_DATA; + + +extern HID_DATA hidData; + +uint8 hidSendHidInReport(uint8 *pReport, uint8 endPoint, uint8 len); +void hidShowKeyboardLeds(void); + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2013 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/driver/ccxxxx_usb_cdc.inf b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/driver/ccxxxx_usb_cdc.inf new file mode 100644 index 0000000..faa1ea8 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/driver/ccxxxx_usb_cdc.inf @@ -0,0 +1,100 @@ +; +; Texas Instruments CCxxxx USB Serial Port Setup File +; +; Based on Windows USB CDC ACM Setup File +; Copyright (c) 2000 Microsoft Corporation +; Copyright (c) 2013 Texas Instruments Inc + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%PROVIDER% +DriverVer=04/05/2013,1.2.0.0 +CatalogFile=ccxxxx_usb_cdc.cat + +[Manufacturer] +%MFGNAME%=DeviceList,NTx86,NTamd64 + + +[DeviceList.NTx86] +%DESC_SRFEB% = DriverInstall, USB\VID_0451&PID_16B6 +%DESC_CC2511% = DriverInstall, USB\VID_0451&PID_16A4 +%DESC_CC1111% = DriverInstall, USB\VID_0451&PID_16A6 +%DESC_CC2531% = DriverInstall, USB\VID_0451&PID_16A8 +%DESC_CC2540% = DriverInstall, USB\VID_0451&PID_16AA +%DESC_CC2544% = DriverInstall, USB\VID_0451&PID_16C5 +%DESC_CC2538% = DriverInstall, USB\VID_0451&PID_16C8 +%DESC_CCXXXXBL% = DriverInstall, USB\VID_0451&PID_16C7 +%DESC_REMOTINP% = DriverInstall, USB\VID_0451&PID_16B1 + +[DeviceList.NTamd64] +%DESC_SRFEB% = DriverInstall, USB\VID_0451&PID_16B6 +%DESC_CC2511% = DriverInstall, USB\VID_0451&PID_16A4 +%DESC_CC1111% = DriverInstall, USB\VID_0451&PID_16A6 +%DESC_CC2531% = DriverInstall, USB\VID_0451&PID_16A8 +%DESC_CC2540% = DriverInstall, USB\VID_0451&PID_16AA +%DESC_CC2544% = DriverInstall, USB\VID_0451&PID_16C5 +%DESC_CC2538% = DriverInstall, USB\VID_0451&PID_16C8 +%DESC_CCXXXXBL% = DriverInstall, USB\VID_0451&PID_16C7 +%DESC_REMOTINP% = DriverInstall, USB\VID_0451&PID_16B1 + + +;------------------------------------------------------------------------------ +; Windows 32-bit sections +;------------------------------------------------------------------------------ + +[DriverInstall.NTx86] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=DriverRegistryKeys + +[DriverInstall.NTx86.Services] +AddService=usbser, 0x00000002, DriverService + + +;------------------------------------------------------------------------------ +; Windows 64-bit sections +;------------------------------------------------------------------------------ + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=DriverRegistryKeys + +[DriverInstall.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService + + +;------------------------------------------------------------------------------ +; +;------------------------------------------------------------------------------ + +[DriverRegistryKeys] +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverService] +DisplayName = %SERVICE% +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %12%\usbser.sys + + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ + +[Strings] +PROVIDER = "Texas Instruments" +MFGNAME = "Texas Instruments" +SERVICE = "TI USB CDC Driver" +DESC_SRFEB = "TI SmartRFEB USB CDC Serial Port" +DESC_CC1111 = "TI CC1111 USB CDC Serial Port" +DESC_CC2511 = "TI CC2511 USB CDC Serial Port" +DESC_CC2531 = "TI CC2531 USB CDC Serial Port" +DESC_CC2538 = "TI CC2538 USB CDC Serial Port" +DESC_CC2540 = "TI CC2540 USB CDC Serial Port" +DESC_CC2544 = "TI CC2544 USB CDC Serial Port" +DESC_CCXXXXBL = "TI CCxxxx Generic USB CDC Boot Loader" +DESC_REMOTINP = "RemoTI Network Processor" diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h new file mode 100644 index 0000000..f476804 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_board_cfg.h @@ -0,0 +1,162 @@ +/************************************************************************************************** + Filename: usb_board_cfg.h + Revised: $Date: 2009-10-29 16:58:47 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21022 $ + + Description: + + This file implements the Temperature/Voltage Sample Application. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef USB_BOARD_CFG_H +#define USB_BOARD_CFG_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_mcu.h" +#include "ioCC2540.h" +#include "usb_reg.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_BOARD_IO_USB_ENABLE_PORT 1 // USB pull-up enable +#define HAL_BOARD_IO_USB_ENABLE_PIN 0 + +#define BIT0 0x01 +#define BIT1 0x02 +#define BIT2 0x04 +#define BIT3 0x08 +#define BIT4 0x10 +#define BIT5 0x20 +#define BIT6 0x40 +#define BIT7 0x80 + +#if !defined HAL_UART_USB_SUSPEND +#define HAL_UART_USB_SUSPEND FALSE +#endif + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_USB_ENABLE() st( USBCTRL= USBCTRL_PLL_EN | USBCTRL_USB_EN; \ + while (!(USBCTRL&USBCTRL_PLL_LOCKED)); ) +#define HAL_USB_PLL_DISABLE() st( USBCTRL&= ~USBCTRL_PLL_EN; \ + while (USBCTRL&USBCTRL_PLL_LOCKED); ) +#define HAL_USB_DISABLE st(USBCTRL = 0; while (USBCTRL & 0x80);) + +#define HAL_USB_PULLUP_ENABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 1) +#define HAL_USB_PULLUP_DISABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 0) + +#define HAL_USB_INT_ENABLE() st( P2IEN|= 0x20; IEN2|= 0x02; ) +#define HAL_USB_INT_DISABLE() st( P2IEN&= ~0x20; ) +#define HAL_USB_INT_CLEAR() st( P2IFG= 0; P2IF= 0; ) + +#define HAL_USB_RESUME_INT_ENABLE() st ( USBCIE |= 0x02; ) +#define HAL_USB_RESUME_INT_DISABLE() st ( USBCIE &= ~0x02; ) + +#define USBCTRL_PLL_LOCKED 0x80 +#define USBCTRL_PLL_EN 0x02 +#define USBCTRL_USB_EN 0x01 + +#define P2IFG_DPIF 0x20 + +#define CC2540_IS_XOSC_STABLE() (SLEEPSTA & XOSC_STB) + +#define NOP() asm("NOP") +#define MCU_IO_TRISTATE 1 // Used as "func" for the macros below +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +//----------------------------------------------------------------------------- +// Macros for simple configuration of IO pins on TI LPW SoCs +//----------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) +#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) +#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) +#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) +#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) +#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) +#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) + +#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) +#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) + +//---------------------------------------------------------------------------------- +// Macros for internal use (the macros above need a new round in the preprocessor) +//---------------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + +#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BV(pin); \ + P##port##DIR &= ~BV(pin); \ + switch (func) { \ + case MCU_IO_PULLUP: \ + P##port##INP &= ~BV(pin); \ + P2INP &= ~BV(port + 5); \ + break; \ + case MCU_IO_PULLDOWN: \ + P##port##INP &= ~BV(pin); \ + P2INP |= BV(port + 5); \ + break; \ + default: \ + P##port##INP |= BV(pin); \ + break; } ) + +#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) +#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) + +#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) +#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BV(pin)) + +#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR &= ~BV(pin); ) +#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BV(pin); ) + +#endif +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c new file mode 100644 index 0000000..525c7c6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_interrupt.c @@ -0,0 +1,140 @@ +/*********************************************************************************** + + Filename: usb_interrupt.c + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +/// \addtogroup module_usb_interrupt +/// @{ +#define USBINTERRUPT_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" +#include "hal_flash.h" +#include "hal_led.h" + + +/** \brief Initializes the \ref module_usb_interrupt module + * + * This function should be called after the \ref module_usb_framework module has been initialized. + * Use interrupt group priority control (refer to the CC2531 datasheet) to adjust the priority of the + * USB interrupt relative to other interrupts. + * + * \param[in] irqMask + * A bit mask containing USBIRQ_EVENT bits for all events that shall be reported + */ +void usbirqInit(uint16 irqMask) +{ + // Initialize variables + usbirqData.eventMask = 0x0000; + usbirqData.inSuspend = FALSE; + usbirqData.irqMask = irqMask; + + // Select which IRQ flags to handle + USBCIE = irqMask; + USBIIE = irqMask >> 4; + USBOIE = (irqMask >> 9) & 0x3E; + + HAL_USB_INT_CLEAR(); + HAL_USB_INT_ENABLE(); + +} // usbirqInit + + + +/** \brief USB interrupt handler + * + * Clears the P2 interrupt flag and converts all USB interrupt flags into events. + * The interrupt also lets \ref usbsuspEnter() break from the suspend loop. + */ +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void) +#else +#pragma vector=P2INT_VECTOR +__interrupt void usbirqHandler(void) +#endif +{ + uint8 usbcif; + + // First make sure that the crystal oscillator is stable + while (!CC2540_IS_XOSC_STABLE()); + + // Special handling for reset interrupts + usbcif = USBCIF; + if (usbcif & USBCIF_RSTIF) { + + // All interrupts (except suspend) are by default enabled by hardware, so + // re-initialize the enable bits to avoid unwanted interrupts + USBCIE = usbirqData.irqMask; + USBIIE = usbirqData.irqMask >> 4; + USBOIE = (usbirqData.irqMask >> 9) & 0x3E; + + // Enable suspend mode when suspend signaling is detected on the bus + USBPOW |= USBPOW_SUSPEND_EN; + } + + // Record events (keeping existing) + usbirqData.eventMask |= (uint16) usbcif; + usbirqData.eventMask |= (uint16) USBIIF << 4; + usbirqData.eventMask |= (uint16) USBOIF << 9; + + // If we get a suspend event, we should always enter suspend mode. We must, + // however be sure that we exit the suspend loop upon resume or reset + // signaling. + if (usbcif & USBCIF_SUSPENDIF) { + usbirqData.inSuspend = TRUE; + } + if (usbcif & (USBCIF_RSTIF | USBCIF_RESUMEIF)) { + usbirqData.inSuspend = FALSE; + } + if (P2IFG & P2IFG_DPIF) { + // Resume interrupt detected on D+ line while in suspend + P2IFG = ~P2IFG_DPIF; + usbirqData.inSuspend = FALSE; + } + + // Handle event which need immediate processing + usbirqHookProcessEvents(); + + // Clear the interrupt + HAL_USB_INT_CLEAR(); + +} // usbirqHandler + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c new file mode 100644 index 0000000..4636c07 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540/usb_suspend.c @@ -0,0 +1,139 @@ +/*********************************************************************************** + + Filename: usb_suspend.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_suspend +/// @{ +#include "usb_firmware_library_headers.h" +#include "hal_board.h" +#include "hal_mcu.h" +#include "hal_led.h" + +__xdata VFPTR pFnSuspendEnterHook= NULL; +__xdata VFPTR pFnSuspendExitHook= NULL; + +#if HAL_UART_USB_SUSPEND +extern void halEnterPowerMode(void); + +/** \brief Puts the chip into power mode 1 during USB suspend. + * + * This function must be called from main (i.e. not from interrupt context) upon the reception of a + * \ref USBIRQ_EVENT_SUSPEND event. To comply with the USB specification, this must happen within 10 ms + * after the event occurs. The chip will stay in power mode 1 until a USB resume or USB reset is detected + * on the USB bus, or remote wakeup is used. During this period, the MCU can only run code from + * interrupt context. + */ +void usbsuspEnter(void) +{ + if (pFnSuspendEnterHook!=NULL) + pFnSuspendEnterHook(); + + HAL_USB_INT_CLEAR(); + HAL_USB_INT_ENABLE(); + + // Disable USB clock (PLL) before entering PM1 + HAL_USB_PLL_DISABLE(); + + HAL_LED_CLR_1(); + + do { + // Enter PM1, in prescribed manner as explained in CC253x User's Guide + SLEEPCMD = 0x05; + halEnterPowerMode(); + } while ( usbirqData.inSuspend ); + + // .... we are now up and running again + + // First make sure that the crystal oscillator is stable + while (!CC2540_IS_XOSC_STABLE()); + + // Restart the USB clock (PLL) + HAL_USB_ENABLE(); + + if (pFnSuspendExitHook!=NULL) + pFnSuspendExitHook(); +} // usbsuspEnter +#endif + + + +/** \brief Attempts USB remote wakeup. + * + * This function can be called from interrupt context while the USB device is suspend mode. If the device + * is privileged to do so (see \c usbfwData.remoteWakeup and the \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED + * and \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED events), remote wakeup will be performed. Note that this + * function will block for 10 ms while the resume signal is set on the bus. Note: This function can only + * be called when the 48 MHz XOSC is stable. + * + * \return + * \c TRUE if the remote wakeup was performed (the privilege had been granted), otherwise \c FALSE + * (the device is still in suspend mode). + */ +uint8 usbsuspDoRemoteWakeup(void) +{ + extern void halMcuWaitMs(uint16 msec); + halIntState_t intState; + + // Make sure that it's OK + if (!usbfwData.remoteWakeup) return FALSE; + + HAL_ENTER_CRITICAL_SECTION(intState); + + // Make sure that the suspend loop does not power down the chip again + usbirqData.inSuspend = FALSE; + + // Perform remote wakeup by holding the USB resume signal for 10 ms + USBPOW |= USBPOW_RESUME; + halMcuWaitMs(10); + USBPOW &= ~USBPOW_RESUME; + + // Clear the interrupt flag + HAL_USB_INT_CLEAR(); + + HAL_EXIT_CRITICAL_SECTION(intState); + + return TRUE; + +} // usbsuspDoRemoteWakeup + + + +//@} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_board_cfg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_board_cfg.h new file mode 100644 index 0000000..f421c71 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_board_cfg.h @@ -0,0 +1,171 @@ +/************************************************************************************************** + Filename: usb_board_cfg.h + Revised: $Date: 2010-11-04 10:16:17 -0700 (Thu, 04 Nov 2010) $ + Revision: $Revision: 24330 $ + + Description: + + This file implements the Temperature/Voltage Sample Application. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef USB_BOARD_CFG_H +#define USB_BOARD_CFG_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_mcu.h" +#include "ioCC2540.h" +#include "usb_reg.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_BOARD_IO_USB_ENABLE_PORT 1 // USB pull-up enable +#define HAL_BOARD_IO_USB_ENABLE_PIN 0 + +#define BIT0 0x01 +#define BIT1 0x02 +#define BIT2 0x04 +#define BIT3 0x08 +#define BIT4 0x10 +#define BIT5 0x20 +#define BIT6 0x40 +#define BIT7 0x80 + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ +/* Check for lock of 32MHz XOSC and the source for 32K clock. */ +#define HAL_BOARD_STABLE() (CLKCONSTA == (CLKCONCMD_32MHZ | OSC_32KHZ)) + + + +#define HAL_USB_ENABLE() st( \ + while (!HAL_BOARD_STABLE()); \ + USBCTRL = USBCTRL_USB_EN | USBCTRL_PLL_EN; \ + while (!(USBCTRL & USBCTRL_PLL_LOCKED)); \ +) + +#define HAL_USB_RUN() st( \ + HAL_USB_PULLUP_ENABLE(); /* Enable pullup on D+. */\ + HAL_USB_INT_CLEAR(); \ + HAL_USB_INT_ENABLE(); \ +) + +#define HAL_USB_PLL_DISABLE() st( USBCTRL &= ~USBCTRL_PLL_EN; while (USBCTRL & USBCTRL_PLL_LOCKED); ) +#define HAL_USB_DISABLE st( USBCTRL = 0; while (USBCTRL & USBCTRL_PLL_LOCKED); ) + +#define HAL_USB_PULLUP_ENABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 1) +#define HAL_USB_PULLUP_DISABLE() \ + MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 0) + +#define HAL_USB_INT_ENABLE() st( P2IEN|= 0x20; IEN2|= 0x02; ) +#define HAL_USB_INT_DISABLE() st( P2IEN&= ~0x20; ) +#define HAL_USB_INT_CLEAR() st( P2IFG= 0; P2IF= 0; ) + +#define HAL_USB_RESUME_INT_ENABLE() st ( USBCIE |= 0x02; ) +#define HAL_USB_RESUME_INT_DISABLE() st ( USBCIE &= ~0x02; ) + +#define USBCTRL_PLL_LOCKED 0x80 +#define USBCTRL_PLL_EN 0x02 +#define USBCTRL_USB_EN 0x01 + +#define P2IFG_DPIF 0x20 + +#define CC2540_IS_XOSC_STABLE() (SLEEPSTA & XOSC_STB) + +#define NOP() asm("NOP") +#define MCU_IO_TRISTATE 1 // Used as "func" for the macros below +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +//----------------------------------------------------------------------------- +// Macros for simple configuration of IO pins on TI LPW SoCs +//----------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) +#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) +#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) +#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) +#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) +#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) +#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) + +#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) +#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) + +//---------------------------------------------------------------------------------- +// Macros for internal use (the macros above need a new round in the preprocessor) +//---------------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); ) + +#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BV(pin); \ + P##port##DIR &= ~BV(pin); \ + switch (func) { \ + case MCU_IO_PULLUP: \ + P##port##INP &= ~BV(pin); \ + P2INP &= ~BV(port + 5); \ + break; \ + case MCU_IO_PULLDOWN: \ + P##port##INP &= ~BV(pin); \ + P2INP |= BV(port + 5); \ + break; \ + default: \ + P##port##INP |= BV(pin); \ + break; } ) + +#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \ + P##port##_##pin## = val; \ + P##port##DIR |= BV(pin); ) + +#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) +#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) + +#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) +#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BV(pin)) + +#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR &= ~BV(pin); ) +#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BV(pin); ) + +#endif +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_interrupt.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_interrupt.c new file mode 100644 index 0000000..424cf2c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_interrupt.c @@ -0,0 +1,117 @@ +/*********************************************************************************** + + Filename: usb_interrupt.c + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +/// \addtogroup module_usb_interrupt +/// @{ +#define USBINTERRUPT_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" + + +/** \brief Initializes the \ref module_usb_interrupt module + * + * This function should be called after the \ref module_usb_framework module has been initialized. + * Use interrupt group priority control (refer to the CC2531 datasheet) to adjust the priority of the + * USB interrupt relative to other interrupts. + * + * \param[in] irqMask + * A bit mask containing USBIRQ_EVENT bits for all events that shall be reported + */ +void usbirqInit(uint16 irqMask) +{ + usbirqData.eventMask = 0x0000; + usbirqData.irqMask = irqMask; + usbirqData.inSuspend = FALSE; +} + + + +/** \brief USB interrupt handler + * + * Clears the P2 interrupt flag and converts all USB interrupt flags into events. + * The interrupt also lets \ref usbsuspEnter() break from the suspend loop. + */ +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void) +#else +#pragma vector=P2INT_VECTOR +__interrupt void usbirqHandler(void) +#endif +{ + uint16 eventMask; + uint8 usbcif; + + HAL_ENTER_ISR(); + HAL_USB_ENABLE(); // Never access the USB controller before PLL is stable. + usbcif = USBCIF; + + if ((usbcif & (USBCIF_RSTIF | USBCIF_RESUMEIF)) || (P2IFG & P2IFG_DPIF)) { + if (usbcif & USBCIF_RSTIF) { + // All interrupts (except suspend) are by default enabled by hardware, so + // re-initialize the enable bits to avoid unwanted interrupts + USBCIE = usbirqData.irqMask; + USBIIE = usbirqData.irqMask >> 4; + USBOIE = (usbirqData.irqMask >> 9) & 0x3E; + + // Enable suspend mode when suspend signaling is detected on the bus + USBPOW |= USBPOW_SUSPEND_EN; + } + + usbcif |= USBCIF_RESUMEIF; + usbirqData.inSuspend = FALSE; + } + else if (usbcif & USBCIF_SUSPENDIF) { + HAL_USB_PLL_DISABLE(); // Disable USB clock (PLL). + usbirqData.inSuspend = TRUE; + } + + eventMask = usbcif; + eventMask |= (uint16)USBIIF << 4; + eventMask |= (uint16)USBOIF << 9; + usbirqData.eventMask |= eventMask; // Record events (keeping existing). + + HAL_USB_INT_CLEAR(); + HAL_EXIT_ISR(); +} + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2008-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_suspend.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_suspend.c new file mode 100644 index 0000000..70043ea --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/cc2540_hid/usb_suspend.c @@ -0,0 +1,116 @@ +/*********************************************************************************** + + Filename: usb_suspend.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_suspend +/// @{ +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" +#include "hal_sleep.h" + +__xdata VFPTR pFnSuspendEnterHook= NULL; +__xdata VFPTR pFnSuspendExitHook= NULL; + +/*********************************************************************************** +* @fn halMcuWaitMs +* +* @brief Busy wait function. Waits the specified number of milliseconds. Use +* assumptions about number of clock cycles needed for the various +* instructions. +* +* NB! This function is highly dependent on architecture and compiler! +* +* @param uint16 millisec - number of milliseconds delay +* +* @return none +*/ +#pragma optimize=none +static void halMcuWaitMs(uint16 msec) +{ + while(msec--) + { + halSleepWait(1000); + } +} + +/** \brief Attempts USB remote wakeup. + * + * This function can be called from interrupt context while the USB device is suspend mode. If the device + * is privileged to do so (see \c usbfwData.remoteWakeup and the \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED + * and \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED events), remote wakeup will be performed. Note that this + * function will block for 10 ms while the resume signal is set on the bus. Note: This function can only + * be called when the 48 MHz XOSC is stable. + * + * \return + * \c TRUE if the remote wakeup was performed (the privilege had been granted), otherwise \c FALSE + * (the device is still in suspend mode). + */ +uint8 usbsuspDoRemoteWakeup(void) +{ + halIntState_t intState; + uint8 exit = FALSE; + + if (!usbfwData.remoteWakeup) return FALSE; // Make sure that it's OK + + HAL_ENTER_CRITICAL_SECTION(intState); + + if (usbirqData.inSuspend) + { + HAL_USB_ENABLE(); // Never access the USB controller before PLL is stable. + USBPOW |= USBPOW_RESUME; + halMcuWaitMs(10); // Perform remote wakeup by holding the USB resume signal for 10 ms. + USBPOW &= ~USBPOW_RESUME; + exit = TRUE; + } + + HAL_EXIT_CRITICAL_SECTION(intState); + + if (exit && (pFnSuspendExitHook!=NULL)) + { + pFnSuspendExitHook(); + } + + return TRUE; +} + + + +//@} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_descriptor_parser.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_descriptor_parser.c new file mode 100644 index 0000000..6f9a88e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_descriptor_parser.c @@ -0,0 +1,386 @@ +/*********************************************************************************** + + Filename: usb_descriptor_parser.c + + Description: Parser for USB descriptor structures. + +***********************************************************************************/ + +/// \addtogroup module_usb_descriptor_parser +/// @{ +#define USBDESCRIPTORPARSER_C ///< Modifies the behavior of "EXTERN" in usb_descriptor_parser.h +#include "usb_firmware_library_headers.h" + +#define BLE_INFO_PAGE_BDADDR 0x780C // LSB..MSB +#define BLE_INFO_PAGE_BDADDR_LEN 8 +#define BLE_INFO_PAGE_WAFER_INFO 0x7FF4 + +//------------------------------------------------------------------------------------------------------- +// USBDP internal module data +static USBDP_DATA __xdata usbdpData; ///< USBDP internal module data + +//------------------------------------------------------------------------------------------------------- +// String descriptors (2-byte unicode data). + +// Language ID. +static const uint8 languageId[4] = { + 4, + DESC_TYPE_STRING, + 0x09, 0x04 /* US-EN */ +}; + +// Manufacturer. +static const uint8 manufacturer[36] = { + 36, + DESC_TYPE_STRING, + 'T', 0, + 'e', 0, + 'x', 0, + 'a', 0, + 's', 0, + ' ', 0, + 'I', 0, + 'n', 0, + 's', 0, + 't', 0, + 'r', 0, + 'u', 0, + 'm', 0, + 'e', 0, + 'n', 0, + 't', 0, + 's', 0 +}; + +// Product. +static const uint8 product[36] = { + 36, + DESC_TYPE_STRING, + 'T', 0, + 'I', 0, + ' ', 0, + 'C', 0, + 'C', 0, + '2', 0, + '5', 0, + '3', 0, + '1', 0, + ' ', 0, + 'U', 0, + 'S', 0, + 'B', 0, + ' ', 0, + 'C', 0, + 'D', 0, + 'C', 0 +}; + +// Serial Number. +static uint8 serialNumber[42] = { + 0, + DESC_TYPE_STRING, + '0', 0, + '1', 0, + '2', 0, + '3', 0, + '4', 0, + '5', 0, + '6', 0, + '7', 0, + '8', 0, + '9', 0, + '0', 0, + '1', 0, + '2', 0, + '3', 0, + '4', 0, + '5', 0, + '6', 0, + '7', 0, + '8', 0, + '9', 0 +}; + +/** \brief Initializes a search +* +* This function must be called before each new search to reset \ref USBDP_DATA.pDesc. +*/ +void usbdpInit(void) +{ + usbdpData.pDesc = (const uint8 __code *) usbDescriptorMarker.pUsbDescStart; +} // usbdpInit + + + + +/** \brief Locates the descriptor of the wanted type +* +* This function parses through the USB descriptors until: +* \li It hits one with bDescriptorType = wantedType, in which case it returns a pointer to +* that descriptor, and exits. \ref USBDP_DATA.pDesc will then point to the next descriptor. +* \li It hits one with bDescriptorType = haltAtType, in which case it returns a NULL-pointer, +* and exits. \ref USBDP_DATA.pDesc will then point to that descriptor. +* \li \ref USBDP_DATA.pDesc = \ref usbDescEnd, in which case it returns a NULL-pointer, and exits. +* \ref USBDP_DATA.pDesc will continue to point to \ref usbDescEnd. +* +* \note To begin a search with this function, \ref usbdpInit should be called first. It should not be +* called when continuing a search - for instance after a call to \ref usbdpGetConfigurationDesc(). +* +* \param[in] wantedType +* The wanted descriptor type (e.g. \ref DESC_TYPE_CONFIG) +* \param[in] haltAtType +* The parser halts when it reaches this descriptor type, unless \c haltAtType is \c 0 (which in any +* case is an invalid \c bDescriptorType value). +* +* \return +* A pointer to the wanted descriptor type, or \c NULL if it was not found. +*/ +void __code* usbdpFindNext(uint8 wantedType, uint8 haltAtType) +{ + void __code *pResult; + pResult = NULL; + + // As long as we haven't reached the end... + while (usbdpData.pDesc != (void __code *) usbDescriptorMarker.pUsbDescEnd) { + + // If we have a match on wantedType... + if (usbdpData.pDesc[DESC_TYPE_IDX] == wantedType) { + pResult = (void __code*) usbdpData.pDesc; + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + break; + + // If we have a match on haltAtType... + } else if (usbdpData.pDesc[DESC_TYPE_IDX] == haltAtType) { + if (haltAtType) break; + } + + // Move on to the next descriptor + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + } + + return pResult; +} // usbdpFindNext + + + + +/** \brief Locates the (one and only) device descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void) +{ + usbdpInit(); + return usbdpFindNext(DESC_TYPE_DEVICE, 0); +} // usbdpGetDeviceDesc + + + + +/** \brief Locates a configuration descriptor +* +* The search will either look for a descriptor with a specific +* \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue, or simply take the n'th descriptor (by "index") +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value to search for (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue), or +* 0 to find descriptor by index +* \param[in] cfgIndex +* A zero-based index for the configuration descriptor to find. +* This value is ignored unless \c cfgValue is 0. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex) +{ + USB_CONFIGURATION_DESCRIPTOR __code *pConfigurationDesc; + usbdpInit(); + + // As long as there are more configuration descriptors... + while (pConfigurationDesc = usbdpFindNext(DESC_TYPE_CONFIG, 0)) { + + // Search by value? + if (cfgValue) { + if (cfgValue == pConfigurationDesc->bConfigurationValue) break; + + // Search by index? (search cfgIndex+1 times) + } else if (!cfgIndex--) { + break; + } + } + + return pConfigurationDesc; +} // usbdpGetConfigurationDesc + + + + +/** \brief Locates an interface descriptor +* +* The function will first go to the configuration descriptor that matches the supplied configuration +* value, and then locate the interface descriptor that matches the given interface number and alternate +* setting. +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue) +* \param[in] intNumber +* The interface number (\ref USB_INTERFACE_DESCRIPTOR.bInterfaceNumber) +* \param[in] altSetting +* The alternate setting (\ref USB_INTERFACE_DESCRIPTOR.bAlternateSetting) +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting) +{ + USB_INTERFACE_DESCRIPTOR __code *pInterfaceDesc; + + // First get to the correct configuration + usbdpGetConfigurationDesc(cfgValue, 0); + + // Then find a match on the interface + while (pInterfaceDesc = usbdpFindNext(DESC_TYPE_INTERFACE, DESC_TYPE_CONFIG)) { + if ((pInterfaceDesc->bInterfaceNumber == intNumber) && (pInterfaceDesc->bAlternateSetting == altSetting)) { + break; + } + } + + return pInterfaceDesc; +} // usbdpGetInterfaceDesc + + + + +/** \brief Locates a string descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] strIndex +* A zero-based index that matches the "iXxxxxxxxxx" string indexes in the other descriptors +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_STRING_DESCRIPTOR *usbdpGetStringDesc(uint8 strIndex) +{ + USB_STRING_DESCRIPTOR *pStringDesc = NULL; + +#ifdef MS_EXT_C_ID + /* OPT: Find the Microsoft OS String Descriptor? + usbdpInit(); + + if (strIndex == 0xEE){ + // Find the Microsoft OS String Descriptor + do{ + pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0); + }while (pStringDesc != NULL && pStringDesc->bLength != 18); + } else + */ +#endif + { + switch (strIndex) + { + case 0: + pStringDesc = (USB_STRING_DESCRIPTOR *)languageId; + break; + + case 1: + pStringDesc = (USB_STRING_DESCRIPTOR *)manufacturer; + break; + + case 2: + pStringDesc = (USB_STRING_DESCRIPTOR *)product; + break; + + case 3: + if (serialNumber[0] == 0) + { + uint8 bdAddr[ 8 ], i; + uint16 tmp; + + // get BDADDR from Info Page + for (i=0; iusbDescStart - usbDescEnd equals the total length of the descriptors). + * + * The markers can be dynamic, provided that they are not changed while the descriptor parser is in use. + * However, in most cases the USB descriptor set will be static, hence the markers are also static. + * The following example shows how static markers are declared and made public in 8051 assembler: + * \code + * ; Make the symbols public + * PUBLIC usbDescStart; + * PUBLIC usbDescEnd; + * + * ... + * + * usbDescStart: + * deviceDesc: ; Device descriptor (the first descriptor) + * DB deviceDescEnd - deviceDesc + * DB DESC_TYPE_DEVICE ; bDescriptorType + * DB 10H, 01H ; bcdUSB + * DB 00H ; bDeviceClass + * DB 00H ; bDeviceSubClass + * + * ... + * + * string3Desc: ; String descriptor: Serial number (the last descriptor) + * DB string3DescEnd - string3Desc; + * DB DESC_TYPE_STRING ; bDescriptorType + * DB '1', 0; + * DB '2', 0; + * DB '3', 0; + * string3DescEnd: + * usbDescEnd: + * \endcode + * @{ + */ + +#include "usb_descriptor.h" + + +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Indexes Into USB Descriptors +//@{ +#define DESC_LENGTH_IDX 0 ///< Index of the bLength field (all descriptors) +#define DESC_TYPE_IDX 1 ///< Index of the bDescriptorType field (all descriptors) +#define DESC_CONFIG_LENGTH_LSB_IDX 2 ///< Index of LOUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +#define DESC_CONFIG_LENGTH_MSB_IDX 3 ///< Index of HIUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbdpInit(void); +void __code *usbdpFindNext(uint8 wantedType, uint8 haltAtType); + +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void); +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex); +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting); +USB_STRING_DESCRIPTOR *usbdpGetStringDesc(uint8 strIndex); +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework.c new file mode 100644 index 0000000..ae0da88 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework.c @@ -0,0 +1,332 @@ +/*********************************************************************************** + + Filename: usb_framework.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_framework +/// @{ +#define USBFRAMEWORK_C ///< Modifies the behavior of "EXTERN" in usb_framework.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" + +// Function pointer used by usbfwSetupHandler() +static VFPTR __data ProcessFunc; + +/** \brief Initializes the USB framework + * + * This function should be called when the microcontroller is ready to accept USB traffic. It enables the + * USB peripheral unit and enables the pull-up resistor on the D+ line. Endpoint status, current + * configuration value, etc. are initialized and evenetually re-initialized in the + * \ref usbfwResetHandler() function. + */ +void usbfwInit(void) +{ + // Set default values + usbfwData.selfPowered = (usbdpGetConfigurationDesc(1, 0)->bmAttributes & 0x40) ? TRUE : FALSE; + usbfwData.remoteWakeup = FALSE; + + HAL_USB_ENABLE(); + + // Enable Resume Interrupt + HAL_USB_RESUME_INT_ENABLE(); + +} // usbfwInit + + + + +/** \brief Handles USB reset signalling + * + * This function should be called, either from the USB interrupt or the main loop, when the \c USBCIF.RST + * flag has been set. Keep in mind that all bits in \c USBCIF register are cleared when the register is + * read. The function puts the device into the default state (not yet addressed), and puts all endpoints + * (except EP0) into the \ref EP_HALT state + */ +void usbfwResetHandler(void) +{ + + // Reset the USB state + usbfwData.usbState = DEV_DEFAULT; + usbfwData.configurationValue = 0; + + // Reset all endpoints + usbfwData.ep0Status = EP_IDLE; + usbfwSetAllEpStatus(EP_HALT); + + // Reset last function pointer + ProcessFunc = NULL; + +} // usbfwResetHandler + + + + +/** \brief USB Setup Handler + * + * This function should be called either from the USB interrupt or the main loop when the \c USBIIF.EP0IF + * flag has been set. Keep in mind that all bits in \c USBIIF register are cleared when the register is + * read. A detailed description of the framework is found in the \ref section_setup_handler_usage + * section. + * + * \note The USB header data is always little-endian, so if a big-endian compiler is used (such as Keil + * C51), the 16-bit values in the \ref usbSetupHeader must be flipped before they are used. + */ +void usbfwSetupHandler(void) +{ + uint8 controlReg; + uint8 bytesNow; + uint8 oldEndpoint; + + // Save the old index setting, then select endpoint 0 and fetch the control register + oldEndpoint = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(0); + controlReg = USBCS0; + + // The last transfer was ended prematurely by a new SETUP packet + if (controlReg & USBCS0_SETUP_END) { + USBCS0 = USBCS0_CLR_SETUP_END; + usbfwData.ep0Status = EP_CANCEL; + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // A STALL handshake was transmitted to the PC + if (controlReg & USBCS0_SENT_STALL) { + USBCS0 = 0x00; + usbfwData.ep0Status = EP_IDLE; + } + + // Receive OUT packets + if (usbfwData.ep0Status == EP_RX) { + + // Read FIFO + bytesNow = USBCNT0; + usbfwReadFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.bytesLeft -= bytesNow; + usbSetupData.pBuffer += bytesNow; + + // Arm the endpoint + USBCS0 = usbSetupData.bytesLeft ? USBCS0_CLR_OUTPKT_RDY : (USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END); + + // Make a call to the appropriate request handler when done + if (usbSetupData.bytesLeft == 0) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Return here since nothing more will happen until the next interrupt + USBFW_SELECT_ENDPOINT(oldEndpoint); + return; + + // Let the application handle the reception + } else if (usbfwData.ep0Status == EP_MANUAL_RX) { + ProcessFunc(); + } + + // Receive SETUP header + if (usbfwData.ep0Status == EP_IDLE) { + if (controlReg & USBCS0_OUTPKT_RDY) { + usbfwReadFifo(&USBF0, 8, (uint8 __xdata *) &usbSetupHeader); + + // Handle control transfers individually + ProcessFunc = NULL; + switch (usbSetupHeader.requestType & (RT_MASK_TYPE | RT_MASK_DIR)) { + + // Standard requests with data from the host (OUT) + case RT_STD_OUT: + switch (usbSetupHeader.request) { + case SET_ADDRESS: usbsrSetAddress(); break; + case SET_FEATURE: usbsrSetFeature(); break; + case CLEAR_FEATURE: usbsrClearFeature(); break; + case SET_CONFIGURATION: usbsrSetConfiguration(); break; + case SET_INTERFACE: usbsrSetInterface(); break; + case SET_DESCRIPTOR: /*usbsrHookSetDescriptor(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Standard requests with data to the host (IN) + case RT_STD_IN: + switch (usbSetupHeader.request) { + case GET_STATUS: usbsrGetStatus(); break; + case GET_DESCRIPTOR: usbsrGetDescriptor(); break; + case GET_CONFIGURATION: usbsrGetConfiguration(); break; + case GET_INTERFACE: usbsrGetInterface(); break; + case SYNCH_FRAME: /*usbsrHookSynchFrame(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Vendor requests + case RT_VEND_OUT: + ProcessFunc = usbvrHookProcessOut; usbvrHookProcessOut(); + break; + case RT_VEND_IN: + ProcessFunc = usbvrHookProcessIn; usbvrHookProcessIn(); + break; + + // Class requests + case RT_CLASS_OUT: + ProcessFunc = usbcrHookProcessOut; usbcrHookProcessOut(); + break; + case RT_CLASS_IN: + ProcessFunc = usbcrHookProcessIn; usbcrHookProcessIn(); + break; + + // Unrecognized request: Stall the endpoint + default: + usbfwData.ep0Status = EP_STALL; + break; + } + + // Arm/stall the endpoint + USBCS0 = (usbfwData.ep0Status == EP_STALL) ? (USBCS0_CLR_OUTPKT_RDY | USBCS0_SEND_STALL) : USBCS0_CLR_OUTPKT_RDY; + } + } + + // Transmit IN packets + if (usbfwData.ep0Status == EP_TX) { + controlReg = USBCS0_INPKT_RDY; + + // The last frame should contain 0 to (EP0_PACKET_SIZE - 1) bytes + if (usbSetupData.bytesLeft < EP0_PACKET_SIZE) { + bytesNow = usbSetupData.bytesLeft; + controlReg |= USBCS0_DATA_END; + + // All other packets should have the maximum length + } else { + bytesNow = EP0_PACKET_SIZE; + } + + // Load the FIFO and move the pointer + usbfwWriteFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.pBuffer += bytesNow; + usbSetupData.bytesLeft -= bytesNow; + + // Arm the FIFO (even for a zero-length packet) + USBCS0 = controlReg; + + // Make a call to the appropriate request handler when done + if (bytesNow < EP0_PACKET_SIZE) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Let the application handle the transmission + } else if (usbfwData.ep0Status == EP_MANUAL_TX) { + ProcessFunc(); + } + + // Restore the old index setting + USBFW_SELECT_ENDPOINT(oldEndpoint); + +} // usbfwSetupHandler + + + + +/** \brief Changes the state of endpoint 1-5 IN/OUT + * + * This is an internal function used by the library. + * + * \param[in] status + * The new status for each endpoint + */ +void usbfwSetAllEpStatus(EP_STATUS status) +{ + uint8 n; + for (n = 0; n < sizeof(usbfwData.pEpInStatus); n++) + usbfwData.pEpInStatus[n] = status; + for (n = 0; n < sizeof(usbfwData.pEpOutStatus); n++) + usbfwData.pEpOutStatus[n] = status; +} // usbfwSetAllEpStatus + + + + +/** \brief Reads from the selected OUT endpoint FIFO, without using DMA + * + * The FIFO must be re-armed after reading it empty (using the \ref USBFW_ARM_OUT_ENDPOINT() macro). This + * is not necessary when flushing the FIFO. + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to read + * \param[in] *pData + * A pointer to the storage location for the read data (in any memory space) + */ +void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *(pTemp++) = *pFifo; + } while (--count); + } +} // usbfwReadFifo + + + + +/** \brief Writes to the selected IN endpoint FIFO, without using DMA + * + * Note that the FIFO must be armed in order to be transmitted (using the \ref USBFW_ARM_IN_ENDPOINT() + * macro). + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to write + * \param[in] *pData + * A pointer to the data to be written (from any memory space) + */ +void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *pFifo = *(pTemp++); + } while (--count); + } +} // usbfwWriteFifo + + +/// @} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework_structs.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework_structs.h new file mode 100644 index 0000000..4f87484 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_framework_structs.h @@ -0,0 +1,233 @@ +/*********************************************************************************** + + Filename: usb_framework_structs.h + + Description: USB library common data structures. + +***********************************************************************************/ + +#ifndef USBFRAMEWORKSTRUCTS_H +#define USBFRAMEWORKSTRUCTS_H +/** \addtogroup module_usb_framework USB Framework (usbfw) + * \brief This module contains USB status and descriptor structs + * + * + * @{ + */ +#include "hal_types.h" +#include "usb_firmware_library_config.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBFRAMEWORK_C + #define EXTERN ///< Definition used only for usb_framework.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Module Data +//@{ + +/// Endpoint status (used with USB_INFO.ep0Status / pEpInStatus[] / pEpOutStatus[]) +typedef enum { + EP_IDLE = 0x00, ///< The endpoint is idle, or a setup token has been received + EP_TX = 0x01, ///< Setup IN data is transmitted automatically by the framework + EP_RX = 0x02, ///< Setup OUT data is received automatically by the framework + EP_HALT = 0x03, ///< The endpoint is halted (returns stalls to the host) + EP_STALL = 0x04, ///< Send procedural stall in the next status phase + EP_MANUAL_TX = 0x05, ///< Setup IN data is transmitted manually by the user application + EP_MANUAL_RX = 0x06, ///< Setup OUT data is received manually by the user application + EP_CANCEL = 0x07 ///< The current transfer was cancelled by the host +} EP_STATUS; + +/// Device state (used with USB_INFO.usbState) +typedef enum { + DEV_ATTACHED = 0x00, ///< Device attached (invisible state) + DEV_POWERED = 0x01, ///< Device powered (invisible state) + DEV_DEFAULT = 0x02, ///< Default state (the \c USBADDR register is 0) + DEV_ADDRESS = 0x03, ///< Addressed state (the \c USBADDR register has been set) + DEV_CONFIGURED = 0x04, ///< Configured state (\c usbfwData.configurationValue != 0) + DEV_SUSPENDED = 0x05 ///< Suspended state (never set) +} USB_STATE; + +/// USBFW internal module data +typedef struct { + USB_STATE usbState; ///< USB device state + uint8 configurationValue; ///< Current configuration value + uint8 pAlternateSetting[USB_SETUP_MAX_NUMBER_OF_INTERFACES]; ///< Current alternate settings + EP_STATUS ep0Status; ///< Endpoint 0 status + EP_STATUS pEpInStatus[5]; ///< Endpoint 1-5 IN status + EP_STATUS pEpOutStatus[5]; ///< Endpoint 1-5 OUT status + uint8 remoteWakeup; ///< Remote wakeup allowed + uint8 selfPowered; ///< Is currently self-powered? +} USBFW_DATA; + +//------------------------------------------------------------------------------------------------------- +/// Setup header (contains the 8 bytes received during the setup phase) +typedef struct { + uint8 requestType; ///< Request type (direction, type and recipient, see the \c RT_ definitions) + uint8 request; ///< Request ID + uint16 value; ///< Value field + uint16 index; ///< Index field + uint16 length; ///< Length of data phase +} USB_SETUP_HEADER; + +/// Setup handler data phase configuration +typedef struct { + uint8 __generic *pBuffer; ///< Pointer to where IN/OUT data should be taken from/received + uint16 bytesLeft; ///< The number of bytes to transfer +} USB_SETUP_DATA; + + +//@} +//------------------------------------------------------------------------------------------------------- + +// From usb_descriptor.h +/** \addtogroup module_usb_descriptor USB Descriptor*/ +//------------------------------------------------------------------------------------------------------- +/// USB device descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_DEVICE + uint16 bcdUSB; ///< USB specification release number (in BCD, e.g. 0110 for USB 1.1) + uint8 bDeviceClass; ///< Device class code + uint8 bDeviceSubClass; ///< Device subclass code + uint8 bDeviceProtocol; ///< Device protocol code + uint8 bMaxPacketSize0; ///< Maximum packet size for EP0 + uint16 idVendor; ///< Vendor ID + uint16 idProduct; ///< Product ID + uint16 bcdDevice; ///< Device release number (in BCD) + uint8 iManufacturer; ///< Index of the string descriptor for manufacturer + uint8 iProduct; ///< Index of the string descriptor for product + uint8 iSerialNumber; ///< Index of the string descriptor for serial number + uint8 bNumConfigurations; ///< Number of possible configurations +} USB_DEVICE_DESCRIPTOR; + +/// USB configuration descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_CONFIG + uint16 wTotalLength; ///< Total length of data for this configuration + uint8 bNumInterfaces; ///< Number of interfaces supported by this configuration (one-based index) + uint8 bConfigurationValue; ///< Designator value for this configuration + uint8 iConfiguration; ///< Index of the string descriptor for this configuration + uint8 bmAttributes; ///< Configuration characteristics + uint8 bMaxPower; ///< Maximum power consumption in this configuration (bMaxPower * 2 mA) +} USB_CONFIGURATION_DESCRIPTOR; + +/// USB interface descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_INTERFACE + uint8 bInterfaceNumber; ///< Number of *this* interface (zero-based index) + uint8 bAlternateSetting; ///< Alternate setting index for this descriptor (zero-based index) + uint8 bNumEndpoints; ///< Number of endpoints for this interface (excl. EP0) + uint8 bInterfaceClass; ///< Interface class code + uint8 bInterfaceSubClass; ///< Interface subclass code + uint8 bInterfaceProtocol; ///< Interface protocol code + uint8 iInterface; ///< Index of the string descriptor for this interface +} USB_INTERFACE_DESCRIPTOR; + +/// USB endpoint descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_ENDPOINT + uint8 bEndpointAddress; ///< Endpoint address (direction[7] + number[3:0]) + uint8 bmAttributes; ///< Endpoint attributes (ISO / BULK / INT) + uint16 wMaxPacketSize; ///< Maximum endpoint packet size + uint8 bInterval; ///< \ref EP_ATTR_INT : Polling interval (in ms) +} USB_ENDPOINT_DESCRIPTOR; + +/// USB string descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_STRING + uint16 pString[1]; ///< Unicode string +} USB_STRING_DESCRIPTOR; + +/// USB HID descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< HID descriptor type + uint16 bscHID; ///< HID specification release number (in BCD) + uint8 bCountryCode; ///< Hardware target country + uint8 bNumDescriptors; ///< Number of HID class descriptors to follow + uint8 bRDescriptorType; ///< Report descriptor type + uint16 wDescriptorLength; ///< Total length of the associated report descriptor +} USB_HID_DESCRIPTOR; +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// Look-up table entry for non-standard descriptor types (used with \ref usbsrGetDescriptor) +typedef struct { + uint8 valueMsb; ///< LSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 valueLsb; ///< MSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 indexMsb; ///< LSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 indexLsb; ///< MSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 __code *pDescStart; ///< A pointer to the descriptor to be returned for the given index/value + uint16 length; ///< The length of the returned descriptor +} DESC_LUT_INFO; + +/// Look-up table for double-buffer settings +typedef struct { + USB_INTERFACE_DESCRIPTOR __code *pInterface; ///< Pointer to an interface descriptor + uint8 inMask; ///< Bitmask for IN endpoints (bit x maps to EPx IN) + uint8 outMask; ///< Bitmask for OUT endpoints (bit x maps to EPx OUT) +} DBLBUF_LUT_INFO; + +// From usb_interrupt.h +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + uint8 inSuspend; ///< Is currently in suspend? + uint16 irqMask; ///< USB interrupts to be enabled +} USBIRQ_DATA; + +//------------------------------------------------------------------------------------------------------- +/// USBDP internal module data +typedef struct { + const uint8 __code *pDesc; ///< Pointer to the current descriptor +} USBDP_DATA; +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_interrupt.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_interrupt.h new file mode 100644 index 0000000..226947c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb/usb_interrupt.h @@ -0,0 +1,213 @@ +/*********************************************************************************** + + Filename: usb_interrupt.h + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +#ifndef USBINTERRUPT_H +#define USBINTERRUPT_H +/** \addtogroup module_usb_interrupt USB Interrupt (usbirq) + * \brief This module contains the USB interrupt handler, which converts USB interrupts to USBIRQ events. + * + * This module contains two interrupt service routines: + * \li P0 ISR + * \li P2 ISR + * Both these are used by the USB part of the MCU. Hence it is recommended to only use P1 for + * interrupts from any peripherals connected to the MCU. Unless running low on GPIO pins, one should + * generally avoid using the P0 and P2 pins at all. + * + * The MCU contains three interrupt flag registers, USBCIE, USBIIE and USBOIE, which are all cleared + * upon read access. The \ref module_usb_interrupt module encapsulates the USB interrupts, and saves the + * three flag registers in a single 16-bit word. By doing that it becomes possible to process + * high-priority events in the interrupt context, and low-priority events in the main loop. + * + * \section section_usbirq_initialization Initialization + * After initializing the \ref module_usb_framework module, \c main() must call \ref usbirqInit(). The + * \c irqMask parameter of this function shall contain all \c USBIRQ_EVENT bits that will be handled + * either in the interrupt or in \c main(). Note, however, that the event reporting may not always be + * necessary. For instance, there is usually no reason to enable \c USBIRQ_EVENT_EPxIN or + * \c USBIRQ_EVENT_EPxOUT events when handling low-priority transfers in the \c main() loop. In these + * cases it is simpler and more efficient to check the arming condition of the endpoint in question. + * + * The following example enables the setup and reset events (which must always be enabled!), and turns on + * global interrupts: + * \code + * void main(void) { + * + * ... Initialize the crystal oscillator and USB framework first ... + * + * // Initialize the USB Interrupt module + * usbirqInit(USBIRQ_EVENT_RESET | USBIRQ_EVENT_SUSPEND | USBIRQ_EVENT_RESUME | USBIRQ_EVENT_SETUP); + * + * // Turn on interrupts + * INT_GLOBAL_ENABLE(); + * + * // Main loop + * while (1) { + * ... + * } + * \endcode + * + * \section section_usbirq_event_processing Event Processing + * Regardless of whether the interrupt event is processed in the interrupt or in the main loop, the code + * piece for doing it is the same (this example illustrates the processing of \ref USBIRQ_EVENT_RESET + * events): + * \code + * // Let the framework handle reset events :) + * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) { + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET); + * usbfwResetHandler(); + * } + * \endcode + * + * \section Hooks + * The following hook is called from the USB interrupt, and allows for event processing in the interrupt + * context: + * \code + * void usbirqHookProcessEvents(void) { + * // Process high-priority events here, or simply return if there are none + * } + * \endcode + * @{ + */ + +#include "usb_framework_structs.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBINTERRUPT_C + #define EXTERN ///< Definition used only for usb_interrupt.c to declare variable +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +/*typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + BOOL inSuspend; ///< Is currently in suspend? + uint16 irqMask; ///< USB interrupts to be enabled +} USBIRQ_DATA;*/ +#ifdef USBIRQ_DATA_ADDR + EXTERN __no_init __data USBIRQ_DATA usbirqData @ USBIRQ_DATA_ADDR; ///< USBIRQ internal module data at fixed address +#else + EXTERN USBIRQ_DATA __data usbirqData; ///< USBIRQ internal module data +#endif +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name USB Interrupt Events +//@{ + +/// Suspend signaling detected on the USB bus +/// Note that the chip should not enter PM1 while still in the interrupt routine (inside the usbirqHookProcessEvents() function ) +#define USBIRQ_EVENT_SUSPEND 0x0001 +/// Resume signaling detected on the USB bus +#define USBIRQ_EVENT_RESUME 0x0002 +/// Reset signaling detected on the USB bus (call \ref usbfwResetHandler() for processing) +#define USBIRQ_EVENT_RESET 0x0004 +/// Start of frame token received (synthesized by hardware when the next SOF token is expected, so that missing or corrupted tokens have no effect) +#define USBIRQ_EVENT_START_OF_FRAME 0x0008 +/// Endpoint 0 IN/OUT setup/data transfer complete / stall sent / premature completion (call \ref usbfwSetupHandler() for processing) +#define USBIRQ_EVENT_SETUP 0x0010 +/// Endpoint 1 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP1IN 0x0020 +/// Endpoint 2 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP2IN 0x0040 +/// Endpoint 3 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP3IN 0x0080 +/// Endpoint 4 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP4IN 0x0100 +/// Endpoint 5 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP5IN 0x0200 +/// Endpoint 1 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP1OUT 0x0400 +/// Endpoint 2 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP2OUT 0x0800 +/// Endpoint 3 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP3OUT 0x1000 +/// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP4OUT 0x2000 +/// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP5OUT 0x4000 +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Mask Access Macros +//@{ + +/// Clears one or more events (use one or more \c USBIRQ_EVENT bits OR'ed together) +#define USBIRQ_CLEAR_EVENTS(mask) (usbirqData.eventMask &= ~(mask)) +/// Get the bit mask containing all pending events +#define USBIRQ_GET_EVENT_MASK() (usbirqData.eventMask) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Event Hooks +//@{ + +/// Called upon all USB interrupts for high-priority event processing +void usbirqHookProcessEvents(void); + +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbirqInit(uint16 irqMask); +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void); +#else +__interrupt void usbirqHandler(void); +#endif +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h new file mode 100644 index 0000000..7f3b714 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_descriptor.h @@ -0,0 +1,199 @@ +/*********************************************************************************** + + Filename: usb_descriptor.h + + Description: Interface to USB descriptors. + +***********************************************************************************/ +#ifndef USBDESCRIPTOR_H +#define USBDESCRIPTOR_H + + +#ifndef ASM_FILE +#include "usb_framework_structs.h" +#endif + +/** \addtogroup module_usb_descriptor USB Descriptor + * \brief This module contains contains USB descriptor definitions, and guidelines on how to write + * descriptor sets that work with the USB library. + * + * Information on the specific USB descriptor types is available in the USB 2.0 specification and + * in device class documentation. Examples of complete descriptor sets can be found in the Chipcon USB + * application examples. + * + * \section section_usbdsc_standard Standard Descriptors + * The library requires the USB descriptor set to be organized as follows: + * - Device descriptor (\ref USB_DEVICE_DESCRIPTOR) + * - Configuration descriptor (\ref USB_CONFIGURATION_DESCRIPTOR) + * - Interface descriptor (\ref USB_INTERFACE_DESCRIPTOR) + * - Endpoint descriptor (\ref USB_ENDPOINT_DESCRIPTOR) + * - More endpoint descriptors + * - More interface descriptors + * - More configuration descriptors + * - String descriptor (\ref USB_STRING_DESCRIPTOR) + * - More string descriptors + * + * Different USB device classes, such as "HID" and "Audio", may add other standard format descriptor + * types to the hierarchy, and even extend the existing types. This is also supported by the library. + * + * Refer to the \ref module_usb_descriptor_parser module for information on + * \li Where in memory the descriptor set can be placed + * \li How to set the required markers (symbols), \ref usbDescStart and \ref usbDescEnd. + * + * \section section_usbdsc_other Other Descriptors + * Differently formatted descriptors are not supported by the parsing mechanism, and are instead located + * through a \ref DESC_LUT_INFO look-up table. Each entry in the \ref usbDescLut table contains the + * index and value parameters for relevant \ref GET_DESCRIPTOR requests, and the locations and lengths + * of the corresponding descriptors: + * \code + * ; Make the symbols public + * PUBLIC usbDescLut; + * PUBLIC usbDescLutEnd; + * + * ... + * + * usbDescLut: DB HID_REPORT, 00H ; value (MSB, LSB) + * DB 00H, 00H ; index (MSB, LSB) + * DW hidReportDesc0Start ; pDescStart + * DW hidReportDesc0End - hidReportDesc0Start ; length + * + * DB HID_REPORT, 01H ; value (MSB, LSB) + * DB 00H, 00H ; index (MSB, LSB) + * DW hidReportDesc1Start ; pDescStart + * DW hidReportDesc1End - hidReportDesc1Start ; length + * usbDescLutEnd: + * \endcode + * + * An additional look-up table is needed configure endpoint double-buffering. The table must contain one + * \ref DBLBUF_LUT_INFO entry for each interface descriptor with non-zero \c bNumEndpoints: + * \code + * ; Make the symbol public + * PUBLIC usbDblbufLut; + * + * ... + * + * usbDblbufLut: DW interface0Desc ; pInterface + * DB 02H ; inMask (example: EP1 IN is double-buffered) + * DB 00H ; outMask (example: No double-buffered OUT endpoints) + * + * DW interface1Desc ; pInterface + * DB 10H ; inMask (example: EP4 IN is double-buffered) + * DB 08H ; outMask (example: EP3 OUT is double-buffered) + * \endcode + * @{ + */ + + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBDESCRIPTORPARSER_C + #define EXTERN ///< Definition used only for usb_descriptor_parser.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Sizes +//@{ +#define EP0_PACKET_SIZE 32 ///< The maximum data packet size for endpoint 0 +//@} + +/// \name Standard Descriptor Types +//@{ +#define DESC_TYPE_DEVICE 0x01 ///< Device +#define DESC_TYPE_CONFIG 0x02 ///< Configuration +#define DESC_TYPE_STRING 0x03 ///< String +#define DESC_TYPE_INTERFACE 0x04 ///< Interface +#define DESC_TYPE_ENDPOINT 0x05 ///< Endpoint +//@} + +/// \name HID Class Descriptor Types +//@{ +#define DESC_TYPE_HID 0x21 ///< HID descriptor (included in the interface descriptor) +#define DESC_TYPE_HIDREPORT 0x22 ///< Report descriptor (referenced in \ref usbDescLut) +//@} + +/// \name Endpoint Types +//@{ +#define EP_ATTR_CTRL 0x00 ///< Control (endpoint 0 only) +#define EP_ATTR_ISO 0x01 ///< Isochronous (not acknowledged) +#define EP_ATTR_BULK 0x02 ///< Bulk +#define EP_ATTR_INT 0x03 ///< Interrupt (guaranteed polling interval) +#define EP_ATTR_TYPE_BM 0x03 ///< Endpoint type bitmask +//@} +//------------------------------------------------------------------------------------------------------- + + +#ifndef ASM_FILE + +//------------------------------------------------------------------------------------------------------- +/// \name USB Descriptor Marker +//@{ +/// USB descriptor markers which the USB Firmware Library imports from the application +typedef struct { + uint8 __code* const pUsbDescStart; ///< USB descriptor start pointer + uint8 __code* const pUsbDescEnd; ///< USB descriptor end pointer + DESC_LUT_INFO __code* const pUsbDescLut; ///< Start of USB desc look-up table pointer + DESC_LUT_INFO __code* const pUsbDescLutEnd; ///< End of USB desc look-up table pointer + DBLBUF_LUT_INFO __code* const pUsbDblbufLut; ///< Start of double-buffering look-up table pointer + DBLBUF_LUT_INFO __code* const pUsbDblbufLutEnd; ///< End of double-buffering look-up table pointer +} USB_DESCRIPTOR_MARKER; + +extern USB_DESCRIPTOR_MARKER __xdata usbDescriptorMarker; ///< USB descriptor marker + +//------------------------------------------------------------------------------------------------------- + +// Import marker symbols for the USB descriptor to use (from _usb_descriptor.s51) +// They need to be defined here or in application FW +// The source file _usb_descriptor.s51 need to use these names, or update +// the names used here with the ones used in _usb_descriptor.s51. +extern void __code* usbDescStart; ///< Pointer to start of (standard) USB descriptor +extern void __code* usbDescEnd; ///< Pointer to end of (standard) USB descriptor +extern void __code* usbDescLut; ///< Pointer to start of lookup table for non-standard USB descriptors +extern void __code* usbDescLutEnd; ///< Pointer to end of lookup table for non-standard USB descriptors +extern void __code* usbDblbufLut; ///< Pointer to start of lookup table for endpoints' double-buffer settings +extern void __code* usbDblbufLutEnd; ///< Pointer to end of lookup table for endpoints' double-buffer settings +//@} + + +#endif // ASM_FILE +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_framework.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_framework.h new file mode 100644 index 0000000..0846625 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_framework.h @@ -0,0 +1,383 @@ +/*********************************************************************************** + + Filename: usb_framework.h + + Description: USB library common functionality. + +***********************************************************************************/ + +#ifndef USBFRAMEWORK_H +#define USBFRAMEWORK_H +/** \addtogroup module_usb_framework USB Framework (usbfw) + * \brief This module contains USB status information, functions for initialization, USB device reset + * handling, and most importantly, the framework for transfers on endpoint 0, FIFO access, and endpoint + * control. + * + * \section section_init Framework Initialization + * The framework and the USB peripheral unit can be initialized once the crystal oscillator (48 MHz for + * CC1111/CC2511, 32 MHz for CC2531) is running. This is done by \ref usbfwInit(), which: + * \li Initializes framework variables + * \li Enables the USB peripheral unit by setting the \c SLEEP.USB_EN bit + * \li Enables the pull-up resistor via a GPIO pin + * + * When completing the last step, the host will be recognize the USB device, and start the enumeration + * process. To reply to the shortly incoming standard requests, the call to \ref usbfwInit() must be + * followed immediately by USB Interrupt \ref section_usbirq_initialization. + * + * \section section_endpoint_0_transfers Endpoint 0 Transfers + * The USB interface uses endpoint 0 to perform setup requests of the standard, vendor and class types. + * Such transfers consist of three phases: + * - A setup phase, where an 8-byte \ref USB_SETUP_HEADER is transferred to the device. + * - An IN/OUT data phase, if the length field of the \ref USB_SETUP_HEADER structure is non-zero. + * - A handshake phase, where the application can stall the endpoint to indicate error conditions. + * + * The setup handler, \ref usbfwSetupHandler(), takes care of the low-level parts of these transfers, + * including the IN/OUT buffering during the data phase (when there is one). The transfers fall into two + * categories: + * - Most standard requests are processed internally, with little or no intervention form the user + * application. This is done by the \ref module_usb_standard_requests module. + * - Vendor and class requests are application specific and must always be processed by the application. + * Whenever such a request is received, the following hooks will be called between the phases: + * - \ref usbcrHookProcessOut(): Class requests with OUT data phase + * - \ref usbcrHookProcessIn(): Class requests with IN data phase + * - \ref usbvrHookProcessOut(): Vendor requests with OUT data phase + * - \ref usbvrHookProcessIn(): Vendor requests with IN data phase + * + * \section section_setup_handler_usage Setup Handler Usage + * This section describes what is required to make the vendor and class request hooks work. This + * information also applies to the standard requests that needs application processing + * (\ref usbsrHookSetDescriptor(), \ref usbsrHookSynchFrame(), and some cases of + * \ref usbsrHookSetFeature() and \ref usbsrHookClearFeature()). + * + * The transactions are made using a clean and efficient interface, consisting of two data structures and + * the endpoint 0 status byte: + * - The endpoint status is initially \ref EP_IDLE, which basically means that the setup handler is ready + * for a new setup phase (a new request). Upon an incoming request, the processing hook is called, and + * the \ref usbSetupHeader structure contains the 8 bytes received during the setup phase. At this + * point there are four different outcomes: + * - If the request is unknown or contains errors, the endpoint should be stalled. This is done by + * setting the endpoint status to \ref EP_STALL. + * - If there is no data phase (the length field is zero), the endpoint status should just remain in + * it's current state, \ref EP_IDLE. + * - If the request has an IN data phase, the \ref usbSetupData structure must be prepared. This + * includes setting a pointer to where IN data should be taken from, and the number of bytes to be + * transferred (usually the same number as indicated by the length field, but it can also be a + * lower number). The endpoint state is then changed to \ref EP_TX. + * - If the request has an OUT data phase, the \ref usbSetupData structure must be prepared. This + * includes setting a pointer to where OUT data should be stored, and the number of bytes to be + * transferred (always the same number as indicated by the length field). The endpoint state is + * then changed to \ref EP_RX. + * - When the data phase is complete, the processing hook function will be called a second time to notify + * the application. Under normal conditions the endpoint status will be either \ref EP_TX or \ref EP_RX, + * and does not need to be changed any further (as this is done automatically upon return). If the + * endpoint status is \ref EP_CANCEL, it means that the USB host cancelled the setup transfer. + * + * The following code examples illustrate practical usage (more code is available in the application + * example projects): + * + * \par Example 1: Endpoint 0 Requests With OUT Data phase + * + * \code + * uint8 pLcdBuffer[358]; + * + * void usbvrHookProcessOut(void) { + * + * // When this vendor request is received, we should either update a part of pLcdBuffer[] or leave + * // it as it is, and then refresh the LCD display. The index field of the setup header contains the + * // index of the first character to be updated, and the length field how many characters to update. + * if (usbSetupHeader.request == VR_LCD_UPDATE) { + * + * // First the endpoint status is EP_IDLE... (we have just received the Setup packet) + * if (usbfwData.ep0Status == EP_IDLE) { + * + * // There is no new data -> Just refresh the display + * if (usbSetupHeader.length == 0) { + * lcdRefresh(); + * // There is no change to the endpoint status in this case + * + * // The PC wants to send data that will be stored outside pLcdBuffer -> stall the endpoint! + * } else if ((usbSetupHeader.length > sizeof(pLcdBuffer) || + * (usbSetupHeader.index >= sizeof(pLcdBuffer) || + * ((usbSetupHeader.index + usbSetupHeader.length) > sizeof(pLcdBuffer)) { + * usbfwData.ep0Status = EP_STALL; + * + * // Prepare for OUT data phase, setup the data buffer to receive the LCD data + * } else { + * usbSetupData.pBuffer = &pLcdBuffer[usbSetupHeader.index]; + * usbSetupData.bytesLeft = usbSetupHeader.length; + * usbfwData.ep0Status = EP_RX; + * } + * + * // Then the endpoint status is EP_RX (remember: we did that here when setting up the buffer) + * } else if (usbfwData.ep0Status == EP_RX) { + * // usbfwSetupHandler() has now updated pLcdBuffer, so all we need to do is refresh the LCD + * lcdRefresh(); + * // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + * } + * + * // Unknown vendor request? + * } else { + * usbfwData.ep0Status = EP_STALL; + * } + * } + * \endcode + * + * \par Example 2: Endpoint 0 Requests With IN Data phase + * + * \code + * uint8 keyBufferPos; + * BOOL blockKeyboard; + * char pKeyBuffer[150]; + * + * void usbvrProcessIn(void) { + * + * // When this vendor request is received, we should send all registered key-strokes, and reset the + * // position counter. New keystrokes are blocked during the transfer to avoid overwriting the buffer + * // before it has been sent to the host. + * if (usbSetupHeader.request == VR_GET_KEYS) { + * + * // First the endpoint status is EP_IDLE... + * if (usbfwData.ep0Status == EP_IDLE) { + * + * // Make sure that we do not send more than the PC asked for + * if (usbSetupHeader.length < keyBufferPos) { + * usbfwData.ep0Status = EP_STALL; + * + * // Otherwise... + * } else { + * // Block for new keystrokes + * blockKeyboard = TRUE; + * + * // Setup the buffer + * usbSetupData.pBuffer = pKeyBuffer; + * usbSetupData.bytesLeft = keyBufferPos; + * usbfwData.ep0Status = EP_TX; + * + * // Reset the position counter + * keyBufferPos = 0; + * } + * + * // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer) + * } else if (usbfwData.ep0Status == EP_TX) { + * + * // pKeyBuffer has now been sent to the host, so new keystrokes can safely be registered + * blockKeyboard = FALSE; + * + * // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler() + * } + * + * // Unknown request? + * } else { + * usbfwData.ep0Status = EP_STALL; + * } + * } + * \endcode + * + * If automated data transfer is not desired, the application should set \c usbfwData.ep0Status to + * either \ref EP_MANUAL_RX or \ref EP_MANUAL_TX instead of \ref EP_RX or \ref EP_TX, respectively. Until + * the transfer is completed, the processing hook function (e.g. \ref usbvrHookProcessIn()) will be called + * at every endpoint 0 interrupt. + * @{ + */ +#include "usb_board_cfg.h" +#include "usb_framework_structs.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBFRAMEWORK_C + #define EXTERN ///< Definition used only for usb_framework.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Module Data +//@{ +EXTERN USBFW_DATA __xdata usbfwData; ///< USBFW internal module data + +//@} +//------------------------------------------------------------------------------------------------------- + + +/// \name Setup Handler Data +//@{ +EXTERN USB_SETUP_DATA __xdata usbSetupData; ///< Setup handler data phase configuration +EXTERN USB_SETUP_HEADER __xdata usbSetupHeader; ///< Setup header +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Request Type Fields +//@{ + +// Field masks +#define RT_MASK_DIR 0x80 ///< Request direction bit mask +#define RT_MASK_TYPE 0x60 ///< Request type bit mask +#define RT_MASK_RECIP 0x1F ///< Request recipient bit mask + +// Direction field +#define RT_DIR_IN 0x80 ///< IN Request +#define RT_DIR_OUT 0x00 ///< OUT Request + +// Type field +#define RT_TYPE_STD 0x00 ///< Standard Request +#define RT_TYPE_CLASS 0x20 ///< Class Request +#define RT_TYPE_VEND 0x40 ///< Vendor Request + +// Recipient field +#define RT_RECIP_DEV 0x00 ///< Device Request +#define RT_RECIP_IF 0x01 ///< Interface Request +#define RT_RECIP_EP 0x02 ///< Endpoint Request +#define RT_RECIP_OTHER 0x03 ///< Other Request + +// Type + direction +#define RT_STD_OUT (RT_TYPE_STD | RT_DIR_OUT) ///< Standard request, direction is OUT +#define RT_STD_IN (RT_TYPE_STD | RT_DIR_IN) ///< Standard request, direction is IN +#define RT_VEND_OUT (RT_TYPE_VEND | RT_DIR_OUT) ///< Vendor request, direction is OUT +#define RT_VEND_IN (RT_TYPE_VEND | RT_DIR_IN) ///< Vendor request, direction is IN +#define RT_CLASS_OUT (RT_TYPE_CLASS | RT_DIR_OUT) ///< Class request, direction is OUT +#define RT_CLASS_IN (RT_TYPE_CLASS | RT_DIR_IN) ///< Class request, direction is IN + +// Direction + recepient +#define RT_OUT_DEVICE (RT_DIR_OUT | RT_RECIP_DEV) ///< Request made to device, direction is OUT +#define RT_IN_DEVICE (RT_DIR_IN | RT_RECIP_DEV) ///< Request made to device, direction is IN +#define RT_OUT_INTERFACE (RT_DIR_OUT | RT_RECIP_IF) ///< Request made to interface, direction is OUT +#define RT_IN_INTERFACE (RT_DIR_IN | RT_RECIP_IF) ///< Request made to interface, direction is IN +#define RT_OUT_ENDPOINT (RT_DIR_OUT | RT_RECIP_EP) ///< Request made to endpoint, direction is OUT +#define RT_IN_ENDPOINT (RT_DIR_IN | RT_RECIP_EP) ///< Request made to endpoint, direction is IN +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Vendor and Class Request Hooks +/// Unused hooks must stall endpoint 0. +//@{ + +/// Hook which is called upon reception of a class request with OUT data phase +void usbcrHookProcessOut(void); +/// Hook which is called upon reception of a class request with IN data phase +void usbcrHookProcessIn(void); +/// Hook which is called upon reception of a vendor request with OUT data phase +void usbvrHookProcessOut(void); +/// Hook which is called upon reception of a vendor request with IN data phase +void usbvrHookProcessIn(void); + +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Endpoint Access Macros +/// Note that the endpoint control registers are indexed, meaning that an endpoint must be selected +/// before the control operations listed below can be used. Interrupts using any of these macros, must +/// save the current selection and restore it upon return. +//@{ + +/// Selects which IN/OUT endpoint (by index 0 to 5) to operate on +#define USBFW_SELECT_ENDPOINT(n) (USBINDEX = (n)) +/// Gets the currently selected IN/OUT endpoint +#define USBFW_GET_SELECTED_ENDPOINT() (USBINDEX) + +/// Stalls the selected IN endpoint +#define USBFW_STALL_IN_ENDPOINT() st (\ + USBCSIL = USBCSIL_SEND_STALL; \ + usbfwData.pEpInStatus[USBINDEX - 1] = EP_HALT; ) + +/// Returns the stall condition for the selected IN endpoint +#define USBFW_IN_ENDPOINT_STALLED() (USBCSIL & USBCSIL_SEND_STALL) +/// Flushes the FIFO for the selected IN endpoint (flush twice when using double-buffering) +#define USBFW_FLUSH_IN_ENDPOINT() st (\ + USBCSIL = USBCSIL_FLUSH_PACKET; \ + while (USBCSIL & USBCSIL_FLUSH_PACKET); ) + +/// Arms the selected IN endpoint, so that contents of the endpoint FIFO can be sent to the host +#define USBFW_ARM_IN_ENDPOINT() (USBCSIL = USBCSIL_INPKT_RDY) +/// Is the selected IN endpoint disarmed? +#define USBFW_IN_ENDPOINT_DISARMED() !(USBCSIL & USBCSIL_INPKT_RDY) +/// Is the FIFO for the selected IN endpoint empty? +#define USBFW_IN_ENDPOINT_FIFO_EMPTY() !(USBCSIL & USBCSIL_PKT_PRESENT) + +/// Stalls the selected OUT endpoint +#define USBFW_STALL_OUT_ENDPOINT() st ( \ + USBCSOL = USBCSOL_SEND_STALL; \ + usbfwData.pEpOutStatus[USBINDEX - 1] = EP_HALT; \ +} + +/// Returns the stall condition for the selected OUT endpoint +#define USBFW_OUT_ENDPOINT_STALLED() (USBCSOL & USBCSOL_SEND_STALL) +/// Flushes the FIFO for the selected OUT endpoint (flush twice when using double-buffering) +#define USBFW_FLUSH_OUT_ENDPOINT() st(\ + USBCSOL = USBCSOL_FLUSH_PACKET; \ + while (USBCSOL & USBCSOL_FLUSH_PACKET); ) + +/// Arms the selected OUT endpoint, so that the FIFO can receive data from the host +#define USBFW_ARM_OUT_ENDPOINT() (USBCSOL = 0) +/// Is the selected OUT endpoint disarmed? If so, there is data waiting in the FIFO +#define USBFW_OUT_ENDPOINT_DISARMED() (USBCSOL & USBCSOL_OUTPKT_RDY) +/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, low byte +#define USBFW_GET_OUT_ENDPOINT_COUNT_LOW() (USBCNTL) +/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, high byte +#define USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() (USBCNTH) + +//@} +//------------------------------------------------------------------------------------------------------- + +// Little endian +#define LOBYTEPTR(w) ( (uint8 __generic *)(&(w)) + 1 ) +// Big endian +//#define LOBYTEPTR(w) ( (uint8 __generic *)&(w) ) + + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbfwInit(void); +void usbfwResetHandler(void); +void usbfwSetupHandler(void); +void usbfwSetAllEpStatus(EP_STATUS status); +void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData); +void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData); +//------------------------------------------------------------------------------------------------------- + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.c new file mode 100644 index 0000000..741b467 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.c @@ -0,0 +1,242 @@ +/*********************************************************************************** + + Filename: usb_descriptor_parser.c + + Description: Parser for USB descriptor structures. + +***********************************************************************************/ + +/// \addtogroup module_usb_descriptor_parser +/// @{ +#define USBDESCRIPTORPARSER_C ///< Modifies the behavior of "EXTERN" in usb_descriptor_parser.h +#include "usb_firmware_library_headers.h" + +//------------------------------------------------------------------------------------------------------- +// USBDP internal module data +static USBDP_DATA __xdata usbdpData; ///< USBDP internal module data + + +/** \brief Initializes a search +* +* This function must be called before each new search to reset \ref USBDP_DATA.pDesc. +*/ +void usbdpInit(void) +{ + usbdpData.pDesc = (const uint8 __code *) usbDescriptorMarker.pUsbDescStart; +} // usbdpInit + + + + +/** \brief Locates the descriptor of the wanted type +* +* This function parses through the USB descriptors until: +* \li It hits one with bDescriptorType = wantedType, in which case it returns a pointer to +* that descriptor, and exits. \ref USBDP_DATA.pDesc will then point to the next descriptor. +* \li It hits one with bDescriptorType = haltAtType, in which case it returns a NULL-pointer, +* and exits. \ref USBDP_DATA.pDesc will then point to that descriptor. +* \li \ref USBDP_DATA.pDesc = \ref usbDescEnd, in which case it returns a NULL-pointer, and exits. +* \ref USBDP_DATA.pDesc will continue to point to \ref usbDescEnd. +* +* \note To begin a search with this function, \ref usbdpInit should be called first. It should not be +* called when continuing a search - for instance after a call to \ref usbdpGetConfigurationDesc(). +* +* \param[in] wantedType +* The wanted descriptor type (e.g. \ref DESC_TYPE_CONFIG) +* \param[in] haltAtType +* The parser halts when it reaches this descriptor type, unless \c haltAtType is \c 0 (which in any +* case is an invalid \c bDescriptorType value). +* +* \return +* A pointer to the wanted descriptor type, or \c NULL if it was not found. +*/ +void __code* usbdpFindNext(uint8 wantedType, uint8 haltAtType) +{ + void __code *pResult; + pResult = NULL; + + // As long as we haven't reached the end... + while (usbdpData.pDesc != (void __code *) usbDescriptorMarker.pUsbDescEnd) { + + // If we have a match on wantedType... + if (usbdpData.pDesc[DESC_TYPE_IDX] == wantedType) { + pResult = (void __code*) usbdpData.pDesc; + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + break; + + // If we have a match on haltAtType... + } else if (usbdpData.pDesc[DESC_TYPE_IDX] == haltAtType) { + if (haltAtType) break; + } + + // Move on to the next descriptor + usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX]; + } + + return pResult; +} // usbdpFindNext + + + + +/** \brief Locates the (one and only) device descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void) +{ + usbdpInit(); + return usbdpFindNext(DESC_TYPE_DEVICE, 0); +} // usbdpGetDeviceDesc + + + + +/** \brief Locates a configuration descriptor +* +* The search will either look for a descriptor with a specific +* \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue, or simply take the n'th descriptor (by "index") +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value to search for (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue), or +* 0 to find descriptor by index +* \param[in] cfgIndex +* A zero-based index for the configuration descriptor to find. +* This value is ignored unless \c cfgValue is 0. +* +* \return +* A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex) +{ + USB_CONFIGURATION_DESCRIPTOR __code *pConfigurationDesc; + usbdpInit(); + + // As long as there are more configuration descriptors... + while (pConfigurationDesc = usbdpFindNext(DESC_TYPE_CONFIG, 0)) { + + // Search by value? + if (cfgValue) { + if (cfgValue == pConfigurationDesc->bConfigurationValue) break; + + // Search by index? (search cfgIndex+1 times) + } else if (!cfgIndex--) { + break; + } + } + + return pConfigurationDesc; +} // usbdpGetConfigurationDesc + + + + +/** \brief Locates an interface descriptor +* +* The function will first go to the configuration descriptor that matches the supplied configuration +* value, and then locate the interface descriptor that matches the given interface number and alternate +* setting. +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] cfgValue +* The configuration value (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue) +* \param[in] intNumber +* The interface number (\ref USB_INTERFACE_DESCRIPTOR.bInterfaceNumber) +* \param[in] altSetting +* The alternate setting (\ref USB_INTERFACE_DESCRIPTOR.bAlternateSetting) +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting) +{ + USB_INTERFACE_DESCRIPTOR __code *pInterfaceDesc; + + // First get to the correct configuration + usbdpGetConfigurationDesc(cfgValue, 0); + + // Then find a match on the interface + while (pInterfaceDesc = usbdpFindNext(DESC_TYPE_INTERFACE, DESC_TYPE_CONFIG)) { + if ((pInterfaceDesc->bInterfaceNumber == intNumber) && (pInterfaceDesc->bAlternateSetting == altSetting)) { + break; + } + } + + return pInterfaceDesc; +} // usbdpGetInterfaceDesc + + + + +/** \brief Locates a string descriptor +* +* \note It is not necessary to call \ref usbdpInit() before this function. +* +* \param[in] strIndex +* A zero-based index that matches the "iXxxxxxxxxx" string indexes in the other descriptors +* +* \return +* A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found. +*/ +USB_STRING_DESCRIPTOR __code* usbdpGetStringDesc(uint8 strIndex) +{ + USB_STRING_DESCRIPTOR __code *pStringDesc; + usbdpInit(); + +#ifdef MS_EXT_C_ID + if (strIndex == 0xEE){ + // Find the Microsoft OS String Descriptor + do{ + pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0); + }while (pStringDesc != NULL && pStringDesc->bLength != 18); + } else +#endif + { + // Search strIndex+1 times + do { + pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0); + } while (strIndex--); + } + return pStringDesc; +} // usbdpGetStringDesc +/// @} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.h new file mode 100644 index 0000000..fa3ac81 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_descriptor_parser.h @@ -0,0 +1,129 @@ +/*********************************************************************************** + + Filename: usb_descriptor_parser.h + + Description: Parser for USB descriptor structures. + +***********************************************************************************/ + +#ifndef USBDESCRIPTORPARSER_H +#define USBDESCRIPTORPARSER_H +/** \addtogroup module_usb_descriptor_parser USB Descriptor Parser (usbdp) + * \brief This module contains internally used functions for locating USB descriptors. + * + * The parsing mechanism supports all standard descriptors, i.e. DEVICE, CONFIGURATION, INTERFACE, + * ENDPOINT and STRING, but also other types that use the standard descriptor format: + * \code + * typedef struct { + * uint8 bLength; // Size of this descriptor (in bytes) + * uint8 bDescriptorType; // Descriptor type + * ... + * } USB_XXXXXXXX_DESCRIPTOR; + * \endcode + * + * \section section_usbdp_requirements Requirements + * The standard-formatted descriptors must be placed back-to-back in either XDATA or CODE memory. + * In the current version of the library, the USB descriptors are assumed to reside in CODE. + * Two markers (XDATA or CODE memory pointers), \ref usbDescStart and \ref usbDescEnd, define where + * the first descriptor begins and where the last descriptor ends, respectively + * (so that usbDescStart - usbDescEnd equals the total length of the descriptors). + * + * The markers can be dynamic, provided that they are not changed while the descriptor parser is in use. + * However, in most cases the USB descriptor set will be static, hence the markers are also static. + * The following example shows how static markers are declared and made public in 8051 assembler: + * \code + * ; Make the symbols public + * PUBLIC usbDescStart; + * PUBLIC usbDescEnd; + * + * ... + * + * usbDescStart: + * deviceDesc: ; Device descriptor (the first descriptor) + * DB deviceDescEnd - deviceDesc + * DB DESC_TYPE_DEVICE ; bDescriptorType + * DB 10H, 01H ; bcdUSB + * DB 00H ; bDeviceClass + * DB 00H ; bDeviceSubClass + * + * ... + * + * string3Desc: ; String descriptor: Serial number (the last descriptor) + * DB string3DescEnd - string3Desc; + * DB DESC_TYPE_STRING ; bDescriptorType + * DB '1', 0; + * DB '2', 0; + * DB '3', 0; + * string3DescEnd: + * usbDescEnd: + * \endcode + * @{ + */ + +#include "usb_descriptor.h" + + +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Indexes Into USB Descriptors +//@{ +#define DESC_LENGTH_IDX 0 ///< Index of the bLength field (all descriptors) +#define DESC_TYPE_IDX 1 ///< Index of the bDescriptorType field (all descriptors) +#define DESC_CONFIG_LENGTH_LSB_IDX 2 ///< Index of LOUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +#define DESC_CONFIG_LENGTH_MSB_IDX 3 ///< Index of HIUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbdpInit(void); +void __code *usbdpFindNext(uint8 wantedType, uint8 haltAtType); + +USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void); +USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex); +USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting); +USB_STRING_DESCRIPTOR __code* usbdpGetStringDesc(uint8 strIndex); +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework.c new file mode 100644 index 0000000..6cc2e88 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework.c @@ -0,0 +1,329 @@ +/*********************************************************************************** + + Filename: usb_framework.c + + Description: USB library common functionality. + +***********************************************************************************/ + +/// \addtogroup module_usb_framework +/// @{ +#define USBFRAMEWORK_C ///< Modifies the behavior of "EXTERN" in usb_framework.h +#include "usb_firmware_library_headers.h" +#include "usb_board_cfg.h" + +// Function pointer used by usbfwSetupHandler() +static VFPTR ProcessFunc; + +/** \brief Initializes the USB framework + * + * This function should be called when the microcontroller is ready to accept USB traffic. It enables the + * USB peripheral unit and enables the pull-up resistor on the D+ line. Endpoint status, current + * configuration value, etc. are initialized and evenetually re-initialized in the + * \ref usbfwResetHandler() function. + */ +void usbfwInit(void) +{ + // Set default values + usbfwData.selfPowered = (usbdpGetConfigurationDesc(1, 0)->bmAttributes & 0x40) ? TRUE : FALSE; + usbfwData.remoteWakeup = TRUE; + + HAL_USB_ENABLE(); + HAL_USB_RUN(); +} // usbfwInit + + + + +/** \brief Handles USB reset signalling + * + * This function should be called, either from the USB interrupt or the main loop, when the \c USBCIF.RST + * flag has been set. Keep in mind that all bits in \c USBCIF register are cleared when the register is + * read. The function puts the device into the default state (not yet addressed), and puts all endpoints + * (except EP0) into the \ref EP_HALT state + */ +void usbfwResetHandler(void) +{ + + // Reset the USB state + usbfwData.usbState = DEV_DEFAULT; + usbfwData.configurationValue = 0; + + // Reset all endpoints + usbfwData.ep0Status = EP_IDLE; + usbfwSetAllEpStatus(EP_HALT); + + // Reset last function pointer + ProcessFunc = NULL; + +} // usbfwResetHandler + + + + +/** \brief USB Setup Handler + * + * This function should be called either from the USB interrupt or the main loop when the \c USBIIF.EP0IF + * flag has been set. Keep in mind that all bits in \c USBIIF register are cleared when the register is + * read. A detailed description of the framework is found in the \ref section_setup_handler_usage + * section. + * + * \note The USB header data is always little-endian, so if a big-endian compiler is used (such as Keil + * C51), the 16-bit values in the \ref usbSetupHeader must be flipped before they are used. + */ +void usbfwSetupHandler(void) +{ + uint8 controlReg; + uint8 bytesNow; + uint8 oldEndpoint; + + // Save the old index setting, then select endpoint 0 and fetch the control register + oldEndpoint = USBFW_GET_SELECTED_ENDPOINT(); + USBFW_SELECT_ENDPOINT(0); + controlReg = USBCS0; + + // The last transfer was ended prematurely by a new SETUP packet + if (controlReg & USBCS0_SETUP_END) { + USBCS0 = USBCS0_CLR_SETUP_END; + usbfwData.ep0Status = EP_CANCEL; + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // A STALL handshake was transmitted to the PC + if (controlReg & USBCS0_SENT_STALL) { + USBCS0 = 0x00; + usbfwData.ep0Status = EP_IDLE; + } + + // Receive OUT packets + if (usbfwData.ep0Status == EP_RX) { + + // Read FIFO + bytesNow = USBCNT0; + usbfwReadFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.bytesLeft -= bytesNow; + usbSetupData.pBuffer += bytesNow; + + // Arm the endpoint + USBCS0 = usbSetupData.bytesLeft ? USBCS0_CLR_OUTPKT_RDY : (USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END); + + // Make a call to the appropriate request handler when done + if (usbSetupData.bytesLeft == 0) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Return here since nothing more will happen until the next interrupt + USBFW_SELECT_ENDPOINT(oldEndpoint); + return; + + // Let the application handle the reception + } else if (usbfwData.ep0Status == EP_MANUAL_RX) { + ProcessFunc(); + } + + // Receive SETUP header + if (usbfwData.ep0Status == EP_IDLE) { + if (controlReg & USBCS0_OUTPKT_RDY) { + usbfwReadFifo(&USBF0, 8, (uint8 __xdata *) &usbSetupHeader); + + // Handle control transfers individually + ProcessFunc = NULL; + switch (usbSetupHeader.requestType & (RT_MASK_TYPE | RT_MASK_DIR)) { + + // Standard requests with data from the host (OUT) + case RT_STD_OUT: + switch (usbSetupHeader.request) { + case SET_ADDRESS: usbsrSetAddress(); break; + case SET_FEATURE: usbsrSetFeature(); break; + case CLEAR_FEATURE: usbsrClearFeature(); break; + case SET_CONFIGURATION: usbsrSetConfiguration(); break; + case SET_INTERFACE: usbsrSetInterface(); break; + case SET_DESCRIPTOR: /*usbsrHookSetDescriptor(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Standard requests with data to the host (IN) + case RT_STD_IN: + switch (usbSetupHeader.request) { + case GET_STATUS: usbsrGetStatus(); break; + case GET_DESCRIPTOR: usbsrGetDescriptor(); break; + case GET_CONFIGURATION: usbsrGetConfiguration(); break; + case GET_INTERFACE: usbsrGetInterface(); break; + case SYNCH_FRAME: /*usbsrHookSynchFrame(); break; - unsupported */ + default: usbfwData.ep0Status = EP_STALL; break; + } + break; + + // Vendor requests + case RT_VEND_OUT: + ProcessFunc = usbvrHookProcessOut; usbvrHookProcessOut(); + break; + case RT_VEND_IN: + ProcessFunc = usbvrHookProcessIn; usbvrHookProcessIn(); + break; + + // Class requests + case RT_CLASS_OUT: + ProcessFunc = usbcrHookProcessOut; usbcrHookProcessOut(); + break; + case RT_CLASS_IN: + ProcessFunc = usbcrHookProcessIn; usbcrHookProcessIn(); + break; + + // Unrecognized request: Stall the endpoint + default: + usbfwData.ep0Status = EP_STALL; + break; + } + + // Arm/stall the endpoint + USBCS0 = (usbfwData.ep0Status == EP_STALL) ? (USBCS0_CLR_OUTPKT_RDY | USBCS0_SEND_STALL) : USBCS0_CLR_OUTPKT_RDY; + } + } + + // Transmit IN packets + if (usbfwData.ep0Status == EP_TX) { + controlReg = USBCS0_INPKT_RDY; + + // The last frame should contain 0 to (EP0_PACKET_SIZE - 1) bytes + if (usbSetupData.bytesLeft < EP0_PACKET_SIZE) { + bytesNow = usbSetupData.bytesLeft; + controlReg |= USBCS0_DATA_END; + + // All other packets should have the maximum length + } else { + bytesNow = EP0_PACKET_SIZE; + } + + // Load the FIFO and move the pointer + usbfwWriteFifo(&USBF0, bytesNow, usbSetupData.pBuffer); + usbSetupData.pBuffer += bytesNow; + usbSetupData.bytesLeft -= bytesNow; + + // Arm the FIFO (even for a zero-length packet) + USBCS0 = controlReg; + + // Make a call to the appropriate request handler when done + if (bytesNow < EP0_PACKET_SIZE) { + if (ProcessFunc) ProcessFunc(); + usbfwData.ep0Status = EP_IDLE; + } + + // Let the application handle the transmission + } else if (usbfwData.ep0Status == EP_MANUAL_TX) { + ProcessFunc(); + } + + // Restore the old index setting + USBFW_SELECT_ENDPOINT(oldEndpoint); + +} // usbfwSetupHandler + + + + +/** \brief Changes the state of endpoint 1-5 IN/OUT + * + * This is an internal function used by the library. + * + * \param[in] status + * The new status for each endpoint + */ +void usbfwSetAllEpStatus(EP_STATUS status) +{ + uint8 n; + for (n = 0; n < sizeof(usbfwData.pEpInStatus); n++) + usbfwData.pEpInStatus[n] = status; + for (n = 0; n < sizeof(usbfwData.pEpOutStatus); n++) + usbfwData.pEpOutStatus[n] = status; +} // usbfwSetAllEpStatus + + + + +/** \brief Reads from the selected OUT endpoint FIFO, without using DMA + * + * The FIFO must be re-armed after reading it empty (using the \ref USBFW_ARM_OUT_ENDPOINT() macro). This + * is not necessary when flushing the FIFO. + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to read + * \param[in] *pData + * A pointer to the storage location for the read data (in any memory space) + */ +void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *(pTemp++) = *pFifo; + } while (--count); + } +} // usbfwReadFifo + + + + +/** \brief Writes to the selected IN endpoint FIFO, without using DMA + * + * Note that the FIFO must be armed in order to be transmitted (using the \ref USBFW_ARM_IN_ENDPOINT() + * macro). + * + * \param[in] *pFifo + * Pointer to the FIFO (\c &USBFx) + * \param[in] count + * The number of bytes to write + * \param[in] *pData + * A pointer to the data to be written (from any memory space) + */ +void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData) +{ + uint8 __generic *pTemp = pData; + if (count) { + do { + *pFifo = *(pTemp++); + } while (--count); + } +} // usbfwWriteFifo + + +/// @} +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework_structs.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework_structs.h new file mode 100644 index 0000000..7f4d9ec --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_framework_structs.h @@ -0,0 +1,233 @@ +/*********************************************************************************** + + Filename: usb_framework_structs.h + + Description: USB library common data structures. + +***********************************************************************************/ + +#ifndef USBFRAMEWORKSTRUCTS_H +#define USBFRAMEWORKSTRUCTS_H +/** \addtogroup module_usb_framework USB Framework (usbfw) + * \brief This module contains USB status and descriptor structs + * + * + * @{ + */ +#include "hal_types.h" +#include "usb_firmware_library_config.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBFRAMEWORK_C + #define EXTERN ///< Definition used only for usb_framework.c +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// \name Module Data +//@{ + +/// Endpoint status (used with USB_INFO.ep0Status / pEpInStatus[] / pEpOutStatus[]) +typedef enum { + EP_IDLE = 0x00, ///< The endpoint is idle, or a setup token has been received + EP_TX = 0x01, ///< Setup IN data is transmitted automatically by the framework + EP_RX = 0x02, ///< Setup OUT data is received automatically by the framework + EP_HALT = 0x03, ///< The endpoint is halted (returns stalls to the host) + EP_STALL = 0x04, ///< Send procedural stall in the next status phase + EP_MANUAL_TX = 0x05, ///< Setup IN data is transmitted manually by the user application + EP_MANUAL_RX = 0x06, ///< Setup OUT data is received manually by the user application + EP_CANCEL = 0x07 ///< The current transfer was cancelled by the host +} EP_STATUS; + +/// Device state (used with USB_INFO.usbState) +typedef enum { + DEV_ATTACHED = 0x00, ///< Device attached (invisible state) + DEV_POWERED = 0x01, ///< Device powered (invisible state) + DEV_DEFAULT = 0x02, ///< Default state (the \c USBADDR register is 0) + DEV_ADDRESS = 0x03, ///< Addressed state (the \c USBADDR register has been set) + DEV_CONFIGURED = 0x04, ///< Configured state (\c usbfwData.configurationValue != 0) + DEV_SUSPENDED = 0x05 ///< Suspended state (never set) +} USB_STATE; + +/// USBFW internal module data +typedef struct { + USB_STATE usbState; ///< USB device state + uint8 configurationValue; ///< Current configuration value + uint8 pAlternateSetting[USB_SETUP_MAX_NUMBER_OF_INTERFACES]; ///< Current alternate settings + EP_STATUS ep0Status; ///< Endpoint 0 status + EP_STATUS pEpInStatus[5]; ///< Endpoint 1-5 IN status + EP_STATUS pEpOutStatus[5]; ///< Endpoint 1-5 OUT status + uint8 remoteWakeup; ///< Remote wakeup allowed + uint8 selfPowered; ///< Is currently self-powered? +} USBFW_DATA; + +//------------------------------------------------------------------------------------------------------- +/// Setup header (contains the 8 bytes received during the setup phase) +typedef struct { + uint8 requestType; ///< Request type (direction, type and recipient, see the \c RT_ definitions) + uint8 request; ///< Request ID + uint16 value; ///< Value field + uint16 index; ///< Index field + uint16 length; ///< Length of data phase +} USB_SETUP_HEADER; + +/// Setup handler data phase configuration +typedef struct { + uint8 __generic *pBuffer; ///< Pointer to where IN/OUT data should be taken from/received + uint16 bytesLeft; ///< The number of bytes to transfer +} USB_SETUP_DATA; + + +//@} +//------------------------------------------------------------------------------------------------------- + +// From usb_descriptor.h +/** \addtogroup module_usb_descriptor USB Descriptor*/ +//------------------------------------------------------------------------------------------------------- +/// USB device descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_DEVICE + uint16 bcdUSB; ///< USB specification release number (in BCD, e.g. 0110 for USB 1.1) + uint8 bDeviceClass; ///< Device class code + uint8 bDeviceSubClass; ///< Device subclass code + uint8 bDeviceProtocol; ///< Device protocol code + uint8 bMaxPacketSize0; ///< Maximum packet size for EP0 + uint16 idVendor; ///< Vendor ID + uint16 idProduct; ///< Product ID + uint16 bcdDevice; ///< Device release number (in BCD) + uint8 iManufacturer; ///< Index of the string descriptor for manufacturer + uint8 iProduct; ///< Index of the string descriptor for product + uint8 iSerialNumber; ///< Index of the string descriptor for serial number + uint8 bNumConfigurations; ///< Number of possible configurations +} USB_DEVICE_DESCRIPTOR; + +/// USB configuration descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_CONFIG + uint16 wTotalLength; ///< Total length of data for this configuration + uint8 bNumInterfaces; ///< Number of interfaces supported by this configuration (one-based index) + uint8 bConfigurationValue; ///< Designator value for this configuration + uint8 iConfiguration; ///< Index of the string descriptor for this configuration + uint8 bmAttributes; ///< Configuration characteristics + uint8 bMaxPower; ///< Maximum power consumption in this configuration (bMaxPower * 2 mA) +} USB_CONFIGURATION_DESCRIPTOR; + +/// USB interface descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_INTERFACE + uint8 bInterfaceNumber; ///< Number of *this* interface (zero-based index) + uint8 bAlternateSetting; ///< Alternate setting index for this descriptor (zero-based index) + uint8 bNumEndpoints; ///< Number of endpoints for this interface (excl. EP0) + uint8 bInterfaceClass; ///< Interface class code + uint8 bInterfaceSubClass; ///< Interface subclass code + uint8 bInterfaceProtocol; ///< Interface protocol code + uint8 iInterface; ///< Index of the string descriptor for this interface +} USB_INTERFACE_DESCRIPTOR; + +/// USB endpoint descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_ENDPOINT + uint8 bEndpointAddress; ///< Endpoint address (direction[7] + number[3:0]) + uint8 bmAttributes; ///< Endpoint attributes (ISO / BULK / INT) + uint16 wMaxPacketSize; ///< Maximum endpoint packet size + uint8 bInterval; ///< \ref EP_ATTR_INT : Polling interval (in ms) +} USB_ENDPOINT_DESCRIPTOR; + +/// USB string descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< Descriptor type = \ref DESC_TYPE_STRING + uint16 pString[1]; ///< Unicode string +} USB_STRING_DESCRIPTOR; + +/// USB HID descriptor +typedef struct { + uint8 bLength; ///< Size of this descriptor (in bytes) + uint8 bDescriptorType; ///< HID descriptor type + uint16 bscHID; ///< HID specification release number (in BCD) + uint8 bCountryCode; ///< Hardware target country + uint8 bNumDescriptors; ///< Number of HID class descriptors to follow + uint8 bRDescriptorType; ///< Report descriptor type + uint16 wDescriptorLength; ///< Total length of the associated report descriptor +} USB_HID_DESCRIPTOR; +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// Look-up table entry for non-standard descriptor types (used with \ref usbsrGetDescriptor) +typedef struct { + uint8 valueMsb; ///< LSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 valueLsb; ///< MSB of the \ref USB_SETUP_HEADER.value request parameter + uint8 indexMsb; ///< LSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 indexLsb; ///< MSB of the \ref USB_SETUP_HEADER.index request parameter + uint8 __code *pDescStart; ///< A pointer to the descriptor to be returned for the given index/value + uint16 length; ///< The length of the returned descriptor +} DESC_LUT_INFO; + +/// Look-up table for double-buffer settings +typedef struct { + USB_INTERFACE_DESCRIPTOR __code *pInterface; ///< Pointer to an interface descriptor + uint8 inMask; ///< Bitmask for IN endpoints (bit x maps to EPx IN) + uint8 outMask; ///< Bitmask for OUT endpoints (bit x maps to EPx OUT) +} DBLBUF_LUT_INFO; + +// From usb_interrupt.h +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + uint16 irqMask; ///< USB interrupts to be enabled + uint8 inSuspend; ///< Is currently in suspend? +} USBIRQ_DATA; + +//------------------------------------------------------------------------------------------------------- +/// USBDP internal module data +typedef struct { + const uint8 __code *pDesc; ///< Pointer to the current descriptor +} USBDP_DATA; +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_interrupt.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_interrupt.h new file mode 100644 index 0000000..c95d0d7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_hid/usb_interrupt.h @@ -0,0 +1,212 @@ +/*********************************************************************************** + + Filename: usb_interrupt.h + + Description: USB library interrupt initialisation and ISR. + +***********************************************************************************/ + +#ifndef USBINTERRUPT_H +#define USBINTERRUPT_H +/** \addtogroup module_usb_interrupt USB Interrupt (usbirq) + * \brief This module contains the USB interrupt handler, which converts USB interrupts to USBIRQ events. + * + * This module contains two interrupt service routines: + * \li P0 ISR + * \li P2 ISR + * Both these are used by the USB part of the MCU. Hence it is recommended to only use P1 for + * interrupts from any peripherals connected to the MCU. Unless running low on GPIO pins, one should + * generally avoid using the P0 and P2 pins at all. + * + * The MCU contains three interrupt flag registers, USBCIE, USBIIE and USBOIE, which are all cleared + * upon read access. The \ref module_usb_interrupt module encapsulates the USB interrupts, and saves the + * three flag registers in a single 16-bit word. By doing that it becomes possible to process + * high-priority events in the interrupt context, and low-priority events in the main loop. + * + * \section section_usbirq_initialization Initialization + * After initializing the \ref module_usb_framework module, \c main() must call \ref usbirqInit(). The + * \c irqMask parameter of this function shall contain all \c USBIRQ_EVENT bits that will be handled + * either in the interrupt or in \c main(). Note, however, that the event reporting may not always be + * necessary. For instance, there is usually no reason to enable \c USBIRQ_EVENT_EPxIN or + * \c USBIRQ_EVENT_EPxOUT events when handling low-priority transfers in the \c main() loop. In these + * cases it is simpler and more efficient to check the arming condition of the endpoint in question. + * + * The following example enables the setup and reset events (which must always be enabled!), and turns on + * global interrupts: + * \code + * void main(void) { + * + * ... Initialize the crystal oscillator and USB framework first ... + * + * // Initialize the USB Interrupt module + * usbirqInit(USBIRQ_EVENT_RESET | USBIRQ_EVENT_SUSPEND | USBIRQ_EVENT_RESUME | USBIRQ_EVENT_SETUP); + * + * // Turn on interrupts + * INT_GLOBAL_ENABLE(); + * + * // Main loop + * while (1) { + * ... + * } + * \endcode + * + * \section section_usbirq_event_processing Event Processing + * Regardless of whether the interrupt event is processed in the interrupt or in the main loop, the code + * piece for doing it is the same (this example illustrates the processing of \ref USBIRQ_EVENT_RESET + * events): + * \code + * // Let the framework handle reset events :) + * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) { + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET); + * usbfwResetHandler(); + * } + * \endcode + * + * \section Hooks + * The following hook is called from the USB interrupt, and allows for event processing in the interrupt + * context: + * \code + * void usbirqHookProcessEvents(void) { + * // Process high-priority events here, or simply return if there are none + * } + * \endcode + * @{ + */ + +#include "usb_framework_structs.h" + +#ifdef EXTERN + #undef EXTERN +#endif +#ifdef USBINTERRUPT_C + #define EXTERN ///< Definition used only for usb_interrupt.c to declare variable +#else + #define EXTERN extern ///< Definition used in other source files to declare external +#endif + + +//------------------------------------------------------------------------------------------------------- +/// USBIRQ internal module data +/*typedef struct { + uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions) + uint16 irqMask; ///< USB interrupts to be enabled +} USBIRQ_DATA;*/ +#ifdef USBIRQ_DATA_ADDR + EXTERN __no_init volatile USBIRQ_DATA usbirqData @ USBIRQ_DATA_ADDR; ///< USBIRQ internal module data at fixed address +#else + EXTERN volatile USBIRQ_DATA usbirqData; ///< USBIRQ internal module data +#endif +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name USB Interrupt Events +//@{ + +/// Suspend signaling detected on the USB bus +/// Note that the chip should not enter PM1 while still in the interrupt routine (inside the usbirqHookProcessEvents() function ) +#define USBIRQ_EVENT_SUSPEND 0x0001 +/// Resume signaling detected on the USB bus +#define USBIRQ_EVENT_RESUME 0x0002 +/// Reset signaling detected on the USB bus (call \ref usbfwResetHandler() for processing) +#define USBIRQ_EVENT_RESET 0x0004 +/// Start of frame token received (synthesized by hardware when the next SOF token is expected, so that missing or corrupted tokens have no effect) +#define USBIRQ_EVENT_START_OF_FRAME 0x0008 +/// Endpoint 0 IN/OUT setup/data transfer complete / stall sent / premature completion (call \ref usbfwSetupHandler() for processing) +#define USBIRQ_EVENT_SETUP 0x0010 +/// Endpoint 1 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP1IN 0x0020 +/// Endpoint 2 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP2IN 0x0040 +/// Endpoint 3 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP3IN 0x0080 +/// Endpoint 4 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP4IN 0x0100 +/// Endpoint 5 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent +#define USBIRQ_EVENT_EP5IN 0x0200 +/// Endpoint 1 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP1OUT 0x0400 +/// Endpoint 2 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP2OUT 0x0800 +/// Endpoint 3 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP3OUT 0x1000 +/// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP4OUT 0x2000 +/// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent +#define USBIRQ_EVENT_EP5OUT 0x4000 +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Mask Access Macros +//@{ + +/// Clears one or more events (use one or more \c USBIRQ_EVENT bits OR'ed together) +#define USBIRQ_CLEAR_EVENTS(mask) (usbirqData.eventMask &= ((mask) ^ 0xFF)) +/// Get the bit mask containing all pending events +#define USBIRQ_GET_EVENT_MASK() (usbirqData.eventMask) +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Interrupt Event Hooks +//@{ + +/// Called upon all USB interrupts for high-priority event processing +void usbirqHookProcessEvents(void); + +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbirqInit(uint16 irqMask); +#if defined HAL_USB_BOOT_CODE +void usbirqHandler(void); +#else +__interrupt void usbirqHandler(void); +#endif +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_reg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_reg.h new file mode 100644 index 0000000..03bcc42 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_reg.h @@ -0,0 +1,142 @@ +/*********************************************************************************** + + Filename: usb_reg.h + + Description: Register bit defintions for CCxx11 and CC2531. + +***********************************************************************************/ + +#ifndef USBREG_H +#define USBREG_H + + +// USBADDR +#define USBADDR_UPDATE 0x80 +#define USBADDR_USBADDR 0x7F + +// USBPOW +#define USBPOW_ISO_WAIT_SOF 0x80 +#define USBPOW_RST 0x08 +#define USBPOW_RESUME 0x04 +#define USBPOW_SUSPEND 0x02 +#define USBPOW_SUSPEND_EN 0x01 + +// USBIIF +#define USBIIF_INEP5IF 0x20 +#define USBIIF_INEP4IF 0x10 +#define USBIIF_INEP3IF 0x08 +#define USBIIF_INEP2IF 0x04 +#define USBIIF_INEP1IF 0x02 +#define USBIIF_EP0IF 0x01 + +// USBOIF +#define USBOIF_OUTEP5IF 0x20 +#define USBOIF_OUTEP4IF 0x10 +#define USBOIF_OUTEP3IF 0x08 +#define USBOIF_OUTEP2IF 0x04 +#define USBOIF_OUTEP1IF 0x02 + +// USBCIF +#define USBCIF_SOFIF 0x08 +#define USBCIF_RSTIF 0x04 +#define USBCIF_RESUMEIF 0x02 +#define USBCIF_SUSPENDIF 0x01 + +// USBIIE +#define USBIIE_INEP5IE 0x20 +#define USBIIE_INEP4IE 0x10 +#define USBIIE_INEP3IE 0x08 +#define USBIIE_INEP2IE 0x04 +#define USBIIE_INEP1IE 0x02 +#define USBIIE_EP0IE 0x01 + +// USBOIE +#define USBOIE_OUTEP5IE 0x20 +#define USBOIE_OUTEP4IE 0x10 +#define USBOIE_OUTEP3IE 0x08 +#define USBOIE_OUTEP2IE 0x04 +#define USBOIE_OUTEP1IE 0x02 + +// USBCIE +#define USBCIE_SOFIE 0x08 +#define USBCIE_RSTIE 0x04 +#define USBCIE_RESUMEIE 0x02 +#define USBCIE_SUSPENDIE 0x01 + +// USBCS0 +#define USBCS0_CLR_SETUP_END 0x80 +#define USBCS0_CLR_OUTPKT_RDY 0x40 +#define USBCS0_SEND_STALL 0x20 +#define USBCS0_SETUP_END 0x10 +#define USBCS0_DATA_END 0x08 +#define USBCS0_SENT_STALL 0x04 +#define USBCS0_INPKT_RDY 0x02 +#define USBCS0_OUTPKT_RDY 0x01 + +// USBCSIL +#define USBCSIL_CLR_DATA_TOG 0x40 +#define USBCSIL_SENT_STALL 0x20 +#define USBCSIL_SEND_STALL 0x10 +#define USBCSIL_FLUSH_PACKET 0x08 +#define USBCSIL_UNDERRUN 0x04 +#define USBCSIL_PKT_PRESENT 0x02 +#define USBCSIL_INPKT_RDY 0x01 + +// USBCSIH +#define USBCSIH_AUTOSET 0x80 +#define USBCSIH_ISO 0x40 +#define USBCSIH_FORCE_DATA_TOG 0x08 +#define USBCSIH_IN_DBL_BUF 0x01 + +// USBCSOL +#define USBCSOL_CLR_DATA_TOG 0x80 +#define USBCSOL_SENT_STALL 0x40 +#define USBCSOL_SEND_STALL 0x20 +#define USBCSOL_FLUSH_PACKET 0x10 +#define USBCSOL_DATA_ERROR 0x08 +#define USBCSOL_OVERRUN 0x04 +#define USBCSOL_FIFO_FULL 0x02 +#define USBCSOL_OUTPKT_RDY 0x01 + +// USBCSOH +#define USBCSOH_AUTOCLEAR 0x80 +#define USBCSOH_ISO 0x40 +#define USBCSOH_OUT_DBL_BUF 0x01 + +#define SLEEP_USB_EN 0x80 + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c new file mode 100644 index 0000000..f3a38c5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.c @@ -0,0 +1,659 @@ +/*********************************************************************************** + + Filename: usb_standard_request.c + + Description: Handle USB standard requests. + +***********************************************************************************/ + +/// \addtogroup module_usb_standard_requests +/// @{ +#include "usb_firmware_library_headers.h" +#include "hal_types.h" +#include "hal_board.h" + + + +/** \brief Processes the \ref GET_STATUS request (returns status for the specified recipient) + * + * The recipient bits in \ref USB_SETUP_HEADER.requestType specify the desired recipient. This is either the + * (one and only) device, a specific interface, or a specific endpoint. Some of the status bits can be + * changed with the SET_FEATURE and CLEAR_FEATURE requests. + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 2 + * + * Data (IN): + * Depends upon the recipient (the bit field illustrations are MSB first, LSB last): + * - DEVICE: 00000000.000000RS, where R(1) = DEVICE_REMOTE_WAKEUP and S(0) = SELF_POWERED + * - INTERFACE: 00000000.00000000 (all bits are reserved) + * - ENDPOINT: 00000000.0000000H, where H(0) = ENDPOINT_HALT + */ +void usbsrGetStatus(void) +{ + uint8 endpoint; + static uint16 __xdata status; + + // Common sanity check + if (usbSetupHeader.value || HI_UINT16(usbSetupHeader.index) || (usbSetupHeader.length != 2)) { + usbfwData.ep0Status = EP_STALL; + + // Return status for device, interface, or endpoint + } else { + switch (usbSetupHeader.requestType) { + + // Device status: + // Bit 0: Self powered + // Bit 1: Remote wake-up allowed + case RT_IN_DEVICE: + + // Sanity check + if (LO_UINT16(usbSetupHeader.index)) { + usbfwData.ep0Status = EP_STALL; + + // Get the bit values from the USBFW_DATA struct + } else { + + // Self powered? + status = usbfwData.selfPowered ? 0x0001 : 0x0000; + + // Remote wakeup? + if (usbfwData.remoteWakeup) status |= 0x0002; + } + break; + + // Interface status: + // All bits are reserved + case RT_IN_INTERFACE: + + // Sanity check + if (usbfwData.usbState != DEV_CONFIGURED) { + usbfwData.ep0Status = EP_STALL; + } else { + status = 0x0000; + } + break; + + // Endpoint status: + // Bit 0: Endpoint halted + case RT_IN_ENDPOINT: + endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F; + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (endpoint > 5)) { + usbfwData.ep0Status = EP_STALL; + + // Translate endpoint address to status index and return the status + } else { + + // IN + if (LO_UINT16(usbSetupHeader.index) & 0x80) { + status = (usbfwData.pEpInStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000; + + // OUT + } else { + status = (usbfwData.pEpOutStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000; + } + } + break; + + default: + usbfwData.ep0Status = EP_STALL; + break; + } + + if (usbfwData.ep0Status != EP_STALL) { + // Send it + usbSetupData.pBuffer = (uint8 __generic *)&status; + usbSetupData.bytesLeft = 2; + usbfwData.ep0Status = EP_TX; + } + } +} // usbsrGetStatus + + + + +/** \brief Internal function used for the very similar \ref SET_FEATURE and \ref CLEAR_FEATURE requests + * + * This function either sets or clears the specified feature on the specified recipient. + * + * \param[in] set + * When TRUE, the feature is set. When FALSE, the feature is cleared. + * + * \return + * TRUE if the selected feature is supported by the USB library. FALSE to indicate that + * \ref usbsrHookClearFeature() or \ref usbsrHookSetFeature() must be called. + */ +static uint8 ChangeFeature(uint8 set) +{ + uint8 endpoint; + + // Sanity check + if (usbSetupHeader.length || (usbfwData.usbState != DEV_CONFIGURED) && (usbSetupHeader.index != 0)) { + usbfwData.ep0Status = EP_STALL; + + // Handle based on recipient + } else { + switch (usbSetupHeader.requestType & RT_MASK_RECIP) { + + // Device + case RT_RECIP_DEV: + + // Sanity check + if (LO_UINT16(usbSetupHeader.value) != DEVICE_REMOTE_WAKEUP) { + return FALSE; + } else { + usbfwData.remoteWakeup = set; + usbsrHookProcessEvent(set ? USBSR_EVENT_REMOTE_WAKEUP_ENABLED : USBSR_EVENT_REMOTE_WAKEUP_DISABLED, 0); + } + break; + + // Endpoint + case RT_RECIP_IF: + return FALSE; + + // Endpoint + case RT_RECIP_EP: + endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F; + + // Sanity check + if (LO_UINT16(usbSetupHeader.value) != ENDPOINT_HALT) { + return FALSE; + } else if (endpoint > 5) { + usbfwData.ep0Status = EP_STALL; + } else { + USBFW_SELECT_ENDPOINT(endpoint); + + // IN + if (LO_UINT16(usbSetupHeader.index) & 0x80) { + USBCSIL = set ? USBCSIL_SEND_STALL : USBCSIL_CLR_DATA_TOG; + usbfwData.pEpInStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE; + usbsrHookProcessEvent(set ? USBSR_EVENT_EPIN_STALL_SET : USBSR_EVENT_EPIN_STALL_CLEARED, endpoint); + + // OUT + } else { + USBCSOL = set ? USBCSOL_SEND_STALL : USBCSOL_CLR_DATA_TOG; + usbfwData.pEpOutStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE; + usbsrHookProcessEvent(set ? USBSR_EVENT_EPOUT_STALL_SET : USBSR_EVENT_EPOUT_STALL_CLEARED, endpoint); + } + USBFW_SELECT_ENDPOINT(0); + } + break; + + default: + usbfwData.ep0Status = EP_STALL; + break; + } + } + return TRUE; +} // ChangeFeature + + + + +/** \brief Processes the \ref CLEAR_FEATURE request (clears or disables a specific feature) + * + * The feature selector value must be appropriate to the recipient. + * + * Parameters: + * - VALUE: Feature selector: + * - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup + * - \c ENDPOINT_HALT(0): Clear the halt feature for the specified endpoint (not endpoint 0!) + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 0 + */ +void usbsrClearFeature() +{ + if (!ChangeFeature(FALSE)) { + usbsrHookClearFeature(); + } +} // usbsrClearFeature + + + + +/** \brief Processes the \ref SET_FEATURE request (sets or enables a specific feature) + * + * The feature selector value must be appropriate to the recipient. + * + * Parameters: + * - VALUE: Feature selector: + * - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup + * - \c ENDPOINT_HALT(0): Set the halt feature for the specified endpoint (not endpoint 0!) + * - INDEX: Depends upon the recipient: + * - DEVICE: Always 0 + * - INTERFACE: Interface number + * - ENDPOINT: Endpoint address + * - LENGTH: Always 0 + */ +void usbsrSetFeature(void) +{ + if (!ChangeFeature(TRUE)) { + usbsrHookSetFeature(); + } +} // usbsrSetFeature + + + + +/** \brief Processes the \ref SET_ADDRESS request (sets the device address for all future device + * accesses) + * + * If the value is between 1 and 127 and the device is in the default state, it will enter the address + * state. If it already is in the address state, it starts to use the newly-specified address. + * + * If the value is 0 and the device is in the address state, it will enter the default state. If it + * already is in the default state, nothing happens. + * + * Parameters: + * - VALUE: The device address (0-127) + * - INDEX: Always 0 + * - LENGTH: Always 0 + */ +void usbsrSetAddress(void) +{ + + // Sanity check + if (usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value) || (LO_UINT16(usbSetupHeader.value) & 0x80)) { + usbfwData.ep0Status = EP_STALL; + + // Update the device address + } else { + USBADDR = LO_UINT16(usbSetupHeader.value); + if (LO_UINT16(usbSetupHeader.value) != 0) { + if (usbfwData.usbState == DEV_DEFAULT) usbfwData.usbState = DEV_ADDRESS; + } else { + if (usbfwData.usbState == DEV_ADDRESS) usbfwData.usbState = DEV_DEFAULT; + } + } + +} // usbsrSetAddress + + + + +/** \brief Processes the \ref GET_DESCRIPTOR request (returns the specified USB descriptor) + * + * The \ref module_usb_descriptor_parser module is used to locate device, configuration and string + * descriptors. Note that configuration descriptors also include interface, endpoint and other + * "similar" descriptor types (e.g. HID descriptor), with the total descriptor length specified by + * the \ref USB_CONFIGURATION_DESCRIPTOR.wTotalLength field. + * + * Other descriptor types that are not returned with the configuration descriptor, must be defined in + * the usbDescriptorMarker.pUsbDescLut lookup-table. This table specifies the values of the VALUE and INDEX fields, and + * gives a pointer to the descriptor along with it's length. + * + * Parameters: + * - VALUE.MSB: Descriptor type + * - VALUE.LSB: Descriptor index + * - INDEX: 0, or language ID for string descriptors (currently not supported) + * - LENGTH: Descriptor length (either the requested number of bytes, or the length of the descriptor, + * whichever is the smallest) + * + * Data (IN): + * The descriptor(s) + */ +void usbsrGetDescriptor(void) +{ + uint8 n; + + // Which descriptor? + switch (HI_UINT16(usbSetupHeader.value)) { + + // Device descriptor + case DESC_TYPE_DEVICE: + usbSetupData.pBuffer = (uint8 __code*) usbdpGetDeviceDesc(); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX]; + break; + + // Configuration descriptor + case DESC_TYPE_CONFIG: + usbSetupData.pBuffer = (uint8 __code*) usbdpGetConfigurationDesc(0, LO_UINT16(usbSetupHeader.value)); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_CONFIG_LENGTH_LSB_IDX] + + usbSetupData.pBuffer[DESC_CONFIG_LENGTH_MSB_IDX] * 256; + break; + + // String descriptor + case DESC_TYPE_STRING: + // OPT: Implement language ID + usbSetupData.pBuffer = (uint8 __code*) usbdpGetStringDesc(LO_UINT16(usbSetupHeader.value)); + usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX]; + break; + + // Other descriptor type + default: + // Perform a table search (on index and value) + usbSetupData.pBuffer = NULL; + for (n = 0; n < ((uint16)usbDescriptorMarker.pUsbDescLutEnd - (uint16)usbDescriptorMarker.pUsbDescLut) / sizeof(DESC_LUT_INFO); n++) { + if ((usbDescriptorMarker.pUsbDescLut[n].valueMsb == HI_UINT16(usbSetupHeader.value)) + && (usbDescriptorMarker.pUsbDescLut[n].valueLsb == LO_UINT16(usbSetupHeader.value)) + && (usbDescriptorMarker.pUsbDescLut[n].indexMsb == HI_UINT16(usbSetupHeader.index)) + && (usbDescriptorMarker.pUsbDescLut[n].indexLsb == LO_UINT16(usbSetupHeader.index)) ) + { + usbSetupData.pBuffer = usbDescriptorMarker.pUsbDescLut[n].pDescStart; + usbSetupData.bytesLeft = usbDescriptorMarker.pUsbDescLut[n].length; + } + } + } + + // Stall EP0 if no descriptor was found + if (usbSetupData.pBuffer == NULL) usbfwData.ep0Status = EP_STALL; + + if (usbfwData.ep0Status != EP_STALL) { + + // Limit the returned descriptor size (the PC wants to know about sizes before + // polling the complete descriptors) + if (usbSetupData.bytesLeft > usbSetupHeader.length) { + usbSetupData.bytesLeft = usbSetupHeader.length; + } + + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetDescriptor + + + +/** \brief Internally used function that configures all endpoints for the specified interface + * + * The new endpoint setup overwrites the old, without any warning. Unused endpoints keep their current + * setup. The user is responsible for ensuring that no endpoint buffers overwrite each other, and that + * interfaces do not cause conflicts. The pUsbDblbufLutInfo table must contain an entry for each + * interface descriptor to define endpoint double-buffering. + * + * \param[in] *pInterface + * A pointer to the interface descriptor + */ +static void ConfigureEndpoints(USB_INTERFACE_DESCRIPTOR __code *pInterface) +{ + uint8 n; + uint16 maxpRegValue; + uint8 csRegValue; + uint8 endpoint; + USB_ENDPOINT_DESCRIPTOR __code *pEndpoint; + DBLBUF_LUT_INFO __code *pUsbDblbufLutInfo; + + // Locate the double buffer settings + if (pInterface->bNumEndpoints) { + pUsbDblbufLutInfo = (DBLBUF_LUT_INFO __code*) usbDescriptorMarker.pUsbDblbufLut; + while (pUsbDblbufLutInfo->pInterface != pInterface) { + pUsbDblbufLutInfo++; + } + } + + // For each endpoint in this interface + for (n = 0; n < pInterface->bNumEndpoints; n++) { + if (pEndpoint = usbdpFindNext(DESC_TYPE_ENDPOINT, 0)) { + + // Get the endpoint index + endpoint = pEndpoint->bEndpointAddress & 0x0F; + USBFW_SELECT_ENDPOINT(endpoint); + + csRegValue = 0x00; + maxpRegValue = (pEndpoint->wMaxPacketSize + 7) >> 3; + + // For IN endpoints... + if (pEndpoint->bEndpointAddress & 0x80) { + + // Clear data toggle, and flush twice (due to double buffering) + USBCSIL = USBCSIL_CLR_DATA_TOG | USBCSIL_FLUSH_PACKET; + USBCSIL = USBCSIL_FLUSH_PACKET; + + // USBCSIH + if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSIH_ISO; // ISO flag + if (pUsbDblbufLutInfo->inMask & (1 << endpoint)) csRegValue |= USBCSIH_IN_DBL_BUF; // Double buffering + USBCSIH = csRegValue; + + // Max transfer size + USBMAXI = maxpRegValue; + + // Endpoint status + usbfwData.pEpInStatus[endpoint - 1] = EP_IDLE; + + // For OUT endpoints... + } else { + + // Clear data toggle, and flush twice (due to double buffering) + USBCSOL = USBCSOL_CLR_DATA_TOG | USBCSOL_FLUSH_PACKET; + USBCSOL = USBCSOL_FLUSH_PACKET; + + // USBCSOH + if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSOH_ISO; // ISO flag + if (pUsbDblbufLutInfo->outMask & (1 << endpoint)) csRegValue |= USBCSOH_OUT_DBL_BUF; // Double buffering + USBCSOH = csRegValue; + + // Max transfer size + USBMAXO = maxpRegValue; + + // Endpoint status + usbfwData.pEpOutStatus[endpoint - 1] = EP_IDLE; + } + USBFW_SELECT_ENDPOINT(0); + } + } +} // ConfigureEndpoints + + + + +/** \brief Processes the \ref GET_CONFIGURATION request (returns the current device configuration value) + * + * If the returned value is 0, the device is not configured (not in the configured state) + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Always 0 + * - LENGTH: Always 1 + * + * Data (IN): + * The non-zero \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue of the currently selected + * configuration. + */ +void usbsrGetConfiguration(void) +{ + + // Sanity check + if (usbSetupHeader.value || usbSetupHeader.index || (usbSetupHeader.length != 1)) { + usbfwData.ep0Status = EP_STALL; + + // Return the current configuration + } else { + usbSetupData.pBuffer = &usbfwData.configurationValue; + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetConfiguration + + + + +/** \brief Processes the \ref SET_CONFIGURATION request (sets the device configuration) + * + * The configuration value must either be 0, in which case the device enters the address state, or it + * must match a configuration value from one of the USB configuration descriptors. If there is a match, + * the device enters the configured state. + * + * This request resets all interfaces to alternate setting 0, and uses the \c ConfigureEndpoints() + * function to automatically setup all endpoint registers. + * + * Parameters: + * - VALUE: The configuration value (0-255) + * - INDEX: Always 0 + * - LENGTH: Always 0 + */ +void usbsrSetConfiguration(void) +{ + uint8 n; + USB_CONFIGURATION_DESCRIPTOR __code *pConfiguration; + USB_INTERFACE_DESCRIPTOR __code *pInterface; + + // Sanity check + if ((usbfwData.usbState == DEV_DEFAULT) || usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value)) { + usbfwData.ep0Status = EP_STALL; + + // Default endpoint setup + } else { + usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGING, 0); + + // Configure relevant endpoints + if (LO_UINT16(usbSetupHeader.value)) { + + // Find the correct configuration descriptor... + pConfiguration = usbdpGetConfigurationDesc(LO_UINT16(usbSetupHeader.value), 0); + + // If it exists... + if (pConfiguration) { + usbfwData.usbState = DEV_CONFIGURED; + usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value); + + // For each interface... + for (n = 0; n < pConfiguration->bNumInterfaces; n++) { + usbfwData.pAlternateSetting[n] = 0x00; + + // Look only for alternate setting 0 + do { + pInterface = usbdpFindNext(DESC_TYPE_INTERFACE, 0); + } while (pInterface->bAlternateSetting != usbfwData.pAlternateSetting[n]); + + // Configure all endpoints in this interface + ConfigureEndpoints(pInterface); + } + + // If not, then stall the endpoint + } else { + usbfwData.ep0Status = EP_STALL; + } + + // Unconfigure endpoints + } else { + usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value); + usbfwData.usbState = DEV_ADDRESS; + usbfwSetAllEpStatus(EP_HALT); + } + usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGED, 0); + } + +} // usbsrSetConfiguration + + + + +/** \brief Processes the \ref GET_INTERFACE request (returns the selected alternate setting for the + * specified interface) + * + * Some USB devices have configurations with mutually exclusive interface settings. This request allows + * the host to determine the currently selected alternate setting. + * + * Parameters: + * - VALUE: Always 0 + * - INDEX: Interface number + * - LENGTH: Always 1 + * + * Data (IN): + * The alternate setting for the selected interface + */ +void usbsrGetInterface(void) +{ + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_IN_INTERFACE) || usbSetupHeader.value || (usbSetupHeader.length != 1)) { + usbfwData.ep0Status = EP_STALL; + + // Return the current alternate setting + } else { + usbSetupData.pBuffer = &usbfwData.pAlternateSetting[usbSetupHeader.index]; + usbSetupData.bytesLeft = 1; + usbfwData.ep0Status = EP_TX; + } + +} // usbsrGetInterface + + + + +/** \brief Processes the \ref SET_INTERFACE request (selects an alternate setting for the specified + * interface) + * + * Some USB devices have configurations with mutually exclusive interface settings. This request allows + * the host to select the desired alternate setting. + * + * This function uses the \c ConfigureEndpoints() to automatically setup the relevant endpoint + * registers. + * + * Parameters: + * - VALUE: Alternate setting + * - INDEX: Interface number + * - LENGTH: Always 0 + */ +void usbsrSetInterface(void) +{ + USB_INTERFACE_DESCRIPTOR __code *pInterface; + + // Sanity check + if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_OUT_INTERFACE) || usbSetupHeader.length) { + usbfwData.ep0Status = EP_STALL; + + // Verify that the desired alternate setting is available, and then make the switch + } else { + if (pInterface = usbdpGetInterfaceDesc(usbfwData.configurationValue, usbSetupHeader.index, usbSetupHeader.value)) { + usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGING, usbSetupHeader.index); + usbfwData.pAlternateSetting[usbSetupHeader.index] = usbSetupHeader.value; + + // Configure all endpoints in this interface + ConfigureEndpoints(pInterface); + usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGED, usbSetupHeader.index); + + // This interface does not exist + } else { + usbfwData.ep0Status = EP_STALL; + } + } + +} // usbsrSetInterface + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h new file mode 100644 index 0000000..8f70dd9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_standard_requests.h @@ -0,0 +1,201 @@ +/*********************************************************************************** + + Filename: usb_standard_request.h + + Description: Handle USB standard requests. + +***********************************************************************************/ + +#ifndef USBSTANDARDREQUESTS_H +#define USBSTANDARDREQUESTS_H +/** \addtogroup module_usb_standard_requests USB Standard Requests (usbsr) + * \brief This module contains automated functions for processing USB standard requests + * + * The processing functions are based on the \ref module_usb_framework, and access to the user-provided + * USB descriptors through the \ref module_usb_descriptor_parser. All device classes and descriptor + * combinations are supported, with no need to write or modify any source code. However, as described + * below, some standard request must be fully or partially implemented by the user. + * + * \section section_usbsr_hooks Hooks + * Standard requests that are not supported by the USB library or that refer to non-standard features, + * are forwarded to the application via function hooks. This includes: + * \li All \ref SET_DESCRIPTOR requests (see \ref usbsrHookSetDescriptor()) + * \li All \ref SYNCH_FRAME requests (see \ref usbsrHookSynchFrame()) + * \li \ref CLEAR_FEATURE requests that refer to unknown features (see \ref usbsrHookClearFeature()) + * \li \ref SET_FEATURE requests that refer to unknown features (see \ref usbsrHookSetFeature()) + * + * These hooks must always be provided, however if the application does not either support the requests, + * it should just stall endpoint 0. The processing uses the same mechanisms as for class and vendor + * requests (refer to the \ref module_usb_framework module for detailed description and examples). + * + * When the \ref GET_STATUS request is received, the \ref usbsrHookModifyGetStatus() hook is always + * called, so that additional status bits may be added. + * + * To have any practical purpose, "OUT data phase" standard requests need to notify the application of + * certain events. This is done by passing the event via yet another function hook, + * \ref usbsrHookProcessEvent(uint8 event, uint8 index). For events related to interfaces and endpoints, + * the \c index parameter refers to an interface number or the least significant nibble of the endpoint + * address. The following events can be generated: + * \li \ref USBSR_EVENT_CONFIGURATION_CHANGING (the device configuration is about to change) + * \li \ref USBSR_EVENT_CONFIGURATION_CHANGED (the device configuration has changed) + * \li \ref USBSR_EVENT_INTERFACE_CHANGING (the alternate setting of the given interface is about to + * change) + * \li \ref USBSR_EVENT_INTERFACE_CHANGED (the alternate setting of the given interface has changed) + * \li \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED (remote wakeup has been enabled by the host) + * \li \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED (remote wakeup has been disabled by the host) + * \li \ref USBSR_EVENT_EPIN_STALL_CLEARED (the given IN endpoint's stall condition has been cleared the + * host) + * \li \ref USBSR_EVENT_EPIN_STALL_SET (the given IN endpoint has been stalled by the host) + * \li \ref USBSR_EVENT_EPOUT_STALL_CLEARED (the given OUT endpoint's stall condition has been cleared + * the host) + * \li \ref USBSR_EVENT_EPOUT_STALL_SET (the given OUT endpoint has been stalled by the PC) + * @{ + */ + + +//------------------------------------------------------------------------------------------------------- +/// \name Standard Request Codes +//@{ + +/// Standard request that returns status for the specified recipient +#define GET_STATUS 0x00 +/// Standard request that clears or disables a specific feature +#define CLEAR_FEATURE 0x01 +/// Standard request that sets or enables a specific feature +#define SET_FEATURE 0x03 +/// Standard request that sets the device address for all future device accesses +#define SET_ADDRESS 0x05 +/// Standard request that returns the specified USB descriptor +#define GET_DESCRIPTOR 0x06 +/// Standard request that may be used to update exitsting descriptors or new descriptors may be added +#define SET_DESCRIPTOR 0x07 +/// Standard request that returns the current device configuration value +#define GET_CONFIGURATION 0x08 +/// Standard request that sets the device configuration +#define SET_CONFIGURATION 0x09 +/// Standard request that returns the selected alternate setting for the specified interface +#define GET_INTERFACE 0x0A +/// Standard request that selects an alternate setting for the specified interface +#define SET_INTERFACE 0x0B +/// Standard request that is used to set and then report an endpoint's synchronization frame +#define SYNCH_FRAME 0x0C +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Features Indexes +//@{ + +/// Endpoint feature: Halt +#define ENDPOINT_HALT 0x00 +/// Device feature: Remote wakeup +#define DEVICE_REMOTE_WAKEUP 0x01 +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Event Types +//@{ + +/// The device configuration is about to change +#define USBSR_EVENT_CONFIGURATION_CHANGING 0x01 +/// The device configuration has changed +#define USBSR_EVENT_CONFIGURATION_CHANGED 0x02 +/// The alternate setting of the given interface about to change (index = "interface index") +#define USBSR_EVENT_INTERFACE_CHANGING 0x03 +/// The alternate setting of the given interface has changed (index = "interface index") +#define USBSR_EVENT_INTERFACE_CHANGED 0x04 +/// Remote wakeup has been enabled by the host +#define USBSR_EVENT_REMOTE_WAKEUP_ENABLED 0x05 +/// Remote wakeup has been disabled by the host +#define USBSR_EVENT_REMOTE_WAKEUP_DISABLED 0x06 +/// The given IN endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPIN_STALL_CLEARED 0x07 /* Endpoint index */ +/// The given IN endpoint has been stalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPIN_STALL_SET 0x08 /* Endpoint index */ +/// The given OUT endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPOUT_STALL_CLEARED 0x09 /* Endpoint index */ +/// The given OUT endpoint has been stalled by the PC (index = "endpoint address" & 0x0F) +#define USBSR_EVENT_EPOUT_STALL_SET 0x0A /* Endpoint index */ +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Standard Request Hooks +//@{ +/// Refer to the \ref section_setup_handler_usage section for a description on how to process standard +/// requests. + +/// Hook which is called upon reception of a \ref SET_DESCRIPTOR request +void usbsrHookSetDescriptor(void); +/// Hook which is called upon reception of a \ref SYNCH_FRAME request (unsupported). +void usbsrHookSynchFrame(void); +/// Hook which is called when a \ref CLEAR_FEATURE request refers to a an unsupported featureted. +void usbsrHookClearFeature(void); +/// Hook which is called when a \ref SET_FEATURE request refers to a an unsupported feature. +void usbsrHookSetFeature(void); +/// Hook for modifying a \ref GET_STATUS request before the status value is returned to the PC. +void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus); +/// Hook which is called upon a standard request generated event (unsupported). +void usbsrHookProcessEvent(uint8 event, uint8 index); +//@} +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +/// \name Handled Standard Requests +//@{ +void usbsrGetStatus(void); +void usbsrClearFeature(void); +void usbsrSetFeature(void); +void usbsrSetAddress(void); +void usbsrGetDescriptor(void); +void usbsrGetConfiguration(void); +void usbsrSetConfiguration(void); +void usbsrGetInterface(void); +void usbsrSetInterface(void); +//@} +//------------------------------------------------------------------------------------------------------- + + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_suspend.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_suspend.h new file mode 100644 index 0000000..8956b60 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2540USB/usb/library/usb_suspend.h @@ -0,0 +1,143 @@ +/*********************************************************************************** + + Filename: usb_suspend.h + + Description: Handle the USB suspend state. + +***********************************************************************************/ + +#ifndef USBSUSPEND_H +#define USBSUSPEND_H +/** \addtogroup module_usb_suspend USB Suspend (usbsusp) + * \brief This module contains the functionality for USB suspend, USB resume and USB remote wakeup. + * + * All USB devices must support the suspended state to fully comply with the USB specification. Special + * care must be taken to implement this functionality correctly, so follow the instructions below + * carefully. Refer to the USB specification for detailed information on current consumption in suspend + * mode (how power consumption shall be measured, averaging, peak value etc.). + * + * \section usb_suspend_resume USB Suspend and Resume + * If there is no activity on the USB bus for a period longer than 3 ms, the MCU will generate a + * \ref USBIRQ_EVENT_SUSPEND event. The USB device must then enter suspend mode within 10 ms, where it + * draws no more than: + * \li 500 uA for low-power devices or high-power devices operating at lower-power + * \li 2.5 mA for high-power devices with remote wake-up enabled + * + * The library supports the USB suspend and resume functionality through a simple interface: + * \li Make sure that the 48 MHz XOSC is never turned off anywhere in the application. + * \li In the call to \ref usbirqInit(), add \ref USBIRQ_EVENT_SUSPEND and \ref USBIRQ_EVENT_RESUME + * (optional) to the interrupt mask. + * \li Do NOT process \ref USBIRQ_EVENT_SUSPEND in \ref usbirqHookProcessEvents() or in any other + * interrupt service routine. This may (or in most cases will) prevent the USB device from getting + * out of suspend mode. + * + * \li In the main loop, add the code shown below. Make sure that this code is visited at least every + * 10 ms. If the worst-case path through the main loop uses more than 10 ms, the code block can be + * inserted in multiple places in the loop until the requirement is met. + * \code + * // Process USB suspend events + * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) { + * + * // Clear the suspend event + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND); + * + * ... Do what needs to be done before entering power mode 1 here (e.g. turn off the radio, configure + * I/O to minimize power consumption, start the sleep timer etc.) ... + * + * // This function call will take the USB device into power mode 1. It will not return until resume + * // signaling has been detected on the bus, or the remote wake-up function has been used. Other + * // interrupts (for instance from I/O ports or the sleep timer) can be used during this period. When + * // returning from these interrupts, the \ref usbsuspEnter() function (running here) will put the + * // MCU back into power mode 1. + * usbsuspEnter(); + * + * // At this point the event handler is up and running again. Clear the resume event. + * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME); + * + * ... If a USBIRQ_EVENT_RESET event will affect the code that follows (before the event is processed + * elsewhere), then make sure to handle it here also ... + * + * ... Do what needs to be done to wake up from suspend mode (e.g. turn on the radio, reactivate I/O + * and peripherals, turn off the sleep timer ... + * } + * \endcode + * + * \li All interrupts that run during suspension mode must start with the following code: + * \code + * while (!XOSC_STABLE); + * \endcode + * + * \section usb_remote_wakeup USB Remote Wakeup: + * Remote wakeup should be used when the USB device desires to initiate the resume process and wake up + * the host. In a radio application this may happen when a particular radio packet is received, for + * instance from a wireless keyboard or mouse. + * + * USB remote wakeup can only be performed if the host has given the device the privilege to do so. The + * privilege to perform remote wakeup is requested by setting bit 5 in the \c bmAttributes field in + * the \ref USB_CONFIGURATION_DESCRIPTOR. The host will then grant or recall the privilege through a + * SET_FEATURE request, which is communicated through a \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED or + * \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED event, respectively. + * + * The USB library handles the remote wakeup sequence automatically. Do the following to incorporate it + * into the application: + * \li Implement suspend and resume as described above. + * \li In the USB descriptor, set bit 5 in bmAttributes in the configuration descriptor. + * \li While the USB MCU is in USB suspend mode, remote wakeup can be performed from interrupt context + * (e.g. the sleep timer interrupt) by calling \ref usbsuspDoRemoteWakeup(). This function will + * return TRUE if successful or FALSE if remote wakeup is not permitted (by the host). + * @{ + */ +#include "usb_firmware_library_headers.h" + +typedef void (*VFPTR)(void); + +//------------------------------------------------------------------------------------------------------- +// Suspend enter/exit hooks +extern __xdata VFPTR pFnSuspendEnterHook; +extern __xdata VFPTR pFnSuspendExitHook; + +//------------------------------------------------------------------------------------------------------- +// Function prototypes +void usbsuspEnter(void); +uint8 usbsuspDoRemoteWakeup(void); +void usbsuspStopPm1(void); +//------------------------------------------------------------------------------------------------------- + +//@} + +/* ++------------------------------------------------------------------------------ +| Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. +| +| IMPORTANT: Your use of this Software is limited to those specific rights +| granted under the terms of a software license agreement between the user who +| downloaded the software, his/her employer (which must be your employer) and +| Texas Instruments Incorporated (the "License"). You may not use this Software +| unless you agree to abide by the terms of the License. The License limits +| your use, and you acknowledge, that the Software may not be modified, copied +| or distributed unless embedded on a Texas Instruments microcontroller or used +| solely and exclusively in conjunction with a Texas Instruments radio +| frequency transceiver, which is integrated into your product. Other than for +| the foregoing purpose, you may not use, reproduce, copy, prepare derivative +| works of, modify, distribute, perform, display or sell this Software and/or +| its documentation for any purpose. +| +| YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +| PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +| INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +| NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +| TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +| NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +| LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING +| BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR +| CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF +| SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +| (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +| +| Should you have any questions regarding your right to use this Software, +| contact Texas Instruments Incorporated at www.TI.com. +| ++------------------------------------------------------------------------------ +*/ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-Banked.r51 b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-Banked.r51 new file mode 100644 index 0000000..1d9ea5b Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-Banked.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-NEAR.r51 b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-NEAR.r51 new file mode 100644 index 0000000..47fb9cf Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_LIB_3G3A-NEAR.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_Lib.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_Lib.h new file mode 100644 index 0000000..2a37014 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/AIR_MOTION_Lib.h @@ -0,0 +1,269 @@ +//----------------------------------------------------------------------------- +// +// (c) Copyright 2011 Movea, S.A., published work. +// This computer program includes Confidential, Proprietary Information +// and is a trade secret of Movea. All use, disclosure, and/or +// reproduction is prohibited unless authorized in writing by an officer +// of Movea. All Rights Reserved. +// +//----------------------------------------------------------------------------- + + +/** + * @mainpage AIR MOTION LIBRARY + * @author MOVEA SA + * @image html logo.png + * @image rtf logo.png + * @version V_03.01.03 + * + * @section Introduction + * The AIR MOTION Library is a highly programmable API for managing mouse cursor motion from 2, or 3, axes gyroscope and optional 3 axes accelerometer. + * Embedded Movea proprietary algorithms are responsible for converting motion sensors data into delta X and delta Y pointer movements. + * The library is intended to be used in free space pointing devices to operate in-air point and click navigation, just like a classic 2D mouse will do on a desk. + * In addition to its pointing feature, AIR MOTION Library is also capable of swipe motion recognition: 'Up', 'Down', 'Left' and 'Right' swipes are currently supported. + * + * @section AIR MOTION Library sensors referential + * @li When the device lies flat on its back, accelerometer must see +1G on Z axis + * @li When the device lies on its right side, accelerometer must see +1G on Y axis + * @li When the device is held vertically pointing down, accelerometer must see +1G on X axis + * @li A clockwise rotation around the gyroscope X axis generates positive values + * @li A clockwise rotation around the gyroscope Y axis generates positive values i.e. negative delta Y on screen (cursor moves to the top) + * @li A clockwise rotation around the gyroscope Z axis generates positive values i.e. positive delta X on screen (cursor moves to the right) + * + * @image html axis.png + * @image rtf axis.png + * + * @section API + * The AIR MOTION Library uses the following functions : + * @li AIR_MOTION_Init() : This function must be called for library initialization, each time processing (re)starts + * @li AIR_MOTION_ProcessDelta() : This function must be called each time new sensors values are available. The library is designed to run at 100Hz. + * + * @section Calibration + * Gyroscope offsets values can fluctuate over time depending on various parameters. + * The library supports a continuous calibration which computes gyroscope offsets values in real time. + * + * Each time the AIR_MOTION_ProcessDelta() is called, gyroscope instant staticness is checked, based on "GyroStaticMaxNoise" parameter. + * If the device is considered static for "StaticSamples" consecutives samples, new gyroscope offsets values are computed. The remote can then be considered as calibrated. + * You can check "IsStatic" and "NewGyroOffset" parameters to track calibration status over time. + * + * "Gyrosensitivity" parameter is used to calibrate motion algorithms. + * To determine its value, use the following formula: + * @li Gyrosensitivity = ( 2 ^ ( number_of_bits_gyro - 1) * 16 ) / max_scale_gyro + * + * Typical gyroscopes max scale are 400 deg/s or 2000 deg/s. + * + * @section RollCompensation + * The AIR MOTION Library embeds a roll-compensation algorithm along with its pointing feature. + * Roll-compensation allows user's movement to be reliably reproduced on the screen, independently from the device roll rotation. + * To turn on or off this feature, set "IsRollCompEnabled" parameter accordingly (feature only available for 2G3A and 3A3G configurations). + * + * The field "Acc1gLsb" is only used when roll-compensation feature is enabled. + * To determine its value, use the following formula: + * @li Acc1gLsb = 2 ^ ( number_of_bits_acc - 1) / max_scale_acc + * + * Typical accelerometers max scale are 2G or 8G. + * + * @section EasyClick + * This feature allows user to perform more accurate and stable mouse clicks for a better experience. + * On click press, the library will freeze the pointer (dX and dY null) for maximum "ClickStillSamples" samples to avoid undesired movement. + * During this period, if the device movement quantity is too important (see "ClickStillTolerance"), the pointer will be released sooner. + * + * @section Ride STM8 project + * @li WARNING : You must define project properties "Type for small enum variables" to "char". Otherwise the library will not work correctly. + */ + + +/** +********************************************************************************* +* @file AIR_MOTION_Lib.h +* Header file for MOVEA AIR MOTION Library +********************************************************************************* +*/ + + +#ifndef __AIR_MOTION_LIB_H +#define __AIR_MOTION_LIB_H + + +/* Includes ------------------------------------------------------------------*/ + +// Standard integer +#include "stdint.h" + +// Standard bool +#include "stdbool.h" + + +/* Public define -------------------------------------------------------------*/ + + +/* Public typedef ------------------------------------------------------------*/ + +/** + * Holds status bits reporting the last detected gesture if any + */ +typedef struct +{ + uint8_t Left :1; //!< Asserted if a left swipe has been detected + uint8_t Right :1; //!< Asserted if a right swipe has been detected + uint8_t Up :1; //!< Asserted if a up swipe has been detected + uint8_t Down :1; //!< Asserted if a down swipe has been detected +} t_struct_AIR_MOTION_Swipes; + + +/** + * Holds sensor 3 axes values + * May hold the sensor data itself or may be used to specify sensor axes attribute (deadband, offset...) + */ +typedef struct +{ + int16_t X; //!< Data pertaining to the X axis + int16_t Y; //!< Data pertaining to the Y axis + int16_t Z; //!< Data pertaining to the Z axis +} t_struct_AIR_MOTION_SensorAxis; + + +/** +* Holds computed delta values +* May hold the delta data itself or may be used to specify delta gain values +*/ +typedef struct +{ + int8_t X; //!< Delta data relative to the X axis + int8_t Y; //!< Delta data relative to the Y axis +} t_struct_AIR_MOTION_Delta; + +/** +* Holds a feature sensitivity level +*/ +typedef enum +{ + AirMotionLow, + AirMotionNormal, + AirMotionHigh +} t_enum_AIR_MOTION_Level; + + +/** +* Holds input parameters to pass to the AIR_MOTION_Init() function +*/ +typedef struct +{ + t_struct_AIR_MOTION_Delta DeltaGain; //!< Delta gain values for X and Y axes + t_struct_AIR_MOTION_SensorAxis GyroOffsets; //!< Initial gyroscope offset values + uint8_t GyroStaticMaxNoise; //!< Gyroscope maximum value per axis for device to be considered currently static + uint16_t StaticSamples; //!< Number of consecutive "static" samples for device to be considered fully static + uint16_t SwipeMinDist; //!< Minimum distance, as deltas sum, for a swipe to be detected ('0' means no processing) + uint16_t SwipeMaxNoise; //!< Maximum noise level, as deltas sum, for a swipe to be rejected + uint8_t StartupSamples; //!< Number of samples to discard before starting computation + uint8_t ClickStillSamples; //!< Maximum number of null pointing samples after a click press + t_enum_AIR_MOTION_Level ClickStillTolerance; //!< Stillness tolerance level, as maximum movement quantity for pointing samples to be forced null after a click press + bool IsRollCompEnabled; //!< Activate roll-compensation feature + uint16_t Acc1gLsb; //!< Norm value read from accelerometer when device is static (Earth's gravitational acceleration) + uint16_t GyroSensitivity; //!< Gyroscope sensitivity as '16*LSB / °/s' +} t_struct_AIR_MOTION_Init; + + +/** +* Holds input parameters to pass to the AIR_MOTION_ProcessDelta() function +*/ +typedef struct +{ + t_struct_AIR_MOTION_SensorAxis GyroSamples; //!< Gyroscope samples + t_struct_AIR_MOTION_SensorAxis AccSamples; //!< Accelerometer samples + uint8_t ClickSample; //!< Click buttons state sample +} t_struct_AIR_MOTION_ProcessDeltaSamples; + + +/** +* Holds status bits of the last sample processing +*/ +typedef struct +{ + uint8_t IsDeltaComputed :1; //!< True if delta have been computed + uint8_t IsStatic :1; //!< True if device is considered currently static + uint8_t NewGyroOffset :1; //!< True if new gyroscope offsets have been computed +} t_struct_AIR_MOTION_Status; + + +/** +* Holds output parameters of the AIR_MOTION_ProcessDelta() function +*/ +typedef struct +{ + t_struct_AIR_MOTION_Status Status; //!< Status bits of the last sample processing + t_struct_AIR_MOTION_SensorAxis GyroOffsets; //!< Gyroscope offset values + t_struct_AIR_MOTION_Delta Delta; //!< Computed delta values + t_struct_AIR_MOTION_Swipes SwipesDetected; //!< Bitfield of detected swipes +} t_struct_AIR_MOTION_ProcessDeltaStatus; + + +/* Public variable -----------------------------------------------------------*/ + +/* Public function prototype -------------------------------------------------*/ + + +/** +* This function initializes the library with user parameters. +* Below is a configuration example, with gyroscope data read on 16 bits with full scale fixed to +/- 2000 deg/s. +* Accelerometers data are read on 12 bits with full scale fixed to +/- 8G. +* @code +* t_struct_AIR_MOTION_Init lInitParameters; +* +* // Fill structure fields +* // If gyroscope is 2 axes, only Y and Z axes values are taken into account in motion processing algorithm +* lInitParameters.DeltaGain.X = 14; +* lInitParameters.DeltaGain.Y = 14; +* lInitParameters.GyroOffsets.X = 0; +* lInitParameters.GyroOffsets.Y = 0; +* lInitParameters.GyroOffsets.Z = 0; +* lInitParameters.GyroStaticMaxNoise = 16; +* lInitParameters.StaticSamples = 400; +* lInitParameters.SwipeMinDist = 75; +* lInitParameters.SwipeMaxNoise = 96; +* lInitParameters.StartupSamples = 16; +* lInitParameters.ClickStillSamples = 40; +* lInitParameters.ClickStillTolerance = AirMotionNormal; +* lInitParameters.IsRollCompEnabled = true; +* lInitParameters.Acc1gLsb = 256; +* lInitParameters.GyroSensitivity = 262; +* +* // Call the init function +* AIR_MOTION_Init(&lInitParameters); +* @endcode +* @param [in] pInitParameters : Address of the init parameters structure to use +* @return None +*/ +void AIR_MOTION_Init(const t_struct_AIR_MOTION_Init *pInitParameters); + + +/** +* This function processes delta and motion recognition. +* This function must be called at 100Hz. +* When a swipe is detected, the library stops the swipe detection +* @code +* t_struct_AIR_MOTION_ProcessDeltaSamples lSensorSamples; +* t_struct_AIR_MOTION_ProcessDeltaStatus lProcessDeltaStatus; +* +* // Get gyroscope samples +* GYRO_GetSample(&lSensorSamples.GyroSamples); +* +* // Get accelerometer samples +* ACC_GetSample(&lSensorSamples.AccSamples); +* +* // Get click state sample ('0' iff click button(s) released) +* CLICK_GetSample(&lSensorSamples.ClickSample); +* +* // Call the process delta function +* lProcessDeltaStatus = AIR_MOTION_ProcessDelta(lSensorSamples); +* +* // For example, send delta on radio +* RADIO_SendDelta(lProcessDeltaStatus.Delta); +* @endcode +* @param [in] lSensorSamples : Sensors samples structure +* @return See t_struct_AIR_MOTION_ProcessDeltaStatus for documentation +*/ +t_struct_AIR_MOTION_ProcessDeltaStatus AIR_MOTION_ProcessDelta(t_struct_AIR_MOTION_ProcessDeltaSamples lSensorSamples); + + +#endif // __AIR_MOTION_LIB_H diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.c new file mode 100644 index 0000000..442909f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.c @@ -0,0 +1,439 @@ +/************************************************************************************************** + Filename: hal_accel.c + Revised: $Date: 2012-10-31 15:44:56 -0700 (Wed, 31 Oct 2012) $ + Revision: $Revision: 32001 $ + + Description: + + This file contains the declaration to the HAL Accelerometer abstraction layer + for the Kionix KXTF9 Accelerometer. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" +#include "hal_accel.h" +#include "hal_board_cfg.h" +#include "hal_drivers.h" +#include "hal_motion.h" +#include "osal.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* KXTF9 register addresses */ +#define ACC_REG_ADDR_XOUT_HPF_L 0x00 +#define ACC_REG_ADDR_XOUT_HPF_H 0x01 +#define ACC_REG_ADDR_YOUT_HPF_L 0x02 +#define ACC_REG_ADDR_YOUT_HPF_H 0x03 +#define ACC_REG_ADDR_ZOUT_HPF_L 0x04 +#define ACC_REG_ADDR_ZOUT_HPF_H 0x05 +#define ACC_REG_ADDR_XOUT_L 0x06 +#define ACC_REG_ADDR_XOUT_H 0x07 +#define ACC_REG_ADDR_YOUT_L 0x08 +#define ACC_REG_ADDR_YOUT_H 0x09 +#define ACC_REG_ADDR_ZOUT_L 0x0A +#define ACC_REG_ADDR_ZOUT_H 0x0B +#define ACC_REG_ADDR_DCST_RESP 0x0C +#define ACC_REG_ADDR_WHO_AM_I 0x0F +#define ACC_REG_ADDR_TILT_POS_CUR 0x10 +#define ACC_REG_ADDR_TILT_POS_PRE 0x11 +#define ACC_REG_ADDR_INT_SRC_REG1 0x15 +#define ACC_REG_ADDR_INT_SRC_REG2 0x16 +#define ACC_REG_ADDR_STATUS_REG 0x18 +#define ACC_REG_ADDR_INT_REL 0x1A +#define ACC_REG_ADDR_CTRL_REG1 0x1B +#define ACC_REG_ADDR_CTRL_REG2 0x1C +#define ACC_REG_ADDR_CTRL_REG3 0x1D +#define ACC_REG_ADDR_INT_CTRL_REG1 0x1E +#define ACC_REG_ADDR_INT_CTRL_REG2 0x1F +#define ACC_REG_ADDR_INT_CTRL_REG3 0x20 +#define ACC_REG_ADDR_DATA_CTRL_REG 0x21 +#define ACC_REG_ADDR_TILT_TIMER 0x28 +#define ACC_REG_ADDR_WUF_TIMER 0x29 +#define ACC_REG_ADDR_TDT_TIMER 0x2B +#define ACC_REG_ADDR_TDT_H_THRESH 0x2C +#define ACC_REG_ADDR_TDT_L_THRESH 0x2D +#define ACC_REG_ADDR_TAP_TIMER 0x2E +#define ACC_REG_ADDR_TDT_TOTAL_TIMER 0x2F +#define ACC_REG_ADDR_TDT_LATENCY_TIMER 0x30 +#define ACC_REG_ADDR_TDT_WINDOW_TIMER 0x31 +#define ACC_REG_ADDR_SELF_TEST 0x3A +#define ACC_REG_ADDR_WUF_THRESH 0x5A +#define ACC_REG_ADDR_TILT_ANGLE 0x5C +#define ACC_REG_ADDR_HYST_SET 0x5F + +/* KXTF9 register field values */ +#define CTRL_REG1_PC1_OPERATING_MODE 0x80 +#define CTRL_REG1_PC1_STANDBY_MODE 0x00 +#define CTRL_REG1_RES_12BIT 0x40 +#define CTRL_REG1_RES_8BIT 0x00 +#define CTRL_REG1_DRDYE_INT_ENABLED 0x20 +#define CTRL_REG1_DRDYE_INT_DISABLED 0x00 +#define CTRL_REG1_GSEL_8G 0x10 +#define CTRL_REG1_GSEL_4G 0x08 +#define CTRL_REG1_GSEL_2G 0x00 +#define CTRL_REG1_TDTE_ENABLED 0x04 +#define CTRL_REG1_TDTE_DISABLED 0x00 +#define CTRL_REG1_WUFE_ENABLED 0x02 +#define CTRL_REG1_WUFE_DISABLED 0x00 +#define CTRL_REG1_TPE_ENABLED 0x01 +#define CTRL_REG1_TPE_DISABLED 0x00 + +#define CTRL_REG3_OWUF_ODR_100HZ 0x02 + +#define INT_CTRL_REG1_INT_ENABLED 0x20 +#define INT_CTRL_REG1_POLARITY_HIGH 0x10 + +#define INT_CTRL_REG2_X_AXIS_ENABLED 0x80 +#define INT_CTRL_REG2_Y_AXIS_ENABLED 0x40 +#define INT_CTRL_REG2_Z_AXIS_ENABLED 0x20 + +#define DATA_CTRL_REG_LPF_ODR_50HZ 0x02 +#define DATA_CTRL_REG_LPF_ODR_100HZ 0x03 +#define DATA_CTRL_REG_LPF_ODR_200HZ 0x04 +#define DATA_CTRL_REG_LPF_ODR_400HZ 0x05 +#define DATA_CTRL_REG_LPF_ODR_800HZ 0x06 + +/* The following define which port pins are being used by the accelerometer */ +#define HAL_ACCEL_P1_GPIO_PINS ( BV(2) ) + +/* These defines indicate the direction of each pin */ +#define HAL_ACCEL_P1_INPUT_PINS ( BV(2) ) + +/* Which pins are used for key interrupts */ +#define HAL_ACCEL_P1_INTERRUPT_PINS ( BV(2) ) + +/* Defines for each output pin assignment */ +#define HAL_ACCEL_POWER_PIN_BV ( BV(6) ) +#define HAL_ACCEL_POWER_PIN P1_6 +#define HAL_ACCEL_POWER_PxDIR P1DIR +#define HAL_ACCEL_POWER_PxSEL P1SEL + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef struct +{ + uint8 addr; + uint8 data; +} halAccelConfig_t; + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ +static halAccelConfig_t HalAccelEnableConfigTable[] = +{ + { ACC_REG_ADDR_CTRL_REG1, 0 }, // must first set PC1 to 0 before changing configuration + { ACC_REG_ADDR_CTRL_REG2, 0 }, + { ACC_REG_ADDR_CTRL_REG3, 0 }, + { ACC_REG_ADDR_INT_CTRL_REG1, INT_CTRL_REG1_POLARITY_HIGH }, + { ACC_REG_ADDR_INT_CTRL_REG2, 0 }, + { ACC_REG_ADDR_INT_CTRL_REG3, 0 }, + { ACC_REG_ADDR_DATA_CTRL_REG, DATA_CTRL_REG_LPF_ODR_200HZ }, + { ACC_REG_ADDR_CTRL_REG1, CTRL_REG1_PC1_OPERATING_MODE | CTRL_REG1_GSEL_2G} +}; +#define HAL_ACCEL_ENABLE_CONFIG_TABLE_SIZE (sizeof(HalAccelEnableConfigTable) / sizeof(HalAccelEnableConfigTable[0])) + +static halAccelConfig_t HalAccelMotionDetectConfigTable[] = +{ + { ACC_REG_ADDR_CTRL_REG1, 0 }, // must first set PC1 to 0 before changing configuration + { ACC_REG_ADDR_CTRL_REG3, CTRL_REG3_OWUF_ODR_100HZ }, + { ACC_REG_ADDR_INT_CTRL_REG1, INT_CTRL_REG1_INT_ENABLED | INT_CTRL_REG1_POLARITY_HIGH }, + { ACC_REG_ADDR_INT_CTRL_REG2, INT_CTRL_REG2_X_AXIS_ENABLED | INT_CTRL_REG2_Y_AXIS_ENABLED | INT_CTRL_REG2_Z_AXIS_ENABLED }, + { ACC_REG_ADDR_INT_CTRL_REG3, 0 }, + { ACC_REG_ADDR_DATA_CTRL_REG, DATA_CTRL_REG_LPF_ODR_200HZ }, + { ACC_REG_ADDR_WUF_TIMER, 25 }, // since ODR is 100 Hz, this will be 250ms + { ACC_REG_ADDR_WUF_THRESH, 0x08 }, // this is factory setting of 0.5g, but is here in case we want to change it + { ACC_REG_ADDR_CTRL_REG1, CTRL_REG1_PC1_OPERATING_MODE | CTRL_REG1_WUFE_ENABLED | CTRL_REG1_GSEL_2G } +}; +#define HAL_ACCEL_MOTION_DETECT_CONFIG_TABLE_SIZE (sizeof(HalAccelMotionDetectConfigTable) / sizeof(HalAccelMotionDetectConfigTable[0])) + +static halAccelConfig_t HalAccelLowPowerConfigTable[] = +{ + { ACC_REG_ADDR_CTRL_REG1, 0 } // should put part in standby mode +}; +#define HAL_ACCEL_LOW_POWER_CONFIG_TABLE_SIZE (sizeof(HalAccelLowPowerConfigTable) / sizeof(HalAccelLowPowerConfigTable[0])) + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ +static void halAccelProcessMotionDetectInterrupt( void ); + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ +static halAccelCBack_t pHalAccelProcessFunction; + +/************************************************************************************************** + * @fn halProcessMotionDetectInterrupt + * + * @brief Processes motion detection interrupt by informing the entity that + * enabled motion detection that it has occurred. Also disables further + * motion detection interrupts. + * + * @param + * + * @return + **************************************************************************************************/ +static void halAccelProcessMotionDetectInterrupt( void ) +{ + /* Disable port interrupt */ + P1IEN &= (uint8) ~HAL_ACCEL_P1_INTERRUPT_PINS; + + /* Disable P1 interrupts */ + IEN2 &= ~(BV( 4 )); + + /* Set event to process motion detection not in interrupt context */ + osal_set_event( Hal_TaskID, HAL_MOTION_DETECTED_EVENT ); +} + +/************************************************************************************************** + * @fn halAccelProcessMotionDetectEvent + * + * @brief Post interrupt motion detection event processing. + * + * @param + * + * @return + **************************************************************************************************/ +void halAccelProcessMotionDetectEvent( void ) +{ + /* Inform application that motion was detected */ + if (pHalAccelProcessFunction != NULL) + { + pHalAccelProcessFunction(); + } +} + +/************************************************************************************************** + * @fn HalAccelInit + * + * @brief This function initializes the HAL Accelerometer abstraction layer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelInit( void ) +{ + /* Configure POWER PIN as output */ + HAL_ACCEL_POWER_PxDIR |= HAL_ACCEL_POWER_PIN_BV; + + /* Set POWER output high */ + HAL_ACCEL_POWER_PIN = 1; + + /* Configure pin function as GPIO for pins related to accelerometer */ + HAL_ACCEL_POWER_PxSEL &= ~HAL_ACCEL_POWER_PIN_BV; + P1SEL &= (uint8) ~HAL_ACCEL_P1_GPIO_PINS; + + /* Configure direction of pins related to accelerometer */ + P1DIR &= (uint8) ~HAL_ACCEL_P1_INPUT_PINS; + + /* Configure port 1 inputs (i.e. accelerometer interrupt pin) as pulldown + * to save current. + */ + P2INP |= 0x40; + + /* Indicate no callback has been registered */ + pHalAccelProcessFunction = NULL; +} + +/************************************************************************************************** + * @fn HalAccelEnable + * + * @brief This function configures the accelerometer for operation. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelEnable( void ) +{ + uint8 i, dummy; + + /* Ensure accelerometer is in standby mode */ + HalMotionI2cWrite( HAL_MOTION_DEVICE_ACCELEROMETER, + ACC_REG_ADDR_CTRL_REG1, + &HalAccelEnableConfigTable[0].data, + 1 ); + + /* Read INT_REL register to clear any prior accelerometer interrupts */ + HalMotionI2cRead( HAL_MOTION_DEVICE_ACCELEROMETER, + ACC_REG_ADDR_INT_REL, + 1, + &dummy ); + + /* Configure accelerometer for measurement mode */ + for (i = 0; i < HAL_ACCEL_ENABLE_CONFIG_TABLE_SIZE; i++) + { + HalMotionI2cWrite( HAL_MOTION_DEVICE_ACCELEROMETER, + HalAccelEnableConfigTable[i].addr, + &HalAccelEnableConfigTable[i].data, + 1 ); + } +} + +/************************************************************************************************** + * @fn HalAccelDisable + * + * @brief Places the Accelerometer in low power mode. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelDisable( void ) +{ + uint8 i; + + /* Configure accelerometer for low power mode */ + for (i = 0; i < HAL_ACCEL_LOW_POWER_CONFIG_TABLE_SIZE; i++) + { + HalMotionI2cWrite( HAL_MOTION_DEVICE_ACCELEROMETER, + HalAccelLowPowerConfigTable[i].addr, + &HalAccelLowPowerConfigTable[i].data, + 1 ); + } +} + +/************************************************************************************************** + * @fn HalAccelMotionDetect + * + * @brief Places the Accelerometer in motion detection mode. + * + * input parameters + * + * @param cback - callback function to invoke if motion is detected + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelMotionDetect( halAccelCBack_t cback ) +{ + uint8 i; + + /* Register the callback fucntion */ + pHalAccelProcessFunction = cback; + + /* Configure accelerometer for motion detection mode */ + for (i = 0; i < HAL_ACCEL_MOTION_DETECT_CONFIG_TABLE_SIZE; i++) + { + HalMotionI2cWrite( HAL_MOTION_DEVICE_ACCELEROMETER, + HalAccelMotionDetectConfigTable[i].addr, + &HalAccelMotionDetectConfigTable[i].data, + 1 ); + } + + /* Clear any prior P1 interrupts */ + P1IFG = (uint8) (~HAL_ACCEL_P1_INTERRUPT_PINS); + P1IF = 0; + + /* Enable interrupt when motion is detected */ + P1IEN |= HAL_ACCEL_P1_INTERRUPT_PINS; + + /* Enable P1 interrupts */ + IEN2 |= BV( 4 ); +} + +/*************************************************************************************************** + * INTERRUPT SERVICE ROUTINES + ***************************************************************************************************/ + +/************************************************************************************************** + * @fn halAccelPort1Isr + * + * @brief Port 1 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halAccelPort1Isr, P1INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + /* Make sure we're processing the desired interrupt */ + if ((P1IFG & HAL_ACCEL_P1_INTERRUPT_PINS) && (P1IEN & HAL_ACCEL_P1_INTERRUPT_PINS)) + { + halAccelProcessMotionDetectInterrupt(); + } + + P1IFG = 0; + P1IF = 0; + + HAL_EXIT_ISR(); +} +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.h new file mode 100644 index 0000000..3fdd902 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_accel.h @@ -0,0 +1,186 @@ +/************************************************************************************************** + Filename: hal_accel.h + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: + + This file contains the declaration to the HAL Accelerometer abstraction layer. + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_ACCEL_H +#define HAL_ACCEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ACCEL_I2C_ADDRESS 0x0F +#define HAL_ACCEL_OUTPUT_DATA_ADDRESS 0x06 // corresponds to X_OUT register address + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef void (*halAccelCBack_t) ( void ); + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalAccelInit + * + * @brief This function initializes the HAL Accelerometer abstraction layer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelInit( void ); + +/************************************************************************************************** + * @fn HalAccelEnable + * + * @brief This function configures the accelerometer for operation. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelEnable( void ); + +/************************************************************************************************** + * @fn HalAccelDisable + * + * @brief Places the Accelerometer in low power mode. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelDisable( void ); + +/************************************************************************************************** + * @fn HalAccelMotionDetect + * + * @brief Places the Accelerometer in motion detection mode. + * + * input parameters + * + * @param cback - callback function to invoke if motion is detected + * + * output parameters + * + * None. + * + * @return None. + */ +void HalAccelMotionDetect( halAccelCBack_t cback ); + +/************************************************************************************************** + * @fn HalAccelRead + * + * @brief Reads Y and Z data out registers from Accelerometer. + * + * input parameters + * + * None. + * + * output parameters + * + * @param *y - Y register value. + * @param *z - Z register value. + * + * @return None. + */ +void HalAccelRead( int8 *y, int8 *z ); + +/************************************************************************************************** + * @fn HalAccelProcessMotionDetectEvent + * + * @brief Post interrupt processing when motion detect interrupt has been received. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void halAccelProcessMotionDetectEvent( void ); + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.c new file mode 100644 index 0000000..ece0247 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.c @@ -0,0 +1,195 @@ +/************************************************************************************************** + Filename: hal_buzzer.c + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: This file contains the interface to control the buzzer. + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" +#include "hal_buzzer.h" +#include "hal_drivers.h" +#include "osal.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Defines for Timer 4 */ +#define HAL_T4_CC0_VALUE 125 /* provides pulse width of 125 usec */ +#define HAL_T4_TIMER_CTL_DIV32 0xA0 /* Clock pre-scaled by 32 */ +#define HAL_T4_TIMER_CTL_START 0x10 +#define HAL_T4_TIMER_CTL_CLEAR 0x04 +#define HAL_T4_TIMER_CTL_OPMODE_MODULO 0x02 /* Modulo Mode, Count from 0 to CompareValue */ +#define HAL_T4_TIMER_CCTL_MODE_COMPARE 0x04 +#define HAL_T4_TIMER_CCTL_CMP_TOGGLE 0x10 +#define HAL_T4_TIMER_CTL_DIV64 0xC0 /* Clock pre-scaled by 64 */ + +/* The following define which port pins are being used by the buzzer */ +#define HAL_BUZZER_P1_GPIO_PINS ( BV( 0 ) ) + +/* These defines indicate the direction of each pin */ +#define HAL_BUZZER_P1_OUTPUT_PINS ( BV( 0 ) ) + +/* Defines for each output pin assignment */ +#define HAL_BUZZER_ENABLE_PIN P1_0 + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +#define HAL_BUZZER_DISABLE() ( HAL_BUZZER_ENABLE_PIN = 0 ) + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +/* Function to call when ringing of buzzer is complete */ +static halBuzzerCBack_t pHalBuzzerRingCompleteNotificationFunction; + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/************************************************************************************************** + * @fn HalBuzzerInit + * + * @brief Initilize buzzer hardware + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalBuzzerInit( void ) +{ + pHalBuzzerRingCompleteNotificationFunction = NULL; + + /* Initialize outputs */ + HAL_BUZZER_DISABLE(); + + /* Configure direction of pins related to buzzer */ + P1DIR |= (uint8) HAL_BUZZER_P1_OUTPUT_PINS; +} + +/************************************************************************************************** + * @fn HalBuzzerRing + * + * @brief This function rings the buzzer once. + * + * input parameters + * + * @param msec - Number of msec to ring the buzzer + * @param tone - Type of tone (low or high) + * @param buzzerCback - Callback function to call when ringing of buzzer is finished + * + * output parameters + * + * None. + * + * @return None. + */ +void HalBuzzerRing( uint16 msec, + uint8 tone, + halBuzzerCBack_t buzzerCback ) +{ + /* Register the callback fucntion */ + pHalBuzzerRingCompleteNotificationFunction = buzzerCback; + + /* Configure output pin as peripheral since we're using T4 to generate */ + P1SEL |= (uint8) HAL_BUZZER_P1_GPIO_PINS; + + if ( tone == HAL_BUZZER_LOW_TONE ) + { + /* Buzzer is "rung" by using T4, channel 0 to generate 2kHz square wave */ + T4CTL = HAL_T4_TIMER_CTL_DIV64 | + HAL_T4_TIMER_CTL_CLEAR | + HAL_T4_TIMER_CTL_OPMODE_MODULO; + } + else // tone == HAL_BUZZER_HIGH_TONE + { + /* Buzzer is "rung" by using T4, channel 0 to generate 4kHz square wave */ + T4CTL = HAL_T4_TIMER_CTL_DIV32 | + HAL_T4_TIMER_CTL_CLEAR | + HAL_T4_TIMER_CTL_OPMODE_MODULO; + } + + T4CCTL0 = HAL_T4_TIMER_CCTL_MODE_COMPARE | HAL_T4_TIMER_CCTL_CMP_TOGGLE; + T4CC0 = HAL_T4_CC0_VALUE; + + /* Start it */ + T4CTL |= HAL_T4_TIMER_CTL_START; + + /* Setup timer that will end the buzzing */ + osal_start_timerEx( Hal_TaskID, + HAL_BUZZER_EVENT, + msec ); + +} + +/************************************************************************************************** + * @fn HalBuzzerStop + * + * @brief Halts buzzer + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalBuzzerStop( void ) +{ + /* Setting T4CTL to 0 disables it and masks the overflow interrupt */ + T4CTL = 0; + + /* Return output pin to GPIO */ + P1SEL &= (uint8) ~HAL_BUZZER_P1_GPIO_PINS; + + /* Inform application that buzzer is done */ + if (pHalBuzzerRingCompleteNotificationFunction != NULL) + { + pHalBuzzerRingCompleteNotificationFunction(); + } +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.h new file mode 100644 index 0000000..cde12df --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_buzzer.h @@ -0,0 +1,130 @@ +/************************************************************************************************** + Filename: hal_buzzer.h + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: + + This file contains the declaration to the HAL buzzer abstraction layer. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_BUZZER_H +#define HAL_BUZZER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_BUZZER_LOW_TONE 0 +#define HAL_BUZZER_HIGH_TONE 1 + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +/* Callback function for when ringing of buzzer is complete */ +typedef void (*halBuzzerCBack_t) (void); + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalBuzzerInit + * + * @brief Initilize buzzer hardware + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalBuzzerInit( void ); + +/************************************************************************************************** + * @fn HalBuzzerRing + * + * @brief This function rings the buzzer once. + * + * input parameters + * + * @param msec - Number of msec to ring the buzzer + * @param tone - Type of tone (low or high) + * @param buzzerCback - Callback function to call when ringing of buzzer is finished + * + * output parameters + * + * None. + * + * @return None. + */ +void HalBuzzerRing( uint16 msec, + uint8 tone, + halBuzzerCBack_t buzzerCback ); + +/************************************************************************************************** + * @fn HalBuzzerStop + * + * @brief Halts buzzer + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalBuzzerStop( void ); + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.c new file mode 100644 index 0000000..e8887a6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.c @@ -0,0 +1,370 @@ +/************************************************************************************************** + Filename: hal_drivers.c + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: This file contains the interface to the Drivers Service. + + + Copyright 2005-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "OSAL.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + #include "hal_dma.h" +#endif +#include "hal_flash.h" +#if ((defined HAL_I2C) && (HAL_I2C == TRUE)) + #include "hal_i2c.h" +#endif +#include "hal_key.h" +#include "hal_lcd.h" +#include "hal_led.h" +#include "hal_timer.h" +#include "hal_uart.h" +#include "hal_sleep.h" +//#include "hal_vddmon.h" +#if (defined HAL_AES) && (HAL_AES == TRUE) + #include "hal_aes.h" +#endif +#if (defined HAL_MOTION) && (HAL_MOTION == TRUE) + #include "hal_gyro.h" + #include "hal_motion.h" +#endif +#if (defined HAL_SPI) && (HAL_SPI == TRUE) + #include "hal_spi.h" +#endif +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) + #include "hal_buzzer.h" +#endif +#if (defined HAL_GPIO_DBG) && (HAL_GPIO_DBG == TRUE) + #include "hal_gpiodbg.h" +#endif + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +uint8 Hal_TaskID; + +extern void HalLedUpdate( void ); /* Notes: This for internal only so it shouldn't be in hal_led.h */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/************************************************************************************************** + * @fn Hal_Init + * + * @brief Hal Initialization function. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_Init( uint8 task_id ) +{ + /* Register task ID */ + Hal_TaskID = task_id; + + /* HalMotionInit() is called here instead of HalDriverInit() because it requires + * osal services, which aren't available at that time. + */ +#if (defined HAL_MOTION) && (HAL_MOTION == TRUE) + HalMotionInit(); +#endif +} + +/************************************************************************************************** + * @fn Hal_DriverInit + * + * @brief Initialize HW - These need to be initialized before anyone. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void HalDriverInit (void) +{ + /* VDDMON */ +#if (defined HAL_VDDMON) && (HAL_VDDMON == TRUE) + HalVddMonInit(); +#endif + + /* ADC */ +#if (defined HAL_ADC) && (HAL_ADC == TRUE) + HalAdcInit(); +#endif + + /* DMA */ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + // Must be called before the init call to any module that uses DMA. + HalDmaInit(); +#endif + + /* AES */ +#if (defined HAL_AES) && (HAL_AES == TRUE) + HalAesInit(); +#endif + + /* LCD */ +#if (defined HAL_LCD) && (HAL_LCD == TRUE) + HalLcdInit(); +#endif + + /* LED */ +#if (defined HAL_LED) && (HAL_LED == TRUE) + HalLedInit(); +#endif + + /* UART */ +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTInit(); +#endif + + /* KEY */ +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + HalKeyInit(); +#endif + + /* SPI */ +#if (defined HAL_SPI) && (HAL_SPI == TRUE) + HalSpiInit(); +#endif + + /* Buzzer */ +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) + HalBuzzerInit(); +#endif + + /* GPIO Debug */ +#if (defined HAL_GPIO_DBG) && (HAL_GPIO_DBG == TRUE) + HalGpioDbgInit(); +#endif +} + +/************************************************************************************************** + * @fn halDriverBegPM + * + * @brief This function is called before entering PM so that drivers can be put into their + * lowest power states. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void halDriverBegPM(void) +{ +#if ((defined HAL_LED) && (HAL_LED == TRUE)) + HalLedEnterSleep(); +#endif +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + HalKeyEnterSleep(); +#endif +#if ((defined HAL_I2C) && (HAL_I2C == TRUE)) + HalI2CEnterSleep(); +#endif +} + +/************************************************************************************************** + * @fn halDriverEndPM + * + * @brief This function is called after exiting PM so that drivers can be restored to their + * ready power states. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void halDriverEndPM(void) +{ +#if ((defined HAL_LED) && (HAL_LED == TRUE)) + HalLedExitSleep(); +#endif +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + HalKeyExitSleep(); +#endif +#if ((defined HAL_I2C) && (HAL_I2C == TRUE)) + HalI2CExitSleep(); +#endif +} + +/************************************************************************************************** + * @fn Hal_ProcessEvent + * + * @brief Hal Process Event + * + * @param task_id - Hal TaskId + * events - events + * + * @return None + **************************************************************************************************/ +uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) +{ + uint8 *msgPtr; + + (void)task_id; // Intentionally unreferenced parameter + + if ( events & SYS_EVENT_MSG ) + { + msgPtr = osal_msg_receive(Hal_TaskID); + + while (msgPtr) + { + /* Do something here - for now, just deallocate the msg and move on */ + + /* De-allocate */ + osal_msg_deallocate( msgPtr ); + /* Next */ + msgPtr = osal_msg_receive( Hal_TaskID ); + } + return events ^ SYS_EVENT_MSG; + } + + if ( events & HAL_LED_BLINK_EVENT ) + { +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + HalLedUpdate(); +#endif /* BLINK_LEDS && HAL_LED */ + return events ^ HAL_LED_BLINK_EVENT; + } + + if (events & HAL_KEY_EVENT) + { + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + /* Check for keys */ + HalKeyPoll(); + + /* if interrupt disabled, do next polling */ + if (!Hal_KeyIntEnable) + { + osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); + } +#endif // HAL_KEY + + return events ^ HAL_KEY_EVENT; + } + +#if (defined HAL_MOTION) && (HAL_MOTION == TRUE) && (!defined NO_POINTING_LIB) + if (events & HAL_MOTION_EVENT) + { + uint16 eventHandled = HalMotionHandleOSEvent( events ); + return events ^ eventHandled; + } + +#if (defined HAL_I2C) && (HAL_I2C == TRUE) + if (events & HAL_GYRO_REGISTER_ACCESS_READY_EVENT) + { + HalGyroHandleGyroRegisterAccessReadyEvent(); + return events ^ HAL_GYRO_REGISTER_ACCESS_READY_EVENT; + } +#endif // #if (defined HAL_I2C) && (HAL_I2C == TRUE) +#endif // #if (defined HAL_MOTION) && (HAL_MOTION == TRUE) + +#if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) + if (events & HAL_BUZZER_EVENT) + { + HalBuzzerStop(); + return events ^ HAL_BUZZER_EVENT; + } +#endif + + /* Nothing interested, discard the message */ + return 0; + +} + +/************************************************************************************************** + * @fn Hal_ProcessPoll + * + * @brief This routine will be called by OSAL to poll UART, TIMER... + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_ProcessPoll () +{ +#if (defined HAL_VDDMON) && (HAL_VDDMON == TRUE) + HalVddMonPoll(); +#endif +#if ((defined HAL_I2C) && (HAL_I2C == TRUE) && (defined HAL_I2C_POLLED) && (HAL_I2C_POLLED == TRUE)) + HalI2CPoll(); +#endif +#if (defined HAL_UART) && (HAL_UART == TRUE) + HalUARTPoll(); +#endif +#if (defined HAL_SPI) && (HAL_SPI == TRUE) + HalSpiPoll(); +#endif +#if (defined HAL_HID) && (HAL_HID == TRUE) + extern void usbHidProcessEvents(void); + usbHidProcessEvents(); +#endif +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.h new file mode 100644 index 0000000..d9b55d2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_drivers.h @@ -0,0 +1,143 @@ +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_DRIVER_H +#define HAL_DRIVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +#define HAL_KEY_EVENT 0x0001 +#define HAL_LED_BLINK_EVENT 0x0002 + +#define HAL_SLEEP_TIMER_EVENT 0x00400 +#define PERIOD_RSSI_RESET_EVT 0x00800 + +#define PERIOD_RSSI_RESET_TIMEOUT 10 + + + +#define HAL_MOTION_GYRO_POWERUP_DONE_EVENT 0x0004 +#define HAL_MOTION_GYRO_CALIBRATION_DONE_EVENT 0x0008 +#define HAL_MOTION_MEASUREMENT_START_EVENT 0x0010 +#define HAL_MOTION_MEASUREMENT_DONE_EVENT 0x0020 +#define HAL_BUZZER_EVENT 0x0040 +#define HAL_GYRO_REGISTER_ACCESS_READY_EVENT 0x0080 +#define HAL_MOTION_DETECTED_EVENT 0x0100 +#define HAL_GYRO_ACTIVE_EVENT 0x0200 +#define HAL_MOTION_EVENT \ + ( HAL_MOTION_GYRO_POWERUP_DONE_EVENT | \ + HAL_MOTION_GYRO_CALIBRATION_DONE_EVENT | \ + HAL_MOTION_MEASUREMENT_START_EVENT | \ + HAL_MOTION_MEASUREMENT_DONE_EVENT | \ + HAL_MOTION_DETECTED_EVENT | \ + HAL_GYRO_ACTIVE_EVENT ) + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern uint8 Hal_TaskID; + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + +/************************************************************************************************** + * @fn halDriverBegPM + * + * @brief This function is called before entering PM so that drivers can be put into their + * lowest power states. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void halDriverBegPM(void); + +/************************************************************************************************** + * @fn halDriverEndPM + * + * @brief This function is called after exiting PM so that drivers can be restored to their + * ready power states. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void halDriverEndPM(void); + +#ifdef __cplusplus +} +#endif + +#endif +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.c new file mode 100644 index 0000000..4e5dce6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.c @@ -0,0 +1,438 @@ +/************************************************************************************************** + Filename: hal_gyro.c + Revised: $Date: 2012-10-19 16:06:31 -0700 (Fri, 19 Oct 2012) $ + Revision: $Revision: 31875 $ + + Description: This file contains the hardware abstraction interface for the + Invensense IXZ-500 Gyroscope. + + + Copyright 2006-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_accel.h" +#include "hal_mcu.h" +#include "hal_drivers.h" +#include "hal_gyro.h" +#include "hal_motion.h" +#include "osal.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* The following define which port pins are being used by the gyro */ +#define HAL_GYRO_P0_GPIO_PINS ( BV( 7 ) | BV( 5 ) ) +#define HAL_GYRO_P1_GPIO_PINS ( BV( 3 ) ) + +/* These defines indicate the direction of each pin */ +#define HAL_GYRO_P0_OUTPUT_PINS ( BV( 7 ) | BV( 5 ) ) +#define HAL_GYRO_P1_OUTPUT_PINS ( BV( 3 ) ) + +/* Defines for each output pin assignment */ +#define HAL_GYRO_POWER_PIN P0_7 +#define HAL_GYRO_CLKIN_PIN P0_5 +#define HAL_GYRO_INT_PIN P1_3 + +/* IMU3000 register addresses */ +#define IMU3000_REG_ADDR_WHO_AM_I 0x00 +#define IMU3000_REG_ADDR_X_OFFS_USRH 0x0C +#define IMU3000_REG_ADDR_X_OFFS_USRL 0x0D +#define IMU3000_REG_ADDR_Y_OFFS_USRH 0x0E +#define IMU3000_REG_ADDR_Y_OFFS_USRL 0x0F +#define IMU3000_REG_ADDR_Z_OFFS_USRH 0x10 +#define IMU3000_REG_ADDR_Z_OFFS_USRL 0x11 +#define IMU3000_REG_ADDR_FIFO_EN 0x12 +#define IMU3000_REG_ADDR_AUX_VDDIO 0x13 +#define IMU3000_REG_ADDR_AUX_SLV_ADDR 0x14 +#define IMU3000_REG_ADDR_SMPLRT_DIV 0x15 +#define IMU3000_REG_ADDR_DLPF_FS 0x16 +#define IMU3000_REG_ADDR_INT_CFG 0x17 +#define IMU3000_REG_ADDR_AUX_BURST_ADDR 0x18 +#define IMU3000_REG_ADDR_INT_STATUS 0x1A +#define IMU3000_REG_ADDR_TEMP_OUT_H 0x1B +#define IMU3000_REG_ADDR_TEMP_OUT_L 0x1C +#define IMU3000_REG_ADDR_GYRO_XOUT_H 0x1D +#define IMU3000_REG_ADDR_GYRO_XOUT_L 0x1E +#define IMU3000_REG_ADDR_GYRO_YOUT_H 0x1F +#define IMU3000_REG_ADDR_GYRO_YOUT_L 0x20 +#define IMU3000_REG_ADDR_GYRO_ZOUT_H 0x21 +#define IMU3000_REG_ADDR_GYRO_ZOUT_L 0x22 +#define IMU3000_REG_ADDR_AUX_XOUT_H 0x23 +#define IMU3000_REG_ADDR_AUX_XOUT_L 0x24 +#define IMU3000_REG_ADDR_AUX_YOUT_H 0x25 +#define IMU3000_REG_ADDR_AUX_YOUT_L 0x26 +#define IMU3000_REG_ADDR_AUX_ZOUT_H 0x27 +#define IMU3000_REG_ADDR_AUX_ZOUT_L 0x28 +#define IMU3000_REG_ADDR_DMP_REG1 0x35 +#define IMU3000_REG_ADDR_DMP_REG2 0x36 +#define IMU3000_REG_ADDR_DMP_REG3 0x37 +#define IMU3000_REG_ADDR_DMP_REG4 0x38 +#define IMU3000_REG_ADDR_DMP_REG5 0x39 +#define IMU3000_REG_ADDR_FIFO_COUNTH 0x3A +#define IMU3000_REG_ADDR_FIFO_COUNTL 0x3B +#define IMU3000_REG_ADDR_FIFO_R 0x3C +#define IMU3000_REG_ADDR_USER_CTRL 0x3D +#define IMU3000_REG_ADDR_PWR_MGM 0x3E + +/* USER_CTL values */ +#define AUX_IF_RST 0x08 +#define AUX_IF_EN 0x20 + +/* PWR_MGM values */ +#define CLK_SRC_PLL_X_GYRO_REF 0x01 +#define PWR_MGM_SLEEP 0x40 +#define PWR_MGM_STBY_XG 0x20 +#define PWR_MGM_STBY_YG 0x10 +#define PWR_MGM_STBY_ZG 0x08 + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef struct +{ + uint8 addr; + uint8 data; +} halGyroConfig_t; + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +static halGyroEnableCback_t pHalGyroEnableProcessFunction; +static halGyroConfig_t HalGyroConfigTable[] = +{ + { IMU3000_REG_ADDR_AUX_SLV_ADDR, HAL_ACCEL_I2C_ADDRESS }, + { IMU3000_REG_ADDR_AUX_BURST_ADDR, HAL_ACCEL_OUTPUT_DATA_ADDRESS }, + { IMU3000_REG_ADDR_SMPLRT_DIV, 4 }, // SMPLRT_DIV = 4 with DLPF_CFG = 1 gives 200 Hz rate + { IMU3000_REG_ADDR_DLPF_FS, 0x19 } +}; +#define HAL_GYRO_CONFIG_TABLE_SIZE (sizeof(HalGyroConfigTable) / sizeof(HalGyroConfigTable[0])) + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +static void gyroSleep( void ); +static void gyroWake( void ); + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/************************************************************************************************** + * @fn HalGyroInit + * + * @brief Initilize Gyro hardware + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalGyroInit( void ) +{ + /* Initialize outputs */ + HAL_GYRO_POWER_PIN = 1; + HAL_GYRO_CLKIN_PIN = 0; + HAL_GYRO_INT_PIN = 0; + + /* Configure pin function as GPIO for pins related to gyro */ + P0SEL &= (uint8) ~HAL_GYRO_P0_GPIO_PINS; + P1SEL &= (uint8) ~HAL_GYRO_P1_GPIO_PINS; + + /* Configure direction of pins related to gyro */ + P0DIR |= (uint8) HAL_GYRO_P0_OUTPUT_PINS; + P1DIR |= (uint8) HAL_GYRO_P1_OUTPUT_PINS; + + /* Indicate no callback */ + pHalGyroEnableProcessFunction = NULL; + + /* Start timer to wait for outputs to become stable */ + osal_start_timerEx( Hal_TaskID, + HAL_GYRO_REGISTER_ACCESS_READY_EVENT, + 100 ); +} + +/************************************************************************************************** + * @fn HalGyroEnable + * + * @brief This function configures the gyro for operation. + * + * @param cback - function to call when gyro is configured + * + * @return None. + **************************************************************************************************/ +void HalGyroEnable( halGyroEnableCback_t cback ) +{ + /* Save callback */ + pHalGyroEnableProcessFunction = cback; + + /* Take gyro out of sleep mode */ + gyroWake(); + + /* Start timer to wait for outputs to become stable */ + osal_start_timerEx( Hal_TaskID, + HAL_GYRO_REGISTER_ACCESS_READY_EVENT, + 100 ); +} + +/************************************************************************************************** + * @fn HalGyroHandleGyroRegisterAccessReadyEvent + * + * @brief Callback to handle expiry of gyro powerup wait timer. + * + * @param None. + * + * @return None. + **************************************************************************************************/ +void HalGyroHandleGyroRegisterAccessReadyEvent( void ) +{ + uint8 i; + + if (pHalGyroEnableProcessFunction != NULL) + { + /* Gyro is ready. Configure it. */ + for (i = 0; i < HAL_GYRO_CONFIG_TABLE_SIZE; i++) + { + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + HalGyroConfigTable[i].addr, + &HalGyroConfigTable[i].data, + 1 ); + } + + /* config is complete, so notify caller */ + pHalGyroEnableProcessFunction(); + } + else + { + /* No callback, so just put gyro in sleep mode */ + gyroSleep(); + } +} + +/************************************************************************************************** + * @fn HalGyroDisable + * + * @brief This function powers off the gyro. + * + * @param None. + * + * @return None. + **************************************************************************************************/ +void HalGyroDisable( void ) +{ + /* All we need to do is put gyro to sleep */ + gyroSleep(); +} + +/************************************************************************************************** + * @fn HalGyroRead + * + * @brief Reads channels connected to X and Z output on Gyroscope. + * + * @param None + * + * @return X and Z channel readings + **************************************************************************************************/ +void HalGyroRead( int16 *x, int16 *y, int16 *z ) +{ + uint8 temp[6]; + + /* Get all 3 axes of gyro samples as the gyro seems to hang the I2C bus if we only read 2 of them. */ + HalMotionI2cRead( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_GYRO_XOUT_H, + 6, + (uint8 *)temp ); + + /* Extract X and Z axis info, accounting for endian difference */ + *x = (temp[2] << 8) | temp[3]; + *y = (temp[0] << 8) | temp[1]; + *z = (temp[4] << 8) | temp[5]; +} + +/************************************************************************************************** + * @fn HalGyroReadAccelData + * + * @brief Reads X, Y and Z data out registers from Accelerometer. + * + * input parameters + * + * None. + * + * output parameters + * + * @param *x - X register value. + * @param *y - Y register value. + * @param *z - Z register value. + * + * @return None. + */ +void HalGyroReadAccelData( int8 *x, int8 *y, int8 *z ) +{ + uint8 temp[6]; + + /* Get all 3 axes of gyro samples as the gyro seems to hang the I2C bus if we only read 2 of them. */ + HalMotionI2cRead( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_AUX_XOUT_H, + 6, + (uint8 *)temp ); + + /* Extract Y and Z axis info. Data is laid out as follows: + * + * ---------- + * | XOUT_L | B3 B2 B1 B0 x x x x + * |--------| + * | XOUT_H | B11 B10 B9 B8 B7 B6 B5 B4 + * |--------| + * | YOUT_L | + * |--------| + * | YOUT_H | + * |--------| + * | ZOUT_L | + * |--------| + * | ZOUT_H | + * ---------- + * + * Since the data we're interested in lies in the 8 most significant bits, all + * we need to do is read the XOUT_H, YOUT_H, and ZOUT_H registers. + */ + *x = temp[1]; + *y = temp[3]; + *z = temp[5]; +} + +/************************************************************************************************** + * @fn HalGyroEnableI2CPassThru + * + * @brief Enables I2C pass thru mode on the IMU-3000, which allows the MCU to talk to the + * accelerometer. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroEnableI2CPassThru( void ) +{ + uint8 data = AUX_IF_RST; + + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_USER_CTRL, + &data, + 1 ); +} + +/************************************************************************************************** + * @fn HalGyroDisableI2CPassThru + * + * @brief Disables I2C pass thru mode on the IMU-3000, which means the gyro will master the I2C + * accesses to the accelerometer. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroDisableI2CPassThru( void ) +{ + uint8 data = AUX_IF_RST | AUX_IF_EN; + + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_USER_CTRL, + &data, + 1 ); +} + +/************************************************************************************************** + * @fn HalGyroStartGyroMeasurements + * + * @brief Enables the gyro clock and also configures the gyro to control the aux I2C + * interface so it can read accelerometer data. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroStartGyroMeasurements( void ) +{ + uint8 data = CLK_SRC_PLL_X_GYRO_REF; + + HalGyroDisableI2CPassThru(); + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_PWR_MGM, + &data, + 1 ); +} + +/************************************************************************************************** + * @fn gyroSleep + * + * @brief This function puts the gyro in sleep mode. + * + * @param None. + * + * @return None. + **************************************************************************************************/ +static void gyroSleep( void ) +{ + /* All we need to do is put gyro to sleep */ + uint8 reg = PWR_MGM_SLEEP | PWR_MGM_STBY_XG | PWR_MGM_STBY_YG | PWR_MGM_STBY_ZG; + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_PWR_MGM, + ®, + 1 ); +} + +/************************************************************************************************** + * @fn gyroWake + * + * @brief This function takes the gyro out of sleep mode. + * + * @param None. + * + * @return None. + **************************************************************************************************/ +static void gyroWake( void ) +{ + /* Clear SLEEP bit and place gyros in active mode */ + uint8 reg = 0; + + HalMotionI2cWrite( HAL_MOTION_DEVICE_GYRO, + IMU3000_REG_ADDR_PWR_MGM, + ®, + 1 ); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.h new file mode 100644 index 0000000..a734ecf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_gyro.h @@ -0,0 +1,209 @@ +/************************************************************************************************** + Filename: hal_gyro.h + Revised: $Date: 2012-10-19 16:06:31 -0700 (Fri, 19 Oct 2012) $ + Revision: $Revision: 31875 $ + + Description: + + This file contains the declaration to the HAL Gyroscope abstraction layer. + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_GYRO_H +#define HAL_GYRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_GYRO_OUTPUT_SETTLING_TIME 200 // time from power on until data valid, in ms +#define HAL_GYRO_CAL_SETTLING_TIME 10 // time from AZ asserted until outputs settled, in ms +#define HAL_GYRO_I2C_ADDRESS 0x68 + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef void (*halGyroEnableCback_t) ( void ); + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalGyroInit + * + * @brief This function initializes the HAL Gyroscope abstraction layer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + **************************************************************************************************/ +void HalGyroInit( void ); + +/************************************************************************************************** + * @fn HalGyroEnable + * + * @brief This function configures the gyro for operation. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + **************************************************************************************************/ +void HalGyroEnable( halGyroEnableCback_t cback ); + +/************************************************************************************************** + * @fn HalGyroHandleGyroRegisterAccessReadyEvent + * + * @brief Callback to handle expiry of gyro powerup wait timer. + * + * @param None. + * + * @return None. + **************************************************************************************************/ +void HalGyroHandleGyroRegisterAccessReadyEvent( void ); + +/************************************************************************************************** + * @fn HalGyroDisable + * + * @brief This function powers off the gyro. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + **************************************************************************************************/ +void HalGyroDisable( void ); + +/************************************************************************************************** + * @fn HalGyroRead + * + * @brief Performs A/D reading on channels connected to X, Y, and Z output on Gyroscope. + * + * @param None + * + * @return X, Y, and Z channel readings + **************************************************************************************************/ +void HalGyroRead( int16 *x, int16 *y, int16 *z ); + +/************************************************************************************************** + * @fn HalGyroReadAccelData + * + * @brief Reads X, Y and Z data out registers from Accelerometer. + * + * input parameters + * + * None. + * + * output parameters + * + * @param *x - X register value. + * @param *y - Y register value. + * @param *z - Z register value. + * + * @return None. + */ +void HalGyroReadAccelData( int8 *x, int8 *y, int8 *z ); + +/************************************************************************************************** + * @fn HalGyroEnableI2CPassThru + * + * @brief Enables I2C pass thru mode on the IMU-3000, which allows the MCU to talk to the + * accelerometer. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroEnableI2CPassThru( void ); + +/************************************************************************************************** + * @fn HalGyroDisableI2CPassThru + * + * @brief Disables I2C pass thru mode on the IMU-3000, which means the gyro will master the I2C + * accesses to the accelerometer. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroDisableI2CPassThru( void ); + +/************************************************************************************************** + * @fn HalGyroStartGyroMeasurements + * + * @brief Enables the gyro clock and also configures the gyro to control the aux I2C + * interface so it can read accelerometer data. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalGyroStartGyroMeasurements( void ); + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.c new file mode 100644 index 0000000..e645b30 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.c @@ -0,0 +1,712 @@ +/************************************************************************************************** + Filename: hal_i2c.c + Revised: $Date: 2012-10-19 16:06:31 -0700 (Fri, 19 Oct 2012) $ + Revision: $Revision: 31875 $ + + Description: This module defines the HAL I2C API for the CC2533. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" +#include "hal_board_cfg.h" +#if (defined HAL_I2C) && (HAL_I2C == TRUE) +#include "hal_assert.h" +#include "hal_i2c.h" +#include "osal.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define I2C_ENS1 BV(6) +#define I2C_STA BV(5) +#define I2C_STO BV(4) +#define I2C_SI BV(3) +#define I2C_AA BV(2) +#define I2C_MST_RD_BIT BV(0) // Master RD/WRn bit to be OR'ed with Slave address. + +#define I2C_CLOCK_MASK 0x83 + +#define I2C_PXIFG P2IFG +#define I2C_IF P2IF +#define I2C_IE BV(1) + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef enum { + // HAL_I2C_MASTER mode statuses. + mstStarted = 0x08, + mstRepStart = 0x10, + mstAddrAckW = 0x18, + mstAddrNackW = 0x20, + mstDataAckW = 0x28, + mstDataNackW = 0x30, + mstLostArb = 0x38, + mstAddrAckR = 0x40, + mstAddrNackR = 0x48, + mstDataAckR = 0x50, + mstDataNackR = 0x58, + + // HAL_I2C_SLAVE mode statuses. + slvAddrAckR = 0x60, + mstLostArbR = 0x68, + slvAddrAckG = 0x70, + mstLostArbG = 0x78, + slvDataAckR = 0x80, + slvDataNackR = 0x88, + genDataAckR = 0x90, + genDataNackR = 0x98, + slvStopped = 0xA0, + slvAddrAckW = 0xA8, + mstLostArbW = 0xB0, + slvDataAckW = 0xB8, + slvDataNackW = 0xC0, + slvLastAckW = 0xC8, + + // HAL_I2C_MASTER/SLAVE mode statuses. + i2cIdle = 0xF8 +} i2cStatus_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define I2C_WRAPPER_DISABLE() st( I2CWC = 0x0C; ) +#define I2C_CLOCK_RATE(x) st( I2CCFG &= ~I2C_CLOCK_MASK; \ + I2CCFG |= x; ) + +#define I2C_CLR_NACK() st( I2CCFG |= I2C_AA; I2CCFG &= ~I2C_SI; ) +#define I2C_SET_NACK() st( I2CCFG &= ~I2C_AA; ) +#define I2C_SET_ACK() st( I2CCFG |= I2C_AA; ) + +// Master to Ack to every byte read from the Slave; Slave to Ack Address & Data from the Master. +#define I2C_ENABLE() st( I2CCFG |= (I2C_ENS1 | I2C_AA); ) + +// Must clear SI before setting STA and then STA must be manually cleared. +#define I2C_STRT() st ( \ + I2CCFG &= ~I2C_SI; \ + I2CCFG |= I2C_STA; \ + while ((I2CCFG & I2C_SI) == 0); \ + I2CCFG &= ~I2C_STA; \ +) + +// Must set STO before clearing SI. +#define I2C_STOP() st ( \ + I2CCFG |= I2C_STO; \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_STO) != 0); \ +) + +// Stop clock-stretching and then read when it arrives. +#define I2C_READ(_X_) st ( \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ + (_X_) = I2CDATA; \ +) + +// First write new data and then stop clock-stretching. +#define I2C_WRITE(_X_) st ( \ + I2CDATA = (_X_); \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ +) + +// Stop clock-stretching and then read when it arrives. +#define SLV_READ(_X_) st ( \ + I2CCFG &= ~I2C_SI; \ + while (((I2CCFG & I2C_SI) == 0) \ + && (I2CSTAT != slvStopped)); \ + (_X_) = I2CDATA; \ +) + +// First write new data and then stop clock-stretching. +#define SLV_WRITE(_X_) st ( \ + I2CDATA = (_X_); \ + I2CCFG &= ~I2C_SI; \ + while (((I2CCFG & I2C_SI) == 0) \ + && (I2CSTAT != slvStopped)); \ +) + +#if HAL_I2C_POLLED +#define I2C_INT_ENABLE() +#else +#define I2C_INT_ENABLE() st( IEN2 |= I2C_IE; ) +#endif +#define I2C_INT_DISABLE() st( IEN2 &= ~I2C_IE; ) +#define I2C_INT_ENABLED() ( IEN2 & I2C_IE ) + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +static uint8 i2cAddrSave, i2cCfgSave; // Save & restore variables for PM. + +#if HAL_I2C_SLAVE +static i2cCallback_t i2cCB; +static volatile i2cLen_t i2cRxIdx, i2cTxIdx; +static uint8 i2cRxBuf[HAL_I2C_BUF_MAX+1], i2cTxBuf[HAL_I2C_BUF_MAX+1]; +#endif + +static volatile i2cLen_t i2cRxLen, i2cTxLen; + +#if HAL_I2C_MASTER +/************************************************************************************************** + * @fn i2cMstStrt + * + * @brief Attempt to send an I2C bus START and Slave Address as an I2C bus Master. + * + * input parameters + * + * @param address - I2C address of the slave device we're attempting to talk to + * @param RD_WRn - The LSB of the Slave Address as Read/~Write. + * + * output parameters + * + * None. + * + * @return The I2C status of the START request or of the Slave Address Ack. + */ +static uint8 i2cMstStrt(uint8 address, uint8 RD_WRn) +{ + I2C_STRT(); + + if (I2CSTAT == mstStarted) + { + address <<= 1; + I2C_WRITE(address | RD_WRn); + } + + return I2CSTAT; +} + +/************************************************************************************************** + * @fn HalI2CInit + * + * @brief Initialize the I2C bus as a Master. + * + * input parameters + * + * @param clockRate - I2C clock rate. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CInit(i2cClock_t clockRate) +{ + I2C_WRAPPER_DISABLE(); + I2CADDR = 0; // no multi master support at this time + I2C_CLOCK_RATE(clockRate); + I2C_ENABLE(); +} + +/************************************************************************************************** + * @fn HalI2CRead + * + * @brief Read from the I2C bus as a Master. + * + * input parameters + * + * @param address - I2C address of the slave device we're attempting to read from + * @param len - Number of bytes to read. + * @param pBuf - Pointer to the data buffer to put read bytes. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully read. + */ +i2cLen_t HalI2CRead(uint8 address, i2cLen_t len, uint8 *pBuf) +{ + uint8 cnt = 0; + + if (i2cMstStrt(address, I2C_MST_RD_BIT) != mstAddrAckR) + { + len = 0; + } + + // All bytes are ACK'd except for the last one which is NACK'd. If only + // 1 byte is being read, a single NACK will be sent. Thus, we only want + // to enable ACK if more than 1 byte is going to be read. + if (len > 1) + { + I2C_SET_ACK(); + } + + while (len > 0) + { + // slave devices require NACK to be sent after reading last byte + if (len == 1) + { + I2C_SET_NACK(); + } + + // read a byte from the I2C interface + I2C_READ(*pBuf++); + cnt++; + len--; + + if (I2CSTAT != mstDataAckR) + { + if (I2CSTAT != mstDataNackR) + { + // something went wrong, so don't count last byte + cnt--; + } + break; + } + } + + I2C_STOP(); + return cnt; +} + +/************************************************************************************************** + * @fn HalI2CWrite + * + * @brief Write to the I2C bus as a Master. + * + * input parameters + * + * @param address - I2C address of the slave device we're attempting to write to + * @param len - Number of bytes to write. + * @param pBuf - Pointer to the data buffer to write. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully written. + */ +i2cLen_t HalI2CWrite(uint8 address, i2cLen_t len, uint8 *pBuf) +{ + if (i2cMstStrt(address, 0) != mstAddrAckW) + { + len = 0; + } + + for (i2cLen_t cnt = 0; cnt < len; cnt++) + { + I2C_WRITE(*pBuf++); + + if (I2CSTAT != mstDataAckW) + { + if (I2CSTAT == mstDataNackW) + { + len = cnt + 1; + } + else + { + len = cnt; + } + break; + } + } + + I2C_STOP(); + return len; +} + +#else // if HAL_I2C_SLAVE + +/************************************************************************************************** + * @fn i2cSlvRx + * + * @brief Block, reading from the I2C bus as a Slave. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static i2cLen_t i2cSlvRx(void) +{ + uint8 ch, idx = 0; + + do { + SLV_READ(ch); + + if ((I2CSTAT == slvDataAckR) || (I2CSTAT == slvDataNackR)) + { + i2cRxBuf[idx++] = ch; + } + + if (idx == HAL_I2C_BUF_MAX) + { + I2C_SET_NACK(); + } + } while (I2CSTAT == slvDataAckR); + + i2cRxLen = idx; + i2cRxIdx = 0; + I2C_CLR_NACK(); + + return idx; +} + +/************************************************************************************************** + * @fn i2cSlvTx + * + * @brief Block, writing to the I2C bus as a Slave. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +static i2cLen_t i2cSlvTx(void) +{ + uint8 idx = i2cTxIdx, len = i2cTxLen; + + while (1) + { + if (len == 1) + { + I2C_SET_NACK(); // Setup to write last byte. + } + SLV_WRITE(i2cTxBuf[idx]); + + if ((I2CSTAT == slvDataAckW) || (I2CSTAT == slvLastAckW) || (I2CSTAT == slvDataNackW)) + { + idx++; + + if ((--len == 0) || (I2CSTAT == slvDataNackW)) + { + break; + } + } + else + { + break; + } + } + + i2cTxIdx = idx; + i2cTxLen = len; + I2C_CLR_NACK(); + + return len; +} + +/************************************************************************************************** + * @fn HalI2CInit + * + * @brief Initialize the I2C bus as a Slave. + * + * input parameters + * + * @param address - I2C slave address. + * @param i2cCallback - I2C callback. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CInit(uint8 address, i2cCallback_t i2cCallback) +{ + i2cCB = i2cCallback; + HAL_ASSERT(i2cCB); + + I2C_WRAPPER_DISABLE(); + I2CADDR = address << 1; + I2C_ENABLE(); + // Clear the CPU interrupt flag for Port_2 PxIFG has to be cleared before PxIF. + I2C_PXIFG = 0; + I2C_IF = 0; + I2C_INT_ENABLE(); +} + +/************************************************************************************************** + * @fn HalI2CRead + * + * @brief Read the data read from the I2C bus as a Slave. + * + * input parameters + * + * @param len - Number of bytes to read. + * @param pBuf - Pointer to the data buffer to put read bytes. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully read. + */ +i2cLen_t HalI2CRead(i2cLen_t len, uint8 *pBuf) +{ + uint8 rxLen = i2cRxLen; + + if (len >= rxLen) + { + len = rxLen; + rxLen = 0; + } + else + { + rxLen -= len; + } + + (void)osal_memcpy(pBuf, i2cRxBuf+i2cRxIdx, len); + i2cRxIdx += len; + i2cRxLen = rxLen; + + return len; +} + +/************************************************************************************************** + * @fn HalI2CWrite + * + * @brief Write the data to write to the I2C bus as a Slave. + * + * input parameters + * + * @param len - Length of the data buffer to write. + * @param pBuf - Pointer to the data buffer to write. + * + * output parameters + * + * None. + * + * @return The number of bytes setup to write. + */ +i2cLen_t HalI2CWrite(i2cLen_t len, uint8 *pBuf) +{ +#if ((HAL_I2C_BUF_MAX != 255) && (HAL_I2C_BUF_MAX != 65535)) + if (len > HAL_I2C_BUF_MAX) + { + len = HAL_I2C_BUF_MAX; + } +#endif + + if (i2cTxLen != 0) // Refuse to overwrite old msg with new data so no race with ISR. + { + return 0; + } + + (void)osal_memcpy(i2cTxBuf, pBuf, len); + i2cTxIdx = 0; + i2cTxLen = len; + +#if HAL_I2C_POLLED + if (I2CSTAT == slvAddrAckW) + { + i2cSlvTx(); + } +#else + // When the I2C slave is actively addressed for write and there is no Tx ready, + // this driver gets a promise from the Application that a write will be made and effects + // clock stretching, waiting for the Application to compose and now here to write the bytes + // to be transmitted. Unfortunately, when the slave is clock stretching, the H/W continues to + // fire the ISR and the Application cannot run (no throughput), so the I2C ISR has to be disabled + // while purposely clock stretching. + if (!I2C_INT_ENABLED()) + { + I2C_INT_ENABLE(); // Constant ISR's being held off will trigger & invoke i2cSlvTx(). + } +#endif + + return len; +} + +/************************************************************************************************** + * @fn HalI2CPoll + * + * @brief Poll the I2C module as a Slave when not running by ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +#if HAL_I2C_POLLED +void HalI2CPoll(void) +#else +HAL_ISR_FUNCTION(halI2CIsr, I2C_VECTOR) +#endif +{ + HAL_ENTER_ISR(); + + switch (I2CSTAT) + { + case slvAddrAckR: + if (i2cRxLen == 0) + { + i2cSlvRx(); // Block, receiving bytes from the Master. + } + else // Rx overrun. + { + volatile uint8 ch; + // Throw away these new bytes & leave old msg so no race with background HalI2CRead(). + I2C_SET_NACK(); + SLV_READ(ch); + I2C_CLR_NACK(); + } + + (void)i2cCB(i2cRxLen); // Alert Application that a Master Tx is ready to read. + break; + + case slvAddrAckW: + if (i2cTxLen != 0) + { + i2cSlvTx(); // Block, transmitting bytes to the Master. + } + else if (i2cCB(0) == FALSE) + { + I2C_SET_NACK(); + SLV_WRITE(0); + I2C_CLR_NACK(); + } + else + { + /* Slave will be clock-stretching, blocking master, until Application makes a HalI2CWrite(). + * While addressed as a slave, the I2C ISR keeps firing even though the I2CSTAT is not + * changing and the flags are cleared below. So this special ISR disable here to be + * re-enabled within the slave HalI2CWrite() function. + */ + I2C_INT_DISABLE(); + } + break; + + case i2cIdle: // Not expected, but not really an error, so no need to execute a STOP. + break; + + default: + I2C_STOP(); + I2C_CLR_NACK(); // Setup to Ack the next time addressed. + break; + } + + // Clear the CPU interrupt flag for Port_2 PxIFG has to be cleared before PxIF. + I2C_PXIFG = 0; + I2C_IF = 0; + + HAL_EXIT_ISR(); +} +#endif + +/************************************************************************************************** + * @fn HalI2CReady2Sleep + * + * @brief Determine whether the I2C is ready to sleep. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return 1 if the I2C is ready to sleep; 0 otherwise. + */ +uint8 HalI2CReady2Sleep(void) +{ + return ((i2cRxLen == 0) && (i2cTxLen == 0) && (I2CSTAT == i2cIdle)); +} + +/************************************************************************************************** + * @fn HalI2CEnterSleep + * + * @brief Save I2C state before entering a Power Mode. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CEnterSleep(void) +{ + i2cCfgSave = I2CCFG; + i2cAddrSave = I2CADDR; +} + +/************************************************************************************************** + * @fn HalI2CExitSleep + * + * @brief Restore I2C state after exiting a Power Mode. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CExitSleep(void) +{ + I2CCFG = i2cCfgSave; + I2CADDR = i2cAddrSave; +} + +#endif +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.h new file mode 100644 index 0000000..bea6e4c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_i2c.h @@ -0,0 +1,153 @@ +/************************************************************************************************** + Filename: hal_i2c.h + Revised: $Date: 2012-10-19 16:06:31 -0700 (Fri, 19 Oct 2012) $ + Revision: $Revision: 31875 $ + + Description: + + This module defines the HAL I2C API for the CC2533. Simplicity, speed and code size were the + priorities over multi-master and/or multi-slave support which can easily be added as an + enhancement to the detriment of the aforementioned. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_I2C_H +#define HAL_I2C_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" +#if (defined HAL_I2C) && (HAL_I2C == TRUE) + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#if !defined HAL_I2C_MASTER +#define HAL_I2C_MASTER FALSE +#endif + +#if !defined HAL_I2C_SLAVE +#if HAL_I2C_MASTER +#define HAL_I2C_SLAVE FALSE +#else +#define HAL_I2C_SLAVE TRUE +#endif +#endif + +#if HAL_I2C_MASTER +#define HAL_I2C_POLLED FALSE // Master does not use ISR and does not need periodic polling. +#else // if HAL_I2C_SLAVE +#if !defined HAL_I2C_POLLED +#define HAL_I2C_POLLED FALSE // Prefer the ISR as a Slave to speed reaction to Master READ req. +#endif +#endif + +#if !defined HAL_I2C_BUF_MAX +#define HAL_I2C_BUF_MAX 255 +#endif + +#define HAL_I2C_SLAVE_ADDR_DEF 0x41 + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +#if (HAL_I2C_BUF_MAX < 256) +typedef uint8 i2cLen_t; +#else +typedef uint16 i2cLen_t; +#endif + +#if HAL_I2C_MASTER +typedef enum { + i2cClock_123KHZ = 0x00, + i2cClock_144KHZ = 0x01, + i2cClock_165KHZ = 0x02, + i2cClock_197KHZ = 0x03, + i2cClock_33KHZ = 0x80, + i2cClock_267KHZ = 0x81, + i2cClock_533KHZ = 0x82 +} i2cClock_t; +#else // if HAL_I2C_SLAVE +/************************************************************************************************** + * @fn i2cCallback_t + * + * @brief Slave mode callback to Application to alert of a Master request to read or of + * received bytes from a Master write. + * + * input parameters + * + * @param cnt - Zero indicates Master read request and slave Tx buffer empty. Non-zero + * indicates the number of bytes received from a Master write, + * this data is in the slave Rx buffer, ready to be read. + * + * output parameters + * + * None. + * + * @return N/A when cnt is non-zero; otherwise TRUE if I2C should continue to clock stretch, + * FALSE to send a zero with last byte indication. + */ +typedef uint8 (*i2cCallback_t)(uint8 cnt); +#endif + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +#if HAL_I2C_MASTER +void HalI2CInit(i2cClock_t clockRate); +i2cLen_t HalI2CRead(uint8 address, i2cLen_t len, uint8 *pBuf); +i2cLen_t HalI2CWrite(uint8 address, i2cLen_t len, uint8 *pBuf); +#else +void HalI2CInit(uint8 address, i2cCallback_t i2cCallback); +i2cLen_t HalI2CRead(i2cLen_t len, uint8 *pBuf); +i2cLen_t HalI2CWrite(i2cLen_t len, uint8 *pBuf); +#if HAL_I2C_POLLED +void HalI2CPoll(void); +#endif +#endif +uint8 HalI2CReady2Sleep(void); +void HalI2CEnterSleep(void); +void HalI2CExitSleep(void); + +#endif +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_key.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_key.c new file mode 100644 index 0000000..b6ebc47 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_key.c @@ -0,0 +1,615 @@ +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-10-31 16:16:01 -0700 (Wed, 31 Oct 2012) $ + Revision: $Revision: 32004 $ + + Description: This file contains the interface to the HAL KEY Service. + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +/********************************************************************* + NOTE: If polling is used, the hal_driver task schedules the KeyRead() + to occur every 100ms. This should be long enough to naturally + debounce the keys. The KeyRead() function remembers the key + state of the previous poll and will only return a non-zero + value if the key state changes. + + NOTE: If interrupts are used, the KeyRead() function is scheduled + 25ms after the interrupt occurs by the ISR. This delay is used + for key debouncing. The ISR disables any further Key interrupt + until KeyRead() is executed. KeyRead() will re-enable Key + interrupts after executing. Unlike polling, when interrupts + are enabled, the previous key state is not remembered. This + means that KeyRead() will return the current state of the keys + (not a change in state of the keys). + + NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by + the ISR. Therefore, the joystick movements will only be detected + during a pushbutton interrupt caused by S1 or the center joystick + pushbutton. + + NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally + high state to a low state. This transition is typically clean. The + duration of the low state is around 200ms. When the signal returns + to the high state, there is a high likelihood of signal bounce, which + causes a unwanted interrupts. Normally, we would set the interrupt + edge to falling edge to generate an interrupt when S1 is pushed, but + because of the signal bounce, it is better to set the edge to rising + edge to generate an interrupt when S1 is released. The debounce logic + can then filter out the signal bounce. The result is that we typically + get only 1 interrupt per button push. This mechanism is not totally + foolproof because occasionally, signal bound occurs during the falling + edge as well. A similar mechanism is used to handle the joystick + pushbutton on the DB. For the EB, we do not have independent control + of the interrupt edge for the S1 and center joystick pushbutton. As + a result, only one or the other pushbuttons work reasonably well with + interrupts. The default is the make the S1 switch on the EB work more + reliably. + +*********************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_key.h" +#include "osal.h" +#include "osal_clock.h" +#include "hal_sleep.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +#define HAL_KEY_BIT0 0x01 +#define HAL_KEY_BIT1 0x02 +#define HAL_KEY_BIT2 0x04 +#define HAL_KEY_BIT3 0x08 +#define HAL_KEY_BIT4 0x10 +#define HAL_KEY_BIT5 0x20 +#define HAL_KEY_BIT6 0x40 +#define HAL_KEY_BIT7 0x80 + +#define HAL_KEY_RISING_EDGE 0 +#define HAL_KEY_FALLING_EDGE 1 + +#define HAL_KEY_PDUP2 0x80 +#define HAL_KEY_PDUP1 0x40 +#define HAL_KEY_PDUP0 0x20 + +#define HAL_KEY_DEBOUNCE_VALUE 25 // TODO: adjust this value +#define HAL_KEY_POLLING_VALUE 100 + +#define HAL_KEY_CODE_NOKEY 0xFF + +/* Define number of rows and columns in keypad matrix */ +#define HAL_KEY_NUM_ROWS 3 +#define HAL_KEY_NUM_COLUMNS 16 + +/* The following define which port pins are being used by keypad service */ +#define HAL_KEY_P0_GPIO_PINS ( HAL_KEY_BIT0 | HAL_KEY_BIT1 | HAL_KEY_BIT2 | HAL_KEY_BIT3 | HAL_KEY_BIT4) +#define HAL_KEY_P1_GPIO_PINS ( HAL_KEY_BIT4 ) + +/* These defines indicate the direction of each pin */ +#define HAL_KEY_P0_INPUT_PINS ( HAL_KEY_BIT0 | HAL_KEY_BIT1 | HAL_KEY_BIT2 ) +#define HAL_KEY_P0_OUTPUT_PINS ( HAL_KEY_BIT3 | HAL_KEY_BIT4 ) +#define HAL_KEY_P1_INPUT_PINS 0x00 +#define HAL_KEY_P1_OUTPUT_PINS ( HAL_KEY_BIT4 ) + +/* Which pins are used for key interrupts */ +#define HAL_KEY_P0_INTERRUPT_PINS ( HAL_KEY_BIT0 | HAL_KEY_BIT1 | HAL_KEY_BIT2 ) + +/* Defines for each output pin assignment */ +#define HAL_KEY_SHIFT_REGISTER_CLOCK_PIN P0_3 +#define HAL_KEY_SHIFT_REGISTER_POWER_PIN P0_4 +#define HAL_KEY_SHIFT_REGISTER_DATA_PIN P1_4 +#define HAL_KEY_SHIFT_REGISTER_POWER_OFF 0 +#define HAL_KEY_SHIFT_REGISTER_POWER_ON 1 + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +static uint8 halKeySavedKeys; /* used to store previous key state in polling mode */ +static halKeyCBack_t pHalKeyProcessFunction; +bool Hal_KeyIntEnable; /* interrupt enable/disable flag */ +uint8 halSaveIntKey; /* used by ISR to save state of interrupt-driven keys */ + +static uint8 HalKeyConfigured; +static uint8 halKeyTimerRunning; // Set to true while polling timer is running in interrupt + // enabled mode + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +void halProcessKeyInterrupt (void); +void halClockShiftRegister (void); +void halPowerDownShiftRegister (void); +void halSetShiftRegisterData( uint8 data ); +void halPowerUpShiftRegister( void ); + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +/************************************************************************************************** + * @fn HalKeyInit + * + * @brief Initilize Key Service + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalKeyInit( void ) +{ +#if (HAL_KEY == TRUE) + /* Initialize previous key to 0 */ + halKeySavedKeys = HAL_KEY_CODE_NOKEY; + + /* The advanced remote doesn't have the same 8X8 row/column matrix as in other + * products. Instead, a 3X16 row/column matrix is used, with the rows continuing + * to be utilized by GPIOs, but the columns are generated via a 16 bit + * shift register. Controls for the shift register are, however, utilized with + * GPIOs. + * + * Another difference is that the GPIOs utilized for the rows are split between + * P0 and P1. + */ + + /* Configure pin function as GPIO for pins related to keypad */ + P0SEL &= (uint8) ~HAL_KEY_P0_GPIO_PINS; + P1SEL &= (uint8) ~HAL_KEY_P1_GPIO_PINS; + + /* Configure direction of pins related to keypad */ + P0DIR |= (uint8) HAL_KEY_P0_OUTPUT_PINS; + P0DIR &= (uint8) ~HAL_KEY_P0_INPUT_PINS; + + P1DIR |= (uint8) HAL_KEY_P1_OUTPUT_PINS; + P1DIR &= (uint8) ~HAL_KEY_P1_INPUT_PINS; + + P0INP = 0x00; + + /* Turn off LED pins */ + P1_0 = P1_1 = P1_4 = 0x00; + + /* Set up initial value on output pins */ + halPowerDownShiftRegister(); + + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + /* Start with key is not configured */ + HalKeyConfigured = FALSE; + + halKeyTimerRunning = FALSE; +#endif /* HAL_KEY */ +} + +/************************************************************************************************** + * @fn HalKeyConfig + * + * @brief Configure the Key serivce + * + * @param interruptEnable - TRUE/FALSE, enable/disable interrupt + * cback - pointer to the CallBack function + * + * @return None + **************************************************************************************************/ +void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) +{ +#if (HAL_KEY == TRUE) + /* Enable/Disable Interrupt */ + Hal_KeyIntEnable = interruptEnable; + + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + + /* Determine if interrupt is enabled or not */ + if (Hal_KeyIntEnable) + { + /* Configure interrupt for falling edge */ + PICTL |= HAL_KEY_BIT0; + + /* Enable interrupts for individual port pins */ + P0IEN |= HAL_KEY_P0_INTERRUPT_PINS; + + /* Enable P0 interrupts */ + IEN1 |= HAL_KEY_BIT5; + + /* Do this only after the hal_key is configured - to work with sleep stuff */ + if (HalKeyConfigured == TRUE) + { + osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */ + } + } + else /* Interrupts NOT enabled */ + { + // disable interrupt + P0IEN &= ~(HAL_KEY_P0_INTERRUPT_PINS); + IEN1 &= ~(HAL_KEY_BIT5); + + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */ + } + + /* Key now is configured */ + HalKeyConfigured = TRUE; +#endif /* HAL_KEY */ +} + +/************************************************************************************************** + * @fn HalKeyRead + * + * @brief Read the current value of a key + * + * @param None + * + * @return keys - current keys status + **************************************************************************************************/ +uint8 HalKeyRead ( void ) +{ + uint8 colkeys = 0, rowkeys = 0; + uint8 keys, colcode = HAL_KEY_NUM_COLUMNS, rowcode = HAL_KEY_NUM_ROWS; + +#if (HAL_KEY == TRUE) + + // Disable interrupt, as interrupt can be triggered without key press during + // scanning process + P0IEN &= ~(HAL_KEY_P0_INTERRUPT_PINS); + + // Detect row first while all columns are still asserted. + keys = (P0 & HAL_KEY_P0_INPUT_PINS); + for (uint8 row = 0; row < HAL_KEY_NUM_ROWS; row++) + { + if (((1 << row) & keys) == 0) + { + if (++rowkeys == 1) + { + // remember first row code + rowcode = row; + } + else + { + // multiple key presses detected + break; + } + } + } + + /* Now check the columns. Since the pin supplying power to the shift register + * can't power all the KPa outputs, we will change the KPb pins to have pull down + * registers, which will result in all KPb pins reading 0. We will then shift 1 + * 1 through the shift register, and the column that is pressed will show up as + * a 1 on the corresponding KPb pin. + */ + P2INP |= HAL_KEY_BIT5; + halPowerUpShiftRegister(); + + // Wait some time for things to settle + halSleepWait( 50 ); + + /* Fix to address sending of false key release for power key and fav key */ + halSetShiftRegisterData( 0 ); + halClockShiftRegister(); + + /* Check each column by shifting a 1 through the shift register */ + halSetShiftRegisterData( 1 ); + halClockShiftRegister(); + halSetShiftRegisterData( 0 ); + + for (uint8 col = 0; col < HAL_KEY_NUM_COLUMNS; col++) + { + // read all rows + keys = (P0 & HAL_KEY_P0_INPUT_PINS); + + // de-assert the column + halClockShiftRegister(); + + // check whether the specific row was on. + if (keys & ((uint8)1 << rowcode)) + { + if (++colkeys == 1) + { + // remember first col code + colcode = col; + } + else + { + // multiple key presses detected + break; + } + } + } + + // assert all columns for interrupt and for lower current consumption + halPowerDownShiftRegister(); + + // change KPb pins back to pull up + P2INP &= ~HAL_KEY_BIT5; + + if (Hal_KeyIntEnable) + { + // clear interrupt flag. It is necessary since key scanning sets + // interrupt flag bits. + P0IFG = (uint8) (~HAL_KEY_P0_INTERRUPT_PINS); + P0IF = 0; + + // re-enable interrupts + P0IEN |= HAL_KEY_P0_INTERRUPT_PINS; + } + +#endif /* HAL_KEY */ + + // multiple key presses not supported + if ((colcode == HAL_KEY_NUM_COLUMNS) || + (rowcode == HAL_KEY_NUM_ROWS) || + (rowkeys > 1) || + (colkeys > 1)) + { + keys = HAL_KEY_CODE_NOKEY; // no key pressed + } + else + { + keys = (rowcode << 4) | colcode; + } + + return keys; +} + + +/************************************************************************************************** + * @fn HalKeyPoll + * + * @brief Called by hal_driver to poll the keys + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalKeyPoll (void) +{ +#if (HAL_KEY == TRUE) + + uint8 keys = 0; + + /* + * If interrupts are enabled, get the status of the interrupt-driven keys from 'halSaveIntKey' + * which is updated by the key ISR. If Polling, read these keys directly. + */ + keys = HalKeyRead(); + + /* Exit if polling and no keys have changed */ + if (!Hal_KeyIntEnable) + { + if (keys == halKeySavedKeys) + { + return; + } + halKeySavedKeys = keys; /* Store the current keys for comparation next time */ + } + + /* Invoke Callback if new keys were depressed */ + if ((keys != HAL_KEY_CODE_NOKEY || Hal_KeyIntEnable) && + (pHalKeyProcessFunction)) + { + // When interrupt is enabled, send HAL_KEY_CODE_NOKEY as well so that + // application would know the previous key is no longer depressed. + (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); + } + + if (Hal_KeyIntEnable) + { + if (keys != HAL_KEY_CODE_NOKEY) + { + // In order to trigger callback again as far as the key is depressed, + // timer is called here. + osal_start_timerEx(Hal_TaskID, HAL_KEY_EVENT, 50); + } + else + { + halKeyTimerRunning = FALSE; + } + } +#endif /* HAL_KEY */ + +} + +/************************************************************************************************** + * @fn halProcessKeyInterrupt + * + * @brief Checks to see if it's a valid key interrupt, saves interrupt driven key states for + * processing by HalKeyRead(), and debounces keys by scheduling HalKeyRead() 25ms later. + * + * @param + * + * @return + **************************************************************************************************/ +void halProcessKeyInterrupt (void) +{ + +#if (HAL_KEY == TRUE) + + if (P0IFG & HAL_KEY_P0_INTERRUPT_PINS) + { + // Disable interrupt + P0IEN &= (uint8) ~HAL_KEY_P0_INTERRUPT_PINS; + + // interrupt flag has been set + P0IFG = (uint8) (~HAL_KEY_P0_INTERRUPT_PINS); // clear interrupt flag + if (!halKeyTimerRunning) + { + halKeyTimerRunning = TRUE; + osalTimeUpdate(); + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); + } + // Enable interrupt + P0IEN |= HAL_KEY_P0_INTERRUPT_PINS; + } +#endif /* HAL_KEY */ +} + +/************************************************************************************************** + * @fn HalKeyEnterSleep + * + * @brief - Get called to enter sleep mode + * + * @param + * + * @return + **************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ + /* Sleep!!! + * Nothing to do. + */ +} + +/************************************************************************************************** + * @fn HalKeyExitSleep + * + * @brief - Get called when sleep is over + * + * @param + * + * @return - return saved keys + **************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wakeup!!! + * Nothing to do. In fact. HalKeyRead() may not be called here. + * Calling HalKeyRead() will trigger key scanning and interrupt flag clearing in the end, + * which is no longer compatible with hal_sleep.c module. + */ + /* Wake up and read keys */ + return TRUE; +} + +/*************************************************************************************************** + * INTERRUPT SERVICE ROUTINES + ***************************************************************************************************/ + +/************************************************************************************************** + * @fn halKeyPort0Isr + * + * @brief Port0 ISR + * + * @param + * + * @return + **************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) +{ + HAL_ENTER_ISR(); + + halProcessKeyInterrupt(); + +#if HAL_KEY + P0IFG = (uint8) (~HAL_KEY_P0_INTERRUPT_PINS); + P0IF = 0; +#endif + + HAL_EXIT_ISR(); +} + +/************************************************************************************************** + * @fn halClockShiftRegister + * + * @brief Simply provides a single clock pulse to the shift register. + * + * @param + * + * @return + **************************************************************************************************/ +void halClockShiftRegister( void ) +{ + HAL_KEY_SHIFT_REGISTER_CLOCK_PIN = 1; + HAL_KEY_SHIFT_REGISTER_CLOCK_PIN = 0; +} + +/************************************************************************************************** + * @fn halPowerDownShiftRegister + * + * @brief Disables the shift register to save power. + * + * @param + * + * @return + **************************************************************************************************/ +void halPowerDownShiftRegister( void ) +{ + HAL_KEY_SHIFT_REGISTER_CLOCK_PIN = 0; + HAL_KEY_SHIFT_REGISTER_POWER_PIN = HAL_KEY_SHIFT_REGISTER_POWER_OFF; + HAL_KEY_SHIFT_REGISTER_DATA_PIN = 0; +} + +/************************************************************************************************** + * @fn halPowerUpShiftRegister + * + * @brief Supplies power to the shift register. + * + * @param + * + * @return + **************************************************************************************************/ +void halPowerUpShiftRegister( void ) +{ + HAL_KEY_SHIFT_REGISTER_POWER_PIN = HAL_KEY_SHIFT_REGISTER_POWER_ON; +} + +/************************************************************************************************** + * @fn halSetShiftRegisterData + * + * @brief Writes data to the input of the shift register. + * + * @param + * + * @return + **************************************************************************************************/ +void halSetShiftRegisterData( uint8 data ) +{ + /* Data input is 1 bit, so make sure we only use LSB */ + HAL_KEY_SHIFT_REGISTER_DATA_PIN = (data & 0x01); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_mcu.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.c new file mode 100644 index 0000000..78b0a15 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.c @@ -0,0 +1,696 @@ +/************************************************************************************************** + Filename: hal_motion.c + Revised: $Date: 2012-10-19 16:06:31 -0700 (Fri, 19 Oct 2012) $ + Revision: $Revision: 31875 $ + + Description: This file contains the interface to the HAL Motion Sensor Service. + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_board_cfg.h" +#include "hal_accel.h" +#include "hal_defs.h" +#include "hal_gyro.h" +#include "hal_i2c.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_key.h" +#include "hal_motion.h" +#include "osal.h" +#include "osal_snv.h" + +/* Movea MotionSense Pointing Library */ +#include "AIR_MOTION_Lib.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +#define HAL_MOTION_TIME_BETWEEN_MEASUREMENTS 10 // in ms + +/* Number of gyro samples to take for calibration */ +#define HAL_MOTION_NUM_CAL_SAMPLES 8 + +/* Used to enable/disable roll (i.e. accelerometer) compensation */ +#define HAL_MOTION_ENABLE_ROLL_COMPENSATION TRUE + +/* SNV items */ +#if !defined HAL_MOTION_NV_ID_BEG +#define HAL_MOTION_NV_ID_BEG 0xF0 // chose something toward the end of application IDs per OSAL API +#endif + +#define HAL_MOTION_NV_ITEM_GYRO_OFFSETS_ID ( HAL_MOTION_NV_ID_BEG + 0 ) + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +enum +{ + HAL_MOTION_STATE_OFF, + HAL_MOTION_STATE_INIT, + HAL_MOTION_STATE_POWERING_ON, + HAL_MOTION_STATE_CALIBRATING, + HAL_MOTION_STATE_WAITING_FOR_NEXT_MEASUREMENT, + HAL_MOTION_STATE_MEASURING, + HAL_MOTION_STATE_STANDBY +}; +typedef uint8 halMotionState_t; + +typedef struct +{ + int8 gainX; + int8 gainY; +} halMotionGainSettings_t; + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +static halMotionCBack_t pHalMotionProcessFunction; +static halMotionCalCBack_t pHalMotionCalCompleteNotificationFunction; +static halMotionState_t HalMotionState = HAL_MOTION_STATE_OFF; +static bool HalMotionCalibrateGyro; + +static const halMotionGainSettings_t HalMotionMouseGainTable[] = +{ +#if (HAL_MOTION_ENABLE_ROLL_COMPENSATION == TRUE) + { 2, 2 }, + { 7, 7 }, + { 10, 10 }, + { 15, 15 } +#else + { 2, 2 }, + { 7, 7 }, + { 10, 10 }, + { 15, 15 } +#endif +}; +static uint8 HalMotionMouseGainTableIndex; + +#define HAL_MOTION_MOUSE_GAIN_TABLE_SIZE (sizeof(HalMotionMouseGainTable) / sizeof(HalMotionMouseGainTable[0])) +#define HAL_MOTION_DEFAULT_GAIN_TABLE_INDEX 1; + +static struct { int16 x,y,z; } HalMotionGyroOffsets; + +static const uint8 HalMotionDeviceAddressTable[] = +{ + HAL_GYRO_I2C_ADDRESS, + HAL_ACCEL_I2C_ADDRESS +}; + +static t_struct_AIR_MOTION_ProcessDeltaSamples samples; +static t_struct_AIR_MOTION_ProcessDeltaStatus motion_status; + +// Parameters for AIR_MOTION_Init motion_init() +static t_struct_AIR_MOTION_Init motion_init = { + 15, 15, // DeltaGain.X and DeltaGain.Y: The gain to apply along X and Y axis for computing deltas + 0, 0, 0, // GyroOffsets.X, GyroOffsets.Y, GyroOffsets.Z: Initial offset values to use for gyros X is not relevant for dual axis gyros. + 8, // GyroStaticMaxNoise: the max noise for detecting static position of gyroscope. When this value is exceed, the gyros will be supposed to move. + 400, // StaticSamples: Number of samples for detecting if gyroscope is static + 400, // SwipeDistMin: Minimum delta for detecting a swipe. Must be positive. Not relevant if swipes are not being used. + 512, // SwipeNoiseMax: Maximum delta for detecting a swipe. Must be positive. Not relevant if swipes are not being used. + 32, // NbSamplesGyroStartup: Number of mickeys to discard after starting up the gyroscope. + 40, // ClickStillSamples + AirMotionNormal, // ClickStillTolerance + HAL_MOTION_ENABLE_ROLL_COMPENSATION, // IsRollCompEnabled: If true, the roll compensation is enabled + 64, // AccNbLsb1G: 3-axis L2 norm measured on the accelerometer when the device is still. + 262 // GyroSensitivity: Gyroscope sensitivity (16*LSB / °/s) +}; + +static int HalNbSamplesCalCnt = 0; + +/************************************************************************************************** + * FUNCTIONS - Local + **************************************************************************************************/ +static void HalMotionHandleMeasurementStartEvent( void ); +static void HalMotionHandleCalPowerupDoneEvent( void ); +static void HalMotionHandleGyroActiveEvent( void ); +static void HalMotionGyroReady( void ); + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +/************************************************************************************************** + * @fn HalMotionInit + * + * @brief Initilize Motion Sensor Service + * + * @param none + * + * @return None + **************************************************************************************************/ +void HalMotionInit( void ) +{ + /* Initialize callback functions */ + pHalMotionProcessFunction = NULL; + pHalMotionCalCompleteNotificationFunction = NULL; + + /* Set up the I2C interface */ + HalI2CInit( i2cClock_267KHZ ); // I2C clock rate + + /* Initialize accelerometer and gyro */ + HalAccelInit(); + HalGyroInit(); + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_INIT; +} + +/************************************************************************************************** + * @fn HalMotionConfig + * + * @brief Configure the Motion Sensor serivce + * + * @param measCback - pointer to the motion sensor results data callback function + * + * @return None + **************************************************************************************************/ +void HalMotionConfig( halMotionCBack_t measCback ) +{ + uint8 snvStatus; + + /* Register the callback fucntion */ + pHalMotionProcessFunction = measCback; + + /* Set up data used by Movea's motion processing library */ + HalMotionMouseGainTableIndex = HAL_MOTION_DEFAULT_GAIN_TABLE_INDEX; + snvStatus = osal_snv_read( HAL_MOTION_NV_ITEM_GYRO_OFFSETS_ID, + sizeof( HalMotionGyroOffsets ), + (uint8 *)&HalMotionGyroOffsets ); + if (snvStatus != SUCCESS) + { + /* read failed, so use settings that indicate no bias is present */ + HalMotionGyroOffsets.x = 0; + HalMotionGyroOffsets.y = 0; + HalMotionGyroOffsets.z = 0; + } +} + +/************************************************************************************************** + * @fn HalMotionEnable + * + * @brief Enable Motion Sensor hardware + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalMotionEnable( void ) +{ + /* Reset Movea's motion processing library */ + motion_init.DeltaGain.X = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainX; + motion_init.DeltaGain.Y = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainY; + motion_init.GyroOffsets.X = HalMotionGyroOffsets.x; + motion_init.GyroOffsets.Y = HalMotionGyroOffsets.y; + motion_init.GyroOffsets.Z = HalMotionGyroOffsets.z; + + AIR_MOTION_Init(&motion_init); + + /* Configure gyro first, since it needs to be powered up before accelerometer + * can be configured (because we need to configure gyro's I2C as passthrough + * in order to communicate with the accelerometer). + */ + HalGyroEnable( HalMotionGyroReady ); + + /* Indicate we're not going to calibrate gyro when it settles */ + HalMotionCalibrateGyro = FALSE; + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_POWERING_ON; +} + +/************************************************************************************************** + * @fn HalMotionCal + * + * @brief Calibrate Motion Sensor hardware + * + * @param calCback - pointer to the motion sensor calibration complete callback function + * @param calDuration - duration, in milliseconds, of calibration procedure + * + * @return TRUE if calibration started. FALSE, otherwise. + **************************************************************************************************/ +uint8 HalMotionCal( halMotionCalCBack_t calCback, + uint16 calDuration ) +{ + if (HalMotionState == HAL_MOTION_STATE_INIT) + { + /* Register the callback fucntion */ + pHalMotionCalCompleteNotificationFunction = calCback; + + /* Start timer to wait for outputs to become stable */ + osal_start_timerEx( Hal_TaskID, + HAL_MOTION_GYRO_POWERUP_DONE_EVENT, + calDuration ); + + /* Reset the gyro offsets so library can calculate fresh ones */ + motion_init.GyroOffsets.X = 0; + motion_init.GyroOffsets.Y = 0; + motion_init.GyroOffsets.Z = 0; + AIR_MOTION_Init(&motion_init); + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_POWERING_ON; + + return TRUE; + } + + return FALSE; +} + +/************************************************************************************************** + * @fn HalMotionDisable + * + * @brief Disable Motion Sensor hardware + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalMotionDisable( void ) +{ + /* Power off gyro and accelerometer */ + HalGyroEnableI2CPassThru(); + HalAccelDisable(); + HalGyroDisable(); + + /* Stop sample collection */ + osal_stop_timerEx( Hal_TaskID, + HAL_MOTION_MEASUREMENT_START_EVENT ); + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_INIT; +} + +/************************************************************************************************** + * @fn HalMotionStandby + * + * @brief Places motion detection hardware in "standby" mode. This means the + * hardware is in a lower power state and will only be re-enabled if + * motion is detected. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalMotionStandby( void ) +{ + /* Stop sample collection */ + osal_stop_timerEx( Hal_TaskID, + HAL_MOTION_MEASUREMENT_START_EVENT ); + + /* Put accelerometer in motion detection mode */ + HalGyroEnableI2CPassThru(); + HalAccelMotionDetect( HalMotionEnable ); + + /* Power off gyro */ + HalGyroDisable(); + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_STANDBY; +} + +/************************************************************************************************** + * @fn HalMotionModifyAirMouseResolution + * + * @brief Increase/decrease air mouse movement resolution + * + * @param action - increase/decrease command + * + * @return None + **************************************************************************************************/ +void HalMotionModifyAirMouseResolution( halMotionMouseResolution_t action ) +{ + if (action == HAL_MOTION_RESOLUTION_INCREASE) + { + if (HalMotionMouseGainTableIndex < HAL_MOTION_MOUSE_GAIN_TABLE_SIZE - 1) + { + HalMotionMouseGainTableIndex += 1; + } + } + else + { + if (HalMotionMouseGainTableIndex > 0) + { + HalMotionMouseGainTableIndex -= 1; + } + } + + /* Re-initialize Movea's motion processing library */ + motion_init.DeltaGain.X = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainX; + motion_init.DeltaGain.Y = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainY; + motion_init.GyroOffsets.X = HalMotionGyroOffsets.x; + motion_init.GyroOffsets.Y = HalMotionGyroOffsets.y; + motion_init.GyroOffsets.Z = HalMotionGyroOffsets.z; + + AIR_MOTION_Init(&motion_init); +} + +/************************************************************************************************** + * @fn HalMotionHandleOSEvent + * + * @brief Handles Motion Sensor timer expiry, which means the gyro and + * accelerometer are ready to generate samples. + * + * @param OS Events that triggered call + * + * @return Event that was handled + **************************************************************************************************/ +uint16 HalMotionHandleOSEvent( uint16 events ) +{ + uint16 rtnVal = 0; + + if (events & HAL_MOTION_MEASUREMENT_START_EVENT) + { + HalMotionHandleMeasurementStartEvent(); + rtnVal = HAL_MOTION_MEASUREMENT_START_EVENT; + } + else if (events & HAL_MOTION_GYRO_POWERUP_DONE_EVENT) + { + HalMotionHandleCalPowerupDoneEvent(); + rtnVal = HAL_MOTION_GYRO_POWERUP_DONE_EVENT; + } + else if (events & HAL_GYRO_ACTIVE_EVENT) + { + HalMotionHandleGyroActiveEvent(); + rtnVal = HAL_GYRO_ACTIVE_EVENT; + } + else if (events & HAL_MOTION_DETECTED_EVENT) + { + halAccelProcessMotionDetectEvent(); + rtnVal = HAL_MOTION_DETECTED_EVENT; + } + + return rtnVal; +} + +/************************************************************************************************** + * @fn HalMotionGyroReady + * + * @brief Handles event indicating motion sensor hardware is powered up and + * ready to use. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void HalMotionGyroReady( void ) +{ + if (HalMotionState == HAL_MOTION_STATE_POWERING_ON) + { + if (HalMotionCalibrateGyro == FALSE) + { + HalGyroEnableI2CPassThru(); + HalAccelEnable(); + } + + HalGyroStartGyroMeasurements(); + + /* Start timer for taking measurements */ + osal_start_timerEx( Hal_TaskID, + HAL_GYRO_ACTIVE_EVENT, + 50 ); + } +} + +/************************************************************************************************** + * @fn HalMotionHandleGyroActiveEvent + * + * @brief Handles event indicating gyro should be producing samples. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void HalMotionHandleGyroActiveEvent( void ) +{ + if (HalMotionState == HAL_MOTION_STATE_POWERING_ON) + { + /* Start timer for taking measurements */ + osal_start_reload_timer( Hal_TaskID, + HAL_MOTION_MEASUREMENT_START_EVENT, + HAL_MOTION_TIME_BETWEEN_MEASUREMENTS ); + + if (HalMotionCalibrateGyro == FALSE) + { + /* Update state */ + HalMotionState = HAL_MOTION_STATE_WAITING_FOR_NEXT_MEASUREMENT; + } + else + { + /* Initiating a cal process ==> Reset Movea's motion processing library */ + motion_init.DeltaGain.X = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainX; + motion_init.DeltaGain.Y = HalMotionMouseGainTable[HalMotionMouseGainTableIndex].gainY; + motion_init.GyroOffsets.X = HalMotionGyroOffsets.x; + motion_init.GyroOffsets.Y = HalMotionGyroOffsets.y; + motion_init.GyroOffsets.Z = HalMotionGyroOffsets.z; + AIR_MOTION_Init(&motion_init); + } + } +} + +/************************************************************************************************** + * @fn HalMotionHandleCalPowerupDoneEvent + * + * @brief Handles event indicating gyro should be in a no motion condition + * and thus we can power it up and take some measurements for calibration. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalMotionHandleCalPowerupDoneEvent( void ) +{ + /* power up gyro */ + HalGyroEnable( HalMotionGyroReady ); + + /* Indicate we're going to run calibration */ + HalMotionCalibrateGyro = TRUE; + + /* Load counter of samples used during the calibration process */ + HalNbSamplesCalCnt = motion_init.StaticSamples * 2; +} + +/************************************************************************************************** + * @fn HalMotionHandleMeasurementStartEvent + * + * @brief Handles event indicating a new 10 msec measurement cycle has begun, + * so we should start taking samples. + * + * @param None + * + * @return None + **************************************************************************************************/ +static void HalMotionHandleMeasurementStartEvent( void ) +{ + if (HalMotionState == HAL_MOTION_STATE_WAITING_FOR_NEXT_MEASUREMENT) + { + int16 x, y, z; +#if (HAL_MOTION_ENABLE_ROLL_COMPENSATION == TRUE) + int8 ax, ay, az; +#endif + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_MEASURING; + + HalGyroRead(&x, &y, &z ); + + samples.GyroSamples.X = x; + samples.GyroSamples.Y = -y; + samples.GyroSamples.Z = z; + + /* Done with Gyro samples, now get Accelerometer samples */ +#if (HAL_MOTION_ENABLE_ROLL_COMPENSATION == TRUE) + HalGyroReadAccelData( &ax, &ay, &az ); + samples.AccSamples.X = ax; + samples.AccSamples.Y = ay; + samples.AccSamples.Z = -az; +#endif + + /* Done with samples, so call Movea library routine to process them */ + motion_status = AIR_MOTION_ProcessDelta(samples); + + /* Update state */ + HalMotionState = HAL_MOTION_STATE_WAITING_FOR_NEXT_MEASUREMENT; + + if (motion_status.Status.IsDeltaComputed) + { + /* Avalid delta was computed */ + /* Inform application that results are ready */ + if (pHalMotionProcessFunction != NULL) + { + pHalMotionProcessFunction( motion_status.Delta.X, + motion_status.Delta.Y ); + } + } + } + else if (HalMotionCalibrateGyro == TRUE && HalMotionState == HAL_MOTION_STATE_POWERING_ON) + { + // Currently calibrating + int16 x, y, z; +#if (HAL_MOTION_ENABLE_ROLL_COMPENSATION == TRUE) + int8 ax, ay, az; +#endif + + HalMotionState = HAL_MOTION_STATE_MEASURING; + + HalGyroRead( &x, &y, &z ); + + samples.GyroSamples.X = x; + samples.GyroSamples.Y = -y; + samples.GyroSamples.Z = z; + + /* Done with Gyro samples, now get Accelerometer samples */ +#if (HAL_MOTION_ENABLE_ROLL_COMPENSATION == TRUE) + HalGyroReadAccelData( &ax, &ay, &az ); + samples.AccSamples.X = ax; + samples.AccSamples.Y = ay; + samples.AccSamples.Z = -az; +#endif + + /* Done with samples, so call Movea library routine to process them */ + motion_status = AIR_MOTION_ProcessDelta(samples); + + if (motion_status.Status.NewGyroOffset == true) + { + // Found a new valid gyro offset + HalMotionGyroOffsets.x = motion_status.GyroOffsets.X; + HalMotionGyroOffsets.y = motion_status.GyroOffsets.Y; + HalMotionGyroOffsets.z = motion_status.GyroOffsets.Z; + + /* Store gyro offsets in NVM */ + (void) osal_snv_write( HAL_MOTION_NV_ITEM_GYRO_OFFSETS_ID, + sizeof( HalMotionGyroOffsets ), + (uint8 *)&HalMotionGyroOffsets ); + + /* Power down motion hardware and go back to initial state */ + HalMotionDisable(); + + /* Inform application that calibration is done */ + if (pHalMotionCalCompleteNotificationFunction != NULL) + { + pHalMotionCalCompleteNotificationFunction(); + } + } + else if (HalNbSamplesCalCnt == 0) + { + // Too many attempts ==> Reset the cal process: + if (pHalMotionCalCompleteNotificationFunction != NULL) + { + /* Inform application that the current calibration is still valid */ + pHalMotionCalCompleteNotificationFunction(); + } + HalMotionDisable(); + } + else + { + HalNbSamplesCalCnt--; + /* Update state */ + HalMotionState = HAL_MOTION_STATE_POWERING_ON; + } + } +} + +/************************************************************************************************** + * @fn HalMotionI2cRead + * + * @brief This function implements the I2C protocol to read from the IMU-3000 gyroscope. + * + * input parameters + * + * @param device - which device is being written + * addr - which register to read + * numBytes - number of bytes to read + * pBuf - pointer to buffer to place data + * + * output parameters + * + * None. + * + * @return None. + **************************************************************************************************/ +void HalMotionI2cRead( halMotionDevice_t device, uint8 addr, uint8 numBytes, uint8 *pBuf ) +{ + uint8 localAddr = addr; + + /* Send address we're reading from */ + HalI2CWrite( HalMotionDeviceAddressTable[device], 1, &localAddr ); + + /* Now read data */ + HalI2CRead( HalMotionDeviceAddressTable[device], numBytes, pBuf ); +} + +/************************************************************************************************** + * @fn HalMotionI2cWrite + * + * @brief This function implements the I2C protocol to write to the IMU-3000 gyroscope. + * + * input parameters + * + * @param device - which device is being written + * addr - which register to write + * pData - pointer to buffer containing data to be written + * numBytes - number of bytes of data to be written + * + * output parameters + * + * None. + * + * @return None. + **************************************************************************************************/ +void HalMotionI2cWrite( halMotionDevice_t device, uint8 addr, uint8 *pData, uint8 numBytes ) +{ + static uint8 HalMotionI2CBuf[20]; + uint8 i; + uint8 *pBuf = HalMotionI2CBuf; + + /* Copy address and data to local buffer for burst write */ + *pBuf++ = addr; + for (i = 0; i < numBytes; i++) + { + *pBuf++ = *pData++; + } + + /* Send address and data */ + HalI2CWrite( HalMotionDeviceAddressTable[device], numBytes + 1, HalMotionI2CBuf ); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.h new file mode 100644 index 0000000..2fe31b4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_motion.h @@ -0,0 +1,238 @@ +/************************************************************************************************** + Filename: hal_motion.h + Revised: $Date: 2012-05-29 16:28:12 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30649 $ + + Description: + + This file contains the declaration to the HAL Motion Sensor abstraction layer. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_MOTION_H +#define HAL_MOTION_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef void (*halMotionCBack_t) (int16 gyroMickeysX, int16 gyroMickeysY); +typedef void (*halMotionCalCBack_t) (void); + +enum +{ + HAL_MOTION_RESOLUTION_DECREASE, + HAL_MOTION_RESOLUTION_INCREASE +}; +typedef uint8 halMotionMouseResolution_t; + +enum +{ + HAL_MOTION_DEVICE_GYRO, + HAL_MOTION_DEVICE_ACCELEROMETER +}; +typedef uint8 halMotionDevice_t; + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ + +/************************************************************************************************** + * @fn HalMotionInit + * + * @brief This function initializes the HAL Motion Sensor abstraction layer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalMotionInit(void); + +/************************************************************************************************** + * @fn HalMotionConfig + * + * @brief This function configures the HAL Motion Sensor abstraction layer. + * + * input parameters + * + * @param measCback - Pointer to the application layer callback function for processing motion data + * + * output parameters + * + * None. + * + * @return None. + */ +void HalMotionConfig(halMotionCBack_t measCback); + +/************************************************************************************************** + * @fn HalMotionEnable + * + * @brief This function powers on the motion sensor hardware and starts the associated H/W timer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalMotionEnable(void); + +/************************************************************************************************** + * @fn HalMotionCal + * + * @brief Calibrate Motion Sensor hardware + * + * @param calCback - Pointer to the application layer callback function for notification of calibration complete + * @param calDuration - duration, in milliseconds, of calibration procedure + * + * @return TRUE if calibration started. FALSE, otherwise. + **************************************************************************************************/ +uint8 HalMotionCal( halMotionCalCBack_t calCback, + uint16 calDuration ); + +/************************************************************************************************** + * @fn HalMotionDisable + * + * @brief This function powers off the motion sensor hardware and stops the associated H/W timer. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalMotionDisable(void); + +/************************************************************************************************** + * @fn HalMotionStandby + * + * @brief Places motion detection hardware in "standby" mode. This means the + * hardware is in a lower power state and will only be re-enabled if + * motion is detected. + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalMotionStandby( void ); + +/************************************************************************************************** + * @fn HalMotionModifyAirMouseResolution + * + * @brief Increase/decrease air mouse movement resolution + * + * @param action - increase/decrease command + * + * @return None + **************************************************************************************************/ +void HalMotionModifyAirMouseResolution( halMotionMouseResolution_t action ); + +/************************************************************************************************** + * @fn HalMotionHandleOSEvent + * + * @brief Handles Motion Sensor OS Events + * + * @param OS Events that triggered call + * + * @return Event that was handled + **************************************************************************************************/ +uint16 HalMotionHandleOSEvent( uint16 events ); + +/************************************************************************************************** + * @fn HalMotionI2cRead + * + * @brief Reads registers from devices connected to I2C bus + * + * @param device - which device is being written + * addr - starting register address to read + * numBytes - Number of bytes to read + * pBuf - pointer to buffer to place read data + * + * @return None + **************************************************************************************************/ +void HalMotionI2cRead( halMotionDevice_t device, uint8 addr, uint8 numBytes, uint8 *pBuf ); + +/************************************************************************************************** + * @fn HalMotionI2cWrite + * + * @brief Writes registers on devices connected to I2C bus + * + * @param device - which device is being written + * addr - starting register address to write + * pData - pointer to buffer containing data to be written + * numBytes - Number of bytes to read + * + * @return None + **************************************************************************************************/ +void HalMotionI2cWrite( halMotionDevice_t device, uint8 addr, uint8 *pData, uint8 numBytes ); + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_sleep.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_sleep.c new file mode 100644 index 0000000..e5d3c4e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_sleep.c @@ -0,0 +1,641 @@ +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#include "hal_types.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_sleep.h" +#include "hal_led.h" +#include "hal_key.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "hal_drivers.h" +#include "hal_assert.h" +#include "ll_sleep.h" +#include "ll_timer2.h" +#include "ll_math.h" + +/******************************************************************************* + * MACROS + */ + +#ifndef HAL_SLEEP_DEBUG_POWER_MODE +// Set CC2540 power mode; always use PM2. +#define HAL_SLEEP_PREP_POWER_MODE(mode) \ + st( SLEEPCMD &= ~PMODE; /* clear mode bits */ \ + SLEEPCMD |= mode; /* set mode bits */ \ + while (!(STLOAD & LDRDY)); \ + halSleepPconValue = PCON_IDLE; \ + ) +#define HAL_SLEEP_SET_POWER_MODE() \ + halSetSleepMode() + +#else // HAL_SLEEP_DEBUG_POWER_MODE + +// Debug: Don't set power mode, just block until sleep timer interrupt. +#define HAL_SLEEP_PREP_POWER_MODE(mode) /* nothing */ +#define HAL_SLEEP_SET_POWER_MODE() \ + st( while(halSleepInt == FALSE); \ + halSleepInt = FALSE; \ + HAL_DISABLE_INTERRUPTS(); \ + ) +#endif // !HAL_SLEEP_DEBUG_POWER_MODE + +// sleep timer interrupt control +#define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;) // enable sleep timer interrupt +#define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;) // disable sleep timer interrupt +#define HAL_SLEEP_TIMER_CLEAR_INT() st(IRCON &= ~0x80;) // clear sleep interrupt flag + +// backup interrupt enable registers before sleep +#define HAL_SLEEP_IE_BACKUP_AND_DISABLE( ien0, ien1, ien2 ) \ + st( (ien0) = IEN0; \ + (ien1) = IEN1; \ + (ien2) = IEN2; \ + IEN0 &= STIE_BV; \ + IEN1 &= P0IE_BV; \ + IEN2 &= (P1IE_BV|P2IE_BV); \ + ) + +// restore interrupt enable registers before sleep +#define HAL_SLEEP_IE_RESTORE( ien0, ien1, ien2 ) \ + st( IEN0 = (ien0); \ + IEN1 = (ien1); \ + IEN2 = (ien2); \ + ) + +// convert msec to 625 usec units with round +#define HAL_SLEEP_MS_TO_625US( ms ) (((((uint32) (ms)) * 8) + 4) / 5) + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 +#define HAL_SLEEP_MS_TO_32KHZ( ms ) ((((uint32) (ms)) * 4096) / 125) + +//Max 16 bit value +#define MAX_16BIT_TIMEOUT 0xFFFF + +#if !defined NOP +#define NOP() asm("NOP") +#endif + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). +#define CC2540_PM0 0 // PM0, Clock oscillators on, voltage regulator on +#define CC2540_PM1 1 // PM1, 32.768 kHz oscillators on, voltage regulator on +#define CC2540_PM2 2 // PM2, 32.768 kHz oscillators on, voltage regulator off +#define CC2540_PM3 3 // PM3, All clock oscillators off, voltage regulator off + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. +#define HAL_SLEEP_OFF CC2540_PM0 +#define HAL_SLEEP_TIMER CC2540_PM2 +#define HAL_SLEEP_DEEP CC2540_PM3 + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms +#define MAX_SLEEP_TIME 16711680 // max time to sleep allowed by ST, in 32kHz ticks + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period +#if !defined (PM_MIN_SLEEP_TIME) +#define PM_MIN_SLEEP_TIME 66 // default to min safe sleep time, in 32kHz ticks +#endif // !PM_MIN_SLEEP_TIME + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). +#if defined( CC2541) || defined( CC2541S ) +#define HAL_SLEEP_ADJ_TICKS 25 // default sleep adjustment, in 32kHz ticks +#else // CC2540 +#define HAL_SLEEP_ADJ_TICKS 35 // default sleep adjustment, in 32kHz ticks +#endif // CC2541 || CC2541S + +// sleep and external interrupt port masks +#define STIE_BV BV(5) +#define P0IE_BV BV(5) +#define P1IE_BV BV(4) +#define P2IE_BV BV(1) + +// for optimized indexing of uint32 +#if HAL_MCU_LITTLE_ENDIAN() +#define UINT32_NDX0 0 +#define UINT32_NDX1 1 +#define UINT32_NDX2 2 +#define UINT32_NDX3 3 +#else +#define UINT32_NDX0 3 +#define UINT32_NDX1 2 +#define UINT32_NDX2 1 +#define UINT32_NDX3 0 +#endif // HAL_MCU_LITTLE_ENDIAN() + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = HAL_SLEEP_OFF; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE +static bool halSleepInt = FALSE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = PCON_IDLE; + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + HAL_DISABLE_INTERRUPTS(); +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + + halDriverBegPM(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + if (osal_timeout > MAX_16BIT_TIMEOUT) + { + osal_timeout = MAX_16BIT_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( (halPwrMgtMode == CC2540_PM3), wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + + halDriverEndPM(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/************************************************************************************************** + * @fn halSleepWait + * + * @brief Perform a blocking wait for the specified number of microseconds. + * Use assumptions about number of clock cycles needed for the various instructions. + * This function assumes a 32 MHz clock. + * NB! This function is highly dependent on architecture and compiler! + * + * input parameters + * + * @param duration - Duration of wait in microseconds. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +#pragma optimize=none +void halSleepWait(uint16 duration) +{ + duration >>= 1; + + while (duration-- > 0) + { + NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); + NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); + } +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_types.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdbool.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdbool.h new file mode 100644 index 0000000..44610f3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdbool.h @@ -0,0 +1,15 @@ +// If the compiler have not this file +#ifndef __STDBOOL_H +#define __STDBOOL_H + + + +#define true 1 +#define false 0 + +#define __bool_true_false_are_defined 1 + +#define bool char + +#endif // __STDBOOL_H + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdint.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdint.h new file mode 100644 index 0000000..a4fabbb --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ARC/stdint.h @@ -0,0 +1,19 @@ +// If the compiler have not this file +#ifndef __STDINT_H +#define __STDINT_H + + +// 8 bits +typedef signed char int8_t; +typedef unsigned char uint8_t; + +// 16bits +typedef signed short int16_t; +typedef unsigned short uint16_t; + +// 32 bits +typedef signed long int32_t; +typedef unsigned long uint32_t; + + +#endif // __STDINT_H diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.c new file mode 100644 index 0000000..caaa8f0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.c @@ -0,0 +1,283 @@ +/************************************************************************************************** + Filename: hal_acc.c + Revised: $Date: 2013-03-26 07:47:25 -0700 (Tue, 26 Mar 2013) $ + Revision: $Revision: 33597 $ + + Description: Driver for the Kionix KXTI9 Accelerometer. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ + +#include "hal_acc.h" +#include "hal_sensor.h" +#include "hal_i2c.h" +#include "hal_board_cfg.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +// Sensor I2C address +#define HAL_KXTI9_I2C_ADDRESS 0x0F + +// KXTI9 register addresses +#define ACC_REG_ADDR_XOUT_HPF_L 0x00 // R +#define ACC_REG_ADDR_XOUT_HPF_H 0x01 // R +#define ACC_REG_ADDR_YOUT_HPF_L 0x02 // R +#define ACC_REG_ADDR_YOUT_HPF_H 0x03 // R +#define ACC_REG_ADDR_ZOUT_HPF_L 0x04 // R +#define ACC_REG_ADDR_ZOUT_HPF_H 0x05 // R +#define ACC_REG_ADDR_XOUT_L 0x06 // R +#define ACC_REG_ADDR_XOUT_H 0x07 // R +#define ACC_REG_ADDR_YOUT_L 0x08 // R +#define ACC_REG_ADDR_YOUT_H 0x09 // R +#define ACC_REG_ADDR_ZOUT_L 0x0A // R +#define ACC_REG_ADDR_ZOUT_H 0x0B // R +#define ACC_REG_ADDR_DCST_RESP 0x0C // R +#define ACC_REG_ADDR_WHO_AM_I 0x0F // R +#define ACC_REG_ADDR_TILT_POS_CUR 0x10 // R +#define ACC_REG_ADDR_TILT_POS_PRE 0x11 // R + +#define ACC_REG_ADDR_INT_SRC_REG1 0x15 // R +#define ACC_REG_ADDR_INT_SRC_REG2 0x16 // R +#define ACC_REG_ADDR_STATUS_REG 0x18 // R +#define ACC_REG_ADDR_INT_REL 0x1A // R + +#define ACC_REG_ADDR_CTRL_REG1 0x1B // R/W +#define ACC_REG_ADDR_CTRL_REG2 0x1C // R/W +#define ACC_REG_ADDR_CTRL_REG3 0x1D // R/W + +#define ACC_REG_ADDR_INT_CTRL_REG1 0x1E // R/W +#define ACC_REG_ADDR_INT_CTRL_REG2 0x1F // R/W +#define ACC_REG_ADDR_INT_CTRL_REG3 0x20 // R/W +#define ACC_REG_ADDR_DATA_CTRL_REG 0x21 // R/W + +#define ACC_REG_ADDR_TILT_TIMER 0x28 // R/W +#define ACC_REG_ADDR_WUF_TIMER 0x29 // R/W +#define ACC_REG_ADDR_TDT_TIMER 0x2B // R/W +#define ACC_REG_ADDR_TDT_H_THRESH 0x2C // R/W +#define ACC_REG_ADDR_TDT_L_THRESH 0x2D // R/W +#define ACC_REG_ADDR_TDT_TAP_TIMER 0x2E // R/W +#define ACC_REG_ADDR_TDT_TOTAL_TIMER 0x2F // R/W +#define ACC_REG_ADDR_TDT_LATENCY_TIMER 0x30 // R/W +#define ACC_REG_ADDR_TDT_WINDOW_TIMER 0x31 // R/W + +#define ACC_REG_ADDR_BUF_CTRL1 0x32 // R/W +#define ACC_REG_ADDR_BUF_CTRL2 0x33 // R/W +#define ACC_REG_ADDR_BUF_STATUS_REG1 0x34 // R +#define ACC_REG_ADDR_BUF_STATUS_REG2 0x35 // R/W +#define ACC_REG_ADDR_BUF_CLEAR 0x36 // W + +#define ACC_REG_ADDR_SELF_TEST 0x3A // R/W + +#define ACC_REG_ADDR_WUF_THRESH 0x5A // R/W +#define ACC_REG_ADDR_TILT_ANGLE 0x5C // R/W +#define ACC_REG_ADDR_HYST_SET 0x5F // R/W +#define ACC_REG_ADDR_BUF_READ 0x7F // R/W + +// Select register valies +#define REG_VAL_WHO_AM_I 0x08 // (data sheet says 0x04) + +// CTRL1 BIT MASKS +#define ACC_REG_CTRL_PC 0x80 // Power control '1' On '0' Off +#define ACC_REG_CTRL_RES 0x40 // Resolution '1' High '0' Low +#define ACC_REG_CTRL_DRDYE 0x20 // Data Ready '1' On '0' Off +#define ACC_REG_CTRL_GSEL_HI 0x10 // Range '00' +/-2g '01' +/-4g +#define ACC_REG_CTRL_GSEL_LO 0x08 // '10' +/-8g '11' N/A +#define ACC_REG_CTRL_GSEL_TDTE 0x04 // Directional Tap '1' On '0' Off +#define ACC_REG_CTRL_GSEL_WUFE 0x02 // Wake Up '1' On '0' Off +#define ACC_REG_CTRL_GSEL_TPE 0x01 // Tilt Position '1' On '0' Off + +#ifdef ACC_RANGE_8G +// Range +- 8G +#define ACC_REG_CTRL_ON ( ACC_REG_CTRL_PC | ACC_REG_CTRL_GSEL_HI) +#define ACC_REG_CTRL_OFF ( ACC_REG_CTRL_GSEL_HI) +#else +// Range +- 2G +#define ACC_REG_CTRL_ON ( ACC_REG_CTRL_PC ) +#define ACC_REG_CTRL_OFF ( 0 ) +#endif + +/* ------------------------------------------------------------------------------------------------ +* Typedefs +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Macros +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalAccSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 accSensorConfig; +static uint8 accSensorOff; + +/************************************************************************************************** +* @fn HalAccInit +* +* @brief This function initializes the HAL Accelerometer abstraction layer. +* +* @return None. +*/ +void HalAccInit(void) +{ + accSensorConfig = ACC_REG_CTRL_ON; + accSensorOff = ACC_REG_CTRL_OFF; +} + + +/************************************************************************************************** +* @fn HalAccRead +* +* @brief Read data from the accelerometer - X, Y, Z - 3 bytes +* +* @return TRUE if valid data, FALSE if not +*/ +bool HalAccRead(uint8 *pBuf ) +{ + uint8 x; + uint8 y; + uint8 z; + bool success; + + // Select this sensor + HalAccSelect(); + + HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG1, &accSensorConfig, sizeof(accSensorConfig)); + + // Wait for measurement ready (appx. 1.45 ms) + ST_HAL_DELAY(180); + + // Read the three registers + success = HalSensorReadReg( ACC_REG_ADDR_XOUT_H, &x, sizeof(x)); + if (success) + { + success = HalSensorReadReg( ACC_REG_ADDR_YOUT_H, &y, sizeof(y)); + if (success) + { + success = HalSensorReadReg( ACC_REG_ADDR_ZOUT_H, &z, sizeof(z)); + } + } + + if (success) + { + // Valid data + pBuf[0] = x; + pBuf[1] = y; + pBuf[2] = z; + } + + HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG1, &accSensorOff, sizeof(accSensorOff)); + + return success; +} + + +/************************************************************************************************** + * @fn HalAccTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + */ +bool HalAccTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalAccSelect(); + + // Check the DCST_RESP (pattern 0x55) + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_DCST_RESP, &val, 1)); + ST_ASSERT(val==0x55); + + // Check the DCST_RESP (pattern 0xAA) + val = 0x10; // Sets the DCST bit + ST_ASSERT(HalSensorWriteReg(ACC_REG_ADDR_CTRL_REG3, &val, 1)); + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_DCST_RESP, &val, 1)); + ST_ASSERT(val==0xAA); + + // Check the WHO AM I register + ST_ASSERT(HalSensorReadReg(ACC_REG_ADDR_WHO_AM_I, &val, 1)); + ST_ASSERT(val==REG_VAL_WHO_AM_I); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalAccSelect +* +* @brief Select the accelerometer on the I2C-bus +* +* @return +*/ +static void HalAccSelect(void) +{ + //Set up I2C that is used to communicate with SHT21 + HalI2CInit(HAL_KXTI9_I2C_ADDRESS,i2cClock_267KHZ); +} + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcAccel(int8 rawX) +{ + float v; + + //-- calculate acceleration, unit G, range -2, +2 + v = (rawX * 1.0) / (256/4); + + return v; +} +*/ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.h new file mode 100644 index 0000000..1344758 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_acc.h @@ -0,0 +1,83 @@ +/************************************************************************************************** + Filename: hal_acc.h + Revised: $Date: 2013-03-25 07:58:08 -0700 (Mon, 25 Mar 2013) $ + Revision: $Revision: 33575 $ + + Description: This file contains the declaration to the HAL KXTI9 abstraction layer. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_ACC_H +#define HAL_ACC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + + /* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalAccInit(void); +bool HalAccRead(uint8 *pBuf); +bool HalAccTest(void); + + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.c new file mode 100644 index 0000000..6599067 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.c @@ -0,0 +1,422 @@ +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "osal.h" +#include "hal_aes.h" +#include "hal_dma.h" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)NULL; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_DEST( ch, HAL_AES_IN_ADDR ); /* Input of the AES module */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_DW ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 ); /* The address for data fetch is incremented by 1 byte */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 ); /* The destination address is constant */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_SOURCE( ch, HAL_AES_OUT_ADDR ); /* Start address of the segment */ + HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /* Using the length field */ + HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /* One byte is transferred each time */ + HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE ); /* A single byte is transferred each time */ + HAL_DMA_SET_TRIG_SRC( ch, HAL_DMA_TRIG_ENC_UP ); /* Setting the AES module to generate the DMA trigger */ + HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); /* The address for data fetch is constant */ + HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); /* The destination address is incremented by 1 byte */ + HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); /* The DMA complete interrupt flag is not set at completion */ + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); /* Transferring all 8 bits in each byte */ + HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH ); /* DMA has priority */ +} +#endif + +#if (!defined HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +/****************************************************************************** + * @fn AesLoadBlock + * + * @brief Write a block to AES engine + * + * input parameters + * + * @param ptr - Pointer to date to be written. + * + * @return None + */ +void AesLoadBlock( uint8 *ptr ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy block to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *ptr++; + } +} + +/****************************************************************************** + * @fn AesStartBlock + * + * @brief Write and read a block to and from the AES engine + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartBlock( uint8 *out, uint8 *in ) +{ + uint8 i; + + /* Kick it off */ + AES_START(); + + /* Copy data to encryption input register */ + for (i = 0; i < STATE_BLENGTH; i++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryption output register to out */ + for (i = 0; i < STATE_BLENGTH; i++) + { + *out++ = ENCDO; + } +} + +/****************************************************************************** + * @fn AesStartShortBlock + * + * @brief Write and read a block to and from the AES engine. When using CFB, + * OFB, and CTR mode, the 128 bits blocks are divided into four 32 bit + * blocks. + * + * input parameters + * + * @param out - Pointer to result to be read. + * in - pointer to data to be written. + * + * @return None + */ +void AesStartShortBlock( uint8 *out, uint8 *in ) +{ + uint8 i, j; + + AES_START(); + for (i = 0; i < 4; i++) + { + /* Copy in block to encryption input register */ + for (j = 0; j < 4; j++) + { + ENCDI = *in++; + } + + /* Delay is required for non-DMA AES */ + HAL_AES_DELAY(); + + /* Copy encryptioon output register to out block */ + for (j = 0; j < 4; j++) + { + *out++ = ENCDO; + } + } +} +#endif + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, IV ); + HAL_DMA_SET_LEN( ch, STATE_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_IV ); + + /* Load the block */ + AesLoadBlock( IV ); +#endif +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + halDMADesc_t *ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + + /* Modify descriptors for channel 1 */ + HAL_DMA_SET_SOURCE( ch, AesKey ); + HAL_DMA_SET_LEN( ch, KEY_BLENGTH ); + + /* Arm DMA channel 1 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Kick it off, block until AES is ready */ + AES_START(); + while( !(ENCCS & 0x08) ); +#else + /* Set AES mode */ + AES_SET_ENCR_DECR_KEY_IV( AES_LOAD_KEY ); + + /* Load the block */ + AesLoadBlock( AesKey ); +#endif +} + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_IN ); + HAL_DMA_SET_SOURCE( ch, msg_in ); + HAL_DMA_SET_LEN( ch, msg_in_len ); + + /* Modify descriptors for channel 2 */ + ch = HAL_DMA_GET_DESC1234( HAL_DMA_AES_OUT ); + HAL_DMA_SET_DEST( ch, Cstate ); + HAL_DMA_SET_LEN( ch, msg_out_len ); + + /* Arm DMA channels 1 and 2 */ + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_IN ); + HAL_DMA_ARM_CH( HAL_DMA_AES_IN ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_IN)); + HAL_DMA_CLEAR_IRQ( HAL_DMA_AES_OUT ); + HAL_DMA_ARM_CH( HAL_DMA_AES_OUT ); + do { + asm("NOP"); + } while (!HAL_DMA_CH_ARMED(HAL_DMA_AES_OUT)); +} +#endif + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Init DMA channels 1 and 2 */ + aesDmaInit(); +#endif +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + AES_SETMODE(ECB); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + +#if (defined HAL_AES_DMA) && (HAL_AES_DMA == TRUE) + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, STATE_BLENGTH, Cstate, STATE_BLENGTH ); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Kick it off, block until DMA is done */ + AES_START(); + while( !HAL_DMA_CHECK_IRQ( HAL_DMA_AES_OUT ) ); +#else + /* Set ECB mode for AES encryption */ + AES_SETMODE(ECB); + AES_SET_ENCR_DECR_KEY_IV( AES_ENCRYPT ); + + /* Load and start the block */ + AesStartBlock( Cstate, Cstate ); +#endif +} diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.h new file mode 100644 index 0000000..6512b3a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_aes.h @@ -0,0 +1,126 @@ +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_AES_H_ +#define HAL_AES_H_ + +#include "hal_types.h" + +#define STATE_BLENGTH 16 // Number of bytes in State +#define KEY_BLENGTH 16 // Number of bytes in Key +#define KEY_EXP_LENGTH 176 // Nb * (Nr+1) * 4 + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ +#if ((defined SOFTWARE_AES) && (SOFTWARE_AES == TRUE)) && ((defined SW_AES_AND_KEY_EXP) && (SW_AES_AND_KEY_EXP == TRUE)) +#error "SOFTWARE_AES and SW_AES_AND_KEY_EXP cannot be both defined." +#endif + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status +#define AES_BUSY 0x08 +#define ENCRYPT 0x00 +#define DECRYPT 0x01 + +// Macro for setting the mode of the AES operation +#define AES_SETMODE(mode) \ + do { \ + ENCCS = (ENCCS & ~0x70) | (mode); \ + } while (0) + +// AES Modes +#define CBC 0x00 +#define CFB 0x10 +#define OFB 0x20 +#define CTR 0x30 +#define ECB 0x40 +#define CBC_MAC 0x50 + +// Macro for issuing AES command +#define AES_SET_ENCR_DECR_KEY_IV(cmd) \ + do { \ + ENCCS = (ENCCS & ~0x07) | (cmd); \ + } while(0) + +// AES Commands +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. +#define AES_START() ENCCS |= 0x01 + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ +#define HAL_DMA_AES_IN 1 +#define HAL_DMA_AES_OUT 2 + +/* AES registers */ +#define HAL_AES_IN_ADDR 0x70B1 +#define HAL_AES_OUT_ADDR 0x70B2 + +#if !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) +#define HAL_AES_DELAY() \ + do { \ + volatile uint8 delay = 15; \ + while(delay--); \ + } while(0) +#endif // !defined (HAL_AES_DMA) || (HAL_AES_DMA == FALSE) + +#endif // HAL_AES_H_ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_assert.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_assert.c new file mode 100644 index 0000000..3e6097c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_assert.c @@ -0,0 +1,136 @@ +/************************************************************************************************** + Filename: hal_assert.c + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_types.h" +#include "hal_board.h" +#include "hal_defs.h" +#include "hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants and macros + * ------------------------------------------------------------------------------------------------ + */ +#ifdef HAL_LED_BLINK_DELAY +#undef HAL_LED_BLINK_DELAY +#endif + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x1450; i++) { }; } ) // was: 0x5800 + +/* ------------------------------------------------------------------------------------------------ + * Local Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHazardLights(void); + + +/************************************************************************************************** + * @fn halAssertHandler + * + * @brief Logic to handle an assert. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHandler(void) +{ + /* execute code that handles asserts */ +#ifdef ASSERT_RESET + HAL_SYSTEM_RESET(); +#elif !defined ASSERT_WHILE + halAssertHazardLights(); +#else + while(1); +#endif +} + +#if !defined ASSERT_WHILE +/************************************************************************************************** + * @fn halAssertHazardLights + * + * @brief Blink LEDs to indicate an error. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +void halAssertHazardLights(void) +{ + + /* disable all interrupts before anything else */ + HAL_DISABLE_INTERRUPTS(); + + /*------------------------------------------------------------------------------- + * Master infinite loop. + */ + for (;;) + { + HAL_LED_BLINK_DELAY(); + + /* toggle LEDS */ + HAL_TOGGLE_LED1(); + HAL_TOGGLE_LED2(); + } +} +#endif + +/* ------------------------------------------------------------------------------------------------ + * Compile Time Assertions + * ------------------------------------------------------------------------------------------------ + */ + +/* integrity check of type sizes */ +HAL_ASSERT_SIZE( int8, 1); +HAL_ASSERT_SIZE( uint8, 1); +HAL_ASSERT_SIZE( int16, 2); +HAL_ASSERT_SIZE(uint16, 2); +HAL_ASSERT_SIZE( int32, 4); +HAL_ASSERT_SIZE(uint32, 4); + + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.c new file mode 100644 index 0000000..54744c7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.c @@ -0,0 +1,354 @@ +/************************************************************************************************** + Filename: hal_bar.c + Revised: $Date: 2012-08-17 08:49:24 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31282 $ + + Description: Driver for the TDK/EPCOS T5400/C953 pressure sensor + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*************************************************************************************************/ + +/* ----------------------------------------------------------------------------------------------- +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_bar.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +// Sensor I2C address +#define HAL_C953_I2C_ADDRESS 0x77 + +// C953 data lengths +#define C953_DATA_LEN 2 +#define C953_CAL_LEN 16 + +// C953 Register Addresses +#define C953_REG_ADDR_IFACE_SETTINGS 0x87 // Read/Write +#define C953_REG_ADDR_I2C_SLAVE 0x88 // Read +#define C953_REG_ADDR_RESET 0xF0 // Read/Write +#define C953_REG_ADDR_COMMAND 0xF1 // Read/Write +#define C953_REG_ADDR_TEMP_LSB 0xF3 // Read +#define C953_REG_ADDR_TEMP_MSB 0xF4 // Read +#define C953_REG_ADDR_PRESS_LSB 0xF5 // Read +#define C953_REG_ADDR_PRESS_MSB 0xF6 // Read + +// C953 Register Addresses for calibration coefficients +#define C953_REG_CALIBRATION_1_LSB 0x8E +#define C953_REG_CALIBRATION_1_MSB 0x8F +#define C953_REG_CALIBRATION_2_LSB 0x90 +#define C953_REG_CALIBRATION_2_MSB 0x91 +#define C953_REG_CALIBRATION_3_LSB 0x92 +#define C953_REG_CALIBRATION_3_MSB 0x93 +#define C953_REG_CALIBRATION_4_LSB 0x94 +#define C953_REG_CALIBRATION_4_MSB 0x95 +#define C953_REG_CALIBRATION_5_LSB 0x96 +#define C953_REG_CALIBRATION_5_MSB 0x97 +#define C953_REG_CALIBRATION_6_LSB 0x98 +#define C953_REG_CALIBRATION_6_MSB 0x99 +#define C953_REG_CALIBRATION_7_LSB 0x9A +#define C953_REG_CALIBRATION_7_MSB 0x9B +#define C953_REG_CALIBRATION_8_LSB 0x9C +#define C953_REG_CALIBRATION_8_MSB 0x9D + +// C953 Resolution Setting Bit Masks +#define C953_LOW_RES_LOW 0x00 // 2 ms Conversion Time +#define C953_LOW_RES_STANDARD 0x08 // 8 ms Conversion Time +#define C953_LOW_RES_HIGH 0x10 // 16 ms Conversion Time +#define C953_LOW_RES_ULTRA_HIGH 0x18 // 64 ms Conversion Time + +// C953 Measurment Option Bit Masks +#define C953_PRESSURE_ONLY 0x00 // Execute Pressure Measurement Only +#define C953_TEMPERATURE_ONLY 0x02 // Execute Temperature Measurement Only + +// C953 Commands +#define C953_TEMP_READ_COMMAND ( C953_TEMPERATURE_ONLY | C953_LOW_RES_LOW | 0x01 ) +#define C953_PRESS_READ_COMMAND ( C953_PRESSURE_ONLY | C953_LOW_RES_LOW | 0x01 ) +#define C953_OFF_COMMAND 0x00 +#define C953_RESET_COMMAND 0x73 +#define C953_TEST_COMMAND 0x1E // For R/W test of register + +/* ------------------------------------------------------------------------------------------------ +* Type Definitions +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalBarSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 barData[4]; +static uint8 barCmd = C953_TEMP_READ_COMMAND; +static bool fCmdOk; + +/************************************************************************************************** + * @fn HalBarInit + * + * @brief Initalise the driver + * + * @return none + */ +void HalBarInit(void) +{ + uint8 val = C953_OFF_COMMAND; + + HalBarSelect(); + HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val)); + barCmd = C953_TEMP_READ_COMMAND; +} + + +/************************************************************************************************** + * @fn HalBarStartMeasurement + * + * @brief Start a conversion + * + * @return none + */ +void HalBarStartMeasurement(void) +{ + HalBarSelect(); + fCmdOk = HalSensorWriteReg(C953_REG_ADDR_COMMAND, &barCmd, sizeof(barCmd)); +} + + +/************************************************************************************************** + * @fn HalBarReadMeasurement + * + * @brief Get temperature and pressure data (alternate reads) + * + * @param pBuf - buffer for temperature and pressure (4 bytes) + * + * @return TRUE if valid data + */ +bool HalBarReadMeasurement(uint8 *pBuf) +{ + bool success; + uint8 dOffset = 0; + + if (!fCmdOk) + { + return FALSE; + } + + HalBarSelect(); + + if (barCmd==C953_PRESS_READ_COMMAND) + { + dOffset = 2; + } + + success = HalSensorReadReg( C953_REG_ADDR_PRESS_LSB, &barData[dOffset], C953_DATA_LEN ); + if (success) + { + pBuf[0] = barData[0]; + pBuf[1] = barData[1]; + pBuf[2] = barData[2]; + pBuf[3] = barData[3]; + + // Alternate + if (barCmd==C953_PRESS_READ_COMMAND) + { + barCmd = C953_TEMP_READ_COMMAND; + } else + { + barCmd = C953_PRESS_READ_COMMAND; + } + } + + return success; +} + + +/************************************************************************************************** + * @fn HalBarReadCalibration + * + * @brief Read calibration data + * + * @param pBuf - buffer for calibration data + * + * @return none + */ +void HalBarReadCalibration(uint8 *pBuf) +{ + HalBarSelect(); + HalSensorReadReg(C953_REG_CALIBRATION_1_LSB, pBuf, C953_CAL_LEN); +} + + +/************************************************************************************************** + * @fn HalBarTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + */ +bool HalBarTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalBarSelect(); + + // Check the I2C slave address + ST_ASSERT(HalSensorReadReg(C953_REG_ADDR_I2C_SLAVE, &val, sizeof(val))); + ST_ASSERT(val==HAL_C953_I2C_ADDRESS); + + // Check that registers can be written + val = C953_TEST_COMMAND; + ST_ASSERT(HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + ST_ASSERT(HalSensorReadReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + ST_ASSERT(val==C953_TEST_COMMAND); + + // Restore values + val = C953_OFF_COMMAND; + ST_ASSERT(HalSensorWriteReg(C953_REG_ADDR_COMMAND, &val, sizeof(val))); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalBarSelect + * + * @brief Select the barometer on the I2C-bus + * + * @return none + */ +static void HalBarSelect(void) +{ + //Set up I2C that is used to communicate with the sensor + HalI2CInit(HAL_C953_I2C_ADDRESS,i2cClock_267KHZ); +} + +/* Conversion algorithm for barometer temperature + * ============================================== + * Formula from application note, rev_X: + * Ta = ((c1 * Tr) / 2^24) + (c2 / 2^10) + * + * c1 - c8: calibration coefficients the can be read from the sensor + * c1 - c4: unsigned 16-bit integers + * c5 - c8: signed 16-bit integers + +double calcBarTmp(uint16 rawT) +{ + uint16 c1, c2; + + c1 = m_barCalib.c1; + c2 = m_barCalib.c2; + m_raw_temp = rawT; + + int64 temp, val; + val = ((int64)(c1 * m_raw_temp) * 100); + temp = (val >> 24); + val = ((int64)c2 * 100); + temp += (val >> 10); + + return ((double)temp) / 100; +} + + * Conversion algorithm for barometer pressure (hPa) + * ============================================== + * Formula from application note, rev_X: + * Sensitivity = (c3 + ((c4 * Tr) / 2^17) + ((c5 * Tr^2) / 2^34)) + * Offset = (c6 * 2^14) + ((c7 * Tr) / 2^3) + ((c8 * Tr^2) / 2^19) + * Pa = (Sensitivity * Pr + Offset) / 2^14 + +double TcalcBarPress(uint16 rawT) +{ + int64 s, o, pres, val; + uint16 c3, c4; + int16 c5, c6, c7, c8; + uint16 Pr; + int16 Tr; + + Pr = rawT; + Tr = m_raw_temp; + c3 = m_barCalib.c3; + c4 = m_barCalib.c4; + c5 = m_barCalib.c5; + c6 = m_barCalib.c6; + c7 = m_barCalib.c7; + c8 = m_barCalib.c8; + + // Sensitivity + s = (int64)c3; + val = (int64)c4 * Tr; + s += (val >> 17); + val = (int64)c5 * Tr * Tr; + s += (val >> 34); + + // Offset + o = (int64)c6 << 14; + val = (int64)c7 * Tr; + o += (val >> 3); + val = (int64)c8 * Tr * Tr; + o += (val >> 19); + + // Pressure (Pa) + pres = ((int64)(s * Pr) + o) >> 14; + + return (double)pres/100; +} + +#define BUILD_UINT16(loByte, hiByte) \ + ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +void storeCalibrationData(quint8 *pData) +{ + m_barCalib.c1 = BUILD_UINT16(pData[0],pData[1]); + m_barCalib.c2 = BUILD_UINT16(pData[2],pData[3]); + m_barCalib.c3 = BUILD_UINT16(pData[4],pData[5]); + m_barCalib.c4 = BUILD_UINT16(pData[6],pData[7]); + m_barCalib.c5 = BUILD_UINT16(pData[8],pData[9]); + m_barCalib.c6 = BUILD_UINT16(pData[10],pData[11]); + m_barCalib.c7 = BUILD_UINT16(pData[12],pData[13]); + m_barCalib.c8 = BUILD_UINT16(pData[14],pData[15]); +} +*/ +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.h new file mode 100644 index 0000000..17364ab --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_bar.h @@ -0,0 +1,76 @@ +/************************************************************************************************** + Filename: hal_bar.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the pressure sensor driver. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_BAR_H +#define HAL_BAR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * FUNCTIONS + */ +void HalBarInit(void); +void HalBarStartMeasurement(void); +bool HalBarReadMeasurement(uint8 *pBuf); +void HalBarReadCalibration(uint8 *pBuf); +bool HalBarTest(void); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_BAR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_board_cfg.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_board_cfg.h new file mode 100644 index 0000000..5e01e4f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_board_cfg.h @@ -0,0 +1,348 @@ +/************************************************************************************************** + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: Board configuration for CC2541 Sensor Tag + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_BOARD_CFG_H +#define HAL_BOARD_CFG_H + +/* + * ============================================================= + * | Texas Instruments CC2541 Sensor Board | + * | --------------------------------------------------------- | + * | mcu : 8051 core | + * | clock : 32MHz | + * ============================================================= + */ + +#define ACTIVE_LOW ! +#define ACTIVE_HIGH !! /* double negation forces result to be '1' */ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" + +/* ------------------------------------------------------------------------------------------------ + * Board Indentifier + * + * Define the Board Identifier to CC2541_SB + * ------------------------------------------------------------------------------------------------ + */ + +#define CC2541_SB + +/* ------------------------------------------------------------------------------------------------ + * Clock Speed + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_CPU_CLOCK_MHZ 32 +#define EXTERNAL_CRYSTAL_OSC 0x00 +#define INTERNAL_RC_OSC 0x80 + +/* + * If not using power management, assume that the 32kHz crystal is not + * installed. Even if a 32kHz crystal is present on the board, it will + * never get used since device does not ever go to sleep. By forcing + * OSC32K_CRYSTAL_INSTALLED to FALSE, we avoid mismatches between + * libraries built with power management off, and applications in which + * power management is not used. + */ +#if ( !defined ( POWER_SAVING ) ) && ( !defined ( OSC32K_CRYSTAL_INSTALLED ) ) + #define OSC32K_CRYSTAL_INSTALLED FALSE +#endif + +/* 32 kHz clock source select in CLKCONCMD */ +#if !defined (OSC32K_CRYSTAL_INSTALLED) || (defined (OSC32K_CRYSTAL_INSTALLED) && (OSC32K_CRYSTAL_INSTALLED == TRUE)) + #define OSC_32KHZ EXTERNAL_CRYSTAL_OSC /* external 32 KHz xosc */ +#else + #define OSC_32KHZ INTERNAL_RC_OSC /* internal 32 KHz rcosc */ +#endif + +// Minimum Time for Stable External 32kHz Clock (in ms) +#define MIN_TIME_TO_STABLE_32KHZ_XOSC 400 + +/* ------------------------------------------------------------------------------------------------ + * LED Configuration + * ------------------------------------------------------------------------------------------------ + */ + +#define HAL_NUM_LEDS 2 + +#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) + +/* 1 - D1 Green */ +#define LED1_BV BV(0) +#define LED1_SBIT P1_0 +#define LED1_DDR P1DIR +#define LED1_POLARITY ACTIVE_LOW + +/* 2 - D2 Green */ +#define LED2_BV BV(4) +#define LED2_SBIT P0_4 +#define LED2_DDR P0DIR +#define LED2_POLARITY ACTIVE_LOW + +/* ------------------------------------------------------------------------------------------------ + * Sensor Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* Gyro power */ +#define GYRO_VDD_BV BV(1) +#define GYRO_VDD_SBIT P1_1 +#define GYRO_VDD_DDR P1DIR + +/* Gyro interrupt */ +#define GYRO_INT_BV BV(1) +#define GYRO_INT_SBIT P0_1 +#define GYRO_INT_DDR P0DIR + +/* IR temp data ready */ +#define IRTEMP_DRDY_BV BV(3) +#define IRTEMP_DRDY_SBIT P0_3 +#define IRTEMP_DRDY_DDR P0DIR + +/* Magnetometer interrupt */ +#define MAG_INT_BV BV(6) +#define MAG_INT_SBIT P0_6 +#define MAG_INT_DDR P0DIR + +/* DCDC control */ +#define DCDC_BV BV(7) +#define DCDC_SBIT P0_7 +#define DCDC_DDR P0DIR +#define DCDC_SEL P0SEL + +/* Accelerometer interrupt */ +#define ACC_INT_BV BV(2) +#define ACC_INT_SBIT P0_2 +#define ACC_INT_DDR P0DIR +#define ACC_INT_SEL P0SEL + +/* ------------------------------------------------------------------------------------------------ + * Push Button Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* See hal_keys.h */ + +/* ------------------------------------------------------------------------------------------------ + * OSAL NV implemented by internal flash pages. + * ------------------------------------------------------------------------------------------------ + */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. +#define HAL_FLASH_PAGE_PER_BANK 16 +// Flash is constructed of 128 pages of 2 KB. +#define HAL_FLASH_PAGE_SIZE 2048 +#define HAL_FLASH_WORD_SIZE 4 + +// CODE banks get mapped into the XDATA range 8000-FFFF. +#define HAL_FLASH_PAGE_MAP 0x8000 + +// The last 16 bytes of the last available page are reserved for flash lock bits. +// NV page definitions must coincide with segment declaration in project *.xcl file. +#if defined NON_BANKED +#define HAL_FLASH_LOCK_BITS 16 +#define HAL_NV_PAGE_END 30 +#else +#define HAL_FLASH_LOCK_BITS 16 +#define HAL_NV_PAGE_END 126 +#endif + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. +#define HAL_FLASH_IEEE_SIZE 8 +#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1) +#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE) +#define HAL_INFOP_IEEE_OSET 0xC + +#define HAL_NV_PAGE_CNT 2 +#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1) + +// Used by DMA macros to shift 1 to create a mask for DMA registers. +#define HAL_NV_DMA_CH 0 +#define HAL_DMA_CH_RX 3 +#define HAL_DMA_CH_TX 4 + +#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0() +#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a)) + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- Cache Prefetch control ---------- */ +#define PREFETCH_ENABLE() st( FCTL = 0x08; ) +#define PREFETCH_DISABLE() st( FCTL = 0x04; ) + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable +#define SET_OSC_TO_HSOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \ +} + +// switch to the 32MHz XOSC and wait until it is stable +#define SET_OSC_TO_XOSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ; \ + while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ ); \ +} + +// set 32kHz OSC and wait until it is stable +#define SET_32KHZ_OSC() \ +{ \ + CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \ + while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \ +} + +#define START_HSOSC_XOSC() \ +{ \ + SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ + while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ +} + +#define STOP_HSOSC() \ +{ \ + SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */ \ +} +/* ----------- Board Initialization ---------- */ + +#define HAL_BOARD_INIT() \ +{ \ + /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ + START_HSOSC_XOSC(); \ + SET_OSC_TO_HSOSC(); \ + SET_32KHZ_OSC(); \ + SET_OSC_TO_XOSC(); \ + STOP_HSOSC(); \ + \ + /* Turn on cache prefetch mode */ \ + PREFETCH_ENABLE(); \ + \ + /* set direction for GPIO outputs */ \ + LED1_DDR |= LED1_BV; \ + LED2_DDR |= LED2_BV; \ + GYRO_VDD_DDR |= GYRO_VDD_BV; \ + DCDC_DDR |= DCDC_BV; /* Set P0_7 as output */ \ + GYRO_VDD_SBIT = 1; /* Gyro must be on for I2C to work */ \ + P0DIR |= BV(5); /* Unused pin as output */ \ + P2DIR |= BV(0); /* Unused pin as output */ \ + P1DIR |= 0x3C; /* UART pins as output */ \ + P0INP = 0x4E; /* Tri-state inputs */ \ +} + + +/* ----------- LED's ---------- */ + +#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); ) +#define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); ) + +#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); ) +#define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); ) + +#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} ) +#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} ) + +#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT)) +#define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT)) + +/* ------------------------------------------------------------------------------------------------ + * Driver Configuration + * ------------------------------------------------------------------------------------------------ + */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ +#ifndef HAL_TIMER +#define HAL_TIMER FALSE +#endif + +/* Set to TRUE enable ADC usage, FALSE disable it */ +#ifndef HAL_ADC +#define HAL_ADC FALSE +#endif + +/* Set to TRUE enable DMA usage, FALSE disable it */ +#ifndef HAL_DMA +#define HAL_DMA TRUE +#endif + +/* Set to TRUE enable Flash access, FALSE disable it */ +#ifndef HAL_FLASH +#define HAL_FLASH TRUE +#endif + +/* Set to TRUE enable AES usage, FALSE disable it */ +#ifndef HAL_AES +#define HAL_AES FALSE +#endif + +#ifndef HAL_AES_DMA +#define HAL_AES_DMA FALSE +#endif + +/* Set to TRUE enable LCD usage, FALSE disable it */ +#ifndef HAL_LCD +#define HAL_LCD FALSE +#endif + +/* Set to TRUE enable LED usage, FALSE disable it */ +#ifndef HAL_LED +#define HAL_LED TRUE +#endif +#if (!defined BLINK_LEDS) && (HAL_LED == TRUE) +#define BLINK_LEDS +#endif + +/* Set to TRUE enable KEY usage, FALSE disable it */ +#ifndef HAL_KEY +#define HAL_KEY TRUE +#endif + + +/******************************************************************************************************* +*/ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.c new file mode 100644 index 0000000..7ce6469 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.c @@ -0,0 +1,116 @@ +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board.h" +#include "hal_crc.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = HI_UINT16(seed); + RNDL = LO_UINT16(seed); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.h new file mode 100644 index 0000000..26c6295 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_crc.h @@ -0,0 +1,102 @@ +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_CRC_H +#define HAL_CRC_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.c new file mode 100644 index 0000000..9f4113c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.c @@ -0,0 +1,127 @@ +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_dma.h" +#include "hal_mcu.h" +#include "hal_types.h" +#include "hal_uart.h" + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) +#include "hal_irgen.h" +#endif + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); + HAL_DMA_SET_ADDR_DESC1234( dmaCh1234 ); +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) + DMAIE = 1; +#endif +} + +#if (HAL_UART_DMA || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) || \ + ((defined HAL_IRGEN) && (HAL_IRGEN == TRUE))) +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR ) +{ + HAL_ENTER_ISR(); + + DMAIF = 0; + +#if (((defined HAL_UART_DMA) && (HAL_UART_DMA != 0)) || \ + ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0))) + if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX)) + { + HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } +#endif + +#if (defined HAL_IRGEN) && (HAL_IRGEN == TRUE) + if ( HAL_IRGEN == TRUE && HAL_DMA_CHECK_IRQ( HAL_IRGEN_DMA_CH ) ) + { + HAL_DMA_CLEAR_IRQ( HAL_IRGEN_DMA_CH ); + HalIrGenDmaIsr(); + } +#endif + + CLEAR_SLEEP_MODE(); + HAL_EXIT_ISR(); + + return; +} +#endif +#endif // #if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.h new file mode 100644 index 0000000..5b47830 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_dma.h @@ -0,0 +1,302 @@ +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_DMA_H +#define HAL_DMA_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_board.h" +#include "hal_types.h" + +#if ((defined HAL_DMA) && (HAL_DMA == TRUE)) + +/********************************************************************* + * MACROS + */ + +#define HAL_DMA_SET_ADDR_DESC0( a ) \ + st( \ + DMA0CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA0CFGL = (uint8)( (uint16)(a) & 0xFF ); \ + ) + +#define HAL_DMA_SET_ADDR_DESC1234( a ) \ + st( \ + DMA1CFGH = (uint8)( (uint16)(a) >> 8 ); \ + DMA1CFGL = (uint8)( (uint16)(a) & 0xFF); \ + ) + +#define HAL_DMA_GET_DESC0() &dmaCh0 + +#define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+((a)-1)) + +#define HAL_DMA_ARM_CH( ch ) DMAARM = (0x01 << (ch)) + +#define HAL_DMA_CH_ARMED( ch ) (DMAARM & (0x01 << (ch))) + +#define HAL_DMA_ABORT_CH( ch ) DMAARM = (0x80 | (0x01 << (ch))) +#define HAL_DMA_MAN_TRIGGER( ch ) DMAREQ = (0x01 << (ch)) +#define HAL_DMA_START_CH( ch ) HAL_DMA_MAN_TRIGGER( (ch) ) + +#define HAL_DMA_CLEAR_IRQ( ch ) DMAIRQ &= ~( 1 << (ch) ) + +#define HAL_DMA_CHECK_IRQ( ch ) (DMAIRQ & ( 1 << (ch) )) + +// Macro for quickly setting the source address of a DMA structure. +#define HAL_DMA_SET_SOURCE( pDesc, src ) \ + st( \ + pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \ + pDesc->srcAddrL = (uint8)((uint16)(src) & 0xFF); \ + ) + +// Macro for quickly setting the destination address of a DMA structure. +#define HAL_DMA_SET_DEST( pDesc, dst ) \ + st( \ + pDesc->dstAddrH = (uint8)((uint16)(dst) >> 8); \ + pDesc->dstAddrL = (uint8)((uint16)(dst) & 0xFF); \ + ) + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#define HAL_DMA_SET_LEN( pDesc, len ) \ + st( \ + pDesc->xferLenL = (uint8)(uint16)(len); \ + pDesc->xferLenV &= ~HAL_DMA_LEN_H; \ + pDesc->xferLenV |= (uint8)((uint16)(len) >> 8); \ + ) + +#define HAL_DMA_GET_LEN( pDesc ) \ + (((uint16)(pDesc->xferLenV & HAL_DMA_LEN_H) << 8) | pDesc->xferLenL) + +#define HAL_DMA_SET_VLEN( pDesc, vMode ) \ + st( \ + pDesc->xferLenV &= ~HAL_DMA_LEN_V; \ + pDesc->xferLenV |= (vMode << 5); \ + ) + +#define HAL_DMA_SET_WORD_SIZE( pDesc, xSz ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_WORD_SIZE; \ + pDesc->ctrlA |= (xSz << 7); \ + ) + +#define HAL_DMA_SET_TRIG_MODE( pDesc, tMode ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_MODE; \ + pDesc->ctrlA |= (tMode << 5); \ + ) + +#define HAL_DMA_GET_TRIG_MODE( pDesc ) ((pDesc->ctrlA >> 5) & 0x3) + +#define HAL_DMA_SET_TRIG_SRC( pDesc, tSrc ) \ + st( \ + pDesc->ctrlA &= ~HAL_DMA_TRIG_SRC; \ + pDesc->ctrlA |= tSrc; \ + ) + +#define HAL_DMA_SET_SRC_INC( pDesc, srcInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_SRC_INC; \ + pDesc->ctrlB |= (srcInc << 6); \ + ) + +#define HAL_DMA_SET_DST_INC( pDesc, dstInc ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_DST_INC; \ + pDesc->ctrlB |= (dstInc << 4); \ + ) + +#define HAL_DMA_SET_IRQ( pDesc, enable ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_IRQ_MASK; \ + pDesc->ctrlB |= (enable << 3); \ + ) + +#define HAL_DMA_SET_M8( pDesc, m8 ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_M8; \ + pDesc->ctrlB |= (m8 << 2); \ + ) + +#define HAL_DMA_SET_PRIORITY( pDesc, pri ) \ + st( \ + pDesc->ctrlB &= ~HAL_DMA_PRIORITY; \ + pDesc->ctrlB |= pri; \ + ) + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count +#define HAL_DMA_VLEN_USE_LEN 0x00 +// Transfer the first byte + the number of bytes indicated by the first byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST 0x01 +// Transfer the number of bytes indicated by the first byte (starting with the first byte) +#define HAL_DMA_VLEN_VALOFFIRST 0x02 +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_1 0x03 +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes +#define HAL_DMA_VLEN_1_P_VALOFFIRST_P_2 0x04 + +#define HAL_DMA_WORDSIZE_BYTE 0x00 /* Transfer a byte at a time. */ +#define HAL_DMA_WORDSIZE_WORD 0x01 /* Transfer a 16-bit word at a time. */ + +#define HAL_DMA_TMODE_SINGLE 0x00 /* Transfer a single byte/word after each DMA trigger. */ +#define HAL_DMA_TMODE_BLOCK 0x01 /* Transfer block of data (length len) after each DMA trigger. */ +#define HAL_DMA_TMODE_SINGLE_REPEATED 0x02 /* Transfer single byte/word (after len transfers, rearm DMA). */ +#define HAL_DMA_TMODE_BLOCK_REPEATED 0x03 /* Transfer block of data (after len transfers, rearm DMA). */ + +#define HAL_DMA_TRIG_NONE 0 /* No trigger, setting DMAREQ.DMAREQx bit starts transfer. */ +#define HAL_DMA_TRIG_PREV 1 /* DMA channel is triggered by completion of previous channel. */ +#define HAL_DMA_TRIG_T1_CH0 2 /* Timer 1, compare, channel 0. */ +#define HAL_DMA_TRIG_T1_CH1 3 /* Timer 1, compare, channel 1. */ +#define HAL_DMA_TRIG_T1_CH2 4 /* Timer 1, compare, channel 2. */ +#define HAL_DMA_TRIG_T2_COMP 5 /* Timer 2, compare. */ +#define HAL_DMA_TRIG_T2_OVFL 6 /* Timer 2, overflow. */ +#define HAL_DMA_TRIG_T3_CH0 7 /* Timer 3, compare, channel 0. */ +#define HAL_DMA_TRIG_T3_CH1 8 /* Timer 3, compare, channel 1. */ +#define HAL_DMA_TRIG_T4_CH0 9 /* Timer 4, compare, channel 0. */ +#define HAL_DMA_TRIG_T4_CH1 10 /* Timer 4, compare, channel 1. */ +#define HAL_DMA_TRIG_ST 11 /* Sleep Timer compare. */ +#define HAL_DMA_TRIG_IOC_0 12 /* Port 0 I/O pin input transition. */ +#define HAL_DMA_TRIG_IOC_1 13 /* Port 1 I/O pin input transition. */ +#define HAL_DMA_TRIG_URX0 14 /* USART0 RX complete. */ +#define HAL_DMA_TRIG_UTX0 15 /* USART0 TX complete. */ +#define HAL_DMA_TRIG_URX1 16 /* USART1 RX complete. */ +#define HAL_DMA_TRIG_UTX1 17 /* USART1 TX complete. */ +#define HAL_DMA_TRIG_FLASH 18 /* Flash data write complete. */ +#define HAL_DMA_TRIG_RADIO 19 /* RF packet byte received/transmit. */ +#define HAL_DMA_TRIG_ADC_CHALL 20 /* ADC end of a conversion in a sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH0 21 /* ADC end of conversion channel 0 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH1 22 /* ADC end of conversion channel 1 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH2 23 /* ADC end of conversion channel 2 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH3 24 /* ADC end of conversion channel 3 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH4 25 /* ADC end of conversion channel 4 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH5 26 /* ADC end of conversion channel 5 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH6 27 /* ADC end of conversion channel 6 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ADC_CH7 28 /* ADC end of conversion channel 7 in sequence, sample ready. */ +#define HAL_DMA_TRIG_ENC_DW 29 /* AES encryption processor requests download input data. */ +#define HAL_DMA_TRIG_ENC_UP 30 /* AES encryption processor requests upload output data. */ + +#define HAL_DMA_SRCINC_0 0x00 /* Increment source pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_1 0x01 /* Increment source pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_2 0x02 /* Increment source pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_SRCINC_M1 0x03 /* Decrement source pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_DSTINC_0 0x00 /* Increment destination pointer by 0 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_1 0x01 /* Increment destination pointer by 1 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_2 0x02 /* Increment destination pointer by 2 bytes/words after each transfer. */ +#define HAL_DMA_DSTINC_M1 0x03 /* Decrement destination pointer by 1 bytes/words after each transfer. */ + +#define HAL_DMA_IRQMASK_DISABLE 0x00 /* Disable interrupt generation. */ +#define HAL_DMA_IRQMASK_ENABLE 0x01 /* Enable interrupt generation upon DMA channel done. */ + +#define HAL_DMA_M8_USE_8_BITS 0x00 /* Use all 8 bits for transfer count. */ +#define HAL_DMA_M8_USE_7_BITS 0x01 /* Use 7 LSB for transfer count. */ + +#define HAL_DMA_PRI_LOW 0x00 /* Low, CPU has priority. */ +#define HAL_DMA_PRI_GUARANTEED 0x01 /* Guaranteed, DMA at least every second try. */ +#define HAL_DMA_PRI_HIGH 0x02 /* High, DMA has priority. */ +#define HAL_DMA_PRI_ABSOLUTE 0x03 /* Highest, DMA has priority. Reserved for DMA port access.. */ + +#define HAL_DMA_MAX_ARM_CLOCKS 45 // Maximum number of clocks required if arming all 5 at once. + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' +#define HAL_DMA_LEN_V 0xE0 +#define HAL_DMA_LEN_H 0x1F + +// Bit fields of the 'ctrlA' +#define HAL_DMA_WORD_SIZE 0x80 +#define HAL_DMA_TRIG_MODE 0x60 +#define HAL_DMA_TRIG_SRC 0x1F + +// Bit fields of the 'ctrlB' +#define HAL_DMA_SRC_INC 0xC0 +#define HAL_DMA_DST_INC 0x30 +#define HAL_DMA_IRQ_MASK 0x08 +#define HAL_DMA_M8 0x04 +#define HAL_DMA_PRIORITY 0x03 + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + +#endif // #if (defined HAL_DMA) && (HAL_DMA == TRUE) + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef HAL_DMA_H + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_flash.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_flash.c new file mode 100644 index 0000000..ac91683 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_flash.c @@ -0,0 +1,170 @@ +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "hal_board_cfg.h" +#include "hal_dma.h" +#include "hal_flash.h" +#include "hal_types.h" + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) + + ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE); + uint8 memctr = MEMCTR; // Save to restore. + +#if !defined HAL_OAD_BOOT_CODE + halIntState_t is; +#endif + + pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page. + +#if !defined HAL_OAD_BOOT_CODE + HAL_ENTER_CRITICAL_SECTION(is); +#endif + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + +#if !defined HAL_OAD_BOOT_CODE + HAL_EXIT_CRITICAL_SECTION(is); +#endif +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ +#if (defined HAL_DMA) && (HAL_DMA == TRUE) + halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); + + HAL_DMA_SET_SOURCE(ch, buf); + HAL_DMA_SET_DEST(ch, &FWDATA); + HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); + HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); + HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); + HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); + HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); + HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); + HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); + // The DMA is to be polled and shall not issue an IRQ upon completion. + HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); + HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); + HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); + HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); + HAL_DMA_ARM_CH(HAL_NV_DMA_CH); + + FADDRL = (uint8)addr; + FADDRH = (uint8)(addr >> 8); + FCTL |= 0x02; // Trigger the DMA writes. + while (FCTL & 0x80); // Wait until writing is done. +#endif +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256); + FCTL |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.c new file mode 100644 index 0000000..8b34823 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.c @@ -0,0 +1,424 @@ +/************************************************************************************************** + Filename: hal_gyro.c + Revised: $Date: 2013-05-16 08:23:18 -0700 (Thu, 16 May 2013) $ + Revision: $Revision: 34324 $ + + Description: Driver for the InvenSense IMU-3000 3-Axis Gyroscope + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_gyro.h" +#include "hal_i2c.h" +#include "hal_sensor.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +/* Slave address */ +#define HAL_GYRO_I2C_ADDRESS 0x68 +#define HAL_GYRO_DATA_SIZE 6 + +/* GYRO register addresses */ + +#define HAL_GYRO_REG_WHOAMI 0x00 // R/W + +// Offset configuration registers +#define HAL_GYRO_REG_XOFFS_USRH 0x0C // R/W +#define HAL_GYRO_REG_XOFFS_USRL 0x0D // R/W +#define HAL_GYRO_REG_YOFFS_USRH 0x0E // R/W +#define HAL_GYRO_REG_YOFFS_USRL 0x0F // R/W +#define HAL_GYRO_REG_ZOFFS_USRH 0x10 // R/W +#define HAL_GYRO_REG_ZOFFS_USRL 0x11 // R/W + +// Configuration registers +#define HAL_GYRO_REG_FIFO_EN 0x12 // R/W +#define HAL_GYRO_REG_AUX_VDDIO 0x13 // R/W +#define HAL_GYRO_REG_AUX_SLV_ADDR 0x14 // R/W +#define HAL_GYRO_REG_SMPLRT_DIV 0x15 // R/W +#define HAL_GYRO_REG_DLPF_FS 0x16 // R/W +#define HAL_GYRO_REG_INT_CFG 0x17 // R/W +#define HAL_GYRO_REG_AUX_BURST_ADDR 0x18 // R/W +#define HAL_GYRO_REG_INT_STATUS 0x1A // R + +// Sensor data registers +#define HAL_GYRO_REG_TEMP_OUT_H 0x1B // R +#define HAL_GYRO_REG_TEMP_OUT_L 0x1C // R +#define HAL_GYRO_REG_GYRO_XOUT_H 0x1D // R +#define HAL_GYRO_REG_GYRO_XOUT_L 0x1E // R +#define HAL_GYRO_REG_GYRO_YOUT_H 0x1F // R +#define HAL_GYRO_REG_GYRO_YOUT_L 0x20 // R +#define HAL_GYRO_REG_GYRO_ZOUT_H 0x21 // R +#define HAL_GYRO_REG_GYRO_ZOUT_L 0x22 // R +#define HAL_GYRO_REG_AUX_XOUT_H 0x23 // R +#define HAL_GYRO_REG_AUX_XOUT_L 0x24 // R +#define HAL_GYRO_REG_AUX_YOUT_H 0x25 // R +#define HAL_GYRO_REG_AUX_YOUT_L 0x26 // R +#define HAL_GYRO_REG_AUX_ZOUT_H 0x27 // R +#define HAL_GYRO_REG_AUX_ZOUT_L 0x28 // R + +// FIFO registers +#define HAL_GYRO_REG_FIFO_COUNTH 0x3A // R +#define HAL_GYRO_REG_FIFO_COUNTL 0x3B // R +#define HAL_GYRO_REG_FIFO_R 0x3C // R + +// User control and Power Management registers +#define HAL_GYRO_REG_USER_CTRL 0x3D // R/W +#define HAL_GYRO_REG_PWR_MGM 0x3E // R/W + +/* GYRO Register Bit masks */ +#define HAL_GYRO_REG_FIFO_EN_TEMP_OUT 0x80 +#define HAL_GYRO_REG_FIFO_EN_GYRO_XOUT 0x40 +#define HAL_GYRO_REG_FIFO_EN_GYRO_YOUT 0x20 +#define HAL_GYRO_REG_FIFO_EN_GYRO_ZOUT 0x10 +#define HAL_GYRO_REG_FIFO_EN_AUX_XOUT 0x08 +#define HAL_GYRO_REG_FIFO_EN_AUX_YOUT 0x04 +#define HAL_GYRO_REG_FIFO_EN_AUX_ZOUT 0x02 +#define HAL_GYRO_REG_FIFO_EN_FIFO_FOOTER 0x01 + +#define HAL_GYRO_USER_CTRL_DMP_EN 0x80 +#define HAL_GYRO_USER_CTRL_FIFO_EN 0x40 +#define HAL_GYRO_USER_CTRL_AUX_IF_EN 0x20 +#define HAL_GYRO_USER_CTRL_AUX_IF_RST_EN 0x08 +#define HAL_GYRO_USER_CTRL_DMP_RST 0x04 +#define HAL_GYRO_USER_CTRL_FIFO_RST 0x02 +#define HAL_GYRO_USER_CTRL_GYRO_RST 0x01 + +#define HAL_GYRO_PWR_MGM_H_RESET 0x80 +#define HAL_GYRO_PWR_MGM_SLEEP 0x40 +#define HAL_GYRO_PWR_MGM_STBY_XG 0x20 +#define HAL_GYRO_PWR_MGM_STBY_YG 0x10 +#define HAL_GYRO_PWR_MGM_STBY_ZG 0x08 +#define HAL_GYRO_PWR_MGM_STBY_ALL 0x38 // All axes + +// Clock select +#define HAL_GYRO_PWR_MGM_CLOCK_INT_OSC 0x00 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_X 0x01 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_Y 0x02 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_Z 0x03 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_32768KHZ 0x04 +#define HAL_GYRO_PWR_MGM_CLOCK_PLL_19_2MHZ 0x05 +#define HAL_GYRO_PWR_MGM_CLOCK_STOP 0x07 + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalGyroSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 mStatus; +// Selected axes, as in HAL_GYRO_PWR_MGM register: +// Bit 0-2: 0 +// Bit 3: NOT X enabled +// Bit 4: NOT Y enabled +// Bit 5: NOT Z enabled +// Bit 6-7: 0 +static uint8 mDisabledAxes; +static uint8 cfgOn; + +/* ------------------------------------------------------------------------------------------------ +* Public functions +* ------------------------------------------------------------------------------------------------- +*/ + + +/************************************************************************************************** + * @fn HalGyroInit + * + * @brief Initialise the gyro sensor driver + * + * @return none + **************************************************************************************************/ +void HalGyroInit(void) +{ + mStatus = HAL_GYRO_STOPPED; + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + + HalGyroTurnOff(); +} + + +/************************************************************************************************** + * @fn HalGyroTurnOn + * + * @brief Turn the sensor on + * + * @return none + **************************************************************************************************/ +void HalGyroTurnOn(void) +{ + bool success; + uint8 clk_select; + + HalDcDcControl(ST_GYRO,true); + + HalGyroSelect(); + + // Default to internal oscillator if no axis is enabled (should not happen) + clk_select = HAL_GYRO_PWR_MGM_CLOCK_INT_OSC; + if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_XG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_X; + } + else if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_YG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_Y; + } + else if(!(mDisabledAxes & HAL_GYRO_PWR_MGM_STBY_ZG)) + { + clk_select = HAL_GYRO_PWR_MGM_CLOCK_PLL_Z; + } + + // Wake up from sleep, disable standby for all gyros, select reference PLL according to selected axes + cfgOn = mDisabledAxes & (~HAL_GYRO_PWR_MGM_SLEEP | clk_select); + success = HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&cfgOn,1); + if(success) + { + mStatus = HAL_GYRO_DATA_READY; + } + else + { + mStatus = HAL_GYRO_STATE_ERROR; + } +} + +/************************************************************************************************** + * @fn HalGyroTurnOff + * + * @brief Turn the sensor off + * + * @return none + **************************************************************************************************/ +void HalGyroTurnOff(void) +{ + bool success; + uint8 val; + + HalGyroSelect(); + + // Standby, 5 uA current consumption + val = HAL_GYRO_PWR_MGM_SLEEP; + success = HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&val,1); + + if(success) + { + uint8 rv; + + success = HalSensorReadReg(HAL_GYRO_REG_PWR_MGM,&rv,1); + if (success && rv == val) + { + mStatus = HAL_GYRO_STOPPED; + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + } + } + + if (!success) + { + mStatus = HAL_GYRO_STATE_ERROR; + } + + HalDcDcControl(ST_GYRO,false); +} + + +/************************************************************************************************** + * @fn HalGyroRead + * + * @brief Read gyro data + * + * @param Voltage and temperature in raw format [X_LOW, X_HIGH, Y_LOW, Y_HIGH, Z_LOW, Z_HIGH] + * + * @return TRUE if valid data + **************************************************************************************************/ +bool HalGyroRead(uint8 *pBuf) +{ + bool success; + uint8 buf[HAL_GYRO_DATA_SIZE]; + uint8 val; + + HalGyroSelect(); + + // Read sensor + success = HalSensorReadReg(HAL_GYRO_REG_GYRO_XOUT_H,buf,HAL_GYRO_DATA_SIZE); + + if (success) + { + // Result in LE + pBuf[0] = buf[1]; + pBuf[1] = buf[0]; + pBuf[2] = buf[3]; + pBuf[3] = buf[2]; + pBuf[4] = buf[5]; + pBuf[5] = buf[4]; + } + + // Put gyro back to sleep + val = HAL_GYRO_PWR_MGM_SLEEP; + success = HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&val,1); + mStatus = HAL_GYRO_SLEEP; + + return success; +} + + +/************************************************************************************************** + * @fn HalGyroWakeUp + * + * @brief Wake up the sensor + * + * @return Gyro status + **************************************************************************************************/ +bool HalGyroWakeUp(void) +{ + HalGyroSelect(); + + mStatus = HAL_GYRO_DATA_READY; + + // Wake up GYRO + return HalSensorWriteReg(HAL_GYRO_REG_PWR_MGM,&cfgOn,1); +} + + +/************************************************************************************************** + * @fn HalGyroStatus + * + * @brief Read the state of the sensor + * + * @return Gyro status + **************************************************************************************************/ +uint8 HalGyroStatus(void) +{ + return mStatus; +} + +/************************************************************************************************** + * @fn HalGyroSelectAxes + * + * @brief Select axes for gyroscope + * + * @param Bitmask representing enabled axes (1 enable, 0 disable) + * Bit 0: X axis + * Bit 1: Y axis + * Bit 2: Z axis + * Bit 3-7: reserved + * @return none + **************************************************************************************************/ +void HalGyroSelectAxes(uint8 axes) +{ + mDisabledAxes = HAL_GYRO_PWR_MGM_STBY_ALL; + + if(axes & 0x01) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_XG; + } + + if(axes & 0x02) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_YG; + } + + if(axes & 0x04) + { + mDisabledAxes ^= HAL_GYRO_PWR_MGM_STBY_ZG; + } + + if(HalGyroStatus() != HAL_GYRO_STOPPED) + { + HalGyroTurnOn(); + } +} + +/************************************************************************************************** + * @fn HalGyroTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalGyroTest(void) +{ + uint8 val; + + HalGyroSelect(); + + // Check the WHO AM I register + ST_ASSERT(HalSensorReadReg(HAL_GYRO_REG_WHOAMI, &val, 1)); + ST_ASSERT((val&HAL_GYRO_I2C_ADDRESS) == HAL_GYRO_I2C_ADDRESS); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalGyroSelect + * + * @brief Select the Gyro slave and set the I2C bus speed + * + * @return none + **************************************************************************************************/ +static void HalGyroSelect(void) +{ + // Select slave and set clock rate + HalI2CInit(HAL_GYRO_I2C_ADDRESS, i2cClock_533KHZ); +} + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcGyro(int16 rawX) +{ + float v; + + //-- calculate rotation, unit deg/s, range -250, +250 + v = (rawX * 1.0) / (65536 / 500); + + return v; +} +*/ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.h new file mode 100644 index 0000000..42c0d15 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_gyro.h @@ -0,0 +1,83 @@ +/************************************************************************************************** + Filename: hal_gyro.h + Revised: $Date: 2013-05-16 08:23:18 -0700 (Thu, 16 May 2013) $ + Revision: $Revision: 34324 $ + + Description: Driver for the InvenSense IMU-3000 Motion processing Unit. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_GYRO_H +#define HAL_GYRO_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +/* GYRO states */ +#define HAL_GYRO_STOPPED 0x00 +#define HAL_GYRO_SLEEP 0x01 +#define HAL_GYRO_DATA_READY 0x02 +#define HAL_GYRO_STATE_ERROR 0xFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * FUNCTIONS + */ +void HalGyroInit(void); +void HalGyroTurnOn(void); +void HalGyroTurnOff(void); +bool HalGyroWakeUp(void); +bool HalGyroRead(uint8 *irTempData); +bool HalGyroTest(void); +void HalGyroSelectAxes(uint8 axes); +uint8 HalGyroStatus(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_GYRO_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.c new file mode 100644 index 0000000..2d731d9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.c @@ -0,0 +1,293 @@ +/**************************************************************************************************' + Filename: hal_humi.c + Revised: $Date: 2013-03-25 07:58:08 -0700 (Mon, 25 Mar 2013) $ + Revision: $Revision: 33575 $ + + Description: Driver for the Sensirion SHT21 Humidity sensor + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_humi.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +// Sensor I2C address +#define HAL_SHT21_I2C_ADDRESS 0x40 + +#define S_REG_LEN 2 +#define DATA_LEN 3 + +// Internal commands +#define SHT21_CMD_TEMP_T_H 0xE3 // command trig. temp meas. hold master +#define SHT21_CMD_HUMI_T_H 0xE5 // command trig. humidity meas. hold master +#define SHT21_CMD_TEMP_T_NH 0xF3 // command trig. temp meas. no hold master +#define SHT21_CMD_HUMI_T_NH 0xF5 // command trig. humidity meas. no hold master +#define SHT21_CMD_WRITE_U_R 0xE6 // command write user register +#define SHT21_CMD_READ_U_R 0xE7 // command read user register +#define SHT21_CMD_SOFT_RST 0xFE // command soft reset + +#define HUMIDITY 0x00 +#define TEMPERATURE 0x01 + +#define USR_REG_MASK 0x38 // Mask off reserved bits (3,4,5) +#define USR_REG_DEFAULT 0x02 // Disable OTP reload +#define USR_REG_RES_MASK 0x7E // Only change bits 0 and 7 (meas. res.) +#define USR_REG_11BITRES 0x81 // 11-bit resolution + +/* ------------------------------------------------------------------------------------------------ +* Type Definitions +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalHumiSelect(void); +static bool HalHumiReadData(uint8 *pBuf,uint8 nBytes); +static bool HalHumiWriteCmd(uint8 cmd); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 usr; // Keeps user register value +static uint8 buf[6]; // Data buffer +static bool success; + +/************************************************************************************************** +* @fn HalHumiInit +* +* @brief Initialise the humidity sensor driver +* +* @return none +**************************************************************************************************/ +void HalHumiInit(void) +{ + HalHumiSelect(); + + // Set 11 bit resolution + HalSensorReadReg(SHT21_CMD_READ_U_R,&usr,1); + usr &= USR_REG_RES_MASK; + usr |= USR_REG_11BITRES; + HalSensorWriteReg(SHT21_CMD_WRITE_U_R,&usr,1); + success = FALSE; +} + + +/************************************************************************************************** +* @fn HalHumiExecMeasurementStep +* +* @brief Execute measurement step +* +* @return none +*/ +bool HalHumiExecMeasurementStep(uint8 state) +{ + HalHumiSelect(); + + switch (state) + { + case 0: + // Turn on DC-DC control + HalDcDcControl(ST_HUMID,true); + + // Start temperature read + success = HalHumiWriteCmd(SHT21_CMD_TEMP_T_NH); + break; + + case 1: + // Read and store temperature value + if (success) + { + success = HalHumiReadData(buf, DATA_LEN); + + // Start for humidity read + if (success) + { + success = HalHumiWriteCmd(SHT21_CMD_HUMI_T_NH); + } + } + break; + + case 2: + // Read and store humidity value + if (success) + { + success = HalHumiReadData(buf+DATA_LEN, DATA_LEN); + } + + // Turn of DC-DC control + HalDcDcControl(ST_HUMID,false); + break; + } + + return success; +} + + +/************************************************************************************************** +* @fn HalHumiReadMeasurement +* +* @brief Get humidity sensor data +* +* @return none +*/ +bool HalHumiReadMeasurement(uint8 *pBuf) +{ + // Store temperature + pBuf[0] = buf[1]; + pBuf[1] = buf[0]; + + // Store humidity + pBuf[2] = buf[4]; + pBuf[3] = buf[3]; + + return success; +} + + + +/************************************************************************************************** +* @fn HalHumiTest +* +* @brief Humidity sensor self test +* +* @return none +**************************************************************************************************/ +bool HalHumiTest(void) +{ + uint8 val; + + HalHumiSelect(); + + // Verify default value + ST_ASSERT(HalSensorReadReg(SHT21_CMD_READ_U_R,&val,1)); + ST_ASSERT(val==usr); + + return TRUE; +} + + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalHumiSelect +* +* @brief Select the humidity sensor on the I2C-bus +* +* @return +*/ +static void HalHumiSelect(void) +{ + //Set up I2C that is used to communicate with SHT21 + HalI2CInit(HAL_SHT21_I2C_ADDRESS,i2cClock_267KHZ); +} + + +/************************************************************************************************** +* @fn halHumiWriteCmd +* +* @brief Write a command to the humidity sensor +* +* @param cmd - command to write +* +* @return TRUE if the command has been transmitted successfully +**************************************************************************************************/ +static bool HalHumiWriteCmd(uint8 cmd) +{ + /* Send command */ + return HalI2CWrite(1,&cmd) == 1; +} + + +/************************************************************************************************** +* @fn HalHumiReadData +* +* @brief This function implements the I2C protocol to read from the SHT21. +* +* @param pBuf - pointer to buffer to place data +* +* @param nBytes - number of bytes to read +* +* @return TRUE if the required number of bytes are received +**************************************************************************************************/ +static bool HalHumiReadData(uint8 *pBuf, uint8 nBytes) +{ + /* Read data */ + return HalI2CRead(nBytes,pBuf ) == nBytes; +} + +/* Conversion algorithm, humidity + * +double calcHumRel(uint16 rawH) +{ + double v; + + rawH &= ~0x0003; // clear bits [1..0] (status bits) + //-- calculate relative humidity [%RH] -- + v = -6.0 + 125.0/65536 * (double)rawH; // RH= -6 + 125 * SRH/2^16 + + return v; +} + + * Conversion algorithm, temperature + * +double calcHumTmp(uint16 rawT) +{ + double v; + + //-- calculate temperature [°C] -- + v = -46.85 + 175.72/65536 *(double)(qint16)rawT; + + return v; +} + */ + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.h new file mode 100644 index 0000000..6baafc4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_humi.h @@ -0,0 +1,72 @@ +/************************************************************************************************** + Filename: hal_humi.h + Revised: $Date: 2013-03-06 07:01:15 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33382 $ + + Description: Interface to the humidity sensor driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_HUMI_H +#define HAL_HUMI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ +#define HAL_HUM_MEAS_STATE_1 0 // Start temp. meas. +#define HAL_HUM_MEAS_STATE_2 1 // Read temp. meas, start hum. +#define HAL_HUM_MEAS_STATE_3 2 // Read humi. meas. + +/********************************************************************* + * FUNCTIONS + */ +void HalHumiInit(void); +bool HalHumiExecMeasurementStep(uint8 state); +bool HalHumiReadMeasurement(uint8 *pBuf); +bool HalHumiTest(void); + +/*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_HUMI_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.c new file mode 100644 index 0000000..cbda0bf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.c @@ -0,0 +1,315 @@ +/************************************************************************************************** + Filename: hal_i2c.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This module defines the HAL I2C API for the CC2541ST. It + implements the I2C master. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_assert.h" +#include "hal_board_cfg.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define I2C_ENS1 BV(6) +#define I2C_STA BV(5) +#define I2C_STO BV(4) +#define I2C_SI BV(3) +#define I2C_AA BV(2) +#define I2C_MST_RD_BIT BV(0) // Master RD/WRn bit to be OR'ed with Slave address. + +#define I2C_CLOCK_MASK 0x83 + +#define I2C_PXIFG P2IFG +#define I2C_IF P2IF +#define I2C_IE BV(1) + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef enum +{ + // HAL_I2C_MASTER mode statuses. + mstStarted = 0x08, + mstRepStart = 0x10, + mstAddrAckW = 0x18, + mstAddrNackW = 0x20, + mstDataAckW = 0x28, + mstDataNackW = 0x30, + mstLostArb = 0x38, + mstAddrAckR = 0x40, + mstAddrNackR = 0x48, + mstDataAckR = 0x50, + mstDataNackR = 0x58, +} i2cStatus_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +#define I2C_WRAPPER_DISABLE() st( I2CWC = 0x00; ) +#define I2C_CLOCK_RATE(x) st( I2CCFG &= ~I2C_CLOCK_MASK; \ + I2CCFG |= x; ) +#define I2C_SET_NACK() st( I2CCFG &= ~I2C_AA; ) +#define I2C_SET_ACK() st( I2CCFG |= I2C_AA; ) + +// Enable I2C bus +#define I2C_ENABLE() st( I2CCFG |= (I2C_ENS1); ) +#define I2C_DISABLE() st( I2CCFG &= ~(I2C_ENS1); ) + +// Must clear SI before setting STA and then STA must be manually cleared. +#define I2C_STRT() st ( \ + I2CCFG &= ~I2C_SI; \ + I2CCFG |= I2C_STA; \ + while ((I2CCFG & I2C_SI) == 0); \ + I2CCFG &= ~I2C_STA; \ +) + +// Must set STO before clearing SI. +#define I2C_STOP() st ( \ + I2CCFG |= I2C_STO; \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_STO) != 0); \ +) + +// Stop clock-stretching and then read when it arrives. +#define I2C_READ(_X_) st ( \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ + (_X_) = I2CDATA; \ +) + +// First write new data and then stop clock-stretching. +#define I2C_WRITE(_X_) st ( \ + I2CDATA = (_X_); \ + I2CCFG &= ~I2C_SI; \ + while ((I2CCFG & I2C_SI) == 0); \ +) + + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ +static uint8 i2cAddr; // Target Slave address pre-shifted up by one leaving RD/WRn LSB as zero. + +/************************************************************************************************** + * @fn i2cMstStrt + * + * @brief Attempt to send an I2C bus START and Slave Address as an I2C bus Master. + * + * input parameters + * + * @param RD_WRn - The LSB of the Slave Address as Read/~Write. + * + * @return The I2C status of the START request or of the Slave Address Ack. + */ +static uint8 i2cMstStrt(uint8 RD_WRn) +{ + I2C_STRT(); + + if (I2CSTAT == mstStarted) /* A start condition has been transmitted */ + { + I2C_WRITE(i2cAddr | RD_WRn); + } + + return I2CSTAT; +} + +/************************************************************************************************** + * @fn HalI2CInit + * + * @brief Initialize the I2C bus as a Master. + * + * input parameters + * + * @param address - I2C slave address. + * @param clockRate - I2C clock rate. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CInit(uint8 address, i2cClock_t clockRate) +{ + i2cAddr = address << 1; + + I2C_WRAPPER_DISABLE(); + I2CADDR = 0; // no multi master support at this time + I2C_CLOCK_RATE(clockRate); + I2C_ENABLE(); +} + +/************************************************************************************************** + * @fn HalI2CRead + * + * @brief Read from the I2C bus as a Master. + * + * input parameters + * + * @param len - Number of bytes to read. + * @param pBuf - Pointer to the data buffer to put read bytes. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully read. + */ +uint8 HalI2CRead(uint8 len, uint8 *pBuf) +{ + uint8 cnt = 0; + + if (i2cMstStrt(I2C_MST_RD_BIT) != mstAddrAckR) + { + len = 0; + } + + // All bytes are ACK'd except for the last one which is NACK'd. If only + // 1 byte is being read, a single NACK will be sent. Thus, we only want + // to enable ACK if more than 1 byte is going to be read. + if (len > 1) + { + I2C_SET_ACK(); + } + + while (len > 0) + { + // slave devices require NACK to be sent after reading last byte + if (len == 1) + { + I2C_SET_NACK(); + } + + // read a byte from the I2C interface + I2C_READ(*pBuf++); + cnt++; + len--; + + if (I2CSTAT != mstDataAckR) + { + if (I2CSTAT != mstDataNackR) + { + // something went wrong, so don't count last byte + cnt--; + } + break; + } + } + I2C_STOP(); + + return cnt; +} + +/************************************************************************************************** + * @fn HalI2CWrite + * + * @brief Write to the I2C bus as a Master. + * + * input parameters + * + * @param len - Number of bytes to write. + * @param pBuf - Pointer to the data buffer to write. + * + * output parameters + * + * None. + * + * @return The number of bytes successfully written. + */ +uint8 HalI2CWrite(uint8 len, uint8 *pBuf) +{ + if (i2cMstStrt(0) != mstAddrAckW) + { + len = 0; + } + + for (uint8 cnt = 0; cnt < len; cnt++) + { + I2C_WRITE(*pBuf++); + + if (I2CSTAT != mstDataAckW) + { + if (I2CSTAT == mstDataNackW) + { + len = cnt + 1; + } + else + { + len = cnt; + } + break; + } + } + + I2C_STOP(); + + return len; +} + +/************************************************************************************************** + * @fn HalI2CDisable + * + * @brief Places the I2C bus in inactive mode + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalI2CDisable(void) +{ + I2C_DISABLE(); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.h new file mode 100644 index 0000000..8f897ac --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_i2c.h @@ -0,0 +1,81 @@ +/************************************************************************************************** + Filename: hal_i2c.h + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: HAL I2C API for the CC2541ST. It implements the I2C master only. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_I2C_H +#define HAL_I2C_H + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_I2C_SLAVE_ADDR_DEF 0x41 + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef enum +{ + i2cClock_123KHZ = 0x00, + i2cClock_144KHZ = 0x01, + i2cClock_165KHZ = 0x02, + i2cClock_197KHZ = 0x03, + i2cClock_33KHZ = 0x80, + i2cClock_267KHZ = 0x81, + i2cClock_533KHZ = 0x82 +} i2cClock_t; + + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalI2CInit(uint8 address, i2cClock_t clockRate); +uint8 HalI2CRead(uint8 len, uint8 *pBuf); +uint8 HalI2CWrite(uint8 len, uint8 *pBuf); +void HalI2CDisable(void); + +#endif +/************************************************************************************************** + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_interrupt.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_interrupt.c new file mode 100644 index 0000000..2d553ea --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_interrupt.c @@ -0,0 +1,113 @@ +/************************************************************************************************** + Filename: hal_interrupt.c + Revised: $Date: 2012-08-10 19:21:08 -0700 (Fri, 10 Aug 2012) $ + Revision: $Revision: 31192 $ + + Description: Interrupt services routines for sensors + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_keys.h" +#include "hal_acc.h" +#include "hal_mag.h" +#include "hal_i2c.h" +/*************************************************************************************************** +* INTERRUPT SERVICE ROUTINE +***************************************************************************************************/ + +HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) +{ + + HAL_ENTER_ISR(); + if (HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) + { + halProcessKeyInterrupt(); + } + + /* + Clear the CPU interrupt flag for Port_0 + PxIFG has to be cleared before PxIF + */ + P0IFG = 0; + P0IF = 0; + HAL_EXIT_ISR(); +} + + +/************************************************************************************************** +* @fn halKeyPort1Isr +* +* @brief Port1 ISR +**************************************************************************************************/ +HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR ) +{ + HAL_ENTER_ISR(); + if ((HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) || (HAL_KEY_SW_3_PXIFG & HAL_KEY_SW_3_BIT)) + { + halProcessKeyInterrupt(); + } + /* + Clear the CPU interrupt flag for Port_1 + PxIFG has to be cleared before PxIF + */ + HAL_KEY_SW_2_PXIFG = 0; + HAL_KEY_SW_3_PXIFG = 0; + P1IF = 0; + HAL_EXIT_ISR(); +} + + +/************************************************************************************************** +* @fn halKeyPort2Isr +* +* @brief Port2 ISR +**************************************************************************************************/ + +HAL_ISR_FUNCTION( halI2CIsr, I2C_VECTOR ) +{ + HAL_ENTER_ISR(); + + /* + Clear the CPU interrupt flag for Port_2 + PxIFG has to be cleared before PxIF + Notes: P2_1 and P2_2 are debug lines. + */ + P2IFG = 0; + P2IF = 0; + + HAL_EXIT_ISR(); +} diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.c new file mode 100644 index 0000000..cf2a869 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.c @@ -0,0 +1,338 @@ +/************************************************************************************************** + Filename: hal_irtemp.c + Revised: $Date: 2013-04-05 07:25:57 -0700 (Fri, 05 Apr 2013) $ + Revision: $Revision: 33773 $ + + Description: Driver for the TI TMP06 infrared thermophile sensor. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_irtemp.h" +#include "hal_i2c.h" +#include "hal_sensor.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ + +/* Slave address */ +#define TMP006_I2C_ADDRESS 0x44 + +/* TMP006 register addresses */ +#define TMP006_REG_ADDR_VOLTAGE 0x00 +#define TMP006_REG_ADDR_TEMPERATURE 0x01 +#define TMP006_REG_ADDR_CONFIG 0x02 +#define TMP006_REG_MANF_ID 0xFE +#define TMP006_REG_PROD_ID 0xFE + +/* TMP006 register values */ +#define TMP006_VAL_CONFIG_RESET 0x7400 // Sensor reset state +#define TMP006_VAL_CONFIG_ON 0x7000 // Sensor on state +#define TMP006_VAL_CONFIG_OFF 0x0000 // Sensor off state +#define TMP006_VAL_MANF_ID 0x5449 // Manufacturer ID +#define TMP006_VAL_PROD_ID 0x0067 // Product ID + +/* Bit values */ +#define DATA_RDY_BIT 0x8000 // Data ready + +/* Register length */ +#define IRTEMP_REG_LEN 2 + + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalIRTempSelect(void); + + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static IRTemperature_States_t irtSensorState = TMP006_OFF; + +static uint8 configSensorReset[2] = {0x80, 0x00}; // Sensor reset +static uint8 configSensorOff[2] = {0x00, 0x80}; // Sensor standby +static uint8 configSensorOn[2] = {0x70, 0x00}; // Conversion time 0.25 sec + +/* ------------------------------------------------------------------------------------------------ +* Public functions +* ------------------------------------------------------------------------------------------------- +*/ + + +/************************************************************************************************** + * @fn HALIRTempInit + * + * @brief Initialise the temperature sensor driver + * + * @return none + **************************************************************************************************/ +void HALIRTempInit(void) +{ + irtSensorState = TMP006_OFF; + HalIRTempTurnOff(); +} + + +/************************************************************************************************** + * @fn HalIRTempTurnOn + * + * @brief Turn the sensor on + * + * @return none + **************************************************************************************************/ +void HalIRTempTurnOn(void) +{ + HalDcDcControl(ST_IRTEMP,true); + HalIRTempSelect(); + + if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN)) + { + irtSensorState = TMP006_IDLE; + } +} + +/************************************************************************************************** + * @fn HalIRTempTurnOff + * + * @brief Turn the sensor off + * + * @return none + **************************************************************************************************/ +void HalIRTempTurnOff(void) +{ + HalIRTempSelect(); + + if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN)) + { + irtSensorState = TMP006_OFF; + } + HalDcDcControl(ST_IRTEMP,false); +} + +/************************************************************************************************** + * @fn HalIRTempRead + * + * @brief Read the sensor voltage and sensor temperature registers + * + * @param Voltage and temperature in raw format (2 + 2 bytes) + * + * @return TRUE if valid data + **************************************************************************************************/ +bool HalIRTempRead(uint8 *pBuf) +{ + uint16 v; + uint16 t; + bool success; + + if (irtSensorState != TMP006_DATA_READY) + { + return FALSE; + } + + HalIRTempSelect(); + + // Read the sensor registers + success = HalSensorReadReg(TMP006_REG_ADDR_VOLTAGE, (uint8 *)&v,IRTEMP_REG_LEN ); + if (success) + { + success = HalSensorReadReg(TMP006_REG_ADDR_TEMPERATURE, (uint8 *)&t,IRTEMP_REG_LEN ); + } + + if (success) + { + // Store values + pBuf[0] = HI_UINT16( v ); + pBuf[1] = LO_UINT16( v ); + pBuf[2] = HI_UINT16( t ); + pBuf[3] = LO_UINT16( t ); + } + + // Turn off sensor + if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN)) + { + irtSensorState = TMP006_OFF; + } + HalDcDcControl(ST_IRTEMP,false); + + return success; +} + + +/************************************************************************************************** + * @fn HalIRTempStatus + * + * @brief Read the state of the sensor + * + * @return none + **************************************************************************************************/ +IRTemperature_States_t HalIRTempStatus(void) +{ + if (irtSensorState != TMP006_OFF) + { + bool success; + uint16 v; + + // Select this sensor on the I2C bus + HalIRTempSelect(); + + // Read the data ready bit + success = HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&v,IRTEMP_REG_LEN ); + if ((v & DATA_RDY_BIT) && success) + { + irtSensorState = TMP006_DATA_READY; + } + } + + return irtSensorState; +} + + +/************************************************************************************************** + * @fn HalIRTempTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalIRTempTest(void) +{ + uint16 val; + + // Select this sensor on the I2C bus + HalIRTempSelect(); + + // Check manufacturer ID + ST_ASSERT(HalSensorReadReg(TMP006_REG_MANF_ID, (uint8 *)&val, IRTEMP_REG_LEN)); + val = (LO_UINT16(val) << 8) | HI_UINT16(val); + ST_ASSERT(val == TMP006_VAL_MANF_ID); + + // Reset sensor + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorReset, IRTEMP_REG_LEN)); + + // Check config register (reset) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_RESET); + + // Turn sensor off + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff,IRTEMP_REG_LEN)); + + // Check config register (off) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_OFF); + + // Turn sensor on + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN)); + + // Check config register (on) + ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN)); + val = ((LO_UINT16(val) << 8) | HI_UINT16(val)); + ST_ASSERT(val == TMP006_VAL_CONFIG_ON); + + // Turn sensor off + ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN)); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** + * @fn HalIRTempSelect + * + * @brief Select the TMP006 slave and set the I2C bus speed + * + * @return none + **************************************************************************************************/ +static void HalIRTempSelect(void) +{ + // Select slave and set clock rate + HalI2CInit(TMP006_I2C_ADDRESS, i2cClock_533KHZ); +} + +/* Conversion algorithm for die temperature + * ================================================ + * +double calcTmpLocal(uint16 rawT) +{ + //-- calculate die temperature [°C] -- + m_tmpAmb = (double)((qint16)rawT)/128.0; + + return m_tmpAmb; +} + +* +* Conversion algorithm for target temperature +* +double calcTmpTarget(uint16 rawT) +{ + //-- calculate target temperature [°C] - + double Vobj2 = (double)(qint16)rawT; + Vobj2 *= 0.00000015625; + + double Tdie2 = m_tmpAmb + 273.15; + const double S0 = 6.4E-14; // Calibration factor + + const double a1 = 1.75E-3; + const double a2 = -1.678E-5; + const double b0 = -2.94E-5; + const double b1 = -5.7E-7; + const double b2 = 4.63E-9; + const double c2 = 13.4; + const double Tref = 298.15; + double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2)); + double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2); + double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2); + double tObj = pow(pow(Tdie2,4) + (fObj/S),.25); + tObj = (tObj - 273.15); + + return tObj; +} + +*/ + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.h new file mode 100644 index 0000000..c9547b6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_irtemp.h @@ -0,0 +1,83 @@ +/************************************************************************************************** + Filename: hal_irtemp.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the IR temperature sensor driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_IRTEMP_H +#define HAL_IRTEMP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ +typedef enum +{ + TMP006_OFF, // IR Temperature Sleeping + TMP006_IDLE, // IR Temperature On and Configured + TMP006_DATA_READY // IR Temperature On, Configured and Data is Ready +} IRTemperature_States_t; + + +/********************************************************************* + * FUNCTIONS + */ +void HALIRTempInit(void); +void HalIRTempTurnOn(void); +void HalIRTempTurnOff(void); +bool HalIRTempRead(uint8 *irTempData); +bool HalIRTempTest(void); +IRTemperature_States_t HalIRTempStatus(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_IRTEMP_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.c new file mode 100644 index 0000000..d477aaf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.c @@ -0,0 +1,400 @@ +/************************************************************************************************** + Filename: hal_keys.c + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: This file contains the interface to the HAL KEY Service. + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* +NOTE: If polling is used, the hal_driver task schedules the KeyRead() +to occur every 100ms. This should be long enough to naturally +debounce the keys. The KeyRead() function remembers the key +state of the previous poll and will only return a non-zero +value if the key state changes. + +NOTE: If interrupts are used, the KeyRead() function is scheduled +25ms after the interrupt occurs by the ISR. This delay is used +for key debouncing. The ISR disables any further Key interrupt +until KeyRead() is executed. KeyRead() will re-enable Key +interrupts after executing. Unlike polling, when interrupts +are enabled, the previous key state is not remembered. This +means that KeyRead() will return the current state of the keys +(not a change in state of the keys). + +NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by +the ISR. Therefore, the joystick movements will only be detected +during a pushbutton interrupt caused by S1 or the center joystick +pushbutton. + +NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally +high state to a low state. This transition is typically clean. The +duration of the low state is around 200ms. When the signal returns +to the high state, there is a high likelihood of signal bounce, which +causes a unwanted interrupts. Normally, we would set the interrupt +edge to falling edge to generate an interrupt when S1 is pushed, but +because of the signal bounce, it is better to set the edge to rising +edge to generate an interrupt when S1 is released. The debounce logic +can then filter out the signal bounce. The result is that we typically +get only 1 interrupt per button push. This mechanism is not totally +foolproof because occasionally, signal bound occurs during the falling +edge as well. A similar mechanism is used to handle the joystick +pushbutton on the DB. For the EB, we do not have independent control +of the interrupt edge for the S1 and center joystick pushbutton. As +a result, only one or the other pushbuttons work reasonably well with +interrupts. The default is the make the S1 switch on the EB work more +reliably. + +*********************************************************************/ + +/************************************************************************************************** +* INCLUDES +**************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_adc.h" +#include "hal_keys.h" +#include "osal.h" + +#if (defined HAL_KEY) && (HAL_KEY == TRUE) + +/************************************************************************************************** +* MACROS +**************************************************************************************************/ + +/************************************************************************************************** +* CONSTANTS +**************************************************************************************************/ + + + + + + +/************************************************************************************************** +* TYPEDEFS +**************************************************************************************************/ + + +/************************************************************************************************** +* GLOBAL VARIABLES +**************************************************************************************************/ +static uint8 halKeySavedKeys; /* used to store previous key state in polling mode */ +static halKeyCBack_t pHalKeyProcessFunction; +static uint8 HalKeyConfigured; +bool Hal_KeyIntEnable; /* interrupt enable/disable flag */ + +/************************************************************************************************** +* FUNCTIONS - Local +**************************************************************************************************/ + + + +/************************************************************************************************** +* FUNCTIONS - API +**************************************************************************************************/ + + +/************************************************************************************************** +* @fn HalKeyInit +* +* @brief Initilize Key Service +* +* @param none +* +* @return None +**************************************************************************************************/ +void HalKeyInit( void ) +{ + /* Initialize previous key to 0 */ + halKeySavedKeys = 0; + + HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */ + + HAL_KEY_SW_2_SEL &= ~(HAL_KEY_SW_2_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_2_DIR &= ~(HAL_KEY_SW_2_BIT); /* Set pin direction to Input */ + + HAL_KEY_SW_3_SEL &= ~(HAL_KEY_SW_3_BIT); /* Set pin function to GPIO */ + HAL_KEY_SW_3_DIR &= ~(HAL_KEY_SW_3_BIT); /* Set pin direction to Input */ + + + /* Initialize callback function */ + pHalKeyProcessFunction = NULL; + + /* Start with key is not configured */ + HalKeyConfigured = FALSE; +} + + +/************************************************************************************************** +* @fn HalKeyConfig +* +* @brief Configure the Key serivce +* +* @param interruptEnable - TRUE/FALSE, enable/disable interrupt +* cback - pointer to the CallBack function +* +* @return None +**************************************************************************************************/ +void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) +{ + /* Enable/Disable Interrupt or */ + Hal_KeyIntEnable = interruptEnable; + + /* Register the callback fucntion */ + pHalKeyProcessFunction = cback; + + /* Determine if interrupt is enable or not */ + if (Hal_KeyIntEnable) + { + /* Rising/Falling edge configuratinn */ + PICTL |= (HAL_KEY_SW_1_EDGEBIT | HAL_KEY_SW_2_3_EDGEBIT); /* Set the edge bit to set falling edge to give int */ + + HAL_KEY_SW_1_ICTL |= HAL_KEY_SW_1_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_1_IEN |= HAL_KEY_SW_1_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear any pending interrupt */ + + HAL_KEY_SW_2_ICTL |= HAL_KEY_SW_2_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_2_IEN |= HAL_KEY_SW_2_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear any pending interrupt */ + + HAL_KEY_SW_3_ICTL |= HAL_KEY_SW_3_ICTLBIT; /* enable interrupt generation at port */ + HAL_KEY_SW_3_IEN |= HAL_KEY_SW_3_IENBIT; /* enable CPU interrupt */ + HAL_KEY_SW_3_PXIFG = (uint8)(~(HAL_KEY_SW_3_BIT)); /* Clear any pending interrupt */ + + /* Do this only after the hal_key is configured - to work with sleep stuff */ + if (HalKeyConfigured == TRUE) + { + osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */ + } + } + else /* Interrupts NOT enabled */ + { + HAL_KEY_SW_1_ICTL &= ~(HAL_KEY_SW_1_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_1_IEN &= ~(HAL_KEY_SW_1_IENBIT); /* Clear interrupt enable bit */ + + HAL_KEY_SW_2_ICTL &= ~(HAL_KEY_SW_2_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_2_IEN &= ~(HAL_KEY_SW_2_IENBIT); /* Clear interrupt enable bit */ + + HAL_KEY_SW_3_ICTL &= ~(HAL_KEY_SW_3_ICTLBIT); /* don't generate interrupt */ + HAL_KEY_SW_3_IEN &= ~(HAL_KEY_SW_3_IENBIT); /* Clear interrupt enable bit */ + + osal_set_event(Hal_TaskID, HAL_KEY_EVENT); + } + + /* Key now is configured */ + HalKeyConfigured = TRUE; +} + + +/************************************************************************************************** +* @fn HalKeyRead +* +* @brief Read the current value of a key +* +* @param None +* +* @return keys - current keys status +**************************************************************************************************/ +uint8 HalKeyRead ( void ) +{ + uint8 keys = 0; + + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } + if (!(HAL_KEY_SW_3_PORT & HAL_KEY_SW_3_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_3; + } + + return keys; +} + + +/************************************************************************************************** +* @fn HalKeyPoll +* +* @brief Called by hal_driver to poll the keys +* +* @param None +* +* @return None +**************************************************************************************************/ +void HalKeyPoll (void) +{ + uint8 keys = 0; + uint8 notify = 0; + + if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_1; + } + if (!(HAL_KEY_SW_2_PORT & HAL_KEY_SW_2_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_2; + } + if (!(HAL_KEY_SW_3_PORT & HAL_KEY_SW_3_BIT)) /* Key is active low */ + { + keys |= HAL_KEY_SW_3; + } + + (void) keys; + + /* If interrupts are not enabled, previous key status and current key status + * are compared to find out if a key has changed status. + */ + if (!Hal_KeyIntEnable) + { + if (keys == halKeySavedKeys) + { + /* Exit - since no keys have changed */ + return; + } + else + { + notify = 1; + } + } + else + { + /* Key interrupt handled here */ + if (keys) + { + notify = 1; + } + } + + /* Store the current keys for comparation next time */ + halKeySavedKeys = keys; + + /* Invoke Callback if new keys were depressed */ + if (notify && (pHalKeyProcessFunction)) + { + (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); + + } +} + +/************************************************************************************************** +* @fn halProcessKeyInterrupt +* +* @brief Checks to see if it's a valid key interrupt, saves interrupt driven key states for +* processing by HalKeyRead(), and debounces keys by scheduling HalKeyRead() 25ms later. +* +* @param +* +* @return +**************************************************************************************************/ +void halProcessKeyInterrupt (void) +{ + bool valid=FALSE; + + if( HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) /* Interrupt Flag has been set by SW1 */ + { + HAL_KEY_SW_1_PXIFG = ~(HAL_KEY_SW_1_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT) /* Interrupt Flag has been set by SW2 */ + { + HAL_KEY_SW_2_PXIFG = ~(HAL_KEY_SW_2_BIT); /* Clear Interrupt Flag */ + valid = TRUE; + } + if (HAL_KEY_SW_3_PXIFG & HAL_KEY_SW_3_BIT) /* Interrupt Flag has been set by SW3 */ + { + HAL_KEY_SW_3_PXIFG = (uint8)(~(HAL_KEY_SW_3_BIT)); /* Clear Interrupt Flag */ + valid = TRUE; + } + + if (valid) + { + osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE); + } +} + +/************************************************************************************************** +* @fn HalKeyEnterSleep +* +* @brief - Get called to enter sleep mode +* +* @param +* +* @return +**************************************************************************************************/ +void HalKeyEnterSleep ( void ) +{ +} + +/************************************************************************************************** +* @fn HalKeyExitSleep +* +* @brief - Get called when sleep is over +* +* @param +* +* @return - return saved keys +**************************************************************************************************/ +uint8 HalKeyExitSleep ( void ) +{ + /* Wake up and read keys */ + return ( HalKeyRead () ); +} + +#else + + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + +#endif /* HAL_KEY */ + + + + + +/************************************************************************************************** +**************************************************************************************************/ + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.h new file mode 100644 index 0000000..83336a4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_keys.h @@ -0,0 +1,179 @@ +/************************************************************************************************** + Filename: hal_keys.h + Revised: $Date: 2012-08-08 13:29:09 -0700 (Wed, 08 Aug 2012) $ + Revision: $Revision: 31145 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HAL_KEYS_H +#define HAL_KEYS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_board.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ +#define HAL_KEY_INTERRUPT_DISABLE 0x00 +#define HAL_KEY_INTERRUPT_ENABLE 0x01 + +/* Key state - shift or nornal */ +#define HAL_KEY_STATE_NORMAL 0x00 +#define HAL_KEY_STATE_SHIFT 0x01 + +/* Switches (keys) */ +#define HAL_KEY_SW_1 0x01 // S1 Side Button +#define HAL_KEY_SW_2 0x02 // S2 Carbon button +#define HAL_KEY_SW_3 0x04 // S3 Carbon button + +#define HAL_KEY_DEBOUNCE_VALUE 25 + +/* CPU port interrupt */ +#define HAL_KEY_CPU_PORT_0_IF P0IF +#define HAL_KEY_CPU_PORT_2_IF P2IF + +/* S1 is at P0.0 */ +#define HAL_KEY_SW_1_PORT P0 +#define HAL_KEY_SW_1_BIT BV(0) +#define HAL_KEY_SW_1_SEL P0SEL +#define HAL_KEY_SW_1_DIR P0DIR + +/* S2 is at P1.6 */ +#define HAL_KEY_SW_2_PORT P1 +#define HAL_KEY_SW_2_BIT BV(6) +#define HAL_KEY_SW_2_SEL P1SEL +#define HAL_KEY_SW_2_DIR P1DIR + +/* S3 is at P1.7 */ +#define HAL_KEY_SW_3_PORT P1 +#define HAL_KEY_SW_3_BIT BV(7) +#define HAL_KEY_SW_3_SEL P1SEL +#define HAL_KEY_SW_3_DIR P1DIR + + +#define HAL_KEY_SW_1_IEN IEN1 /* CPU interrupt mask register */ +#define HAL_KEY_SW_1_ICTL P0IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_1_ICTLBIT BV(0) /* P0IEN - P0.0 enable/disable bit */ +#define HAL_KEY_SW_1_IENBIT BV(5) /* Mask bit for all of Port_0 */ +#define HAL_KEY_SW_1_PXIFG P0IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_2_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_SW_2_ICTL P1IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_2_ICTLBIT BV(6) /* P0IEN - P1.6 enable/disable bit */ +#define HAL_KEY_SW_2_IENBIT BV(4) /* Mask bit for all of Port_1 */ +#define HAL_KEY_SW_2_PXIFG P1IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_3_IEN IEN2 /* CPU interrupt mask register */ +#define HAL_KEY_SW_3_ICTL P1IEN /* Port Interrupt Control register */ +#define HAL_KEY_SW_3_ICTLBIT BV(7) /* P0IEN - P1.7 enable/disable bit */ +#define HAL_KEY_SW_3_IENBIT BV(4) /* Mask bit for all of Port_1 */ +#define HAL_KEY_SW_3_PXIFG P1IFG /* Interrupt flag at source */ + +#define HAL_KEY_SW_1_EDGEBIT BV(0) +#define HAL_KEY_SW_2_3_EDGEBIT BV(2) + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +void halProcessKeyInterrupt(void); + + +/************************************************************************************************** +**************************************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_led.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_led.c new file mode 100644 index 0000000..85aa3d0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_led.c @@ -0,0 +1,493 @@ +/************************************************************************************************** + Filename: hal_led.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This file contains the interface to the HAL LED Service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#include "hal_mcu.h" +#include "hal_defs.h" +#include "hal_types.h" +#include "hal_drivers.h" +#include "hal_led.h" +#include "osal.h" +#include "hal_board.h" + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +/* LED control structure */ +typedef struct { + uint8 mode; /* Operation mode */ + uint8 todo; /* Blink cycles left */ + uint8 onPct; /* On cycle percentage */ + uint16 time; /* On/off cycle time (msec) */ + uint32 next; /* Time for next change */ +} HalLedControl_t; + +typedef struct +{ + HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS]; + uint8 sleepActive; +} HalLedStatus_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +static uint8 HalLedState; // LED state at last set/clr/blink update + +#if HAL_LED == TRUE +static uint8 HalSleepLedState; // LED state at last set/clr/blink update +static uint8 preBlinkState; // Original State before going to blink mode + // bit 0, 1, 2, 3 represent led 0, 1, 2, 3 +#endif + +#ifdef BLINK_LEDS + static HalLedStatus_t HalLedStatusControl; +#endif + +/*************************************************************************************************** + * LOCAL FUNCTION + ***************************************************************************************************/ +#if (HAL_LED == TRUE) +void HalLedUpdate (void); +void HalLedOnOff (uint8 leds, uint8 mode); +#endif /* HAL_LED */ + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/*************************************************************************************************** + * @fn HalLedInit + * + * @brief Initialize LED Service + * + * @param init - pointer to void that contains the initialized value + * + * @return None + ***************************************************************************************************/ +void HalLedInit (void) +{ +#if (HAL_LED == TRUE) + /* Initialize all LEDs to OFF */ + HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF); +#endif /* HAL_LED */ +#ifdef BLINK_LEDS + /* Initialize sleepActive to FALSE */ + HalLedStatusControl.sleepActive = FALSE; +#endif +} + +/*************************************************************************************************** + * @fn HalLedSet + * + * @brief Tun ON/OFF/TOGGLE given LEDs + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * mode - BLINK, FLASH, TOGGLE, ON, OFF + * @return None + ***************************************************************************************************/ +uint8 HalLedSet (uint8 leds, uint8 mode) +{ + +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + switch (mode) + { + case HAL_LED_MODE_BLINK: + /* Default blink, 1 time, D% duty cycle */ + HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + + case HAL_LED_MODE_FLASH: + /* Default flash, N times, D% duty cycle */ + HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); + break; + + case HAL_LED_MODE_ON: + case HAL_LED_MODE_OFF: + case HAL_LED_MODE_TOGGLE: + + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + if (mode != HAL_LED_MODE_TOGGLE) + { + sts->mode = mode; /* ON or OFF */ + } + else + { + sts->mode ^= HAL_LED_MODE_ON; /* Toggle */ + } + HalLedOnOff (led, sts->mode); + leds ^= led; + } + led <<= 1; + sts++; + } + break; + + default: + break; + } + +#elif (HAL_LED == TRUE) + LedOnOff(leds, mode); +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; +#endif /* BLINK_LEDS && HAL_LED */ + + return ( HalLedState ); + +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) + uint8 led; + HalLedControl_t *sts; + + if (leds && percent && period) + { + if (percent < 100) + { + led = HAL_LED_1; + leds &= HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + while (leds) + { + if (leds & led) + { + /* Store the current state of the led before going to blinking if not already blinking */ + if(sts->mode < HAL_LED_MODE_BLINK ) + preBlinkState |= (led & HalLedState); + + sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */ + sts->time = period; /* Time for one on/off cycle */ + sts->onPct = percent; /* % of cycle LED is on */ + sts->todo = numBlinks; /* Number of blink cycles */ + if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */ + sts->next = osal_GetSystemClock(); /* Start now */ + sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ + leds ^= led; + } + led <<= 1; + sts++; + } + osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT); + } + else + { + HalLedSet (leds, HAL_LED_MODE_ON); /* >= 100%, turn on */ + } + } + else + { + HalLedSet (leds, HAL_LED_MODE_OFF); /* No on time, turn off */ + } +#elif (HAL_LED == TRUE) + percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON; + HalLedOnOff (leds, percent); /* Toggle */ +#else + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; +#endif /* BLINK_LEDS && HAL_LED */ +} + +#if (HAL_LED == TRUE) +/*************************************************************************************************** + * @fn HalLedUpdate + * + * @brief Update leds to work with blink + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedUpdate (void) +{ + uint8 led; + uint8 pct; + uint8 leds; + HalLedControl_t *sts; + uint32 time; + uint16 next; + uint16 wait; + + next = 0; + led = HAL_LED_1; + leds = HAL_LED_ALL; + sts = HalLedStatusControl.HalLedControlTable; + + /* Check if sleep is active or not */ + if (!HalLedStatusControl.sleepActive) + { + while (leds) + { + if (leds & led) + { + if (sts->mode & HAL_LED_MODE_BLINK) + { + time = osal_GetSystemClock(); + if (time >= sts->next) + { + if (sts->mode & HAL_LED_MODE_ON) + { + pct = 100 - sts->onPct; /* Percentage of cycle for off */ + sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */ + HalLedOnOff (led, HAL_LED_MODE_OFF); /* Turn it off */ + + if (!(sts->mode & HAL_LED_MODE_FLASH)) + { + sts->todo--; /* Not continuous, reduce count */ + if (!sts->todo) + { + sts->mode ^= HAL_LED_MODE_BLINK; /* No more blinks */ + } + } + } + else + { + pct = sts->onPct; /* Percentage of cycle for on */ + sts->mode |= HAL_LED_MODE_ON; /* Say it's on */ + HalLedOnOff (led, HAL_LED_MODE_ON); /* Turn it on */ + } + + if (sts->mode & HAL_LED_MODE_BLINK) + { + wait = (((uint32)pct * (uint32)sts->time) / 100); + sts->next = time + wait; + } + else + { + /* no more blink, no more wait */ + wait = 0; + /* After blinking, set the LED back to the state before it blinks */ + HalLedSet (led, ((preBlinkState & led)!=0)?HAL_LED_MODE_ON:HAL_LED_MODE_OFF); + /* Clear the saved bit */ + preBlinkState &= (led ^ 0xFF); + } + } + else + { + wait = sts->next - time; /* Time left */ + } + + if (!next || ( wait && (wait < next) )) + { + next = wait; + } + } + leds ^= led; + } + led <<= 1; + sts++; + } + + if (next) + { + osal_start_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT, next); /* Schedule event */ + } + } +} + +/*************************************************************************************************** + * @fn HalLedOnOff + * + * @brief Turns specified LED ON or OFF + * + * @param leds - LED bit mask + * mode - LED_ON,LED_OFF, + * + * @return none + ***************************************************************************************************/ +void HalLedOnOff (uint8 leds, uint8 mode) +{ + if (leds & HAL_LED_1) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED1(); + } + else + { + HAL_TURN_OFF_LED1(); + } + } + + if (leds & HAL_LED_2) + { + if (mode == HAL_LED_MODE_ON) + { + HAL_TURN_ON_LED2(); + } + else + { + HAL_TURN_OFF_LED2(); + } + } + + /* Remember current state */ + if (mode) + { + HalLedState |= leds; + } + else + { + HalLedState &= (leds ^ 0xFF); + } +} +#endif /* HAL_LED */ + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ +#if (HAL_LED == TRUE) + return HalLedState; +#else + return 0; +#endif +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ +#ifdef BLINK_LEDS + /* Sleep ON */ + HalLedStatusControl.sleepActive = TRUE; +#endif /* BLINK_LEDS */ + +#if (HAL_LED == TRUE) + /* Save the state of each led */ + HalSleepLedState = 0; + HalSleepLedState |= HAL_STATE_LED1(); + HalSleepLedState |= HAL_STATE_LED2() << 1; + + /* TURN OFF all LEDs to save power */ + HalLedOnOff (HAL_LED_ALL, HAL_LED_MODE_OFF); + +#endif /* HAL_LED */ + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#if (HAL_LED == TRUE) + + /* Load back the saved state */ + HalLedOnOff(HalSleepLedState, HAL_LED_MODE_ON); + + /* Restart - This takes care BLINKING LEDS */ + HalLedUpdate(); +#endif /* HAL_LED */ + +#ifdef BLINK_LEDS + /* Sleep OFF */ + HalLedStatusControl.sleepActive = FALSE; +#endif /* BLINK_LEDS */ +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.c new file mode 100644 index 0000000..a552791 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.c @@ -0,0 +1,299 @@ +/************************************************************************************************** + Filename: hal_mag.c + Revised: $Date: 2012-11-15 01:49:26 -0800 (Thu, 15 Nov 2012) $ + Revision: $Revision: 32193 $ + + Description: Driver for the Freescale MAG3110 Magnetometer + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_mag.h" +#include "hal_sensor.h" +#include "hal_i2c.h" + +/* ------------------------------------------------------------------------------------------------ +* Constants +* ------------------------------------------------------------------------------------------------ +*/ +#define MAG_REG_READ_ALL_LEN 6 +#define MAG_REG_FAST_READ_LEN 3 + +// MAG3110 register addresses +#define MAG_REG_ADDR_DR_STATUS 0x00 // Read +#define MAG_REG_ADDR_X_MSB 0x01 // Read +#define MAG_REG_ADDR_X_LSB 0x02 // Read +#define MAG_REG_ADDR_Y_MSB 0x03 // Read +#define MAG_REG_ADDR_Y_LSB 0x04 // Read +#define MAG_REG_ADDR_Z_MSB 0x05 // Read +#define MAG_REG_ADDR_Z_LSB 0x06 // Read +#define MAG_REG_ADDR_WHO_AM_I 0x07 // Read +#define MAG_REG_ADDR_SYSMOD 0x08 // Read +#define MAG_REG_ADDR_OFF_X_MSB 0x09 // Read/Write +#define MAG_REG_ADDR_OFF_X_LSB 0x0A // Read/Write +#define MAG_REG_ADDR_OFF_Y_MSB 0x0B // Read/Write +#define MAG_REG_ADDR_OFF_Y_LSB 0x0C // Read/Write +#define MAG_REG_ADDR_OFF_Z_MSB 0x0D // Read/Write +#define MAG_REG_ADDR_OFF_Z_LSB 0x0E // Read/Write +#define MAG_REG_ADDR_DIE_TEMP 0x0F // Read +#define MAG_REG_ADDR_CTRL_1 0x10 // Read/Write +#define MAG_REG_ADDR_CTRL_2 0x11 // Read/Write + +#define MAG_REG_ADDR_READ_START MAG_REG_ADDR_X_MSB + +// CTRL1 BIT MASKS +#define MAG_REG_CTRL_FR 0x04 // Fast Read Enable +#define MAG_REG_CTRL_TM 0x02 // Trigger Measurement Enable +#define MAG_REG_CTRL_EN 0x01 // Active Mode Enable + +#define MAG_REG_CTRL_DR_10HZ_OSR_1 0x60 +#define MAG_REG_CTRL_DR_10HZ_OSR_2 0x48 +#define MAG_REG_CTRL_DR_10HZ_OSR_4 0x30 +#define MAG_REG_CTRL_DR_10HZ_OSR_8 0x10 + +// Test values +#define WHO_AM_I_VALUE 0xC4 +#define CTRL1_TEST_VALUE 0xF8 + +// Control register values +#define MAG_REG_CTRL_ON MAG_REG_CTRL_DR_10HZ_OSR_1 | MAG_REG_CTRL_EN +#define MAG_REG_CTRL2_AMN 0x80 +#define MAG_REG_CTRL_OFF 0x00 + +/* ------------------------------------------------------------------------------------------------ +* Typedefs +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Macros +* ------------------------------------------------------------------------------------------------ +*/ + +/* ------------------------------------------------------------------------------------------------ +* Local Functions +* ------------------------------------------------------------------------------------------------ +*/ +static void HalMagSelect(void); + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static Magnetometer_States_t sensorState = MAG3110_OFF; +static uint8 halMagSensorConfig = MAG_REG_CTRL_ON; +static uint8 halMagSensorOff = MAG_REG_CTRL_OFF; +static uint8 halMagAutoMrstEn = MAG_REG_CTRL2_AMN; + + +/************************************************************************************************** + * @fn HalMagInit + * + * @brief Initialise the magnetometer driver + * + * @return none + **************************************************************************************************/ +void HalMagInit(void) +{ + sensorState = MAG3110_OFF; +} + + +/************************************************************************************************** + * @fn HalMagStatus + * + * @brief Read the magnetometer status + * + * @return none + **************************************************************************************************/ +Magnetometer_States_t HalMagStatus( void ) +{ + if( sensorState == MAG3110_IDLE) + { + uint8 status = 0; + + HalMagSelect(); + HalSensorReadReg( MAG_REG_ADDR_DR_STATUS, &status, 1); + if(status!=0) + { + sensorState = MAG3110_DATA_READY; + } + } + + return sensorState; +} + +/************************************************************************************************** +* @fn HalMagTurnOn +* +* @brief Turn on the MAG3110. +* +* @return none +*/ +void HalMagTurnOn(void) +{ + HalMagSelect(); + + HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &halMagSensorConfig, sizeof(halMagSensorConfig)); + HalSensorWriteReg(MAG_REG_ADDR_CTRL_2, &halMagAutoMrstEn, sizeof(halMagAutoMrstEn)); + sensorState = MAG3110_IDLE; +} + + +/************************************************************************************************** +* @fn HalMagTurnOff +* +* @brief Turn off the MAG3110. +* +* @return none +*/ +void HalMagTurnOff(void) +{ + HalMagSelect(); + + HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &halMagSensorOff, sizeof(halMagSensorOff)); + sensorState = MAG3110_OFF; +} + + +/************************************************************************************************** +* @fn HalMagRead +* +* @brief Read data from the magnetometer +* +* @param pBuf - buffer to hold the data +* +* @return TRUE if valid data +*/ +bool HalMagRead(uint8 *pBuf) +{ + uint8 tmp[MAG_REG_READ_ALL_LEN]; + bool f; + + HalMagSelect(); + + f = HalSensorReadReg(MAG_REG_ADDR_READ_START,tmp,MAG_REG_READ_ALL_LEN); + if (f) + { + // Swap bytes in each value-pair + pBuf[0] = tmp[1]; + pBuf[1] = tmp[0]; + pBuf[2] = tmp[3]; + pBuf[3] = tmp[2]; + pBuf[4] = tmp[5]; + pBuf[5] = tmp[4]; + } + sensorState = MAG3110_IDLE; + + return f; +} + + +/************************************************************************************************** + * @fn HalMagTest + * + * @brief Run a sensor self-test + * + * @return TRUE if passed, FALSE if failed + **************************************************************************************************/ +bool HalMagTest(void) +{ + uint8 val; + + // Select this sensor on the I2C bus + HalMagSelect(); + + // Check who-am-i register + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_WHO_AM_I, &val, sizeof(val))); + ST_ASSERT(val==WHO_AM_I_VALUE); + + // Check CTRL_REG1 in standby mode + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(val==MAG_REG_CTRL_OFF); + + // Check that CTRL_REG1 can be written + val = CTRL1_TEST_VALUE; + ST_ASSERT(HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + ST_ASSERT(val==CTRL1_TEST_VALUE); + + // Restore default value + val = MAG_REG_CTRL_OFF; + ST_ASSERT(HalSensorWriteReg(MAG_REG_ADDR_CTRL_1, &val, sizeof(val))); + + // Check that the sensor is in standby mode + ST_ASSERT(HalSensorReadReg(MAG_REG_ADDR_SYSMOD, &val, sizeof(val))); + ST_ASSERT(val==0); + + return TRUE; +} + +/* ------------------------------------------------------------------------------------------------ +* Private functions +* ------------------------------------------------------------------------------------------------- +*/ + +/************************************************************************************************** +* @fn HalMagSelect +* +* @brief Select the magnetometer on the I2C-bus +* +* @return +*/ +static void HalMagSelect(void) +{ + //Set up I2C that is used to communicate with MAG3110 + HalI2CInit(HAL_MAG3110_I2C_ADDRESS,i2cClock_267KHZ); +} + + +/* Conversion algorithm for X, Y, Z + * ================================ + * +float calcMagn(int16 rawX) +{ + float v; + + //-- calculate magnetic force, unit uT, range -1000, +1000 + v = (rawX * 1.0) / (65536 / 2000); + + return v; +} +*/ + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.h new file mode 100644 index 0000000..26f66e9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mag.h @@ -0,0 +1,91 @@ +/************************************************************************************************** + Filename: hal_mag.h + Revised: $Date: 2012-08-15 16:58:46 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31257 $ + + Description: Interface to the magnometer driver + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef HAL_MAG_H +#define HAL_MAG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "comdef.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MAG3110_I2C_ADDRESS 0x0E +#define HAL_MAG3110_PERIOD_MASK 0x10 +#define HAL_MAG3110_ENABLE_MASK 0x01 + + /* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ +typedef enum +{ + MAG3110_OFF, // Magnetometer Sleeping + MAG3110_IDLE, // Magnetometer On and Configured + MAG3110_DATA_READY, // Magnetometer On, Configured and Data is Ready +} Magnetometer_States_t; + +/* ------------------------------------------------------------------------------------------------ + * Functions + * ------------------------------------------------------------------------------------------------ + */ +void HalMagInit(void); +void HalMagTurnOn(void); +void HalMagTurnOff(void); +bool HalMagRead(uint8 *pBuf); +bool HalMagTest(void); +Magnetometer_States_t HalMagStatus( void ); + +/************************************************************************************************** +*/ + +#ifdef __cplusplus +}; +#endif + +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mcu.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mcu.h new file mode 100644 index 0000000..56eded1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_mcu.h @@ -0,0 +1,202 @@ +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef _HAL_MCU_H +#define _HAL_MCU_H + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#include "hal_defs.h" +#include "hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_MCU_CC2540 + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ +#ifdef __IAR_SYSTEMS_ICC__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_IAR +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define _PRAGMA(x) _Pragma(#x) +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ---------------------- Keil Compiler ---------------------- */ +#elif defined __KEIL__ + +#if defined( CC2541) || defined( CC2541S ) +#include +#else // CC2540 +#include +#endif // CC2541 || CC2541S + +#define HAL_COMPILER_KEIL +#define HAL_MCU_LITTLE_ENDIAN() 0 +#define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v +#define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) + +/* ------------------ Unrecognized Compiler ------------------ */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ +#define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) +#define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) +#define HAL_INTERRUPTS_ARE_ENABLED() (EA) + +typedef unsigned char halIntState_t; +#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) +#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) +#define HAL_CRITICAL_STATEMENT(x) st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); ) + +#ifdef __IAR_SYSTEMS_ICC__ + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ + #define HAL_ENTER_ISR() { halIntState_t _isrIntState = EA; HAL_ENABLE_INTERRUPTS(); + #define HAL_EXIT_ISR() EA = _isrIntState; } +#else + #define HAL_ENTER_ISR() + #define HAL_EXIT_ISR() +#endif /* __IAR_SYSTEMS_ICC__ */ + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#define WD_EN BV(3) +#define WD_MODE BV(2) +#define WD_INT_1900_USEC (BV(0) | BV(1)) +#define WD_RESET1 (0xA0 | WD_EN | WD_INT_1900_USEC) +#define WD_RESET2 (0x50 | WD_EN | WD_INT_1900_USEC) +#define WD_KICK() st( WDCTL = (0xA0 | WDCTL & 0x0F); WDCTL = (0x50 | WDCTL & 0x0F); ) + +/* disable interrupts, set watchdog timer, wait for reset */ +#define HAL_SYSTEM_RESET() st( HAL_DISABLE_INTERRUPTS(); WDCTL = WD_RESET1; WDCTL = WD_RESET2; for(;;); ) + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ +#define REV_A 0x00 /* workaround turned off */ +#define REV_B 0x11 /* PG1.1 */ +#define REV_C 0x20 /* PG2.0 */ +#define REV_D 0x21 /* PG2.1 */ + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ +#define PCON_IDLE BV(0) /* Writing 1 to force CC2540 to enter sleep mode */ + +/* SLEEPCMD bit definitions */ +#define OSC_PD BV(2) /* Idle Osc: powered down=1 */ +#define PMODE (BV(1) | BV(0)) /* Power mode bits */ + +/* SLEEPSTA bit definitions */ +#define XOSC_STB BV(6) /* XOSC: powered, stable=1 */ +#define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */ + +/* SLEEPCMD and SLEEPSTA bit definitions */ +#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable + * 1: oscillators not stable */ + +/* CLKCONCMD bit definitions */ +#define OSC BV(6) +#define TICKSPD(x) (x << 3) +#define CLKSPD(x) (x << 0) +#define CLKCONCMD_32MHZ (0) +#define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC) + +/* STLOAD */ +#define LDRDY BV(0) /* Load Ready. This bit is 0 while the sleep timer + * loads the 24-bit compare value and 1 when the sleep + * timer is ready to start loading a newcompare value. */ + +#ifdef POWER_SAVING +extern volatile __data uint8 halSleepPconValue; + +/* Any ISR that is used to wake up the chip shall call this macro. This prevents the race condition + * when the PCON IDLE bit is set after such a critical ISR fires during the prep for sleep. + */ +#define CLEAR_SLEEP_MODE() st( halSleepPconValue = 0; ) +#define ALLOW_SLEEP_MODE() st( halSleepPconValue = PCON_IDLE; ) +#else + #define CLEAR_SLEEP_MODE() + #define ALLOW_SLEEP_MODE() +#endif + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_sensor.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_sensor.c new file mode 100644 index 0000000..51bd76c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_sensor.c @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: hal_sensor.c + Revised: $Date: 2012-09-21 06:30:38 -0700 (Fri, 21 Sep 2012) $ + Revision: $Revision: 31581 $ + + Description: This file contains code that is common to all sensor drivers. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ +* Includes +* ------------------------------------------------------------------------------------------------ +*/ +#include "hal_sensor.h" +#include "hal_i2c.h" +#include "hal_led.h" +#include "hal_irtemp.h" +#include "hal_humi.h" +#include "hal_bar.h" +#include "hal_mag.h" +#include "hal_acc.h" +#include "hal_gyro.h" + +/* ------------------------------------------------------------------------------------------------ +* Macros and constants +* ------------------------------------------------------------------------------------------------ +*/ +#define N_TEST_RUNS 10 + +/* ------------------------------------------------------------------------------------------------ +* Local Variables +* ------------------------------------------------------------------------------------------------ +*/ +static uint8 buffer[24]; +static uint8 halSensorEnableMap; + +/************************************************************************************************** + * @fn HalSensorReadReg + * + * @brief This function implements the I2C protocol to read from a sensor. The sensor must + * be selected before this routine is called. + * + * @param addr - which register to read + * @param pBuf - pointer to buffer to place data + * @param nBytes - numbver of bytes to read + * + * @return TRUE if the required number of bytes are reveived + **************************************************************************************************/ +bool HalSensorReadReg(uint8 addr, uint8 *pBuf, uint8 nBytes) +{ + uint8 i = 0; + + /* Send address we're reading from */ + if (HalI2CWrite(1,&addr) == 1) + { + /* Now read data */ + i = HalI2CRead(nBytes,pBuf); + } + + return i == nBytes; +} + +/************************************************************************************************** +* @fn HalSensorWriteReg +* @brief This function implements the I2C protocol to write to a sensor. he sensor must +* be selected before this routine is called. +* +* @param addr - which register to write +* @param pBuf - pointer to buffer containing data to be written +* @param nBytes - number of bytes to write +* +* @return TRUE if successful write +*/ +bool HalSensorWriteReg(uint8 addr, uint8 *pBuf, uint8 nBytes) +{ + uint8 i; + uint8 *p = buffer; + + /* Copy address and data to local buffer for burst write */ + *p++ = addr; + for (i = 0; i < nBytes; i++) + { + *p++ = *pBuf++; + } + nBytes++; + + /* Send address and data */ + i = HalI2CWrite(nBytes, buffer); + if ( i!= nBytes) + HAL_TOGGLE_LED2(); + + return (i == nBytes); +} + +/********************************************************************* + * @fn HalSensorTest + * + * @brief Run a self-test on all the sensors + * + * @param none + * + * @return bitmask of error flags + */ +uint16 HalSensorTest(void) +{ + uint16 i; + uint8 selfTestResult; + + halSensorEnableMap = 0; + selfTestResult = 0; + HalGyroTurnOn(); + + for (i=0; i MAX_16BIT_TIMEOUT) + { + osal_timeout = MAX_16BIT_TIMEOUT; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? TRUE : FALSE; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = HAL_SLEEP_MS_TO_32KHZ( osal_timeout ); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = TRUE; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = FALSE; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // check if sleep should be entered + if ( (timeout > PM_MIN_SLEEP_TIME) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + HAL_ASSERT( HAL_INTERRUPTS_ARE_ENABLED() ); + HAL_DISABLE_INTERRUPTS(); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == LL_SLEEP_REQUEST_ALLOWED ) + { +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // get peripherals ready for sleep + HalKeyEnterSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_OFF_LED3(); +#else + // use this to turn LEDs off during sleep + HalLedEnterSleep(); +#endif // HAL_SLEEP_DEBUG_LED + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > MAX_SLEEP_TIME ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, MAX_SLEEP_TIME ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode); + + // save interrupt enable registers and disable all interrupts + HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); + HAL_ENABLE_INTERRUPTS(); + + // Disable I2C to avoid driving lines + HalI2CDisable(); + + // Disable DCDC + DCDC_SBIT = 0; + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + HAL_SLEEP_SET_POWER_MODE(); + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 1; +#endif // DEBUG_GPIO + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == TRUE) && !(IRCON & 0x80) ) + { + wakeForRF = FALSE; + } + + // restore interrupt enable registers + HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( (halPwrMgtMode == CC2540_PM3), wakeForRF ); + +#ifdef HAL_SLEEP_DEBUG_LED + HAL_TURN_ON_LED3(); +#else //!HAL_SLEEP_DEBUG_LED + // use this to turn LEDs back on after sleep + HalLedExitSleep(); +#endif // HAL_SLEEP_DEBUG_LED + +#if ((defined HAL_KEY) && (HAL_KEY == TRUE)) + // handle peripherals + (void)HalKeyExitSleep(); +#endif // ((defined HAL_KEY) && (HAL_KEY == TRUE)) + } + + HAL_ENABLE_INTERRUPTS(); + } + +#ifdef DEBUG_GPIO + // TEMP + P1_0 = 0; +#endif // DEBUG_GPIO + + // Enable DCDC + DCDC_SBIT = 1; + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + HAL_SLEEP_TIMER_DISABLE_INT(); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= HAL_SLEEP_ADJ_TICKS; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[UINT32_NDX2]; + ST1 = ((uint8 *)&sleepTimer)[UINT32_NDX1]; + ST0 = ((uint8 *)&sleepTimer)[UINT32_NDX0]; + + HAL_SLEEP_TIMER_CLEAR_INT(); + HAL_SLEEP_TIMER_ENABLE_INT(); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[UINT32_NDX0] = ST0; + ((uint8 *)&sleepTimer)[UINT32_NDX1] = ST1; + ((uint8 *)&sleepTimer)[UINT32_NDX2] = ST2; + ((uint8 *)&sleepTimer)[UINT32_NDX3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub +#ifdef PM_TEST + osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, 1000); +#endif // PM_TEST +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR) +{ + HAL_ENTER_ISR(); + + HAL_SLEEP_TIMER_CLEAR_INT(); + +#ifdef HAL_SLEEP_DEBUG_POWER_MODE + halSleepInt = TRUE; +#endif // HAL_SLEEP_DEBUG_POWER_MODE + + CLEAR_SLEEP_MODE(); + + HAL_EXIT_ISR(); + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_startup.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_startup.c new file mode 100644 index 0000000..981b8c7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_startup.c @@ -0,0 +1,109 @@ +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#include "hal_board.h" +#include "hal_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ +#if (__CODE_MODEL__ == 2) +__near_func __root char +#else +__root char +#endif +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". +#if defined HAL_IMAGE_A + MEMCTR = (MEMCTR & 0xF8) | 0x05; +#elif defined HAL_IMAGE_B + MEMCTR = (MEMCTR & 0xF8) | 0x04; +#else + MEMCTR = (MEMCTR & 0xF8) | 0x01; +#endif + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + +#ifdef __cplusplus +} +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_timer.c b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_timer.c new file mode 100644 index 0000000..fe248f1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_timer.c @@ -0,0 +1,45 @@ +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_types.h b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_types.h new file mode 100644 index 0000000..9d7d3ee --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/hal/target/CC2541ST/hal_types.h @@ -0,0 +1,126 @@ +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + +#ifndef _HAL_TYPES_H +#define _HAL_TYPES_H + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#ifdef __IAR_SYSTEMS_ICC__ +#define CODE __code +#define XDATA __xdata +#define DATA __data +#define NEAR_FUNC __near_func +#define ASM_NOP asm("NOP") + +/* ----------- KEIL Compiler ----------- */ +#elif defined __KEIL__ +#define CODE code +#define XDATA xdata +#define ASM_NOP __nop() + +/* ----------- GNU Compiler ----------- */ +#elif defined __GNUC__ +#define ASM_NOP __asm__ __volatile__ ("nop") + +/* ---------- MSVC compiler ---------- */ +#elif _MSC_VER +#define ASM_NOP __asm NOP + +/* ----------- CCS Compiler ----------- */ +#elif defined __TI_COMPILER_VERSION +#define ASM_NOP asm(" NOP") + +/* ----------- Unrecognized Compiler ----------- */ +#else +#error "ERROR: Unknown compiler." +#endif + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +/************************************************************************************************** + */ +#endif diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL.c new file mode 100644 index 0000000..d4bbeda --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL.c @@ -0,0 +1,1245 @@ +/************************************************************************************************** + Filename: OSAL.c + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: This API allows the software components in the Z-stack to be written + independently of the specifics of the operating system, kernel or tasking + environment (including control loops or connect-to-interrupt systems). + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include + +#include "comdef.h" +#include "hal_board.h" +#include "OSAL.h" +#include "OSAL_Tasks.h" +#include "OSAL_Memory.h" +#include "OSAL_PwrMgr.h" +#include "OSAL_Clock.h" + +#include "OnBoard.h" + +/* HAL */ +#include "hal_drivers.h" + +#ifdef IAR_ARMCM3_LM + #include "FreeRTOSConfig.h" + #include "osal_task.h" +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Message Pool Definitions +osal_msg_q_t osal_qHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Index of active task +static uint8 activeTaskID = TASK_NO_TASK; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 urgent ); + +/********************************************************************* + * HELPER FUNCTIONS + */ +/* very ugly stub so Keil can compile */ +#ifdef __KEIL__ +char * itoa ( int value, char * buffer, int radix ) +{ + return(buffer); +} +#endif + +/********************************************************************* + * @fn osal_strlen + * + * @brief + * + * Calculates the length of a string. The string must be null + * terminated. + * + * @param char *pString - pointer to text string + * + * @return int - number of characters + */ +int osal_strlen( char *pString ) +{ + return (int)( strlen( pString ) ); +} + +/********************************************************************* + * @fn osal_memcpy + * + * @brief + * + * Generic memory copy. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_memcpy( void *dst, const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 GENERIC *pSrc; + + pSrc = src; + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc++; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_revmemcpy + * + * @brief Generic reverse memory copy. Starts at the end of the + * source buffer, by taking the source address pointer and moving + * pointer ahead "len" bytes, then decrementing the pointer. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_revmemcpy( void *dst, const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 GENERIC *pSrc; + + pSrc = src; + pSrc += (len-1); + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc--; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_memdup + * + * @brief Allocates a buffer [with osal_mem_alloc()] and copies + * the src buffer into the newly allocated space. + * + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to the new allocated buffer, or NULL if + * allocation problem. + */ +void *osal_memdup( const void GENERIC *src, unsigned int len ) +{ + uint8 *pDst; + + pDst = osal_mem_alloc( len ); + if ( pDst ) + { + VOID osal_memcpy( pDst, src, len ); + } + + return ( (void *)pDst ); +} + +/********************************************************************* + * @fn osal_memcmp + * + * @brief + * + * Generic memory compare. + * + * @param src1 - source 1 addrexx + * @param src2 - source 2 address + * @param len - number of bytes to compare + * + * @return TRUE - same, FALSE - different + */ +uint8 osal_memcmp( const void GENERIC *src1, const void GENERIC *src2, unsigned int len ) +{ + const uint8 GENERIC *pSrc1; + const uint8 GENERIC *pSrc2; + + pSrc1 = src1; + pSrc2 = src2; + + while ( len-- ) + { + if( *pSrc1++ != *pSrc2++ ) + return FALSE; + } + return TRUE; +} + + +/********************************************************************* + * @fn osal_memset + * + * @brief + * + * Set memory buffer to value. + * + * @param dest - pointer to buffer + * @param value - what to set each uint8 of the message + * @param size - how big + * + * @return pointer to destination buffer + */ +void *osal_memset( void *dest, uint8 value, int len ) +{ + return memset( dest, value, len ); +} + +/********************************************************************* + * @fn osal_build_uint16 + * + * @brief + * + * Build a uint16 out of 2 bytes (0 then 1). + * + * @param swapped - 0 then 1 + * + * @return uint16 + */ +uint16 osal_build_uint16( uint8 *swapped ) +{ + return ( BUILD_UINT16( swapped[0], swapped[1] ) ); +} + +/********************************************************************* + * @fn osal_build_uint32 + * + * @brief + * + * Build a uint32 out of sequential bytes. + * + * @param swapped - sequential bytes + * @param len - number of bytes in the uint8 array + * + * @return uint32 + */ +uint32 osal_build_uint32( uint8 *swapped, uint8 len ) +{ + if ( len == 2 ) + return ( BUILD_UINT32( swapped[0], swapped[1], 0L, 0L ) ); + else if ( len == 3 ) + return ( BUILD_UINT32( swapped[0], swapped[1], swapped[2], 0L ) ); + else if ( len == 4 ) + return ( BUILD_UINT32( swapped[0], swapped[1], swapped[2], swapped[3] ) ); + else + return ( (uint32)swapped[0] ); +} + +#if !defined ( ZBIT ) && !defined ( ZBIT2 ) && !defined (UBIT) +/********************************************************************* + * @fn _ltoa + * + * @brief + * + * convert a long unsigned int to a string. + * + * @param l - long to convert + * @param buf - buffer to convert to + * @param radix - 10 dec, 16 hex + * + * @return pointer to buffer + */ +unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix) +{ +#if defined( __GNUC__ ) + return ( (char*)ltoa( l, buf, radix ) ); +#else + unsigned char tmp1[10] = "", tmp2[10] = "", tmp3[10] = ""; + unsigned short num1, num2, num3; + unsigned char i; + + buf[0] = '\0'; + + if ( radix == 10 ) + { + num1 = l % 10000; + num2 = (l / 10000) % 10000; + num3 = (unsigned short)(l / 100000000); + + if (num3) _itoa(num3, tmp3, 10); + if (num2) _itoa(num2, tmp2, 10); + if (num1) _itoa(num1, tmp1, 10); + + if (num3) + { + strcpy((char*)buf, (char const*)tmp3); + for (i = 0; i < 4 - strlen((char const*)tmp2); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp2); + if (num3 || num2) + { + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num3 && !num2 && !num1) + strcpy((char*)buf, "0"); + } + else if ( radix == 16 ) + { + num1 = l & 0x0000FFFF; + num2 = l >> 16; + + if (num2) _itoa(num2, tmp2, 16); + if (num1) _itoa(num1, tmp1, 16); + + if (num2) + { + strcpy((char*)buf,(char const*)tmp2); + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num2 && !num1) + strcpy((char*)buf, "0"); + } + else + return NULL; + + return buf; +#endif +} +#endif // !defined(ZBIT) && !defined(ZBIT2) + +/********************************************************************* + * @fn osal_rand + * + * @brief Random number generator + * + * @param none + * + * @return uint16 - new random number + */ +uint16 osal_rand( void ) +{ + return ( Onboard_rand() ); +} + +/********************************************************************* + * API FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_msg_allocate + * + * @brief + * + * This function is called by a task to allocate a message buffer + * into which the task will encode the particular message it wishes + * to send. This common buffer scheme is used to strictly limit the + * creation of message buffers within the system due to RAM size + * limitations on the microprocessor. Note that all message buffers + * are a fixed size (at least initially). The parameter len is kept + * in case a message pool with varying fixed message sizes is later + * created (for example, a pool of message buffers of size LARGE, + * MEDIUM and SMALL could be maintained and allocated based on request + * from the tasks). + * + * + * @param uint8 len - wanted buffer length + * + * + * @return pointer to allocated buffer or NULL if allocation failed. + */ +uint8 * osal_msg_allocate( uint16 len ) +{ + osal_msg_hdr_t *hdr; + + if ( len == 0 ) + return ( NULL ); + + hdr = (osal_msg_hdr_t *) osal_mem_alloc( (short)(len + sizeof( osal_msg_hdr_t )) ); + if ( hdr ) + { + hdr->next = NULL; + hdr->len = len; + hdr->dest_id = TASK_NO_TASK; + return ( (uint8 *) (hdr + 1) ); + } + else + return ( NULL ); +} + +/********************************************************************* + * @fn osal_msg_deallocate + * + * @brief + * + * This function is used to deallocate a message buffer. This function + * is called by a task (or processing element) after it has finished + * processing a received message. + * + * + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_MSG_POINTER + */ +uint8 osal_msg_deallocate( uint8 *msg_ptr ) +{ + uint8 *x; + + if ( msg_ptr == NULL ) + return ( INVALID_MSG_POINTER ); + + // don't deallocate queued buffer + if ( OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK ) + return ( MSG_BUFFER_NOT_AVAIL ); + + x = (uint8 *)((uint8 *)msg_ptr - sizeof( osal_msg_hdr_t )); + + osal_mem_free( (void *)x ); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_msg_send + * + * @brief + * + * This function is called by a task to send a command message to + * another task or processing element. The sending_task field must + * refer to a valid task, since the task ID will be used + * for the response message. This function will also set a message + * ready event in the destination tasks event list. + * + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, FALSE ) ); +} + +/********************************************************************* + * @fn osal_msg_push_front + * + * @brief + * + * This function is called by a task to push a command message + * to the head of the OSAL queue. The destination_task field + * must refer to a valid task, since the task ID will be used to + * send the message to. This function will also set a message + * ready event in the destination task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, TRUE ) ); +} + +/********************************************************************* + * @fn osal_msg_enqueue_push + * + * @brief + * + * This function is called by a task to either enqueue (append to + * queue) or push (prepend to queue) a command message to the OSAL + * queue. The destination_task field must refer to a valid task, + * since the task ID will be used to send the message to. This + * function will also set a message ready event in the destination + * task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * @param uint8 push - TRUE to push, otherwise enqueue + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 push ) +{ + if ( msg_ptr == NULL ) + { + return ( INVALID_MSG_POINTER ); + } + + if ( destination_task >= tasksCnt ) + { + osal_msg_deallocate( msg_ptr ); + return ( INVALID_TASK ); + } + + // Check the message header + if ( OSAL_MSG_NEXT( msg_ptr ) != NULL || + OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK ) + { + osal_msg_deallocate( msg_ptr ); + return ( INVALID_MSG_POINTER ); + } + + OSAL_MSG_ID( msg_ptr ) = destination_task; + + if ( push == TRUE ) + { + // prepend the message + osal_msg_push( &osal_qHead, msg_ptr ); + } + else + { + // append the message + osal_msg_enqueue( &osal_qHead, msg_ptr ); + } + + // Signal the task that a message is waiting + osal_set_event( destination_task, SYS_EVENT_MSG ); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_msg_receive + * + * @brief + * + * This function is called by a task to retrieve a received command + * message. The calling task must deallocate the message buffer after + * processing the message using the osal_msg_deallocate() call. + * + * @param uint8 task_id - receiving tasks ID + * + * @return *uint8 - message information or NULL if no message + */ +uint8 *osal_msg_receive( uint8 task_id ) +{ + osal_msg_hdr_t *listHdr; + osal_msg_hdr_t *prevHdr = NULL; + osal_msg_hdr_t *foundHdr = NULL; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // Point to the top of the queue + listHdr = osal_qHead; + + // Look through the queue for a message that belongs to the asking task + while ( listHdr != NULL ) + { + if ( (listHdr - 1)->dest_id == task_id ) + { + if ( foundHdr == NULL ) + { + // Save the first one + foundHdr = listHdr; + } + else + { + // Second msg found, stop looking + break; + } + } + if ( foundHdr == NULL ) + { + prevHdr = listHdr; + } + listHdr = OSAL_MSG_NEXT( listHdr ); + } + + // Is there more than one? + if ( listHdr != NULL ) + { + // Yes, Signal the task that a message is waiting + osal_set_event( task_id, SYS_EVENT_MSG ); + } + else + { + // No more + osal_clear_event( task_id, SYS_EVENT_MSG ); + } + + // Did we find a message? + if ( foundHdr != NULL ) + { + // Take out of the link list + osal_msg_extract( &osal_qHead, foundHdr, prevHdr ); + } + + // Release interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return ( (uint8*) foundHdr ); +} + +/************************************************************************************************** + * @fn osal_msg_find + * + * @brief This function finds in place an OSAL message matching the task_id and event + * parameters. + * + * input parameters + * + * @param task_id - The OSAL task id that the enqueued OSAL message must match. + * @param event - The OSAL event id that the enqueued OSAL message must match. + * + * output parameters + * + * None. + * + * @return NULL if no match, otherwise an in place pointer to the matching OSAL message. + ************************************************************************************************** + */ +osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event) +{ + osal_msg_hdr_t *pHdr; + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts. + + pHdr = osal_qHead; // Point to the top of the queue. + + // Look through the queue for a message that matches the task_id and event parameters. + while (pHdr != NULL) + { + if (((pHdr-1)->dest_id == task_id) && (((osal_event_hdr_t *)pHdr)->event == event)) + { + break; + } + + pHdr = OSAL_MSG_NEXT(pHdr); + } + + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts. + + return (osal_event_hdr_t *)pHdr; +} + +/********************************************************************* + * @fn osal_msg_enqueue + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + void *list; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + OSAL_MSG_NEXT( msg_ptr ) = NULL; + // If first message in queue + if ( *q_ptr == NULL ) + { + *q_ptr = msg_ptr; + } + else + { + // Find end of queue + for ( list = *q_ptr; OSAL_MSG_NEXT( list ) != NULL; list = OSAL_MSG_NEXT( list ) ); + + // Add message to end of queue + OSAL_MSG_NEXT( list ) = msg_ptr; + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_dequeue + * + * @brief + * + * This function dequeues an OSAL message from an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * + * @return void * - pointer to OSAL message or NULL of queue is empty. + */ +void *osal_msg_dequeue( osal_msg_q_t *q_ptr ) +{ + void *msg_ptr = NULL; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + if ( *q_ptr != NULL ) + { + // Dequeue message + msg_ptr = *q_ptr; + *q_ptr = OSAL_MSG_NEXT( msg_ptr ); + OSAL_MSG_NEXT( msg_ptr ) = NULL; + OSAL_MSG_ID( msg_ptr ) = TASK_NO_TASK; + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return msg_ptr; +} + +/********************************************************************* + * @fn osal_msg_push + * + * @brief + * + * This function pushes an OSAL message to the head of an OSAL + * queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // Push message to head of queue + OSAL_MSG_NEXT( msg_ptr ) = *q_ptr; + *q_ptr = msg_ptr; + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_extract + * + * @brief + * + * This function extracts and removes an OSAL message from the + * middle of an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message to be extracted + * @param void *prev_ptr - OSAL message before msg_ptr in queue + * + * @return none + */ +void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + if ( msg_ptr == *q_ptr ) + { + // remove from first + *q_ptr = OSAL_MSG_NEXT( msg_ptr ); + } + else + { + // remove from middle + OSAL_MSG_NEXT( prev_ptr ) = OSAL_MSG_NEXT( msg_ptr ); + } + OSAL_MSG_NEXT( msg_ptr ) = NULL; + OSAL_MSG_ID( msg_ptr ) = TASK_NO_TASK; + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); +} + +/********************************************************************* + * @fn osal_msg_enqueue_max + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue if + * the length of the queue is less than max. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * @param uint8 max - maximum length of queue + * + * @return TRUE if message was enqueued, FALSE otherwise + */ +uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ) +{ + void *list; + uint8 ret = FALSE; + halIntState_t intState; + + // Hold off interrupts + HAL_ENTER_CRITICAL_SECTION(intState); + + // If first message in queue + if ( *q_ptr == NULL ) + { + *q_ptr = msg_ptr; + ret = TRUE; + } + else + { + // Find end of queue or max + list = *q_ptr; + max--; + while ( (OSAL_MSG_NEXT( list ) != NULL) && (max > 0) ) + { + list = OSAL_MSG_NEXT( list ); + max--; + } + + // Add message to end of queue if max not reached + if ( max != 0 ) + { + OSAL_MSG_NEXT( list ) = msg_ptr; + ret = TRUE; + } + } + + // Re-enable interrupts + HAL_EXIT_CRITICAL_SECTION(intState); + + return ret; +} + +/********************************************************************* + * @fn osal_set_event + * + * @brief + * + * This function is called to set the event flags for a task. The + * event passed in is OR'd into the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to set + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_set_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts + tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts + return ( SUCCESS ); + } + else + { + return ( INVALID_TASK ); + } +} + +/********************************************************************* + * @fn osal_clear_event + * + * @brief + * + * This function is called to clear the event flags for a task. The + * event passed in is masked out of the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to clear + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_clear_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts + tasksEvents[task_id] &= ~(event_flag); // Clear the event bit(s) + HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts + return ( SUCCESS ); + } + else + { + return ( INVALID_TASK ); + } +} + +/********************************************************************* + * @fn osal_isr_register + * + * @brief + * + * This function is called to register a service routine with an + * interrupt. When the interrupt occurs, this service routine is called. + * + * @param uint8 interrupt_id - Interrupt number + * @param void (*isr_ptr)( uint8* ) - function pointer to ISR + * + * @return SUCCESS, INVALID_INTERRUPT_ID, + */ +uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ) +{ + // Remove these statements when functionality is complete + (void)interrupt_id; + (void)isr_ptr; + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_int_enable + * + * @brief + * + * This function is called to enable an interrupt. Once enabled, + * occurrence of the interrupt causes the service routine associated + * with that interrupt to be called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are enabled. + * If a single interrupt is passed in, then interrupts still have + * to be enabled with another call to INTS_ALL. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_enable( uint8 interrupt_id ) +{ + + if ( interrupt_id == INTS_ALL ) + { + HAL_ENABLE_INTERRUPTS(); + return ( SUCCESS ); + } + else + { + return ( INVALID_INTERRUPT_ID ); + } +} + +/********************************************************************* + * @fn osal_int_disable + * + * @brief + * + * This function is called to disable an interrupt. When a disabled + * interrupt occurs, the service routine associated with that + * interrupt is not called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are disabled. + * If a single interrupt is passed in, then just that interrupt is disabled. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_disable( uint8 interrupt_id ) +{ + + if ( interrupt_id == INTS_ALL ) + { + HAL_DISABLE_INTERRUPTS(); + return ( SUCCESS ); + } + else + { + return ( INVALID_INTERRUPT_ID ); + } +} + +/********************************************************************* + * @fn osal_init_system + * + * @brief + * + * This function initializes the "task" system by creating the + * tasks defined in the task table (OSAL_Tasks.h). + * + * @param void + * + * @return SUCCESS + */ +uint8 osal_init_system( void ) +{ + // Initialize the Memory Allocation System + osal_mem_init(); + + // Initialize the message queue + osal_qHead = NULL; + + // Initialize the timers + osalTimerInit(); + + // Initialize the Power Management System + osal_pwrmgr_init(); + + // Initialize the system tasks. + osalInitTasks(); + + // Setup efficient search for the first free block of heap. + osal_mem_kick(); + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn osal_start_system + * + * @brief + * + * This function is the main loop function of the task system (if + * ZBIT and UBIT are not defined). This Function doesn't return. + * + * @param void + * + * @return none + */ +void osal_start_system( void ) +{ +#if !defined ( ZBIT ) && !defined ( UBIT ) + for(;;) // Forever Loop +#endif + { + osal_run_system(); + } +} + +/********************************************************************* + * @fn osal_run_system + * + * @brief + * + * This function will make one pass through the OSAL taskEvents table + * and call the task_event_processor() function for the first task that + * is found with at least one event pending. If there are no pending + * events (all tasks), this function puts the processor into Sleep. + * + * @param void + * + * @return none + */ +void osal_run_system( void ) +{ + uint8 idx = 0; + +#ifndef HAL_BOARD_CC2538 + osalTimeUpdate(); +#endif + + Hal_ProcessPoll(); + + do { + if (tasksEvents[idx]) // Task is highest priority that is ready. + { + break; + } + } while (++idx < tasksCnt); + + if (idx < tasksCnt) + { + uint16 events; + halIntState_t intState; + + HAL_ENTER_CRITICAL_SECTION(intState); + events = tasksEvents[idx]; + tasksEvents[idx] = 0; // Clear the Events for this task. + HAL_EXIT_CRITICAL_SECTION(intState); + + activeTaskID = idx; + events = (tasksArr[idx])( idx, events ); + activeTaskID = TASK_NO_TASK; + + HAL_ENTER_CRITICAL_SECTION(intState); + tasksEvents[idx] |= events; // Add back unprocessed events to the current task. + HAL_EXIT_CRITICAL_SECTION(intState); + } +#if defined( POWER_SAVING ) + else // Complete pass through all task events with no activity? + { + osal_pwrmgr_powerconserve(); // Put the processor/system into sleep + } +#endif + + /* Yield in case cooperative scheduling is being used. */ +#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0) + { + osal_task_yield(); + } +#endif +} + +/********************************************************************* + * @fn osal_buffer_uint32 + * + * @brief + * + * Buffer an uint32 value - LSB first. + * + * @param buf - buffer + * @param val - uint32 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint32( uint8 *buf, uint32 val ) +{ + *buf++ = BREAK_UINT32( val, 0 ); + *buf++ = BREAK_UINT32( val, 1 ); + *buf++ = BREAK_UINT32( val, 2 ); + *buf++ = BREAK_UINT32( val, 3 ); + + return buf; +} + +/********************************************************************* + * @fn osal_buffer_uint24 + * + * @brief + * + * Buffer an uint24 value - LSB first. Note that type uint24 is + * typedef to uint32 in comdef.h + * + * @param buf - buffer + * @param val - uint24 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint24( uint8 *buf, uint24 val ) +{ + *buf++ = BREAK_UINT32( val, 0 ); + *buf++ = BREAK_UINT32( val, 1 ); + *buf++ = BREAK_UINT32( val, 2 ); + + return buf; +} + +/********************************************************************* + * @fn osal_isbufset + * + * @brief + * + * Is all of the array elements set to a value? + * + * @param buf - buffer to check + * @param val - value to check each array element for + * @param len - length to check + * + * @return TRUE if all "val" + * FALSE otherwise + */ +uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ) +{ + uint8 x; + + if ( buf == NULL ) + { + return ( FALSE ); + } + + for ( x = 0; x < len; x++ ) + { + // Check for non-initialized value + if ( buf[x] != val ) + { + return ( FALSE ); + } + } + return ( TRUE ); +} + +/********************************************************************* + * @fn osal_self + * + * @brief + * + * This function returns the task ID of the current (active) task. + * + * @param void + * + * @return active task ID or TASK_NO_TASK if no task is active + */ +uint8 osal_self( void ) +{ + return ( activeTaskID ); +} + +/********************************************************************* + */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_ClockBLE.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_ClockBLE.c new file mode 100644 index 0000000..0415053 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_ClockBLE.c @@ -0,0 +1,338 @@ +/************************************************************************************************** + Filename: OSAL_ClockBLE.c + Revised: $Date: 2008-12-15 15:42:47 -0800 (Mon, 15 Dec 2008) $ + Revision: $Revision: 18616 $ + + Description: OSAL Clock definition and manipulation functions for BLE projects. + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Clock.h" + +/********************************************************************* + * MACROS + */ + +#define YearLength(yr) (IsLeapYear(yr) ? 366 : 365) + +/********************************************************************* + * CONSTANTS + */ + +// (MAXCALCTICKS * 5) + (max remainder) must be <= (uint16 max), +// so: (13105 * 5) + 7 <= 65535 +#define MAXCALCTICKS ((uint16)(13105)) + +#define BEGYEAR 2000 // UTC started at 00:00:00 January 1, 2000 + +#define DAY 86400UL // 24 hours * 60 minutes * 60 seconds + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ +extern uint16 ll_McuPrecisionCount(void); + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint16 previousLLTimerTick = 0; +static uint16 remUsTicks = 0; +static uint16 timeMSec = 0; + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +UTCTime OSAL_timeSeconds = 0; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ); + +static void osalClockUpdate( uint16 elapsedMSec ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimeUpdate + * + * @brief Uses the free running rollover count of the MAC backoff timer; + * this timer runs freely with a constant 320 usec interval. The + * count of 320-usec ticks is converted to msecs and used to update + * the OSAL clock and Timers by invoking osalClockUpdate() and + * osalTimerUpdate(). This function is intended to be invoked + * from the background, not interrupt level. + * + * @param None. + * + * @return None. + */ +void osalTimeUpdate( void ) +{ + uint16 tmp; + uint16 ticks625us; + uint16 elapsedMSec = 0; + + // Get the free-running count of 625us timer ticks + tmp = ll_McuPrecisionCount(); + + if ( tmp != previousLLTimerTick ) + { + // Calculate the elapsed ticks of the free-running timer. + ticks625us = tmp - previousLLTimerTick; + + // Store the LL Timer tick count for the next time through this function. + previousLLTimerTick = tmp; + + /* It is necessary to loop to convert the usecs to msecs in increments so as + * not to overflow the 16-bit variables. + */ + while ( ticks625us > MAXCALCTICKS ) + { + ticks625us -= MAXCALCTICKS; + elapsedMSec += MAXCALCTICKS * 5 / 8; + remUsTicks += MAXCALCTICKS * 5 % 8; + } + + // update converted number with remaining ticks from loop and the + // accumulated remainder from loop + tmp = (ticks625us * 5) + remUsTicks; + + // Convert the 625 us ticks into milliseconds and a remainder + elapsedMSec += tmp / 8; + remUsTicks = tmp % 8; + + // Update OSAL Clock and Timers + if ( elapsedMSec ) + { + osalClockUpdate( elapsedMSec ); + osalTimerUpdate( elapsedMSec ); + } + } +} + +/********************************************************************* + * @fn osalClockUpdate + * + * @brief Updates the OSAL Clock time with elapsed milliseconds. + * + * @param elapsedMSec - elapsed milliseconds + * + * @return none + */ +static void osalClockUpdate( uint16 elapsedMSec ) +{ + // Add elapsed milliseconds to the saved millisecond portion of time + timeMSec += elapsedMSec; + + // Roll up milliseconds to the number of seconds + if ( timeMSec >= 1000 ) + { + OSAL_timeSeconds += timeMSec / 1000; + timeMSec = timeMSec % 1000; + } +} + +/********************************************************************* + * @fn osal_setClock + * + * @brief Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * + * @param newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_setClock( UTCTime newTime ) +{ + OSAL_timeSeconds = newTime; +} + +/********************************************************************* + * @fn osal_getClock + * + * @brief Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second + * counter. + * + * @param none + * + * @return number of seconds since 0 hrs, 0 minutes, 0 seconds, + * on the 1st of January 2000 UTC + */ +UTCTime osal_getClock( void ) +{ + return ( OSAL_timeSeconds ); +} + +/********************************************************************* + * @fn osal_ConvertUTCTime + * + * @brief Converts UTCTime to UTCTimeStruct + * + * @param tm - pointer to breakdown struct + * + * @param secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ) +{ + // calculate the time less than a day - hours, minutes, seconds + { + uint32 day = secTime % DAY; + tm->seconds = day % 60UL; + tm->minutes = (day % 3600UL) / 60UL; + tm->hour = day / 3600UL; + } + + // Fill in the calendar - day, month, year + { + uint16 numDays = secTime / DAY; + tm->year = BEGYEAR; + while ( numDays >= YearLength( tm->year ) ) + { + numDays -= YearLength( tm->year ); + tm->year++; + } + + tm->month = 0; + while ( numDays >= monthLength( IsLeapYear( tm->year ), tm->month ) ) + { + numDays -= monthLength( IsLeapYear( tm->year ), tm->month ); + tm->month++; + } + + tm->day = numDays; + } +} + +/********************************************************************* + * @fn monthLength + * + * @param lpyr - 1 for leap year, 0 if not + * + * @param mon - 0 - 11 (jan - dec) + * + * @return number of days in specified month + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ) +{ + uint8 days = 31; + + if ( mon == 1 ) // feb + { + days = ( 28 + lpyr ); + } + else + { + if ( mon > 6 ) // aug-dec + { + mon--; + } + + if ( mon & 1 ) + { + days = 30; + } + } + + return ( days ); +} + +/********************************************************************* + * @fn osal_ConvertUTCSecs + * + * @brief Converts a UTCTimeStruct to UTCTime + * + * @param tm - pointer to provided struct + * + * @return number of seconds since 00:00:00 on 01/01/2000 (UTC) + */ +UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ) +{ + uint32 seconds; + + /* Seconds for the partial day */ + seconds = (((tm->hour * 60UL) + tm->minutes) * 60UL) + tm->seconds; + + /* Account for previous complete days */ + { + /* Start with complete days in current month */ + uint16 days = tm->day; + + /* Next, complete months in current year */ + { + int8 month = tm->month; + while ( --month >= 0 ) + { + days += monthLength( IsLeapYear( tm->year ), month ); + } + } + + /* Next, complete years before current year */ + { + uint16 year = tm->year; + while ( --year >= BEGYEAR ) + { + days += YearLength( year ); + } + } + + /* Add total seconds before partial day */ + seconds += (days * DAY); + } + + return ( seconds ); +} diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Memory.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Memory.c new file mode 100644 index 0000000..eb58040 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Memory.c @@ -0,0 +1,645 @@ +/************************************************************************************************** + Filename: OSAL_Memory.c + Revised: $Date: 2013-03-14 17:58:51 -0700 (Thu, 14 Mar 2013) $ + Revision: $Revision: 33490 $ + + Description: OSAL Heap Memory management functions. There is an Application Note that + should be read before studying and/or modifying this module: + SWRA204 "Heap Memory Management" + + Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#include "comdef.h" +#include "OSAL.h" +#include "OSAL_Memory.h" +#include "OnBoard.h" +#include "hal_mcu.h" +#include "hal_assert.h" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +#define OSALMEM_IN_USE 0x8000 +#if (MAXMEMHEAP & OSALMEM_IN_USE) +#error MAXMEMHEAP is too big to manage! +#endif + +#define OSALMEM_HDRSZ sizeof(osalMemHdr_t) + +// Round a value up to the ceiling of OSALMEM_HDRSZ for critical dependencies on even multiples. +#define OSALMEM_ROUND(X) ((((X) + OSALMEM_HDRSZ - 1) / OSALMEM_HDRSZ) * OSALMEM_HDRSZ) + +/* Minimum wasted bytes to justify splitting a block before allocation. + * Adjust accordingly to attempt to balance the tradeoff of wasted space and runtime throughput + * spent splitting blocks into sizes that may not be practically usable when sandwiched between + * two blocks in use (and thereby not able to be coalesced.) + * Ensure that this size is an even multiple of OSALMEM_HDRSZ. + */ +#if !defined OSALMEM_MIN_BLKSZ +#define OSALMEM_MIN_BLKSZ (OSALMEM_ROUND((OSALMEM_HDRSZ * 2))) +#endif + +#if !defined OSALMEM_LL_BLKSZ +#if defined NONWK +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(6) + (1 * OSALMEM_HDRSZ)) +#else +/* + * Profiling the sample apps with default settings shows the following long-lived allocations + * which should live at the bottom of the small-block bucket so that they are never iterated over + * by osal_mem_alloc/free(), nor ever considered for coalescing, etc. This saves significant + * run-time throughput (on 8051 SOC if not also MSP). This is dynamic "dead space" and is not + * available to the small-block bucket heap. + * + * Adjust this size accordingly to accomodate application-specific changes including changing the + * size of long-lived objects profiled by sample apps and long-lived objects added by application. + */ +#if defined ZCL_KEY_ESTABLISH // Attempt to capture worst-case for SE sample apps. +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(526) + (32 * OSALMEM_HDRSZ)) +#elif defined TC_LINKKEY_JOIN +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(454) + (21 * OSALMEM_HDRSZ)) +#elif ((defined SECURE) && (SECURE != 0)) +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(418) + (19 * OSALMEM_HDRSZ)) +#else +#define OSALMEM_LL_BLKSZ (OSALMEM_ROUND(417) + (19 * OSALMEM_HDRSZ)) +#endif +#endif +#endif + +/* Adjust accordingly to attempt to accomodate the block sizes of the vast majority of + * very high frequency allocations/frees by profiling the system runtime. + * This default of 16 accomodates the OSAL timers block, osalTimerRec_t, and many others. + * Ensure that this size is an even multiple of OSALMEM_MIN_BLKSZ for run-time efficiency. + */ +#if !defined OSALMEM_SMALL_BLKSZ +#define OSALMEM_SMALL_BLKSZ (OSALMEM_ROUND(16)) +#endif +#if !defined OSALMEM_SMALL_BLKCNT +#define OSALMEM_SMALL_BLKCNT 8 +#endif + +/* + * These numbers setup the size of the small-block bucket which is reserved at the front of the + * heap for allocations of OSALMEM_SMALL_BLKSZ or smaller. + */ + +// Size of the heap bucket reserved for small block-sized allocations. +// Adjust accordingly to attempt to accomodate the vast majority of very high frequency operations. +#define OSALMEM_SMALLBLK_BUCKET ((OSALMEM_SMALL_BLKSZ * OSALMEM_SMALL_BLKCNT) + OSALMEM_LL_BLKSZ) +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in +// order to prevent the small-block bucket from being coalesced with the wilderness. +#define OSALMEM_SMALLBLK_HDRCNT (OSALMEM_SMALLBLK_BUCKET / OSALMEM_HDRSZ) +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in +#define OSALMEM_BIGBLK_IDX (OSALMEM_SMALLBLK_HDRCNT + 1) +// The size of the wilderness after losing the small-block heap, the wasted header to block the +// small-block heap from being coalesced, and the wasted header to mark the end of the heap. +#define OSALMEM_BIGBLK_SZ (MAXMEMHEAP - OSALMEM_SMALLBLK_BUCKET - OSALMEM_HDRSZ*2) +// Index of the last available osalMemHdr_t at the end of the heap which will be set to zero for +// fast comparisons with zero to determine the end of the heap. +#define OSALMEM_LASTBLK_IDX ((MAXMEMHEAP / OSALMEM_HDRSZ) - 1) + +// For information about memory profiling, refer to SWRA204 "Heap Memory Management", section 1.5. +#if !defined OSALMEM_PROFILER +#define OSALMEM_PROFILER FALSE // Enable/disable the memory usage profiling buckets. +#endif +#if !defined OSALMEM_PROFILER_LL +#define OSALMEM_PROFILER_LL FALSE // Special profiling of the Long-Lived bucket. +#endif + +#if OSALMEM_PROFILER +#define OSALMEM_INIT 'X' +#define OSALMEM_ALOC 'A' +#define OSALMEM_REIN 'F' +#endif + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef struct { + // The 15 LSB's of 'val' indicate the total item size, including the header, in 8-bit bytes. + unsigned len : 15; + // The 1 MSB of 'val' is used as a boolean to indicate in-use or freed. + unsigned inUse : 1; +} osalMemHdrHdr_t; + +typedef union { + /* Dummy variable so compiler forces structure to alignment of largest element while not wasting + * space on targets when the halDataAlign_t is smaller than a UINT16. + */ + halDataAlign_t alignDummy; + uint16 val; + osalMemHdrHdr_t hdr; +} osalMemHdr_t; + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +#if !defined ( ZBIT ) +static __no_init osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ]; +static __no_init osalMemHdr_t *ff1; // First free block in the small-block bucket. +#else +static osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ]; +static osalMemHdr_t *ff1; // First free block in the small-block bucket. +#endif + +static uint8 osalMemStat; // Discrete status flags: 0x01 = kicked. + +#if OSALMEM_METRICS +static uint16 blkMax; // Max cnt of all blocks ever seen at once. +static uint16 blkCnt; // Current cnt of all blocks. +static uint16 blkFree; // Current cnt of free blocks. +static uint16 memAlo; // Current total memory allocated. +static uint16 memMax; // Max total memory ever allocated at once. +#endif + +#if OSALMEM_PROFILER +#define OSALMEM_PROMAX 8 +/* The profiling buckets must differ by at least OSALMEM_MIN_BLKSZ; the + * last bucket must equal the max alloc size. Set the bucket sizes to + * whatever sizes necessary to show how your application is using memory. + */ +static uint16 proCnt[OSALMEM_PROMAX] = { +OSALMEM_SMALL_BLKSZ, 48, 112, 176, 192, 224, 256, 65535 }; +static uint16 proCur[OSALMEM_PROMAX] = { 0 }; +static uint16 proMax[OSALMEM_PROMAX] = { 0 }; +static uint16 proTot[OSALMEM_PROMAX] = { 0 }; +static uint16 proSmallBlkMiss; +#endif + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ + +#ifdef DPRINTF_HEAPTRACE +extern int dprintf(const char *fmt, ...); +#endif /* DPRINTF_HEAPTRACE */ + +/************************************************************************************************** + * @fn osal_mem_init + * + * @brief This function is the OSAL heap memory management initialization callback. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_init(void) +{ + HAL_ASSERT(((OSALMEM_MIN_BLKSZ % OSALMEM_HDRSZ) == 0)); + HAL_ASSERT(((OSALMEM_LL_BLKSZ % OSALMEM_HDRSZ) == 0)); + HAL_ASSERT(((OSALMEM_SMALL_BLKSZ % OSALMEM_HDRSZ) == 0)); + +#if OSALMEM_PROFILER + (void)osal_memset(theHeap, OSALMEM_INIT, MAXMEMHEAP); +#endif + + // Setup a NULL block at the end of the heap for fast comparisons with zero. + theHeap[OSALMEM_LASTBLK_IDX].val = 0; + + // Setup the small-block bucket. + ff1 = theHeap; + ff1->val = OSALMEM_SMALLBLK_BUCKET; // Set 'len' & clear 'inUse' field. + // Set 'len' & 'inUse' fields - this is a 'zero data bytes' lifetime allocation to block the + // small-block bucket from ever being coalesced with the wilderness. + theHeap[OSALMEM_SMALLBLK_HDRCNT].val = (OSALMEM_HDRSZ | OSALMEM_IN_USE); + + // Setup the wilderness. + theHeap[OSALMEM_BIGBLK_IDX].val = OSALMEM_BIGBLK_SZ; // Set 'len' & clear 'inUse' field. + +#if ( OSALMEM_METRICS ) + /* Start with the small-block bucket and the wilderness - don't count the + * end-of-heap NULL block nor the end-of-small-block NULL block. + */ + blkCnt = blkFree = 2; +#endif +} + +/************************************************************************************************** + * @fn osal_mem_kick + * + * @brief This function is the OSAL task initialization callback. + * @brief Kick the ff1 pointer out past the long-lived OSAL Task blocks. + * Invoke this once after all long-lived blocks have been allocated - + * presently at the end of osal_init_system(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_kick(void) +{ + halIntState_t intState; + osalMemHdr_t *tmp = osal_mem_alloc(1); + + HAL_ASSERT((tmp != NULL)); + HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts. + + /* All long-lived allocations have filled the LL block reserved in the small-block bucket. + * Set 'osalMemStat' so searching for memory in this bucket from here onward will only be done + * for sizes meeting the OSALMEM_SMALL_BLKSZ criteria. + */ + ff1 = tmp - 1; // Set 'ff1' to point to the first available memory after the LL block. + osal_mem_free(tmp); + osalMemStat = 0x01; // Set 'osalMemStat' after the free because it enables memory profiling. + + HAL_EXIT_CRITICAL_SECTION(intState); // Re-enable interrupts. +} + +/************************************************************************************************** + * @fn osal_mem_alloc + * + * @brief This function implements the OSAL dynamic memory allocation functionality. + * + * input parameters + * + * @param size - the number of bytes to allocate from the HEAP. + * + * output parameters + * + * None. + * + * @return None. + */ +#ifdef DPRINTF_OSALHEAPTRACE +void *osal_mem_alloc_dbg( uint16 size, const char *fname, unsigned lnum ) +#else /* DPRINTF_OSALHEAPTRACE */ +void *osal_mem_alloc( uint16 size ) +#endif /* DPRINTF_OSALHEAPTRACE */ +{ + osalMemHdr_t *prev = NULL; + osalMemHdr_t *hdr; + halIntState_t intState; + uint8 coal = 0; + + size += OSALMEM_HDRSZ; + + // Calculate required bytes to add to 'size' to align to halDataAlign_t. + if ( sizeof( halDataAlign_t ) == 2 ) + { + size += (size & 0x01); + } + else if ( sizeof( halDataAlign_t ) != 1 ) + { + const uint8 mod = size % sizeof( halDataAlign_t ); + + if ( mod != 0 ) + { + size += (sizeof( halDataAlign_t ) - mod); + } + } + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Smaller allocations are first attempted in the small-block bucket, and all long-lived + // allocations are channeled into the LL block reserved within this bucket. + if ((osalMemStat == 0) || (size <= OSALMEM_SMALL_BLKSZ)) + { + hdr = ff1; + } + else + { + hdr = (theHeap + OSALMEM_BIGBLK_IDX); + } + + do + { + if ( hdr->hdr.inUse ) + { + coal = 0; + } + else + { + if ( coal != 0 ) + { +#if ( OSALMEM_METRICS ) + blkCnt--; + blkFree--; +#endif + + prev->hdr.len += hdr->hdr.len; + + if ( prev->hdr.len >= size ) + { + hdr = prev; + break; + } + } + else + { + if ( hdr->hdr.len >= size ) + { + break; + } + + coal = 1; + prev = hdr; + } + } + + hdr = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + + if ( hdr->val == 0 ) + { + hdr = NULL; + break; + } + } while (1); + + if ( hdr != NULL ) + { + uint16 tmp = hdr->hdr.len - size; + + // Determine whether the threshold for splitting is met. + if ( tmp >= OSALMEM_MIN_BLKSZ ) + { + // Split the block before allocating it. + osalMemHdr_t *next = (osalMemHdr_t *)((uint8 *)hdr + size); + next->val = tmp; // Set 'len' & clear 'inUse' field. + hdr->val = (size | OSALMEM_IN_USE); // Set 'len' & 'inUse' field. + +#if ( OSALMEM_METRICS ) + blkCnt++; + if ( blkMax < blkCnt ) + { + blkMax = blkCnt; + } + memAlo += size; +#endif + } + else + { +#if ( OSALMEM_METRICS ) + memAlo += hdr->hdr.len; + blkFree--; +#endif + + hdr->hdr.inUse = TRUE; + } + +#if ( OSALMEM_METRICS ) + if ( memMax < memAlo ) + { + memMax = memAlo; + } +#endif + +#if ( OSALMEM_PROFILER ) +#if !OSALMEM_PROFILER_LL + if (osalMemStat != 0) // Don't profile until after the LL block is filled. +#endif + { + uint8 idx; + + for ( idx = 0; idx < OSALMEM_PROMAX; idx++ ) + { + if ( hdr->hdr.len <= proCnt[idx] ) + { + break; + } + } + proCur[idx]++; + if ( proMax[idx] < proCur[idx] ) + { + proMax[idx] = proCur[idx]; + } + proTot[idx]++; + + /* A small-block could not be allocated in the small-block bucket. + * When this occurs significantly frequently, increase the size of the + * bucket in order to restore better worst case run times. Set the first + * profiling bucket size in proCnt[] to the small-block bucket size and + * divide proSmallBlkMiss by the corresponding proTot[] size to get % miss. + * Best worst case time on TrasmitApp was achieved at a 0-15% miss rate + * during steady state Tx load, 0% during idle and steady state Rx load. + */ + if ((hdr->hdr.len <= OSALMEM_SMALL_BLKSZ) && (hdr >= (theHeap + OSALMEM_BIGBLK_IDX))) + { + proSmallBlkMiss++; + } + } + + (void)osal_memset((uint8 *)(hdr+1), OSALMEM_ALOC, (hdr->hdr.len - OSALMEM_HDRSZ)); +#endif + + if ((osalMemStat != 0) && (ff1 == hdr)) + { + ff1 = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + } + + hdr++; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + +#if !defined ( ZBIT ) +#pragma diag_suppress=Pe767 + HAL_ASSERT(((halDataAlign_t)hdr % sizeof(halDataAlign_t)) == 0); +#pragma diag_default=Pe767 +#else + HAL_ASSERT(((halDataAlign_t)hdr % sizeof(halDataAlign_t)) == 0); +#endif +#ifdef DPRINTF_OSALHEAPTRACE + dprintf("osal_mem_alloc(%u)->%lx:%s:%u\n", size, (unsigned) hdr, fname, lnum); +#endif /* DPRINTF_OSALHEAPTRACE */ + return (void *)hdr; +} + +/************************************************************************************************** + * @fn osal_mem_free + * + * @brief This function implements the OSAL dynamic memory de-allocation functionality. + * + * input parameters + * + * @param ptr - A valid pointer (i.e. a pointer returned by osal_mem_alloc()) to the memory to free. + * + * output parameters + * + * None. + * + * @return None. + */ +#ifdef DPRINTF_OSALHEAPTRACE +void osal_mem_free_dbg(void *ptr, const char *fname, unsigned lnum) +#else /* DPRINTF_OSALHEAPTRACE */ +void osal_mem_free(void *ptr) +#endif /* DPRINTF_OSALHEAPTRACE */ +{ + osalMemHdr_t *hdr = (osalMemHdr_t *)ptr - 1; + halIntState_t intState; + +#ifdef DPRINTF_OSALHEAPTRACE + dprintf("osal_mem_free(%lx):%s:%u\n", (unsigned) ptr, fname, lnum); +#endif /* DPRINTF_OSALHEAPTRACE */ + + HAL_ASSERT(((uint8 *)ptr >= (uint8 *)theHeap) && ((uint8 *)ptr < (uint8 *)theHeap+MAXMEMHEAP)); + HAL_ASSERT(hdr->hdr.inUse); + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + hdr->hdr.inUse = FALSE; + + if (ff1 > hdr) + { + ff1 = hdr; + } + +#if OSALMEM_PROFILER +#if !OSALMEM_PROFILER_LL + if (osalMemStat != 0) // Don't profile until after the LL block is filled. +#endif + { + uint8 idx; + + for (idx = 0; idx < OSALMEM_PROMAX; idx++) + { + if (hdr->hdr.len <= proCnt[idx]) + { + break; + } + } + + proCur[idx]--; + } + + (void)osal_memset((uint8 *)(hdr+1), OSALMEM_REIN, (hdr->hdr.len - OSALMEM_HDRSZ) ); +#endif +#if OSALMEM_METRICS + memAlo -= hdr->hdr.len; + blkFree++; +#endif + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. +} + +#if OSALMEM_METRICS +/********************************************************************* + * @fn osal_heap_block_max + * + * @brief Return the maximum number of blocks ever allocated at once. + * + * @param none + * + * @return Maximum number of blocks ever allocated at once. + */ +uint16 osal_heap_block_max( void ) +{ + return blkMax; +} + +/********************************************************************* + * @fn osal_heap_block_cnt + * + * @brief Return the current number of blocks now allocated. + * + * @param none + * + * @return Current number of blocks now allocated. + */ +uint16 osal_heap_block_cnt( void ) +{ + return blkCnt; +} + +/********************************************************************* + * @fn osal_heap_block_free + * + * @brief Return the current number of free blocks. + * + * @param none + * + * @return Current number of free blocks. + */ +uint16 osal_heap_block_free( void ) +{ + return blkFree; +} + +/********************************************************************* + * @fn osal_heap_mem_used + * + * @brief Return the current number of bytes allocated. + * + * @param none + * + * @return Current number of bytes allocated. + */ +uint16 osal_heap_mem_used( void ) +{ + return memAlo; +} +#endif + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) +/********************************************************************* + * @fn osal_heap_high_water + * + * @brief Return the highest byte ever allocated in the heap. + * + * @param none + * + * @return Highest number of bytes ever used by the stack. + */ +uint16 osal_heap_high_water( void ) +{ +#if ( OSALMEM_METRICS ) + return memMax; +#else + return MAXMEMHEAP; +#endif +} +#endif + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_PwrMgr.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_PwrMgr.c new file mode 100644 index 0000000..a2b51b7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_PwrMgr.c @@ -0,0 +1,193 @@ +/************************************************************************************************** + Filename: OSAL_pwrmgr.c + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Tasks.h" +#include "OSAL_Timers.h" +#include "OSAL_PwrMgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_pwrmgr_init + * + * @brief Initialize the power management system. + * + * @param none. + * + * @return none. + */ +void osal_pwrmgr_init( void ) +{ + pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation. + pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve +} + +/********************************************************************* + * @fn osal_pwrmgr_device + * + * @brief Sets the device power characteristic. + * + * @param pwrmgr_device - type of power devices. With PWRMGR_ALWAYS_ON + * selection, there is no power savings and the device is most + * likely on mains power. The PWRMGR_BATTERY selection allows the + * HAL sleep manager to enter sleep. + * + * @return none + */ +void osal_pwrmgr_device( uint8 pwrmgr_device ) +{ + pwrmgr_attribute.pwrmgr_device = pwrmgr_device; +} + +/********************************************************************* + * @fn osal_pwrmgr_task_state + * + * @brief This function is called by each task to state whether or + * not this task wants to conserve power. + * + * @param task_id - calling task ID. + * state - whether the calling task wants to + * conserve power or not. + * + * @return SUCCESS if task complete + */ +uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ) +{ + if ( task_id >= tasksCnt ) + return ( INVALID_TASK ); + + if ( state == PWRMGR_CONSERVE ) + { + // Clear the task state flag + pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id ); + } + else + { + // Set the task state flag + pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id); + } + + return ( SUCCESS ); +} + +#if defined( POWER_SAVING ) +/********************************************************************* + * @fn osal_pwrmgr_powerconserve + * + * @brief This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + * + * @param none. + * + * @return none. + */ +void osal_pwrmgr_powerconserve( void ) +{ + uint32 next; + halIntState_t intState; + + // Should we even look into power conservation + if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) + { + // Are all tasks in agreement to conserve + if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) + { + // Hold off interrupts. + HAL_ENTER_CRITICAL_SECTION( intState ); + + // Get next time-out + next = osal_next_timeout(); + + // Re-enable interrupts. + HAL_EXIT_CRITICAL_SECTION( intState ); + + // Put the processor into sleep mode + OSAL_SET_CPU_INTO_SLEEP( next ); + } + } +} +#endif /* POWER_SAVING */ + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Timers.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Timers.c new file mode 100644 index 0000000..9c4d16b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/OSAL_Timers.c @@ -0,0 +1,613 @@ +/************************************************************************************************** + Filename: OSAL_Timers.c + Revised: $Date: 2012-11-28 00:37:02 -0800 (Wed, 28 Nov 2012) $ + Revision: $Revision: 32329 $ + + Description: OSAL Timer definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "comdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OSAL_Timers.h" +#include "hal_timer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +typedef union { + uint32 time32; + uint16 time16[2]; + uint8 time8[4]; +} osalTime_t; + +typedef struct +{ + void *next; + osalTime_t timeout; + uint16 event_flag; + uint8 task_id; + uint32 reloadTimeout; +} osalTimerRec_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +osalTimerRec_t *timerHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Milliseconds since last reboot +static uint32 osal_systemClock; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +osalTimerRec_t *osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ); +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ); +void osalDeleteTimer( osalTimerRec_t *rmTimer ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimerInit + * + * @brief Initialization for the OSAL Timer System. + * + * @param none + * + * @return + */ +void osalTimerInit( void ) +{ + osal_systemClock = 0; +} + +/********************************************************************* + * @fn osalAddTimer + * + * @brief Add a timer to the timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * @param timeout + * + * @return osalTimerRec_t * - pointer to newly created timer + */ +osalTimerRec_t * osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ) +{ + osalTimerRec_t *newTimer; + osalTimerRec_t *srchTimer; + + // Look for an existing timer first + newTimer = osalFindTimer( task_id, event_flag ); + if ( newTimer ) + { + // Timer is found - update it. + newTimer->timeout.time32 = timeout; + + return ( newTimer ); + } + else + { + // New Timer + newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) ); + + if ( newTimer ) + { + // Fill in new timer + newTimer->task_id = task_id; + newTimer->event_flag = event_flag; + newTimer->timeout.time32 = timeout; + newTimer->next = (void *)NULL; + newTimer->reloadTimeout = 0; + + // Does the timer list already exist + if ( timerHead == NULL ) + { + // Start task list + timerHead = newTimer; + } + else + { + // Add it to the end of the timer list + srchTimer = timerHead; + + // Stop at the last record + while ( srchTimer->next ) + srchTimer = srchTimer->next; + + // Add to the list + srchTimer->next = newTimer; + } + + return ( newTimer ); + } + else + { + return ( (osalTimerRec_t *)NULL ); + } + } +} + +/********************************************************************* + * @fn osalFindTimer + * + * @brief Find a timer in a timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * + * @return osalTimerRec_t * + */ +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ) +{ + osalTimerRec_t *srchTimer; + + // Head of the timer list + srchTimer = timerHead; + + // Stop when found or at the end + while ( srchTimer ) + { + if ( srchTimer->event_flag == event_flag && + srchTimer->task_id == task_id ) + { + break; + } + + // Not this one, check another + srchTimer = srchTimer->next; + } + + return ( srchTimer ); +} + +/********************************************************************* + * @fn osalDeleteTimer + * + * @brief Delete a timer from a timer list. + * + * @param table + * @param rmTimer + * + * @return none + */ +void osalDeleteTimer( osalTimerRec_t *rmTimer ) +{ + // Does the timer list really exist + if ( rmTimer ) + { + // Clear the event flag and osalTimerUpdate() will delete + // the timer from the list. + rmTimer->event_flag = 0; + } +} + +/********************************************************************* + * @fn osal_start_timerEx + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param uint32 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_start_reload_timer + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event + * and the timer will be reloaded with the timeout value. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param UNINT16 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + if ( newTimer ) + { + // Load the reload timeout value + newTimer->reloadTimeout = timeout_value; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_stop_timerEx + * + * @brief + * + * This function is called to stop a timer that has already been started. + * If ZSUCCESS, the function will cancel the timer and prevent the event + * associated with the timer from being set for the calling task. + * + * @param uint8 task_id - task id of timer to stop + * @param uint16 event_id - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALID_EVENT_ID + */ +uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + osalTimerRec_t *foundTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Find the timer to stop + foundTimer = osalFindTimer( task_id, event_id ); + if ( foundTimer ) + { + osalDeleteTimer( foundTimer ); + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return ( (foundTimer != NULL) ? SUCCESS : INVALID_EVENT_ID ); +} + +/********************************************************************* + * @fn osal_get_timeoutEx + * + * @brief + * + * @param uint8 task_id - task id of timer to check + * @param uint16 event_id - identifier of timer to be checked + * + * @return Return the timer's tick count if found, zero otherwise. + */ +uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + uint32 rtrn = 0; + osalTimerRec_t *tmr; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + tmr = osalFindTimer( task_id, event_id ); + + if ( tmr ) + { + rtrn = tmr->timeout.time32; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return rtrn; +} + +/********************************************************************* + * @fn osal_timer_num_active + * + * @brief + * + * This function counts the number of active timers. + * + * @return uint8 - number of timers + */ +uint8 osal_timer_num_active( void ) +{ + halIntState_t intState; + uint8 num_timers = 0; + osalTimerRec_t *srchTimer; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // Head of the timer list + srchTimer = timerHead; + + // Count timers in the list + while ( srchTimer != NULL ) + { + num_timers++; + srchTimer = srchTimer->next; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + return num_timers; +} + +/********************************************************************* + * @fn osalTimerUpdate + * + * @brief Update the timer structures for a timer tick. + * + * @param none + * + * @return none + *********************************************************************/ +void osalTimerUpdate( uint32 updateTime ) +{ + halIntState_t intState; + osalTimerRec_t *srchTimer; + osalTimerRec_t *prevTimer; + + osalTime_t timeUnion; + timeUnion.time32 = updateTime; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + // Update the system time + osal_systemClock += updateTime; + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + // Look for open timer slot + if ( timerHead != NULL ) + { + // Add it to the end of the timer list + srchTimer = timerHead; + prevTimer = (void *)NULL; + + // Look for open timer slot + while ( srchTimer ) + { + osalTimerRec_t *freeTimer = NULL; + + HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts. + + // To minimize time in this critical section, avoid 32-bit math + if ((timeUnion.time16[1] == 0) && (timeUnion.time8[1] == 0)) + { + // If upper 24 bits are zero, check lower 8 bits for roll over + if (srchTimer->timeout.time8[0] >= timeUnion.time8[0]) + { + // 8-bit math + srchTimer->timeout.time8[0] -= timeUnion.time8[0]; + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + + // Check for reloading + if ( (srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0) && + (srchTimer->reloadTimeout) && (srchTimer->event_flag) ) + { + // Notify the task of a timeout + osal_set_event( srchTimer->task_id, srchTimer->event_flag ); + + // Reload the timer timeout value + srchTimer->timeout.time32 = srchTimer->reloadTimeout; + } + + // When timeout or delete (event_flag == 0) + if ( ((srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0)) || + (srchTimer->event_flag == 0) ) + { + // Take out of list + if ( prevTimer == NULL ) + { + timerHead = srchTimer->next; + } + else + { + prevTimer->next = srchTimer->next; + } + + // Setup to free memory + freeTimer = srchTimer; + + // Next + srchTimer = srchTimer->next; + } + else + { + // Get next + prevTimer = srchTimer; + srchTimer = srchTimer->next; + } + + HAL_EXIT_CRITICAL_SECTION( intState ); // Re-enable interrupts. + + if ( freeTimer ) + { + if ( (freeTimer->timeout.time16[0] == 0) && (freeTimer->timeout.time16[1] == 0) ) + { + osal_set_event( freeTimer->task_id, freeTimer->event_flag ); + } + osal_mem_free( freeTimer ); + } + } + } +} + +#ifdef POWER_SAVING +/********************************************************************* + * @fn osal_adjust_timers + * + * @brief Update the timer structures for elapsed ticks. + * + * @param none + * + * @return none + *********************************************************************/ +void osal_adjust_timers( void ) +{ + uint32 eTime; + + if ( timerHead != NULL ) + { + // Compute elapsed time (msec) + eTime = TimerElapsed() / TICK_COUNT; + + if ( eTime ) + { + osalTimerUpdate( eTime ); + } + } +} + +/********************************************************************* + * @fn osal_next_timeout + * + * @brief + * + * Search timer table to return the lowest timeout value. If the + * timer list is empty, then the returned timeout will be zero. + * + * @param none + * + * @return none + *********************************************************************/ +uint32 osal_next_timeout( void ) +{ + uint32 nextTimeout; + osalTimerRec_t *srchTimer; + + if ( timerHead != NULL ) + { + // Head of the timer list + srchTimer = timerHead; + nextTimeout = OSAL_TIMERS_MAX_TIMEOUT; + + // Look for the next timeout timer + while ( srchTimer != NULL ) + { + if (srchTimer->timeout.time32 < nextTimeout) + { + nextTimeout = srchTimer->timeout.time32; + } + // Check next timer + srchTimer = srchTimer->next; + } + } + else + { + // No timers + nextTimeout = 0; + } + + return ( nextTimeout ); +} +#endif // POWER_SAVING + +/********************************************************************* + * @fn osal_GetSystemClock() + * + * @brief Read the local system clock. + * + * @param none + * + * @return local clock in milliseconds + */ +uint32 osal_GetSystemClock( void ) +{ + return ( osal_systemClock ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_bufmgr.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_bufmgr.c new file mode 100644 index 0000000..28f89b3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_bufmgr.c @@ -0,0 +1,268 @@ +/************************************************************************************************** + Filename: osal_bufmgr.c + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the buffer management APIs. These APIs + are not reentrant hence cannot be called from an interrupt + contex. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#include "OSAL.h" +#include "OnBoard.h" + +#include "osal_bufmgr.h" + +/********************************************************************* + * MACROS + */ +// 'bd_ptr' used with these macros must be of the type 'bm_desc_t *' +#define START_PTR( bd_ptr ) ( (bd_ptr) + 1 ) +#define END_PTR( bd_ptr ) ( (uint8 *)START_PTR( bd_ptr ) + (bd_ptr)->payload_len ) + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ +typedef struct bm_desc +{ + struct bm_desc *next_ptr; // pointer to next buffer descriptor + uint16 payload_len; // length of user's buffer +} bm_desc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Linked list of allocated buffer descriptors +static bm_desc_t *bm_list_ptr = NULL; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ); + +/********************************************************************* + * @fn osal_bm_alloc + * + * @brief Implementation of the allocator functionality. + * + * WARNING: THIS FUNCTION CAN BE CALLED ONLY FROM THE BOTTOM + * LAYER OF THE STACK (HCI FOR DUAL MODE AND LINK + * LAYER FOR SINGLE MODE). + * + * @param size - number of bytes to allocate from the heap. + * + * @return pointer to the heap allocation; NULL if error or failure. + */ +void *osal_bm_alloc( uint16 size ) +{ + bm_desc_t *bd_ptr; + + bd_ptr = osal_mem_alloc( sizeof( bm_desc_t ) + size ); + if ( bd_ptr != NULL ) + { + // set the buffer descriptor info + bd_ptr->payload_len = size; + + // add item to the beginning of the list + bd_ptr->next_ptr = bm_list_ptr; + bm_list_ptr = bd_ptr; + + // return start of the buffer + return ( (void *)START_PTR( bd_ptr ) ); + } + + return ( (void *)NULL ); +} + +/********************************************************************* + * @fn osal_bm_free + * + * @brief Implementation of the de-allocator functionality. + * + * @param payload_ptr - pointer to the memory to free. + * + * @return none + */ +void osal_bm_free( void *payload_ptr ) +{ + bm_desc_t *loop_ptr; + bm_desc_t *prev_ptr = NULL; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != NULL ) + { + if ( payload_ptr >= (void *)START_PTR( loop_ptr ) && + payload_ptr <= (void *)END_PTR( loop_ptr) ) + { + // unlink item from the linked list + if ( prev_ptr == NULL ) + { + // it's the first item on the list + bm_list_ptr = loop_ptr->next_ptr; + } + else + { + prev_ptr->next_ptr = loop_ptr->next_ptr; + } + + // free the memory + osal_mem_free( loop_ptr ); + + // we're done here + break; + } + + // move on to next item + prev_ptr = loop_ptr; + loop_ptr = loop_ptr->next_ptr; + } +} + +/********************************************************************* + * @fn osal_bm_adjust_header + * + * @brief Add or remove header space for the payload pointer. A positive + * adjustment adds header space, and negative removes header space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_header( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != NULL ) + { + new_payload_ptr = (uint8 *)( (uint8 *)payload_ptr - size ); + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) && + new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn osal_bm_adjust_tail + * + * @brief Add or remove tail space for the payload pointer. A positive + * adjustment adds tail space, and negative removes tail space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_tail( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != NULL ) + { + new_payload_ptr = (uint8 *)END_PTR( bd_ptr ) - size; + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) && + new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn bm_desc_from_payload + * + * @brief Find buffer descriptor from payload pointer + * + * @param payload_ptr - pointer to payload + * + * @return pointer to buffer descriptor + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ) +{ + bm_desc_t *loop_ptr; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != NULL ) + { + if ( payload_ptr >= (uint8 *)START_PTR( loop_ptr ) && + payload_ptr <= (uint8 *)END_PTR( loop_ptr) ) + { + // item found + break; + } + + // move on to next item + loop_ptr = loop_ptr->next_ptr; + } + + return ( loop_ptr ); +} + + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_cbtimer.c b/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_cbtimer.c new file mode 100644 index 0000000..1bbd61d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/common/osal_cbtimer.c @@ -0,0 +1,317 @@ +/************************************************************************************************* + Filename: osal_cbtimer.c + Revised: $Date: 2009-01-14 14:51:34 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18762 $ + + Description: This file contains the Callback Timer task(s). This module + provides 'callback' timers using the existing 'event' timers. + In other words, the registered callback function is called + instead of an OSAL event being sent to the owner of the timer + when it expires. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#include "OSAL.h" +#include "OSAL_Tasks.h" + +#include "osal_cbtimer.h" + +/********************************************************************* + * MACROS + */ +// Macros to convert one-dimensional index 'timer id' to two-dimensional indices +// 'task id' and 'event id'. + +// Find out event id using timer id +#define EVENT_ID( timerId ) ( 0x0001 << ( ( timerId ) % NUM_CBTIMERS_PER_TASK ) ) + +// Find out task id using timer id +#define TASK_ID( timerId ) ( ( ( timerId ) / NUM_CBTIMERS_PER_TASK ) + baseTaskID ) + +// Find out bank task id using task id +#define BANK_TASK_ID( taskId ) ( ( baseTaskID - ( taskId ) ) * NUM_CBTIMERS ) + +/********************************************************************* + * CONSTANTS + */ +// Number of callback timers supported per task (limited by the number of OSAL event timers) +#define NUM_CBTIMERS_PER_TASK 15 + +// Total number of callback timers +#define NUM_CBTIMERS ( OSAL_CBTIMER_NUM_TASKS * NUM_CBTIMERS_PER_TASK ) + +/********************************************************************* + * TYPEDEFS + */ +// Callback Timer structure +typedef struct +{ + pfnCbTimer_t pfnCbTimer; // callback function to be called when timer expires + uint8 *pData; // data to be passed in to callback function +} cbTimer_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Callback Timer base task id +uint16 baseTaskID = TASK_NO_TASK; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Callback Timers table. +#if ( NUM_CBTIMERS > 0 ) + cbTimer_t cbTimers[NUM_CBTIMERS]; +#endif + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn osal_CbTimerInit + * + * @brief Callback Timer task initialization function. This function + * can be called more than once (OSAL_CBTIMER_NUM_TASKS times). + * + * @param taskId - Message Timer task ID. + * + * @return void + */ +void osal_CbTimerInit( uint8 taskId ) +{ + if ( baseTaskID == TASK_NO_TASK ) + { + // Only initialize the base task id + baseTaskID = taskId; + + // Initialize all timer structures + osal_memset( cbTimers, 0, sizeof( cbTimers ) ); + } +} + +/********************************************************************* + * @fn osal_CbTimerProcessEvent + * + * @brief Callback Timer task event processing function. + * + * @param taskId - task ID. + * @param events - events. + * + * @return events not processed + */ +uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + // Process OSAL messages + + // return unprocessed events + return ( events ^ SYS_EVENT_MSG ); + } + + if ( events ) + { + uint8 i; + uint16 event; + + // Process event timers + for ( i = 0; i < NUM_CBTIMERS_PER_TASK; i++ ) + { + if ( ( events >> i ) & 0x0001 ) + { + cbTimer_t *pTimer = &cbTimers[BANK_TASK_ID( taskId )+i]; + + // Found the first event + event = 0x0001 << i; + + // Timer expired, call the registered callback function + pTimer->pfnCbTimer( pTimer->pData ); + + // Mark entry as free + pTimer->pfnCbTimer = NULL; + + // Null out data pointer + pTimer->pData = NULL; + + // We only process one event at a time + break; + } + } + + // return unprocessed events + return ( events ^ event ); + } + + // If reach here, the events are unknown + // Discard or make more handlers + return 0; +} + +/********************************************************************* + * @fn osal_CbTimerStart + * + * @brief This function is called to start a callback timer to expire + * in n mSecs. When the timer expires, the registered callback + * function will be called. + * + * @param pfnCbTimer - callback function to be called when timer expires + * @param pData - data to be passed in to callback function + * @param timeout - in milliseconds. + * @param pTimerId - will point to new timer Id (if not null) + * + * @return Success, or Failure. + */ +Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ) +{ + uint8 i; + + // Validate input parameters + if ( pfnCbTimer == NULL ) + { + return ( INVALIDPARAMETER ); + } + + // Look for an unused timer first + for ( i = 0; i < NUM_CBTIMERS; i++ ) + { + if ( cbTimers[i].pfnCbTimer == NULL ) + { + // Start the OSAL event timer first + if ( osal_start_timerEx( TASK_ID( i ), EVENT_ID( i ), timeout ) == SUCCESS ) + { + // Set up the callback timer + cbTimers[i].pfnCbTimer = pfnCbTimer; + cbTimers[i].pData = pData; + + if ( pTimerId != NULL ) + { + // Caller is intreseted in the timer id + *pTimerId = i; + } + + return ( SUCCESS ); + } + } + } + + // No timer available + return ( NO_TIMER_AVAIL ); +} + +/********************************************************************* + * @fn osal_CbTimerUpdate + * + * @brief This function is called to update a message timer that has + * already been started. If SUCCESS, the function will update + * the timer's timeout value. If INVALIDPARAMETER, the timer + * either doesn't exit. + * + * @param timerId - identifier of the timer that is to be updated + * @param timeout - new timeout in milliseconds. + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ) +{ + // Look for the existing timer + if ( timerId < NUM_CBTIMERS ) + { + if ( cbTimers[timerId].pfnCbTimer != NULL ) + { + // Make sure the corresponding OSAL event timer is still running + if ( osal_get_timeoutEx( TASK_ID( timerId ), EVENT_ID( timerId ) ) != 0 ) + { + // Timer exists; update it + osal_start_timerEx( TASK_ID( timerId ), EVENT_ID( timerId ), timeout ); + + return ( SUCCESS ); + } + } + } + + // Timer not found + return ( INVALIDPARAMETER ); +} + + +/********************************************************************* + * @fn osal_CbTimerStop + * + * @brief This function is called to stop a timer that has already been + * started. If SUCCESS, the function will cancel the timer. If + * INVALIDPARAMETER, the timer doesn't exit. + * + * @param timerId - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerStop( uint8 timerId ) +{ + // Look for the existing timer + if ( timerId < NUM_CBTIMERS ) + { + if ( cbTimers[timerId].pfnCbTimer != NULL ) + { + // Timer exists; stop the OSAL event timer first + osal_stop_timerEx( TASK_ID( timerId ), EVENT_ID( timerId ) ); + + // Mark entry as free + cbTimers[timerId].pfnCbTimer = NULL; + + // Null out data pointer + cbTimers[timerId].pData = NULL; + + return ( SUCCESS ); + } + } + + // Timer not found + return ( INVALIDPARAMETER ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL.h new file mode 100644 index 0000000..8b34adf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL.h @@ -0,0 +1,308 @@ +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + +#ifndef OSAL_H +#define OSAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include + +#include "comdef.h" +#include "OSAL_Memory.h" +#include "OSAL_Timers.h" + +/********************************************************************* + * MACROS + */ +#if ( UINT_MAX == 65535 ) /* 8-bit and 16-bit devices */ + #define osal_offsetof(type, member) ((uint16) &(((type *) 0)->member)) +#else /* 32-bit devices */ + #define osal_offsetof(type, member) ((uint32) &(((type *) 0)->member)) +#endif + +#define OSAL_MSG_NEXT(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->next + +#define OSAL_MSG_Q_INIT(q_ptr) *(q_ptr) = NULL + +#define OSAL_MSG_Q_EMPTY(q_ptr) (*(q_ptr) == NULL) + +#define OSAL_MSG_Q_HEAD(q_ptr) (*(q_ptr)) + +#define OSAL_MSG_LEN(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->len + +#define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ +#define INTS_ALL 0xFF + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ +#if defined (ZBIT) + extern __declspec(dllexport) void osal_start_system( void ); +#else + extern void osal_start_system( void ); +#endif + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void GENERIC *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void GENERIC *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void GENERIC *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void GENERIC *src1, const void GENERIC *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + #if !defined ( ZBIT ) && !defined ( ZBIT2 ) && !defined (UBIT) + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + #endif + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Clock.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Clock.h new file mode 100644 index 0000000..09dce7a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Clock.h @@ -0,0 +1,139 @@ +/****************************************************************************** + Filename: OSAL_Clock.h + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: OSAL Clock definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + +#ifndef OSAL_CLOCK_H +#define OSAL_CLOCK_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +#define IsLeapYear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4))) + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +typedef uint32 UTCTime; + +// To be used with +typedef struct +{ + uint8 seconds; // 0-59 + uint8 minutes; // 0-59 + uint8 hour; // 0-23 + uint8 day; // 0-30 + uint8 month; // 0-11 + uint16 year; // 2000+ +} UTCTimeStruct; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Updates the OSAL clock and Timers from the MAC 320us timer tick. + */ + extern void osalTimeUpdate( void ); + + /* + * Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern void osal_setClock( UTCTime newTime ); + + /* + * Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second counter. + * returns: number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern UTCTime osal_getClock( void ); + + /* + * Converts UTCTime to UTCTimeStruct + * + * secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * tm - pointer to breakdown struct + */ + extern void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ); + + /* + * Converts UTCTimeStruct to UTCTime (seconds since 00:00:00 01/01/2000) + * + * tm - pointer to UTC time struct + */ + extern UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ); + + /* + * Update/Adjust the osal clock and timers + * Msec - elapsed time in milli seconds + */ + extern void osalAdjustTimer( uint32 Msec ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_CLOCK_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Memory.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Memory.h new file mode 100644 index 0000000..c8984dd --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Memory.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_MEMORY_H +#define OSAL_MEMORY_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" + +/********************************************************************* + * CONSTANTS + */ + +#if !defined ( OSALMEM_METRICS ) + #define OSALMEM_METRICS FALSE +#endif + +/********************************************************************* + * MACROS + */ + +#define osal_stack_used() OnBoard_stack_used() + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ +#ifdef DPRINTF_OSALHEAPTRACE + void *osal_mem_alloc_dbg( uint16 size, const char *fname, unsigned lnum ); +#define osal_mem_alloc(_size ) osal_mem_alloc_dbg(_size, __FILE__, __LINE__) +#else /* DPRINTF_OSALHEAPTRACE */ + void *osal_mem_alloc( uint16 size ); +#endif /* DPRINTF_OSALHEAPTRACE */ + + /* + * Free a block of memory. + */ +#ifdef DPRINTF_OSALHEAPTRACE + void osal_mem_free_dbg( void *ptr, const char *fname, unsigned lnum ); +#define osal_mem_free(_ptr ) osal_mem_free_dbg(_ptr, __FILE__, __LINE__) +#else /* DPRINTF_OSALHEAPTRACE */ + void osal_mem_free( void *ptr ); +#endif /* DPRINTF_OSALHEAPTRACE */ + +#if ( OSALMEM_METRICS ) + /* + * Return the maximum number of blocks ever allocated at once. + */ + uint16 osal_heap_block_max( void ); + + /* + * Return the current number of blocks now allocated. + */ + uint16 osal_heap_block_cnt( void ); + + /* + * Return the current number of free blocks. + */ + uint16 osal_heap_block_free( void ); + + /* + * Return the current number of bytes allocated. + */ + uint16 osal_heap_mem_used( void ); +#endif + +#if defined (ZTOOL_P1) || defined (ZTOOL_P2) + /* + * Return the highest number of bytes ever used in the heap. + */ + uint16 osal_heap_high_water( void ); +#endif + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef OSAL_MEMORY_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Nv.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Nv.h new file mode 100644 index 0000000..5532ac8 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Nv.h @@ -0,0 +1,111 @@ +/************************************************************************************************** + Filename: OSAL_Nv.h + Revised: $Date: 2011-05-31 09:28:05 -0700 (Tue, 31 May 2011) $ + Revision: $Revision: 26152 $ + + Description: This module defines the OSAL non-volatile memory functions. + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_NV_H +#define OSAL_NV_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize NV service + */ +extern void osal_nv_init( void *p ); + +/* + * Initialize an item in NV + */ +extern uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ); + +/* + * Read an NV attribute + */ +extern uint8 osal_nv_read( uint16 id, uint16 offset, uint16 len, void *buf ); + +/* + * Write an NV attribute + */ +extern uint8 osal_nv_write( uint16 id, uint16 offset, uint16 len, void *buf ); + +/* + * Get the length of an NV item. + */ +extern uint16 osal_nv_item_len( uint16 id ); + +/* + * Delete an NV item. + */ +extern uint8 osal_nv_delete( uint16 id, uint16 len ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_NV.H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_PwrMgr.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_PwrMgr.h new file mode 100644 index 0000000..cdbaaf9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_PwrMgr.h @@ -0,0 +1,139 @@ +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_PWRMGR_H +#define OSAL_PWRMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ +#define PWRMGR_ALWAYS_ON 0 +#define PWRMGR_BATTERY 1 + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ +#define PWRMGR_CONSERVE 0 +#define PWRMGR_HOLD 1 + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_PWRMGR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Tasks.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Tasks.h new file mode 100644 index 0000000..ac0beaf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Tasks.h @@ -0,0 +1,94 @@ +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_TASKS_H +#define OSAL_TASKS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +#define TASK_NO_TASK 0xFF + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_TASKS_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Timers.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Timers.h new file mode 100644 index 0000000..d4de494 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/OSAL_Timers.h @@ -0,0 +1,146 @@ +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_TIMERS_H +#define OSAL_TIMERS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + #define OSAL_TIMERS_MAX_TIMEOUT 0x28f5c28e /* unit is ms*/ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_TIMERS_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/ZComDef.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/ZComDef.h new file mode 100644 index 0000000..05f4692 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/ZComDef.h @@ -0,0 +1,439 @@ +/************************************************************************************************** + Filename: ZComDef.h + Revised: $Date: 2012-12-07 12:34:45 -0800 (Fri, 07 Dec 2012) $ + Revision: $Revision: 32490 $ + + Description: Type definitions and macros. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ZCOMDEF_H +#define ZCOMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ +#include "comdef.h" +#include "saddr.h" + + +/********************************************************************* + * CONSTANTS + */ +#define osal_cpyExtAddr(a, b) sAddrExtCpy((a), (const uint8 *)(b)) +#define osal_ExtAddrEqual(a, b) sAddrExtCmp((const uint8 *)(a), (const uint8 *)(b)) +#define osal_copyAddress(a, b) sAddrCpy( (sAddr_t *)(a), (const sAddr_t *)(b) ) + +/********************************************************************* + * CONSTANTS + */ + +// Build Device Types - Used during compilation +// These are the types of devices to build +// Bit masked into ZSTACK_DEVICE_BUILD +#define DEVICE_BUILD_COORDINATOR 0x01 +#define DEVICE_BUILD_ROUTER 0x02 +#define DEVICE_BUILD_ENDDEVICE 0x04 + +/*** Return Values ***/ +#define ZSUCCESS SUCCESS + +/*** Component IDs ***/ +#define COMPID_OSAL 0 +#define COMPID_MTEL 1 +#define COMPID_MTSPCI 2 +#define COMPID_NWK 3 +#define COMPID_NWKIF 4 +#define COMPID_MACCB 5 +#define COMPID_MAC 6 +#define COMPID_APP 7 +#define COMPID_TEST 8 + +#define COMPID_RTG 9 +#define COMPID_DATA 11 + +/* Temp CompIDs for testing */ +#define COMPID_TEST_NWK_STARTUP 20 +#define COMPID_TEST_SCAN_CONFIRM 21 +#define COMPID_TEST_ASSOC_CONFIRM 22 +#define COMPID_TEST_REMOTE_DATA_CONFIRM 23 + +// OSAL NV item IDs +#define ZCD_NV_EXTADDR 0x0001 +#define ZCD_NV_BOOTCOUNTER 0x0002 +#define ZCD_NV_STARTUP_OPTION 0x0003 +#define ZCD_NV_START_DELAY 0x0004 + +// NWK Layer NV item IDs +#define ZCD_NV_NIB 0x0021 +#define ZCD_NV_DEVICE_LIST 0x0022 +#define ZCD_NV_ADDRMGR 0x0023 +#define ZCD_NV_POLL_RATE 0x0024 +#define ZCD_NV_QUEUED_POLL_RATE 0x0025 +#define ZCD_NV_RESPONSE_POLL_RATE 0x0026 +#define ZCD_NV_REJOIN_POLL_RATE 0x0027 +#define ZCD_NV_DATA_RETRIES 0x0028 +#define ZCD_NV_POLL_FAILURE_RETRIES 0x0029 +#define ZCD_NV_STACK_PROFILE 0x002A +#define ZCD_NV_INDIRECT_MSG_TIMEOUT 0x002B +#define ZCD_NV_ROUTE_EXPIRY_TIME 0x002C +#define ZCD_NV_EXTENDED_PAN_ID 0x002D +#define ZCD_NV_BCAST_RETRIES 0x002E +#define ZCD_NV_PASSIVE_ACK_TIMEOUT 0x002F +#define ZCD_NV_BCAST_DELIVERY_TIME 0x0030 +#define ZCD_NV_NWK_MODE 0x0031 +#define ZCD_NV_CONCENTRATOR_ENABLE 0x0032 +#define ZCD_NV_CONCENTRATOR_DISCOVERY 0x0033 +#define ZCD_NV_CONCENTRATOR_RADIUS 0x0034 +#define ZCD_NV_CONCENTRATOR_RC 0x0036 +#define ZCD_NV_NWK_MGR_MODE 0x0037 +#define ZCD_NV_SRC_RTG_EXPIRY_TIME 0x0038 +#define ZCD_NV_ROUTE_DISCOVERY_TIME 0x0039 +#define ZCD_NV_NWK_ACTIVE_KEY_INFO 0x003A +#define ZCD_NV_NWK_ALTERN_KEY_INFO 0x003B +#define ZCD_NV_ROUTER_OFF_ASSOC_CLEANUP 0x003C +#define ZCD_NV_NWK_LEAVE_REQ_ALLOWED 0x003D +#define ZCD_NV_NWK_CHILD_AGE_ENABLE 0x003E +#define ZCD_NV_DEVICE_LIST_KA_TIMEOUT 0x003F + +// APS Layer NV item IDs +#define ZCD_NV_BINDING_TABLE 0x0041 +#define ZCD_NV_GROUP_TABLE 0x0042 +#define ZCD_NV_APS_FRAME_RETRIES 0x0043 +#define ZCD_NV_APS_ACK_WAIT_DURATION 0x0044 +#define ZCD_NV_APS_ACK_WAIT_MULTIPLIER 0x0045 +#define ZCD_NV_BINDING_TIME 0x0046 +#define ZCD_NV_APS_USE_EXT_PANID 0x0047 +#define ZCD_NV_APS_USE_INSECURE_JOIN 0x0048 +#define ZCD_NV_COMMISSIONED_NWK_ADDR 0x0049 + +#define ZCD_NV_APS_NONMEMBER_RADIUS 0x004B // Multicast non_member radius +#define ZCD_NV_APS_LINK_KEY_TABLE 0x004C +#define ZCD_NV_APS_DUPREJ_TIMEOUT_INC 0x004D +#define ZCD_NV_APS_DUPREJ_TIMEOUT_COUNT 0x004E +#define ZCD_NV_APS_DUPREJ_TABLE_SIZE 0x004F + +// Security NV Item IDs +#define ZCD_NV_SECURITY_LEVEL 0x0061 +#define ZCD_NV_PRECFGKEY 0x0062 +#define ZCD_NV_PRECFGKEYS_ENABLE 0x0063 +#define ZCD_NV_SECURITY_MODE 0x0064 +#define ZCD_NV_SECURE_PERMIT_JOIN 0x0065 +#define ZCD_NV_APS_LINK_KEY_TYPE 0x0066 +#define ZCD_NV_APS_ALLOW_R19_SECURITY 0x0067 + +#define ZCD_NV_IMPLICIT_CERTIFICATE 0x0069 +#define ZCD_NV_DEVICE_PRIVATE_KEY 0x006A +#define ZCD_NV_CA_PUBLIC_KEY 0x006B + +#define ZCD_NV_USE_DEFAULT_TCLK 0x006D +#define ZCD_NV_TRUSTCENTER_ADDR 0x006E +#define ZCD_NV_RNG_COUNTER 0x006F +#define ZCD_NV_RANDOM_SEED 0x0070 + +// ZDO NV Item IDs +#define ZCD_NV_USERDESC 0x0081 +#define ZCD_NV_NWKKEY 0x0082 +#define ZCD_NV_PANID 0x0083 +#define ZCD_NV_CHANLIST 0x0084 +#define ZCD_NV_LEAVE_CTRL 0x0085 +#define ZCD_NV_SCAN_DURATION 0x0086 +#define ZCD_NV_LOGICAL_TYPE 0x0087 +#define ZCD_NV_NWKMGR_MIN_TX 0x0088 +#define ZCD_NV_NWKMGR_ADDR 0x0089 + +#define ZCD_NV_ZDO_DIRECT_CB 0x008F + +// ZCL NV item IDs +#define ZCD_NV_SCENE_TABLE 0x0091 +#define ZCD_NV_MIN_FREE_NWK_ADDR 0x0092 +#define ZCD_NV_MAX_FREE_NWK_ADDR 0x0093 +#define ZCD_NV_MIN_FREE_GRP_ID 0x0094 +#define ZCD_NV_MAX_FREE_GRP_ID 0x0095 +#define ZCD_NV_MIN_GRP_IDS 0x0096 +#define ZCD_NV_MAX_GRP_IDS 0x0097 + +// Non-standard NV item IDs +#define ZCD_NV_SAPI_ENDPOINT 0x00A1 + +// NV Items Reserved for Commissioning Cluster Startup Attribute Set (SAS): +// 0x00B1 - 0x00BF: Parameters related to APS and NWK layers +// 0x00C1 - 0x00CF: Parameters related to Security +// 0x00D1 - 0x00DF: Current key parameters +#define ZCD_NV_SAS_SHORT_ADDR 0x00B1 +#define ZCD_NV_SAS_EXT_PANID 0x00B2 +#define ZCD_NV_SAS_PANID 0x00B3 +#define ZCD_NV_SAS_CHANNEL_MASK 0x00B4 +#define ZCD_NV_SAS_PROTOCOL_VER 0x00B5 +#define ZCD_NV_SAS_STACK_PROFILE 0x00B6 +#define ZCD_NV_SAS_STARTUP_CTRL 0x00B7 + +#define ZCD_NV_SAS_TC_ADDR 0x00C1 +#define ZCD_NV_SAS_TC_MASTER_KEY 0x00C2 +#define ZCD_NV_SAS_NWK_KEY 0x00C3 +#define ZCD_NV_SAS_USE_INSEC_JOIN 0x00C4 +#define ZCD_NV_SAS_PRECFG_LINK_KEY 0x00C5 +#define ZCD_NV_SAS_NWK_KEY_SEQ_NUM 0x00C6 +#define ZCD_NV_SAS_NWK_KEY_TYPE 0x00C7 +#define ZCD_NV_SAS_NWK_MGR_ADDR 0x00C8 + +#define ZCD_NV_SAS_CURR_TC_MASTER_KEY 0x00D1 +#define ZCD_NV_SAS_CURR_NWK_KEY 0x00D2 +#define ZCD_NV_SAS_CURR_PRECFG_LINK_KEY 0x00D3 + +// NV Items Reserved for Trust Center Link Key Table entries +// 0x0101 - 0x01FF +#define ZCD_NV_TCLK_TABLE_START 0x0101 +#define ZCD_NV_TCLK_TABLE_END 0x01FF + +// NV Items Reserved for APS Link Key Table entries +// 0x0201 - 0x02FF +#define ZCD_NV_APS_LINK_KEY_DATA_START 0x0201 // APS key data +#define ZCD_NV_APS_LINK_KEY_DATA_END 0x02FF + +// NV Items Reserved for Master Key Table entries +// 0x0301 - 0x03FF +#define ZCD_NV_MASTER_KEY_DATA_START 0x0301 // Master key data +#define ZCD_NV_MASTER_KEY_DATA_END 0x03FF + +// NV Items Reserved for applications (user applications) +// 0x0401 – 0x0FFF + + +// ZCD_NV_STARTUP_OPTION values +// These are bit weighted - you can OR these together. +// Setting one of these bits will set their associated NV items +// to code initialized values. +#define ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 +#define ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 +#define ZCD_STARTOPT_AUTO_START 0x04 +#define ZCD_STARTOPT_CLEAR_CONFIG ZCD_STARTOPT_DEFAULT_CONFIG_STATE +#define ZCD_STARTOPT_CLEAR_STATE ZCD_STARTOPT_DEFAULT_NETWORK_STATE + + +#define ZCL_KE_IMPLICIT_CERTIFICATE_LEN 48 +#define ZCL_KE_CA_PUBLIC_KEY_LEN 22 +#define ZCL_KE_DEVICE_PRIVATE_KEY_LEN 21 + +/********************************************************************* + * TYPEDEFS + */ + +/*** Data Types ***/ +typedef uint8 byte; +typedef uint16 UINT16; +typedef int16 INT16; + +enum +{ + AddrNotPresent = 0, + AddrGroup = 1, + Addr16Bit = 2, + Addr64Bit = 3, + AddrBroadcast = 15 +}; + +#define Z_EXTADDR_LEN 8 + +typedef byte ZLongAddr_t[Z_EXTADDR_LEN]; + +typedef struct +{ + union + { + uint16 shortAddr; + ZLongAddr_t extAddr; + } addr; + byte addrMode; +} zAddrType_t; + +// Redefined Generic Status Return Values for code backwards compatibility +#define ZSuccess SUCCESS +#define ZFailure FAILURE +#define ZInvalidParameter INVALIDPARAMETER + +// ZStack status values must start at 0x10, after the generic status values (defined in comdef.h) +#define ZMemError 0x10 +#define ZBufferFull 0x11 +#define ZUnsupportedMode 0x12 +#define ZMacMemError 0x13 + +#define ZSapiInProgress 0x20 +#define ZSapiTimeout 0x21 +#define ZSapiInit 0x22 + +#define ZNotAuthorized 0x7E + +#define ZMalformedCmd 0x80 +#define ZUnsupClusterCmd 0x81 + +// OTA Status values +#define ZOtaAbort 0x95 +#define ZOtaImageInvalid 0x96 +#define ZOtaWaitForData 0x97 +#define ZOtaNoImageAvailable 0x98 +#define ZOtaRequireMoreImage 0x99 + +// APS status values +#define ZApsFail 0xb1 +#define ZApsTableFull 0xb2 +#define ZApsIllegalRequest 0xb3 +#define ZApsInvalidBinding 0xb4 +#define ZApsUnsupportedAttrib 0xb5 +#define ZApsNotSupported 0xb6 +#define ZApsNoAck 0xb7 +#define ZApsDuplicateEntry 0xb8 +#define ZApsNoBoundDevice 0xb9 +#define ZApsNotAllowed 0xba +#define ZApsNotAuthenticated 0xbb + + // Security status values +#define ZSecNoKey 0xa1 +#define ZSecOldFrmCount 0xa2 +#define ZSecMaxFrmCount 0xa3 +#define ZSecCcmFail 0xa4 + + // NWK status values +#define ZNwkInvalidParam 0xc1 +#define ZNwkInvalidRequest 0xc2 +#define ZNwkNotPermitted 0xc3 +#define ZNwkStartupFailure 0xc4 +#define ZNwkAlreadyPresent 0xc5 +#define ZNwkSyncFailure 0xc6 +#define ZNwkTableFull 0xc7 +#define ZNwkUnknownDevice 0xc8 +#define ZNwkUnsupportedAttribute 0xc9 +#define ZNwkNoNetworks 0xca +#define ZNwkLeaveUnconfirmed 0xcb +#define ZNwkNoAck 0xcc // not in spec +#define ZNwkNoRoute 0xcd + + // MAC status values +#define ZMacSuccess 0x00 +#define ZMacBeaconLoss 0xe0 +#define ZMacChannelAccessFailure 0xe1 +#define ZMacDenied 0xe2 +#define ZMacDisableTrxFailure 0xe3 +#define ZMacFailedSecurityCheck 0xe4 +#define ZMacFrameTooLong 0xe5 +#define ZMacInvalidGTS 0xe6 +#define ZMacInvalidHandle 0xe7 +#define ZMacInvalidParameter 0xe8 +#define ZMacNoACK 0xe9 +#define ZMacNoBeacon 0xea +#define ZMacNoData 0xeb +#define ZMacNoShortAddr 0xec +#define ZMacOutOfCap 0xed +#define ZMacPANIDConflict 0xee +#define ZMacRealignment 0xef +#define ZMacTransactionExpired 0xf0 +#define ZMacTransactionOverFlow 0xf1 +#define ZMacTxActive 0xf2 +#define ZMacUnAvailableKey 0xf3 +#define ZMacUnsupportedAttribute 0xf4 +#define ZMacUnsupported 0xf5 +#define ZMacSrcMatchInvalidIndex 0xff + +typedef Status_t ZStatus_t; + +typedef struct +{ + uint8 txCounter; // Counter of transmission success/failures + uint8 txCost; // Average of sending rssi values if link staus is enabled + // i.e. NWK_LINK_STATUS_PERIOD is defined as non zero + uint8 rxLqi; // average of received rssi values + // needs to be converted to link cost (1-7) before used + uint8 inKeySeqNum; // security key sequence number + uint32 inFrmCntr; // security frame counter.. + uint16 txFailure; // higher values indicate more failures +} linkInfo_t; + +/********************************************************************* + * Global System Messages + */ + +#define SPI_INCOMING_ZTOOL_PORT 0x21 // Raw data from ZTool Port (not implemented) +#define SPI_INCOMING_ZAPP_DATA 0x22 // Raw data from the ZAPP port (see serialApp.c) +#define MT_SYS_APP_MSG 0x23 // Raw data from an MT Sys message +#define MT_SYS_APP_RSP_MSG 0x24 // Raw data output for an MT Sys message +#define MT_SYS_OTA_MSG 0x25 // Raw data output for an MT OTA Rsp + +#define AF_DATA_CONFIRM_CMD 0xFD // Data confirmation +#define AF_REFLECT_ERROR_CMD 0xFE // Reflected message error message +#define AF_INCOMING_MSG_CMD 0x1A // Incoming MSG type message +#define AF_INCOMING_KVP_CMD 0x1B // Incoming KVP type message +#define AF_INCOMING_GRP_KVP_CMD 0x1C // Incoming Group KVP type message + +//#define KEY_CHANGE 0xC0 // Key Events + +#define ZDO_NEW_DSTADDR 0xD0 // ZDO has received a new DstAddr for this app +#define ZDO_STATE_CHANGE 0xD1 // ZDO has changed the device's network state +#define ZDO_MATCH_DESC_RSP_SENT 0xD2 // ZDO match descriptor response was sent +#define ZDO_CB_MSG 0xD3 // ZDO incoming message callback +#define ZDO_NETWORK_REPORT 0xD4 // ZDO received a Network Report message +#define ZDO_NETWORK_UPDATE 0xD5 // ZDO received a Network Update message +#define ZDO_ADDR_CHANGE_IND 0xD6 // ZDO was informed of device address change + +#define NM_CHANNEL_INTERFERE 0x31 // NwkMgr received a Channel Interference message +#define NM_ED_SCAN_CONFIRM 0x32 // NwkMgr received an ED Scan Confirm message +#define SAPS_CHANNEL_CHANGE 0x33 // Stub APS has changed the device's channel +#define ZCL_INCOMING_MSG 0x34 // Incoming ZCL foundation message +#define ZCL_KEY_ESTABLISH_IND 0x35 // ZCL Key Establishment Completion Indication +#define ZCL_OTA_CALLBACK_IND 0x36 // ZCL OTA Completion Indication + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ZCOMDEF_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/comdef.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/comdef.h new file mode 100644 index 0000000..2337966 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/comdef.h @@ -0,0 +1,153 @@ +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef COMDEF_H +#define COMDEF_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#include "hal_types.h" +#include "hal_defs.h" + +/********************************************************************* + * Lint Keywords + */ +#define VOID (void) + +#define NULL_OK +#define INP +#define OUTP +#define UNUSED +#define ONLY +#define READONLY +#define SHARED +#define KEEP +#define RELAX + +/********************************************************************* + * CONSTANTS + */ + +#ifndef false + #define false 0 +#endif + +#ifndef true + #define true 1 +#endif + +#ifndef CONST + #define CONST const +#endif + +#ifndef GENERIC + #define GENERIC +#endif + +/*** Generic Status Return Values ***/ +#define SUCCESS 0x00 +#define FAILURE 0x01 +#define INVALIDPARAMETER 0x02 +#define INVALID_TASK 0x03 +#define MSG_BUFFER_NOT_AVAIL 0x04 +#define INVALID_MSG_POINTER 0x05 +#define INVALID_EVENT_ID 0x06 +#define INVALID_INTERRUPT_ID 0x07 +#define NO_TIMER_AVAIL 0x08 +#define NV_ITEM_UNINIT 0x09 +#define NV_OPER_FAILED 0x0A +#define INVALID_MEM_SIZE 0x0B +#define NV_BAD_ITEM_LEN 0x0C +#define INVALID_DATA_FRAME 0x0D + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + +#define SYS_EVENT_MSG 0x8000 // A message is waiting event + +/********************************************************************* + * Global Generic System Messages + */ + +#define KEY_CHANGE 0xC0 // Key Events + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* COMDEF_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_bufmgr.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_bufmgr.h new file mode 100644 index 0000000..fc6331e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_bufmgr.h @@ -0,0 +1,107 @@ +/************************************************************************************************** + Filename: osal_bufmgr.h + Revised: $Date: 2009-01-14 14:59:55 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18763 $ + + Description: This file contains the buffer management definitions. + + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_BUFMGR_H +#define OSAL_BUFMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * VARIABLES + */ + + +/********************************************************************* + * MACROS + */ + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Allocate a block of memory. + */ +extern void *osal_bm_alloc( uint16 size ); + +/* + * Add or remove header space for the payload pointer. + */ +extern void *osal_bm_adjust_header( void *payload_ptr, int16 size ); + +/* + * Add or remove tail space for the payload pointer. + */ +extern void *osal_bm_adjust_tail( void *payload_ptr, int16 size ); + +/* + * Free a block of memory. + */ +extern void osal_bm_free( void *payload_ptr ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_BUFMGR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_cbtimer.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_cbtimer.h new file mode 100644 index 0000000..73bf724 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_cbtimer.h @@ -0,0 +1,130 @@ +/************************************************************************************************** + Filename: osal_cbtimer.h + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the Callback Timer definitions. + + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_CBTIMER_H +#define OSAL_CBTIMER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ +// Invalid timer id +#define INVALID_TIMER_ID 0xFF + +// Timed out timer +#define TIMEOUT_TIMER_ID 0xFE + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ +#if ( OSAL_CBTIMER_NUM_TASKS == 0 ) + #error Callback Timer module shouldn't be included (no callback timer is needed)! +#elif ( OSAL_CBTIMER_NUM_TASKS == 1 ) + #define OSAL_CBTIMER_PROCESS_EVENT( a ) ( a ) +#elif ( OSAL_CBTIMER_NUM_TASKS == 2 ) + #define OSAL_CBTIMER_PROCESS_EVENT( a ) ( a ), ( a ) +#else + #error Maximum of 2 callback timer tasks are supported! Modify it here. +#endif + +/********************************************************************* + * TYPEDEFS + */ + +// Callback Timer function prototype. Callback function will be called +// when the associated timer expires. +// +// pData - pointer to data registered with timer +// +typedef void (*pfnCbTimer_t)( uint8 *pData ); + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Callback Timer task initialization function. + */ +extern void osal_CbTimerInit( uint8 taskId ); + +/* + * Callback Timer task event processing function. + */ +extern uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ); + +/* + * Function to start a timer to expire in n mSecs. + */ +extern Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ); + +/* + * Function to update a timer that has already been started. + */ +extern Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ); + +/* + * Function to stop a timer that has already been started. + */ +extern Status_t osal_CbTimerStop( uint8 timerId ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_CBTIMER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_snv.h b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_snv.h new file mode 100644 index 0000000..39082c5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/include/osal_snv.h @@ -0,0 +1,137 @@ +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef OSAL_SNV_H +#define OSAL_SNV_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ +#ifdef OSAL_SNV_UINT16_ID + typedef uint16 osalSnvId_t; + typedef uint16 osalSnvLen_t; +#else + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; +#endif + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +extern uint8 osal_snv_compact( uint8 threshold ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OSAL_SNV.H */ diff --git a/Firmware/Radio/Projects/Wimu/Components/osal/mcu/cc2540/osal_snv.c b/Firmware/Radio/Projects/Wimu/Components/osal/mcu/cc2540/osal_snv.c new file mode 100644 index 0000000..c88b88e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/osal/mcu/cc2540/osal_snv.c @@ -0,0 +1,868 @@ +/************************************************************************************************** + Filename: osal_snv.c + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module contains the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "hal_adc.h" +#include "hal_flash.h" +#include "hal_types.h" +#include "comdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "hal_assert.h" +#include "saddr.h" + +#ifdef OSAL_SNV_UINT16_ID +# error "This OSAL SNV implementation does not support the extended ID space" +#endif + +/********************************************************************* + * CONSTANTS + */ + +// NV page configuration +#define OSAL_NV_PAGE_SIZE HAL_FLASH_PAGE_SIZE +#define OSAL_NV_PAGES_USED HAL_NV_PAGE_CNT +#define OSAL_NV_PAGE_BEG HAL_NV_PAGE_BEG +#define OSAL_NV_PAGE_END (OSAL_NV_PAGE_BEG + OSAL_NV_PAGES_USED - 1) + +// Default byte value when flash is erased +#define OSAL_NV_ERASED 0xFF + +// NV page header size in bytes +#define OSAL_NV_PAGE_HDR_SIZE 4 + +// In case pages 0-1 are ever used, define a null page value. +#define OSAL_NV_PAGE_NULL 0 + +// In case item Id 0 is ever used, define a null item value. +#define OSAL_NV_ITEM_NULL 0 + +// Length in bytes of a flash word +#define OSAL_NV_WORD_SIZE HAL_FLASH_WORD_SIZE + +// NV page header offset within a page +#define OSAL_NV_PAGE_HDR_OFFSET 0 + + +// Flag in a length field of an item header to indicate validity +// of the length field +#define OSAL_NV_INVALID_LEN_MARK 0x8000 + +// Flag in an ID field of an item header to indicate validity of +// the identifier field +#define OSAL_NV_INVALID_ID_MARK 0x8000 + + +// Bit difference between active page state indicator value and +// transfer page state indicator value +#define OSAL_NV_ACTIVE_XFER_DIFF 0x00100000 + +// active page state indicator value +#define OSAL_NV_ACTIVE_PAGE_STATE OSAL_NV_ACTIVE_XFER_DIFF + +// transfer page state indicator value +#define OSAL_NV_XFER_PAGE_STATE (OSAL_NV_ACTIVE_PAGE_STATE ^ OSAL_NV_ACTIVE_XFER_DIFF) + +#define OSAL_NV_MIN_COMPACT_THRESHOLD 70 // Minimum compaction threshold +#define OSAL_NV_MAX_COMPACT_THRESHOLD 95 // Maximum compaction threshold + +/********************************************************************* + * MACROS + */ + +// Macro to check supply voltage +#if (defined HAL_MCU_CC2530 || defined HAL_MCU_CC2531) +# define OSAL_NV_CHECK_BUS_VOLTAGE (HalAdcCheckVdd(VDD_MIN_FLASH)) +#elif defined HAL_MCU_CC2533 +# define OSAL_NV_CHECK_BUS_VOLTAGE (HalBatMonRead( HAL_BATMON_MIN_FLASH )) +#else +// The radio chip does not support voltage monitoring +# define OSAL_NV_CHECK_BUS_VOLTAGE TRUE +#endif + +/********************************************************************* + * TYPEDEFS + */ + +// NV item header structure +typedef struct +{ + uint16 id; + uint16 len; +} osalNvItemHdr_t; +// Note that osalSnvId_t and osalSnvLen_t cannot be bigger than uint16 + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +extern bool HalAdcCheckVdd(uint8 limit); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +#ifndef OAD_KEEP_NV_PAGES +// When NV pages are to remain intact during OAD download, +// the image itself should not include NV pages. +#pragma location="BLENV_ADDRESS_SPACE" +__no_init uint8 _nvBuf[OSAL_NV_PAGES_USED * OSAL_NV_PAGE_SIZE]; +#pragma required=_nvBuf +#endif // OAD_KEEP_NV_PAGES + +#if defined MAKE_CRC_SHDW +#pragma location="CRC_SHDW" +const CODE uint16 _crcShdw = 0xFFFF; +#pragma required=_crcShdw +#endif + +/********************************************************************* + * LOCAL VARIABLES + */ + +// active page +static uint8 activePg; + +// active page offset +static uint16 pgOff; + +// flag to indicate that an error has occurred while writing to or erasing the +// flash device. Once this flag indicates failure, it is unsafe to attempt +// another write or erase. +static uint8 failF; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 initNV( void ); + +static void setActivePage( uint8 pg ); +static void setXferPage(void); +static void erasePage( uint8 pg ); +static void cleanErasedPage( uint8 pg ); +static void findOffset( void ); +static void compactPage( uint8 pg ); + +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ); +static void writeWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ); + + +// NOTE: Triggering erase upon power up may cause fast aging of the flash device +// if there is power switch debounce issue, etc. +// Improvement of this is to add a certain delay upon power up before +// osal_nv_init() is called. + +/********************************************************************* + * @fn initNV + * + * @brief Initialize the NV flash pages. + * + * @param none + * + * @return TRUE if initialization succeeds. FALSE, otherwise. + */ +static uint8 initNV( void ) +{ + uint32 pgHdr; + uint8 xferPg = OSAL_NV_PAGE_NULL; + uint8 pg; + + failF = FALSE; + activePg = OSAL_NV_PAGE_NULL; + + // Pick active page and clean up erased page if necessary + for ( pg = OSAL_NV_PAGE_BEG; pg <= OSAL_NV_PAGE_END; pg++ ) + { + HalFlashRead(pg, OSAL_NV_PAGE_HDR_OFFSET, (uint8 *)(&pgHdr), OSAL_NV_PAGE_HDR_SIZE); + + if ( pgHdr == OSAL_NV_ACTIVE_PAGE_STATE) + { + if (activePg != OSAL_NV_PAGE_NULL) + { + // Both pages are active only when power failed during flash erase and + // with very low probability. + // As it is hard (code size intensive) to figure out which page is the real active page, + // and theoretically impossible as well in lowest probability, erase both pages + // in this case + cleanErasedPage(activePg); + cleanErasedPage(pg); + activePg = OSAL_NV_PAGE_NULL; + } + else + { + activePg = pg; + } + } + else if ( pgHdr == OSAL_NV_XFER_PAGE_STATE) + { + xferPg = pg; + } + else + { + // Erase this page if it is not erased. + // This is to ensure that any page that were in the middle of + // compacting gets erased. + cleanErasedPage(pg); + } + } + + if (activePg == OSAL_NV_PAGE_NULL) + { + if (xferPg == OSAL_NV_PAGE_NULL) + { + // Both pages are erased. This must be initial state. + // Pick one page as active page. + setActivePage(OSAL_NV_PAGE_BEG); + pgOff = OSAL_NV_PAGE_HDR_SIZE; + + // If setting active page from a completely erased page failed, + // it is not recommended to operate any further. + // Other cases, even if non-active page is corrupt, NV module can still read + // the active page content and hence this function could return TRUE. + return (!failF); + } + else + { + // Compacting a page hasn't completed in previous power cycle. + // Complete the compacting. + activePg = xferPg; + findOffset(); + + compactPage(xferPg); + } + } + else + { + if (xferPg != OSAL_NV_PAGE_NULL) + { + // Compacting has completed except for the final step of erasing + // the xferPage. + erasePage(xferPg); + } + + // find the active page offset to write a new variable location item + findOffset(); + } + + return TRUE; +} + +/********************************************************************* + * @fn setActivePage + * + * @brief Set page header active state to be active. + * + * @param pg - Valid NV page to activate. + * + * @return none + */ +static void setActivePage( uint8 pg ) +{ + uint32 pgHdr; + + pgHdr = OSAL_NV_ACTIVE_PAGE_STATE; + + writeWord( pg, OSAL_NV_PAGE_HDR_OFFSET, (uint8*) &pgHdr ); + if (!failF) + { + activePg = pg; + } +} + +/********************************************************************* + * @fn setXferPage + * + * @brief Set active page header state to be transfer state. + * + * @param none + * + * @return none + */ +static void setXferPage(void) +{ + uint32 pgHdr; + + // erase difference bit between active state and xfer state + pgHdr = OSAL_NV_XFER_PAGE_STATE; + + writeWord( activePg, OSAL_NV_PAGE_HDR_OFFSET, (uint8*)&pgHdr ); +} + +/********************************************************************* + * @fn erasePage + * + * @brief Erases a page in Flash. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void erasePage( uint8 pg ) +{ + if ( !OSAL_NV_CHECK_BUS_VOLTAGE || failF) + { + failF = TRUE; + return; + } + + HalFlashErase(pg); + + { + // Verify the erase operation + uint16 offset; + uint8 tmp; + + for (offset = 0; offset < OSAL_NV_PAGE_SIZE; offset ++) + { + HalFlashRead(pg, offset, &tmp, 1); + if (tmp != OSAL_NV_ERASED) + { + failF = TRUE; + break; + } + } + } +} + +/********************************************************************* + * @fn cleanErasedPage + * + * @brief Erases a page in Flash if the page is not completely erased. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void cleanErasedPage( uint8 pg ) +{ + uint8 buf; + uint16 offset; + + for (offset = 0; offset < OSAL_NV_PAGE_SIZE; offset ++) + { + HalFlashRead(pg, offset, &buf, 1); + if (buf != OSAL_NV_ERASED) + { + erasePage(pg); + break; + } + } +} + +/********************************************************************* + * @fn findOffset + * + * @brief find an offset of an empty space in active page + * where to write a new item to. + * + * @param None + * + * @return none + */ +static void findOffset(void) +{ + uint16 offset; + for (offset = OSAL_NV_PAGE_SIZE - OSAL_NV_WORD_SIZE; + offset >= OSAL_NV_PAGE_HDR_SIZE; + offset -= OSAL_NV_WORD_SIZE) + { + uint32 tmp; + + HalFlashRead(activePg, offset, (uint8 *)&tmp, OSAL_NV_WORD_SIZE); + if (tmp != 0xFFFFFFFF) + { + break; + } + } + pgOff = offset + OSAL_NV_WORD_SIZE; +} + +/********************************************************************* + * @fn findItem + * + * @brief find a valid item from a designated page and offset + * + * @param pg - NV page + * @param offset - offset in the NV page from where to start + * search up. + * Usually this paramter is set to the empty space + * offset. + * @param id - NV item ID to search for + * + * @return offset of the item, 0 when not found + */ +static uint16 findItem(uint8 pg, uint16 offset, osalSnvId_t id) +{ + offset -= OSAL_NV_WORD_SIZE; + + while (offset >= OSAL_NV_PAGE_HDR_SIZE) + { + osalNvItemHdr_t hdr; + + HalFlashRead(pg, offset, (uint8 *) &hdr, OSAL_NV_WORD_SIZE); + + if (hdr.id == id) + { + // item found + // length field could be corrupt. Mask invalid length mark. + uint8 len = hdr.len & ~OSAL_NV_INVALID_LEN_MARK; + return offset - len; + } + else if (hdr.len & OSAL_NV_INVALID_LEN_MARK) + { + offset -= OSAL_NV_WORD_SIZE; + } + else + { + // valid length field + if (hdr.len + OSAL_NV_WORD_SIZE <= offset) + { + // valid length + offset -= hdr.len + OSAL_NV_WORD_SIZE; + } + else + { + // active page is corrupt + // This could happen if NV initialization failed upon failure to erase + // page and active page is set to uncleanly erased page. + HAL_ASSERT_FORCED(); + return 0; + } + } + } + return 0; +} + +/********************************************************************* + * @fn writeItem + * + * @brief Write a data item to NV. Function can write an entire item to NV + * + * @param pg - Page number + * @param offset - offset within the NV page where to write the new item + * @param id - NV item ID + * @param alignedLen - Length of data to write, alinged in flash word + * boundary + * @param *pBuf - Data to write. + * + * @return none + */ +static void writeItem( uint8 pg, uint16 offset, osalSnvId_t id, uint16 alignedLen, uint8 *pBuf ) +{ + osalNvItemHdr_t hdr; + + hdr.id = 0xFFFF; + hdr.len = alignedLen | OSAL_NV_INVALID_LEN_MARK; + + // Write the len portion of the header first + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // remove invalid len mark + hdr.len &= ~OSAL_NV_INVALID_LEN_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // Copy over the data + writeWordM(pg, offset, pBuf, alignedLen / OSAL_NV_WORD_SIZE); + + // value is valid. Write header except for the most significant bit. + hdr.id = id | OSAL_NV_INVALID_ID_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // write the most significant bit + hdr.id &= ~OSAL_NV_INVALID_ID_MARK; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); +} + +/********************************************************************* + * @fn xferItem + * + * @brief Copy an NV item from the active page to a designated page. + * + * @param pg - NV page where to copy the item to. + * @param offset - NV page offset where to copy the item to. + * @param alignedLen - Length of data to write, aligned in flash word + * boundary. + * @param srcOff - NV page offset of the original data in active page + * + * @return none. + */ +static void xferItem( uint8 pg, uint16 offset, uint16 alignedLen, uint16 srcOff ) +{ + uint8 tmp[OSAL_NV_WORD_SIZE]; + uint16 i = 0; + + // Copy over the data + while (i <= alignedLen) + { + HalFlashRead(activePg, srcOff + i, tmp, OSAL_NV_WORD_SIZE); + writeWord(pg, offset + i, tmp); + + i += OSAL_NV_WORD_SIZE; + } +} + +/********************************************************************* + * @fn compactPage + * + * @brief Compacts the page specified. + * + * @param srcPg - Valid NV page to compact from. + * The page must have changed its state (header) to xfer state + * prior to this function call. This function will not + * modify the state of its header to xfer state before starting + * to compact. + * + * @return none. + */ +static void compactPage( uint8 srcPg ) +{ + uint16 srcOff, dstOff; + uint8 dstPg; + osalSnvId_t lastId = (osalSnvId_t) 0xFFFF; + + dstPg = (srcPg == OSAL_NV_PAGE_BEG)? OSAL_NV_PAGE_END : OSAL_NV_PAGE_BEG; + + dstOff = OSAL_NV_PAGE_HDR_SIZE; + + // Read from the latest value + srcOff = pgOff - sizeof(osalNvItemHdr_t); + + while (srcOff >= OSAL_NV_PAGE_HDR_SIZE) + { + osalNvItemHdr_t hdr; + + if (failF) + { + // Failure during transfer item will make next findItem error prone. + return; + } + + HalFlashRead(srcPg, srcOff, (uint8 *) &hdr, OSAL_NV_WORD_SIZE); + + if (hdr.id == 0xFFFF) + { + // Invalid entry. Skip this one. + if (hdr.len & OSAL_NV_INVALID_LEN_MARK) + { + srcOff -= OSAL_NV_WORD_SIZE; + } + else + { + if (hdr.len + OSAL_NV_WORD_SIZE <= srcOff) + { + srcOff -= hdr.len + OSAL_NV_WORD_SIZE; + } + else + { + // invalid length. Source page must be a corrupt page. + // This is possible only if the NV initialization failed upon erasing + // what is selected as active page. + // This is supposed to be a very rare case, as power should be + // shutdown exactly during erase and then the page header is + // still retained as either the Xfer or the Active state. + + // For production code, it might be useful to attempt to erase the page + // so that at next power cycle at least the device is runnable + // (with all entries removed). + // However, it might be still better not to attempt erasing the page + // just to see if this very rare case actually happened. + //erasePage(srcPg); + + HAL_ASSERT_FORCED(); + return; + } + } + + continue; + } + + // Consider only valid item + if (!(hdr.id & OSAL_NV_INVALID_ID_MARK) && hdr.id != lastId) + { + // lastId is used to speed up compacting in case the same item ID + // items were neighboring each other contiguously. + lastId = (osalSnvId_t) hdr.id; + + // Check if the latest value of the item was already written + if (findItem(dstPg, dstOff, lastId) == 0) + { + // This item was not copied over yet. + // This must be the latest value. + // Write the latest value to the destination page + + xferItem(dstPg, dstOff, hdr.len, srcOff - hdr.len); + + dstOff += hdr.len + OSAL_NV_WORD_SIZE; + } + } + srcOff -= hdr.len + OSAL_NV_WORD_SIZE; + } + + // All items copied. + // Activate the new page + setActivePage(dstPg); + + if (!failF) + { + pgOff = dstOff; // update active page offset + } + + // Erase the currently active page + erasePage(srcPg); +} + +/********************************************************************* + * @fn verifyWordM + * + * @brief verify the written word. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to verify. + * + * @return none + */ +static void verifyWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ) +{ + uint8 tmp[OSAL_NV_WORD_SIZE]; + + while (cnt--) + { + // Reading byte per byte will reduce code size but will slow down + // and not sure it will meet the timing requirements. + HalFlashRead(pg, offset, tmp, OSAL_NV_WORD_SIZE); + if (FALSE == osal_memcmp(tmp, pBuf, OSAL_NV_WORD_SIZE)) + { + failF = TRUE; + return; + } + offset += OSAL_NV_WORD_SIZE; + pBuf += OSAL_NV_WORD_SIZE; + } +} + +/********************************************************************* + * @fn writeWord + * + * @brief Writes a Flash-WORD to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * + * @return none + */ +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, pBuf, 1); + verifyWordM(pg, offset, pBuf, 1); + } +} + +/********************************************************************* + * @fn writeWordM + * + * @brief Writes multiple Flash-WORDs to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param buf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to write. + * + * @return none + */ +static void writeWordM( uint8 pg, uint16 offset, uint8 *buf, osalSnvLen_t cnt ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, buf, cnt); + verifyWordM(pg, offset, buf, cnt); + } +} + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +uint8 osal_snv_init( void ) +{ + if (!initNV()) + { + // NV initialization failed + HAL_ASSERT_FORCED(); + + return FAILURE; + } + + return SUCCESS; +} + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 alignedLen; + + { + uint16 offset = findItem(activePg, pgOff, id); + + if (offset > 0) + { + uint8 tmp; + osalSnvLen_t i; + + for (i = 0; i < len; i++) + { + HalFlashRead(activePg, offset, &tmp, 1); + if (tmp != ((uint8 *)pBuf)[i]) + { + break; + } + offset++; + } + + if (i == len) + { + // Changed value is the same value as before. + // Return here instead of re-writing the same value to NV. + return SUCCESS; + } + } + } + + alignedLen = ((len + OSAL_NV_WORD_SIZE - 1) / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE; + + if ( pgOff + alignedLen + OSAL_NV_WORD_SIZE > OSAL_NV_PAGE_SIZE ) + { + setXferPage(); + compactPage(activePg); + } + + // pBuf shall be referenced beyond its valid length to save code size. + writeItem(activePg, pgOff, id, alignedLen, pBuf); + if (failF) + { + return NV_OPER_FAILED; + } + + pgOff += alignedLen + OSAL_NV_WORD_SIZE; + + return SUCCESS; +} + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 offset = findItem(activePg, pgOff, id); + + if (offset != 0) + { + HalFlashRead(activePg, offset, pBuf, len); + return SUCCESS; + } + return NV_OPER_FAILED; +} + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +uint8 osal_snv_compact( uint8 threshold ) +{ + if ( ( threshold < OSAL_NV_MIN_COMPACT_THRESHOLD ) || + ( threshold > OSAL_NV_MAX_COMPACT_THRESHOLD ) ) + { + return INVALIDPARAMETER; + } + + // See if NV active page usage has reached compaction threshold + if ( ( (uint32)pgOff * 100 ) >= ( OSAL_NV_PAGE_SIZE * (uint32)threshold ) ) + { + setXferPage(); + compactPage(activePg); + + return SUCCESS; + } + + return NV_OPER_FAILED; +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Components/services/saddr/saddr.h b/Firmware/Radio/Projects/Wimu/Components/services/saddr/saddr.h new file mode 100644 index 0000000..0b4f646 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Components/services/saddr/saddr.h @@ -0,0 +1,175 @@ +/************************************************************************************************** + Filename: saddr.h + Revised: $Date: 2009-12-10 08:32:15 -0800 (Thu, 10 Dec 2009) $ + Revision: $Revision: 21311 $ + + Description: Zigbee and 802.15.4 device address utility functions. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SADDR_H +#define SADDR_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************************************************************** + * MACROS + */ + +/* Extended address length */ +#define SADDR_EXT_LEN 8 + +/* Address modes */ +#define SADDR_MODE_NONE 0 /* Address not present */ +#define SADDR_MODE_SHORT 2 /* Short address */ +#define SADDR_MODE_EXT 3 /* Extended address */ + +/**************************************************************************** + * TYPEDEFS + */ + +/* Extended address */ +typedef uint8 sAddrExt_t[SADDR_EXT_LEN]; + +/* Combined short/extended device address */ +typedef struct +{ + union + { + uint16 shortAddr; /* Short address */ + sAddrExt_t extAddr; /* Extended address */ + } addr; + uint8 addrMode; /* Address mode */ +} sAddr_t; + +/**************************************************************************** + * @fn sAddrCmp + * + * @brief Compare two device addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrCmp(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrIden + * + * @brief Check if two device addresses are identical. + * + * This routine is virtually the same as sAddrCmp, which is used + * to determine if two different addresses are the same. However, + * this routine can be used to determine if an address is the + * same as a previously stored address. The key difference is in + * the former case, if the address mode is "none", then the + * assumption is that the two addresses can not be the same. But + * in the latter case, the address mode itself is being compared. + * So two addresses can be identical even if the address mode is + * "none", as long as the address mode of both addresses being + * compared is the "none". + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are identical, FALSE otherwise + */ +extern bool sAddrIden(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrCpy + * + * @brief Copy a device address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return None. + */ +extern void sAddrCpy(sAddr_t *pDest, const sAddr_t *pSrc); + +/**************************************************************************** + * @fn sAddrExtCmp + * + * @brief Compare two extended addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrExtCmp(const uint8 * pAddr1, const uint8 * pAddr2); + +/**************************************************************************** + * @fn sAddrExtCpy + * + * @brief Copy an extended address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return pDest + SADDR_EXT_LEN. + */ +void *sAddrExtCpy(uint8 * pDest, const uint8 * pSrc); + +#ifdef __cplusplus +} +#endif + +#endif /* SADDR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gapgattserver.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gapgattserver.h new file mode 100644 index 0000000..9928680 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gapgattserver.h @@ -0,0 +1,208 @@ +/************************************************************************************************** + Filename: gapgattserver.h + Revised: $Date: 2009-10-21 07:25:22 -0700 (Wed, 21 Oct 2009) $ + Revision: $Revision: 20946 $ + + Description: This file contains GAP GATT attribute definitions + and prototypes. + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GAPGATTSERVER_H +#define GAPGATTSERVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +#define GAP_DEVICE_NAME_LEN (20+1) + +// Privacy Flag States +#define GAP_PRIVACY_DISABLED 0x00 +#define GAP_PRIVACY_ENABLED 0x01 + +// GAP GATT Server Parameters +#define GGS_DEVICE_NAME_ATT 0 // RW uint8[GAP_DEVICE_NAME_LEN] +#define GGS_APPEARANCE_ATT 1 // RW uint16 +#define GGS_PERI_PRIVACY_FLAG_ATT 2 // RW uint8 +#define GGS_RECONNCT_ADDR_ATT 3 // RW uint8[B_ADDR_LEN] +#define GGS_PERI_CONN_PARAM_ATT 4 // RW sizeof(gapPeriConnectParams_t) +#define GGS_PERI_PRIVACY_FLAG_PROPS 5 // RW uint8 +#define GGS_W_PERMIT_DEVICE_NAME_ATT 6 // W uint8 +#define GGS_W_PERMIT_APPEARANCE_ATT 7 // W uint8 +#define GGS_W_PERMIT_PRIVACY_FLAG_ATT 8 // W uint8 + +// GAP Services bit fields +#define GAP_SERVICE 0x00000001 + +// Attribute ID used with application's callback when attribute value is changed OTA +#define GGS_DEVICE_NAME_ID 0 +#define GGS_APPEARANCE_ID 1 + +#if defined ( TESTMODES ) + // GGS TestModes + #define GGS_TESTMODE_OFF 0 // No Test mode + #define GGS_TESTMODE_W_PERMIT_DEVICE_NAME 1 // Make Device Name attribute writable + #define GGS_TESTMODE_W_PERMIT_APPEARANCE 2 // Make Appearance attribute writable + #define GGS_TESTMODE_W_PERMIT_PRIVACY_FLAG 3 // Make Peripheral Privacy Flag attribute writable with authentication +#endif // TESTMODES + +/********************************************************************* + * TYPEDEFS + */ +// Callback to notify when attribute value is changed over the air. +typedef void (*ggsAttrValueChange_t)( uint8 attrId ); + +// GAP GATT Server callback structure +typedef struct +{ + ggsAttrValueChange_t pfnAttrValueChange; // When attribute value is changed OTA +} ggsAppCBs_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8 param, uint8 len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8 param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32 services ); + +/** + * @brief Delete function for the GAP GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GGS_DelService( uint32 services ); + +/** + * @brief Registers the application callback function. + * + * Note: Callback registration is needed only when the + * Device Name is made writable. The application + * will be notified when the Device Name is changed + * over the air. + * + * @param appCallbacks - pointer to application callbacks. + * + * @return none + */ +extern void GGS_RegisterAppCBs( ggsAppCBs_t *appCallbacks ); + +/** + * @brief Set a GGS Parameter value. Use this function to change + * the default GGS parameter values. + * + * @param value - new GGS param value + * + * @return void + */ +extern void GGS_SetParamValue( uint16 value ); + +/** + * @brief Get a GGS Parameter value. + * + * @param none + * + * @return GGS Parameter value + */ +extern uint16 GGS_GetParamValue( void ); + +/********************************************************************* + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPGATTSERVER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gattservapp.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gattservapp.h new file mode 100644 index 0000000..5b6d6fd --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Include/gattservapp.h @@ -0,0 +1,690 @@ +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GATTSERVAPP_H +#define GATTSERVAPP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + +#define GATT_CLIENT_CHAR_CFG_UPDATED_EVENT 0x00 //!< Sent when a Client Characteristic Configuration is updated. This event is sent as an OSAL message defined as gattCharCfgUpdatedEvent_t. + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#define GATT_PROP_BCAST 0x01 //!< Permits broadcasts of the Characteristic Value +#define GATT_PROP_READ 0x02 //!< Permits reads of the Characteristic Value +#define GATT_PROP_WRITE_NO_RSP 0x04 //!< Permits writes of the Characteristic Value without response +#define GATT_PROP_WRITE 0x08 //!< Permits writes of the Characteristic Value with response +#define GATT_PROP_NOTIFY 0x10 //!< Permits notifications of a Characteristic Value without acknowledgement +#define GATT_PROP_INDICATE 0x20 //!< Permits indications of a Characteristic Value with acknowledgement +#define GATT_PROP_AUTHEN 0x40 //!< Permits signed writes to the Characteristic Value +#define GATT_PROP_EXTENDED 0x80 //!< Additional characteristic properties are defined in the Characteristic Extended Properties Descriptor + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + +#define GATT_EXT_PROP_RELIABLE_WRITE 0x0001 //!< Permits reliable writes of the Characteristic Value +#define GATT_EXT_PROP_WRITABLE_AUX 0x0002 //!< Permits writes to the characteristic descriptor + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + +#define GATT_CLIENT_CFG_NOTIFY 0x0001 //!< The Characteristic Value shall be notified +#define GATT_CLIENT_CFG_INDICATE 0x0002 //!< The Characteristic Value shall be indicated + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + +#define GATT_SERV_CFG_BCAST 0x0001 //!< The Characteristic Value shall be broadcast when the server is in the broadcast procedure if advertising data resources are available + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + +#define GATT_CFG_NO_OPERATION 0x0000 // No operation + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#define GATT_FORMAT_BOOL 0x01 //!< Unsigned 1 bit; 0 = false, 1 = true +#define GATT_FORMAT_2BIT 0x02 //!< Unsigned 2 bit integer +#define GATT_FORMAT_NIBBLE 0x03 //!< Unsigned 4 bit integer +#define GATT_FORMAT_UINT8 0x04 //!< Unsigned 8 bit integer +#define GATT_FORMAT_UINT12 0x05 //!< Unsigned 12 bit integer +#define GATT_FORMAT_UINT16 0x06 //!< Unsigned 16 bit integer +#define GATT_FORMAT_UINT24 0x07 //!< Unsigned 24 bit integer +#define GATT_FORMAT_UINT32 0x08 //!< Unsigned 32 bit integer +#define GATT_FORMAT_UINT48 0x09 //!< Unsigned 48 bit integer +#define GATT_FORMAT_UINT64 0x0a //!< Unsigned 64 bit integer +#define GATT_FORMAT_UINT128 0x0b //!< Unsigned 128 bit integer +#define GATT_FORMAT_SINT8 0x0c //!< Signed 8 bit integer +#define GATT_FORMAT_SINT12 0x0d //!< Signed 12 bit integer +#define GATT_FORMAT_SINT16 0x0e //!< Signed 16 bit integer +#define GATT_FORMAT_SINT24 0x0f //!< Signed 24 bit integer +#define GATT_FORMAT_SINT32 0x10 //!< Signed 32 bit integer +#define GATT_FORMAT_SINT48 0x11 //!< Signed 48 bit integer +#define GATT_FORMAT_SINT64 0x12 //!< Signed 64 bit integer +#define GATT_FORMAT_SINT128 0x13 //!< Signed 128 bit integer +#define GATT_FORMAT_FLOAT32 0x14 //!< IEEE-754 32 bit floating point +#define GATT_FORMAT_FLOAT64 0x15 //!< IEEE-754 64 bit floating point +#define GATT_FORMAT_SFLOAT 0x16 //!< IEEE-11073 16 bit SFLOAT +#define GATT_FORMAT_FLOAT 0x17 //!< IEEE-11073 32 bit FLOAT +#define GATT_FORMAT_DUINT16 0x18 //!< IEEE-20601 format +#define GATT_FORMAT_UTF8S 0x19 //!< UTF-8 string +#define GATT_FORMAT_UTF16S 0x1a //!< UTF-16 string +#define GATT_FORMAT_STRUCT 0x1b //!< Opaque structure + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + +#define GATT_NS_NONE 0x00 //!< No namespace +#define GATT_NS_BT_SIG 0x01 //!< Bluetooth SIG namespace + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + +#define GATT_NS_BT_DESC_UNKNOWN 0x0000 //!< The description is unknown + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields +#define GATT_ALL_SERVICES 0xFFFFFFFF + +// GATT Services bit fields +#define GATT_SERVICE 0x00000001 + +#if defined ( TESTMODES ) + // GATT Test Modes + #define GATT_TESTMODE_OFF 0 // Test mode off + #define GATT_TESTMODE_NO_RSP 1 // Ignore incoming request + #define GATT_TESTMODE_PREPARE_WRITE 2 // Forward Prepare Write Request right away + #define GATT_TESTMODE_MAX_MTU_SIZE 3 // Use Max ATT MTU size with Exchange MTU Rsp + #define GATT_TESTMODE_CORRUPT_PW_DATA 4 // Corrupt incoming Prepare Write Request data +#endif + +// GATT Server Parameters +#define GATT_PARAM_NUM_PREPARE_WRITES 0 // RW uint8 + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table +#define GATT_NUM_ATTRS( attrs ) ( sizeof( attrs ) / sizeof( gattAttribute_t ) ) + +// The handle of a service is the handle of the first attribute +#define GATT_SERVICE_HANDLE( attrs ) ( (attrs)[0].handle ) + +// The handle of the first included service (i = 1) is the value of the second attribute +#define GATT_INCLUDED_HANDLE( attrs, i ) ( *((uint16 *)((attrs)[(i)].pValue)) ) + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + CONST gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GATTSERVAPP_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE.lib new file mode 100644 index 0000000..68fdb87 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib new file mode 100644 index 0000000..77cf135 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib new file mode 100644 index 0000000..4f98b6c Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_cent.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib new file mode 100644 index 0000000..6e0fa2d Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_bcast_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib new file mode 100644 index 0000000..16b72ea Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_cent.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib new file mode 100644 index 0000000..c18f449 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib new file mode 100644 index 0000000..590db62 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib new file mode 100644 index 0000000..ea8f9e6 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2540DB/bin/CC2540_BLE_peri_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE.lib new file mode 100644 index 0000000..dbd7c5b Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib new file mode 100644 index 0000000..fadeed3 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib new file mode 100644 index 0000000..0558491 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_cent.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib new file mode 100644 index 0000000..b3b0200 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_bcast_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib new file mode 100644 index 0000000..6c1abe3 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_cent.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib new file mode 100644 index 0000000..dfbb1de Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib new file mode 100644 index 0000000..37a7c4c Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib new file mode 100644 index 0000000..f753183 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/CC2541DB/bin/CC2541_BLE_peri_observ.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib new file mode 100644 index 0000000..9abd825 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_Full.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib new file mode 100644 index 0000000..30dbded Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_None.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib new file mode 100644 index 0000000..21ded89 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/Libraries/Common/bin/CC254x_BLE_HCI_TL_PTM.lib differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.c new file mode 100644 index 0000000..29e39cf --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.c @@ -0,0 +1,728 @@ +/************************************************************************************************** + Filename: accelerometer.c + Revised: $Date: 2011-11-21 15:26:10 -0800 (Mon, 21 Nov 2011) $ + Revision: $Revision: 28439 $ + + Description: Accelerometer Profile + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "accelerometer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 19 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Accelerometer Service UUID +CONST uint8 accServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_SERVICE_UUID), HI_UINT16(ACCEL_SERVICE_UUID) +}; + +// Accelerometer Enabler UUID +CONST uint8 accEnablerUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_ENABLER_UUID), HI_UINT16(ACCEL_ENABLER_UUID) +}; + +// Accelerometer Range UUID +CONST uint8 rangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_RANGE_UUID), HI_UINT16(ACCEL_RANGE_UUID) +}; + +// Accelerometer X-Axis Data UUID +CONST uint8 xUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_X_UUID), HI_UINT16(ACCEL_X_UUID) +}; + +// Accelerometer Y-Axis Data UUID +CONST uint8 yUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_Y_UUID), HI_UINT16(ACCEL_Y_UUID) +}; + +// Accelerometer Z-Axis Data UUID +CONST uint8 zUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(ACCEL_Z_UUID), HI_UINT16(ACCEL_Z_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static accelCBs_t *accel_AppCBs = NULL; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// Accelerometer Service attribute +static CONST gattAttrType_t accelService = { ATT_BT_UUID_SIZE, accServUUID }; + + +// Enabler Characteristic Properties +static uint8 accelEnabledCharProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Enabler Characteristic Value +static uint8 accelEnabled = FALSE; + +// Enabler Characteristic user description +static uint8 accelEnabledUserDesc[14] = "Accel Enable\0"; + + +// Range Characteristic Properties +static uint8 accelRangeCharProps = GATT_PROP_READ; + +// Range Characteristic Value +static uint16 accelRange = ACCEL_RANGE_2G; + +// Range Characteristic user description +static uint8 accelRangeUserDesc[13] = "Accel Range\0"; + + +// Accel Coordinate Characteristic Properties +static uint8 accelXCharProps = GATT_PROP_NOTIFY; +static uint8 accelYCharProps = GATT_PROP_NOTIFY; +static uint8 accelZCharProps = GATT_PROP_NOTIFY; + +// Accel Coordinate Characteristics +static int8 accelXCoordinates = 0; +static int8 accelYCoordinates = 0; +static int8 accelZCoordinates = 0; + +// Client Characteristic configuration. Each client has its own instantiation +// of the Client Characteristic Configuration. Reads of the Client Characteristic +// Configuration only shows the configuration for that client and writes only +// affect the configuration of that client. + +// Accel Coordinate Characteristic Configs +static gattCharCfg_t accelXConfigCoordinates[GATT_MAX_NUM_CONN]; +static gattCharCfg_t accelYConfigCoordinates[GATT_MAX_NUM_CONN]; +static gattCharCfg_t accelZConfigCoordinates[GATT_MAX_NUM_CONN]; + +// Accel Coordinate Characteristic user descriptions +static uint8 accelXCharUserDesc[20] = "Accel X-Coordinate\0"; +static uint8 accelYCharUserDesc[20] = "Accel Y-Coordinate\0"; +static uint8 accelZCharUserDesc[20] = "Accel Z-Coordinate\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t accelAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Accelerometer Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&accelService /* pValue */ + }, + + // Accel Enabler Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelEnabledCharProps + }, + + // Accelerometer Enable Characteristic Value + { + { ATT_BT_UUID_SIZE, accEnablerUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accelEnabled + }, + + // Accelerometer Enable User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8*)&accelEnabledUserDesc + }, + + // Accel Range Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelRangeCharProps + }, + + // Accelerometer Range Char Value + { + { ATT_BT_UUID_SIZE, rangeUUID }, + GATT_PERMIT_READ, + 0, + (uint8*)&accelRange + }, + + // Accelerometer Range User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelRangeUserDesc + }, + + // X-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelXCharProps + }, + + // X-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, xUUID }, + 0, + 0, + (uint8 *)&accelXCoordinates + }, + + // X-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelXConfigCoordinates + }, + + // X-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelXCharUserDesc + }, + + // Y-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelYCharProps + }, + + // Y-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, yUUID }, + 0, + 0, + (uint8 *)&accelYCoordinates + }, + + // Y-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelYConfigCoordinates + }, + + // Y-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelYCharUserDesc + }, + + // Z-Coordinate Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelZCharProps + }, + + // Z-Coordinate Characteristic Value + { + { ATT_BT_UUID_SIZE, zUUID }, + 0, + 0, + (uint8 *)&accelZCoordinates + }, + + // Z-Coordinate Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelZConfigCoordinates + }, + + // Z-Coordinate Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelZCharUserDesc + }, + +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 accel_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t accel_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void accel_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Accelerometer Service Callbacks +CONST gattServiceCBs_t accelCBs = +{ + accel_ReadAttrCB, // Read callback function pointer + accel_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Accel_AddService + * + * @brief Initializes the Accelerometer service by + * registering GATT attributes with the GATT server. Only + * call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Accel_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelXConfigCoordinates ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelYConfigCoordinates ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelZConfigCoordinates ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( accel_HandleConnStatusCB ); + + if ( services & ACCEL_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( accelAttrTbl, + GATT_NUM_ATTRS( accelAttrTbl ), + &accelCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Accel_RegisterAppCBs + * + * @brief Does the profile initialization. Only call this function + * once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + accel_AppCBs = appCallbacks; + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + + +/********************************************************************* + * @fn Accel_SetParameter + * + * @brief Set an Accelerometer Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCEL_ENABLER: + if ( len == sizeof ( uint8 ) ) + { + accelEnabled = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_RANGE: + if ( (len == sizeof ( uint16 )) && ((*((uint8*)value)) <= ACCEL_RANGE_8G) ) + { + accelRange = *((uint16*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_X_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelXCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelXConfigCoordinates, (uint8 *)&accelXCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_Y_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelYCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelYConfigCoordinates, (uint8 *)&accelYCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCEL_Z_ATTR: + if ( len == sizeof ( int8 ) ) + { + accelZCoordinates = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelZConfigCoordinates, (uint8 *)&accelZCoordinates, + FALSE, accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Accel_GetParameter + * + * @brief Get an Accelerometer Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case ACCEL_ENABLER: + *((uint8*)value) = accelEnabled; + break; + + case ACCEL_RANGE: + *((uint16*)value) = accelRange; + break; + + case ACCEL_X_ATTR: + *((int8*)value) = accelXCoordinates; + break; + + case ACCEL_Y_ATTR: + *((int8*)value) = accelYCoordinates; + break; + + case ACCEL_Z_ATTR: + *((int8*)value) = accelZCoordinates; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn accel_ReadAttr + * + * @brief Read an attribute. + * + * @param pAttr - pointer to attribute + * @param pLen - length of data to be read + * @param pValue - pointer to data to be read + * @param signature - whether to include Authentication Signature + * + * @return Success or Failure + */ +static uint8 accel_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + case ACCEL_RANGE_UUID: + *pLen = 2; + pValue[0] = LO_UINT16( *((uint16 *)pAttr->pValue) ); + pValue[1] = HI_UINT16( *((uint16 *)pAttr->pValue) ); + break; + + case ACCEL_ENABLER_UUID: + case ACCEL_X_UUID: + case ACCEL_Y_UUID: + case ACCEL_Z_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + + return ( status ); +} + +/********************************************************************* + * @fn accel_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle – connection message was received on + * @param pReq - pointer to request + * + * @return Success or Failure + */ +static bStatus_t accel_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notify = 0xFF; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case ACCEL_ENABLER_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len > 1 ) + status = ATT_ERR_INVALID_VALUE_SIZE; + else if ( pValue[0] != FALSE && pValue[0] != TRUE ) + status = ATT_ERR_INVALID_VALUE; + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + notify = ACCEL_ENABLER; + } + + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If an attribute changed then callback function to notify application of change + if ( (notify != 0xFF) && accel_AppCBs && accel_AppCBs->pfnAccelEnabler ) + accel_AppCBs->pfnAccelEnabler(); + + return ( status ); +} + +/********************************************************************* + * @fn accel_HandleConnStatusCB + * + * @brief Accelerometer Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void accel_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, accelXConfigCoordinates ); + GATTServApp_InitCharCfg( connHandle, accelYConfigCoordinates ); + GATTServApp_InitCharCfg( connHandle, accelZConfigCoordinates ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.h new file mode 100644 index 0000000..71b71bd --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Accelerometer/accelerometer.h @@ -0,0 +1,153 @@ +/************************************************************************************************** + Filename: accelerometer.h + Revised: $Date: 2011-11-11 15:13:08 -0800 (Fri, 11 Nov 2011) $ + Revision: $Revision: 28319 $ + + Description: This file contains Accelerometer Profile header file. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ACCELEROMETER_H +#define ACCELEROMETER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define ACCEL_ENABLER 0 // RW uint8 - Profile Attribute value +#define ACCEL_X_ATTR 1 // RW int16 - Profile Attribute value +#define ACCEL_Y_ATTR 2 // RW int16 - Profile Attribute value +#define ACCEL_Z_ATTR 3 // RW int16 - Profile Attribute value +#define ACCEL_RANGE 4 // RW uint16 - Profile Attribute value + +// Profile UUIDs +#define ACCEL_ENABLER_UUID 0xFFA1 +#define ACCEL_RANGE_UUID 0xFFA2 +#define ACCEL_X_UUID 0xFFA3 +#define ACCEL_Y_UUID 0xFFA4 +#define ACCEL_Z_UUID 0xFFA5 + +// Accelerometer Service UUID +#define ACCEL_SERVICE_UUID 0xFFA0 + +// Profile Range Values +#define ACCEL_RANGE_2G 20 +#define ACCEL_RANGE_8G 80 + +// Accelerometer Profile Services bit fields +#define ACCEL_SERVICE 0x00000001 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ +// Callback when the device has been started. Callback event to +// the ask for a battery check. +typedef NULL_OK void (*accelEnabler_t)( void ); + +typedef struct +{ + accelEnabler_t pfnAccelEnabler; // Called when Enabler attribute changes +} accelCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Accel_AddService- Initializes the Accelerometer service by registering + * GATT attributes with the GATT server. Only call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Accel_AddService( uint32 services ); + +/* + * Accel_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ); + + +/* + * Accel_SetParameter - Set an Accelerometer Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Accel_GetParameter - Get an Accelerometer Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ACCELEROMETER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.c new file mode 100644 index 0000000..e90d96d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.c @@ -0,0 +1,709 @@ +/************************************************************************************************** + Filename: actimetryservice.c + + Description: Actimetry Service (based on Sensor Profile) + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "actimetryservice.h" +#include "wimu_util.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Actimetry Service UUID +CONST uint8 actimetryServUUID[WIMU_ACTIMETRY_UUID_SIZE] = +{ + WIMU_ACTIMETRY_UUID(ACTIMETRY_SERV_UUID), +}; + +// Actimetry Characteristic value Imu UUID +CONST uint8 actimetryImuUUID[WIMU_ACTIMETRY_UUID_SIZE] = +{ + WIMU_ACTIMETRY_UUID(ACTIMETRY_IMU_UUID), +}; + +// Actimetry Characteristic value Quaternion UUID +CONST uint8 actimetryQuaternionUUID[WIMU_ACTIMETRY_UUID_SIZE] = +{ + WIMU_ACTIMETRY_UUID(ACTIMETRY_QUATERNION_UUID), +}; + +// Actimetry Characteristic value Configuration UUID +CONST uint8 actimetryCfgUUID[WIMU_ACTIMETRY_UUID_SIZE] = +{ + WIMU_ACTIMETRY_UUID(ACTIMETRY_CONFIG_UUID), +}; + +// Actimetry Characteristic value Control UUID, used to start/stop recordings +CONST uint8 actimetryControlUUID[WIMU_ACTIMETRY_UUID_SIZE] = +{ + WIMU_ACTIMETRY_UUID(ACTIMETRY_CONTROL_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static actimetryCBs_t *Actimetry_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + + +// Actimetry Profile Service attribute +static CONST gattAttrType_t actimetryService = { WIMU_ACTIMETRY_UUID_SIZE, actimetryServUUID }; + +// Accelerometer Characteristic Properties +static uint8 actimetryImuProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 actimetryImu[WIMU_ACTIMETRY_IMU_PACKET_SIZE] = {0};//{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14};//{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Actimetry Characteristic Configuration +static gattCharCfg_t actimetryImuConfig[GATT_MAX_NUM_CONN]; + +// Actimetry Characteristic User Description +static uint8 actimetryImuUserDesp[19] = "Actimetry IMU Data\0"; + +// Accelerometer Characteristic Properties +static uint8 actimetryQuaternionProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 actimetryQuaternion[WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE] = { 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0}; + +// Actimetry Characteristic Configuration +static gattCharCfg_t actimetryQuaternionConfig[GATT_MAX_NUM_CONN]; + +// Actimetry Characteristic User Description +static uint8 actimetryQuaternionUserDesp[26] = "Actimetry Quaternion Data\0"; + +// Actimetry Characteristic Configuration Properties +static uint8 actimetryCfgProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_NOTIFY; + +// Actimetry Characteristic Configuration Value +static uint8 actimetryCfg[sizeof(IMU_Config_t)]; + +static gattCharCfg_t actimetryCfgConfig[GATT_MAX_NUM_CONN]; + +// Actimetry Characteristic Configuration User Description +static uint8 actimetryCfgUserDesp[17] = "Actimetry Config\0"; + + +// Actimetry Characteristic Configuration Value +static uint8 actimetryControl[sizeof(RemControl_t)]; + +static gattCharCfg_t actimetryControlConfig[GATT_MAX_NUM_CONN]; + + +// Actimetry Characteristic Configuration User Description +static uint8 actimetryControlUserDesp[18] = "Actimetry Control\0"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t sensorActimetryAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&actimetryService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &actimetryImuProps + }, + + // Characteristic Value "Imu Data" + { + { WIMU_ACTIMETRY_UUID_SIZE, actimetryImuUUID }, + GATT_PERMIT_READ, + 0, + actimetryImu + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)actimetryImuConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + actimetryImuUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &actimetryQuaternionProps + }, + // Characteristic Value "Quaternion Data" + { + { WIMU_ACTIMETRY_UUID_SIZE, actimetryQuaternionUUID }, + GATT_PERMIT_READ, + 0, + actimetryQuaternion + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)actimetryQuaternionConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + actimetryQuaternionUserDesp + }, + // Characteristic 2 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &actimetryCfgProps + }, + + // Characteristic Value "Configuration" + { + { WIMU_ACTIMETRY_UUID_SIZE, actimetryCfgUUID }, + GATT_PERMIT_READ/* | GATT_PERMIT_WRITE*/, + 0, + actimetryCfg + }, + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ/* | GATT_PERMIT_WRITE*/, + 0, + (uint8 *)actimetryCfgConfig + }, + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + actimetryCfgUserDesp + }, + + // Characteristic Value "Control" + { + { WIMU_ACTIMETRY_UUID_SIZE, actimetryControlUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + actimetryControl + }, + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)actimetryControlConfig + }, + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + actimetryControlUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 Actimetry_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t Actimetry_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void Actimetry_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t actimetryCBs = +{ + Actimetry_ReadAttrCB, // Read callback function pointer + Actimetry_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Actimetry_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Actimetry_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( Actimetry_HandleConnStatusCB ); + + if (services & ACTIMETRY_SERVICE ) + { + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorActimetryAttrTbl, + GATT_NUM_ATTRS( sensorActimetryAttrTbl ), + &actimetryCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Actimetry_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ + +bStatus_t Actimetry_RegisterAppCBs( actimetryCBs_t *appCallbacks ) +{ + if ( Actimetry_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + Actimetry_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Actimetry_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Actimetry_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case ACTIMETRY_IMU: + if ( len == WIMU_ACTIMETRY_IMU_PACKET_SIZE ) + { + VOID osal_memcpy( actimetryImu, value, WIMU_ACTIMETRY_IMU_PACKET_SIZE ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryImuConfig, actimetryImu, FALSE, + sensorActimetryAttrTbl, GATT_NUM_ATTRS( sensorActimetryAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACTIMETRY_QUATERNION: + if ( len == WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE ) + { + VOID osal_memcpy( actimetryQuaternion, value, WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryQuaternionConfig, actimetryQuaternion, FALSE, + sensorActimetryAttrTbl, GATT_NUM_ATTRS( sensorActimetryAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACTIMETRY_CONFIG: + if(len == sizeof ( IMU_Config_t ) ) + { +// actimetryCfg = *((uint8*)value); + osal_memcpy( actimetryCfg, value, len ); + + } + else + { + ret = bleInvalidRange; + } + break; + + case ACTIMETRY_CONTROL: + if(len == sizeof ( RemControl_t ) ) + { + //actimetryControl = *((uint8*)value); + osal_memcpy( actimetryControl, value, len); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryControlConfig, actimetryControl, FALSE, + sensorActimetryAttrTbl, GATT_NUM_ATTRS( sensorActimetryAttrTbl ), + INVALID_TASK_ID ); + + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Actimetry_GetParameter + * + * @brief Get a Actimetry Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Actimetry_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACTIMETRY_IMU: + VOID osal_memcpy (value, actimetryImu, WIMU_ACTIMETRY_IMU_PACKET_SIZE ); + break; + + case ACTIMETRY_QUATERNION: + VOID osal_memcpy (value, actimetryQuaternion, WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE ); + break; + + case ACTIMETRY_CONFIG: + //*((uint8*)value) = actimetryCfg; + VOID osal_memcpy (value, actimetryCfg, sizeof(IMU_Config_t) ); + break; + + case ACTIMETRY_CONTROL: + //*((uint8*)value) = actimetryControl; + osal_memcpy (value, actimetryControl, sizeof(RemControl_t) ); + break; + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Actimetry_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 Actimetry_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case ACTIMETRY_IMU_UUID: + *pLen = WIMU_ACTIMETRY_IMU_PACKET_SIZE; + VOID osal_memcpy( pValue, pAttr->pValue, WIMU_ACTIMETRY_IMU_PACKET_SIZE ); + break; + + case ACTIMETRY_QUATERNION_UUID: + *pLen = WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE; + VOID osal_memcpy( pValue, pAttr->pValue, WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE ); + break; + + case ACTIMETRY_CONFIG_UUID: + *pLen = sizeof(IMU_Config_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(IMU_Config_t) ); + break; + + case ACTIMETRY_CONTROL_UUID: + //*pLen = 1; + //pValue[0] = *pAttr->pValue; + *pLen = sizeof(RemControl_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(RemControl_t) ); + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn Actimetry_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t Actimetry_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case ACTIMETRY_IMU_UUID: + //Should not get here + break; + + case ACTIMETRY_QUATERNION_UUID: + //Should not get here + break; + + case ACTIMETRY_CONFIG_UUID: + // Not done yet. + + //Validate the value + // Make sure it's not a blob oper + /*if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &actimetryCfg ) + { + notifyApp = ACTIMETRY_CONF; + } + }*/ + break; + + case ACTIMETRY_CONTROL_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != sizeof(RemControl_t) ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + + osal_set_event(/*WIMU_TaskID*/10, WIMU_CONTROL_EVT); + + if( pAttr->pValue == (uint8*)(&actimetryControl) ) + { + notifyApp = ACTIMETRY_CONTROL; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && Actimetry_AppCBs && Actimetry_AppCBs->pfnActimetryChange ) + { + Actimetry_AppCBs->pfnActimetryChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Actimetry_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void Actimetry_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, actimetryImuConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryQuaternionConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryCfgConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryControlConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.h new file mode 100644 index 0000000..780609d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Actimetry/actimetryservice.h @@ -0,0 +1,139 @@ +/************************************************************************************************** + Filename: actimetryservice.h + + Description: Actimetry service definitions and prototypes. Based on + Gyroscope service from Sensors profile. + + The service consists of one characteristic which stores + the 20-byte value defined by specification. It allows + to send this data via notifications or read it directly. + +**************************************************************************************************/ + +#ifndef ACTIMETRYSERVICE_H +#define ACTIMETRYSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// If uncommented 128 bit UUIDs are used +//#define WIMU_LONG_UUIDS +/* + 128 bit Version 1 UUIDs generated on http://www.uuidgenerator.net/ + Macro as in Components\ble\include\bcomdef.h +*/ +#ifdef WIMU_LONG_UUIDS +# define WIMU_ACTIMETRY_UUID(uuid) 0x5e, 0xc0, 0xae, 0x91, 0x3c, 0xf2, 0x5b, 0x9f, 0xe2, 0x11, 0x93, 0xe3, LO_UINT16(uuid), HI_UINT16(uuid), 0xb3, 0x91 +# define WIMU_ACTIMETRY_UUID_SIZE ATT_UUID_SIZE +#else +# define WIMU_ACTIMETRY_UUID(uuid) LO_UINT16(uuid), HI_UINT16(uuid) +# define WIMU_ACTIMETRY_UUID_SIZE ATT_BT_UUID_SIZE +#endif + +// Service UUIDs +#define ACTIMETRY_SERV_UUID 0x70ee //91b370ee-e393-11e2-9f5b-f23c91aec05e +#define ACTIMETRY_IMU_UUID 0x7486 //91b37486-e393-11e2-9f5b-f23c91aec05e +#define ACTIMETRY_QUATERNION_UUID 0X759d //91b3759d-e393-11e2-9f5b-f23c91aec05e +#define ACTIMETRY_CONFIG_UUID 0x76ac //91b376ac-e393-11e2-9f5b-f23c91aec05e +#define ACTIMETRY_CONTROL_UUID 0x76ad //91b376ad-e393-11e2-9f5b-f23c91aec05e + +// Profile Parameters +#define ACTIMETRY_IMU 12 // RN uint8 - Profile Attribute value +#define ACTIMETRY_QUATERNION 13 // RN uint8 - Profile Attribute value +#define ACTIMETRY_CONFIG 14 // RW uint8 - Profile Attribute value +#define ACTIMETRY_CONTROL 15 // RW uint8 - Profile Attribute value + +// Actimetry control flags +#define ACT_CTRL_FLAG_REC 0x0001 + +// Sensor Profile Services bit fields +#define ACTIMETRY_SERVICE 0x00000020 + +// Length of sensor data in bytes +#define ACTIMETRY_IMU_LEN 20 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*actimetryChange_t)( uint8 paramID ); + +typedef struct +{ + actimetryChange_t pfnActimetryChange; // Called when characteristic value changes +} actimetryCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Actimetry_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Actimetry_AddService( uint32 services ); + +/* + * Actimetry_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Actimetry_RegisterAppCBs( actimetryCBs_t *appCallbacks ); + +/* + * Actimetry_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Actimetry_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ACTIMETRYSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.c new file mode 100644 index 0000000..d60630f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.c @@ -0,0 +1,426 @@ +/************************************************************************************************** + Filename: battservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hal_adc.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "hid_uuid.h" +#include "hiddev.h" + +#include "battservice.h" +#include "wimu_util.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// ADC voltage level +#define BATT_ADC_LEVEL_3V 409 +#define BATT_ADC_LEVEL_2V 273 + +#define BATT_LEVEL_VALUE_IDX 2 // Position of battery level in attribute array +#define BATT_LEVEL_VALUE_CCCD_IDX 3 // Position of battery level CCCD in attribute array + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Battery service +CONST uint8 battServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BATT_SERVICE_UUID), HI_UINT16(BATT_SERVICE_UUID) +}; + +// Battery level characteristic +CONST uint8 battLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Application callback +//static battServiceCB_t battServiceCB; + +static batteryCBs_t *Battery_AppCBs = NULL; + +// Measurement setup callback +//static battServiceSetupCB_t battServiceSetupCB = NULL; + +// Measurement teardown callback +//static battServiceTeardownCB_t battServiceTeardownCB = NULL; + +// Measurement calculation callback +//static battServiceCalcCB_t battServiceCalcCB = NULL; + +//static uint16 battMinLevel = BATT_ADC_LEVEL_2V; // For VDD/3 measurements +//static uint16 battMaxLevel = BATT_ADC_LEVEL_3V; // For VDD/3 measurements*/ + +// Critical battery level setting + +// ADC channel to be used for reading +//static uint8 battServiceAdcCh = HAL_ADC_CHANNEL_VDD; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Battery Service attribute +static CONST gattAttrType_t battService = { ATT_BT_UUID_SIZE, battServUUID }; + +// Battery level characteristic +static uint8 battLevelProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 battLevel = 0; +static gattCharCfg_t battLevelClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t battAttrTbl[] = +{ + // Battery Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&battService /* pValue */ + }, + + // Battery Level Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &battLevelProps + }, + + // Battery Level Value + { + { ATT_BT_UUID_SIZE, battLevelUUID }, + GATT_PERMIT_READ, + 0, + &battLevel + }, + + // Battery Level Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)battLevelClientCharCfg + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +//static void battNotifyCB( linkDBItem_t *pLinkItem ); +//static uint8 battMeasure( void ); +//static void battNotifyLevel( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Battery Service Callbacks +CONST gattServiceCBs_t battCBs = +{ + battReadAttrCB, // Read callback function pointer + battWriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t Batt_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, battLevelClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( battAttrTbl, + GATT_NUM_ATTRS( battAttrTbl ), + &battCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +bStatus_t Batt_Register( batteryCBs_t *appCallbacks ) +{ + if ( Battery_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + Battery_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BATT_PARAM_LEVEL: + if ( len == WIMU_BATTERY_PACKET_SIZE ) + { + battLevel = *((uint8*)value); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( battLevelClientCharCfg, &battLevel, FALSE, + battAttrTbl, GATT_NUM_ATTRS( battAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case BATT_PARAM_LEVEL: + *((uint8*)value) = battLevel; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn battReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ + +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1] ); + + // Measure battery level if reading level + if ( uuid == BATT_LEVEL_UUID ) + { + *pLen = WIMU_BATTERY_PACKET_SIZE; + VOID osal_memcpy( pValue, pAttr->pValue, WIMU_BATTERY_PACKET_SIZE ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn battWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{/* + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, battLevelClientCharCfg ); + } + }*/ +} + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.h new file mode 100644 index 0000000..81a7a70 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Batt/battservice.h @@ -0,0 +1,167 @@ +/************************************************************************************************** + Filename: battservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service definitions and + prototypes. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BATTSERVICE_H +#define BATTSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Battery Service UUIDs +#define BATT_SERVICE_UUID 0x180F // Battery Service +#define BATT_LEVEL_UUID 0x2A19 // Battery Level + +// Battery Service Get/Set Parameters +#define BATT_PARAM_LEVEL 0 + +// Callback events +#define BATT_LEVEL_NOTI_ENABLED 1 +#define BATT_LEVEL_NOTI_DISABLED 2 + +/********************************************************************* + * TYPEDEFS + */ + +// Battery Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*batteryChange_t)( uint8 paramID ); + +typedef struct +{ + batteryChange_t pfnBatteryChange; // Called when characteristic value changes +} batteryCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Batt_AddService( void ); + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Batt_Register( batteryCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BATTSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.c new file mode 100644 index 0000000..736fc7a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.c @@ -0,0 +1,577 @@ +/************************************************************************************************** + Filename: bpservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the BloodPressure sample service + for use with the BloodPressure sample application. + + Copyright 2011 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "bpservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of bloodPressure measurement value in attribute array +#define BLOODPRESSURE_MEAS_VALUE_POS 2 +#define BLOODPRESSURE_MEAS_CONFIG_POS 3 +#define BLOODPRESSURE_IMEAS_VALUE_POS 6 +#define BLOODPRESSURE_IMEAS_CONFIG_POS 7 +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// BloodPressure service +CONST uint8 bloodPressureServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_SERV_UUID), HI_UINT16(BLOODPRESSURE_SERV_UUID) +}; + +// BloodPressure temperature characteristic +CONST uint8 bloodPressureTempUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_MEAS_UUID), HI_UINT16(BLOODPRESSURE_MEAS_UUID) +}; + +// BloodPressure Immediate Measurement +CONST uint8 bloodPressureImeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_IMEAS_UUID), HI_UINT16(BLOODPRESSURE_IMEAS_UUID) +}; + +// BloodPressure Feature +CONST uint8 bpFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(BLOODPRESSURE_FEATURE_UUID), HI_UINT16(BLOODPRESSURE_FEATURE_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static bloodPressureServiceCB_t bloodPressureServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// BloodPressure Service attribute +static CONST gattAttrType_t bloodPressureService = { ATT_BT_UUID_SIZE, bloodPressureServUUID }; + +// BloodPressure Characteristic +static uint8 bloodPressureTempProps = GATT_PROP_INDICATE; +static gattCharCfg_t bloodPressureMeasConfig[GATT_MAX_NUM_CONN]; +static uint8 bloodPressureTemp = 0; +static uint8 bloodPressureTempFormat = 12; + +// Intermediate Measurement +static uint8 bloodPressureImeasProps = GATT_PROP_NOTIFY; +static uint8 bloodPressureImeas=0; +static gattCharCfg_t bloodPressureIMeasConfig[GATT_MAX_NUM_CONN]; + +// BP Feature + /* + bit 1 Body Movement Detection Support bit + bit 2 Cuff Fit Detection Support bit + bit 3 Irregular Pulse Detection Support bit + bit 4 Pulse Rate Range Detection Support bit + bit 5 Measurement Position Detection Support bit + bit 6 Multiple Bond Support bit + bit . Reserved for Future Use + */ +static uint8 bpFeatureProps = GATT_PROP_READ; +static uint16 bpFeature = 0; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t bloodPressureAttrTbl[] = +{ + // BloodPressure Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&bloodPressureService /* pValue */ + }, + + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bloodPressureTempProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, bloodPressureTempUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &bloodPressureTemp + }, + + // 3.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&bloodPressureMeasConfig + }, + // 4.Presentation Format + { + { ATT_BT_UUID_SIZE, charFormatUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&bloodPressureTempFormat + }, + + + ////////////////////////////////////////////// + // IMMEDIATE MEASUREMENT + ////////////////////////////////////////////// + + // 5.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bloodPressureImeasProps + }, + + // 6.Characteristic Value + { + { ATT_BT_UUID_SIZE, bloodPressureImeasUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &bloodPressureImeas + }, + + // 7.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&bloodPressureIMeasConfig + }, + + + ////////////////////////////////////////////// + // FEATURE + ////////////////////////////////////////////// + + // 8.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &bpFeatureProps + }, + + // 9.Characteristic Value + { + { ATT_BT_UUID_SIZE, bpFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&bpFeature + }, + + + + +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 bloodPressure_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t bloodPressure_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void bloodPressure_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); +/********************************************************************* + * PROFILE CALLBACKS + */ +// Blood Pressure Service Callbacks +CONST gattServiceCBs_t bloodPressureCBs = +{ + bloodPressure_ReadAttrCB, // Read callback function pointer + bloodPressure_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn BloodPressure_AddService + * + * @brief Initializes the BloodPressure service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t BloodPressure_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, bloodPressureMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, bloodPressureIMeasConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( bloodPressure_HandleConnStatusCB ); + + if ( services & BLOODPRESSURE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( bloodPressureAttrTbl, + GATT_NUM_ATTRS( bloodPressureAttrTbl ), + &bloodPressureCBs ); + + } + return ( status ); +} + +/********************************************************************* + * @fn BloodPressure_Register + * + * @brief Register a callback function with the BloodPressure Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void BloodPressure_Register( bloodPressureServiceCB_t pfnServiceCB ) +{ + bloodPressureServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn BloodPressure_SetParameter + * + * @brief Set a thermomter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t BloodPressure_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn BloodPressure_GetParameter + * + * @brief Get a BloodPressure parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t BloodPressure_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn BloodPressure_MeasIndicate + * + * @brief Send a indication containing a bloodPressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t BloodPressure_MeasIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, bloodPressureMeasConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle + pNoti->handle = bloodPressureAttrTbl[BLOODPRESSURE_MEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + + +/********************************************************************* + * @fn BloodPressure_IMeasNotify + * + * @brief Send a notification containing a bloodPressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t BloodPressure_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, bloodPressureIMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = bloodPressureAttrTbl[BLOODPRESSURE_IMEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE); + + } + return bleIncorrectMode; + +} + +/********************************************************************* + * @fn bloodPressure_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 bloodPressure_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + + case BLOODPRESSURE_FEATURE_UUID: + { + *pLen = 2; + pValue[0] = 0; + pValue[1] = 0; + } + break; + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + return ( status ); +} + +/********************************************************************* + * @fn bloodPressure_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t bloodPressure_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + if ( pAttr->handle == bloodPressureAttrTbl[BLOODPRESSURE_MEAS_CONFIG_POS].handle ) + { + // BloodPressure Indications + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*bloodPressureServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + BLOODPRESSURE_MEAS_NOTI_DISABLED : + BLOODPRESSURE_MEAS_NOTI_ENABLED); + } + } + else if ( pAttr->handle == bloodPressureAttrTbl[BLOODPRESSURE_IMEAS_CONFIG_POS].handle ) + { + // BloodPressure Notifications + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*bloodPressureServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + BLOODPRESSURE_IMEAS_NOTI_DISABLED : + BLOODPRESSURE_IMEAS_NOTI_ENABLED ); + } + } + else + { + status = ATT_ERR_INVALID_HANDLE; + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); + +} + + +/********************************************************************* + * @fn bloodPressure_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void bloodPressure_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, bloodPressureMeasConfig ); + GATTServApp_InitCharCfg( connHandle, bloodPressureIMeasConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.h new file mode 100644 index 0000000..4b8b9a6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/BloodPressure/bpservice.h @@ -0,0 +1,205 @@ +/************************************************************************************************** + Filename: bpService.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the BloodPressure service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BLOODPRESSURESERVICE_H +#define BLOODPRESSURESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// BloodPressure Service Parameters +#define BLOODPRESSURE_MEAS 0 +#define BLOODPRESSURE_MEAS_CHAR_CFG 1 +#define BLOODPRESSURE_IMEAS_CHAR_CFG 2 +#define BLOODPRESSURE_TIMESTAMP 3 +#define BLOODPRESSURE_PULSE 4 +#define BLOODPRESSURE_INTERVAL 5 + +// Length of measurements +#define BLOODPRESSURE_TIMESTAMP_LEN 7 //length of timestamp +#define BLOODPRESSURE_TIME_LEN 7 //length of timestamp +#define BLOODPRESSURE_INTERVAL_LEN 1 + +// BloodPressure Service UUIDs +#define BLOODPRESSURE_SERV_UUID 0x1810 +#define BLOODPRESSURE_MEAS_UUID 0x2A35 //bp measurement +#define BLOODPRESSURE_IMEAS_UUID 0x2A36 //intermediate +#define BLOODPRESSURE_FEATURE_UUID 0x2A49 //intermediate + +// Maximum length of blood pressure measurement characteristic +#define BLOODPRESSURE_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define BLOODPRESSURE_FLAGS_MMHG 0x00 +#define BLOODPRESSURE_FLAGS_KPA 0x01 +#define BLOODPRESSURE_FLAGS_TIMESTAMP 0x02 +#define BLOODPRESSURE_FLAGS_PULSE 0x04 +#define BLOODPRESSURE_FLAGS_USER 0x08 +#define BLOODPRESSURE_FLAGS_STATUS 0x10 + + +// Values for sensor location +#define BLOODPRESSURE_SITE_ARMPIT 0x01 +#define BLOODPRESSURE_SITE_BODY 0x02 +#define BLOODPRESSURE_SITE_EAR 0x03 +#define BLOODPRESSURE_SITE_FINGER 0x04 +#define BLOODPRESSURE_SITE_GASTRO 0x05 +#define BLOODPRESSURE_SITE_MOUTH 0x06 +#define BLOODPRESSURE_SITE_RECTUM 0x07 +#define BLOODPRESSURE_SITE_TOE 0x08 +#define BLOODPRESSURE_SITE_TYMPNUM 0x09 + +// BloodPressure Service bit fields +#define BLOODPRESSURE_SERVICE 0x00000001 + +// Callback events +#define BLOODPRESSURE_MEAS_NOTI_ENABLED 1 +#define BLOODPRESSURE_MEAS_NOTI_DISABLED 2 +#define BLOODPRESSURE_IMEAS_NOTI_ENABLED 3 +#define BLOODPRESSURE_IMEAS_NOTI_DISABLED 4 +#define BLOODPRESSURE_TIME_SET 5 + +/********************************************************************* + * TYPEDEFS + */ + +// BloodPressure Service callback function +typedef void (*bloodPressureServiceCB_t)(uint8 event); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * BloodPressure_AddService- Initializes the BloodPressure service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t BloodPressure_AddService( uint32 services ); + +/* + * BloodPressure_Register - Register a callback function with the + * BloodPressure Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void BloodPressure_Register( bloodPressureServiceCB_t pfnServiceCB ); + +/* + * BloodPressure_SetParameter - Set a BloodPressure parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t BloodPressure_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * BloodPressure_GetParameter - Get a BloodPressure parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t BloodPressure_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn BloodPressure_MeasIndicate + * + * @brief Send a notification containing a blood pressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t BloodPressure_MeasIndicate( uint16 connHandle, attHandleValueInd_t *pNoti, uint8 taskId ); + + + + +/********************************************************************* + * @fn BloodPressure_IMeasNotify + * + * @brief Send a notification containing a blood pressure + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t BloodPressure_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BLOODPRESSURESERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.c new file mode 100644 index 0000000..6636f20 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.c @@ -0,0 +1,860 @@ +/************************************************************************************************** + Filename: cyclingservice.c + Revised: $Date: 2013-04-04 15:28:09 -0700 (Thu, 04 Apr 2013) $ + Revision: $Revision: 33765 $ + + Description: This file contains the Cycling Speed and Cadence (CSC) service + for use with the CyclingApp sample application. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "cyclingservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ +// Cycling Service Task Events +#define CSC_CMD_IND_SEND_EVT 0x0001 + +#define CSC_MEAS_VALUE_POS 2 +#define CSC_MEAS_CFG_POS 3 +#define CSC_COMMAND_VALUE_POS 9 +#define CSC_COMMAND_CFG_POS 10 +#define COMMAND_IND_LENGTH 2 + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// CSC service +CONST uint8 cyclingServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CSC_SERV_UUID), HI_UINT16(CSC_SERV_UUID) +}; + +// CSC measurement characteristic +CONST uint8 cyclingMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CSC_MEAS_UUID), HI_UINT16(CSC_MEAS_UUID) +}; + +// CSC feature characteristic +CONST uint8 cyclingFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CSC_FEATURE_UUID), HI_UINT16(CSC_FEATURE_UUID) +}; + +// CSC sensor location characteristic +CONST uint8 cyclingSensLocUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CSC_SENS_LOC_UUID), HI_UINT16(CSC_SENS_LOC_UUID) +}; + +// CSC command characteristic +CONST uint8 cyclingCommandUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CSC_COMMAND_UUID), HI_UINT16(CSC_COMMAND_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static cyclingServiceCB_t cyclingServiceCB = NULL; + +static uint8 supportedSensors = 0; +static bool scOpInProgress = FALSE; + +// Variables used in CSC command processing +static uint16 connectionHandle; +static attHandleValueInd_t cscCmdInd; + +/********************************************************************* + * Profile Attributes - variables + */ + +// TaskID +uint8 cyclingService_TaskID = 0; + +// CSC Service attribute +static CONST gattAttrType_t cyclingService = { ATT_BT_UUID_SIZE, cyclingServUUID }; + +// Available sensor locations +static uint8 supportedSensorLocations[CSC_MAX_SENSOR_LOCS]; + +// Cycling Measurement Characteristic +// Note: characteristic value is not stored here +static uint8 cyclingMeasProps = GATT_PROP_NOTIFY; +static uint8 cyclingMeas = 0; +static gattCharCfg_t cyclingMeasClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Characteristic +static uint8 cyclingFeatureProps = GATT_PROP_READ; +static uint16 cyclingFeatures = CSC_NO_SUPPORT; + + +// Sensor Location Characteristic +static uint8 cyclingSensLocProps = GATT_PROP_READ; +static uint8 cyclingSensLoc = CSC_SENSOR_LOC_TOP_OF_SHOE; + +// Command Characteristic +static uint8 cyclingCommandProps = GATT_PROP_WRITE | GATT_PROP_INDICATE; +static uint8 cyclingCommand = 0; +static gattCharCfg_t cyclingCommandClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t cyclingAttrTbl[] = +{ + // CSC Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&cyclingService /* pValue */ + }, + + // CSC Measurement Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &cyclingMeasProps + }, + + // Measurement Value + { + { ATT_BT_UUID_SIZE, cyclingMeasUUID }, + 0, + 0, + &cyclingMeas + }, + + // Measurement Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &cyclingMeasClientCharCfg + }, + + // CSC Feature Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &cyclingFeatureProps + }, + + // Feature Value + { + { ATT_BT_UUID_SIZE, cyclingFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) &cyclingFeatures + }, + + // CSC Sensor Location Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &cyclingSensLocProps + }, + + // Sensor Location Value + { + { ATT_BT_UUID_SIZE, cyclingSensLocUUID }, + GATT_PERMIT_READ, + 0, + &cyclingSensLoc + }, + + // CSC Command Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &cyclingCommandProps + }, + + // Command Value + { + { ATT_BT_UUID_SIZE, cyclingCommandUUID }, + GATT_PERMIT_WRITE, + 0, + &cyclingCommand + }, + + // Command Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &cyclingCommandClientCharCfg + } +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 cycling_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t cycling_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void cycling_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void cycling_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static bool cycling_SensorLocSupported( uint8 sensorLoc ); +static void cycling_ProcessCSCCmd( uint16 attrHandle, uint8 *pValue, uint8 len ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// CSC Service Callbacks +CONST gattServiceCBs_t cyclingCBs = +{ + cycling_ReadAttrCB, // Read callback function pointer + cycling_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn CyclingService_Init + * + * @brief collect the OSAL task ID. + * + * @param task_id - OSAL task ID. + * + * @return none + */ +void CyclingService_Init( uint8 task_id ) +{ + // Only purpose is to obtain task ID + cyclingService_TaskID = task_id; +} + +/********************************************************************* + * @fn CyclingService_ProcessEvent + * + * @brief process incoming event. + * + * @param task_id - OSAL task id. + * + * @param events - event bit(s) set for the task(s) + * + * @return none + */ +uint16 CyclingService_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( cyclingService_TaskID )) != NULL ) + { + cycling_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & CSC_CMD_IND_SEND_EVT ) + { + GATT_Indication( connectionHandle, &cscCmdInd, FALSE, cyclingService_TaskID ); + + // Set Control Point Cfg done + scOpInProgress = FALSE; + + return ( events ^ CSC_CMD_IND_SEND_EVT ); + } + + return 0; +} + +/********************************************************************* + * @fn cycling_ProcessOSALMsg + * + * @brief process incoming OSAL msg. + * + * @param pMsg- pointer to messag to be read. + * + * @return none + */ +void cycling_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GATT_MSG_EVENT: + cycling_ProcessGATTMsg( (gattMsgEvent_t *) pMsg ); + break; + + default: // do nothing + break; + } +} + +/********************************************************************* + * @fn cycling_ProcessGATTMsg + * + * @brief process incoming GATT msg. + * + * @param pMsg- pointer to messag to be read. + * + * @return none + */ +void cycling_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + if ( pMsg->method == ATT_HANDLE_VALUE_CFM ) + { + // Indication receipt was confirmed by the client. + // This is a placeholder for future. + } +} + +/********************************************************************* + * @fn cycling_SensorLocSupported + * + * @brief check to see if sensor location is supported + * + * @param sensorLoc - location to check for + * + * @return TRUE if supported, FALSE otherwise + */ +static bool cycling_SensorLocSupported( uint8 sensorLoc ) +{ + uint8 i; + for (i = 0; i <= supportedSensors; i++) + { + if (supportedSensorLocations[i] == sensorLoc) + { + return TRUE; + } + } + return FALSE; +} + +/********************************************************************* + * @fn Cycling_AddService + * + * @brief Initializes the CSC service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Cycling_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, cyclingMeasClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, cyclingCommandClientCharCfg); + + if ( services & CYCLING_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( cyclingAttrTbl, + GATT_NUM_ATTRS( cyclingAttrTbl ), + &cyclingCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Cycling_Register + * + * @brief Register a callback function with the CSC Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +void Cycling_Register( cyclingServiceCB_t pfnServiceCB ) +{ + cyclingServiceCB = pfnServiceCB; +} + + +/********************************************************************* + * @fn Cycling_SetParameter + * + * @brief Set a CSC parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Cycling_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case CSC_SENS_LOC: + cyclingSensLoc = *((uint8*)pValue); + break; + + case CSC_FEATURE: + cyclingFeatures = *((uint8*)pValue); + break; + + case CSC_AVAIL_SENS_LOCS: + if (supportedSensors < CSC_MAX_SENSOR_LOCS) + { + supportedSensorLocations[supportedSensors++] = *((uint8*)pValue); + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Cycling_GetParameter + * + * @brief Get a CSC parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Cycling_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case CSC_FEATURE: + *((uint8*)value) = cyclingFeatures; + + case CSC_SENS_LOC: + *((uint8*)value) = cyclingSensLoc; + break; + + case CSC_COMMAND: + *((uint8*)value) = cyclingCommand; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Cycling_MeasNotify + * + * @brief Send a notification containing a CSC + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Cycling_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, cyclingMeasClientCharCfg ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = cyclingAttrTbl[CSC_MEAS_VALUE_POS].handle; + + // Send the notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + + /********************************************************************* + * @fn cycling_ProcessCSCCmd + * + * @brief process an incoming CSC command. + * + * @param attrHandle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * + * @return none + */ +static void cycling_ProcessCSCCmd( uint16 attrHandle, uint8 *pValue, uint8 len ) +{ + uint8 cscStatus = CSC_SUCCESS; + + // Set Control Point Cfg in progress + scOpInProgress = TRUE; + + // Set indication info to be sent out + cscCmdInd.handle = attrHandle; + + cscCmdInd.len = 3; + cscCmdInd.value[0] = CSC_COMMAND_RSP; + cscCmdInd.value[1] = pValue[0]; + + switch ( pValue[0] ) + { + case CSC_SET_CUMM_VAL: + // If wheel revolutions is a feature + if ( ( len <= 5 ) && ( cyclingFeatures & CSC_WHEEL_REV_SUPP ) ) + { + uint32 cummWheelRevolutions; + + // full 32 bits were specified. + if (( len - 1 ) == 4) + { + cummWheelRevolutions = BUILD_UINT32( pValue[1], pValue[2], pValue[3], pValue[4]); + } + else + { + cummWheelRevolutions = 0; + + // In case only lower bits were specified and upper bits remain zero. + for( int i = 0; i < (len - 1); ++i ) + { + cummWheelRevolutions += pValue[i + 1] << (i*8); + } + } + + // Notify app + if ( cyclingServiceCB != NULL ) + { + (*cyclingServiceCB)( CSC_CMD_SET_CUMM_VAL, &cummWheelRevolutions ); + } + } + else // characteristic not supported. + { + cscStatus = CSC_INVALID_PARAMETER; + } + break; + + case CSC_UPDATE_SENS_LOC: + // If multiple sensor locations is supported and that this is a valid location. + if ( ( len == 2 ) && + ( cyclingFeatures & CSC_MULTI_SENS_SUPP ) && + ( cycling_SensorLocSupported( pValue[1] ) == TRUE ) ) + { + // Update sensor location + cyclingSensLoc = pValue[1]; + + // Notify app + if ( cyclingServiceCB != NULL ) + { + (*cyclingServiceCB)( CSC_CMD_UPDATE_SENS_LOC, NULL ); + } + } + else // characteristic not supported. + { + cscStatus = CSC_INVALID_PARAMETER; + } + break; + + case CSC_REQ_SUPP_SENS_LOC: + // If multiple sensor locations are supported and list requested + if ( ( len == 1 ) && ( cyclingFeatures & CSC_MULTI_SENS_SUPP ) ) + { + cscCmdInd.len += supportedSensors; + osal_memcpy( &(cscCmdInd.value[3]), supportedSensorLocations, supportedSensors ); + } + else // characteristic not supported. + { + // Send an indication with the list. + cscStatus = CSC_INVALID_PARAMETER; + } + break; + + default: + // Send an indication with opcode not suported response + cscStatus = CSC_OPCODE_NOT_SUPPORTED; + break; + } + + // Send indication of operation result + cscCmdInd.value[2] = cscStatus; + + // Ask our task to send out indication + osal_set_event( cyclingService_TaskID, CSC_CMD_IND_SEND_EVT ); +} + +/********************************************************************* + * @fn Cycling_HandleConnStatusCB + * + * @brief CSC Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Cycling_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, cyclingMeasClientCharCfg ); + GATTServApp_InitCharCfg( connHandle, cyclingCommandClientCharCfg ); + } + } +} + +/********************************************************************* + * @fn cycling_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 cycling_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + bStatus_t status = SUCCESS; + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + case CSC_SENS_LOC_UUID: + { + // Read Sensor Location + *pLen = 1; + pValue[0] = pAttr->pValue[0]; + } + break; + + case CSC_FEATURE_UUID: + { + //Read Cycling Feature + *pLen = 2; + pValue[0] = LO_UINT16(pAttr->pValue[0]); + pValue[1] = HI_UINT16(pAttr->pValue[0]); + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + { + // Read Measurement or Command Configuration + if ( pAttr->pValue == (uint8*)cyclingMeasClientCharCfg ) + { + *pLen = 1; + pValue[0] = GATTServApp_ReadCharCfg(connHandle, cyclingMeasClientCharCfg ); + } + else if ( pAttr->pValue == (uint8*)cyclingCommandClientCharCfg ) + { + *pLen = 1; + pValue[0] = GATTServApp_ReadCharCfg(connHandle, cyclingCommandClientCharCfg ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // Notify app + if ( cyclingServiceCB != NULL ) + { + (*cyclingServiceCB)( CSC_READ_ATTR, NULL ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn cycling_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t cycling_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if ( offset > 0 ) + { + return (ATT_ERR_ATTR_NOT_LONG); + } + + switch ( uuid ) + { + case CSC_COMMAND_UUID: + // Make sure Control Point Cfg is not already in progress + if ( scOpInProgress == TRUE ) + { + status = CSC_ERR_PROC_IN_PROGRESS; + } + // Make sure Control Point Cfg is configured for Indications + else if ( (cyclingCommandClientCharCfg[connHandle].value & GATT_CLIENT_CFG_INDICATE) == FALSE ) + { + status = CSC_ERR_CCC_IMPROPER_CFG; + } + else + { + // Process CSC command + cycling_ProcessCSCCmd( pAttr->handle, pValue, len ); + connectionHandle = connHandle; + } + break; + + // For Measure and Commands CCC + case GATT_CLIENT_CHAR_CFG_UUID: + if ( pAttr->handle == cyclingAttrTbl[CSC_COMMAND_CFG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + // Notify app + if ( cyclingServiceCB != NULL ) + { + (*cyclingServiceCB)( CSC_WRITE_ATTR, NULL ); + } + } + else if ( pAttr->handle == cyclingAttrTbl[CSC_MEAS_CFG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + // Notify app + if ( cyclingServiceCB != NULL ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + (*cyclingServiceCB)( ((charCfg == GATT_CFG_NO_OPERATION) ? + CSC_MEAS_NOTI_DISABLED : + CSC_MEAS_NOTI_ENABLED ), NULL ); + } + } + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +*********************************************************************/ \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.h new file mode 100644 index 0000000..7a87319 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/CSC/cyclingservice.h @@ -0,0 +1,269 @@ +/************************************************************************************************** + Filename: cyclingservice.h + Revised: $Date: 2013-04-04 14:51:24 -0700 (Thu, 04 Apr 2013) $ + Revision: $Revision: 33758 $ + + Description: This file contains the Cycling Speed and Cadence (CSC) service + definitions and prototypes. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +#ifndef CYCLINGSERVICE_H +#define CYCLINGSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +#define CYCLING_SERVICE 0x00000001 + +//ATT Error Codes +#define CSC_ERR_PROC_IN_PROGRESS 0x80 +#define CSC_ERR_CCC_IMPROPER_CFG 0x81 + +#define CSC_SUCCESS 1 +#define CSC_OPCODE_NOT_SUPPORTED 2 +#define CSC_INVALID_PARAMETER 3 + +//CSC Service Parameters +#define CSC_MEAS 1 +#define CSC_MEAS_CHAR_CFG 2 +#define CSC_FEATURE 3 +#define CSC_SENS_LOC 4 +#define CSC_COMMAND 5 +#define CSC_COMMAND_CHAR_CFG 6 +#define CSC_AVAIL_SENS_LOCS 7 + +//CSC Service UUID's +#define CSC_SERV_UUID 0x1816 +#define CSC_MEAS_UUID 0x2A5B +#define CSC_FEATURE_UUID 0x2A5C +#define CSC_SENS_LOC_UUID 0x2A5D +#define CSC_COMMAND_UUID 0x2A55 + +//CSC Fields +#define CSC_WHEEL_REV_PRESENT 0x01 +#define CSC_CRANK_REV_PRESENT 0x02 + +//CSC SUPPORTED FEATURES +#define CSC_NO_SUPPORT 0x00 +#define CSC_WHEEL_REV_SUPP 0x01 +#define CSC_CRANK_REV_SUPP 0x02 +#define CSC_MULTI_SENS_SUPP 0x04 +#define CSC_FULL_SUPPORT 0x07 + +//CSC Censor Locations +#define CSC_SENSOR_LOC_OTHER 0 +#define CSC_SENSOR_LOC_TOP_OF_SHOE 1 +#define CSC_SENSOR_LOC_IN_SHOE 2 +#define CSC_SENSOR_LOC_HIP 3 +#define CSC_SENSOR_LOC_FRONT_WHEEL 4 +#define CSC_SENSOR_LOC_LEFT_CRANK 5 +#define CSC_SENSOR_LOC_RIGHT_CRANK 6 +#define CSC_SENSOR_LOC_LEFT_PEDAL 7 +#define CSC_SENSOR_LOC_RIGHT_PEDAL 8 +#define CSC_SENSOR_LOC_FRONT_HUB 9 +#define CSC_SENSOR_LOC_REAR_DROPOUT 10 +#define CSC_SENSOR_LOC_CHAINSTAY 11 +#define CSC_SENSOR_LOC_REAR_WHEEL 12 +#define CSC_SENSOR_LOC_REAR_HUB 13 + +//Spec says there are 14 possible. +#define CSC_MAX_SENSOR_LOCS 14 + +//CSC Commands +#define CSC_SET_CUMM_VAL 1 +#define CSC_START_SENS_CALIB 2 +#define CSC_UPDATE_SENS_LOC 3 +#define CSC_REQ_SUPP_SENS_LOC 4 +#define CSC_COMMAND_RSP 16 + +// Values for flags +#define CSC_FLAGS_AT_REST 0x00 +#define CSC_FLAGS_SPEED 0x01 +#define CSC_FLAGS_CADENCE 0x02 +#define CSC_FLAGS_SPEED_CADENCE 0x03 + + +#define DEFAULT_NOTI_INTERVAL 1000 // in milliseconds + +#define VALUE_ROLL_OVER 64000 // in milliseconds + +// Callback events +#define CSC_CMD_SET_CUMM_VAL 1 +#define CSC_CMD_START_SENS_CALIB 2 +#define CSC_CMD_UPDATE_SENS_LOC 3 +#define CSC_MEAS_NOTI_ENABLED 4 +#define CSC_MEAS_NOTI_DISABLED 5 +#define CSC_READ_ATTR 6 +#define CSC_WRITE_ATTR 7 + +/********************************************************************* + * TYPEDEFS + */ + +// CSC service callback function +typedef void (*cyclingServiceCB_t)( uint8 event, uint32 *pNewCummVal ); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + + +/********************************************************************* + * @fn CyclingService_Init + * + * @brief collect the OSAL task ID. + * + * @param task_id - OSAL task ID. + * + * @return none + */ +extern void CyclingService_Init( uint8 task_id ); + +/********************************************************************* + * @fn CyclingService_ProcessEvent + * + * @brief process incoming event. + * + * @param task_id - OSAL task id. + * + * @param events - event bit(s) set for the task(s) + * + * @return remaining event bits + */ +extern uint16 CyclingService_ProcessEvent( uint8 task_id, uint16 events ); + +/* + * @fn Cycling_AddService + * + * @brief Initializes the CSC service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Cycling_AddService( uint32 services ); + +/* + * @fn Cycling_Register + * + * @brief Register a callback function with the + * CSC Service. + * + * @param pfnServiceCB - Callback function. + * + * @return none + */ + +extern void Cycling_Register( cyclingServiceCB_t pfnServiceCB ); + +/* + * @fn Cycling_SetParameter + * + * @brief Set a CSC parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Cycling_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Cycling_GetParameter + * + * @brief Get a CSC parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Cycling_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Cycling_MeasNotify + * + * @brief Send a notification containing a CSC + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Cycling_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/********************************************************************* + * @fn Cycling_HandleConnStatusCB + * + * @brief CSC Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +extern void Cycling_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* CYCLINGSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.c new file mode 100644 index 0000000..6c19324 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.c @@ -0,0 +1,684 @@ +/************************************************************************************************** + Filename: devinfoservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "devinfoservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Device information service +CONST uint8 devInfoServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SERV_UUID), HI_UINT16(DEVINFO_SERV_UUID) +}; + +// System ID +CONST uint8 devInfoSystemIdUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SYSTEM_ID_UUID), HI_UINT16(DEVINFO_SYSTEM_ID_UUID) +}; + +// Model Number String +CONST uint8 devInfoModelNumberUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_MODEL_NUMBER_UUID), HI_UINT16(DEVINFO_MODEL_NUMBER_UUID) +}; + +// Serial Number String +CONST uint8 devInfoSerialNumberUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SERIAL_NUMBER_UUID), HI_UINT16(DEVINFO_SERIAL_NUMBER_UUID) +}; + +// Firmware Revision String +CONST uint8 devInfoFirmwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_FIRMWARE_REV_UUID), HI_UINT16(DEVINFO_FIRMWARE_REV_UUID) +}; + +// Hardware Revision String +CONST uint8 devInfoHardwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_HARDWARE_REV_UUID), HI_UINT16(DEVINFO_HARDWARE_REV_UUID) +}; + +// Software Revision String +CONST uint8 devInfoSoftwareRevUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_SOFTWARE_REV_UUID), HI_UINT16(DEVINFO_SOFTWARE_REV_UUID) +}; + +// Manufacturer Name String +CONST uint8 devInfoMfrNameUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_MANUFACTURER_NAME_UUID), HI_UINT16(DEVINFO_MANUFACTURER_NAME_UUID) +}; + +// IEEE 11073-20601 Regulatory Certification Data List +CONST uint8 devInfo11073CertUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_11073_CERT_DATA_UUID), HI_UINT16(DEVINFO_11073_CERT_DATA_UUID) +}; + +// PnP ID +CONST uint8 devInfoPnpIdUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(DEVINFO_PNP_ID_UUID), HI_UINT16(DEVINFO_PNP_ID_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Device Information Service attribute +static CONST gattAttrType_t devInfoService = { ATT_BT_UUID_SIZE, devInfoServUUID }; + +// System ID characteristic +static uint8 devInfoSystemIdProps = GATT_PROP_READ; +static uint8 devInfoSystemId[DEVINFO_SYSTEM_ID_LEN] = {0, 0, 0, 0, 0, 0, 0, 0}; + +// Model Number String characteristic +static uint8 devInfoModelNumberProps = GATT_PROP_READ; +static const uint8 devInfoModelNumber[] = "WIMU3"; + +// Serial Number String characteristic +static uint8 devInfoSerialNumberProps = GATT_PROP_READ; +static uint8 devInfoSerialNumber[DEVINFO_SERIAL_NUMBER_LEN] = {0, 0}; + +// Firmware Revision String characteristic +static uint8 devInfoFirmwareRevProps = GATT_PROP_READ; +static uint8 devInfoFirmwareRev[DEVINFO_FIRMSOFT_REVISION_LEN] = {0}; + +// Hardware Revision String characteristic +static uint8 devInfoHardwareRevProps = GATT_PROP_READ; +static uint8 devInfoHardwareRev[DEVINFO_HARD_REVISION_LEN] = {0, 0}; + +// Software Revision String characteristic +static uint8 devInfoSoftwareRevProps = GATT_PROP_READ; +static uint8 devInfoSoftwareRev[DEVINFO_FIRMSOFT_REVISION_LEN] = {0}; + +// Manufacturer Name String characteristic +static uint8 devInfoMfrNameProps = GATT_PROP_READ; +static const uint8 devInfoMfrName[] = "CDRV"; + +// IEEE 11073-20601 Regulatory Certification Data List characteristic +static uint8 devInfo11073CertProps = GATT_PROP_READ; +static const uint8 devInfo11073Cert[] = +{ + DEVINFO_11073_BODY_EXP, // authoritative body type + 0x00, // authoritative body structure type + // authoritative body data follows below: + 'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l' +}; + +// System ID characteristic +static uint8 devInfoPnpIdProps = GATT_PROP_READ; +static uint8 devInfoPnpId[DEVINFO_PNP_ID_LEN] = +{ + 1, // Vendor ID source (1=Bluetooth SIG) + LO_UINT16(0x000D), HI_UINT16(0x000D), // Vendor ID (Texas Instruments) + LO_UINT16(0x0000), HI_UINT16(0x0000), // Product ID (vendor-specific) + LO_UINT16(0x0110), HI_UINT16(0x0110) // Product version (JJ.M.N) +}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t devInfoAttrTbl[] = +{ + // Device Information Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&devInfoService /* pValue */ + }, + + // System ID Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSystemIdProps + }, + + // System ID Value + { + { ATT_BT_UUID_SIZE, devInfoSystemIdUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSystemId + }, + + // Model Number String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoModelNumberProps + }, + + // Model Number Value + { + { ATT_BT_UUID_SIZE, devInfoModelNumberUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoModelNumber + }, + + // Serial Number String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSerialNumberProps + }, + + // Serial Number Value + { + { ATT_BT_UUID_SIZE, devInfoSerialNumberUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSerialNumber + }, + + // Firmware Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoFirmwareRevProps + }, + + // Firmware Revision Value + { + { ATT_BT_UUID_SIZE, devInfoFirmwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoFirmwareRev + }, + + // Hardware Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoHardwareRevProps + }, + + // Hardware Revision Value + { + { ATT_BT_UUID_SIZE, devInfoHardwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoHardwareRev + }, + + // Software Revision String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoSoftwareRevProps + }, + + // Software Revision Value + { + { ATT_BT_UUID_SIZE, devInfoSoftwareRevUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoSoftwareRev + }, + + // Manufacturer Name String Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoMfrNameProps + }, + + // Manufacturer Name Value + { + { ATT_BT_UUID_SIZE, devInfoMfrNameUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoMfrName + }, + + // IEEE 11073-20601 Regulatory Certification Data List Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfo11073CertProps + }, + + // IEEE 11073-20601 Regulatory Certification Data List Value + { + { ATT_BT_UUID_SIZE, devInfo11073CertUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfo11073Cert + }, + + // PnP ID Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &devInfoPnpIdProps + }, + + // PnP ID Value + { + { ATT_BT_UUID_SIZE, devInfoPnpIdUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) devInfoPnpId + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Device Info Service Callbacks +CONST gattServiceCBs_t devInfoCBs = +{ + devInfo_ReadAttrCB, // Read callback function pointer + NULL, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn DevInfo_AddService + * + * @brief Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t DevInfo_AddService( void ) +{ + // Register GATT attribute list and CBs with GATT Server App + return GATTServApp_RegisterService( devInfoAttrTbl, + GATT_NUM_ATTRS( devInfoAttrTbl ), + &devInfoCBs ); +} + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case DEVINFO_SYSTEM_ID: + osal_memcpy(devInfoSystemId, value, len); + break; + + case DEVINFO_SERIAL_NUMBER: + osal_memcpy(devInfoSerialNumber, value, len); + break; + + case DEVINFO_FIRMWARE_REV: + osal_memcpy(devInfoFirmwareRev, value, len); + break; + + case DEVINFO_HARDWARE_REV: + osal_memcpy(&devInfoHardwareRev, value, len); + break; + + case DEVINFO_SOFTWARE_REV: + osal_memcpy(devInfoSoftwareRev, value, len); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn DevInfo_GetParameter + * + * @brief Get a Device Information parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case DEVINFO_SYSTEM_ID: + osal_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId)); + break; + + case DEVINFO_MODEL_NUMBER: + osal_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber)); + break; + case DEVINFO_SERIAL_NUMBER: + osal_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber)); + break; + + case DEVINFO_FIRMWARE_REV: + osal_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev)); + break; + + case DEVINFO_HARDWARE_REV: + osal_memcpy(value, &devInfoHardwareRev, sizeof(devInfoHardwareRev)); + break; + + case DEVINFO_SOFTWARE_REV: + osal_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev)); + break; + + case DEVINFO_MANUFACTURER_NAME: + osal_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName)); + break; + + case DEVINFO_11073_CERT_DATA: + osal_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert)); + break; + + case DEVINFO_PNP_ID: + osal_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId)); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn devInfo_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch (uuid) + { + case DEVINFO_SYSTEM_ID_UUID: + // verify offset + if (offset >= sizeof(devInfoSystemId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSystemId) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoSystemId[offset], *pLen); + } + break; + + case DEVINFO_MODEL_NUMBER_UUID: + // verify offset + if (offset >= sizeof(devInfoModelNumber)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoModelNumber) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoModelNumber[offset], *pLen); + } + break; + + case DEVINFO_SERIAL_NUMBER_UUID: + // verify offset + if (offset >= sizeof(devInfoSerialNumber)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSerialNumber) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoSerialNumber[offset], *pLen); + } + break; + + case DEVINFO_FIRMWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoFirmwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoFirmwareRev) - offset)); + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case DEVINFO_HARDWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoHardwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoHardwareRev) - offset));; + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case DEVINFO_SOFTWARE_REV_UUID: + // verify offset + if (offset >= sizeof(devInfoSoftwareRev)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoSoftwareRev) - offset)); + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case DEVINFO_MANUFACTURER_NAME_UUID: + // verify offset + if (offset >= sizeof(devInfoMfrName)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoMfrName) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoMfrName[offset], *pLen); + } + break; + + case DEVINFO_11073_CERT_DATA_UUID: + // verify offset + if (offset >= sizeof(devInfo11073Cert)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfo11073Cert) - offset)); + + // copy data + osal_memcpy(pValue, &devInfo11073Cert[offset], *pLen); + } + break; + + case DEVINFO_PNP_ID_UUID: + // verify offset + if (offset >= sizeof(devInfoPnpId)) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN(maxLen, (sizeof(devInfoPnpId) - offset)); + + // copy data + osal_memcpy(pValue, &devInfoPnpId[offset], *pLen); + } + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.h new file mode 100644 index 0000000..0ac5c49 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/DevInfo/devinfoservice.h @@ -0,0 +1,155 @@ +/************************************************************************************************** + Filename: devinfoservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service definitions and + prototypes. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef DEVINFOSERVICE_H +#define DEVINFOSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Device Information Service Parameters +#define DEVINFO_SYSTEM_ID 0 +#define DEVINFO_MODEL_NUMBER 1 +#define DEVINFO_SERIAL_NUMBER 2 +#define DEVINFO_FIRMWARE_REV 3 +#define DEVINFO_HARDWARE_REV 4 +#define DEVINFO_SOFTWARE_REV 5 +#define DEVINFO_MANUFACTURER_NAME 6 +#define DEVINFO_11073_CERT_DATA 7 +#define DEVINFO_PNP_ID 8 + +// Device Information Service UUIDs +#define DEVINFO_SERV_UUID 0x180A // Service UUID +#define DEVINFO_SYSTEM_ID_UUID 0x2A23 // System ID +#define DEVINFO_MODEL_NUMBER_UUID 0x2A24 // Model Number String +#define DEVINFO_SERIAL_NUMBER_UUID 0x2A25 // Serial Number String +#define DEVINFO_FIRMWARE_REV_UUID 0x2A26 // Firmware Revision String +#define DEVINFO_HARDWARE_REV_UUID 0x2A27 // Hardware Revision String +#define DEVINFO_SOFTWARE_REV_UUID 0x2A28 // Software Revision String +#define DEVINFO_MANUFACTURER_NAME_UUID 0x2A29 // Manufacturer Name String +#define DEVINFO_11073_CERT_DATA_UUID 0x2A2A // IEEE 11073-20601 Regulatory Certification Data List +#define DEVINFO_PNP_ID_UUID 0x2A50 // PnP ID + +// IEEE 11073 authoritative body values +#define DEVINFO_11073_BODY_EMPTY 0 +#define DEVINFO_11073_BODY_IEEE 1 +#define DEVINFO_11073_BODY_CONTINUA 2 +#define DEVINFO_11073_BODY_EXP 254 + +// System ID length +#define DEVINFO_SYSTEM_ID_LEN 8 + + // PnP ID length +#define DEVINFO_PNP_ID_LEN 7 + + +#define DEVINFO_SERIAL_NUMBER_LEN 2 +#define DEVINFO_FIRMSOFT_REVISION_LEN 29 +#define DEVINFO_HARD_REVISION_LEN 2 +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * DevInfo_AddService- Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + */ + +extern bStatus_t DevInfo_AddService( void ); + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * DevInfo_GetParameter - Get a Device Information parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t DevInfo_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* DEVINFOSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.c new file mode 100644 index 0000000..182b93f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.c @@ -0,0 +1,559 @@ +/************************************************************************************************** + Filename: gpsprofile.c + Creation: Date: 2015-07-23 + + Description: Gps profile (based on simpleGATT Profile) + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "gpsservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 11 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Simple GATT Profile Service UUID: 0xFFF0 +CONST uint8 gpsServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GPS_SERV_UUID), HI_UINT16(GPS_SERV_UUID) +}; + +// GPS_FEATURES_UUID +CONST uint8 gpsFeaturesUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GPS_FEATURES_UUID), HI_UINT16(GPS_FEATURES_UUID) +}; + +// GPS_LOCATION_AND_SPEED_UUID +CONST uint8 gpsLocationAndSpeedUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GPS_LOCATION_AND_SPEED_UUID), HI_UINT16(GPS_LOCATION_AND_SPEED_UUID) +}; + +// GPS_DATE_TIME_UUID +CONST uint8 gpsDateTimeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GPS_DATE_TIME_UUID), HI_UINT16(GPS_DATE_TIME_UUID) +}; + +// GPS_POSITION_QUALITY_UUID +CONST uint8 gpsPositionQualityUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GPS_POSITION_QUALITY_UUID), HI_UINT16(GPS_POSITION_QUALITY_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Gps Service attribute +static CONST gattAttrType_t gpsService = { ATT_BT_UUID_SIZE, gpsServUUID }; + +// gpsFeatures Properties +static uint8 gpsFeaturesProps = GATT_PROP_READ; + +// gpsFeatures Value +static uint8 gpsFeatures[4] = {0x00, 0x00, 0x60, 0x5D}; + +// gpsLocationAndSpeed Properties +static uint8 gpsLocationAndSpeedProps = GATT_PROP_NOTIFY; + +// gpsLocationAndSpeed Value +static uint8 gpsLocationAndSpeed[17] = {0x00, 0x00, // flags + 0x00, 0x00, // speed + 0x00, 0x00, 0x00, 0x00, // latitude + 0x00, 0x00, 0x00, 0x00, // longitude + 0x00, 0x00, 0x00, // elevation + 0x00, 0x00}; // heading + +static gattCharCfg_t gpsLocationAndSpeedClientCharCfg[GATT_MAX_NUM_CONN]; + +// gpsDateTime Properties +static uint8 gpsDateTimeProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +// gpsDateTime Value +static uint8 gpsDateTime[7] = { 0x00, 0x00, // year + 0x00, // month + 0x00, // day + 0x00, // hours + 0x00, // minutes + 0x00}; // seconds + +static gattCharCfg_t gpsDateTimeClientCharCfg[GATT_MAX_NUM_CONN]; + +// gpsPositionQuality Properties +static uint8 gpsPositionQualityProps = GATT_PROP_READ;// | GATT_PROP_NOTIFY; notifications are excluded + +// gpsPositionQuality Value +static uint8 gpsPositionQuality[16] = {0x00, 0x00, // flags + 0x00, // nb of Beacons in Solution + 0x00, // nb of Beacons in View + 0x00, 0x00, // Time to First Fix + 0x00, 0x00, 0x00, 0x00, // EHPE + 0x00, 0x00, 0x00, 0x00, // EVPE + 0x00, // HDOP + 0x00}; // VDOP + +//static gattCharCfg_t gpsPositionQualityClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t gpsAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Simple Profile Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&gpsService /* pValue */ + }, + + // gpsFeatures Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gpsFeaturesProps + }, + + // gpsFeatures Value + { + { ATT_BT_UUID_SIZE, gpsFeaturesUUID }, + GATT_PERMIT_READ, + 0, + gpsFeatures + }, + + // gpsLocationAndSpeed Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gpsLocationAndSpeedProps + }, + + // gpsLocationAndSpeed Value + { + { ATT_BT_UUID_SIZE, gpsLocationAndSpeedUUID }, + GATT_PERMIT_READ, + 0, + gpsLocationAndSpeed + }, + + // gpsLocationAndSpeed Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gpsLocationAndSpeedClientCharCfg + }, + + // gpsDateTime Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gpsDateTimeProps + }, + + // gpsDateTime Value + { + { ATT_BT_UUID_SIZE, gpsDateTimeUUID }, + GATT_PERMIT_READ, + 0, + gpsDateTime + }, + + // gpsDateTime Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gpsDateTimeClientCharCfg + }, + + // gpsPositionQuality Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gpsPositionQualityProps + }, + + // gpsPositionQuality Value + { + { ATT_BT_UUID_SIZE, gpsPositionQualityUUID }, + GATT_PERMIT_READ, + 0, + gpsPositionQuality + }/*, // Notifications are excluded + + // gpsPositionQuality Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gpsPositionQualityClientCharCfg + }*/ +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gps_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t gps_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void gps_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Gps Profile Service Callbacks +CONST gattServiceCBs_t gpsCBs = +{ + gps_ReadAttrCB, // Read callback function pointer + gps_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Gps_AddService + * + * @brief Initializes the Gps Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Gps_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, gpsLocationAndSpeedClientCharCfg ); + + // Notifications are excluded + //GATTServApp_InitCharCfg( INVALID_CONNHANDLE, gpsPositionQualityClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, gpsDateTimeClientCharCfg ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( gps_HandleConnStatusCB ); + + if ( services & GPS_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( gpsAttrTbl, + GATT_NUM_ATTRS( gpsAttrTbl ), + &gpsCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Gps_SetParameter + * + * @brief Set a Gps Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gps_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GPS_FEATURES: + if ( len == sizeof(gpsFeatures) ) + { + VOID osal_memcpy( gpsFeatures, value, sizeof(gpsFeatures) ); + } + else + { + ret = bleInvalidRange; + } + break; + + case GPS_LOCATION_AND_SPEED: + if ( len == WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE ) + { + VOID osal_memcpy( gpsLocationAndSpeed, value, WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gpsLocationAndSpeedClientCharCfg, gpsLocationAndSpeed, FALSE, + gpsAttrTbl, GATT_NUM_ATTRS( gpsAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case GPS_DATE_TIME: + if ( len == WIMU_GPS_DATE_TIME_PACKET_SIZE ) + { + VOID osal_memcpy( gpsDateTime, value, WIMU_GPS_DATE_TIME_PACKET_SIZE ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gpsDateTimeClientCharCfg, gpsDateTime, FALSE, + gpsAttrTbl, GATT_NUM_ATTRS( gpsAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case GPS_POSITION_QUALITY: + if ( len == WIMU_GPS_POSITION_QUALITY_PACKET_SIZE ) + { + VOID osal_memcpy( gpsPositionQuality, value, WIMU_GPS_POSITION_QUALITY_PACKET_SIZE ); + + // See if Notification has been enabled + // Notifications are excluded (https://developer.bluetooth.org) +/* GATTServApp_ProcessCharCfg( gpsPositionQualityClientCharCfg, gpsPositionQuality, FALSE, + gpsAttrTbl, GATT_NUM_ATTRS( gpsAttrTbl ), + INVALID_TASK_ID );*/ + } + else + { + ret = bleInvalidRange; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Gps_GetParameter + * + * @brief Get a Gps Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gps_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GPS_FEATURES: + osal_memcpy (value, gpsFeatures, sizeof(gpsFeatures) ); + break; + + case GPS_LOCATION_AND_SPEED: + osal_memcpy (value, gpsLocationAndSpeed, WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE ); + break; + + case GPS_DATE_TIME: + osal_memcpy (value, gpsDateTime, WIMU_GPS_DATE_TIME_PACKET_SIZE ); + break; + + case GPS_POSITION_QUALITY: + osal_memcpy (value, gpsPositionQuality, WIMU_GPS_POSITION_QUALITY_PACKET_SIZE ); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn gps_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 gps_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GPS_FEATURES_UUID: + *pLen = 4; + osal_memcpy( pValue, pAttr->pValue, 4 ); + break; + + case GPS_LOCATION_AND_SPEED_UUID: + *pLen = WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE; + osal_memcpy( pValue, pAttr->pValue, WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE ); + break; + + case GPS_DATE_TIME_UUID: + *pLen = WIMU_GPS_DATE_TIME_PACKET_SIZE; + osal_memcpy( pValue, pAttr->pValue, WIMU_GPS_DATE_TIME_PACKET_SIZE ); + break; + + case GPS_POSITION_QUALITY_UUID: + *pLen = WIMU_GPS_POSITION_QUALITY_PACKET_SIZE; + osal_memcpy( pValue, pAttr->pValue, WIMU_GPS_POSITION_QUALITY_PACKET_SIZE ); + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn gps_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t gps_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn gps_HandleConnStatusCB + * + * @brief Gps Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void gps_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, gpsLocationAndSpeedClientCharCfg ); + //GATTServApp_InitCharCfg( connHandle, gpsPositionQualityClientCharCfg ); + GATTServApp_InitCharCfg( connHandle, gpsDateTimeClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.h new file mode 100644 index 0000000..c06a38c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/GPS/gpsservice.h @@ -0,0 +1,100 @@ +/************************************************************************************************** + Filename: gpsprofile.h + Creation: Date: 2015-07-23 + + Description: Gps profile (based on simpleGATT Profile) + +**************************************************************************************************/ + +#ifndef GPSPROFILE_H +#define GPSPROFILE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "wimu_util.h" + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define GPS_FEATURES 0 // R uint32 - Profile gpsFeatures value +#define GPS_LOCATION_AND_SPEED 1 // R struct - Profile locationAndSpeed value +#define GPS_POSITION_QUALITY 2 // R struct - Profile positionQuality value +#define GPS_DATE_TIME 3 // R struct - Profile dateTime value + +// Simple Profile Service UUID +#define GPS_SERV_UUID 0x1819 // Gps service UUID + +#define GPS_FEATURES_UUID 0x2A6A // Gps Features +#define GPS_LOCATION_AND_SPEED_UUID 0x2A67 // Gps Location and Speed Data +#define GPS_DATE_TIME_UUID 0x2A08 // Gps Date Time +#define GPS_POSITION_QUALITY_UUID 0x2A69 // Gps position quality Data + +// Simple Keys Profile Services bit fields +#define GPS_SERVICE 0x00000001 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Gps_AddService- Initializes the Gps Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Gps_AddService( uint32 services ); + +/* + * Gps_SetParameter - Set a Gps Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Gps_GetParameter - Get a Gps Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GPSPROFILE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.c new file mode 100644 index 0000000..fc49456 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.c @@ -0,0 +1,679 @@ +/************************************************************************************************** + Filename: glucservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Glucose sample service + for use with the Glucose sample application. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "glucservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of glucose measurement value in attribute array +#define GLUCOSE_MEAS_VALUE_POS 2 +#define GLUCOSE_MEAS_CONFIG_POS 3 +#define GLUCOSE_CONTEXT_VALUE_POS 5 +#define GLUCOSE_CONTEXT_CONFIG_POS 6 +#define GLUCOSE_CTL_PNT_VALUE_POS 10 +#define GLUCOSE_CTL_PNT_CONFIG_POS 11 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Glucose service +CONST uint8 glucoseServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_SERV_UUID), HI_UINT16(GLUCOSE_SERV_UUID) +}; + +// Glucose characteristic +CONST uint8 glucoseMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_MEAS_UUID), HI_UINT16(GLUCOSE_MEAS_UUID) +}; + +// Glucose Measurement Context +CONST uint8 glucoseContextUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_CONTEXT_UUID), HI_UINT16(GLUCOSE_CONTEXT_UUID) +}; + +// Glucose Feature +CONST uint8 glucoseFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(GLUCOSE_FEATURE_UUID), HI_UINT16(GLUCOSE_FEATURE_UUID) +}; + +// Record Control Point +CONST uint8 recordControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RECORD_CONTROL_POINT_UUID), HI_UINT16(RECORD_CONTROL_POINT_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/* TRUE if record transfer in progress */ +extern bool glucoseSendAllRecords; + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static glucoseServiceCB_t glucoseServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Glucose Service attribute +static CONST gattAttrType_t glucoseService = { ATT_BT_UUID_SIZE, glucoseServUUID }; + +// Glucose Characteristic +static uint8 glucoseProps = GATT_PROP_NOTIFY; +static gattCharCfg_t glucoseMeasConfig[GATT_MAX_NUM_CONN]; +static uint8 glucoseMeas = 0; + +// Measurement Context +static uint8 glucoseContextProps = GATT_PROP_NOTIFY; +static uint8 glucoseContext=0; +static gattCharCfg_t glucoseContextConfig[GATT_MAX_NUM_CONN]; + +// Glucose Feature +static uint8 glucoseFeatureProps = GATT_PROP_READ; +static uint16 glucoseFeature = GLUCOSE_FEAT_ALL; + +// Glucose Control +static uint8 glucoseControlProps = GATT_PROP_INDICATE | GATT_PROP_WRITE; +static uint8 glucoseControl=0; +static gattCharCfg_t glucoseControlConfig[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t glucoseAttrTbl[] = +{ + // Glucose Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&glucoseService /* pValue */ + }, + + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseMeasUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &glucoseMeas + }, + + // 3.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseMeasConfig + }, + + ////////////////////////////////////////////// + // MEASUREMENT CONTEXT + ////////////////////////////////////////////// + + // 4.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseContextProps + }, + + // 5.Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseContextUUID }, + 0, //return READ_NOT_PERMITTED + 0, + &glucoseContext + }, + + // 6.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseContextConfig + }, + + ////////////////////////////////////////////// + // GLUCOSE FEATURE + ////////////////////////////////////////////// + + // 7.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseFeatureProps + }, + + // 8.Characteristic Value + { + { ATT_BT_UUID_SIZE, glucoseFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) &glucoseFeature + }, + + ////////////////////////////////////////////// + // GLUCOSE CONTROL POINT + ////////////////////////////////////////////// + + // 9.Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &glucoseControlProps + }, + + // 10.Characteristic Value + { + { ATT_BT_UUID_SIZE, recordControlPointUUID }, + GATT_PERMIT_WRITE | GATT_PERMIT_AUTHEN_WRITE, + 0, + &glucoseControl + }, + + // 11.Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&glucoseControlConfig + } +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 glucose_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t glucose_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void glucose_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Service Callbacks +CONST gattServiceCBs_t glucoseCBs = +{ + glucose_ReadAttrCB, // Read callback function pointer + glucose_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Glucose_AddService + * + * @brief Initializes the Glucose service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Glucose_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseContextConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, glucoseControlConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( glucose_HandleConnStatusCB ); + + if ( services & GLUCOSE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( glucoseAttrTbl, GATT_NUM_ATTRS( glucoseAttrTbl ), + &glucoseCBs ); + } + return ( status ); +} + +/********************************************************************* + * @fn Glucose_Register + * + * @brief Register a callback function with the Glucose Service. + * + * @param pfnServiceCB - Callback function. + * pfnCtlPntCB - Callback for control point + * + * @return None. + */ +extern void Glucose_Register( glucoseServiceCB_t pfnServiceCB) +{ + glucoseServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Glucose_SetParameter + * + * @brief Set a glucose parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Glucose_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GLUCOSE_FEATURE_PARAM: + glucoseFeature = *((uint16*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Glucose_GetParameter + * + * @brief Get a Glucose parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Glucose_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GLUCOSE_FEATURE_PARAM: + *((uint16*)value) = glucoseFeature; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Glucose_MeasSend + * + * @brief Send a glucose measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Glucose_MeasSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = glucoseAttrTbl[GLUCOSE_MEAS_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleNotReady; +} + + +/********************************************************************* + * @fn Glucose_ContextSend + * + * @brief Send a glucose measurement context. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Glucose_ContextSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseContextConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = glucoseAttrTbl[GLUCOSE_CONTEXT_VALUE_POS].handle; + + // Send the Indication + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleNotReady; +} + +/********************************************************************* + * @fn Glucose_CtlPntIndicate + * + * @brief Send an indication containing a control point + * message. + * + * @param connHandle - connection handle + * @param pInd - pointer to indication structure + * + * @return Success or Failure + */ +bStatus_t Glucose_CtlPntIndicate( uint16 connHandle, attHandleValueInd_t *pInd, uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, glucoseControlConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle + pInd->handle = glucoseAttrTbl[GLUCOSE_CTL_PNT_VALUE_POS].handle; + + // Send the Indication + return GATT_Indication( connHandle, pInd, FALSE, taskId ); + } + + return bleNotReady; +} + +/********************************************************************* + * @fn glucose_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 glucose_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Require security for all characteristics + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ATT_ERR_INSUFFICIENT_ENCRYPT; + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + + case GLUCOSE_FEATURE_UUID: + *pLen = 2; + pValue[0] = LO_UINT16( glucoseFeature ); + pValue[1] = HI_UINT16( glucoseFeature ); + break; + + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + + return ( status ); +} + +/********************************************************************* + * @fn glucose_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t glucose_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + // Require security for all characteristics + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ATT_ERR_INSUFFICIENT_ENCRYPT; + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + + case GATT_CLIENT_CHAR_CFG_UUID: + // Glucose Notifications + if ((pAttr->handle == glucoseAttrTbl[GLUCOSE_MEAS_CONFIG_POS].handle || + pAttr->handle == glucoseAttrTbl[GLUCOSE_CONTEXT_CONFIG_POS].handle)) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + if(pAttr->handle == glucoseAttrTbl[GLUCOSE_MEAS_CONFIG_POS].handle) + { + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_MEAS_NTF_DISABLED : + GLUCOSE_MEAS_NTF_ENABLED, NULL, NULL); + } + else + { + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_CONTEXT_NTF_DISABLED : + GLUCOSE_CONTEXT_NTF_ENABLED, NULL, NULL); + } + } + } + // Glucose Indications + else if ( pAttr->handle == glucoseAttrTbl[GLUCOSE_CTL_PNT_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + (*glucoseServiceCB)((charCfg == 0) ? GLUCOSE_CTL_PNT_IND_DISABLED : + GLUCOSE_CTL_PNT_IND_ENABLED, NULL, NULL); + } + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + break; + + case RECORD_CONTROL_POINT_UUID: + if(len >= GLUCOSE_CTL_PNT_MIN_SIZE && len <= GLUCOSE_CTL_PNT_MAX_SIZE) + { + uint8 opcode = pValue[0]; + + // if transfer in progress + if (opcode != CTL_PNT_OP_ABORT && glucoseSendAllRecords) + { + status = GLUCOSE_ERR_IN_PROGRESS; + } + // if CCC not configured for glucose measurement + else if ( opcode == CTL_PNT_OP_REQ && + !( GATTServApp_ReadCharCfg( connHandle, glucoseMeasConfig ) & GATT_CLIENT_CFG_NOTIFY ) ) + { + status = GLUCOSE_ERR_CCC_CONFIG; + } + else + { + (*glucoseServiceCB)(GLUCOSE_CTL_PNT_CMD, pValue, len); + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn glucose_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void glucose_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, glucoseMeasConfig ); + GATTServApp_InitCharCfg( connHandle, glucoseContextConfig ); + GATTServApp_InitCharCfg( connHandle, glucoseControlConfig ); + } + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.h new file mode 100644 index 0000000..2a2437d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Glucose/glucservice.h @@ -0,0 +1,338 @@ +/************************************************************************************************** + Filename: glucservice.h + Revised: $Date: 2011-12-16 15:46:52 -0800 (Fri, 16 Dec 2011) $ + Revision: $Revision: 58 $ + + Description: This file contains the Glucose service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GLUCOSESERVICE_H +#define GLUCOSESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "OSAL_clock.h" + +/********************************************************************* + * CONSTANTS + */ + +// Glucose Service Parameters +#define GLUCOSE_FEATURE_PARAM 3 + +// Characteristic Value sizes +#define GLUCOSE_CTL_PNT_MIN_SIZE 2 +#define GLUCOSE_CTL_PNT_MAX_SIZE 20 + +// Glucose Service UUIDs +#define GLUCOSE_SERV_UUID 0x1808 +#define GLUCOSE_MEAS_UUID 0x2A18 +#define GLUCOSE_CONTEXT_UUID 0x2A34 +#define GLUCOSE_FEATURE_UUID 0x2A51 +#define RECORD_CONTROL_POINT_UUID 0x2A52 + +// Values for meas flags + +#define GLUCOSE_MEAS_FLAG_TIME_OFFSET 0x01 +#define GLUCOSE_MEAS_FLAG_CONCENTRATION 0x02 +#define GLUCOSE_MEAS_FLAG_UNITS 0x04 +#define GLUCOSE_MEAS_FLAG_STATUS_ANNUNCIATION 0x08 +#define GLUCOSE_MEAS_FLAG_CONTEXT_INFO 0x10 + +#define GLUCOSE_MEAS_FLAG_ALL (GLUCOSE_MEAS_FLAG_TIME_OFFSET | GLUCOSE_MEAS_FLAG_CONCENTRATION | GLUCOSE_MEAS_FLAG_UNITS | GLUCOSE_MEAS_FLAG_STATUS_ANNUNCIATION | GLUCOSE_MEAS_FLAG_CONTEXT_INFO) + +// Values for Type Nibble +#define GLUCOSE_TYPE_CAPILLARY_WHOLE 0x1 +#define GLUCOSE_TYPE_CAPILLARY_PLASMA 0x2 +#define GLUCOSE_TYPE_VENOUS_WHOLE 0x3 +#define GLUCOSE_TYPE_VENOUS_PLASMA 0x4 +#define GLUCOSE_TYPE_ARTERIAL_WHOLE 0x5 +#define GLUCOSE_TYPE_ARTERIAL_PLASMA 0x6 +#define GLUCOSE_TYPE_UNDETER_WHOLE 0x7 +#define GLUCOSE_TYPE_UNDETER_PLASMA 0x8 +#define GLUCOSE_TYPE_ISF 0x9 +#define GLUCOSE_TYPE_CONTROL 0xA + +// Values for Location Nibble +#define GLUCOSE_LOCATION_FINGER 0x10 +#define GLUCOSE_LOCATION_AST 0x20 +#define GLUCOSE_LOCATION_EARLOBE 0x30 +#define GLUCOSE_LOCATION_CONTROL 0x40 +#define GLUCOSE_LOCATION_NOT_AVAIL 0xF0 + +// Values for Annunciation +#define GLUCOSE_ANNUNCIATION_BATT_LOW 0x0001 +#define GLUCOSE_ANNUNCIATION_SENS_BAD 0x0002 +#define GLUCOSE_ANNUNCIATION_SAMP_SIZE 0x0004 +#define GLUCOSE_ANNUNCIATION_INSERT 0x0008 +#define GLUCOSE_ANNUNCIATION_STRIP 0x0010 +#define GLUCOSE_ANNUNCIATION_TOO_HIGH 0x0020 +#define GLUCOSE_ANNUNCIATION_TOO_LOW 0x0040 +#define GLUCOSE_ANNUNCIATION_TEMP_HIGH 0x0080 +#define GLUCOSE_ANNUNCIATION_TEMP_LOW 0x0100 +#define GLUCOSE_ANNUNCIATION_INTERRUPTED 0x0200 +#define GLUCOSE_ANNUNCIATION_GENERAL 0x0400 +#define GLUCOSE_ANNUNCIATION_TIME 0x0800 + +// Values for context flags +#define GLUCOSE_CONTEXT_FLAG_CARBO 0x01 +#define GLUCOSE_CONTEXT_FLAG_MEAL 0x02 +#define GLUCOSE_CONTEXT_FLAG_TESTER_HEALTH 0x04 +#define GLUCOSE_CONTEXT_FLAG_EXERCISE 0x08 +#define GLUCOSE_CONTEXT_FLAG_MEDICATION 0x10 +#define GLUCOSE_CONTEXT_FLAG_MEDICATION_UNITS 0x20 +#define GLUCOSE_CONTEXT_FLAG_HbA1c 0x40 +#define GLUCOSE_CONTEXT_FLAG_EXTENDED 0x80 + +//We leave the extended flags out of this all, since there aren't any in the current spec +#define GLUCOSE_CONTEXT_FLAG_ALL (GLUCOSE_CONTEXT_FLAG_CARBO | GLUCOSE_CONTEXT_FLAG_MEAL | GLUCOSE_CONTEXT_FLAG_TESTER_HEALTH | GLUCOSE_CONTEXT_FLAG_EXERCISE | GLUCOSE_CONTEXT_FLAG_MEDICATION | GLUCOSE_CONTEXT_FLAG_MEDICATION_UNITS | GLUCOSE_CONTEXT_FLAG_HbA1c) + +// Values for Carbohydratea +#define GLUCOSE_CARBO_BREAKFAST 0x01 +#define GLUCOSE_CARBO_LUNCH 0x02 +#define GLUCOSE_CARBO_DINNER 0x03 +#define GLUCOSE_CARBO_SNACK 0x04 +#define GLUCOSE_CARBO_DRINK 0x05 +#define GLUCOSE_CARBO_SUPPER 0x06 +#define GLUCOSE_CARBO_BRUNCH 0x07 + +// Values for Meal +#define GLUCOSE_MEAL_PREPRANDIAL 0x1 +#define GLUCOSE_MEAL_POSTPRANDIAL 0x2 +#define GLUCOSE_MEAL_FASTING 0x3 +#define GLUCOSE_MEAL_CASUAL 0x4 + +// Values for Tester Nibble +#define GLUCOSE_TESTER_SELF 0x1 +#define GLUCOSE_TESTER_PROFESSIONAL 0x2 +#define GLUCOSE_TESTER_LAB_TEST 0x3 +#define GLUCOSE_TESTER_UNAVAILABLE 0xF + +// Values for Health Nibble +#define GLUCOSE_HEALTH_MINOR 0x10 +#define GLUCOSE_HEALTH_MAJOR 0x20 +#define GLUCOSE_HEALTH_MENSES 0x30 +#define GLUCOSE_HEALTH_STRESS 0x40 +#define GLUCOSE_HEALTH_NONE 0x50 +#define GLUCOSE_HEALTH_UNAVAILABLE 0xF0 + +// Values for Medication ID +#define GLUCOSE_MEDICATION_RAPID 0x1 +#define GLUCOSE_MEDICATION_SHORT 0x2 +#define GLUCOSE_MEDICATION_INTERMEDIATE 0x3 +#define GLUCOSE_MEDICATION_LONG 0x4 +#define GLUCOSE_MEDICATION_PRE_MIXED 0x5 + +// Values for Glucose Features +#define GLUCOSE_FEAT_LOW_BAT_SUP 0x0001 +#define GLUCOSE_FEAT_MALFUNC_SUP 0x0002 +#define GLUCOSE_FEAT_SAMPLE_SIZE_SUP 0x0004 +#define GLUCOSE_FEAT_INSERT_ERR_SUP 0x0008 +#define GLUCOSE_FEAT_TYPE_ERR_SUP 0x0010 +#define GLUCOSE_FEAT_RESULT_DET_SUP 0x0020 +#define GLUCOSE_FEAT_TEMP_DET_SUP 0x0040 +#define GLUCOSE_FEAT_READ_INT_SUP 0x0080 +#define GLUCOSE_FEAT_GENERAL_FAULT_SUP 0x0100 +#define GLUCOSE_FEAT_TIME_FAULT_SUP 0x0200 +#define GLUCOSE_FEAT_MULTIPLE_BOND_SUP 0x0400 + +#define GLUCOSE_FEAT_ALL (GLUCOSE_FEAT_LOW_BAT_SUP | GLUCOSE_FEAT_MALFUNC_SUP | GLUCOSE_FEAT_SAMPLE_SIZE_SUP | \ + GLUCOSE_FEAT_INSERT_ERR_SUP | GLUCOSE_FEAT_TYPE_ERR_SUP | GLUCOSE_FEAT_RESULT_DET_SUP | \ + GLUCOSE_FEAT_TEMP_DET_SUP | GLUCOSE_FEAT_READ_INT_SUP | GLUCOSE_FEAT_GENERAL_FAULT_SUP | \ + GLUCOSE_FEAT_TIME_FAULT_SUP | GLUCOSE_FEAT_MULTIPLE_BOND_SUP) + +// Glucose Service bit fields +#define GLUCOSE_SERVICE 0x00000001 + +//Record Control Point values +#define CTL_PNT_OP_REQ 0x01 +#define CTL_PNT_OP_CLR 0x02 +#define CTL_PNT_OP_ABORT 0x03 +#define CTL_PNT_OP_GET_NUM 0x04 +#define CTL_PNT_OP_NUM_RSP 0x05 +#define CTL_PNT_OP_REQ_RSP 0x06 + +//Record Control Point operator +#define CTL_PNT_OPER_NULL 0x00 +#define CTL_PNT_OPER_ALL 0x01 +#define CTL_PNT_OPER_LESS_EQUAL 0x02 +#define CTL_PNT_OPER_GREATER_EQUAL 0x03 +#define CTL_PNT_OPER_RANGE 0x04 +#define CTL_PNT_OPER_FIRST 0x05 +#define CTL_PNT_OPER_LAST 0x06 + +//Record Control Point Response Codes +#define CTL_PNT_RSP_SUCCESS 0x01 +#define CTL_PNT_RSP_OPCODE_NOT_SUPPORTED 0x02 +#define CTL_PNT_RSP_OPER_INVALID 0x03 +#define CTL_PNT_RSP_OPER_NOT_SUPPORTED 0x04 +#define CTL_PNT_RSP_OPERAND_INVALID 0x05 +#define CTL_PNT_RSP_NO_RECORDS 0x06 +#define CTL_PNT_RSP_ABORT_FAILED 0x07 +#define CTL_PNT_RSP_PROC_NOT_CMPL 0x08 +#define CTL_PNT_RSP_FILTER_NOT_SUPPORTED 0x09 + +//Record Control Point Filter Types +#define CTL_PNT_FILTER_SEQNUM 0x01 +#define CTL_PNT_FILTER_TIME 0x02 + +// Callback events +#define GLUCOSE_MEAS_NTF_ENABLED 1 +#define GLUCOSE_MEAS_NTF_DISABLED 2 +#define GLUCOSE_CONTEXT_NTF_ENABLED 3 +#define GLUCOSE_CONTEXT_NTF_DISABLED 4 +#define GLUCOSE_CTL_PNT_IND_ENABLED 5 +#define GLUCOSE_CTL_PNT_IND_DISABLED 6 +#define GLUCOSE_CTL_PNT_CMD 7 + +// Procedure timeout in ms +#define GLUCOSE_PROCEDURE_TIMEOUT 30000 + +// ATT status values +#define GLUCOSE_ERR_IN_PROGRESS 0x80 +#define GLUCOSE_ERR_CCC_CONFIG 0x81 + +/********************************************************************* + * TYPEDEFS + */ + +// Glucose Service callback function +typedef void (*glucoseServiceCB_t)(uint8 event, uint8* data, uint8 dataLen); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Glucose_AddService- Initializes the Glucose service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t Glucose_AddService( uint32 services ); + +/* + * Glucose_Register - Register a callback function with the + * Glucose Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void Glucose_Register( glucoseServiceCB_t pfnServiceCB); + +/* + * Glucose_SetParameter - Set a Glucose parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Glucose_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Glucose_GetParameter - Get a Glucose parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Glucose_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Glucose_MeasSend + * + * @brief Send a glucose measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_MeasSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Glucose_ContextSend + * + * @brief Send a glucose measurement context. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_ContextSend( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Glucose_CtlPntIndicate + * + * @brief Send an indication containing a glucose + * measurement. + * + * @param connHandle - connection handle + * @param pInd - pointer to indication structure + * + * @return Success or Failure + */ +extern bStatus_t Glucose_CtlPntIndicate( uint16 connHandle, attHandleValueInd_t *pInd, uint8 taskId ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GLUCOSESERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hid_uuid.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hid_uuid.h new file mode 100644 index 0000000..595f01f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hid_uuid.h @@ -0,0 +1,89 @@ +/************************************************************************************************** + Filename: hid_uuid.h + Revised: $Date: 2012-01-26 13:42:33 -0800 (Thu, 26 Jan 2012) $ + Revision: $Revision: 64 $ + + Description: This file contains UUIDs for the HID service. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HID_UUID_H +#define HID_UUID_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * CONSTANTS + */ + +/* HID service */ +#define HID_SERVICE_UUID 0x1812 + +/* HID characteristics */ +#define HID_BOOT_KEY_INPUT_UUID 0x2A22 // HID Boot Keyboard Input Report +#define HID_BOOT_KEY_OUTPUT_UUID 0x2A32 // HID Boot Keyboard Output Report +#define HID_BOOT_MOUSE_INPUT_UUID 0x2A33 // HID Boot Mouse Input Report +#define HID_INFORMATION_UUID 0x2A4A // HID Information +#define HID_REPORT_MAP_UUID 0x2A4B // HID Report Map +#define HID_CONTROL_POINT_UUID 0x2A4C // HID Control Point +#define HID_REPORT_UUID 0x2A4D // HID Report +#define HID_PROTOCOL_MODE_UUID 0x2A4E // HID Protocol Mode + +/* HID information flags */ +#define HID_FLAGS_REMOTE_WAKE 0x01 // RemoteWake +#define HID_FLAGS_NORMALLY_CONNECTABLE 0x02 // NormallyConnectable + +/* Control point commands */ +#define HID_CMD_SUSPEND 0x00 // Suspend +#define HID_CMD_EXIT_SUSPEND 0x01 // Exit Suspend + +/* HID protocol mode values */ +#define HID_PROTOCOL_MODE_BOOT 0x00 // Boot Protocol Mode +#define HID_PROTOCOL_MODE_REPORT 0x01 // Report Protocol Mode + +/* Attribute value lengths */ +#define HID_PROTOCOL_MODE_LEN 1 // HID Protocol Mode +#define HID_INFORMATION_LEN 4 // HID Information +#define HID_REPORT_REF_LEN 2 // HID Report Reference Descriptor +#define HID_EXT_REPORT_REF_LEN 2 // External Report Reference Descriptor + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HID_UUID_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.c new file mode 100644 index 0000000..a575465 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.c @@ -0,0 +1,1406 @@ +/************************************************************************************************** + Filename: hiddev.c + + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the common HID Device profile + for use with the CC2540 Bluetooth Low Energy Protocol Stack. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ + +#include "bcomdef.h" +#include "OSAL.h" +#include "OnBoard.h" +#include "gatt.h" +#include "hci.h" +#include "gapgattserver.h" +#include "gattservapp.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "peripheral.h" +#include "gapbondmgr.h" +#include "devinfoservice.h" +#include "battservice.h" +#include "scanparamservice.h" +#include "hiddev.h" + +/********************************************************************* + * MACROS + */ + +// Battery measurement period in ms +#define DEFAULT_BATT_PERIOD 15000 + +// TRUE to run scan parameters refresh notify test +#define DEFAULT_SCAN_PARAM_NOTIFY_TEST TRUE + +// Advertising intervals (units of 625us, 160=100ms) +#define HID_INITIAL_ADV_INT_MIN 48 +#define HID_INITIAL_ADV_INT_MAX 80 +#define HID_HIGH_ADV_INT_MIN 32 +#define HID_HIGH_ADV_INT_MAX 48 +#define HID_LOW_ADV_INT_MIN 1600 +#define HID_LOW_ADV_INT_MAX 1600 + +// Advertising timeouts in sec +#define HID_INITIAL_ADV_TIMEOUT 60 +#define HID_HIGH_ADV_TIMEOUT 5 +#define HID_LOW_ADV_TIMEOUT 0 + +// Heart Rate Task Events +#define START_DEVICE_EVT 0x0001 +#define BATT_PERIODIC_EVT 0x0002 +#define HID_IDLE_EVT 0x0004 +#define HID_SEND_REPORT_EVT 0x0008 + +#define reportQEmpty() ( firstQIdx == lastQIdx ) + +/********************************************************************* + * CONSTANTS + */ + +#define HID_DEV_DATA_LEN 8 + +#ifdef HID_DEV_RPT_QUEUE_LEN + #define HID_DEV_REPORT_Q_SIZE (HID_DEV_RPT_QUEUE_LEN+1) +#else + #define HID_DEV_REPORT_Q_SIZE (10+1) +#endif + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 id; + uint8 type; + uint8 len; + uint8 data[HID_DEV_DATA_LEN]; +} hidDevReport_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Task ID +uint8 hidDevTaskId; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// GAP State +static gaprole_States_t hidDevGapState = GAPROLE_INIT; + +// TRUE if connection is secure +static uint8 hidDevConnSecure = FALSE; + +// GAP connection handle +static uint16 gapConnHandle; + +// TRUE if pairing in progress +static uint8 hidDevPairingStarted = FALSE; + +// Status of last pairing +static uint8 pairingStatus = SUCCESS; + +static hidRptMap_t *pHidDevRptTbl; + +static uint8 hidDevRptTblLen; + +static hidDevCB_t *pHidDevCB; + +static hidDevCfg_t *pHidDevCfg; + +// Whether to change to the preferred connection parameters +static uint8 updateConnParams = TRUE; + +// Pending reports +static uint8 firstQIdx = 0; +static uint8 lastQIdx = 0; +static hidDevReport_t hidDevReportQ[HID_DEV_REPORT_Q_SIZE]; + +// Last report sent out +static attHandleValueNoti_t lastNoti = { 0 }; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static void hidDev_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void hidDevProcessGattMsg( gattMsgEvent_t *pMsg ); +static void hidDevDisconnected( void ); +static void hidDevGapStateCB( gaprole_States_t newState ); +static void hidDevPairStateCB( uint16 connHandle, uint8 state, uint8 status ); +static void hidDevPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); +static void hidDevBattCB( uint8 event ); +static void hidDevScanParamCB( uint8 event ); +static void hidDevBattPeriodicTask( void ); +static hidRptMap_t *hidDevRptByHandle( uint16 handle ); +static hidRptMap_t *hidDevRptById( uint8 id, uint8 type ); +static hidRptMap_t *hidDevRptByCccdHandle( uint16 handle ); +static void hidDevEnqueueReport( uint8 id, uint8 type, uint8 len, uint8 *pData ); +static hidDevReport_t *hidDevDequeueReport( void ); +static void hidDevSendReport( uint8 id, uint8 type, uint8 len, uint8 *pData ); +static void hidDevHighAdvertising( void ); +static void hidDevLowAdvertising( void ); +static void hidDevInitialAdvertising( void ); +static uint8 hidDevBondCount( void ); +static void hidDevStartIdleTimer( void ); +static void hidDevStopIdleTimer( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// GAP Role Callbacks +static gapRolesCBs_t hidDev_PeripheralCBs = +{ + hidDevGapStateCB, // Profile State Change Callbacks + NULL // When a valid RSSI is read from controller +}; + +// Bond Manager Callbacks +static const gapBondCBs_t hidDevBondCB = +{ + hidDevPasscodeCB, + hidDevPairStateCB +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +void HidDev_Init( uint8 task_id ) +{ + hidDevTaskId = task_id; + + // Setup the GAP Bond Manager + { + uint8 syncWL = TRUE; + + // If a bond is created, the HID Device should write the address of the + // HID Host in the HID Device controller's white list and set the HID + // Device controller's advertising filter policy to 'process scan and + // connection requests only from devices in the White List'. + VOID GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_WL, sizeof( uint8 ), &syncWL ); + } + + // Set up services + GGS_AddService( GATT_ALL_SERVICES ); // GAP + GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes + DevInfo_AddService( ); + Batt_AddService( ); + ScanParam_AddService( ); + + // Register for Battery service callback + Batt_Register( hidDevBattCB ); + + // Register for Scan Parameters service callback + ScanParam_Register( hidDevScanParamCB ); + + // Setup a delayed profile startup + osal_set_event( hidDevTaskId, START_DEVICE_EVT ); +} + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ) +{ + + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( hidDevTaskId )) != NULL ) + { + hidDev_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & START_DEVICE_EVT ) + { + // Start the Device + VOID GAPRole_StartDevice( &hidDev_PeripheralCBs ); + + // Register with bond manager after starting device + GAPBondMgr_Register( (gapBondCBs_t *) &hidDevBondCB ); + + return ( events ^ START_DEVICE_EVT ); + } + + if ( events & HID_IDLE_EVT ) + { + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // if pairing in progress then restart timer + if ( hidDevPairingStarted ) + { + hidDevStartIdleTimer(); + } + // else disconnect + else + { + GAPRole_TerminateConnection(); + } + } + + return ( events ^ HID_IDLE_EVT ); + } + + if ( events & BATT_PERIODIC_EVT ) + { + // Perform periodic battery task + hidDevBattPeriodicTask(); + + return ( events ^ BATT_PERIODIC_EVT ); + } + + if ( events & HID_SEND_REPORT_EVT ) + { + // if connection is secure + if ( hidDevConnSecure ) + { + hidDevReport_t *pReport = hidDevDequeueReport(); + + if ( pReport != NULL ) + { + // Send report + hidDevSendReport( pReport->id, pReport->type, pReport->len, pReport->data ); + } + + return ( reportQEmpty() ? events ^ HID_SEND_REPORT_EVT : events ); + } + + return ( events ^ HID_SEND_REPORT_EVT ); + } + + return 0; +} + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ) +{ + pHidDevCB = pCBs; + pHidDevCfg = pCfg; +} + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ) +{ + pHidDevRptTbl = pRpt; + hidDevRptTblLen = numReports; +} + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8*pData ) +{ + // if connected + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // if connection is secure + if ( hidDevConnSecure ) + { + // Make sure there're no pending reports + if ( reportQEmpty() ) + { + // send report + hidDevSendReport( id, type, len, pData ); + + return; // we're done + } + } + } + // else if not already advertising + else if ( hidDevGapState != GAPROLE_ADVERTISING ) + { + // if bonded + if ( hidDevBondCount() > 0 ) + { + // start high duty cycle advertising + hidDevHighAdvertising(); + } + // else not bonded + else + { + // start initial advertising + hidDevInitialAdvertising(); + } + } + + // hidDev task will send report when secure connection is established + hidDevEnqueueReport( id, type, len, pData ); +} + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +void HidDev_Close( void ) +{ + uint8 param; + + // if connected then disconnect + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + GAPRole_TerminateConnection(); + } + // else stop advertising + else + { + param = FALSE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); + } +} + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HIDDEV_ERASE_ALLBONDS: + if ( len == 0 ) + { + // See if the last report sent out wasn't a release key + if ( osal_isbufset( lastNoti.value, 0x00, lastNoti.len ) == FALSE ) + { + // Send a release report before disconnecting, otherwise + // the last pressed key would get 'stuck' on the HID Host. + osal_memset( lastNoti.value, 0x00, lastNoti.len ); + + GATT_Notification( gapConnHandle, &lastNoti, FALSE ); + } + + // Drop connection + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + GAPRole_TerminateConnection(); + } + + // Flush report queue + firstQIdx = lastQIdx = 0; + + // Erase bonding info + GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, NULL ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HidDev_GetParameter( uint8 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +void HidDev_PasscodeRsp( uint8 status, uint32 passcode ) +{ + // Send passcode response + GAPBondMgr_PasscodeRsp( gapConnHandle, status, passcode ); +} + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + hidRptMap_t *pRpt; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + // Only report map is long + if ( offset > 0 && uuid != HID_REPORT_MAP_UUID ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( uuid == HID_REPORT_UUID || + uuid == HID_BOOT_KEY_INPUT_UUID || + uuid == HID_BOOT_KEY_OUTPUT_UUID || + uuid == HID_BOOT_MOUSE_INPUT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // find report ID in table + if ( (pRpt = hidDevRptByHandle(pAttr->handle)) != NULL ) + { + // execute report callback + status = (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, uuid, + HID_DEV_OPER_READ, pLen, pValue ); + } + else + { + *pLen = 0; + } + } + else if ( uuid == HID_REPORT_MAP_UUID ) + { + // verify offset + if ( offset >= hidReportMapLen ) + { + status = ATT_ERR_INVALID_OFFSET; + } + else + { + // determine read length + *pLen = MIN( maxLen, (hidReportMapLen - offset) ); + + // copy data + osal_memcpy( pValue, pAttr->pValue + offset, *pLen ); + } + } + else if ( uuid == HID_INFORMATION_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + *pLen = HID_INFORMATION_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_INFORMATION_LEN ); + } + else if ( uuid == GATT_REPORT_REF_UUID ) + { + *pLen = HID_REPORT_REF_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_REPORT_REF_LEN ); + } + else if ( uuid == HID_PROTOCOL_MODE_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + *pLen = HID_PROTOCOL_MODE_LEN; + pValue[0] = pAttr->pValue[0]; + } + else if ( uuid == GATT_EXT_REPORT_REF_UUID ) + { + *pLen = HID_EXT_REPORT_REF_LEN; + osal_memcpy( pValue, pAttr->pValue, HID_EXT_REPORT_REF_LEN ); + } + + // restart idle timer + if ( status == SUCCESS ) + { + hidDevStartIdleTimer(); + } + + return ( status ); +} + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + hidRptMap_t *pRpt; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if ( uuid == HID_REPORT_UUID || + uuid == HID_BOOT_KEY_OUTPUT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // find report ID in table + if ((pRpt = hidDevRptByHandle(pAttr->handle)) != NULL) + { + // execute report callback + status = (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, uuid, + HID_DEV_OPER_WRITE, &len, pValue ); + } + } + else if ( uuid == HID_CONTROL_POINT_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + // Validate length and value range + if ( len == 1 ) + { + if ( pValue[0] == HID_CMD_SUSPEND || pValue[0] == HID_CMD_EXIT_SUSPEND ) + { + // execute HID app event callback + (*pHidDevCB->evtCB)( (pValue[0] == HID_CMD_SUSPEND) ? + HID_DEV_SUSPEND_EVT : HID_DEV_EXIT_SUSPEND_EVT ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( uuid == GATT_CLIENT_CHAR_CFG_UUID ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + // find report ID in table + if ( (pRpt = hidDevRptByCccdHandle(pAttr->handle)) != NULL ) + { + // execute report callback + (*pHidDevCB->reportCB)( pRpt->id, pRpt->type, uuid, + (charCfg == GATT_CLIENT_CFG_NOTIFY) ? + HID_DEV_OPER_ENABLE : HID_DEV_OPER_DISABLE, + &len, pValue ); + } + } + } + else if ( uuid == HID_PROTOCOL_MODE_UUID ) + { + // require encryption + if ( hidDevConnSecure == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + if ( len == HID_PROTOCOL_MODE_LEN ) + { + if ( pValue[0] == HID_PROTOCOL_MODE_BOOT || + pValue[0] == HID_PROTOCOL_MODE_REPORT ) + { + pAttr->pValue[0] = pValue[0]; + + // execute HID app event callback + (*pHidDevCB->evtCB)( (pValue[0] == HID_PROTOCOL_MODE_BOOT) ? + HID_DEV_SET_BOOT_EVT : HID_DEV_SET_REPORT_EVT ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + + // restart idle timer + if (status == SUCCESS) + { + hidDevStartIdleTimer(); + } + + return ( status ); +} + +/********************************************************************* + * @fn hidDev_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void hidDev_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GATT_MSG_EVENT: + hidDevProcessGattMsg( (gattMsgEvent_t *) pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn hidDevProcessGattMsg + * + * @brief Process GATT messages + * + * @return none + */ +static void hidDevProcessGattMsg( gattMsgEvent_t *pMsg ) +{ + +} + +/********************************************************************* + * @fn hidDevHandleConnStatusCB + * + * @brief Reset client char config. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void hidDevHandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + uint16 retHandle; + gattAttribute_t *pAttr; + + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->cccdHandle != 0 ) + { + if ( (pAttr = GATT_FindHandle(p->cccdHandle, &retHandle)) != NULL ) + { + GATTServApp_InitCharCfg( connHandle, (gattCharCfg_t *) pAttr->pValue ); + } + } + } + } + } +} + +/********************************************************************* + * @fn hidDevDisconnected + * + * @brief Handle disconnect. + * + * @return none + */ +static void hidDevDisconnected( void ) +{ + // Stop idle timer + hidDevStopIdleTimer(); + + // Reset client characteristic configuration descriptors + Batt_HandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + ScanParam_HandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + hidDevHandleConnStatusCB( gapConnHandle, LINKDB_STATUS_UPDATE_REMOVED ); + + // Reset state variables + hidDevConnSecure = FALSE; + hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + hidDevPairingStarted = FALSE; + + // Reset last report sent out + osal_memset( &lastNoti, 0, sizeof( attHandleValueNoti_t ) ); + + // if bonded and normally connectable start advertising + if ( ( hidDevBondCount() > 0 ) && + ( pHidDevCfg->hidFlags & HID_FLAGS_NORMALLY_CONNECTABLE ) ) + { + hidDevLowAdvertising(); + } +} + +/********************************************************************* + * @fn hidDevGapStateCB + * + * @brief Notification from the profile of a state change. + * + * @param newState - new state + * + * @return none + */ +static void hidDevGapStateCB( gaprole_States_t newState ) +{ + // if connected + if ( newState == GAPROLE_CONNECTED ) + { + // get connection handle + GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle ); + + // connection not secure yet + hidDevConnSecure = FALSE; + + // don't start advertising when connection is closed + uint8 param = FALSE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); + + // start idle timer + hidDevStartIdleTimer(); + } + // if disconnected + else if ( hidDevGapState == GAPROLE_CONNECTED && + newState != GAPROLE_CONNECTED ) + { + hidDevDisconnected(); + updateConnParams = TRUE; + + if ( pairingStatus == SMP_PAIRING_FAILED_CONFIRM_VALUE ) + { + // bonding failed due to mismatched confirm values + hidDevInitialAdvertising(); + + pairingStatus = SUCCESS; + } + } + // if started + else if ( newState == GAPROLE_STARTED ) + { + // nothing to do for now! + } + + hidDevGapState = newState; +} + +/********************************************************************* + * @fn hidDevPairStateCB + * + * @brief Pairing state callback. + * + * @return none + */ +static void hidDevPairStateCB( uint16 connHandle, uint8 state, uint8 status ) +{ + if ( state == GAPBOND_PAIRING_STATE_STARTED ) + { + hidDevPairingStarted = TRUE; + } + else if ( state == GAPBOND_PAIRING_STATE_COMPLETE ) + { + hidDevPairingStarted = FALSE; + + if ( status == SUCCESS ) + { + hidDevConnSecure = TRUE; + } + + pairingStatus = status; + } + else if ( state == GAPBOND_PAIRING_STATE_BONDED ) + { + if ( status == SUCCESS ) + { + hidDevConnSecure = TRUE; + +#if DEFAULT_SCAN_PARAM_NOTIFY_TEST == TRUE + ScanParam_RefreshNotify( gapConnHandle ); +#endif + } + } + + if ( !reportQEmpty() && hidDevConnSecure ) + { + // Notify our task to send out pending reports + osal_set_event( hidDevTaskId, HID_SEND_REPORT_EVT ); + } +} + +/********************************************************************* + * @fn hidDevPasscodeCB + * + * @brief Passcode callback. + * + * @param deviceAddr - address of device to pair with, and could be either public or random. + * @param connectionHandle - connection handle + * @param uiInputs - pairing User Interface Inputs - Ask user to input passcode + * @param uiOutputs - pairing User Interface Outputs - Display passcode + * + * @return none + */ +static void hidDevPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ) +{ + if ( pHidDevCB && pHidDevCB->passcodeCB ) + { + // execute HID app passcode callback + (*pHidDevCB->passcodeCB)( deviceAddr, connectionHandle, uiInputs, uiOutputs ); + } + else + { + // Send passcode response + GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, 0 ); + } +} + +/********************************************************************* + * @fn hidDevBattCB + * + * @brief Callback function for battery service. + * + * @param event - service event + * + * @return none + */ +static void hidDevBattCB( uint8 event ) +{ + if ( event == BATT_LEVEL_NOTI_ENABLED ) + { + // if connected start periodic measurement + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + osal_start_timerEx( hidDevTaskId, BATT_PERIODIC_EVT, DEFAULT_BATT_PERIOD ); + } + } + else if ( event == BATT_LEVEL_NOTI_DISABLED ) + { + // stop periodic measurement + osal_stop_timerEx( hidDevTaskId, BATT_PERIODIC_EVT ); + } +} + +/********************************************************************* + * @fn hidDevScanParamCB + * + * @brief Callback function for scan parameter service. + * + * @param event - service event + * + * @return none + */ +static void hidDevScanParamCB( uint8 event ) +{ + +} + +/********************************************************************* + * @fn hidDevBattPeriodicTask + * + * @brief Perform a periodic task for battery measurement. + * + * @param none + * + * @return none + */ +static void hidDevBattPeriodicTask( void ) +{ + if ( hidDevGapState == GAPROLE_CONNECTED ) + { + // perform battery level check + Batt_MeasLevel( ); + + // Restart timer + osal_start_timerEx( hidDevTaskId, BATT_PERIODIC_EVT, DEFAULT_BATT_PERIOD ); + } +} + +/********************************************************************* + * @fn hidDevRptByHandle + * + * @brief Find the HID report structure for the given handle. + * + * @param handle - ATT handle + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptByHandle( uint16 handle ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->handle == handle && p->mode == hidProtocolMode) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevRptByCccdHandle + * + * @brief Find the HID report structure for the given CCC handle. + * + * @param handle - ATT handle + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptByCccdHandle( uint16 handle ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->cccdHandle == handle) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevRptById + * + * @brief Find the HID report structure for the Report ID and type. + * + * @param id - HID report ID + * @param type - HID report type + * + * @return Pointer to HID report structure + */ +static hidRptMap_t *hidDevRptById( uint8 id, uint8 type ) +{ + uint8 i; + hidRptMap_t *p = pHidDevRptTbl; + + for ( i = hidDevRptTblLen; i > 0; i--, p++ ) + { + if ( p->id == id && p->type == type && p->mode == hidProtocolMode ) + { + return p; + } + } + + return NULL; +} + +/********************************************************************* + * @fn hidDevSendReport + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static void hidDevSendReport( uint8 id, uint8 type, uint8 len, uint8 *pData ) +{ + hidRptMap_t *pRpt; + gattAttribute_t *pAttr; + uint16 retHandle; + + // get att handle for report + if ( (pRpt = hidDevRptById(id, type)) != NULL ) + { + // if notifications are enabled + if ( (pAttr = GATT_FindHandle(pRpt->cccdHandle, &retHandle)) != NULL ) + { + uint16 value; + + value = GATTServApp_ReadCharCfg( gapConnHandle, (gattCharCfg_t *) pAttr->pValue ); + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // After service discovery and encryption, the HID Device should request to + // change to the preferred connection parameters that best suit its use case. + if ( updateConnParams ) + { + GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_REQ, sizeof( uint8 ), &updateConnParams ); + updateConnParams = FALSE; + } + + // send notification + lastNoti.handle = pRpt->handle; + lastNoti.len = len; + osal_memcpy(lastNoti.value, pData, len); + + GATT_Notification( gapConnHandle, &lastNoti, FALSE ); + + // start idle timer + hidDevStartIdleTimer(); + } + } + } +} + +/********************************************************************* + * @fn hidDevEnqueueReport + * + * @brief Enqueue a HID report to be sent later. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static void hidDevEnqueueReport( uint8 id, uint8 type, uint8 len, uint8 *pData ) +{ + // Enqueue only if bonded + if ( hidDevBondCount() > 0 ) + { + // Update last index + lastQIdx = ( lastQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + + if ( lastQIdx == firstQIdx ) + { + // Queue overflow; discard oldest report + firstQIdx = ( firstQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + } + + // Save report + hidDevReportQ[lastQIdx].id = id; + hidDevReportQ[lastQIdx].type = type; + hidDevReportQ[lastQIdx].len = len; + osal_memcpy( hidDevReportQ[lastQIdx].data, pData, len ); + + if ( hidDevConnSecure ) + { + // Notify our task to send out pending reports + osal_set_event( hidDevTaskId, HID_SEND_REPORT_EVT ); + } + } +} + +/********************************************************************* + * @fn hidDevDequeueReport + * + * @brief Dequeue a HID report to be sent out. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +static hidDevReport_t *hidDevDequeueReport( void ) +{ + if ( reportQEmpty() ) + { + return NULL; + } + + // Update first index + firstQIdx = ( firstQIdx + 1 ) % HID_DEV_REPORT_Q_SIZE; + + return ( &(hidDevReportQ[firstQIdx]) ); +} + +/********************************************************************* + * @fn hidDevHighAdvertising + * + * @brief Start advertising at a high duty cycle. + + * @param None. + * + * @return None. + */ +static void hidDevHighAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_HIGH_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_HIGH_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_HIGH_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_WHITE; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevLowAdvertising + * + * @brief Start advertising at a low duty cycle. + * + * @param None. + * + * @return None. + */ +static void hidDevLowAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_LOW_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_LOW_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_LOW_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_WHITE; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + VOID GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevInitialAdvertising + * + * @brief Start advertising for initial connection + * + * @return None. + */ +static void hidDevInitialAdvertising( void ) +{ + uint8 param; + + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, HID_INITIAL_ADV_INT_MIN ); + VOID GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, HID_INITIAL_ADV_INT_MAX ); + VOID GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, HID_INITIAL_ADV_TIMEOUT ); + + // Setup adverstising filter policy first + param = GAP_FILTER_POLICY_ALL; + VOID GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), ¶m ); + + param = TRUE; + VOID GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), ¶m ); +} + +/********************************************************************* + * @fn hidDevBondCount + * + * @brief Gets the total number of bonded devices. + * + * @param None. + * + * @return number of bonded devices. + */ +static uint8 hidDevBondCount( void ) +{ + uint8 bondCnt = 0; + + VOID GAPBondMgr_GetParameter( GAPBOND_BOND_COUNT, &bondCnt ); + + return ( bondCnt ); +} + +/********************************************************************* + * @fn hidDevStartIdleTimer + * + * @brief Start the idle timer. + * + * @return None. + */ +static void hidDevStartIdleTimer( void ) +{ + if ( pHidDevCfg->idleTimeout > 0 ) + { + osal_start_timerEx( hidDevTaskId, HID_IDLE_EVT, pHidDevCfg->idleTimeout ); + } +} + +/********************************************************************* + * @fn hidDevStopIdleTimer + * + * @brief Stop the idle timer. + * + * @return None. + */ +static void hidDevStopIdleTimer( void ) +{ + osal_stop_timerEx( hidDevTaskId, HID_IDLE_EVT ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.h new file mode 100644 index 0000000..ebf6878 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDev/hiddev.h @@ -0,0 +1,451 @@ +/************************************************************************************************** + Filename: hiddev.h + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the common HID Device profile. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDDEV_H +#define HIDDEV_H + +#include "hid_uuid.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// HID Device Parameters +#define HIDDEV_ERASE_ALLBONDS 0 // Erase all of the bonded devices. Write Only. No Size. + +// HID read/write operation +#define HID_DEV_OPER_WRITE 0 // Write operation +#define HID_DEV_OPER_READ 1 // Read operation +#define HID_DEV_OPER_ENABLE 2 // Notification enabled for report ID +#define HID_DEV_OPER_DISABLE 3 // Notifications disabled for report ID + +// HID callback events +#define HID_DEV_SUSPEND_EVT 0 // HID suspend +#define HID_DEV_EXIT_SUSPEND_EVT 1 // HID exit suspend +#define HID_DEV_SET_BOOT_EVT 2 // HID set boot mode +#define HID_DEV_SET_REPORT_EVT 3 // HID set report mode + +/* HID Report type */ +#define HID_REPORT_TYPE_INPUT 1 +#define HID_REPORT_TYPE_OUTPUT 2 +#define HID_REPORT_TYPE_FEATURE 3 + +// HID Keyboard/Keypad Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#define HID_KEYBOARD_RESERVED 0 // 0x00 - No event inidicated +#define HID_KEYBOARD_A 4 // 0x04 - Keyboard a and A +#define HID_KEYBOARD_B 5 // 0x05 - Keyboard b and B +#define HID_KEYBOARD_C 6 // 0x06 - Keyboard c and C +#define HID_KEYBOARD_D 7 // 0x07 - Keyboard d and D +#define HID_KEYBOARD_E 8 // 0x08 - Keyboard e and E +#define HID_KEYBOARD_F 9 // 0x09 - Keyboard f and F +#define HID_KEYBOARD_G 10 // 0x0A - Keyboard g and G +#define HID_KEYBOARD_H 11 // 0x0B - Keyboard h and H +#define HID_KEYBOARD_I 12 // 0x0C - Keyboard i and I +#define HID_KEYBOARD_J 13 // 0x0D - Keyboard j and J +#define HID_KEYBOARD_K 14 // 0x0E - Keyboard k and K +#define HID_KEYBOARD_L 15 // 0x0F - Keyboard l and L +#define HID_KEYBOARD_M 16 // 0x10 - Keyboard m and M +#define HID_KEYBOARD_N 17 // 0x11 - Keyboard n and N +#define HID_KEYBOARD_O 18 // 0x12 - Keyboard o and O +#define HID_KEYBOARD_P 19 // 0x13 - Keyboard p and p +#define HID_KEYBOARD_Q 20 // 0x14 - Keyboard q and Q +#define HID_KEYBOARD_R 21 // 0x15 - Keyboard r and R +#define HID_KEYBOARD_S 22 // 0x16 - Keyboard s and S +#define HID_KEYBOARD_T 23 // 0x17 - Keyboard t and T +#define HID_KEYBOARD_U 24 // 0x18 - Keyboard u and U +#define HID_KEYBOARD_V 25 // 0x19 - Keyboard v and V +#define HID_KEYBOARD_W 26 // 0x1A - Keyboard w and W +#define HID_KEYBOARD_X 27 // 0x1B - Keyboard x and X +#define HID_KEYBOARD_Y 28 // 0x1C - Keyboard y and Y +#define HID_KEYBOARD_Z 29 // 0x1D - Keyboard z and Z +#define HID_KEYBOARD_1 30 // 0x1E - Keyboard 1 and ! +#define HID_KEYBOARD_2 31 // 0x1F - Keyboard 2 and @ +#define HID_KEYBOARD_3 32 // 0x20 - Keyboard 3 and # +#define HID_KEYBOARD_4 33 // 0x21 - Keyboard 4 and % +#define HID_KEYBOARD_5 34 // 0x22 - Keyboard 5 and % +#define HID_KEYBOARD_6 35 // 0x23 - Keyboard 6 and ^ +#define HID_KEYBOARD_7 36 // 0x24 - Keyboard 7 and & +#define HID_KEYBOARD_8 37 // 0x25 - Keyboard 8 and * +#define HID_KEYBOARD_9 38 // 0x26 - Keyboard 9 and ( +#define HID_KEYBOARD_0 39 // 0x27 - Keyboard 0 and ) +#define HID_KEYBOARD_RETURN 40 // 0x28 - Keyboard Return (ENTER) +#define HID_KEYBOARD_ESCAPE 41 // 0x29 - Keyboard ESCAPE +#define HID_KEYBOARD_DELETE 42 // 0x2A - Keyboard DELETE (Backspace) +#define HID_KEYBOARD_TAB 43 // 0x2B - Keyboard Tab +#define HID_KEYBOARD_SPACEBAR 44 // 0x2C - Keyboard Spacebar +#define HID_KEYBOARD_MINUS 45 // 0x2D - Keyboard - and (underscore) +#define HID_KEYBOARD_EQUAL 46 // 0x2E - Keyboard = and + +#define HID_KEYBOARD_LEFT_BRKT 47 // 0x2F - Keyboard [ and { +#define HID_KEYBOARD_RIGHT_BRKT 48 // 0x30 - Keyboard ] and } +#define HID_KEYBOARD_BACK_SLASH 49 // 0x31 - Keyboard \ and | +#define HID_KEYBOARD_SEMI_COLON 51 // 0x33 - Keyboard ; and : +#define HID_KEYBOARD_SGL_QUOTE 52 // 0x34 - Keyboard ' and " +#define HID_KEYBOARD_GRV_ACCENT 53 // 0x35 - Keyboard Grave Accent and Tilde +#define HID_KEYBOARD_COMMA 54 // 0x36 - Keyboard , and < +#define HID_KEYBOARD_DOT 55 // 0x37 - Keyboard . and > +#define HID_KEYBOARD_FWD_SLASH 56 // 0x38 - Keyboard / and ? +#define HID_KEYBOARD_CAPS_LOCK 57 // 0x39 - Keyboard Caps Lock +#define HID_KEYBOARD_F1 58 // 0x3A - Keyboard F1 +#define HID_KEYBOARD_F2 59 // 0x3B - Keyboard F2 +#define HID_KEYBOARD_F3 60 // 0x3C - Keyboard F3 +#define HID_KEYBOARD_F4 61 // 0x3D - Keyboard F4 +#define HID_KEYBOARD_F5 62 // 0x3E - Keyboard F5 +#define HID_KEYBOARD_F6 63 // 0x3F - Keyboard F6 +#define HID_KEYBOARD_F7 64 // 0x40 - Keyboard F7 +#define HID_KEYBOARD_F8 65 // 0x41 - Keyboard F8 +#define HID_KEYBOARD_F9 66 // 0x42 - Keyboard F9 +#define HID_KEYBOARD_F10 67 // 0x43 - Keyboard F10 +#define HID_KEYBOARD_F11 68 // 0x44 - Keyboard F11 +#define HID_KEYBOARD_F12 69 // 0x45 - Keyboard F12 +#define HID_KEYBOARD_PRNT_SCREEN 70 // 0x46 - Keyboard Print Screen +#define HID_KEYBOARD_SCROLL_LOCK 71 // 0x47 - Keyboard Scroll Lock +#define HID_KEYBOARD_PAUSE 72 // 0x48 - Keyboard Pause +#define HID_KEYBOARD_INSERT 73 // 0x49 - Keyboard Insert +#define HID_KEYBOARD_HOME 74 // 0x4A - Keyboard Home +#define HID_KEYBOARD_PAGE_UP 75 // 0x4B - Keyboard PageUp +#define HID_KEYBOARD_DELETE_FWD 76 // 0x4C - Keyboard Delete Forward +#define HID_KEYBOARD_END 77 // 0x4D - Keyboard End +#define HID_KEYBOARD_PAGE_DOWN 78 // 0x4E - Keyboard PageDown +#define HID_KEYBOARD_RIGHT_ARROW 79 // 0x4F - Keyboard RightArrow +#define HID_KEYBOARD_LEFT_ARROW 80 // 0x50 - Keyboard LeftArrow +#define HID_KEYBOARD_DOWN_ARROW 81 // 0x51 - Keyboard DownArrow +#define HID_KEYBOARD_UP_ARROW 82 // 0x52 - Keyboard UpArrow +#define HID_KEYBPAD_NUM_LOCK 83 // 0x53 - Keypad Num Lock and Clear +#define HID_KEYBPAD_DIVIDE 84 // 0x54 - Keypad / +#define HID_KEYBOARD_MULTIPLY 85 // 0x55 - Keypad * +#define HID_KEYBOARD_SUBTRACT 86 // 0x56 - Keypad - +#define HID_KEYBPAD_ADD 87 // 0x57 - Keypad + +#define HID_KEYBPAD_ENTER 88 // 0x58 - Keypad ENTER +#define HID_KEYBPAD_1 89 // 0x59 - Keypad 1 and End +#define HID_KEYBPAD_2 90 // 0x5A - Keypad 2 and Down Arrow +#define HID_KEYBPAD_3 91 // 0x5B - Keypad 3 and PageDn +#define HID_KEYBPAD_4 92 // 0x5C - Keypad 4 and Lfet Arrow +#define HID_KEYBPAD_5 93 // 0x5D - Keypad 5 +#define HID_KEYBPAD_6 94 // 0x5E - Keypad 6 and Right Arrow +#define HID_KEYBPAD_7 95 // 0x5F - Keypad 7 and Home +#define HID_KEYBPAD_8 96 // 0x60 - Keypad 8 and Up Arrow +#define HID_KEYBPAD_9 97 // 0x61 - Keypad 9 and PageUp +#define HID_KEYBPAD_0 98 // 0x62 - Keypad 0 and Insert +#define HID_KEYBPAD_DOT 99 // 0x63 - Keypad . and Delete +#define HID_KEYBOARD_MUTE 127 // 0x7F - Keyboard Mute +#define HID_KEYBOARD_VOLUME_UP 128 // 0x80 - Keyboard Volume up +#define HID_KEYBOARD_VOLUME_DOWN 129 // 0x81 - Keyboard Volume down +#define HID_KEYBOARD_LEFT_CTRL 224 // 0xE0 - Keyboard LeftContorl +#define HID_KEYBOARD_LEFT_SHIFT 225 // 0xE1 - Keyboard LeftShift +#define HID_KEYBOARD_LEFT_ALT 226 // 0xE2 - Keyboard LeftAlt +#define HID_KEYBOARD_LEFT_GUI 227 // 0xE3 - Keyboard LeftGUI +#define HID_KEYBOARD_RIGHT_CTRL 228 // 0xE4 - Keyboard LeftContorl +#define HID_KEYBOARD_RIGHT_SHIFT 229 // 0xE5 - Keyboard LeftShift +#define HID_KEYBOARD_RIGHT_ALT 230 // 0xE6 - Keyboard LeftAlt +#define HID_KEYBOARD_RIGHT_GUI 231 // 0xE7 - Keyboard RightGUI + +#define HID_MOUSE_BUTTON_LEFT 253 +#define HID_MOUSE_BUTTON_MIDDLE 254 +#define HID_MOUSE_BUTTON_RIGHT 255 + +// HID Consumer Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#define HID_CONSUMER_POWER 48 // 0x30 - Power +#define HID_CONSUMER_RESET 49 // 0x31 - Reset +#define HID_CONSUMER_SLEEP 50 // 0x32 - Sleep + +#define HID_CONSUMER_MENU 64 // 0x40 - Menu +#define HID_CONSUMER_SELECTION 128 // 0x80 - Selection +#define HID_CONSUMER_ASSIGN_SEL 129 // 0x81 - Assign Selection +#define HID_CONSUMER_MODE_STEP 130 // 0x82 - Mode Step +#define HID_CONSUMER_RECALL_LAST 131 // 0x83 - Recall Last +#define HID_CONSUMER_QUIT 148 // 0x94 - Quit +#define HID_CONSUMER_HELP 149 // 0x95 - Help +#define HID_CONSUMER_CHANNEL_UP 156 // 0x9C - Channel Increment +#define HID_CONSUMER_CHANNEL_DOWN 157 // 0x9D - Channel Decrement + +#define HID_CONSUMER_PLAY 176 // 0xB0 - Play +#define HID_CONSUMER_PAUSE 177 // 0xB1 - Pause +#define HID_CONSUMER_RECORD 178 // 0xB2 - Record +#define HID_CONSUMER_FAST_FORWARD 179 // 0xB3 - Fast Forward +#define HID_CONSUMER_REWIND 180 // 0xB4 - Rewind +#define HID_CONSUMER_SCAN_NEXT_TRK 181 // 0xB5 - Scan Next Track +#define HID_CONSUMER_SCAN_PREV_TRK 182 // 0xB6 - Scan Previous Track +#define HID_CONSUMER_STOP 183 // 0xB7 - Stop +#define HID_CONSUMER_EJECT 184 // 0xB8 - Eject +#define HID_CONSUMER_RANDOM_PLAY 185 // 0xB9 - Random Play +#define HID_CONSUMER_SELECT_DISC 186 // 0xBA - Select Disk +#define HID_CONSUMER_ENTER_DISC 187 // 0xBB - Enter Disc +#define HID_CONSUMER_REPEAT 188 // 0xBC - Repeat +#define HID_CONSUMER_STOP_EJECT 204 // 0xCC - Stop/Eject +#define HID_CONSUMER_PLAY_PAUSE 205 // 0xCD - Play/Pause +#define HID_CONSUMER_PLAY_SKIP 206 // 0xCE - Play/Skip + +#define HID_CONSUMER_VOLUME 224 // 0xE0 - Volume +#define HID_CONSUMER_BALANCE 225 // 0xE1 - Balance +#define HID_CONSUMER_MUTE 226 // 0xE2 - Mute +#define HID_CONSUMER_BASS 227 // 0xE3 - Bass +#define HID_CONSUMER_VOLUME_UP 233 // 0xE9 - Volume Increment +#define HID_CONSUMER_VOLUME_DOWN 234 // 0xEA - Volume Decrement + +/********************************************************************* + * TYPEDEFS + */ + +// HID report mapping table +typedef struct +{ + uint16 handle; // Handle of report characteristic + uint16 cccdHandle; // Handle of CCCD for report characteristic + uint8 id; // Report ID + uint8 type; // Report type + uint8 mode; // Protocol mode (report or boot) +} hidRptMap_t; + +// HID dev configuration structure +typedef struct +{ + uint32 idleTimeout; // Idle timeout in milliseconds + uint8 hidFlags; // HID feature flags + +} hidDevCfg_t; + +/********************************************************************* + * Global Variables + */ + +// These variables are defined in the service .c file that uses HID Dev + +// HID report map length +extern uint8 hidReportMapLen; + +// HID protocol mode +extern uint8 hidProtocolMode; + +/********************************************************************* + * Profile Callbacks + */ + +// HID Report callback +typedef uint8 (*hidDevReportCB_t)( uint8 id, uint8 type, uint16 uuid, + uint8 oper, uint8 *pLen, uint8 *pData ); + +// HID event callback +typedef void (*hidDevEvtCB_t)( uint8 evt ); + +// HID passcode callback +typedef void (*hidDevPasscodeCB_t)( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); + +typedef struct +{ + hidDevReportCB_t reportCB; + hidDevEvtCB_t evtCB; + hidDevPasscodeCB_t passcodeCB; +} hidDevCB_t; + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +extern void HidDev_Init( uint8 task_id ); + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pCBs - Callback function. + * + * @return None. + */ +extern void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ); + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +extern void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ); + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +extern void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8 *pData ); + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +extern void HidDev_Close( void ); + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_GetParameter( uint8 param, void *pValue ); + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +extern void HidDev_PasscodeRsp( uint8 status, uint32 passcode ); + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDDEV_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.c new file mode 100644 index 0000000..bda3761 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.c @@ -0,0 +1,956 @@ +/************************************************************************************************** + Filename: hidkbmservice.c + Revised: $Date: 2012-05-29 15:29:05 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30647 $ + + Description: This file contains the HID service for a keyboard/mouse. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "gattservapp.h" +#include "hidkbmservice.h" +#include "hid_uuid.h" +#include "hiddev.h" +#include "battservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// HID service +CONST uint8 hidServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_SERVICE_UUID), HI_UINT16(HID_SERVICE_UUID) +}; + +// HID Boot Keyboard Input Report characteristic +CONST uint8 hidBootKeyInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_INPUT_UUID), HI_UINT16(HID_BOOT_KEY_INPUT_UUID) +}; + +// HID Boot Mouse Input Report characteristic +CONST uint8 hidBootMouseInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_MOUSE_INPUT_UUID), HI_UINT16(HID_BOOT_MOUSE_INPUT_UUID) +}; + +// HID Boot Keyboard Output Report characteristic +CONST uint8 hidBootKeyOutputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_OUTPUT_UUID), HI_UINT16(HID_BOOT_KEY_OUTPUT_UUID) +}; + +// HID Information characteristic +CONST uint8 hidInfoUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_INFORMATION_UUID), HI_UINT16(HID_INFORMATION_UUID) +}; + +// HID Report Map characteristic +CONST uint8 hidReportMapUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_MAP_UUID), HI_UINT16(HID_REPORT_MAP_UUID) +}; + +// HID Control Point characteristic +CONST uint8 hidControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_CONTROL_POINT_UUID), HI_UINT16(HID_CONTROL_POINT_UUID) +}; + +// HID Report characteristic +CONST uint8 hidReportUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_UUID), HI_UINT16(HID_REPORT_UUID) +}; + +// HID Protocol Mode characteristic +CONST uint8 hidProtocolModeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_PROTOCOL_MODE_UUID), HI_UINT16(HID_PROTOCOL_MODE_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// HID Information characteristic value +static CONST uint8 hidInfo[HID_INFORMATION_LEN] = +{ + LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) + 0x00, // bCountryCode + HID_KBD_FLAGS // Flags +}; + +// HID Report Map characteristic value +// Keyboard report descriptor (using format for Boot interface descriptor) +static CONST uint8 hidReportMap[] = +{ + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report Id (1) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Buttons) + 0x19, 0x01, // Usage Minimum (01) - Button 1 + 0x29, 0x03, // Usage Maximum (03) - Button 3 + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x03, // Report Count (3) + 0x81, 0x02, // Input (Data, Variable, Absolute) - Button states + 0x75, 0x05, // Report Size (5) + 0x95, 0x01, // Report Count (1) + 0x81, 0x01, // Input (Constant) - Padding or Reserved bits + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x38, // Usage (Wheel) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x03, // Report Count (3) + 0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate + 0xC0, // End Collection + 0xC0, // End Collection + + 0x05, 0x01, // Usage Pg (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection: (Application) + 0x85, 0x02, // Report Id (2) + // + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0xE0, // Usage Min (224) + 0x29, 0xE7, // Usage Max (231) + 0x15, 0x00, // Log Min (0) + 0x25, 0x01, // Log Max (1) + // + // Modifier byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input: (Data, Variable, Absolute) + // + // Reserved byte + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input: (Constant) + // + // LED report + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Pg (LEDs) + 0x19, 0x01, // Usage Min (1) + 0x29, 0x05, // Usage Max (5) + 0x91, 0x02, // Output: (Data, Variable, Absolute) + // + // LED report padding + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output: (Constant) + // + // Key arrays (6 bytes) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Log Min (0) + 0x25, 0x65, // Log Max (101) + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0x00, // Usage Min (0) + 0x29, 0x65, // Usage Max (101) + 0x81, 0x00, // Input: (Data, Array) + // + 0xC0, // End Collection + // + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x01, // Usage (Consumer Control) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x03, // Report Id (3) + 0x09, 0x02, // Usage (Numeric Key Pad) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x0A, // Usage Max (Button 10) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0A, // Logical Max (10) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x86, // Usage (Channel) + 0x15, 0xFF, // Logical Min (-1) + 0x25, 0x01, // Logical Max (1) + 0x75, 0x02, // Report Size (2) + 0x95, 0x01, // Report Count (1) + 0x81, 0x46, // Input (Data, Var, Rel, Null) + 0x09, 0xE9, // Usage (Volume Up) + 0x09, 0xEA, // Usage (Volume Down) + 0x15, 0x00, // Logical Min (0) + 0x75, 0x01, // Report Size (1) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data, Var, Abs) + 0x09, 0xE2, // Usage (Mute) + 0x09, 0x30, // Usage (Power) + 0x09, 0x83, // Usage (Recall Last) + 0x09, 0x81, // Usage (Assign Selection) + 0x09, 0xB0, // Usage (Play) + 0x09, 0xB1, // Usage (Pause) + 0x09, 0xB2, // Usage (Record) + 0x09, 0xB3, // Usage (Fast Forward) + 0x09, 0xB4, // Usage (Rewind) + 0x09, 0xB5, // Usage (Scan Next) + 0x09, 0xB6, // Usage (Scan Prev) + 0x09, 0xB7, // Usage (Stop) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0C, // Logical Max (12) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0x09, 0x80, // Usage (Selection) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x03, // Usage Max (Button 3) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x03, // Logical Max (3) + 0x75, 0x02, // Report Size (2) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x81, 0x03, // Input (Const, Var, Abs) + 0xC0 // End Collection +}; + +// HID report map length +uint8 hidReportMapLen = sizeof(hidReportMap); + +// HID report mapping table +static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; + +/********************************************************************* + * Profile Attributes - variables + */ + +// HID Service attribute +static CONST gattAttrType_t hidService = { ATT_BT_UUID_SIZE, hidServUUID }; + +// Include attribute (Battery service) +static uint16 include = GATT_INVALID_HANDLE; + +// HID Information characteristic +static uint8 hidInfoProps = GATT_PROP_READ; + +// HID Report Map characteristic +static uint8 hidReportMapProps = GATT_PROP_READ; + +// HID External Report Reference Descriptor +static uint8 hidExtReportRefDesc[ATT_BT_UUID_SIZE] = + { LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) }; + +// HID Control Point characteristic +static uint8 hidControlPointProps = GATT_PROP_WRITE_NO_RSP; +static uint8 hidControlPoint; + +// HID Protocol Mode characteristic +static uint8 hidProtocolModeProps = GATT_PROP_READ | GATT_PROP_WRITE_NO_RSP; +uint8 hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + +// HID Report characteristic, mouse input +static uint8 hidReportMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportMouseIn; +static gattCharCfg_t hidReportMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, mouse input +static uint8 hidReportRefMouseIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_MOUSE_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, key input +static uint8 hidReportKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportKeyIn; +static gattCharCfg_t hidReportKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, key input +static uint8 hidReportRefKeyIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, consumer control input +static uint8 hidReportCCInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportCCIn; +static gattCharCfg_t hidReportCCInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, consumer control input +static uint8 hidReportRefCCIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_CC_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, LED output +static uint8 hidReportLedOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportLedOut; + +// HID Report Reference characteristic descriptor, LED output +static uint8 hidReportRefLedOut[HID_REPORT_REF_LEN] = + { HID_RPT_ID_LED_OUT, HID_REPORT_TYPE_OUTPUT }; + +// HID Boot Keyboard Input Report +static uint8 hidReportBootKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootKeyIn; +static gattCharCfg_t hidReportBootKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Boot Keyboard Output Report +static uint8 hidReportBootKeyOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportBootKeyOut; + +// HID Boot Mouse Input Report +static uint8 hidReportBootMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootMouseIn; +static gattCharCfg_t hidReportBootMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Report +static uint8 hidReportFeatureProps = GATT_PROP_READ | GATT_PROP_WRITE; +static uint8 hidReportFeature; + +// HID Report Reference characteristic descriptor, Feature +static uint8 hidReportRefFeature[HID_REPORT_REF_LEN] = + { HID_RPT_ID_FEATURE, HID_REPORT_TYPE_FEATURE }; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t hidAttrTbl[] = +{ + // HID Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *) &hidService /* pValue */ + }, + + // Included service (battery) + { + { ATT_BT_UUID_SIZE, includeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&include + }, + + // HID Information characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidInfoProps + }, + + // HID Information characteristic + { + { ATT_BT_UUID_SIZE, hidInfoUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidInfo + }, + + // HID Control Point characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidControlPointProps + }, + + // HID Control Point characteristic + { + { ATT_BT_UUID_SIZE, hidControlPointUUID }, + GATT_PERMIT_WRITE, + 0, + &hidControlPoint + }, + + // HID Protocol Mode characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidProtocolModeProps + }, + + // HID Protocol Mode characteristic + { + { ATT_BT_UUID_SIZE, hidProtocolModeUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidProtocolMode + }, + + + // HID Report Map characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMapProps + }, + + // HID Report Map characteristic + { + { ATT_BT_UUID_SIZE, hidReportMapUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidReportMap + }, + + // HID External Report Reference Descriptor + { + { ATT_BT_UUID_SIZE, extReportRefUUID }, + GATT_PERMIT_READ, + 0, + hidExtReportRefDesc + }, + + // HID Report characteristic, mouse input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMouseInProps + }, + + // HID Report characteristic, mouse input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMouseIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportMouseInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, mouse input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefMouseIn + }, + + // HID Report characteristic, key input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyInProps + }, + + // HID Report characteristic, key input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportKeyInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, key input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefKeyIn + }, + + // HID Report characteristic, consumer control input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportCCInProps + }, + + // HID Report characteristic, consumer control input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportCCIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportCCInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, consumer control input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefCCIn + }, + + // HID Report characteristic, LED output declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportLedOutProps + }, + + // HID Report characteristic, LED output + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportLedOut + }, + + // HID Report Reference characteristic descriptor, LED output + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefLedOut + }, + + // HID Boot Keyboard Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyInProps + }, + + // HID Boot Keyboard Input Report + { + { ATT_BT_UUID_SIZE, hidBootKeyInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyIn + }, + + // HID Boot Keyboard Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootKeyInClientCharCfg + }, + + // HID Boot Keyboard Output Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyOutProps + }, + + // HID Boot Keyboard Output Report + { + { ATT_BT_UUID_SIZE, hidBootKeyOutputUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportBootKeyOut + }, + + // HID Boot Mouse Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseInProps + }, + + // HID Boot Mouse Input Report + { + { ATT_BT_UUID_SIZE, hidBootMouseInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseIn + }, + + // HID Boot Mouse Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootMouseInClientCharCfg + }, + + // Feature Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportFeatureProps + }, + + // Feature Report + { + { ATT_BT_UUID_SIZE, hidReportUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportFeature + }, + + // HID Report Reference characteristic descriptor, feature + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefFeature + }, +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + HID_SERVICE_IDX, // HID Service + HID_INCLUDED_SERVICE_IDX, // Included Service + HID_INFO_DECL_IDX, // HID Information characteristic declaration + HID_INFO_IDX, // HID Information characteristic + HID_CONTROL_POINT_DECL_IDX, // HID Control Point characteristic declaration + HID_CONTROL_POINT_IDX, // HID Control Point characteristic + HID_PROTOCOL_MODE_DECL_IDX, // HID Protocol Mode characteristic declaration + HID_PROTOCOL_MODE_IDX, // HID Protocol Mode characteristic + HID_REPORT_MAP_DECL_IDX, // HID Report Map characteristic declaration + HID_REPORT_MAP_IDX, // HID Report Map characteristic + HID_EXT_REPORT_REF_DESC_IDX, // HID External Report Reference Descriptor + HID_REPORT_MOUSE_IN_DECL_IDX, // HID Report characteristic, mouse input declaration + HID_REPORT_MOUSE_IN_IDX, // HID Report characteristic, mouse input + HID_REPORT_MOUSE_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_MOUSE_IN_IDX, // HID Report Reference characteristic descriptor, mouse input + HID_REPORT_KEY_IN_DECL_IDX, // HID Report characteristic, key input declaration + HID_REPORT_KEY_IN_IDX, // HID Report characteristic, key input + HID_REPORT_KEY_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_KEY_IN_IDX, // HID Report Reference characteristic descriptor, key input + HID_REPORT_CC_IN_DECL_IDX, // HID Report characteristic, consumer control input declaration + HID_REPORT_CC_IN_IDX, // HID Report characteristic, consumer control input + HID_REPORT_CC_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_CC_IN_IDX, // HID Report Reference characteristic descriptor, consumer control input + HID_REPORT_LED_OUT_DECL_IDX, // HID Report characteristic, LED output declaration + HID_REPORT_LED_OUT_IDX, // HID Report characteristic, LED output + HID_REPORT_REF_LED_OUT_IDX, // HID Report Reference characteristic descriptor, LED output + HID_BOOT_KEY_IN_DECL_IDX, // HID Boot Keyboard Input Report declaration + HID_BOOT_KEY_IN_IDX, // HID Boot Keyboard Input Report + HID_BOOT_KEY_IN_CCCD_IDX, // HID Boot Keyboard Input Report characteristic client characteristic configuration + HID_BOOT_KEY_OUT_DECL_IDX, // HID Boot Keyboard Output Report declaration + HID_BOOT_KEY_OUT_IDX, // HID Boot Keyboard Output Report + HID_BOOT_MOUSE_IN_DECL_IDX, // HID Boot Mouse Input Report declaration + HID_BOOT_MOUSE_IN_IDX, // HID Boot Mouse Input Report + HID_BOOT_MOUSE_IN_CCCD_IDX, // HID Boot Mouse Input Report characteristic client characteristic configuration + HID_FEATURE_DECL_IDX, // Feature Report declaration + HID_FEATURE_IDX, // Feature Report + HID_REPORT_REF_FEATURE_IDX // HID Report Reference characteristic descriptor, feature +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t hidKbdMsCBs = +{ + HidDev_ReadAttrCB, // Read callback function pointer + HidDev_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbM_AddService + * + * @brief Initializes the HID Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t HidKbM_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportMouseInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportCCInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootMouseInClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( hidAttrTbl, GATT_NUM_ATTRS( hidAttrTbl ), &hidKbdMsCBs ); + + // Set up included service + Batt_GetParameter( BATT_PARAM_SERVICE_HANDLE, + &GATT_INCLUDED_HANDLE( hidAttrTbl, HID_INCLUDED_SERVICE_IDX ) ); + + // Construct map of reports to characteristic handles + // Each report is uniquely identified via its ID and type + + // Mouse input report + hidRptMap[0].id = hidReportRefMouseIn[0]; + hidRptMap[0].type = hidReportRefMouseIn[1]; + hidRptMap[0].handle = hidAttrTbl[HID_REPORT_MOUSE_IN_IDX].handle; + hidRptMap[0].cccdHandle = hidAttrTbl[HID_REPORT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[0].mode = HID_PROTOCOL_MODE_REPORT; + + // Key input report + hidRptMap[1].id = hidReportRefKeyIn[0]; + hidRptMap[1].type = hidReportRefKeyIn[1]; + hidRptMap[1].handle = hidAttrTbl[HID_REPORT_KEY_IN_IDX].handle; + hidRptMap[1].cccdHandle = hidAttrTbl[HID_REPORT_KEY_IN_CCCD_IDX].handle; + hidRptMap[1].mode = HID_PROTOCOL_MODE_REPORT; + + // Consumer Control input report + hidRptMap[2].id = hidReportRefCCIn[0]; + hidRptMap[2].type = hidReportRefCCIn[1]; + hidRptMap[2].handle = hidAttrTbl[HID_REPORT_CC_IN_IDX].handle; + hidRptMap[2].cccdHandle = hidAttrTbl[HID_REPORT_CC_IN_CCCD_IDX].handle; + hidRptMap[2].mode = HID_PROTOCOL_MODE_REPORT; + + // LED output report + hidRptMap[3].id = hidReportRefLedOut[0]; + hidRptMap[3].type = hidReportRefLedOut[1]; + hidRptMap[3].handle = hidAttrTbl[HID_REPORT_LED_OUT_IDX].handle; + hidRptMap[3].cccdHandle = 0; + hidRptMap[3].mode = HID_PROTOCOL_MODE_REPORT; + + // Boot keyboard input report + // Use same ID and type as key input report + hidRptMap[4].id = hidReportRefKeyIn[0]; + hidRptMap[4].type = hidReportRefKeyIn[1]; + hidRptMap[4].handle = hidAttrTbl[HID_BOOT_KEY_IN_IDX].handle; + hidRptMap[4].cccdHandle = hidAttrTbl[HID_BOOT_KEY_IN_CCCD_IDX].handle; + hidRptMap[4].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot keyboard output report + // Use same ID and type as LED output report + hidRptMap[5].id = hidReportRefLedOut[0]; + hidRptMap[5].type = hidReportRefLedOut[1]; + hidRptMap[5].handle = hidAttrTbl[HID_BOOT_KEY_OUT_IDX].handle; + hidRptMap[5].cccdHandle = 0; + hidRptMap[5].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot mouse input report + // Use same ID and type as mouse input report + hidRptMap[6].id = hidReportRefMouseIn[0]; + hidRptMap[6].type = hidReportRefMouseIn[1]; + hidRptMap[6].handle = hidAttrTbl[HID_BOOT_MOUSE_IN_IDX].handle; + hidRptMap[6].cccdHandle = hidAttrTbl[HID_BOOT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[6].mode = HID_PROTOCOL_MODE_BOOT; + + // Feature report + hidRptMap[7].id = hidReportRefFeature[0]; + hidRptMap[7].type = hidReportRefFeature[1]; + hidRptMap[7].handle = hidAttrTbl[HID_FEATURE_IDX].handle; + hidRptMap[7].cccdHandle = 0; + hidRptMap[7].mode = HID_PROTOCOL_MODE_REPORT; + + // Battery level input report + VOID Batt_GetParameter( BATT_PARAM_BATT_LEVEL_IN_REPORT, &(hidRptMap[8]) ); + + // Setup report ID map + HidDev_RegisterReports( HID_NUM_REPORTS, hidRptMap ); + + return ( status ); +} + +/********************************************************************* + * @fn HidKbM_SetParameter + * + * @brief Set a HID KbM parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param len - length of data to right. + * @param pValue - pointer to data to write. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +uint8 HidKbM_SetParameter( uint8 id, uint8 type, uint16 uuid, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( uuid ) + { + case HID_REPORT_UUID: + if ( type == HID_REPORT_TYPE_OUTPUT ) + { + if ( len == 1 ) + { + hidReportLedOut = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( type == HID_REPORT_TYPE_FEATURE ) + { + if ( len == 1 ) + { + hidReportFeature = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + ret = ATT_ERR_ATTR_NOT_FOUND; + } + break; + + case HID_BOOT_KEY_OUTPUT_UUID: + if ( len == 1 ) + { + hidReportBootKeyOut = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + default: + // ignore the request + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidKbM_GetParameter + * + * @brief Get a HID KbM parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param pLen - length of data to be read + * @param pValue - pointer to data to get. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +uint8 HidKbM_GetParameter( uint8 id, uint8 type, uint16 uuid, uint8 *pLen, void *pValue ) +{ + switch ( uuid ) + { + case HID_REPORT_UUID: + if ( type == HID_REPORT_TYPE_OUTPUT ) + { + *((uint8 *)pValue) = hidReportLedOut; + *pLen = 1; + } + else if ( type == HID_REPORT_TYPE_FEATURE ) + { + *((uint8 *)pValue) = hidReportFeature; + *pLen = 1; + } + else + { + *pLen = 0; + } + break; + + case HID_BOOT_KEY_OUTPUT_UUID: + *((uint8 *)pValue) = hidReportBootKeyOut; + *pLen = 1; + break; + + default: + *pLen = 0; + break; + } + + return ( SUCCESS ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.h new file mode 100644 index 0000000..b6cb36f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbM/hidkbmservice.h @@ -0,0 +1,138 @@ +/************************************************************************************************** + Filename: hidkbmservice.h + Revised: $Date: 2012-05-29 15:29:05 -0700 (Tue, 29 May 2012) $ + Revision: $Revision: 30647 $ + + Description: This file contains the HID service for a keyboard/mouse. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDKBMSERVICE_H +#define HIDKBMSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Number of HID reports defined in the service +#define HID_NUM_REPORTS 9 + +// HID Report IDs for the service +#define HID_RPT_ID_MOUSE_IN 1 // Mouse input report ID +#define HID_RPT_ID_KEY_IN 2 // Keyboard input report ID +#define HID_RPT_ID_CC_IN 3 // Consumer Control input report ID +#define HID_RPT_ID_LED_OUT 0 // LED output report ID +#define HID_RPT_ID_FEATURE 0 // Feature report ID + +// HID feature flags +#define HID_KBD_FLAGS HID_FLAGS_REMOTE_WAKE + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbM_AddService + * + * @brief Initializes the HID service for keyboard/mouse by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t HidKbM_AddService( void ); + +/********************************************************************* + * @fn HidKbM_SetParameter + * + * @brief Set a HID KbM parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param len - length of data to right. + * @param pValue - pointer to data to write. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +extern uint8 HidKbM_SetParameter( uint8 id, uint8 type, uint16 uuid, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidKbM_GetParameter + * + * @brief Get a HID KbM parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param pLen - length of data to be read. + * @param pValue - pointer to data to get. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +extern uint8 HidKbM_GetParameter( uint8 id, uint8 type, uint16 uuid, uint8 *pLen, void *pValue ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDKBMSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.c new file mode 100644 index 0000000..4f5d3e5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.c @@ -0,0 +1,761 @@ +/************************************************************************************************** + Filename: hidkbdservice.c + Revised: $Date: 2012-02-09 14:40:40 -0800 (Thu, 09 Feb 2012) $ + Revision: $Revision: 65 $ + + Description: This file contains the HID service for a keyboard. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "linkdb.h" +#include "gattservapp.h" +#include "hidkbdservice.h" +#include "hid_uuid.h" +#include "hiddev.h" +#include "battservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// HID service +CONST uint8 hidServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_SERVICE_UUID), HI_UINT16(HID_SERVICE_UUID) +}; + +// HID Boot Keyboard Input Report characteristic +CONST uint8 hidBootKeyInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_INPUT_UUID), HI_UINT16(HID_BOOT_KEY_INPUT_UUID) +}; + +// HID Boot Mouse Input Report characteristic +CONST uint8 hidBootMouseInputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_MOUSE_INPUT_UUID), HI_UINT16(HID_BOOT_MOUSE_INPUT_UUID) +}; + +// HID Boot Keyboard Output Report characteristic +CONST uint8 hidBootKeyOutputUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_BOOT_KEY_OUTPUT_UUID), HI_UINT16(HID_BOOT_KEY_OUTPUT_UUID) +}; + +// HID Information characteristic +CONST uint8 hidInfoUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_INFORMATION_UUID), HI_UINT16(HID_INFORMATION_UUID) +}; + +// HID Report Map characteristic +CONST uint8 hidReportMapUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_MAP_UUID), HI_UINT16(HID_REPORT_MAP_UUID) +}; + +// HID Control Point characteristic +CONST uint8 hidControlPointUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_CONTROL_POINT_UUID), HI_UINT16(HID_CONTROL_POINT_UUID) +}; + +// HID Report characteristic +CONST uint8 hidReportUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_REPORT_UUID), HI_UINT16(HID_REPORT_UUID) +}; + +// HID Protocol Mode characteristic +CONST uint8 hidProtocolModeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HID_PROTOCOL_MODE_UUID), HI_UINT16(HID_PROTOCOL_MODE_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// HID Information characteristic value +static CONST uint8 hidInfo[HID_INFORMATION_LEN] = +{ + LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) + 0x00, // bCountryCode + HID_KBD_FLAGS // Flags +}; + +// HID Report Map characteristic value +// Keyboard report descriptor (using format for Boot interface descriptor) +static CONST uint8 hidReportMap[] = +{ + 0x05, 0x01, // Usage Pg (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection: (Application) + // + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0xE0, // Usage Min (224) + 0x29, 0xE7, // Usage Max (231) + 0x15, 0x00, // Log Min (0) + 0x25, 0x01, // Log Max (1) + // + // Modifier byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input: (Data, Variable, Absolute) + // + // Reserved byte + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input: (Constant) + // + // LED report + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Pg (LEDs) + 0x19, 0x01, // Usage Min (1) + 0x29, 0x05, // Usage Max (5) + 0x91, 0x02, // Output: (Data, Variable, Absolute) + // + // LED report padding + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output: (Constant) + // + // Key arrays (6 bytes) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Log Min (0) + 0x25, 0x65, // Log Max (101) + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0x00, // Usage Min (0) + 0x29, 0x65, // Usage Max (101) + 0x81, 0x00, // Input: (Data, Array) + // + 0xC0 // End Collection +}; + +// HID report map length +uint8 hidReportMapLen = sizeof(hidReportMap); + +// HID report mapping table +static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; + +/********************************************************************* + * Profile Attributes - variables + */ + +// HID Service attribute +static CONST gattAttrType_t hidService = { ATT_BT_UUID_SIZE, hidServUUID }; + +// Include attribute (Battery service) +static uint16 include = GATT_INVALID_HANDLE; + +// HID Information characteristic +static uint8 hidInfoProps = GATT_PROP_READ; + +// HID Report Map characteristic +static uint8 hidReportMapProps = GATT_PROP_READ; + +// HID External Report Reference Descriptor +static uint8 hidExtReportRefDesc[ATT_BT_UUID_SIZE] = + { LO_UINT16(BATT_LEVEL_UUID), HI_UINT16(BATT_LEVEL_UUID) }; + +// HID Control Point characteristic +static uint8 hidControlPointProps = GATT_PROP_WRITE_NO_RSP; +static uint8 hidControlPoint; + +// HID Protocol Mode characteristic +static uint8 hidProtocolModeProps = GATT_PROP_READ | GATT_PROP_WRITE_NO_RSP; +uint8 hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + +// HID Report characteristic, key input +static uint8 hidReportKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportKeyIn; +static gattCharCfg_t hidReportKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Report Reference characteristic descriptor, key input +static uint8 hidReportRefKeyIn[HID_REPORT_REF_LEN] = + { HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT }; + +// HID Report characteristic, LED output +static uint8 hidReportLedOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportLedOut; + +// HID Report Reference characteristic descriptor, LED output +static uint8 hidReportRefLedOut[HID_REPORT_REF_LEN] = + { HID_RPT_ID_LED_OUT, HID_REPORT_TYPE_OUTPUT }; + +// HID Boot Keyboard Input Report +static uint8 hidReportBootKeyInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootKeyIn; +static gattCharCfg_t hidReportBootKeyInClientCharCfg[GATT_MAX_NUM_CONN]; + +// HID Boot Keyboard Output Report +static uint8 hidReportBootKeyOutProps = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_WRITE_NO_RSP; +static uint8 hidReportBootKeyOut; + +// HID Boot Mouse Input Report +static uint8 hidReportBootMouseInProps = GATT_PROP_READ | GATT_PROP_NOTIFY; +static uint8 hidReportBootMouseIn; +static gattCharCfg_t hidReportBootMouseInClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Report +static uint8 hidReportFeatureProps = GATT_PROP_READ | GATT_PROP_WRITE; +static uint8 hidReportFeature; + +// HID Report Reference characteristic descriptor, Feature +static uint8 hidReportRefFeature[HID_REPORT_REF_LEN] = + { HID_RPT_ID_FEATURE, HID_REPORT_TYPE_FEATURE }; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t hidAttrTbl[] = +{ + // HID Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *) &hidService /* pValue */ + }, + + // Included service (battery) + { + { ATT_BT_UUID_SIZE, includeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&include + }, + + // HID Information characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidInfoProps + }, + + // HID Information characteristic + { + { ATT_BT_UUID_SIZE, hidInfoUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidInfo + }, + + // HID Control Point characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidControlPointProps + }, + + // HID Control Point characteristic + { + { ATT_BT_UUID_SIZE, hidControlPointUUID }, + GATT_PERMIT_WRITE, + 0, + &hidControlPoint + }, + + // HID Protocol Mode characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidProtocolModeProps + }, + + // HID Protocol Mode characteristic + { + { ATT_BT_UUID_SIZE, hidProtocolModeUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidProtocolMode + }, + + + // HID Report Map characteristic declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportMapProps + }, + + // HID Report Map characteristic + { + { ATT_BT_UUID_SIZE, hidReportMapUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *) hidReportMap + }, + + // HID External Report Reference Descriptor + { + { ATT_BT_UUID_SIZE, extReportRefUUID }, + GATT_PERMIT_READ, + 0, + hidExtReportRefDesc + }, + + // HID Report characteristic, key input declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyInProps + }, + + // HID Report characteristic, key input + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ, + 0, + &hidReportKeyIn + }, + + // HID Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportKeyInClientCharCfg + }, + + // HID Report Reference characteristic descriptor, key input + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefKeyIn + }, + + // HID Report characteristic, LED output declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportLedOutProps + }, + + // HID Report characteristic, LED output + { + { ATT_BT_UUID_SIZE, hidReportUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportLedOut + }, + + // HID Report Reference characteristic descriptor, LED output + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefLedOut + }, + + // HID Boot Keyboard Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyInProps + }, + + // HID Boot Keyboard Input Report + { + { ATT_BT_UUID_SIZE, hidBootKeyInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyIn + }, + + // HID Boot Keyboard Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootKeyInClientCharCfg + }, + + // HID Boot Keyboard Output Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootKeyOutProps + }, + + // HID Boot Keyboard Output Report + { + { ATT_BT_UUID_SIZE, hidBootKeyOutputUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportBootKeyOut + }, + + // HID Boot Mouse Input Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseInProps + }, + + // HID Boot Mouse Input Report + { + { ATT_BT_UUID_SIZE, hidBootMouseInputUUID }, + GATT_PERMIT_READ, + 0, + &hidReportBootMouseIn + }, + + // HID Boot Mouse Input Report characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &hidReportBootMouseInClientCharCfg + }, + + // Feature Report declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &hidReportFeatureProps + }, + + // Feature Report + { + { ATT_BT_UUID_SIZE, hidReportUUID}, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &hidReportFeature + }, + + // HID Report Reference characteristic descriptor, feature + { + { ATT_BT_UUID_SIZE, reportRefUUID }, + GATT_PERMIT_READ, + 0, + hidReportRefFeature + }, +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + HID_SERVICE_IDX, // HID Service + HID_INCLUDED_SERVICE_IDX, // Included Service + HID_INFO_DECL_IDX, // HID Information characteristic declaration + HID_INFO_IDX, // HID Information characteristic + HID_CONTROL_POINT_DECL_IDX, // HID Control Point characteristic declaration + HID_CONTROL_POINT_IDX, // HID Control Point characteristic + HID_PROTOCOL_MODE_DECL_IDX, // HID Protocol Mode characteristic declaration + HID_PROTOCOL_MODE_IDX, // HID Protocol Mode characteristic + HID_REPORT_MAP_DECL_IDX, // HID Report Map characteristic declaration + HID_REPORT_MAP_IDX, // HID Report Map characteristic + HID_EXT_REPORT_REF_DESC_IDX, // HID External Report Reference Descriptor + HID_REPORT_KEY_IN_DECL_IDX, // HID Report characteristic, key input declaration + HID_REPORT_KEY_IN_IDX, // HID Report characteristic, key input + HID_REPORT_KEY_IN_CCCD_IDX, // HID Report characteristic client characteristic configuration + HID_REPORT_REF_KEY_IN_IDX, // HID Report Reference characteristic descriptor, key input + HID_REPORT_LED_OUT_DECL_IDX, // HID Report characteristic, LED output declaration + HID_REPORT_LED_OUT_IDX, // HID Report characteristic, LED output + HID_REPORT_REF_LED_OUT_IDX, // HID Report Reference characteristic descriptor, LED output + HID_BOOT_KEY_IN_DECL_IDX, // HID Boot Keyboard Input Report declaration + HID_BOOT_KEY_IN_IDX, // HID Boot Keyboard Input Report + HID_BOOT_KEY_IN_CCCD_IDX, // HID Boot Keyboard Input Report characteristic client characteristic configuration + HID_BOOT_KEY_OUT_DECL_IDX, // HID Boot Keyboard Output Report declaration + HID_BOOT_KEY_OUT_IDX, // HID Boot Keyboard Output Report + HID_BOOT_MOUSE_IN_DECL_IDX, // HID Boot Mouse Input Report declaration + HID_BOOT_MOUSE_IN_IDX, // HID Boot Mouse Input Report + HID_BOOT_MOUSE_IN_CCCD_IDX, // HID Boot Mouse Input Report characteristic client characteristic configuration + HID_FEATURE_DECL_IDX, // Feature Report declaration + HID_FEATURE_IDX, // Feature Report + HID_REPORT_REF_FEATURE_IDX // HID Report Reference characteristic descriptor, feature +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t hidKbdCBs = +{ + HidDev_ReadAttrCB, // Read callback function pointer + HidDev_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbd_AddService + * + * @brief Initializes the HID Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t HidKbd_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootKeyInClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, hidReportBootMouseInClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( hidAttrTbl, GATT_NUM_ATTRS( hidAttrTbl ), &hidKbdCBs ); + + // Set up included service + Batt_GetParameter( BATT_PARAM_SERVICE_HANDLE, + &GATT_INCLUDED_HANDLE( hidAttrTbl, HID_INCLUDED_SERVICE_IDX ) ); + + // Construct map of reports to characteristic handles + // Each report is uniquely identified via its ID and type + + // Key input report + hidRptMap[0].id = hidReportRefKeyIn[0]; + hidRptMap[0].type = hidReportRefKeyIn[1]; + hidRptMap[0].handle = hidAttrTbl[HID_REPORT_KEY_IN_IDX].handle; + hidRptMap[0].cccdHandle = hidAttrTbl[HID_REPORT_KEY_IN_CCCD_IDX].handle; + hidRptMap[0].mode = HID_PROTOCOL_MODE_REPORT; + + // LED output report + hidRptMap[1].id = hidReportRefLedOut[0]; + hidRptMap[1].type = hidReportRefLedOut[1]; + hidRptMap[1].handle = hidAttrTbl[HID_REPORT_LED_OUT_IDX].handle; + hidRptMap[1].cccdHandle = 0; + hidRptMap[1].mode = HID_PROTOCOL_MODE_REPORT; + + // Boot keyboard input report + // Use same ID and type as key input report + hidRptMap[2].id = hidReportRefKeyIn[0]; + hidRptMap[2].type = hidReportRefKeyIn[1]; + hidRptMap[2].handle = hidAttrTbl[HID_BOOT_KEY_IN_IDX].handle; + hidRptMap[2].cccdHandle = hidAttrTbl[HID_BOOT_KEY_IN_CCCD_IDX].handle; + hidRptMap[2].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot keyboard output report + // Use same ID and type as LED output report + hidRptMap[3].id = hidReportRefLedOut[0]; + hidRptMap[3].type = hidReportRefLedOut[1]; + hidRptMap[3].handle = hidAttrTbl[HID_BOOT_KEY_OUT_IDX].handle; + hidRptMap[3].cccdHandle = 0; + hidRptMap[3].mode = HID_PROTOCOL_MODE_BOOT; + + // Boot mouse input report + hidRptMap[4].id = HID_RPT_ID_MOUSE_IN; + hidRptMap[4].type = HID_REPORT_TYPE_INPUT; + hidRptMap[4].handle = hidAttrTbl[HID_BOOT_MOUSE_IN_IDX].handle; + hidRptMap[4].cccdHandle = hidAttrTbl[HID_BOOT_MOUSE_IN_CCCD_IDX].handle; + hidRptMap[4].mode = HID_PROTOCOL_MODE_BOOT; + + // Feature report + hidRptMap[5].id = hidReportRefFeature[0]; + hidRptMap[5].type = hidReportRefFeature[1]; + hidRptMap[5].handle = hidAttrTbl[HID_FEATURE_IDX].handle; + hidRptMap[5].cccdHandle = 0; + hidRptMap[5].mode = HID_PROTOCOL_MODE_REPORT; + + // Battery level input report + VOID Batt_GetParameter( BATT_PARAM_BATT_LEVEL_IN_REPORT, &(hidRptMap[6]) ); + + // Setup report ID map + HidDev_RegisterReports( HID_NUM_REPORTS, hidRptMap ); + + return ( status ); +} + +/********************************************************************* + * @fn HidKbd_SetParameter + * + * @brief Set a HID Kbd parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param len - length of data to right. + * @param pValue - pointer to data to write. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +uint8 HidKbd_SetParameter( uint8 id, uint8 type, uint16 uuid, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( uuid ) + { + case HID_REPORT_UUID: + if ( type == HID_REPORT_TYPE_OUTPUT ) + { + if ( len == 1 ) + { + hidReportLedOut = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( type == HID_REPORT_TYPE_FEATURE ) + { + if ( len == 1 ) + { + hidReportFeature = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + ret = ATT_ERR_ATTR_NOT_FOUND; + } + break; + + case HID_BOOT_KEY_OUTPUT_UUID: + if ( len == 1 ) + { + hidReportBootKeyOut = *((uint8 *)pValue); + } + else + { + ret = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + default: + // ignore the request + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HidKbd_GetParameter + * + * @brief Get a HID Kbd parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param pLen - length of data to be read + * @param pValue - pointer to data to get. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +uint8 HidKbd_GetParameter( uint8 id, uint8 type, uint16 uuid, uint8 *pLen, void *pValue ) +{ + switch ( uuid ) + { + case HID_REPORT_UUID: + if ( type == HID_REPORT_TYPE_OUTPUT ) + { + *((uint8 *)pValue) = hidReportLedOut; + *pLen = 1; + } + else if ( type == HID_REPORT_TYPE_FEATURE ) + { + *((uint8 *)pValue) = hidReportFeature; + *pLen = 1; + } + else + { + *pLen = 0; + } + break; + + case HID_BOOT_KEY_OUTPUT_UUID: + *((uint8 *)pValue) = hidReportBootKeyOut; + *pLen = 1; + break; + + default: + *pLen = 0; + break; + } + + return ( SUCCESS ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.h new file mode 100644 index 0000000..c054c53 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HIDDevKbd/hidkbdservice.h @@ -0,0 +1,137 @@ +/************************************************************************************************** + Filename: hidkbdservice.h + Revised: $Date: 2012-02-09 14:40:40 -0800 (Thu, 09 Feb 2012) $ + Revision: $Revision: 65 $ + + Description: This file contains the HID service for a keyboard. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HIDKBDSERVICE_H +#define HIDKBDSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Number of HID reports defined in the service +#define HID_NUM_REPORTS 7 + +// HID Report IDs for the service +#define HID_RPT_ID_KEY_IN 0 // Keyboard input report ID +#define HID_RPT_ID_MOUSE_IN 1 // Mouse input report ID +#define HID_RPT_ID_LED_OUT 0 // LED output report ID +#define HID_RPT_ID_FEATURE 0 // Feature report ID + +// HID feature flags +#define HID_KBD_FLAGS HID_FLAGS_REMOTE_WAKE + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn HidKbd_AddService + * + * @brief Initializes the HID service for keyboard by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t HidKbd_AddService( void ); + +/********************************************************************* + * @fn HidKbd_SetParameter + * + * @brief Set a HID Kbd parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param len - length of data to right. + * @param pValue - pointer to data to write. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +extern uint8 HidKbd_SetParameter( uint8 id, uint8 type, uint16 uuid, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidKbd_GetParameter + * + * @brief Get a HID Kbd parameter. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param uuid - attribute uuid. + * @param pLen - length of data to be read. + * @param pValue - pointer to data to get. This is dependent on + * the input parameters and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return GATT status code. + */ +extern uint8 HidKbd_GetParameter( uint8 id, uint8 type, uint16 uuid, uint8 *pLen, void *pValue ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HIDKBDSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.c new file mode 100644 index 0000000..681d810 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.c @@ -0,0 +1,502 @@ +/************************************************************************************************** + Filename: heartrateservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the Heart Rate sample service + for use with the Heart Rate sample application. + + Copyright 2011 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "heartrateservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Position of heart rate measurement value in attribute array +#define HEARTRATE_MEAS_VALUE_POS 2 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Heart rate service +CONST uint8 heartRateServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_SERV_UUID), HI_UINT16(HEARTRATE_SERV_UUID) +}; + +// Heart rate measurement characteristic +CONST uint8 heartRateMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_MEAS_UUID), HI_UINT16(HEARTRATE_MEAS_UUID) +}; + +// Sensor location characteristic +CONST uint8 heartRateSensLocUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_SENS_LOC_UUID), HI_UINT16(HEARTRATE_SENS_LOC_UUID) +}; + +// Command characteristic +CONST uint8 heartRateCommandUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(HEARTRATE_COMMAND_UUID), HI_UINT16(HEARTRATE_COMMAND_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static heartRateServiceCB_t heartRateServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Heart Rate Service attribute +static CONST gattAttrType_t heartRateService = { ATT_BT_UUID_SIZE, heartRateServUUID }; + +// Heart Rate Measurement Characteristic +// Note characteristic value is not stored here +static uint8 heartRateMeasProps = GATT_PROP_NOTIFY; +static uint8 heartRateMeas = 0; +static gattCharCfg_t heartRateMeasClientCharCfg[GATT_MAX_NUM_CONN]; + +// Sensor Location Characteristic +static uint8 heartRateSensLocProps = GATT_PROP_READ; +static uint8 heartRateSensLoc = 0; + +// Command Characteristic +static uint8 heartRateCommandProps = GATT_PROP_WRITE; +static uint8 heartRateCommand = 0; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t heartRateAttrTbl[] = +{ + // Heart Rate Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&heartRateService /* pValue */ + }, + + // Heart Rate Measurement Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateMeasProps + }, + + // Heart Rate Measurement Value + { + { ATT_BT_UUID_SIZE, heartRateMeasUUID }, + 0, + 0, + &heartRateMeas + }, + + // Heart Rate Measurement Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &heartRateMeasClientCharCfg + }, + + // Sensor Location Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateSensLocProps + }, + + // Sensor Location Value + { + { ATT_BT_UUID_SIZE, heartRateSensLocUUID }, + GATT_PERMIT_READ, + 0, + &heartRateSensLoc + }, + + // Command Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &heartRateCommandProps + }, + + // Command Value + { + { ATT_BT_UUID_SIZE, heartRateCommandUUID }, + GATT_PERMIT_WRITE, + 0, + &heartRateCommand + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 heartRate_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t heartRate_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Heart Rate Service Callbacks +CONST gattServiceCBs_t heartRateCBs = +{ + heartRate_ReadAttrCB, // Read callback function pointer + heartRate_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn HeartRate_AddService + * + * @brief Initializes the Heart Rate service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t HeartRate_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, heartRateMeasClientCharCfg ); + + if ( services & HEARTRATE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( heartRateAttrTbl, + GATT_NUM_ATTRS( heartRateAttrTbl ), + &heartRateCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn HeartRate_Register + * + * @brief Register a callback function with the Heart Rate Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void HeartRate_Register( heartRateServiceCB_t pfnServiceCB ) +{ + heartRateServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn HeartRate_SetParameter + * + * @brief Set a Heart Rate parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HeartRate_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case HEARTRATE_MEAS_CHAR_CFG: + // Need connection handle + //heartRateMeasClientCharCfg.value = *((uint16*)value); + break; + + case HEARTRATE_SENS_LOC: + heartRateSensLoc = *((uint8*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HeartRate_GetParameter + * + * @brief Get a Heart Rate parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t HeartRate_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case HEARTRATE_MEAS_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = heartRateMeasClientCharCfg.value; + break; + + case HEARTRATE_SENS_LOC: + *((uint8*)value) = heartRateSensLoc; + break; + + case HEARTRATE_COMMAND: + *((uint8*)value) = heartRateCommand; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn HeartRate_MeasNotify + * + * @brief Send a notification containing a heart rate + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t HeartRate_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, heartRateMeasClientCharCfg ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = heartRateAttrTbl[HEARTRATE_MEAS_VALUE_POS].handle; + + // Send the notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn heartRate_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 heartRate_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if (uuid == HEARTRATE_SENS_LOC_UUID) + { + *pLen = 1; + pValue[0] = *pAttr->pValue; + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn heartRate_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t heartRate_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case HEARTRATE_COMMAND_UUID: + if ( offset > 0 ) + { + status = ATT_ERR_ATTR_NOT_LONG; + } + else if (len != 1) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + else if (*pValue != HEARTRATE_COMMAND_ENERGY_EXP) + { + status = HEARTRATE_ERR_NOT_SUP; + } + else + { + *(pAttr->pValue) = pValue[0]; + + (*heartRateServiceCB)(HEARTRATE_COMMAND_SET); + + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + (*heartRateServiceCB)( (charCfg == GATT_CFG_NO_OPERATION) ? + HEARTRATE_MEAS_NOTI_DISABLED : + HEARTRATE_MEAS_NOTI_ENABLED ); + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn HeartRate_HandleConnStatusCB + * + * @brief Heart Rate Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void HeartRate_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, heartRateMeasClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.h new file mode 100644 index 0000000..ba8814b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/HeartRate/heartrateservice.h @@ -0,0 +1,169 @@ +/************************************************************************************************** + Filename: heartrateservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Heart Rate service definitions and + prototypes. + +**************************************************************************************************/ + +#ifndef HEARTRATESERVICE_H +#define HEARTRATESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Heart Rate Service Parameters +#define HEARTRATE_MEAS 0 +#define HEARTRATE_MEAS_CHAR_CFG 1 +#define HEARTRATE_SENS_LOC 2 +#define HEARTRATE_COMMAND 3 + +// Heart Rate Service UUIDs +#define HEARTRATE_SERV_UUID 0x180D +#define HEARTRATE_MEAS_UUID 0x2A37 +#define HEARTRATE_SENS_LOC_UUID 0x2A38 +#define HEARTRATE_COMMAND_UUID 0x2A39 + +// Maximum length of heart rate measurement characteristic +#define HEARTRATE_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define HEARTRATE_FLAGS_FORMAT_UINT16 0x01 +#define HEARTRATE_FLAGS_CONTACT_NOT_SUP 0x00 +#define HEARTRATE_FLAGS_CONTACT_NOT_DET 0x04 +#define HEARTRATE_FLAGS_CONTACT_DET 0x06 +#define HEARTRATE_FLAGS_ENERGY_EXP 0x08 +#define HEARTRATE_FLAGS_RR 0x10 + +// Values for sensor location +#define HEARTRATE_SENS_LOC_OTHER 0x00 +#define HEARTRATE_SENS_LOC_CHEST 0x01 +#define HEARTRATE_SENS_LOC_WRIST 0x02 +#define HEARTRATE_SENS_LOC_FINGER 0x03 +#define HEARTRATE_SENS_LOC_HAND 0x04 +#define HEARTRATE_SENS_LOC_EARLOBE 0x05 +#define HEARTRATE_SENS_LOC_FOOT 0x06 + +// Value for command characteristic +#define HEARTRATE_COMMAND_ENERGY_EXP 0x01 + +// ATT Error code +// Control point value not supported +#define HEARTRATE_ERR_NOT_SUP 0x80 + +// Heart Rate Service bit fields +#define HEARTRATE_SERVICE 0x00000001 + +// Callback events +#define HEARTRATE_MEAS_NOTI_ENABLED 1 +#define HEARTRATE_MEAS_NOTI_DISABLED 2 +#define HEARTRATE_COMMAND_SET 3 + +/********************************************************************* + * TYPEDEFS + */ + +// Heart Rate Service callback function +typedef void (*heartRateServiceCB_t)(uint8 event); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * HeartRate_AddService- Initializes the Heart Rate service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t HeartRate_AddService( uint32 services ); + +/* + * HeartRate_Register - Register a callback function with the + * Heart Rate Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void HeartRate_Register( heartRateServiceCB_t pfnServiceCB ); + +/* + * HeartRate_SetParameter - Set a Heart Rate parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t HeartRate_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * HeartRate_GetParameter - Get a Heart Rate parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t HeartRate_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn HeartRate_MeasNotify + * + * @brief Send a notification containing a heart rate + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t HeartRate_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/********************************************************************* + * @fn HeartRate_HandleConnStatusCB + * + * @brief Heart Rate Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +extern void HeartRate_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HEARTRATESERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.c new file mode 100644 index 0000000..d975768 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.c @@ -0,0 +1,423 @@ +/************************************************************************************************** + Filename: simplekey.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Simple Keys Profile + + + Copyright 2010 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "simplekeys.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +#define SERVAPP_NUM_ATTR_SUPPORTED 5 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// SK Service UUID: 0x1800 +CONST uint8 skServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SK_SERV_UUID), HI_UINT16(SK_SERV_UUID) +}; + +// Key Pressed UUID: 0x1801 +CONST uint8 keyPressedUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SK_KEYPRESSED_UUID), HI_UINT16(SK_KEYPRESSED_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// SK Service attribute +static CONST gattAttrType_t skService = { ATT_BT_UUID_SIZE, skServUUID }; + +// Keys Pressed Characteristic Properties +static uint8 skCharProps = GATT_PROP_NOTIFY; + +// Key Pressed State Characteristic +static uint8 skKeyPressed = 0; + +// Key Pressed Characteristic Configs +static gattCharCfg_t skConfig[GATT_MAX_NUM_CONN]; + +// Key Pressed Characteristic User Description +static uint8 skCharUserDesp[16] = "Key Press State\0"; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t simplekeysAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = +{ + // Simple Keys Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&skService /* pValue */ + }, + + // Characteristic Declaration for Keys + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &skCharProps + }, + + // Characteristic Value- Key Pressed + { + { ATT_BT_UUID_SIZE, keyPressedUUID }, + 0, + 0, + &skKeyPressed + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)skConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + skCharUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t sk_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void sk_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// SK Service Callbacks +CONST gattServiceCBs_t skCBs = +{ + sk_ReadAttrCB, // Read callback function pointer + sk_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn SK_AddService + * + * @brief Initializes the Simple Key service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t SK_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, skConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( sk_HandleConnStatusCB ); + + + if ( services & SK_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( simplekeysAttrTbl, + GATT_NUM_ATTRS( simplekeysAttrTbl ), + &skCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn SK_SetParameter + * + * @brief Set a Simple Key Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SK_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SK_KEY_ATTR: + if ( len == sizeof ( uint8 ) ) + { + skKeyPressed = *((uint8*)pValue); + + // See if Notification/Indication has been enabled + GATTServApp_ProcessCharCfg( skConfig, &skKeyPressed, FALSE, + simplekeysAttrTbl, GATT_NUM_ATTRS( simplekeysAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn SK_GetParameter + * + * @brief Get a Simple Key Profile parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SK_GetParameter( uint8 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SK_KEY_ATTR: + *((uint8*)pValue) = skKeyPressed; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn sk_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles this type for reads + + // simple keys characteristic does not have read permissions, but because it + // can be sent as a notification, it must be included here + case SK_KEYPRESSED_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn sk_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t sk_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn sk_HandleConnStatusCB + * + * @brief Simple Keys Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void sk_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, skConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.h new file mode 100644 index 0000000..1e6ffbb --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Keys/simplekeys.h @@ -0,0 +1,132 @@ +/************************************************************************************************** + Filename: simplekeys.h + Revised: $Date: 2010-10-01 14:14:58 -0700 (Fri, 01 Oct 2010) $ + Revision: $Revision: 23960 $ + + Description: This file contains the Simple Keys Profile header file. + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SIMPLEKEYS_H +#define SIMPLEKEYS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define SK_KEY_ATTR 0 // RW uint8 - Profile Attribute value + +// SK Service UUID +#define SK_SERV_UUID 0xFFE0 + +// Key Pressed UUID +#define SK_KEYPRESSED_UUID 0xFFE1 + +// Key Values +#define SK_KEY_LEFT 0x01 +#define SK_KEY_RIGHT 0x02 + +// Simple Keys Profile Services bit fields +#define SK_SERVICE 0x00000001 + +/********************************************************************* + * TYPEDEFS + */ + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * SK_AddService- Initializes the Simple Key service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t SK_AddService( uint32 services ); + +/* + * SK_SetParameter - Set a Simple Key Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SK_SetParameter( uint8 param, uint8 len, void *pValue ); + +/* + * SK_GetParameter - Get a Simple Key Profile parameter. + * + * param - Profile parameter ID + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SK_GetParameter( uint8 param, void *pValue ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKEYS_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad.h new file mode 100644 index 0000000..93bdc34 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad.h @@ -0,0 +1,144 @@ +/************************************************************************************************** + Filename: oad.h + Revised: $Date: 2012-12-06 13:16:36 -0800 (Thu, 06 Dec 2012) $ + Revision: $Revision: 32472 $ + + Description: This file contains OAD Profile header file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef OAD_H +#define OAD_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_aes.h" +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +#define OAD_SERVICE_UUID 0xFFC0 +#define OAD_IMG_IDENTIFY_UUID 0xFFC1 +#define OAD_IMG_BLOCK_UUID 0xFFC2 + +#define OAD_IMG_CRC_OSET 0x0000 +#if defined FEATURE_OAD_SECURE +#define OAD_IMG_HDR_OSET 0x0000 +#else // crc0 is calculated and placed by the IAR linker at 0x0, so img_hdr_t is 2 bytes offset. +#define OAD_IMG_HDR_OSET 0x0002 +#endif + +#define OAD_CHAR_CNT 2 + +// OAD Characteristic Indices +#define OAD_CHAR_IMG_IDENTIFY 0 +#define OAD_CHAR_IMG_BLOCK 1 + +// Image Identification size +#define OAD_IMG_ID_SIZE 4 + +// Image header size (version + length + image id size) +#define OAD_IMG_HDR_SIZE ( 2 + 2 + OAD_IMG_ID_SIZE ) + +// The Image is transporte in 16-byte blocks in order to avoid using blob operations. +#define OAD_BLOCK_SIZE 16 +#define OAD_BLOCKS_PER_PAGE (HAL_FLASH_PAGE_SIZE / OAD_BLOCK_SIZE) +#define OAD_BLOCK_MAX (OAD_BLOCKS_PER_PAGE * OAD_IMG_D_AREA) + +/********************************************************************* + * MACROS + */ + +// Macros to get Image ID (LSB) and Version Number +#define OAD_IMG_ID( ver ) ( (ver) & 0x01 ) +#define OAD_VER_NUM( ver ) ( (ver) >> 0x01 ) + +// Macro to set Image Version +#if defined (HAL_IMAGE_A) + #define OAD_IMG_VER( ver ) ( (uint16)( (ver) << 0x01 ) ) // Clear LSB for Image A +#else + #define OAD_IMG_VER( ver ) ( (uint16)( ( (ver) << 0x01 ) | 0x01 ) ) // Set LSB for Imange B +#endif + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * TYPEDEFS + */ + +// The Image Header will not be encrypted, but it will be included in a Signature. +typedef struct { +#if defined FEATURE_OAD_SECURE + // Secure OAD uses the Signature for image validation instead of calculating a CRC, but the use + // of CRC==CRC-Shadow for quick boot-up determination of a validated image is still used. + uint16 crc0; // CRC must not be 0x0000 or 0xFFFF. +#endif + uint16 crc1; // CRC-shadow must be 0xFFFF. + // User-defined Image Version Number - default logic uses simple a '!=' comparison to start an OAD. + uint16 ver; + uint16 len; // Image length in 4-byte blocks (i.e. HAL_FLASH_WORD_SIZE blocks). + uint8 uid[4]; // User-defined Image Identification bytes. + uint8 res[4]; // Reserved space for future use. +} img_hdr_t; + +#if defined FEATURE_OAD_SECURE +static_assert((sizeof(img_hdr_t) == 16), "Bad SBL_ADDR_AES_HDR definition."); +static_assert(((sizeof(img_hdr_t) % KEY_BLENGTH) == 0), + "img_hdr_t is not an even multiple of KEY_BLENGTH"); +#endif + +// The AES Header must be encrypted and the Signature must include the Image Header. +typedef struct { + uint8 signature[KEY_BLENGTH]; // The AES-128 CBC-MAC signature. + uint8 nonce12[12]; // The 12-byte Nonce for calculating the signature. + uint8 spare[4]; +} aes_hdr_t; + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OAD_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.c new file mode 100644 index 0000000..6635e76 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.c @@ -0,0 +1,696 @@ +/************************************************************************************************** + Filename: oad_target.c + Revised: $Date: 2012-11-16 18:39:26 -0800 (Fri, 16 Nov 2012) $ + Revision: $Revision: 32218 $ + + Description: This file contains OAD Target implementation. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#include "bcomdef.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "hal_aes.h" +#include "hal_crc.h" +#include "hal_flash.h" +#if (defined HAL_LCD) && (HAL_LCD == TRUE) +#include "hal_lcd.h" +#endif +#include "hal_types.h" +#include "linkdb.h" +#include "oad.h" +#include "oad_target.h" +#include "OSAL.h" + +/********************************************************************* + * CONSTANTS + */ + +#define OAD_FLASH_PAGE_MULT ((uint16)(HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)) + +#if defined (FEATURE_OAD_SECURE) && defined (HAL_IMAGE_A) + // Enabled to ONLY build a BOOTSTRAP Encrypted Image-A (for programming over + // BEM, not BIM). Comment line below to build a non-bootstrap Encrypted Image-A. + #define BOOTP_E_IMAGE_A +#endif + +#if !defined (OAD_IMAGE_VERSION) + #define OAD_IMAGE_VERSION 0x0000 +#endif + +#if !defined (OAD_IMAGE_A_USER_ID) + #define OAD_IMAGE_A_USER_ID {'A', 'A', 'A', 'A'} +#endif + +#if !defined (OAD_IMAGE_B_USER_ID) + #define OAD_IMAGE_B_USER_ID {'B', 'B', 'B', 'B'} +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// OAD Service UUID +static CONST uint8 oadServUUID[ATT_UUID_SIZE] = +{ + TI_BASE_UUID_128( OAD_SERVICE_UUID ) +}; + +static CONST uint8 oadCharUUID[OAD_CHAR_CNT][ATT_UUID_SIZE] = +{ + // OAD Image Identify UUID + TI_BASE_UUID_128( OAD_IMG_IDENTIFY_UUID ), + + // OAD Image Block Request/Response UUID + TI_BASE_UUID_128( OAD_IMG_BLOCK_UUID ) +}; + +/********************************************************************* + * Profile Attributes - variables + */ + +// OAD Service attribute +static CONST gattAttrType_t oadService = { ATT_UUID_SIZE, oadServUUID }; + +// Place holders for the GATT Server App to be able to lookup handles. +static uint8 oadCharVals[OAD_CHAR_CNT]; + +// OAD Characteristic Properties +static uint8 oadCharProps = GATT_PROP_WRITE_NO_RSP | GATT_PROP_WRITE | GATT_PROP_NOTIFY; + +// OAD Client Characteristic Configs +static gattCharCfg_t oadImgIdentifyConfig[GATT_MAX_NUM_CONN]; +static gattCharCfg_t oadImgBlockConfig[GATT_MAX_NUM_CONN]; + +// OAD Characteristic user descriptions +static CONST uint8 oadImgIdentifyDesc[] = "Img Identify"; +static CONST uint8 oadImgBlockDesc[] = "Img Block"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t oadAttrTbl[] = +{ + // OAD Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&oadService + }, + + // OAD Image Identify Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &oadCharProps + }, + + // OAD Image Identify Characteristic Value + { + { ATT_UUID_SIZE, oadCharUUID[0] }, + GATT_PERMIT_WRITE, + 0, + oadCharVals+0 + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)oadImgIdentifyConfig + }, + + // OAD Image Identify User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)oadImgIdentifyDesc + }, + + // OAD Image Block Request/Response Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &oadCharProps + }, + + // OAD Image Block Request/Response Characteristic Value + { + { ATT_UUID_SIZE, oadCharUUID[1] }, + GATT_PERMIT_WRITE, + 0, + oadCharVals+1 + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)oadImgBlockConfig + }, + + // OAD Image Block Request/Response User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)oadImgBlockDesc + } +}; + +#pragma location="IMAGE_HEADER" +const __code img_hdr_t _imgHdr = { +#if defined FEATURE_OAD_SECURE + 2012, // CRC must not be 0x0000 or 0xFFFF. +#endif +#if defined (BOOTP_E_IMAGE_A) +#warning "Forcing a CRC-shadow match with the BOOTP_E_IMAGE_A flag - is this bootstrap code?" + 2012, // CRC-shadow forced to match CRC for a bootstrap Encrypted Image-A +#else + 0xFFFF, // CRC-shadow must be 0xFFFF for everything else +#endif + OAD_IMG_VER( OAD_IMAGE_VERSION ), // 15-bit Version #, left-shifted 1; OR with Image-B/Not-A bit. + OAD_IMG_R_AREA * OAD_FLASH_PAGE_MULT, +#if defined HAL_IMAGE_A + OAD_IMAGE_A_USER_ID, // User-Id +#else + OAD_IMAGE_B_USER_ID, // User-Id +#endif + { 0xFF, 0xFF, 0xFF, 0xFF } // Reserved +}; +#pragma required=_imgHdr + +#pragma location="AES_HEADER" +static const __code aes_hdr_t _aesHdr = { + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B }, // Dummy Nonce + { 0xFF, 0xFF, 0xFF, 0xFF } // Spare +}; +#pragma required=_aesHdr + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uint16 oadBlkNum = 0, oadBlkTot = 0xFFFF; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 oadReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen); + +static bStatus_t oadWriteAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset); + +CONST gattServiceCBs_t oadCBs = +{ + oadReadAttrCB, // Read callback function pointer. + oadWriteAttrCB, // Write callback function pointer. + NULL // Authorization callback function pointer. +}; + +static void oadImgBlockReq(uint16 connHandle, uint16 blkNum); + +static void oadImgIdentifyReq(uint16 connHandle, img_hdr_t *pImgHdr); + +static bStatus_t oadImgIdentifyWrite( uint16 connHandle, uint8 *pValue ); + +static bStatus_t oadImgBlockWrite( uint16 connHandle, uint8 *pValue ); + +static void oadHandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +#if !defined FEATURE_OAD_SECURE +static uint8 checkDL(void); +#endif + +/********************************************************************* + * @fn OADTarget_AddService + * + * @brief Initializes the OAD Service by registering GATT attributes + * with the GATT server. Only call this function once. + * + * @return The return value of GATTServApp_RegisterForMsg(). + */ +bStatus_t OADTarget_AddService(void) +{ + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, oadImgIdentifyConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, oadImgBlockConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( oadHandleConnStatusCB ); + + return GATTServApp_RegisterService(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), &oadCBs); +} + +/********************************************************************* + * @fn oadReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 oadReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen) +{ + bStatus_t status = SUCCESS; + + // TBD: is there any use for supporting reads + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + + return status; +} + +/********************************************************************* + * @fn oadWriteAttrCB + * + * @brief Validate and Write attribute data + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t oadWriteAttrCB(uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + if ( uuid == GATT_CLIENT_CHAR_CFG_UUID) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; // Should never get here! + } + } + else + { + // 128-bit UUID + if (osal_memcmp(pAttr->type.uuid, oadCharUUID[OAD_CHAR_IMG_IDENTIFY], ATT_UUID_SIZE)) + { + status = oadImgIdentifyWrite( connHandle, pValue ); + } + else if (osal_memcmp(pAttr->type.uuid, oadCharUUID[OAD_CHAR_IMG_BLOCK], ATT_UUID_SIZE)) + { + status = oadImgBlockWrite( connHandle, pValue ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; // Should never get here! + } + } + + return status; +} + +/********************************************************************* + * @fn oadImgIdentifyWrite + * + * @brief Process the Image Identify Write. + * + * @param connHandle - connection message was received on + * @param pValue - pointer to data to be written + * + * @return status + */ +static bStatus_t oadImgIdentifyWrite( uint16 connHandle, uint8 *pValue ) +{ + img_hdr_t rxHdr; + img_hdr_t ImgHdr; + + rxHdr.ver = BUILD_UINT16( pValue[0], pValue[1] ); + rxHdr.len = BUILD_UINT16( pValue[2], pValue[3] ); + + (void)osal_memcpy(rxHdr.uid, pValue+4, sizeof(rxHdr.uid)); + + HalFlashRead(OAD_IMG_R_PAGE, OAD_IMG_HDR_OSET, (uint8 *)&ImgHdr, sizeof(img_hdr_t)); + + oadBlkTot = rxHdr.len / (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE); + + if ( (OAD_IMG_ID( ImgHdr.ver ) != OAD_IMG_ID( rxHdr.ver )) && // TBD: add customer criteria for initiating OAD here. + (oadBlkTot <= OAD_BLOCK_MAX) && + (oadBlkTot != 0) ) + { + oadBlkNum = 0; + oadImgBlockReq(connHandle, 0); + } + else + { + oadImgIdentifyReq(connHandle, &ImgHdr); + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn oadImgBlockWrite + * + * @brief Process the Image Block Write. + * + * @param connHandle - connection message was received on + * @param pValue - pointer to data to be written + * + * @return status + */ +static bStatus_t oadImgBlockWrite( uint16 connHandle, uint8 *pValue ) +{ + uint16 blkNum = BUILD_UINT16( pValue[0], pValue[1] ); + + // make sure this is the image we're expecting + if ( blkNum == 0 ) + { + img_hdr_t ImgHdr; + uint16 ver = BUILD_UINT16( pValue[6], pValue[7] ); + uint16 blkTot = BUILD_UINT16( pValue[8], pValue[9] ) / (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE); + + HalFlashRead(OAD_IMG_R_PAGE, OAD_IMG_HDR_OSET, (uint8 *)&ImgHdr, sizeof(img_hdr_t)); + + if ( ( oadBlkNum != blkNum ) || + ( oadBlkTot != blkTot ) || + ( OAD_IMG_ID( ImgHdr.ver ) == OAD_IMG_ID( ver ) ) ) + { + return ( ATT_ERR_WRITE_NOT_PERMITTED ); + } + } + + if (oadBlkNum == blkNum) + { + uint16 addr = oadBlkNum * (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE) + + (OAD_IMG_D_PAGE * OAD_FLASH_PAGE_MULT); + oadBlkNum++; + +#if defined FEATURE_OAD_SECURE + if (blkNum == 0) + { + // Stop attack with crc0==crc1 by forcing crc1=0xffff. + pValue[4] = 0xFF; + pValue[5] = 0xFF; + } +#endif + +#if defined HAL_IMAGE_B + // Skip the Image-B area which lies between the lower & upper Image-A parts. + if (addr >= (OAD_IMG_B_PAGE * OAD_FLASH_PAGE_MULT)) + { + addr += OAD_IMG_B_AREA * OAD_FLASH_PAGE_MULT; + } +#endif + if ((addr % OAD_FLASH_PAGE_MULT) == 0) + { + HalFlashErase(addr / OAD_FLASH_PAGE_MULT); + } + + HalFlashWrite(addr, pValue+2, (OAD_BLOCK_SIZE / HAL_FLASH_WORD_SIZE)); + } + + if (oadBlkNum == oadBlkTot) // If the OAD Image is complete. + { +#if defined FEATURE_OAD_SECURE + HAL_SYSTEM_RESET(); // Only the secure OAD boot loader has the security key to decrypt. +#else + if (checkDL()) + { +#if !defined HAL_IMAGE_A + // The BIM always checks for a valid Image-B before Image-A, + // so Image-A never has to invalidate itself. + uint16 crc[2] = { 0x0000, 0xFFFF }; + uint16 addr = OAD_IMG_R_PAGE * OAD_FLASH_PAGE_MULT + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE; + HalFlashWrite(addr, (uint8 *)crc, 1); +#endif + HAL_SYSTEM_RESET(); + } +#endif + } + else // Request the next OAD Image block. + { + oadImgBlockReq(connHandle, oadBlkNum); + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @fn oadImgIdentifyReq + * + * @brief Process the Image Identify Request. + * + * @param connHandle - connection message was received on + * @param pImgHdr - Pointer to the img_hdr_t data to send. + * + * @return None + */ +static void oadImgBlockReq(uint16 connHandle, uint16 blkNum) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, oadImgBlockConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + attHandleValueNoti_t noti; + gattAttribute_t *pAttr = GATTServApp_FindAttr(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), + oadCharVals+OAD_CHAR_IMG_BLOCK); + noti.handle = pAttr->handle; + noti.len = 2; + noti.value[0] = LO_UINT16(blkNum); + noti.value[1] = HI_UINT16(blkNum); + + VOID GATT_Notification(connHandle, ¬i, FALSE); + } +} + +/********************************************************************* + * @fn oadImgIdentifyReq + * + * @brief Process the Image Identify Request. + * + * @param connHandle - connection message was received on + * @param pImgHdr - Pointer to the img_hdr_t data to send. + * + * @return None + */ +static void oadImgIdentifyReq(uint16 connHandle, img_hdr_t *pImgHdr) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, oadImgIdentifyConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + attHandleValueNoti_t noti; + gattAttribute_t *pAttr = GATTServApp_FindAttr(oadAttrTbl, GATT_NUM_ATTRS(oadAttrTbl), + oadCharVals+OAD_CHAR_IMG_IDENTIFY); + noti.handle = pAttr->handle; + noti.len = OAD_IMG_HDR_SIZE; + noti.value[0] = LO_UINT16(pImgHdr->ver); + noti.value[1] = HI_UINT16(pImgHdr->ver); + + noti.value[2] = LO_UINT16(pImgHdr->len); + noti.value[3] = HI_UINT16(pImgHdr->len); + + (void)osal_memcpy(noti.value+4, pImgHdr->uid, sizeof(pImgHdr->uid)); + + VOID GATT_Notification(connHandle, ¬i, FALSE); + } +} + +#if !defined FEATURE_OAD_SECURE +/************************************************************************************************** + * @fn crcCalcDL + * + * @brief Run the CRC16 Polynomial calculation over the DL image. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The CRC16 calculated. + ************************************************************************************************** + */ +static uint16 crcCalcDL(void) +{ + uint8 pageEnd = oadBlkTot / OAD_BLOCKS_PER_PAGE; + uint16 osetEnd = (oadBlkTot - (pageEnd * OAD_BLOCKS_PER_PAGE)) * OAD_BLOCK_SIZE; + +#if defined HAL_IMAGE_B + pageEnd += OAD_IMG_D_PAGE + OAD_IMG_B_AREA; +#else + pageEnd += OAD_IMG_D_PAGE; +#endif + + HalCRCInit(0x0000); // Seed thd CRC calculation with zero. + + for (uint8 page = OAD_IMG_D_PAGE; ; page++) + { +#if defined HAL_IMAGE_B + // Skip the Image-B area which lies between the lower & upper Image-A parts. + if (page == OAD_IMG_B_PAGE) + { + page += OAD_IMG_B_AREA; + } +#endif + + for (uint16 oset = 0; oset < HAL_FLASH_PAGE_SIZE; oset += HAL_FLASH_WORD_SIZE) + { + if ((page == OAD_IMG_D_PAGE) && (oset == OAD_IMG_CRC_OSET)) + { + continue; // Skip the CRC and shadow. + } + else if ((page == pageEnd) && (oset == osetEnd)) + { + return HalCRCCalc(); + } + else + { + uint8 buf[HAL_FLASH_WORD_SIZE]; + HalFlashRead(page, oset, buf, HAL_FLASH_WORD_SIZE); + + for (uint8 idx = 0; idx < HAL_FLASH_WORD_SIZE; idx++) + { + HalCRCExec(buf[idx]); + } + } + } + } +} + +/************************************************************************************************** + * @fn checkDL + * + * @brief Check validity of the downloaded image. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return TRUE or FALSE for image valid. + ************************************************************************************************** + */ +static uint8 checkDL(void) +{ + uint16 crc[2]; + + HalFlashRead(OAD_IMG_D_PAGE, OAD_IMG_CRC_OSET, (uint8 *)crc, sizeof(crc)); + + if ((crc[0] == 0xFFFF) || (crc[0] == 0x0000)) + { + return FALSE; + } + + if (crc[1] == 0xFFFF) + { + crc[1] = crcCalcDL(); + +#if defined FEATURE_OAD_BIM // If download image is made to run in-place, enable it here. + uint16 addr = OAD_IMG_D_PAGE * OAD_FLASH_PAGE_MULT + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE; + crc[0] = 0xFFFF; + HalFlashWrite(addr, (uint8 *)crc, 1); + HalFlashRead(OAD_IMG_D_PAGE, OAD_IMG_CRC_OSET, (uint8 *)crc, sizeof(crc)); +#endif + } + + return (crc[0] == crc[1]); +} +#endif + +/********************************************************************* + * @fn oadHandleConnStatusCB + * + * @brief OAD Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void oadHandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, oadImgIdentifyConfig ); + GATTServApp_InitCharCfg( connHandle, oadImgBlockConfig ); + } + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.h new file mode 100644 index 0000000..fb23a78 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/OAD/oad_target.h @@ -0,0 +1,117 @@ +/************************************************************************************************** + Filename: oad_target.h + Revised: $Date: 2012-11-16 18:39:26 -0800 (Fri, 16 Nov 2012) $ + Revision: $Revision: 32218 $ + + Description: This file contains OAD Target header file. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +#ifndef OAD_TARGET_H +#define OAD_TARGET_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +#include "hal_aes.h" +#include "hal_types.h" + +/********************************************************************* + * CONSTANTS + */ + +#if !defined OAD_IMG_A_PAGE +#define OAD_IMG_A_PAGE 1 +#define OAD_IMG_A_AREA 62 +#endif + +#if !defined OAD_IMG_B_PAGE +// Image-A/B can be very differently sized areas when implementing BIM vice OAD boot loader. +#if defined FEATURE_OAD_BIM +#define OAD_IMG_B_PAGE 8 +#else +#define OAD_IMG_B_PAGE 63 +#endif +#define OAD_IMG_B_AREA (124 - OAD_IMG_A_AREA) +#endif + +#if defined HAL_IMAGE_B +#define OAD_IMG_D_PAGE OAD_IMG_A_PAGE +#define OAD_IMG_D_AREA OAD_IMG_A_AREA +#define OAD_IMG_R_PAGE OAD_IMG_B_PAGE +#define OAD_IMG_R_AREA OAD_IMG_B_AREA +#else //#elif defined HAL_IMAGE_A or a non-BIM-enabled OAD Image-A w/ constants in Bank 1 vice 5. +#define OAD_IMG_D_PAGE OAD_IMG_B_PAGE +#define OAD_IMG_D_AREA OAD_IMG_B_AREA +#define OAD_IMG_R_PAGE OAD_IMG_A_PAGE +#define OAD_IMG_R_AREA OAD_IMG_A_AREA +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// OAD Image Header +extern const __code img_hdr_t _imgHdr; + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * @fn OADTarget_AddService + * + * @brief Initializes the OAD Service by registering GATT attributes + * with the GATT server. Only call this function once. + * + * @return Success or Failure + */ +bStatus_t OADTarget_AddService( void ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OAD_TARGET_H */ \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.c new file mode 100644 index 0000000..1f321e5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.c @@ -0,0 +1,619 @@ +/************************************************************************************************** + Filename: proxreporter.c + Revised: $Date: 2011-11-21 15:26:10 -0800 (Mon, 21 Nov 2011) $ + Revision: $Revision: 28439 $ + + Description: Proximity Profile - Reporter Role + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "proxreporter.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +#define PP_DEFAULT_TX_POWER 0 +#define PP_DEFAULT_PATH_LOSS 0x7F + +#define SERVAPP_NUM_ATTR_SUPPORTED 5 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Link Loss Service UUID +CONST uint8 linkLossServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( LINK_LOSS_SERVICE_UUID ), HI_UINT16( LINK_LOSS_SERVICE_UUID ) +}; + +// Immediate Alert Service UUID +CONST uint8 imAlertServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( IMMEDIATE_ALERT_SERVICE_UUID ), HI_UINT16( IMMEDIATE_ALERT_SERVICE_UUID ) +}; + +// Tx Power Level Service UUID +CONST uint8 txPwrLevelServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( TX_PWR_LEVEL_SERVICE_UUID ), HI_UINT16( TX_PWR_LEVEL_SERVICE_UUID ) +}; + +// Alert Level Attribute UUID +CONST uint8 alertLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PROXIMITY_ALERT_LEVEL_UUID ), HI_UINT16( PROXIMITY_ALERT_LEVEL_UUID ) +}; + +// Tx Power Level Attribute UUID +CONST uint8 txPwrLevelUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16( PROXIMITY_TX_PWR_LEVEL_UUID ), HI_UINT16( PROXIMITY_TX_PWR_LEVEL_UUID ) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static proxReporterCBs_t *pp_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Link Loss Service +static CONST gattAttrType_t linkLossService = { ATT_BT_UUID_SIZE, linkLossServUUID }; + +// Alert Level Characteristic Properties +static uint8 llAlertLevelCharProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Alert Level attribute +// This attribute enumerates the level of alert. +static uint8 llAlertLevel = PP_ALERT_LEVEL_NO; + +// Immediate Alert Service +static CONST gattAttrType_t imAlertService = { ATT_BT_UUID_SIZE, imAlertServUUID }; + +// Alert Level Characteristic Properties +static uint8 imAlertLevelCharProps = GATT_PROP_WRITE_NO_RSP; + +// Alert Level attribute +// This attribute enumerates the level of alert. +static uint8 imAlertLevel = PP_ALERT_LEVEL_NO; + +// Tx Power Level Service +static CONST gattAttrType_t txPwrLevelService = { ATT_BT_UUID_SIZE, txPwrLevelServUUID }; + +// Tx Power Level Characteristic Properties +static uint8 txPwrLevelCharProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +// Tx Power Level attribute +// This attribute represents the range of transmit power levels in dBm with +// a range from -20 to +20 to a resolution of 1 dBm. +static int8 txPwrLevel = PP_DEFAULT_TX_POWER; + +// Tx Power Level Characteristic Configs +static gattCharCfg_t txPwrLevelConfig[GATT_MAX_NUM_CONN]; + + +/********************************************************************* + * Profile Attributes - Table + */ +// Link Loss Service Atttribute Table +static gattAttribute_t linkLossAttrTbl[] = +{ + // Link Loss service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&linkLossService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &llAlertLevelCharProps + }, + + // Alert Level attribute + { + { ATT_BT_UUID_SIZE, alertLevelUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &llAlertLevel + }, +}; + +// Immediate Alert Service Atttribute Table +static gattAttribute_t imAlertAttrTbl[] = +{ + // Immediate Alert service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&imAlertService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &imAlertLevelCharProps + }, + + // Alert Level attribute + { + { ATT_BT_UUID_SIZE, alertLevelUUID }, + GATT_PERMIT_WRITE, + 0, + &imAlertLevel + }, +}; + +// Tx Power Level Service Atttribute Table +static gattAttribute_t txPwrLevelAttrTbl[] = +{ + // Tx Power Level service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&txPwrLevelService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &txPwrLevelCharProps + }, + + // Tx Power Level attribute + { + { ATT_BT_UUID_SIZE, txPwrLevelUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&txPwrLevel + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)txPwrLevelConfig + }, + +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 proxReporter_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t proxReporter_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void proxReporter_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Prox Reporter Service Callbacks +CONST gattServiceCBs_t proxReporterCBs = +{ + proxReporter_ReadAttrCB, // Read callback function pointer + proxReporter_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn proxReporter_AddService + * + * @brief Initializes the Proximity Reporter service by + * registering GATT attributes with the GATT server. + * Only call this function once. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t ProxReporter_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + if ( services & PP_LINK_LOSS_SERVICE ) + { + // Register Link Loss attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( linkLossAttrTbl, + GATT_NUM_ATTRS( linkLossAttrTbl ), + &proxReporterCBs ); + } + + if ( ( status == SUCCESS ) && ( services & PP_IM_ALETR_SERVICE ) ) + { + // Register Link Loss attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( imAlertAttrTbl, + GATT_NUM_ATTRS( imAlertAttrTbl ), + &proxReporterCBs ); + } + + if ( ( status == SUCCESS ) && ( services & PP_TX_PWR_LEVEL_SERVICE ) ) + { + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, txPwrLevelConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( proxReporter_HandleConnStatusCB ); + + + // Register Tx Power Level attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( txPwrLevelAttrTbl, + GATT_NUM_ATTRS( txPwrLevelAttrTbl ), + &proxReporterCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn proxReporter_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t ProxReporter_RegisterAppCBs( proxReporterCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + pp_AppCBs = appCallbacks; + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + + +/********************************************************************* + * @fn proxReporter_SetParameter + * + * @brief Set a Proximity Reporter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ProxReporter_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + case PP_LINK_LOSS_ALERT_LEVEL: + if ( (len == sizeof ( uint8 )) && ((*((uint8*)value) <= PP_ALERT_LEVEL_HIGH)) ) + { + llAlertLevel = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case PP_IM_ALERT_LEVEL: + if ( len == sizeof ( uint8 ) ) + { + imAlertLevel = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case PP_TX_POWER_LEVEL: + if ( len == sizeof ( int8 ) ) + { + txPwrLevel = *((int8*)value); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( txPwrLevelConfig, (uint8 *)&txPwrLevel, FALSE, + txPwrLevelAttrTbl, GATT_NUM_ATTRS( txPwrLevelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ProxReporter_GetParameter + * + * @brief Get a Proximity Reporter parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ProxReporter_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case PP_LINK_LOSS_ALERT_LEVEL: + *((uint8*)value) = llAlertLevel; + break; + + case PP_IM_ALERT_LEVEL: + *((uint8*)value) = imAlertLevel; + break; + + case PP_TX_POWER_LEVEL: + *((int8*)value) = txPwrLevel; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn proxReporter_ReadAttrCB + * + * @brief Read an attribute. + * + * @param + * + * @return Success or Failure + */ +static uint8 proxReporter_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those types for reads + case PROXIMITY_ALERT_LEVEL_UUID: + case PROXIMITY_TX_PWR_LEVEL_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + //128-bit UUID + *pLen = 0; + status = ATT_ERR_INVALID_HANDLE; + } + + return ( status ); +} + +/********************************************************************* + * @fn proxReporter_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle – connection message was received on + * @param pReq - pointer to request + * + * @return Success or Failure + */ +static bStatus_t proxReporter_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notify = 0xFF; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case PROXIMITY_ALERT_LEVEL_UUID: + // Validate the value + // Make sure it's not a blob operation + if ( offset == 0 ) + { + if ( len > 1 ) + status = ATT_ERR_INVALID_VALUE_SIZE; + else + { + if ( pValue[0] > PP_ALERT_LEVEL_HIGH ) + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + if( pAttr->pValue == &llAlertLevel ) + notify = PP_LINK_LOSS_ALERT_LEVEL; + else + notify = PP_IM_ALERT_LEVEL; + } + + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + else + { + // 128-bit UUID + status = ATT_ERR_INVALID_HANDLE; + } + + // If an attribute changed then callback function to notify application of change + if ( (notify != 0xFF) && pp_AppCBs && pp_AppCBs->pfnAttrChange ) + pp_AppCBs->pfnAttrChange( notify ); + + return ( status ); +} + +/********************************************************************* + * @fn proxReporter_HandleConnStatusCB + * + * @brief Tx Power Level Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void proxReporter_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, txPwrLevelConfig ); + } + } +} + + + + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.h new file mode 100644 index 0000000..36406a9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Proximity/proxreporter.h @@ -0,0 +1,154 @@ +/************************************************************************************************** + Filename: proxreporter.h + Revised: $Date: 2011-06-27 14:14:31 -0700 (Mon, 27 Jun 2011) $ + Revision: $Revision: 26482 $ + + Description: This file contains Proximity - Reporter header file. + + + Copyright 2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef PROXIMITYREPORTER_H +#define PROXIMITYREPORTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define PP_LINK_LOSS_ALERT_LEVEL 0 // RW uint8 - Profile Attribute value +#define PP_IM_ALERT_LEVEL 1 // RW uint8 - Profile Attribute value +#define PP_TX_POWER_LEVEL 2 // RW int8 - Profile Attribute value + +// Proximity Profile Service UUIDs +#define LINK_LOSS_SERVICE_UUID 0x1803 +#define IMMEDIATE_ALERT_SERVICE_UUID 0x1802 +#define TX_PWR_LEVEL_SERVICE_UUID 0x1804 + +// Proximity Profile Attribute UUIDs +#define PROXIMITY_ALERT_LEVEL_UUID 0x2A06 +#define PROXIMITY_TX_PWR_LEVEL_UUID 0x2A07 + +// Alert Level Values +#define PP_ALERT_LEVEL_NO 0x00 +#define PP_ALERT_LEVEL_LOW 0x01 +#define PP_ALERT_LEVEL_HIGH 0x02 + +// Proximity Profile Services bit fields +#define PP_LINK_LOSS_SERVICE 0x00000001 // Link Loss Service +#define PP_IM_ALETR_SERVICE 0x00000002 // Immediate Alert Service +#define PP_TX_PWR_LEVEL_SERVICE 0x00000004 // Tx Power Level Service + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when the device has been started. Callback event to +// the Notify of an attribute change. +typedef NULL_OK void (*ppAttrChange_t)( uint8 attrParamID ); + +typedef struct +{ + ppAttrChange_t pfnAttrChange; // Whenever the Link Loss Alert attribute changes +} proxReporterCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * ProxReporter_InitService- Initializes the Proximity Reporter service by + * registering GATT attributes with the GATT server. Only call + * this function once. + + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t ProxReporter_AddService( uint32 services ); + +/* + * ProxReporter_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t ProxReporter_RegisterAppCBs( proxReporterCBs_t *appCallbacks ); + + +/* + * ProxReporter_SetParameter - Set a Proximity Reporter parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t ProxReporter_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * ProxReporter_GetParameter - Get a Proximity Reporter parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t ProxReporter_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* PROXIMITYREPORTER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.c new file mode 100644 index 0000000..b0ed7a5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.c @@ -0,0 +1,868 @@ +/************************************************************************************************** + Filename: runningservice.c + Revised: $Date: 2013-04-04 15:28:09 -0700 (Thu, 04 Apr 2013) $ + Revision: $Revision: 33765 $ + + Description: This file contains the Running Speed and Cadence (RSC) service + for use with the RunningSensor sample application. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "runningservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Running Service Task Events +#define RSC_CMD_IND_SEND_EVT 0x0001 + +#define RSC_MEAS_VALUE_POS 2 +#define RSC_MEAS_CFG_POS 3 +#define RSC_COMMAND_VALUE_POS 9 +#define RSC_COMMAND_CFG_POS 10 +#define COMMAND_IND_LENGTH 2 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// RSC service +CONST uint8 runningServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RSC_SERV_UUID), HI_UINT16(RSC_SERV_UUID) +}; + +// RSC measurement characteristic +CONST uint8 runningMeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RSC_MEAS_UUID), HI_UINT16(RSC_MEAS_UUID) +}; + +// RSC feature characteristic +CONST uint8 runningFeatureUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RSC_FEATURE_UUID), HI_UINT16(RSC_FEATURE_UUID) +}; + +// RSC sensor location characteristic +CONST uint8 runningSensLocUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RSC_SENS_LOC_UUID), HI_UINT16(RSC_SENS_LOC_UUID) +}; + +// RSC command characteristic +CONST uint8 runningCommandUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(RSC_COMMAND_UUID), HI_UINT16(RSC_COMMAND_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static runningServiceCB_t runningServiceCB = NULL; + +static uint8 supportedSensors = 0; +static bool scOpInProgress = FALSE; + +// Variables used in RSC command processing +static uint16 connectionHandle; +static attHandleValueInd_t rscCmdInd; + +/********************************************************************* + * Profile Attributes - variables + */ + +// TaskID +uint8 runningService_TaskID = 0; + +// RSC Service attribute +static CONST gattAttrType_t runningService = { ATT_BT_UUID_SIZE, runningServUUID }; + +// Available sensor locations +static uint8 supportedSensorLocations[RSC_MAX_SENSOR_LOCS] = { RSC_NO_SENSOR_LOC }; + +// Running Measurement Characteristic +// Note characteristic value is not stored here +static uint8 runningMeasProps = GATT_PROP_NOTIFY; +static uint8 runningMeas = 0; +static gattCharCfg_t runningMeasClientCharCfg[GATT_MAX_NUM_CONN]; + +// Feature Characteristic +static uint8 runningFeatureProps = GATT_PROP_READ; +static uint16 runningFeatures = RSC_NO_SUPPORT; + +// Sensor Location Characteristic +static uint8 runningSensLocProps = GATT_PROP_READ; +static uint8 runningSensLoc = RSC_NO_SENSOR_LOC; + +// Command Characteristic +static uint8 runningCommandProps = GATT_PROP_WRITE | GATT_PROP_INDICATE; +static uint8 runningCommand = 0; +static gattCharCfg_t runningCommandClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t runningAttrTbl[] = +{ + // RSC Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&runningService /* pValue */ + }, + + // RSC Measurement Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &runningMeasProps + }, + + // Measurement Value + { + { ATT_BT_UUID_SIZE, runningMeasUUID }, + 0, + 0, + &runningMeas + }, + + // Measurement Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &runningMeasClientCharCfg + }, + + // RSC Feature Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &runningFeatureProps + }, + + // Feature Value + { + { ATT_BT_UUID_SIZE, runningFeatureUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&runningFeatures + }, + + // RSC Sensor Location Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &runningSensLocProps + }, + + // Sensor Location Value + { + { ATT_BT_UUID_SIZE, runningSensLocUUID }, + GATT_PERMIT_READ, + 0, + &runningSensLoc + }, + + // RSC Command Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &runningCommandProps + }, + + // Command Value + { + { ATT_BT_UUID_SIZE, runningCommandUUID }, + GATT_PERMIT_WRITE, + 0, + &runningCommand + }, + + // Command Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &runningCommandClientCharCfg + } +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 running_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t running_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void running_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void running_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static bool running_SensorLocSupported( uint8 sensorLoc ); +static void running_ProcessRSCCmd( uint16 attrHandle, uint8 *pValue, uint8 len ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// RSC Service Callbacks +CONST gattServiceCBs_t runningCBs = +{ + running_ReadAttrCB, // Read callback function pointer + running_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn RunningService_Init + * + * @brief collect the OSAL task ID. + * + * @param task_id - OSAL task ID. + * + * @return none + */ +void RunningService_Init( uint8 task_id ) +{ + // Only purpose is to obtain task ID + runningService_TaskID = task_id; +} + +/********************************************************************* + * @fn RunningService_ProcessEvent + * + * @brief process incoming event. + * + * @param task_id - OSAL task id. + * + * @param events - event bit(s) set for the task(s) + * + * @return none + */ +uint16 RunningService_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( runningService_TaskID )) != NULL ) + { + running_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & RSC_CMD_IND_SEND_EVT ) + { + GATT_Indication( connectionHandle, &rscCmdInd, FALSE, runningService_TaskID ); + + // Set Control Point Cfg done + scOpInProgress = FALSE; + + return ( events ^ RSC_CMD_IND_SEND_EVT ); + } + + return 0; +} + +/********************************************************************* + * @fn running_ProcessOSALMsg + * + * @brief process incoming OSAL msg. + * + * @param pMsg- pointer to messag to be read. + * + * @return none + */ +void running_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GATT_MSG_EVENT: + running_ProcessGATTMsg( (gattMsgEvent_t *) pMsg ); + break; + + default: // do nothing + break; + } +} + +/********************************************************************* + * @fn running_ProcessGATTMsg + * + * @brief process incoming GATT msg. + * + * @param pMsg- pointer to messag to be read. + * + * @return none + */ +void running_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + if ( pMsg->method == ATT_HANDLE_VALUE_CFM ) + { + // Indication receipt was confirmed by the client. + // This is a placeholder for future. + } +} + +/********************************************************************* + * @fn running_SensorLocSupported + * + * @brief check to see if sensor location is supported + * + * @param sensorLoc - location to check for + * + * @return TRUE if supported, FALSE otherwise + */ +static bool running_SensorLocSupported( uint8 sensorLoc ) +{ + uint8 i; + + for (i = 0; i < supportedSensors; i++) + { + if (supportedSensorLocations[i] == sensorLoc) + { + return TRUE; + } + } + + return FALSE; +} + +/********************************************************************* + * @fn Running_AddService + * + * @brief Initializes the RSC service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Running_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, runningMeasClientCharCfg ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, runningCommandClientCharCfg); + + if ( services & RUNNING_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( runningAttrTbl, + GATT_NUM_ATTRS( runningAttrTbl ), + &runningCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Running_Register + * + * @brief Register a callback function with the RSC Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +void Running_Register( runningServiceCB_t pfnServiceCB ) +{ + runningServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Running_SetParameter + * + * @brief Set a RSC parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Running_SetParameter( uint8 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case RSC_SENS_LOC: + { + runningSensLoc = *((uint8*)pValue); + } + break; + + case RSC_FEATURE: + { + runningFeatures = *((uint16*)pValue); + } + break; + + case RSC_AVAIL_SENS_LOCS: + if ( supportedSensors < RSC_MAX_SENSOR_LOCS ) + { + supportedSensorLocations[supportedSensors++] = *((uint8*)pValue); + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Running_GetParameter + * + * @brief Get a RSC parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Running_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case RSC_FEATURE: + *((uint16*)value) = runningFeatures; + break; + + case RSC_SENS_LOC: + *((uint8*)value) = runningSensLoc; + break; + + case RSC_COMMAND: + *((uint8*)value) = runningCommand; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Running_MeasNotify + * + * @brief Send a notification containing a RSC + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Running_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, runningMeasClientCharCfg ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = runningAttrTbl[RSC_MEAS_VALUE_POS].handle; + + // Send the notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn running_ProcessRSCCmd + * + * @brief process an incoming RSC command. + * + * @param attrHandle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * + * @return none + */ +static void running_ProcessRSCCmd( uint16 attrHandle, uint8 *pValue, uint8 len ) +{ + uint8 rscStatus = RSC_SUCCESS; + + // Set Control Point Cfg in progress + scOpInProgress = TRUE; + + // Set indication info to be sent out + rscCmdInd.handle = attrHandle; + + rscCmdInd.len = 3; + rscCmdInd.value[0] = RSC_COMMAND_RSP; + rscCmdInd.value[1] = pValue[0]; + + switch ( pValue[0] ) + { + case RSC_SET_CUMM_VAL: + // If total distance is a feature + if ( ( len <= 5 ) && ( runningFeatures & RSC_TOTAL_DIST_SUPP ) ) + { + uint32 totalDistance; + + // full 32 bits were specified. + if ( ( len - 1 ) == 4 ) + { + totalDistance = BUILD_UINT32( pValue[1], pValue[2], pValue[3], pValue[4]); + } + else + { + totalDistance = 0; + + // In case only lower bits were specified and upper bits remain zero. + for( int i = 0; i < (len - 1); ++i ) + { + totalDistance += pValue[i + 1] << (i*8); + } + } + + // Notify app + if ( runningServiceCB != NULL ) + { + VOID (*runningServiceCB)( RSC_CMD_SET_CUMM_VAL, &totalDistance ); + } + } + else // characteristic not supported. + { + rscStatus = RSC_INVALID_PARAMETER; + } + break; + + case RSC_START_SENS_CALIB: + // If sensor calibration is supported + if ( ( len == 1 ) && ( runningFeatures & RSC_SENSOR_CALIB_SUPP ) ) + { + // Notify app + if ( runningServiceCB != NULL ) + { + if ( (*runningServiceCB)( RSC_CMD_START_SENS_CALIB, NULL ) != SUCCESS ) + { + // Calibration wasn't started + rscStatus = RSC_OPERATION_FAILED; + } + } + } + else // characteristic not supported. + { + // Send an indication with the list. + rscStatus = RSC_INVALID_PARAMETER; + } + break; + + case RSC_UPDATE_SENS_LOC: + // If multiple sensor locations is supported and that this is a valid location. + if ( ( len == 2 ) && + ( runningFeatures & RSC_MULTI_SENS_SUPP ) && + ( running_SensorLocSupported( pValue[1] ) == TRUE ) ) + { + // Update sensor location + runningSensLoc = pValue[1]; + + // Notify app + if ( runningServiceCB != NULL ) + { + VOID (*runningServiceCB)( RSC_CMD_UPDATE_SENS_LOC, NULL ); + } + } + else // characteristic not supported. + { + rscStatus = RSC_INVALID_PARAMETER; + } + break; + + case RSC_REQ_SUPP_SENS_LOC: + // If multiple sensor locations are supported and list requested + if ( ( len == 1 ) && ( runningFeatures & RSC_MULTI_SENS_SUPP ) ) + { + rscCmdInd.len += supportedSensors; + osal_memcpy( &(rscCmdInd.value[3]), supportedSensorLocations, supportedSensors ); + } + else // characteristic not supported. + { + // Send an indication with the list. + rscStatus = RSC_INVALID_PARAMETER; + } + break; + + default: + // Send an indication with opcode not suported response + rscStatus = RSC_OPCODE_NOT_SUPPORTED; + break; + } + + // Send indication of operation result + rscCmdInd.value[2] = rscStatus; + + // Ask our task to send out indication + osal_set_event( runningService_TaskID, RSC_CMD_IND_SEND_EVT ); +} + +/********************************************************************* + * @fn Running_HandleConnStatusCB + * + * @brief RSC Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Running_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, runningMeasClientCharCfg ); + GATTServApp_InitCharCfg( connHandle, runningCommandClientCharCfg ); + } + } +} + +/********************************************************************* + * @fn running_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 running_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + switch ( uuid ) + { + // Read Sensor Location + case RSC_SENS_LOC_UUID: + { + *pLen = 1; + pValue[0] = *pAttr->pValue; + } + break; + + // Read Running Feature List + case RSC_FEATURE_UUID: + { + *pLen = 2; + pValue[0] = LO_UINT16( runningFeatures ); + pValue[1] = HI_UINT16( runningFeatures ); + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // Notify app + if ( runningServiceCB != NULL ) + { + VOID (*runningServiceCB)( RSC_READ_ATTR, NULL ); + } + + return ( status ); +} + +/********************************************************************* + * @fn running_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t running_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + if ( offset > 0 ) + { + return (ATT_ERR_ATTR_NOT_LONG); + } + + switch ( uuid ) + { + case RSC_COMMAND_UUID: + // Make sure Control Point Cfg is not already in progress + if ( scOpInProgress == TRUE ) + { + status = RSC_ERR_PROC_IN_PROGRESS; + } + // Make sure Control Point Cfg is configured for Indications + else if ( (runningCommandClientCharCfg[connHandle].value & GATT_CLIENT_CFG_INDICATE) == FALSE ) + { + status = RSC_ERR_CCC_IMPROPER_CFG; + } + else + { + // Process RSC command + running_ProcessRSCCmd( pAttr->handle, pValue, len ); + connectionHandle = connHandle; + } + break; + + // For Measure and Commands CCC + case GATT_CLIENT_CHAR_CFG_UUID: + if ( pAttr->handle == runningAttrTbl[RSC_COMMAND_CFG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + // Notify app + if ( runningServiceCB != NULL ) + { + VOID (*runningServiceCB)( RSC_WRITE_ATTR, NULL ); + } + } + else if ( pAttr->handle == runningAttrTbl[RSC_MEAS_CFG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + // Notify app + if ( runningServiceCB != NULL ) + { + uint16 charCfg = BUILD_UINT16( pValue[0], pValue[1] ); + + VOID (*runningServiceCB)( ((charCfg == GATT_CFG_NO_OPERATION) ? + RSC_MEAS_NOTI_DISABLED : + RSC_MEAS_NOTI_ENABLED ), NULL ); + } + } + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +*********************************************************************/ \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.h new file mode 100644 index 0000000..e6f1181 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/RSC/runningservice.h @@ -0,0 +1,265 @@ +/************************************************************************************************** + Filename: runningservice.h + Revised: $Date: 2013-03-27 10:26:15 -0700 (Wed, 27 Mar 2013) $ + Revision: $Revision: 33609 $ + + Description: This file contains the Running Speed and Cadence (RSC) service definitions and + prototypes. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef RUNNINGSERVICE_H +#define RUNNINGSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +#define RUNNING_SERVICE 0x00000001 + +//ATT Error Codes +#define RSC_ERR_PROC_IN_PROGRESS 0x80 +#define RSC_ERR_CCC_IMPROPER_CFG 0x81 + +#define RSC_SUCCESS 1 +#define RSC_OPCODE_NOT_SUPPORTED 2 +#define RSC_INVALID_PARAMETER 3 +#define RSC_OPERATION_FAILED 4 + +//RSC Service Parameters +#define RSC_MEAS 1 +#define RSC_MEAS_CHAR_CFG 2 +#define RSC_FEATURE 3 +#define RSC_SENS_LOC 4 +#define RSC_COMMAND 5 +#define RSC_COMMAND_CHAR_CFG 6 +#define RSC_AVAIL_SENS_LOCS 7 + +//RSC Service UUID's +#define RSC_SERV_UUID 0x1814 +#define RSC_MEAS_UUID 0x2A53 +#define RSC_FEATURE_UUID 0x2A54 +#define RSC_SENS_LOC_UUID 0x2A5D +#define RSC_COMMAND_UUID 0x2A55 + +//RSC Fields +#define RSC_INST_STRIDE_PRESENT 0x01 +#define RSC_TOTAL_DIST_PRESENT 0x02 +#define RSC_WALKING_OR_RUNNING 0x04 + +//RSC SUPPORTED FEATURES +#define RSC_NO_SUPPORT 0x00 +#define RSC_STRIDE_SUPP 0x01 +#define RSC_TOTAL_DIST_SUPP 0x02 +#define RSC_WALKING_RUNNING_SUPP 0x04 +#define RSC_SENSOR_CALIB_SUPP 0x08 +#define RSC_MULTI_SENS_SUPP 0x10 +#define RSC_FULL_SUPPORT 0x1F + +//RSC Censor Locations +#define RSC_NO_SENSOR_LOC 0x00 +#define RSC_SENSOR_LOC_0 0x01 +#define RSC_SENSOR_LOC_1 0x02 +#define RSC_SENSOR_LOC_2 0x04 +#define RSC_SENSOR_LOC_3 0x08 +#define RSC_ALL_SENSORS 0xFF + +//Spec says there are 17 possible. +#define RSC_MAX_SENSOR_LOCS 8 + +//RSC Commands - arbitrarly assigned +#define RSC_SET_CUMM_VAL 1 +#define RSC_START_SENS_CALIB 2 +#define RSC_UPDATE_SENS_LOC 3 +#define RSC_REQ_SUPP_SENS_LOC 4 +#define RSC_COMMAND_RSP 16 + +// Values for flags +#define RSC_FLAGS_AT_REST 0x00 +#define RSC_FLAGS_STRIDE 0x01 +#define RSC_FLAGS_DIST 0x02 +#define RSC_FLAGS_ALL 0x03 + + +#define DEFAULT_NOTI_INTERVAL 1000 // in milliseconds + +#define VALUE_ROLL_OVER 64000 // in milliseconds + +// Callback events +#define RSC_CMD_SET_CUMM_VAL 1 +#define RSC_CMD_START_SENS_CALIB 2 +#define RSC_CMD_UPDATE_SENS_LOC 3 +#define RSC_MEAS_NOTI_ENABLED 4 +#define RSC_MEAS_NOTI_DISABLED 5 +#define RSC_READ_ATTR 6 +#define RSC_WRITE_ATTR 7 + +/********************************************************************* + * TYPEDEFS + */ + +// RSC service callback function +typedef bStatus_t (*runningServiceCB_t)(uint8 event, uint32 *pNewCummVal); + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn RunningService_Init + * + * @brief collect the OSAL task ID. + * + * @param task_id - OSAL task ID. + * + * @return none + */ +extern void RunningService_Init( uint8 task_id ); + +/********************************************************************* + * @fn RunningService_ProcessEvent + * + * @brief process incoming event. + * + * @param task_id - OSAL task id. + * + * @param events - event bit(s) set for the task(s) + * + * @return none + */ +extern uint16 RunningService_ProcessEvent( uint8 task_id, uint16 events ); + +/* + * @fn Runninging_AddService + * + * @brief Initializes the RSC service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * @return status + */ +extern bStatus_t Running_AddService( uint32 services ); + +/* + * @fn Running_Register + * + * @brief Register a callback function with the + * RSC Service + * + * @param pfnServiceCB - Callback function. + * + * @return none + */ +extern void Running_Register( runningServiceCB_t pfnServiceCB ); + +/* + * @fn Running_SetParameter + * + * @brief Set a RSC parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return status + */ +extern bStatus_t Running_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Running_GetParameter + * + * @brief Get a RSC parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Running_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Running_MeasNotify + * + * @brief Send a notification containing a RSC + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Running_MeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/********************************************************************* + * @fn Running_HandleConnStatusCB + * + * @brief RSC Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +extern void Running_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* RUNNINGSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.c new file mode 100644 index 0000000..8f6c8c2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.c @@ -0,0 +1,637 @@ +/************************************************************************************************** + Filename: broadcaster.c + Revised: $Date: 2011-05-05 10:12:10 -0700 (Thu, 05 May 2011) $ + Revision: $Revision: 25871 $ + + Description: GAP Broadcaster Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci_tl.h" + +#include "gap.h" + +#include "broadcaster.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // BR/EDR not supported + GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +// Application callbacks +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + if ( gapRole_state == GAPROLE_ADVERTISING ) + { + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in broadcaster.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in broadcaster.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = GAP_PROFILE_BROADCASTER; + + gapRole_AdvEventType = GAP_ADTYPE_ADV_NONCONN_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in broadcaster.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + + return ( events ^ START_ADVERTISING_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + //hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, TRUE, + gapRole_AdvertDataLen, + gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + gapRole_state = GAPROLE_ADVERTISING; + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + NULL, NULL, NULL ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.h new file mode 100644 index 0000000..3aed6a9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/broadcaster.h @@ -0,0 +1,220 @@ +/** + @headerfile: broadcaster.h + $Date: 2011-02-17 12:17:30 -0800 (Thu, 17 Feb 2011) $ + $Revision: 25119 $ + + @mainpage TI BLE GAP Broadcaster Role + + This GAP profile only advertises. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef BROADCASTER_H +#define BROADCASTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_BD_ADDR 0x301 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x302 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_OFF_TIME 0x303 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x304 //!< Advertisement Data. Read/Write. Size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x305 //!< Scan Response Data. Read/Write. Size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x306 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x307 //!< Direct Advertisement Address Type. Ready/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x308 //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x309 //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30A //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Broadcaster Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BROADCASTER_API GAP Broadcaster Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @} End GAPROLES_BROADCASTER_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* BROADCASTER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.c new file mode 100644 index 0000000..4ce33c0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.c @@ -0,0 +1,694 @@ +/************************************************************************************************** + Filename: central.c + Revised: $Date: 2012-05-18 09:00:17 -0700 (Fri, 18 May 2012) $ + Revision: $Revision: 30571 $ + + Description: GAP Central Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_cbTimer.h" +#include "osal_snv.h" +#include "hci_tl.h" +#include "l2cap.h" +#include "linkdb.h" +#include "gap.h" +#include "gapbondmgr.h" +#include "central.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Events +#define START_ADVERTISING_EVT 0x0001 +#define RSSI_READ_EVT 0x0002 +#define UPDATE_PARAMS_TIMEOUT_EVT 0x0004 + +// Profile OSAL Message IDs +#define GAPCENTRALROLE_RSSI_MSG_EVT 0xE0 + +/********************************************************************* + * TYPEDEFS + */ + +// RSSI read data structure +typedef struct +{ + uint16 period; + uint16 connHandle; + uint8 timerId; +} gapCentralRoleRssi_t; + +// OSAL event structure for RSSI timer events +typedef struct +{ + osal_event_hdr_t hdr; + gapCentralRoleRssi_t *pRssi; +} gapCentralRoleRssiEvent_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Task ID +static uint8 gapCentralRoleTaskId; + +// App callbacks +static gapCentralRoleCB_t *pGapCentralRoleCB; + +// Array of RSSI read structures +static gapCentralRoleRssi_t gapCentralRoleRssi[GAPCENTRALROLE_NUM_RSSI_LINKS]; + +/********************************************************************* + * Profile Parameters - reference GAPCENTRALROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapCentralRoleIRK[KEYLEN]; +static uint8 gapCentralRoleSRK[KEYLEN]; +static uint32 gapCentralRoleSignCounter; +static uint8 gapCentralRoleBdAddr[B_ADDR_LEN]; +static uint8 gapCentralRoleMaxScanRes = 0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapCentralRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapCentralRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static gapCentralRoleRssi_t *gapCentralRole_RssiAlloc( uint16 connHandle ); +static gapCentralRoleRssi_t *gapCentralRole_RssiFind( uint16 connHandle ); +static void gapCentralRole_RssiFree( uint16 connHandle ); +static void gapCentralRole_timerCB( uint8 *pData ); + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartDevice( gapCentralRoleCB_t *pAppCallbacks ) +{ + if ( pAppCallbacks ) + { + pGapCentralRoleCB = pAppCallbacks; + } + + return GAP_DeviceInit( gapCentralRoleTaskId, GAP_PROFILE_CENTRAL, + gapCentralRoleMaxScanRes, gapCentralRoleIRK, + gapCentralRoleSRK, &gapCentralRoleSignCounter ); +} + +/** + * @brief Set a parameter in the Central Profile. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPCENTRALROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapCentralRoleIRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapCentralRoleSRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapCentralRoleSignCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPCENTRALROLE_MAX_SCAN_RES: + if ( len == sizeof ( uint8 ) ) + { + gapCentralRoleMaxScanRes = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Get a parameter in the Central Profile. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPCENTRALROLE_IRK: + VOID osal_memcpy( pValue, gapCentralRoleIRK, KEYLEN ) ; + break; + + case GAPCENTRALROLE_SRK: + VOID osal_memcpy( pValue, gapCentralRoleSRK, KEYLEN ) ; + break; + + case GAPCENTRALROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapCentralRoleSignCounter; + break; + + case GAPCENTRALROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapCentralRoleBdAddr, B_ADDR_LEN ) ; + break; + + case GAPCENTRALROLE_MAX_SCAN_RES: + *((uint8*)pValue) = gapCentralRoleMaxScanRes; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Terminate a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_TerminateLink( uint16 connHandle ) +{ + return GAP_TerminateLinkReq( gapCentralRoleTaskId, connHandle ) ; +} + +/** + * @brief Establish a link to a peer device. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_EstablishLink( uint8 highDutyCycle, uint8 whiteList, + uint8 addrTypePeer, uint8 *peerAddr ) +{ + gapEstLinkReq_t params; + + params.taskID = gapCentralRoleTaskId; + params.highDutyCycle = highDutyCycle; + params.whiteList = whiteList; + params.addrTypePeer = addrTypePeer; + VOID osal_memcpy( params.peerAddr, peerAddr, B_ADDR_LEN ); + + return GAP_EstablishLinkReq( ¶ms ); +} + +/** + * @brief Update the link connection parameters. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_UpdateLink( uint16 connHandle, uint16 connIntervalMin, + uint16 connIntervalMax, uint16 connLatency, + uint16 connTimeout ) +{ + return (bStatus_t) HCI_LE_ConnUpdateCmd( connHandle, connIntervalMin, + connIntervalMax, connLatency, + connTimeout, 0, 0 ); +} + +/** + * @brief Start a device discovery scan. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ) +{ + gapDevDiscReq_t params; + + params.taskID = gapCentralRoleTaskId; + params.mode = mode; + params.activeScan = activeScan; + params.whiteList = whiteList; + + return GAP_DeviceDiscoveryRequest( ¶ms ); +} + +/** + * @brief Cancel a device discovery scan. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_CancelDiscovery( void ) +{ + return GAP_DeviceDiscoveryCancel( gapCentralRoleTaskId ); +} + +/** + * @brief Start periodic RSSI reads on a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_StartRssi( uint16 connHandle, uint16 period ) +{ + gapCentralRoleRssi_t *pRssi; + + // Verify link is up + if (!linkDB_Up(connHandle)) + { + return bleIncorrectMode; + } + + // If already allocated + if ((pRssi = gapCentralRole_RssiFind( connHandle )) != NULL) + { + // Stop timer + osal_CbTimerStop( pRssi->timerId ); + } + // Allocate structure + else if ((pRssi = gapCentralRole_RssiAlloc( connHandle )) != NULL) + { + pRssi->period = period; + } + // Allocate failed + else + { + return bleNoResources; + } + + // Start timer + osal_CbTimerStart( gapCentralRole_timerCB, (uint8 *) pRssi, + period, &pRssi->timerId ); + + return SUCCESS; +} + +/** + * @brief Cancel periodic RSSI reads on a link. + * + * Public function defined in central.h. + */ +bStatus_t GAPCentralRole_CancelRssi(uint16 connHandle ) +{ + gapCentralRoleRssi_t *pRssi; + + if ((pRssi = gapCentralRole_RssiFind( connHandle )) != NULL) + { + // Stop timer + osal_CbTimerStop( pRssi->timerId ); + + // Free RSSI structure + gapCentralRole_RssiFree( connHandle ); + + return SUCCESS; + } + + // Not found + return bleIncorrectMode; +} + +/** + * @brief Central Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +void GAPCentralRole_Init( uint8 taskId ) +{ + uint8 i; + + gapCentralRoleTaskId = taskId; + + // Initialize internal data + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + gapCentralRoleRssi[i].connHandle = GAP_CONNHANDLE_ALL; + gapCentralRoleRssi[i].timerId = INVALID_TIMER_ID; + } + + // Initialize parameters + + // Retore items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapCentralRoleIRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapCentralRoleSRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapCentralRoleSignCounter ); + + // Register for HCI messages (for RSSI) + GAP_RegisterForHCIMsgs( taskId ); +} + +/** + * @brief Central Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +uint16 GAPCentralRole_ProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapCentralRoleTaskId )) != NULL ) + { + gapCentralRole_ProcessOSALMsg( (osal_event_hdr_t *) pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapCentralRoleSignCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapCentralRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapCentralRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *) pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + uint16 connHandle = BUILD_UINT16( pPkt->pReturnParam[1], pPkt->pReturnParam[2] ); + int8 rssi = (int8) pPkt->pReturnParam[3]; + + // Report RSSI to app + if ( pGapCentralRoleCB && pGapCentralRoleCB->rssiCB ) + { + pGapCentralRoleCB->rssiCB( connHandle, rssi ); + } + } + } + break; + + case GAP_MSG_EVENT: + gapCentralRole_ProcessGAPMsg( (gapEventHdr_t *) pMsg ); + break; + + case GAPCENTRALROLE_RSSI_MSG_EVT: + { + gapCentralRoleRssi_t *pRssi = ((gapCentralRoleRssiEvent_t *) pMsg)->pRssi; + + // If link is up and RSSI reads active + if (pRssi->connHandle != GAP_CONNHANDLE_ALL && + linkDB_Up(pRssi->connHandle)) + { + // Restart timer + osal_CbTimerStart( gapCentralRole_timerCB, (uint8 *) pRssi, + pRssi->period, &pRssi->timerId ); + + // Read RSSI + VOID HCI_ReadRssiCmd( pRssi->connHandle ); + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapCentralRole_ProcessGAPMsg + * + * @brief Process an incoming task message from GAP. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapCentralRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *) pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapCentralRoleIRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapCentralRoleSRK ); + + // Save off the information + VOID osal_memcpy( gapCentralRoleBdAddr, pPkt->devAddr, B_ADDR_LEN ); + } + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *) pMsg; + + if (pPkt->hdr.status == SUCCESS) + { + // Notify the Bond Manager of the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, + pPkt->connectionHandle, GAP_PROFILE_CENTRAL ); + } + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + uint16 connHandle = ((gapTerminateLinkEvent_t *) pMsg)->connectionHandle; + + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + + // Cancel RSSI reads + GAPCentralRole_CancelRssi( connHandle ); + } + break; + + // temporary workaround + case GAP_SLAVE_REQUESTED_SECURITY_EVENT: + GAPBondMgr_ProcessGAPMsg( pMsg ); + break; + + default: + break; + } + + // Pass event to app + if ( pGapCentralRoleCB && pGapCentralRoleCB->eventCB ) + { + pGapCentralRoleCB->eventCB( (gapCentralRoleEvent_t *) pMsg ); + } +} + +/********************************************************************* + * @fn gapCentralRole_RssiAlloc + * + * @brief Allocate an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return pointer to structure or NULL if allocation failed. + */ +static gapCentralRoleRssi_t *gapCentralRole_RssiAlloc( uint16 connHandle ) +{ + uint8 i; + + // Find free RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == GAP_CONNHANDLE_ALL ) + { + gapCentralRoleRssi[i].connHandle = connHandle; + return &gapCentralRoleRssi[i]; + } + } + + // No free structure found + return NULL; +} + +/********************************************************************* + * @fn gapCentralRole_RssiFind + * + * @brief Find an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return pointer to structure or NULL if not found. + */ +static gapCentralRoleRssi_t *gapCentralRole_RssiFind( uint16 connHandle ) +{ + uint8 i; + + // Find free RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == connHandle ) + { + return &gapCentralRoleRssi[i]; + } + } + + // Not found + return NULL; +} + +/********************************************************************* + * @fn gapCentralRole_RssiFree + * + * @brief Free an RSSI structure. + * + * @param connHandle - Connection handle + * + * @return none + */ +static void gapCentralRole_RssiFree( uint16 connHandle ) +{ + uint8 i; + + // Find RSSI structure + for ( i = 0; i < GAPCENTRALROLE_NUM_RSSI_LINKS; i++ ) + { + if ( gapCentralRoleRssi[i].connHandle == connHandle ) + { + gapCentralRoleRssi[i].connHandle = GAP_CONNHANDLE_ALL; + break; + } + } +} + +/********************************************************************* + * @fn gapCentralRole_timerCB + * + * @brief OSAL timer callback function + * + * @param pData - Data pointer + * + * @return none + */ +static void gapCentralRole_timerCB( uint8 *pData ) +{ + gapCentralRoleRssiEvent_t *pMsg; + + // Timer has expired so clear timer ID + ((gapCentralRoleRssi_t *) pData)->timerId = INVALID_TIMER_ID; + + // Send OSAL message + pMsg = (gapCentralRoleRssiEvent_t *) osal_msg_allocate( sizeof(gapCentralRoleRssiEvent_t) ); + if ( pMsg ) + { + pMsg->hdr.event = GAPCENTRALROLE_RSSI_MSG_EVT; + pMsg->pRssi = (gapCentralRoleRssi_t *) pData; + + osal_msg_send ( gapCentralRoleTaskId, (uint8 *) pMsg ); + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.h new file mode 100644 index 0000000..d7d4709 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/central.h @@ -0,0 +1,308 @@ +/** + @headerfile: central.h + $Date: 2012-01-09 12:08:41 -0800 (Mon, 09 Jan 2012) $ + $Revision: 28871 $ + + @mainpage TI BLE GAP Central Role + + This GAP profile discovers and initiates connections. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef CENTRAL_H +#define CENTRAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "gap.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GAPCENTRALROLE_PROFILE_PARAMETERS GAP Central Role Parameters + * @{ + */ +#define GAPCENTRALROLE_IRK 0x400 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPCENTRALROLE_SRK 0x401 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPCENTRALROLE_SIGNCOUNTER 0x402 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPCENTRALROLE_BD_ADDR 0x403 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPCENTRALROLE_MAX_SCAN_RES 0x404 //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +/** @} End GAPCENTRALROLE_PROFILE_PARAMETERS */ + +/** + * Number of simultaneous links with periodic RSSI reads + */ +#ifndef GAPCENTRALROLE_NUM_RSSI_LINKS +#define GAPCENTRALROLE_NUM_RSSI_LINKS 4 +#endif + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Central Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. + gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. + gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. + gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure. +} gapCentralRoleEvent_t; + +/** + * RSSI Read Callback Function + */ +typedef void (*pfnGapCentralRoleRssiCB_t) +( + uint16 connHandle, //!< Connection handle. + int8 rssi //!< New RSSI value. +); + +/** + * Central Event Callback Function + */ +typedef void (*pfnGapCentralRoleEventCB_t) +( + gapCentralRoleEvent_t *pEvent //!< Pointer to event structure. +); + +/** + * Central Callback Structure + */ +typedef struct +{ + pfnGapCentralRoleRssiCB_t rssiCB; //!< RSSI callback. + pfnGapCentralRoleEventCB_t eventCB; //!< Event callback. +} gapCentralRoleCB_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * Central Profile Public APIs + */ + +/** + * @defgroup CENTRAL_PROFILE_API Central Profile API Functions + * + * @{ + */ + +/** + * @brief Start the device in Central role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPCentralRole_StartDevice( gapCentralRoleCB_t *pAppCallbacks ); + +/** + * @brief Set a parameter in the Central Profile. + * + * @param param - profile parameter ID: @ref GAPCENTRALROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type. + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPCentralRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a parameter in the Central Profile. + * + * @param param - profile parameter ID: @ref GAPCENTRALROLE_PROFILE_PARAMETERS + * @param pValue - pointer to buffer to contain the read data + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPCentralRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Terminate a link. + * + * @param connHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started.
+ * bleIncorrectMode: No link to terminate.
+ */ +extern bStatus_t GAPCentralRole_TerminateLink( uint16 connHandle ); + +/** + * @brief Establish a link to a peer device. + * + * @param highDutyCycle - TRUE to high duty cycle scan, FALSE if not + * @param whiteList - determines use of the white list: @ref GAP_WHITELIST_DEFINES + * @param addrTypePeer - address type of the peer device: @ref GAP_ADDR_TYPE_DEFINES + * @param peerAddr - peer device address + * + * @return SUCCESS: started establish link process.
+ * bleIncorrectMode: invalid profile role.
+ * bleNotReady: a scan is in progress.
+ * bleAlreadyInRequestedMode: can’t process now.
+ * bleNoResources: too many links.
+ */ +extern bStatus_t GAPCentralRole_EstablishLink( uint8 highDutyCycle, uint8 whiteList, + uint8 addrTypePeer, uint8 *peerAddr ); + +/** + * @brief Update the link connection parameters. + * + * @param connHandle - connection handle + * @param connIntervalMin - minimum connection interval in 1.25ms units + * @param connIntervalMax - maximum connection interval in 1.25ms units + * @param connLatency - number of LL latency connection events + * @param connTimeout - connection timeout in 10ms units + * + * @return SUCCESS: Connection update started started.
+ * bleIncorrectMode: No connection to update.
+ */ +extern bStatus_t GAPCentralRole_UpdateLink( uint16 connHandle, uint16 connIntervalMin, + uint16 connIntervalMax, uint16 connLatency, + uint16 connTimeout ); +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPCentralRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPCentralRole_CancelDiscovery( void ); + +/** + * @brief Start periodic RSSI reads on a link. + * + * @param connHandle - connection handle of link + * @param period - RSSI read period in ms + * + * @return SUCCESS: Terminate started.
+ * bleIncorrectMode: No link.
+ * bleNoResources: No resources.
+ */ +extern bStatus_t GAPCentralRole_StartRssi( uint16 connHandle, uint16 period ); + +/** + * @brief Cancel periodic RSSI reads on a link. + * + * @param connHandle - connection handle of link + * + * @return SUCCESS: Operation successful.
+ * bleIncorrectMode: No link.
+ */ +extern bStatus_t GAPCentralRole_CancelRssi(uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Central Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +extern void GAPCentralRole_Init( uint8 taskId ); + +/** + * @internal + * + * @brief Central Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +extern uint16 GAPCentralRole_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* CENTRAL_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gap.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gap.c new file mode 100644 index 0000000..53f6e4d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gap.c @@ -0,0 +1,213 @@ +/************************************************************************************************* + Filename: gap.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the GAP Configuration API. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#include "bcomdef.h" +#include "gap.h" +#include "sm.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * Called to setup the device. Call just once. + * + * Public function defined in gap.h. + */ +bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ) +{ + bStatus_t stat = INVALIDPARAMETER; // Return status + + // Valid profile roles and supported combinations + switch ( profileRole ) + { + case GAP_PROFILE_BROADCASTER: + #if ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_OBSERVER: + #if ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_PERIPHERAL: + #if ( HOST_CONFIG & PERIPHERAL_CFG ) + { + stat = SUCCESS; + } + #endif + break; + + case GAP_PROFILE_CENTRAL: + #if ( HOST_CONFIG & CENTRAL_CFG ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_BROADCASTER | GAP_PROFILE_OBSERVER): + #if ( ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) && \ + ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_PERIPHERAL | GAP_PROFILE_OBSERVER): + #if ( ( HOST_CONFIG & PERIPHERAL_CFG ) && \ + ( HOST_CONFIG & ( OBSERVER_CFG | CENTRAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + case (GAP_PROFILE_CENTRAL | GAP_PROFILE_BROADCASTER): + #if ( ( HOST_CONFIG & CENTRAL_CFG ) && \ + ( HOST_CONFIG & ( BROADCASTER_CFG | PERIPHERAL_CFG ) ) ) + { + stat = SUCCESS; + } + #endif + break; + + // Invalid profile roles + default: + stat = INVALIDPARAMETER; + break; + } + + if ( stat == SUCCESS ) + { + // Setup the device configuration parameters + stat = GAP_ParamsInit( taskID, profileRole ); + if ( stat == SUCCESS ) + { + #if ( HOST_CONFIG & ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + { + GAP_SecParamsInit( pIRK, pSRK, pSignCounter ); + } + #endif + + #if ( HOST_CONFIG & ( CENTRAL_CFG | OBSERVER_CFG ) ) + { + if ( (profileRole == GAP_PROFILE_BROADCASTER) || + (profileRole == GAP_PROFILE_PERIPHERAL) ) + { + maxScanResponses = 0; // Can't scan, so no need for responses. Force 0. + } + + // Initialize GAP Central Device Manager + VOID GAP_CentDevMgrInit( maxScanResponses ); + + #if ( HOST_CONFIG & CENTRAL_CFG ) + { + // Register GAP Central Connection processing functions + GAP_CentConnRegister(); + + // Initialize SM Initiator + VOID SM_InitiatorInit(); + } + #endif + } + #endif + + #if ( HOST_CONFIG & ( PERIPHERAL_CFG | BROADCASTER_CFG ) ) + { + // Initialize GAP Peripheral Device Manager + VOID GAP_PeriDevMgrInit(); + + #if ( HOST_CONFIG & PERIPHERAL_CFG ) + { + // Initialize SM Responder + VOID SM_ResponderInit(); + } + #endif + } + #endif + } + } + + return ( stat ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.c new file mode 100644 index 0000000..75b456a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.c @@ -0,0 +1,2057 @@ +/************************************************************************************************** + Filename: gapbondmgr.c + Revised: $Date: 2011-02-24 15:46:53 -0800 (Thu, 24 Feb 2011) $ + Revision: $Revision: 10 $ + + Description: GAP peripheral profile manages bonded connections + + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#if ( HOST_CONFIG & ( CENTRAL_CFG | PERIPHERAL_CFG ) ) + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "gap.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "hci.h" +#include "gattservapp.h" +#include "gapgattserver.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Task event types +#define GAP_BOND_SYNC_CC_EVT 0x0001 // Sync char config + +// Once NV usage reaches this percentage threshold, NV compaction gets triggered. +#define NV_COMPACT_THRESHOLD 80 + +// Bonded State Flags +#define GAP_BONDED_STATE_AUTHENTICATED 0x0001 +#define GAP_BONDED_STATE_SERVICE_CHANGED 0x0002 + +/** + * GAP Bond Manager NV layout + * + * The NV definitions: + * BLE_NVID_GAP_BOND_START - starting NV ID + * GAP_BONDINGS_MAX - Maximum number of bonding allowed (10 is max for number of NV IDs allocated in bcomdef.h). + * + * A single bonding entry consists of 6 components (NV items): + * Bond Record - defined as gapBondRec_t and uses GAP_BOND_REC_ID_OFFSET for an NV ID + * local LTK Info - defined as gapBondLTK_t and uses GAP_BOND_LOCAL_LTK_OFFSET for an NV ID + * device LTK Info - defined as gapBondLTK_t and uses GAP_BOND_DEV_LTK_OFFSET for an NV ID + * device IRK - defined as "uint8 devIRK[KEYLEN]" and uses GAP_BOND_DEV_IRK_OFFSET for an NV ID + * device CSRK - defined as "uint8 devCSRK[KEYLEN]" and uses GAP_BOND_DEV_CSRK_OFFSET for an NV ID + * device Sign Counter - defined as a uint32 and uses GAP_BOND_DEV_SIGN_COUNTER_OFFSET for an NV ID + * + * When the device is initialized for the first time, all (GAP_BONDINGS_MAX) NV items are created and + * initialized to all 0xFF's. A bonding record of all 0xFF's indicates that the bonding record is empty + * and free to use. + * + * The calculation for each bonding records NV IDs: + * mainRecordNvID = ((bondIdx * GAP_BOND_REC_IDS) + BLE_NVID_GAP_BOND_START) + * localLTKNvID = (((bondIdx * GAP_BOND_REC_IDS) + GAP_BOND_LOCAL_LTK_OFFSET) + BLE_NVID_GAP_BOND_START) + * + */ +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter + +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// Macros to calculate the GATT index/offset in to NV space +#define gattCfgNvID(Idx) ((Idx) + BLE_NVID_GATT_CFG_START) + +// Key Size Limits +#define MIN_ENC_KEYSIZE 7 //!< Minimum number of bytes for the encryption key +#define MAX_ENC_KEYSIZE 16 //!< Maximum number of bytes for the encryption key + +/********************************************************************* + * TYPEDEFS + */ + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8 LTK[KEYLEN]; // Long Term Key (LTK) + uint16 div; //lint -e754 // LTK eDiv + uint8 rand[B_RANDOM_NUM_SIZE]; // LTK random number + uint8 keySize; // LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8 publicAddr[B_ADDR_LEN]; // Master's address + uint8 reconnectAddr[B_ADDR_LEN]; // Privacy Reconnection Address + uint16 stateFlags; // State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING +} gapBondRec_t; + +// Structure of NV data for the connected device's characteristic configuration +typedef struct +{ + uint16 attrHandle; // attribute handle + uint8 value; // attribute value for this device +} gapBondCharCfg_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapBondMgr_TaskID; // Task ID for internal task/event processing + +// GAPBonding Parameters +static uint8 gapBond_PairingMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; +static uint16 gapBond_InitiateWait = 1000; // Default to 1 second +static uint8 gapBond_MITM = FALSE; +static uint8 gapBond_IOCap = GAPBOND_IO_CAP_DISPLAY_ONLY; +static uint8 gapBond_OOBDataFlag = FALSE; +static uint8 gapBond_OOBData[KEYLEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8 gapBond_Bonding = FALSE; +static uint8 gapBond_AutoFail = FALSE; +static uint8 gapBond_AutoFailReason = SMP_PAIRING_FAILED_NOT_SUPPORTED; +static uint8 gapBond_KeyDistList = +( + GAPBOND_KEYDIST_SENCKEY // sEncKey enabled, to send the encryption key + | GAPBOND_KEYDIST_SIDKEY // sIdKey enabled, to send the IRK, and BD_ADDR + | GAPBOND_KEYDIST_SSIGN // sSign enabled, to send the CSRK + | GAPBOND_KEYDIST_MENCKEY // mEncKey enabled, to get the master's encryption key + | GAPBOND_KEYDIST_MIDKEY // mIdKey enabled, to get the master's IRK and BD_ADDR + | GAPBOND_KEYDIST_MSIGN // mSign enabled, to get the master's CSRK +); +static uint32 gapBond_Passcode = 0; +static uint8 gapBond_KeySize = MAX_ENC_KEYSIZE; + +#if ( HOST_CONFIG & CENTRAL_CFG ) +static uint8 gapBond_BondFailOption = GAPBOND_FAIL_TERMINATE_LINK; +#endif + +static const gapBondCBs_t *pGapBondCB = NULL; + +// Local RAM shadowed bond records +static gapBondRec_t bonds[GAP_BONDINGS_MAX] = {0}; + +static uint8 autoSyncWhiteList = FALSE; + +static uint8 eraseAllBonds = FALSE; + +// Connection handle saved for Synch Char Config +static uint16 connectionHandle; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ); +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ); +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ); +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ); +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ); +static uint8 gapBondMgrGetStateFlags( uint8 idx ); +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ); +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ); +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ); +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pAddr ); +static void gapBondMgrReadBonds( void ); +static uint8 gapBondMgrFindEmpty( void ); +static uint8 gapBondMgrBondTotal( void ); +static bStatus_t gapBondMgrEraseAllBondings( void ); +static bStatus_t gapBondMgrEraseBonding( uint8 idx ); +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ); +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ); +static void gapBondSetupPrivFlag( void ); +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ); +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ); +static void gapBondMgr_SyncWhiteList( void ); +static void gapBondMgr_SyncCharCfg( uint16 connHandle ); + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ); +#endif + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_PAIRING_MODE_INITIATE) ) + { + gapBond_PairingMode = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_INITIATE_WAIT: + if ( len == sizeof ( uint16 ) ) + { + gapBond_InitiateWait = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_MITM_PROTECTION: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_MITM = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_IO_CAPABILITIES: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_IO_CAP_KEYBOARD_DISPLAY) ) + { + gapBond_IOCap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_OOBDataFlag = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_DATA: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapBond_OOBData, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_BONDING_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_Bonding = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEY_DIST_LIST: + if ( len == sizeof ( uint8 ) ) + { + gapBond_KeyDistList = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_DEFAULT_PASSCODE: + if ( (len == sizeof ( uint32 )) + && (*((uint32*)pValue) <= GAP_PASSCODE_MAX) ) + { + gapBond_Passcode = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_ERASE_ALLBONDS: + if ( len == 0 ) + { + // Make sure there's no active connection + if ( GAP_NumActiveConnections() == 0 ) + { + // Erase all bonding records + VOID gapBondMgrEraseAllBondings(); + + // See if NV needs a compaction + VOID osal_snv_compact( NV_COMPACT_THRESHOLD ); + + // Make sure Bond RAM Shadow is up-to-date + gapBondMgrReadBonds(); + } + else + { + eraseAllBonds = TRUE; + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_AutoFail = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_REASON: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= SMP_PAIRING_FAILED_REPEATED_ATTEMPTS) ) + { + gapBond_AutoFailReason = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEYSIZE: + if ( (len == sizeof ( uint8 )) + && ((*((uint8*)pValue) >= MIN_ENC_KEYSIZE) && (*((uint8*)pValue) <= MAX_ENC_KEYSIZE)) ) + { + gapBond_KeySize = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_SYNC_WL: + if ( len == sizeof( uint8 ) ) + { + uint8 oldVal = autoSyncWhiteList; + + autoSyncWhiteList = *((uint8 *)pValue); + + // only call if parameter changes from FALSE to TRUE + if ( ( oldVal == FALSE ) && ( autoSyncWhiteList == TRUE ) ) + { + // make sure bond is updated from NV + gapBondMgrReadBonds(); + } + } + else + { + ret = bleInvalidRange; + } + break; + +#if ( HOST_CONFIG & CENTRAL_CFG ) + case GAPBOND_BOND_FAIL_ACTION: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_FAIL_TERMINATE_ERASE_BONDS) ) + { + gapBond_BondFailOption = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; +#endif + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + *((uint8*)pValue) = gapBond_PairingMode; + break; + + case GAPBOND_INITIATE_WAIT: + *((uint16*)pValue) = gapBond_InitiateWait; + break; + + case GAPBOND_MITM_PROTECTION: + *((uint8*)pValue) = gapBond_MITM; + break; + + case GAPBOND_IO_CAPABILITIES: + *((uint8*)pValue) = gapBond_IOCap; + break; + + case GAPBOND_OOB_ENABLED: + *((uint8*)pValue) = gapBond_OOBDataFlag; + break; + + case GAPBOND_OOB_DATA: + VOID osal_memcpy( pValue, gapBond_OOBData, KEYLEN ) ; + break; + + case GAPBOND_BONDING_ENABLED: + *((uint8*)pValue) = gapBond_Bonding; + break; + + case GAPBOND_KEY_DIST_LIST: + *((uint8*)pValue) = gapBond_KeyDistList; + break; + + case GAPBOND_DEFAULT_PASSCODE: + *((uint32*)pValue) = gapBond_Passcode; + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + *((uint8*)pValue) = gapBond_AutoFail; + break; + + case GAPBOND_AUTO_FAIL_REASON: + *((uint8*)pValue) = gapBond_AutoFailReason; + break; + + case GAPBOND_KEYSIZE: + *((uint8*)pValue) = gapBond_KeySize; + break; + + case GAPBOND_AUTO_SYNC_WL: + *((uint8*)pValue) = autoSyncWhiteList; + break; + + case GAPBOND_BOND_COUNT: + *((uint8*)pValue) = gapBondMgrBondTotal(); + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Notify the Bond Manager that a connection has been made. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ) +{ + uint8 idx; // NV Index + uint8 publicAddr[B_ADDR_LEN] // Place to put the public address + = {0, 0, 0, 0, 0, 0}; + + idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + uint8 stateFlags = gapBondMgrGetStateFlags( idx ); + smSigningInfo_t signingInfo; + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; // Space to read a char cfg record from NV + + // On peripheral, load the key information for the bonding + // On central and initiaiting security, load key to initiate encyption + gapBondMgrBondReq( connHandle, idx, stateFlags, role, + ((gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) ? TRUE : FALSE) ); + + // Load the Signing Key + VOID osal_memset( &signingInfo, 0, sizeof ( smSigningInfo_t ) ); + if ( osal_snv_read( devCSRKNvID(idx), KEYLEN, signingInfo.srk ) == SUCCESS ) + { + if ( osal_isbufset( signingInfo.srk, 0xFF, KEYLEN ) == FALSE ) + { + // Load the signing information for this connection + VOID osal_snv_read( devSignCounterNvID(idx), sizeof ( uint32 ), &(signingInfo.signCounter) ); + VOID GAP_Signable( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &signingInfo ); + } + } + + // Load the characteristic configuration + if ( osal_snv_read( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ) == SUCCESS ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + gapBondCharCfg_t *pItem = &(charCfg[i]); + + // Apply the characteristic configuration for this connection + if ( pItem->attrHandle != GATT_INVALID_HANDLE ) + { + VOID GATTServApp_UpdateCharCfg( connHandle, pItem->attrHandle, + (uint16)(pItem->value) ); + } + } + } + + // Has there been a service change? + if ( stateFlags & GAP_BONDED_STATE_SERVICE_CHANGED ) + { + VOID GATTServApp_SendServiceChangedInd( connHandle, gapBondMgr_TaskID ); + } + } +#if ( HOST_CONFIG & CENTRAL_CFG ) + else if ( role == GAP_PROFILE_CENTRAL && + gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + // If Central and initiating and not bonded, then initiate pairing + gapBondMgrAuthenticate( connHandle, addrType, NULL ); + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( connHandle, GAPBOND_PAIRING_STATE_STARTED, SUCCESS ); + } + } +#endif + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) + // If Peripheral and initiating, send a slave security request to + // initiate either pairing or encryption + if ( role == GAP_PROFILE_PERIPHERAL && + gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + gapBondMgrSlaveSecurityReq( connHandle ); + } +#endif + + return ( SUCCESS ); +} + +/********************************************************************* + * @brief Resolve an address from bonding information. + * + * Public function defined in gapbondmgr.h. + */ +uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ) +{ + uint8 idx = GAP_BONDINGS_MAX; + + switch ( addrType ) + { + case ADDRTYPE_PUBLIC: + case ADDRTYPE_STATIC: + idx = gapBondMgrFindAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID osal_memcpy( pResolvedAddr, pDevAddr, B_ADDR_LEN ); + } + break; + + case ADDRTYPE_PRIVATE_NONRESOLVE: + // This could be a reconnection address + idx = gapBondMgrFindReconnectAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + case ADDRTYPE_PRIVATE_RESOLVE: + // Master's don't use Private Resolvable addresses but just in case + idx = gapBondMgrResolvePrivateAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + default: + break; + } + + return ( idx ); +} + +/********************************************************************* + * @brief Set/clear the service change indication in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Service Change indication + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ) ) + { + ret = SUCCESS; + } + } + + // If the service change indication is TRUE, tell the connected devices + if ( setParam ) + { + // Run connected database + linkDB_PerformFunc( gapBondMgrSendServiceChange ); + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx; // loop counter + idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ); + ret = SUCCESS; + } + + // If the service change indication is TRUE, tell the connected device + if ( setParam ) + { + gapBondMgrSendServiceChange( pLinkItem ); + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Update the Characteristic Configuration in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == INVALID_CONNHANDLE ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Characteristic Configuration + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrUpdateCharCfg( idx, attrHandle, value ) ) + { + ret = SUCCESS; + } + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrUpdateCharCfg( idx, attrHandle, value ); + ret = SUCCESS; + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Register callback functions with the bond manager. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_Register( gapBondCBs_t *pCB ) +{ + pGapBondCB = pCB; + + // Take over the processing of Authentication messages + VOID GAP_SetParamValue( TGAP_AUTH_TASK_ID, gapBondMgr_TaskID ); + + // Register with GATT Server App for event messages + GATTServApp_RegisterForMsg( gapBondMgr_TaskID ); +} + +/********************************************************************* + * @brief Respond to a passcode request. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ) +{ + bStatus_t ret = SUCCESS; + + if ( status == SUCCESS ) + { + // Truncate the passcode + passcode = passcode % (GAP_PASSCODE_MAX + 1); + + ret = GAP_PasscodeUpdate( passcode, connectionHandle ); + if ( ret != SUCCESS ) + { + VOID GAP_TerminateAuth( connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + else + { + VOID GAP_TerminateAuth( connectionHandle, status ); + } + + return ret; +} + +/********************************************************************* + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_PASSKEY_NEEDED_EVENT: + { + gapPasskeyNeededEvent_t *pPkt = (gapPasskeyNeededEvent_t *)pMsg; + + if ( pGapBondCB && pGapBondCB->passcodeCB ) + { + // Ask app for a passcode + pGapBondCB->passcodeCB( pPkt->deviceAddr, pPkt->connectionHandle, pPkt->uiInputs, pPkt->uiOutputs ); + } + else + { + // No app support, use the default passcode + if ( GAP_PasscodeUpdate( gapBond_Passcode, pPkt->connectionHandle ) != SUCCESS ) + { + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + } + break; + + case GAP_AUTHENTICATION_COMPLETE_EVENT: + { + gapAuthCompleteEvent_t *pPkt = (gapAuthCompleteEvent_t *)pMsg; + + // Should we save bonding information + if ( (pPkt->hdr.status == SUCCESS) && (pPkt->authState & SM_AUTH_STATE_BONDING) ) + { + gapBondRec_t bondRec; + + VOID osal_memset( &bondRec, 0, sizeof ( gapBondRec_t ) ) ; + + // Do we have a public address in the data? + if ( pPkt->pIdentityInfo ) + { + VOID osal_memcpy( bondRec.publicAddr, pPkt->pIdentityInfo->bd_addr, B_ADDR_LEN ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + VOID osal_memcpy( bondRec.publicAddr, pLinkItem->addr, B_ADDR_LEN ); + } + else + { + // We don't have an address, so ignore the message. + break; + } + } + + // Save off of the authentication state + bondRec.stateFlags |= (pPkt->authState & SM_AUTH_STATE_AUTHENTICATED) ? GAP_BONDED_STATE_AUTHENTICATED : 0; + + VOID gapBondMgrAddBond( &bondRec, + (gapBondLTK_t *)pPkt->pSecurityInfo, + (gapBondLTK_t *)pPkt->pDevSecInfo, + ((uint8 *)((pPkt->pIdentityInfo) ? pPkt->pIdentityInfo->irk : NULL )), + ((uint8 *)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->srk : NULL )), + ((uint32)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->signCounter : GAP_INIT_SIGN_COUNTER )) ); + + // Notify our task to update NV with CCC values stored in GATT database + connectionHandle = pPkt->connectionHandle; + osal_set_event( gapBondMgr_TaskID, GAP_BOND_SYNC_CC_EVT ); + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_COMPLETE, pPkt->hdr.status ); + } + } + break; + + case GAP_BOND_COMPLETE_EVENT: + // This message is received when the bonding is complete. If hdr.status is SUCCESS + // then call app state callback. If hdr.status is NOT SUCCESS, the connection will be + // dropped at the LL because of a MIC failure, so again nothing to do. + { + gapBondCompleteEvent_t *pPkt = (gapBondCompleteEvent_t *)pMsg; + +#if ( HOST_CONFIG & CENTRAL_CFG ) + if ( pPkt->hdr.status == LL_ENC_KEY_REQ_REJECTED ) + { + // LTK not found on peripheral device (Pin or Key Missing). See which + // option was configured for unsuccessful bonding. + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + switch ( gapBond_BondFailOption ) + { + case GAPBOND_FAIL_INITIATE_PAIRING: + // Initiate pairing + gapBondMgrAuthenticate( pPkt->connectionHandle, pLinkItem->addrType, NULL ); + break; + + case GAPBOND_FAIL_TERMINATE_LINK: + // Drop connection + GAP_TerminateLinkReq( pLinkItem->taskID, pPkt->connectionHandle ); + break; + + case GAPBOND_FAIL_TERMINATE_ERASE_BONDS: + // Set up bond manager to erase all existing bonds after connection terminates + VOID GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, NULL ); + + // Drop connection + GAP_TerminateLinkReq( pLinkItem->taskID, pPkt->connectionHandle ); + break; + + case GAPBOND_FAIL_NO_ACTION: + // fall through + default: + // do nothing + break; + } + } + } +#endif + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_BONDED, pMsg->hdr.status ); + } + } + break; + + case GAP_SIGNATURE_UPDATED_EVENT: + { + uint8 idx; + gapSignUpdateEvent_t *pPkt = (gapSignUpdateEvent_t *)pMsg; + + idx = GAPBondMgr_ResolveAddr( pPkt->addrType, pPkt->devAddr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the sign counter + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &(pPkt->signCounter) ); + } + } + break; + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) + case GAP_PAIRING_REQ_EVENT: + { + gapPairingReqEvent_t *pPkt = (gapPairingReqEvent_t *)pMsg; + + if ( gapBond_AutoFail != FALSE ) + { + // Auto Fail TEST MODE (DON'T USE THIS) - Sends pre-setup reason + VOID GAP_TerminateAuth( pPkt->connectionHandle, gapBond_AutoFailReason ); + } + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // No Pairing - Send error + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + + // Requesting bonding? + if ( pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING ) + { + if ( pLinkItem ) + { + if ( (pLinkItem->addrType != ADDRTYPE_PUBLIC) && (pPkt->pairReq.keyDist.mIdKey == FALSE) ) + { + uint8 publicAddr[B_ADDR_LEN]; + + // Check if we already have the public address in NV + if ( GAPBondMgr_ResolveAddr(pLinkItem->addrType, pLinkItem->addr, publicAddr ) == FALSE ) + { + // Can't bond to a non-public address if we don't know the public address + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_AUTH_REQ ); + break; + } + } + } + else + { + // Can't find the connection, ignore the message + break; + } + } + + // Send pairing response + gapBondMgrAuthenticate( pPkt->connectionHandle, pLinkItem->addrType, &(pPkt->pairReq) ); + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, GAPBOND_PAIRING_STATE_STARTED, SUCCESS ); + } + } + } + break; +#endif + +#if ( HOST_CONFIG & CENTRAL_CFG ) + case GAP_SLAVE_REQUESTED_SECURITY_EVENT: + { + uint16 connHandle = ((gapSlaveSecurityReqEvent_t *)pMsg)->connectionHandle; + uint8 idx; + uint8 publicAddr[B_ADDR_LEN] = {0, 0, 0, 0, 0, 0}; + linkDBItem_t *pLink = linkDB_Find( connHandle ); + + // If link found and not already initiating security + if (pLink != NULL && gapBond_PairingMode != GAPBOND_PAIRING_MODE_INITIATE) + { + // If already bonded initiate encryption + idx = GAPBondMgr_ResolveAddr( pLink->addrType, pLink->addr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + gapBondMgrBondReq( connHandle, idx, gapBondMgrGetStateFlags( idx ), + GAP_PROFILE_CENTRAL, TRUE ); + } + // Else if no pairing allowed + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // Send error + VOID GAP_TerminateAuth( connHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + // Else if waiting for request + else if (gapBond_PairingMode == GAPBOND_PAIRING_MODE_WAIT_FOR_REQ) + { + // Initiate pairing + gapBondMgrAuthenticate( connHandle, pLink->addrType, NULL ); + } + } + } + break; +#endif + + case GAP_LINK_TERMINATED_EVENT: + if ( GAP_NumActiveConnections() == 0 ) + { + // See if we're asked to erase all bonding records + if ( eraseAllBonds == TRUE ) + { + VOID gapBondMgrEraseAllBondings(); + eraseAllBonds = FALSE; + } + + // See if NV needs a compaction + VOID osal_snv_compact( NV_COMPACT_THRESHOLD ); + + // Make sure Bond RAM Shadow is up-to-date + gapBondMgrReadBonds(); + } + break; + + default: + break; + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @fn gapBondMgrChangeState + * + * @brief Change a state flag in the stateFlags field of the bond record. + * + * @param idx - Bond NV index + * @param state - state flage to set or clear + * @param set - TRUE to set the flag, FALSE to clear the flag + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + // Update the state of the bonded device. + uint8 stateFlags = bondRec.stateFlags; + if ( set ) + { + stateFlags |= state; + } + else + { + stateFlags &= ~(state); + } + + if ( stateFlags != bondRec.stateFlags ) + { + bondRec.stateFlags = stateFlags; + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + } + return ( TRUE ); + } + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrUpdateCharCfg + * + * @brief Update the Characteristic Configuration of the bond record. + * + * @param idx - Bond NV index + * @param attrHandle - attribute handle (0 means all handles) + * @param value - characteristic configuration value + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( ( osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS ) + && ( osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) ) + { + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; // Space to read a char cfg record from NV + + if ( osal_snv_read( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ) == SUCCESS ) + { + uint8 update = FALSE; + + gapBondMgrInvertCharCfgItem( charCfg ); + + if ( attrHandle == GATT_INVALID_HANDLE ) + { + if ( osal_isbufset( (uint8 *)charCfg, 0x00, sizeof ( charCfg ) ) == FALSE ) + { + // Clear all characteristic configuration for this device + VOID osal_memset( (void *)charCfg, 0x00, sizeof ( charCfg ) ); + update = TRUE; + } + } + else + { + gapBondCharCfg_t *pItem = gapBondMgrFindCharCfgItem( attrHandle, charCfg ); + if ( pItem == NULL ) + { + // Must be a new item; ignore if the value is no operation (default) + if ( ( value == GATT_CFG_NO_OPERATION ) || + ( ( pItem = gapBondMgrFindCharCfgItem( GATT_INVALID_HANDLE, charCfg ) ) == NULL ) ) + { + return ( FALSE ); // No empty entry found + } + + pItem->attrHandle = attrHandle; + } + + if ( pItem->value != value ) + { + // Update characteristic configuration + pItem->value = (uint8)value; + if ( value == GATT_CFG_NO_OPERATION ) + { + // Erease the item + pItem->attrHandle = GATT_INVALID_HANDLE; + } + + update = TRUE; + } + } + + // Update the characteristic configuration of the bonded device. + if ( update ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + VOID osal_snv_write( gattCfgNvID(idx), sizeof( charCfg ), charCfg ); + } + } + + return ( TRUE ); + } + + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Find the Characteristic Configuration for a given attribute. + * Uses the attribute handle to search the charactersitic + * configuration table of a bonded device. + * + * @param attrHandle - attribute handle. + * @param charCfgTbl - characteristic configuration table. + * + * @return pointer to the found item. NULL, otherwise. + */ +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + if ( charCfgTbl[i].attrHandle == attrHandle ) + { + return ( &(charCfgTbl[i]) ); + } + } + + return ( (gapBondCharCfg_t *)NULL ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Invert the Characteristic Configuration for a given client. + * + * @param charCfgTbl - characteristic configuration table. + * + * @return none. + */ +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < GAP_CHAR_CFG_MAX; i++ ) + { + charCfgTbl[i].attrHandle = ~(charCfgTbl[i].attrHandle); + charCfgTbl[i].value = ~(charCfgTbl[i].value); + } +} + +/********************************************************************* + * @fn gapBondMgrAddBond + * + * @brief Save a bond from a GAP Auth Complete Event + * + * @param pBondRec - basic bond record + * @param pLocalLTK - LTK used by this device during pairing + * @param pDevLTK - LTK used by the connected device during pairing + * @param pIRK - IRK used by the connected device during pairing + * @param pSRK - SRK used by the connected device during pairing + * @param signCounter - Sign counter used by the connected device during pairing + * + * @return bond index + */ +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ) +{ + uint8 idx; + + if ( pBondRec == NULL ) + { + return ( GAP_BONDINGS_MAX ); + } + + // First see if we already have an existing bond for this device + idx = gapBondMgrFindAddr( pBondRec->publicAddr ); + if ( idx >= GAP_BONDINGS_MAX ) + { + idx = gapBondMgrFindEmpty(); + } + + if ( idx < GAP_BONDINGS_MAX ) + { + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; + + // Save the main information + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), pBondRec ); + + // If available, save the LTK information + if ( pLocalLTK ) + { + VOID osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), pLocalLTK ); + } + + // If availabe, save the connected device's LTK information + if ( pDevLTK ) + { + VOID osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), pDevLTK ); + } + + // If available, save the connected device's IRK + if ( pIRK ) + { + VOID osal_snv_write( devIRKNvID(idx), KEYLEN, pIRK ); + } + + // If available, save the connected device's Signature information + if ( pSRK ) + { + VOID osal_snv_write( devCSRKNvID(idx), KEYLEN, pSRK ); + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &signCounter ); + } + + // Write out FF's over the charactersitic configuration entry, to overwrite + // any previous bond data that may have been stored + VOID osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + VOID osal_snv_write( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ); + + // Update Bond RAM Shadow just with the newly added bond entry + VOID osal_memcpy( &(bonds[idx]), pBondRec, sizeof ( gapBondRec_t ) ); + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + } + + return ( idx ); +} + +/********************************************************************* + * @fn gapBondMgrGetStateFlags + * + * @brief Gets the state flags field of a bond record in NV + * + * @param idx + * + * @return stateFlags field + */ +static uint8 gapBondMgrGetStateFlags( uint8 idx ) +{ + gapBondRec_t bondRec; + + if ( osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS ) + { + return ( bondRec.stateFlags ); + } + + return ( 0 ); +} + +/********************************************************************* + * @fn gapBondMgrGetPublicAddr + * + * @brief Copy the public Address from a bonding record + * + * @param idx - Bond record index + * @param pAddr - a place to put the public address from NV + * + * @return SUCCESS if successful. + * Otherwise failure. + */ +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ) +{ + bStatus_t stat; // return value + gapBondRec_t bondRec; // Work space for main bond record + + // Check parameters + if ( (idx >= GAP_BONDINGS_MAX) || (pAddr == NULL) ) + { + return ( INVALIDPARAMETER ); + } + + stat = osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + if ( stat == SUCCESS ) + { + VOID osal_memcpy( pAddr, bondRec.publicAddr, B_ADDR_LEN ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrFindReconnectAddr + * + * @brief Look through the bonding entries to find a + * reconnection address. + * + * @param pReconnectAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // compare reconnection address + if ( osal_memcmp( bonds[idx].reconnectAddr, pReconnectAddr, B_ADDR_LEN ) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindAddr + * + * @brief Look through the bonding entries to find an address. + * + * @param pDevAddr - device address to look for + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Read in NV Main Bond Record and compare public address + if ( osal_memcmp( bonds[idx].publicAddr, pDevAddr, B_ADDR_LEN ) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrResolvePrivateAddr + * + * @brief Look through the NV bonding entries to resolve a private + * address. + * + * @param pDevAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no entry found + */ +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pDevAddr ) +{ + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + uint8 IRK[KEYLEN]; + + // Read in NV IRK Record and compare resovable address + if ( osal_snv_read( devIRKNvID(idx), KEYLEN, IRK ) == SUCCESS ) + { + if ( ( osal_isbufset( IRK, 0xFF, KEYLEN ) == FALSE ) && + ( GAP_ResolvePrivateAddr( IRK, pDevAddr ) == SUCCESS ) ) + { + return ( idx ); // Found it + } + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrReadBonds + * + * @brief Read through NV and store them in RAM. + * + * @param none + * + * @return none + */ +static void gapBondMgrReadBonds( void ) +{ + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // See if the entry exists in NV + if ( osal_snv_read( mainRecordNvID(idx), sizeof( gapBondRec_t ), &(bonds[idx]) ) != SUCCESS ) + { + // Can't read the entry, assume that it doesn't exist + VOID osal_memset( bonds[idx].publicAddr, 0xFF, B_ADDR_LEN ); + VOID osal_memset( bonds[idx].reconnectAddr, 0xFF, B_ADDR_LEN ); + bonds[idx].stateFlags = 0; + } + } + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); +} + +/********************************************************************* + * @fn gapBondMgrFindEmpty + * + * @brief Look through the bonding NV entries to find an empty. + * + * @param none + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindEmpty( void ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Look for public address of all 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, B_ADDR_LEN ) ) + { + return ( idx ); // Found one + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrBondTotal + * + * @brief Look through the bonding NV entries calculate the number + * entries. + * + * @param none + * + * @return total number of bonds found + */ +static uint8 gapBondMgrBondTotal( void ) +{ + uint8 numBonds = 0; + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + // Look for public address that are not 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) + { + numBonds++; // Found one + } + } + + return ( numBonds ); +} + +/********************************************************************* + * @fn gapBondMgrEraseAllBondings + * + * @brief Write all 0xFF's to all of the bonding entries + * + * @param none + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseAllBondings( void ) +{ + bStatus_t stat = SUCCESS; // return value + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; (idx < GAP_BONDINGS_MAX) && (stat == SUCCESS); idx++ ) + { + // Erasing will write/create a bonding entry + stat = gapBondMgrEraseBonding( idx ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrEraseBonding + * + * @brief Write all 0xFF's to the complete bonding record + * + * @param idx - bonding index + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseBonding( uint8 idx ) +{ + bStatus_t ret; + gapBondRec_t bondRec; + + // First see if bonding record exists in NV, then write all 0xFF's to it + if ( ( osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS ) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + gapBondLTK_t ltk; + gapBondCharCfg_t charCfg[GAP_CHAR_CFG_MAX]; + + VOID osal_memset( &bondRec, 0xFF, sizeof ( gapBondRec_t ) ); + VOID osal_memset( <k, 0xFF, sizeof ( gapBondLTK_t ) ); + + VOID osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + // Write out FF's over the entire bond entry. + ret = osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + ret |= osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devIRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devCSRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), ltk.LTK ); + + // Write out FF's over the charactersitic configuration entry. + ret |= osal_snv_write( gattCfgNvID(idx), sizeof ( charCfg ), charCfg ); + } + else + { + ret = SUCCESS; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in gapbondmgr.h. + */ +void GAPBondMgr_Init( uint8 task_id ) +{ + gapBondMgr_TaskID = task_id; // Save task ID + + // Setup Bond RAM Shadow + gapBondMgrReadBonds(); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in gapbondmgr.h. + */ +uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapBondMgr_TaskID )) != NULL ) + { + gapBondMgr_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_BOND_SYNC_CC_EVT ) + { + // Update NV to have same CCC values as GATT database + gapBondMgr_SyncCharCfg( connectionHandle ); + + return (events ^ GAP_BOND_SYNC_CC_EVT); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapBondMgr_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GAP_MSG_EVENT: + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case GATT_MSG_EVENT: + gapBondMgr_ProcessGATTMsg( (gattMsgEvent_t *)pMsg ); + break; + + case GATT_SERV_MSG_EVENT: + gapBondMgr_ProcessGATTServMsg( (gattEventHdr_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn GAPBondMgr_CheckNVLen + * + * @brief This function will check the length of an NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ) +{ + uint8 stat = FAILURE; + + // Convert to index + switch ( (id - BLE_NVID_GAP_BOND_START) % GAP_BOND_REC_IDS ) + { + case GAP_BOND_REC_ID_OFFSET: + if ( len == sizeof ( gapBondRec_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_LOCAL_LTK_OFFSET: + case GAP_BOND_DEV_LTK_OFFSET: + if ( len == sizeof ( gapBondLTK_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_IRK_OFFSET: + case GAP_BOND_DEV_CSRK_OFFSET: + if ( len == KEYLEN ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_SIGN_COUNTER_OFFSET: + if ( len == sizeof ( uint32 ) ) + { + stat = SUCCESS; + } + break; + + default: + break; + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTMsg + * + * @brief Process an incoming GATT message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + // Process the GATT message + switch ( pMsg->method ) + { + case ATT_HANDLE_VALUE_CFM: + // Clear Service Changed flag for this client + VOID GAPBondMgr_ServiceChangeInd( pMsg->connHandle, 0x00 ); + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTServMsg + * + * @brief Process an incoming GATT Server App message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ) +{ + // Process the GATT Server App message + switch ( pMsg->method ) + { + case GATT_CLIENT_CHAR_CFG_UPDATED_EVENT: + { + gattClientCharCfgUpdatedEvent_t *pEvent = (gattClientCharCfgUpdatedEvent_t *)pMsg; + + VOID GAPBondMgr_UpdateCharCfg( pEvent->connHandle, pEvent->attrHandle, pEvent->value ); + } + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgrSendServiceChange + * + * @brief Tell the GATT that a service change is needed. + * + * @param pLinkItem - pointer to connection information + * + * @return none + */ +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ) +{ + VOID GATTServApp_SendServiceChangedInd( pLinkItem->connectionHandle, + gapBondMgr_TaskID ); +} + +/********************************************************************* + * @fn gapBondSetupPrivFlag + * + * @brief Setup the GAP Privacy Flag properties. + * + * @param none + * + * @return none + */ +static void gapBondSetupPrivFlag( void ) +{ + uint8 privFlagProp; + + if ( gapBondMgrBondTotal() > 1 ) + { + privFlagProp = GATT_PROP_READ; + } + else + { + privFlagProp = GATT_PROP_READ | GATT_PROP_WRITE; + } + + // Setup the + VOID GGS_SetParameter( GGS_PERI_PRIVACY_FLAG_PROPS, sizeof ( uint8 ), &privFlagProp ); +} + +/********************************************************************* + * @fn gapBondMgrAuthenticate + * + * @brief Initiate authentication + * + * @param connHandle - connection handle + * @param addrType - peer address type + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return none + */ +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ) +{ + gapAuthParams_t params; + + VOID osal_memset( ¶ms, 0, sizeof ( gapAuthParams_t ) ); + + // Setup the pairing parameters + params.connectionHandle = connHandle; + params.secReqs.ioCaps = gapBond_IOCap; + params.secReqs.oobAvailable = gapBond_OOBDataFlag; + params.secReqs.maxEncKeySize = gapBond_KeySize; + + params.secReqs.keyDist.sEncKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_SENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.sIdKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_SIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mEncKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_MENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mIdKey = (gapBond_KeyDistList & GAPBOND_KEYDIST_MIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mSign = (gapBond_KeyDistList & GAPBOND_KEYDIST_MSIGN) ? TRUE : FALSE; + params.secReqs.keyDist.sSign = (gapBond_KeyDistList & GAPBOND_KEYDIST_SSIGN) ? TRUE : FALSE; + + // Is bond manager setup for OOB data? + if ( gapBond_OOBDataFlag ) + { + VOID osal_memcpy( params.secReqs.oob, gapBond_OOBData, KEYLEN ); + } + + if ( gapBond_Bonding && addrType != ADDRTYPE_PUBLIC ) + { + // Force a slave ID key + params.secReqs.keyDist.sIdKey = TRUE; + } + + params.secReqs.authReq |= (gapBond_Bonding) ? SM_AUTH_STATE_BONDING : 0; + params.secReqs.authReq |= (gapBond_MITM) ? SM_AUTH_STATE_AUTHENTICATED : 0; + + VOID GAP_Authenticate( ¶ms, pPairReq ); +} + +#if ( HOST_CONFIG & PERIPHERAL_CFG ) +/********************************************************************* + * @fn gapBondMgrSlaveSecurityReq + * + * @brief Send a slave security request + * + * @param connHandle - connection handle + * + * @return none + */ +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ) +{ + uint8 authReq = 0; + + authReq |= (gapBond_Bonding) ? SM_AUTH_STATE_BONDING : 0; + authReq |= (gapBond_MITM) ? SM_AUTH_STATE_AUTHENTICATED : 0; + + VOID GAP_SendSlaveSecurityRequest( connHandle, authReq ); +} +#endif + +/********************************************************************* + * @fn gapBondMgrBondReq + * + * @brief Initiate a GAP bond request + * + * @param connHandle - connection handle + * @param idx - NV index of bond entry + * @param stateFlags - bond state flags + * @param role - master or slave role + * @param startEncryption - whether or not to start encryption + * + * @return none + */ +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ) +{ + smSecurityInfo_t ltk; + osalSnvId_t nvId; + + if ( role == GAP_PROFILE_CENTRAL ) + { + nvId = devLTKNvID( idx ); + } + else + { + nvId = localLTKNvID( idx ); + } + + // Initialize the NV structures + VOID osal_memset( <k, 0, sizeof ( smSecurityInfo_t ) ); + + if ( osal_snv_read( nvId, sizeof ( smSecurityInfo_t ), <k ) == SUCCESS ) + { + if ( (ltk.keySize >= MIN_ENC_KEYSIZE) && (ltk.keySize <= MAX_ENC_KEYSIZE) ) + { + VOID GAP_Bond( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + <k, startEncryption ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncWhiteList + * + * @brief syncronize the White List with the bonds + * + * @param none + * + * @return none + */ +static void gapBondMgr_SyncWhiteList( void ) +{ + //erase the White List + VOID HCI_LE_ClearWhiteListCmd(); + + // Write bond addresses into the White List + for( uint8 i = 0; i < GAP_BONDINGS_MAX; i++) + { + // Make sure empty addresses are not added to the White List + if ( osal_isbufset( bonds[i].publicAddr, 0xFF, B_ADDR_LEN ) == FALSE ) + { + VOID HCI_LE_AddWhiteListCmd( HCI_PUBLIC_DEVICE_ADDRESS, bonds[i].publicAddr ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncCharCfg + * + * @brief Update the Bond Manager to have the same configurations as + * the GATT database. + * + * @param connHandle - the current connection handle to find client configurations for + * + * @return none + */ +static void gapBondMgr_SyncCharCfg( uint16 connHandle ) +{ + gattAttribute_t *pAttr; + uint16 service; + + // Only attributes with attribute handles between and including the Starting + // Handle parameter and the Ending Handle parameter that match the requested + // attribute type and the attribute value will be returned. + + // All attribute types are effectively compared as 128-bit UUIDs, + // even if a 16-bit UUID is provided in this request or defined + // for an attribute. + pAttr = GATT_FindHandleUUID( GATT_MIN_HANDLE, GATT_MAX_HANDLE, + clientCharCfgUUID, ATT_BT_UUID_SIZE, &service ); + while ( ( pAttr != NULL ) ) + { + uint8 len; + uint8 attrVal[ATT_BT_UUID_SIZE]; + + // It is not possible to use this request on an attribute that has a value + // that is longer than 2. + if ( GATTServApp_ReadAttr( connHandle, pAttr, service, attrVal, + &len, 0, ATT_BT_UUID_SIZE ) == SUCCESS ) + { + uint16 value = BUILD_UINT16(attrVal[0], attrVal[1]); + + if ( value != GATT_CFG_NO_OPERATION ) + { + // NV must be updated to meet configuration of the database + VOID GAPBondMgr_UpdateCharCfg( connHandle, pAttr->handle, value ); + } + } + + // Try to find the next attribute + pAttr = GATT_FindNextAttr( pAttr, GATT_MAX_HANDLE, service, NULL ); + } // while +} + +#endif // ( CENTRAL_CFG | PERIPHERAL_CFG ) + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.h new file mode 100644 index 0000000..abd6ee7 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapbondmgr.h @@ -0,0 +1,407 @@ +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GAPBONDMGR_H +#define GAPBONDMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "gap.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +#if !defined ( GAP_BONDINGS_MAX ) + #define GAP_BONDINGS_MAX 10 //!< Maximum number of bonds that can be saved in NV. +#endif + +#if !defined ( GAP_CHAR_CFG_MAX ) + #define GAP_CHAR_CFG_MAX 4 //!< Maximum number of characteristic configuration that can be saved in NV. +#endif +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#define GAPBOND_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_INITIATE_WAIT 0x401 //!< Pairing Mode Initiate wait timeout. This is the time it will wait for a Pairing Request before sending the Slave Initiate Request. Read/Write. Size is uint16. Default is 1000(in milliseconds). +#define GAPBOND_MITM_PROTECTION 0x402 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_IO_CAPABILITIES 0x403 //!< I/O capabilities. Read/Write. Size is uint8. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_OOB_ENABLED 0x404 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_OOB_DATA 0x405 //!< OOB Data. Read/Write. size uint8[16]. Default is all 0's. +#define GAPBOND_BONDING_ENABLED 0x406 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_KEY_DIST_LIST 0x407 //!< The key distribution list for bonding. size is uint8. @ref GAPBOND_KEY_DIST_DEFINES. Default is sEncKey, sIdKey, mIdKey, mSign enabled. +#define GAPBOND_DEFAULT_PASSCODE 0x408 //!< The default passcode for MITM protection. size is uint32. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x409 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x40A //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x40B //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x40C //!< Key Size used in pairing. Read/Write. size is uint8. Default is 16. +#define GAPBOND_AUTO_SYNC_WL 0x40D //!< Clears the White List adds to it each unique address stored by bonds in NV. Read/Write. Size is uint8. Default is FALSE. +#define GAPBOND_BOND_COUNT 0x40E //!< Gets the total number of bonds stored in NV. Read Only. Size is uint8. Default is 0 (no bonds). +#define GAPBOND_BOND_FAIL_ACTION 0x40F //!< Possible actions Central may take upon an unsuccessful bonding. Write Only. Size is uint8. Default is 0x02 (Terminate link upon unsuccessful bonding). +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_MENCKEY 0x08 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x10 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x20 //!< Master CSRK +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authenication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ +#define GAPBOND_FAIL_NO_ACTION 0x00 //!< Take no action upon unsuccessful bonding +#define GAPBOND_FAIL_INITIATE_PAIRING 0x01 //!< Initiate pairing upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_LINK 0x02 //!< Terminate link upon unsuccessful bonding +#define GAPBOND_FAIL_TERMINATE_ERASE_BONDS 0x03 //!< Terminate link and erase all existing bonds on device upon unsuccessful bonding +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPBONDMGR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.c new file mode 100644 index 0000000..fd05c6b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.c @@ -0,0 +1,1409 @@ +/************************************************************************************************** + Filename: gapperiphbondmgr.c + Revised: $Date: 2011-03-02 12:41:23 -0800 (Wed, 02 Mar 2011) $ + Revision: $Revision: 25256 $ + + Description: GAP peripheral profile manages bonded connections + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_snv.h" +#include "gap.h" +#include "linkdb.h" +#include "gatt.h" + +#include "gattservapp.h" +#include "gapgattserver.h" +#include "gapperiphbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events + +// Bonded State Flags +#define GAP_BONDED_STATE_AUTHENTICATED 0x0001 +#define GAP_BONDED_STATE_SERVICE_CHANGED 0x0002 + +/** + * GAP Bond Manager NV layout + * + * The NV definitions: + * BLE_NVID_GAP_BOND_START - starting NV ID + * GAP_BONDINGS_MAX - Maximum number of bonding allowed (10 is max for number of NV IDs allocated in bcomdef.h). + * + * A single bonding entry consists of 6 components (NV items): + * Bond Record - defined as gapBondRec_t and uses GAP_BOND_REC_ID_OFFSET for an NV ID + * local LTK Info - defined as gapBondLTK_t and uses GAP_BOND_LOCAL_LTK_OFFSET for an NV ID + * device LTK Info - defined as gapBondLTK_t and uses GAP_BOND_DEV_LTK_OFFSET for an NV ID + * device IRK - defined as "uint8 devIRK[KEYLEN]" and uses GAP_BOND_DEV_IRK_OFFSET for an NV ID + * device CSRK - defined as "uint8 devCSRK[KEYLEN]" and uses GAP_BOND_DEV_CSRK_OFFSET for an NV ID + * device Sign Counter - defined as a uint32 and uses GAP_BOND_DEV_SIGN_COUNTER_OFFSET for an NV ID + * + * When the device is initialized for the first time, all (GAP_BONDINGS_MAX) NV items are created and + * initialized to all 0xFF's. A bonding record of all 0xFF's indicates that the bonding record is empty + * and free to use. + * + * The calculation for each bonding records NV IDs: + * mainRecordNvID = ((bondIdx * GAP_BOND_REC_IDS) + BLE_NVID_GAP_BOND_START) + * localLTKNvID = (((bondIdx * GAP_BOND_REC_IDS) + GAP_BOND_LOCAL_LTK_OFFSET) + BLE_NVID_GAP_BOND_START) + * + */ +#define GAP_BOND_REC_ID_OFFSET 0 //!< NV ID for the main bonding record +#define GAP_BOND_LOCAL_LTK_OFFSET 1 //!< NV ID for the bonding record's local LTK information +#define GAP_BOND_DEV_LTK_OFFSET 2 //!< NV ID for the bonding records' device LTK information +#define GAP_BOND_DEV_IRK_OFFSET 3 //!< NV ID for the bonding records' device IRK +#define GAP_BOND_DEV_CSRK_OFFSET 4 //!< NV ID for the bonding records' device CSRK +#define GAP_BOND_DEV_SIGN_COUNTER_OFFSET 5 //!< NV ID for the bonding records' device Sign Counter + +#define GAP_BOND_REC_IDS 6 + +// Macros to calculate the index/offset in to NV space +#define calcNvID(Idx, offset) (((((Idx) * GAP_BOND_REC_IDS) + (offset))) + BLE_NVID_GAP_BOND_START) +#define mainRecordNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_REC_ID_OFFSET)) +#define localLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_LOCAL_LTK_OFFSET)) +#define devLTKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_LTK_OFFSET)) +#define devIRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_IRK_OFFSET)) +#define devCSRKNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_CSRK_OFFSET)) +#define devSignCounterNvID(bondIdx) (calcNvID((bondIdx), GAP_BOND_DEV_SIGN_COUNTER_OFFSET)) + +// Key Size Limits +#define MIN_ENC_KEYSIZE 7 //!< Minimum number of bytes for the encryption key +#define MAX_ENC_KEYSIZE 16 //!< Maximum number of bytes for the encryption key + + +/********************************************************************* + * TYPEDEFS + */ + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8 LTK[KEYLEN]; // Long Term Key (LTK) + uint16 div; // LTK eDiv + uint8 rand[B_RANDOM_NUM_SIZE]; // LTK random number + uint8 keySize; // LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8 publicAddr[B_ADDR_LEN]; // Master's address + uint8 reconnectAddr[B_ADDR_LEN]; // Privacy Reconnection Address + uint16 stateFlags; // State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING +} gapBondRec_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapBondMgr_TaskID; // Task ID for internal task/event processing + +// GAPBonding Parameters +static uint8 gapBond_PairingMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; +static uint16 gapBond_InitiateWait = 1000; // Default to 1 second +static uint8 gapBond_MITM = FALSE; +static uint8 gapBond_IOCap = GAPBOND_IO_CAP_DISPLAY_ONLY; +static uint8 gapBond_OOBDataFlag = FALSE; +static uint8 gapBond_OOBData[KEYLEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8 gapBond_Bonding = FALSE; +static uint8 gapBond_AutoFail = FALSE; +static uint8 gapBond_AutoFailReason = SMP_PAIRING_FAILED_NOT_SUPPORTED; +static uint8 gapBond_KeyDistList = +( + GAPBOND_KEYDIST_SENCKEY // sEncKey enabled, to send the encryption key + | GAPBOND_KEYDIST_SIDKEY // sIdKey enabled, to send the IRK, and BD_ADDR + // sSign disabled, + // mEncKey disabled, + | GAPBOND_KEYDIST_MIDKEY // mIdKey enabled, to get the master's IRK and BD_ADDR + | GAPBOND_KEYDIST_MSIGN // mSign enabled, to get the master's CSRK +); +static uint32 gapBond_Passcode = 0; +static uint8 gapBond_KeySize = MAX_ENC_KEYSIZE; + +static gapBondCBs_t *pGapBondCB = NULL; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ); +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ); +static uint8 gapBondMgrGetStateFlags( uint8 idx ); +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ); +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ); +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ); +static uint8 gapBondMgrFindEmpty( void ); +static uint8 gapBondMgrBondTotal( void ); +static bStatus_t gapBondMgrEraseAllBondings( void ); +static bStatus_t gapBondMgrEraseBonding( uint8 idx ); +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ); +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static void gapBondSetupPrivFlag( void ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Bond Manager parameter. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_PAIRING_MODE_INITIATE) ) + { + gapBond_PairingMode = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_INITIATE_WAIT: + if ( len == sizeof ( uint16 ) ) + { + gapBond_InitiateWait = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_MITM_PROTECTION: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_MITM = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_IO_CAPABILITIES: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAPBOND_IO_CAP_KEYBOARD_DISPLAY) ) + { + gapBond_IOCap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_OOBDataFlag = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_OOB_DATA: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapBond_OOBData, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_BONDING_ENABLED: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_Bonding = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEY_DIST_LIST: + if ( len == sizeof ( uint8 ) ) + { + gapBond_KeyDistList = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_DEFAULT_PASSCODE: + if ( (len == sizeof ( uint32 )) + && (*((uint32*)pValue) <= GAP_PASSCODE_MAX) ) + { + gapBond_Passcode = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_ERASE_ALLBONDS: + if ( len == 0 ) + { + VOID gapBondMgrEraseAllBondings(); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapBond_AutoFail = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_AUTO_FAIL_REASON: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= SMP_PAIRING_FAILED_REPEATED_ATTEMPTS) ) + { + gapBond_AutoFailReason = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPBOND_KEYSIZE: + if ( (len == sizeof ( uint8 )) + && ((*((uint8*)pValue) >= MIN_ENC_KEYSIZE) && (*((uint8*)pValue) <= MAX_ENC_KEYSIZE)) ) + { + gapBond_KeySize = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Bond Manager parameter. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; // return value + + switch ( param ) + { + case GAPBOND_PAIRING_MODE: + *((uint8*)pValue) = gapBond_PairingMode; + break; + + case GAPBOND_INITIATE_WAIT: + *((uint16*)pValue) = gapBond_InitiateWait; + break; + + case GAPBOND_MITM_PROTECTION: + *((uint8*)pValue) = gapBond_MITM; + break; + + case GAPBOND_IO_CAPABILITIES: + *((uint8*)pValue) = gapBond_IOCap; + break; + + case GAPBOND_OOB_ENABLED: + *((uint8*)pValue) = gapBond_OOBDataFlag; + break; + + case GAPBOND_OOB_DATA: + VOID osal_memcpy( pValue, gapBond_OOBData, KEYLEN ) ; + break; + + case GAPBOND_BONDING_ENABLED: + *((uint8*)pValue) = gapBond_Bonding; + break; + + case GAPBOND_KEY_DIST_LIST: + *((uint8*)pValue) = gapBond_KeyDistList; + break; + + case GAPBOND_DEFAULT_PASSCODE: + *((uint32*)pValue) = gapBond_Passcode; + break; + + case GAPBOND_AUTO_FAIL_PAIRING: + *((uint8*)pValue) = gapBond_AutoFail; + break; + + case GAPBOND_AUTO_FAIL_REASON: + *((uint8*)pValue) = gapBond_AutoFailReason; + break; + + case GAPBOND_KEYSIZE: + *((uint8*)pValue) = gapBond_KeySize; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Notify the Bond Manager that a connection has been made. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle ) +{ + uint8 idx; // NV Index + uint8 publicAddr[B_ADDR_LEN] // Place to put the public address + = {0, 0, 0, 0, 0, 0}; + + idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bonding found + uint8 stateFlags; // Bond state flags + smSecurityInfo_t localLTK; // LTK information + smSigningInfo_t signingInfo; // Signature information + + // Initialize the NV structures + osal_memset( &localLTK, 0, sizeof ( smSecurityInfo_t ) ); + osal_memset( &signingInfo, 0, sizeof ( smSigningInfo_t ) ); + + // Check if key is valid, then load the key + stateFlags = gapBondMgrGetStateFlags( idx ); + if ( osal_snv_read( localLTKNvID(idx), sizeof ( smSecurityInfo_t ), &localLTK ) == SUCCESS ) + { + if ( (localLTK.keySize >= MIN_ENC_KEYSIZE) && (localLTK.keySize <= MAX_ENC_KEYSIZE) ) + { + // Load the key information for the bonding + VOID GAP_Bond( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &localLTK ); + } + } + + // Load the Signing Key + if ( osal_snv_read( devCSRKNvID(idx), KEYLEN, signingInfo.srk ) == SUCCESS ) + { + if ( osal_isbufset( signingInfo.srk, 0xFF, KEYLEN ) == FALSE ) + { + // Load the signing information for this connection + VOID osal_snv_read( devSignCounterNvID(idx), sizeof ( uint32 ), &(signingInfo.signCounter) ); + VOID GAP_Signable( connHandle, + ((stateFlags & GAP_BONDED_STATE_AUTHENTICATED) ? TRUE : FALSE), + &signingInfo ); + } + } + + // Has there been a service change? + if ( stateFlags & GAP_BONDED_STATE_SERVICE_CHANGED ) + { + VOID GATT_ServiceChangedInd( connHandle, gapBondMgr_TaskID ); + } + } + else + { + // Not bound + if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) + { + // Could add code to setup a timeout to initiate security + // with a Slave Security Request. + } + } + + return ( SUCCESS ); +} + +/********************************************************************* + * @brief Resolve an address from bonding information. + * + * Public function defined in gapperiphbondmgr.h. + */ +uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ) +{ + uint8 idx = GAP_BONDINGS_MAX; + + switch ( addrType ) + { + case ADDRTYPE_PUBLIC: + case ADDRTYPE_STATIC: + idx = gapBondMgrFindAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID osal_memcpy( pResolvedAddr, pDevAddr, B_ADDR_LEN ); + } + break; + + case ADDRTYPE_PRIVATE_NONRESOLVE: + // This could be a reconnection address + idx = gapBondMgrFindReconnectAddr( pDevAddr ); + if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) ) + { + VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + case ADDRTYPE_PRIVATE_RESOLVE: + // Master's don't use Private Resolvable addresses + break; + + default: + break; + } + + return ( idx ); +} + +/********************************************************************* + * @brief Set/clear the service change indication in a bond record. + * + * Public function defined in gapperiphbondmgr.h. + */ +bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ) +{ + bStatus_t ret = bleNoResources; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Service Change indication + for ( idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + if ( gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ) ) + { + ret = SUCCESS; + } + } + + // If the service change indication is TRUE, tell the connected devices + if ( setParam ) + { + // Run connected database + linkDB_PerformFunc( gapBondMgrSendServiceChange ); + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx; // loop counter + idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Bond found, update it. + VOID gapBondMgrChangeState( idx, GAP_BONDED_STATE_SERVICE_CHANGED, setParam ); + ret = SUCCESS; + } + + // If the service change indication is TRUE, tell the connected device + if ( setParam ) + { + gapBondMgrSendServiceChange( pLinkItem ); + } + } + else + { + ret = bleNotConnected; + } + } + + return ( ret ); +} + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +void GAPBondMgr_Register( gapBondCBs_t *pCB ) +{ + pGapBondCB = pCB; +} + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ) +{ + bStatus_t ret = SUCCESS; + + if ( status == SUCCESS ) + { + // Truncate the passcode + passcode = passcode % (GAP_PASSCODE_MAX + 1); + + ret = GAP_PasscodeUpdate( passcode, connectionHandle ); + if ( ret != SUCCESS ) + { + VOID GAP_TerminateAuth( connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + else + { + VOID GAP_TerminateAuth( connectionHandle, status ); + } + + return ret; +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @fn gapBondMgrChangeState + * + * @brief Change a state flag in the stateFlags field of the bond record. + * + * @param idx - Bond NV index + * @param state - state flage to set or clear + * @param set - TRUE to set the flag, FALSE to clear the flag + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + // Update the state of the bonded device. + uint8 stateFlags = bondRec.stateFlags; + if ( set ) + { + stateFlags |= state; + } + else + { + stateFlags &= ~(state); + } + + if ( stateFlags != bondRec.stateFlags ) + { + bondRec.stateFlags = stateFlags; + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + } + return ( TRUE ); + } + return ( FALSE ); +} + +/********************************************************************* + * @fn gapBondMgrAddBond + * + * @brief Save a bond from a GAP Auth Complete Event + * + * @param pBondRec - basic bond record + * @param pLocalLTK - LTK used by this device during pairing + * @param pDevLTK - LTK used by the connected device during pairing + * @param pIRK - IRK used by the connected device during pairing + * @param pSRK - SRK used by the connected device during pairing + * @param signCounter - Sign counter used by the connected device during pairing + * + * @return bond index + */ +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ) +{ + uint8 idx; + + if ( pBondRec == NULL ) + { + return ( GAP_BONDINGS_MAX ); + } + + // First see if we already have an existing bond for this device + idx = gapBondMgrFindAddr( pBondRec->publicAddr ); + if ( idx >= GAP_BONDINGS_MAX ) + { + idx = gapBondMgrFindEmpty(); + } + + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the main information + VOID osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), pBondRec ); + + // If available, save the LTK information + if ( pLocalLTK ) + { + VOID osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), pLocalLTK ); + } + + + // If availabe, save the connected device's LTK information + if ( pDevLTK ) + { + VOID osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), pDevLTK ); + } + + // If available, save the connected device's IRK + if ( pIRK ) + { + VOID osal_snv_write( devIRKNvID(idx), KEYLEN, pIRK ); + } + + // If available, save the connected device's Signature information + if ( pSRK ) + { + VOID osal_snv_write( devCSRKNvID(idx), KEYLEN, pSRK ); + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &signCounter ); + } + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( idx ); +} + +/********************************************************************* + * @fn gapBondMgrGetStateFlags + * + * @brief Gets the state flags field of a bond record in NV + * + * @param idx + * + * @return stateFlags field + */ +static uint8 gapBondMgrGetStateFlags( uint8 idx ) +{ + gapBondRec_t bondRec; + + VOID osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + return ( bondRec.stateFlags ); + +} + +/********************************************************************* + * @fn gapBondMgrGetPublicAddr + * + * @brief Copy the public Address from a bonding record + * + * @param idx - Bond record index + * @param pAddr - a place to put the public address from NV + * + * @return SUCCESS if successful. + * Otherwise failure. + */ +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ) +{ + bStatus_t stat; // return value + gapBondRec_t bondRec; // Work space for main bond record + + // Check parameters + if ( (idx >= GAP_BONDINGS_MAX) || (pAddr == NULL) ) + { + return ( INVALIDPARAMETER ); + } + + stat = osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + + if ( stat == SUCCESS ) + { + VOID osal_memcpy( pAddr, bondRec.publicAddr, KEYLEN ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrFindReconnectAddr + * + * @brief Look through the bonding NV entries to find a + * reconnection address. + * + * @param pReconnectAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Read in NV Main Bond Record and compare reconnection address + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_memcmp( bondRec.reconnectAddr, pReconnectAddr, KEYLEN )) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindAddr + * + * @brief Look through the bonding NV entries to find an address. + * + * @param pDevAddr - device address to look for + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Read in NV Main Bond Record and compare public address + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_memcmp( bondRec.publicAddr, pDevAddr, B_ADDR_LEN )) ) + { + return ( idx ); // Found it + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrFindEmpty + * + * @brief Look through the bonding NV entries to find an empty. + * + * @param none + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindEmpty( void ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Look for public address of all 0xFF's + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN )) ) + { + return ( idx ); // Found one + } + } + + return ( GAP_BONDINGS_MAX ); +} + +/********************************************************************* + * @fn gapBondMgrBondTotal + * + * @brief Look through the bonding NV entries calculate the number + * entries. + * + * @param none + * + * @return total number of bonds found + */ +static uint8 gapBondMgrBondTotal( void ) +{ + uint8 bonds = 0; + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < GAP_BONDINGS_MAX; idx++ ) + { + gapBondRec_t bondRec; // Bond record work place + + // Look for public address that are not 0xFF's + if ( (osal_snv_read( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ) == SUCCESS) + && (osal_isbufset( bondRec.publicAddr, 0xFF, B_ADDR_LEN ) == FALSE) ) + { + bonds++; // Found one + } + } + + return ( bonds ); +} + +/********************************************************************* + * @fn gapBondMgrEraseAllBondings + * + * @brief Write all 0xFF's to all of the bonding entries + * + * @param none + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseAllBondings( void ) +{ + bStatus_t stat = SUCCESS; // return value + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; (idx < GAP_BONDINGS_MAX) && (stat == SUCCESS); idx++ ) + { + // Erasing will write/create a bonding entry + stat = gapBondMgrEraseBonding( idx ); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrEraseBonding + * + * @brief Write all 0xFF's to the complete bonding record + * + * @param idx - bonding index + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseBonding( uint8 idx ) +{ + bStatus_t ret; + gapBondRec_t bondRec; + gapBondLTK_t ltk; + + VOID osal_memset( &bondRec, 0xFF, sizeof ( gapBondRec_t ) ); + VOID osal_memset( <k, 0xFF, sizeof ( gapBondLTK_t ) ); + + // Write out FF's over the entire bond entry. + ret = osal_snv_write( mainRecordNvID(idx), sizeof ( gapBondRec_t ), &bondRec ); + ret |= osal_snv_write( localLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devLTKNvID(idx), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( devIRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devCSRKNvID(idx), KEYLEN, ltk.LTK ); + ret |= osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), ltk.LTK ); + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + + return ( ret ); +} + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in gapperiphbondmgr.h. + */ +void GAPBondMgr_Init( uint8 task_id ) +{ + gapBondRec_t bondRec; // Work space for Bond Record + gapBondMgr_TaskID = task_id; // Save task ID + + // Initialize the NV needed for bonding + if ( osal_snv_read( mainRecordNvID(0), sizeof ( gapBondRec_t ), &bondRec ) != SUCCESS ) + { + // Can't read the first entry, assume that NV doesn't exist and erase all + // Bond NV entries (initialize) + VOID gapBondMgrEraseAllBondings(); + } + + // Take over the processing of Authentication messages + VOID GAP_SetParamValue( TGAP_AUTH_TASK_ID, gapBondMgr_TaskID ); + + // Check the total number of bonds + gapBondSetupPrivFlag(); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in gapperiphbondmgr.h. + */ +uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapBondMgr_TaskID )) != NULL ) + { + gapBondMgr_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapBondMgr_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case GAP_MSG_EVENT: + gapBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case GATT_MSG_EVENT: + gapBondMgr_ProcessGATTMsg( (gattMsgEvent_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +void gapBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_PASSKEY_NEEDED_EVENT: + { + gapPasskeyNeededEvent_t *pPkt = (gapPasskeyNeededEvent_t *)pMsg; + + if ( pGapBondCB && pGapBondCB->passcodeCB ) + { + // Ask app for a passcode + pGapBondCB->passcodeCB( pPkt->deviceAddr, pPkt->connectionHandle, pPkt->uiInputs, pPkt->uiOutputs ); + } + else + { + // No app support, use the default passcode + if ( GAP_PasscodeUpdate( gapBond_Passcode, pPkt->connectionHandle ) != SUCCESS ) + { + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED ); + } + } + } + break; + + case GAP_AUTHENTICATION_COMPLETE_EVENT: + { + gapAuthCompleteEvent_t *pPkt = (gapAuthCompleteEvent_t *)pMsg; + + // Should we save bonding information + if ( (pPkt->hdr.status == SUCCESS) && (pPkt->authState & SM_AUTH_STATE_BONDING) ) + { + gapBondRec_t bondRec; + + VOID osal_memset( &bondRec, 0, sizeof ( gapBondRec_t ) ) ; + + // Do we have a public address in the data? + if ( pPkt->pIdentityInfo ) + { + VOID osal_memcpy( bondRec.publicAddr, pPkt->pIdentityInfo->bd_addr, B_ADDR_LEN ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + VOID osal_memcpy( bondRec.publicAddr, pLinkItem->addr, B_ADDR_LEN ); + } + else + { + // We don't have an address, so ignore the message. + break; + } + } + + // Save off of the authentication state + bondRec.stateFlags |= (pPkt->authState & SM_AUTH_STATE_AUTHENTICATED) ? GAP_BONDED_STATE_AUTHENTICATED : 0; + + VOID gapBondMgrAddBond( &bondRec, + (gapBondLTK_t *)pPkt->pSecurityInfo, + (gapBondLTK_t *)pPkt->pDevSecInfo, + ((uint8 *)((pPkt->pIdentityInfo) ? pPkt->pIdentityInfo->irk : NULL )), + ((uint8 *)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->srk : NULL )), + ((uint32)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->signCounter : GAP_INIT_SIGN_COUNTER )) ); + + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_COMPLETE, pPkt->hdr.status ); + } + } + break; + + case GAP_BOND_COMPLETE_EVENT: + // This message is received when the bonding is complete. If hdr.status is SUCCESS + // then call app state callback. If hdr.status is NOT SUCCESS, the connection will be + // dropped at the LL because of a MIC failure, so again nothing to do. + if ( pGapBondCB && pGapBondCB->pairStateCB && pMsg->hdr.status == SUCCESS ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_BONDED, pMsg->hdr.status ); + } + break; + + case GAP_SIGNATURE_UPDATED_EVENT: + { + uint8 idx; + gapSignUpdateEvent_t *pPkt = (gapSignUpdateEvent_t *)pMsg; + + idx = GAPBondMgr_ResolveAddr( pPkt->addrType, pPkt->devAddr, NULL ); + if ( idx < GAP_BONDINGS_MAX ) + { + // Save the sign counter + VOID osal_snv_write( devSignCounterNvID(idx), sizeof ( uint32 ), &(pPkt->signCounter) ); + } + } + break; + + case GAP_PAIRING_REQ_EVENT: + { + gapPairingReqEvent_t *pPkt = (gapPairingReqEvent_t *)pMsg; + + if ( gapBond_AutoFail != FALSE ) + { + // Auto Fail TEST MODE (DON'T USE THIS) - Sends pre-setup reason + VOID GAP_TerminateAuth( pPkt->connectionHandle, gapBond_AutoFailReason ); + } + else if ( gapBond_PairingMode == GAPBOND_PAIRING_MODE_NO_PAIRING ) + { + // No Pairing - Send error + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_NOT_SUPPORTED ); + } + else + { + gapAuthParams_t params; + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + + // Requesting bonding? + if ( pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING ) + { + if ( pLinkItem ) + { + if ( (pLinkItem->addrType != ADDRTYPE_PUBLIC) && (pPkt->pairReq.keyDist.mIdKey == FALSE) ) + { + uint8 publicAddr[B_ADDR_LEN]; + + // Check if we already have the public address in NV + if ( GAPBondMgr_ResolveAddr(pLinkItem->addrType, pLinkItem->addr, publicAddr ) == FALSE ) + { + // Can't bond to a non-public address if we don't know the public address + VOID GAP_TerminateAuth( pPkt->connectionHandle, SMP_PAIRING_FAILED_AUTH_REQ ); + break; + } + } + } + else + { + // Can't find the connection, ignore the message + break; + } + } + + VOID osal_memset( ¶ms, 0, sizeof ( gapAuthParams_t ) ); + + // Setup the pairing parameters + params.connectionHandle = pPkt->connectionHandle; + params.secReqs.ioCaps = gapBond_IOCap; + params.secReqs.oobAvailable = gapBond_OOBDataFlag; + params.secReqs.maxEncKeySize = gapBond_KeySize; + + // TBD - Should we distribute keys if bonding is turned off??? + params.secReqs.keyDist.sEncKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_SENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.sIdKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_SIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mEncKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_MENCKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mIdKey = (gapBond_KeyDistList | GAPBOND_KEYDIST_MIDKEY) ? TRUE : FALSE; + params.secReqs.keyDist.mSign = (gapBond_KeyDistList | GAPBOND_KEYDIST_MSIGN) ? TRUE : FALSE; + params.secReqs.keyDist.sSign = (gapBond_KeyDistList | GAPBOND_KEYDIST_SSIGN) ? TRUE : FALSE; + + // Is bond manager setup for OOB data? + if ( gapBond_OOBDataFlag ) + { + VOID osal_memcpy( params.secReqs.oob, gapBond_OOBData, KEYLEN ); + } + + if ( (pPkt->pairReq.authReq & SM_AUTH_STATE_BONDING) && (gapBond_Bonding) ) + { + params.secReqs.authReq |= SM_AUTH_STATE_BONDING; + if ( pLinkItem->addrType != ADDRTYPE_PUBLIC ) + { + // Force a master ID key + params.secReqs.keyDist.mIdKey = TRUE; + } + } + + // Is Bond Manager setup for passkey protection? + if ( gapBond_MITM ) + { + params.secReqs.authReq |= SM_AUTH_STATE_AUTHENTICATED; + } + + VOID GAP_Authenticate( ¶ms, &(pPkt->pairReq) ); + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( GAPBOND_PAIRING_STATE_STARTED, pPkt->hdr.status ); + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn GAPBondMgr_CheckNVLen + * + * @brief This function will check the length of an NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ) +{ + uint8 stat = FAILURE; + + // Convert to index + switch ( (id - BLE_NVID_GAP_BOND_START) % GAP_BOND_REC_IDS ) + { + case GAP_BOND_REC_ID_OFFSET: + if ( len == sizeof ( gapBondRec_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_LOCAL_LTK_OFFSET: + case GAP_BOND_DEV_LTK_OFFSET: + if ( len == sizeof ( gapBondLTK_t ) ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_IRK_OFFSET: + case GAP_BOND_DEV_CSRK_OFFSET: + if ( len == KEYLEN ) + { + stat = SUCCESS; + } + break; + + case GAP_BOND_DEV_SIGN_COUNTER_OFFSET: + if ( len == sizeof ( uint32 ) ) + { + stat = SUCCESS; + } + break; + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTMsg + * + * @brief Process an incoming GATT message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + // Process the GATT message + switch ( pMsg->method ) + { + case ATT_HANDLE_VALUE_CFM: + // Clear Service Changed flag for this client + VOID GAPBondMgr_ServiceChangeInd( pMsg->connHandle, 0x00 ); + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgrSendServiceChange + * + * @brief Tell the GATT that a service change is needed. + * + * @param pLinkItem - pointer to connection information + * + * @return none + */ +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ) +{ + VOID GATT_ServiceChangedInd( pLinkItem->connectionHandle, gapBondMgr_TaskID ); +} + +/********************************************************************* + * @fn gapBondSetupPrivFlag + * + * @brief Setup the GAP Privacy Flag properties. + * + * @param none + * + * @return none + */ +static void gapBondSetupPrivFlag( void ) +{ + uint8 privFlagProp; + + if ( gapBondMgrBondTotal() > 1 ) + { + privFlagProp = GATT_PROP_READ; + } + else + { + privFlagProp = GATT_PROP_READ | GATT_PROP_WRITE; + } + + // Setup the + GGS_SetParameter( GGS_PERI_PRIVACY_FLAG_PROPS, sizeof ( uint8 ), &privFlagProp ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.h new file mode 100644 index 0000000..d26b3ce --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/gapperiphbondmgr.h @@ -0,0 +1,365 @@ +/** + @headerfile: gapperiphbondmgr.h + $Date: 2011-09-20 15:43:20 -0700 (Tue, 20 Sep 2011) $ + $Revision: 27655 $ + + @mainpage TI BLE GAP Peripheral Bond Manager + + This GAP profile manages bonded connections between this slave device and + connected master devices.

+ + This profile will automatically respond to SM Pairing Requests from a + connected master (initiator) device. Then, after pairing, if keys were + exchanged and bonding was specified, save the device and key information + of the connected initiator, so that, on future connections, the bonded + devices can establish an encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef GAPPERIPHBONDMGR_H +#define GAPPERIPHBONDMGR_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "gap.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +#if !defined ( GAP_BONDINGS_MAX ) + #define GAP_BONDINGS_MAX 10 //!< Maximum number of bonds that can be saved in NV. +#endif + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#define GAPBOND_PAIRING_MODE 0x400 //!< Pairing Mode: @ref GAPBOND_PAIRING_MODE_DEFINES. Read/Write. Size is uint8. Default is GAPBOND_PAIRING_MODE_WAIT_FOR_REQ. +#define GAPBOND_INITIATE_WAIT 0x401 //!< Pairing Mode Initiate wait timeout. This is the time it will wait for a Pairing Request before sending the Slave Initiate Request. Read/Write. Size is uint16. Default is 1000(in milliseconds). +#define GAPBOND_MITM_PROTECTION 0x402 //!< Man-In-The-Middle (MITM) basically turns on Passkey protection in the pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_IO_CAPABILITIES 0x403 //!< I/O capabilities. Read/Write. Size is uint8. Default is GAPBOND_IO_CAP_DISPLAY_ONLY @ref GAPBOND_IO_CAP_DEFINES. +#define GAPBOND_OOB_ENABLED 0x404 //!< OOB data available for pairing algorithm. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_OOB_DATA 0x405 //!< OOB Data. Read/Write. size uint8[16]. Default is all 0's. +#define GAPBOND_BONDING_ENABLED 0x406 //!< Request Bonding during the pairing process if enabled. Read/Write. Size is uint8. Default is 0(disabled). +#define GAPBOND_KEY_DIST_LIST 0x407 //!< The key distribution list for bonding. size is uint8. @ref GAPBOND_KEY_DIST_DEFINES. Default is sEncKey, sIdKey, mIdKey, mSign enabled. +#define GAPBOND_DEFAULT_PASSCODE 0x408 //!< The default passcode for MITM protection. size is uint32. Range is 0 - 999,999. Default is 0. +#define GAPBOND_ERASE_ALLBONDS 0x409 //!< Erase all of the bonded devices. Write Only. No Size. +#define GAPBOND_AUTO_FAIL_PAIRING 0x40A //!< TEST MODE (DO NOT USE) to automatically send a Pairing Fail when a Pairing Request is received. Read/Write. size is uint8. Default is 0 (disabled). +#define GAPBOND_AUTO_FAIL_REASON 0x40B //!< TEST MODE (DO NOT USE) Pairing Fail reason when auto failing. Read/Write. size is uint8. Default is 0x05 (SMP_PAIRING_FAILED_NOT_SUPPORTED). +#define GAPBOND_KEYSIZE 0x40C //!< Key Size used in pairing. Read/Write. size is uint8. Default is 16. +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ +#define GAPBOND_PAIRING_MODE_NO_PAIRING 0x00 //!< Pairing is not allowed +#define GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 0x01 //!< Wait for a pairing request or slave security request +#define GAPBOND_PAIRING_MODE_INITIATE 0x02 //!< Don't wait, initiate a pairing request or slave security request +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ +#define GAPBOND_IO_CAP_DISPLAY_ONLY 0x00 //!< Display Only Device +#define GAPBOND_IO_CAP_DISPLAY_YES_NO 0x01 //!< Display and Yes and No Capable +#define GAPBOND_IO_CAP_KEYBOARD_ONLY 0x02 //!< Keyboard Only +#define GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT 0x03 //!< No Display or Input Device +#define GAPBOND_IO_CAP_KEYBOARD_DISPLAY 0x04 //!< Both Keyboard and Display Capable +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#define GAPBOND_KEYDIST_SENCKEY 0x01 //!< Slave Encryption Key +#define GAPBOND_KEYDIST_SIDKEY 0x02 //!< Slave IRK and ID information +#define GAPBOND_KEYDIST_SSIGN 0x04 //!< Slave CSRK +#define GAPBOND_KEYDIST_MENCKEY 0x08 //!< Master Encrypton Key +#define GAPBOND_KEYDIST_MIDKEY 0x10 //!< Master IRK and ID information +#define GAPBOND_KEYDIST_MSIGN 0x20 //!< Master CSRK +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ +#define GAPBOND_PAIRING_STATE_STARTED 0x00 //!< Pairing started +#define GAPBOND_PAIRING_STATE_COMPLETE 0x01 //!< Pairing complete +#define GAPBOND_PAIRING_STATE_BONDED 0x02 //!< Devices bonded +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#define SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED 0x01 //!< The user input of the passkey failed, for example, the user cancelled the operation. +#define SMP_PAIRING_FAILED_OOB_NOT_AVAIL 0x02 //!< The OOB data is not available +#define SMP_PAIRING_FAILED_AUTH_REQ 0x03 //!< The pairing procedure can't be performed as authentication requirements can't be met due to IO capabilities of one or both devices +#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value +#define SMP_PAIRING_FAILED_NOT_SUPPORTED 0x05 //!< Pairing isn't supported by the device +#define SMP_PAIRING_FAILED_ENC_KEY_SIZE 0x06 //!< The resultant encryption key size is insufficient for the security requirements of this device. +#define SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED 0x07 //!< The SMP command received is not supported on this device. +#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason +#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authenication procedure is disallowed because too little time has elapsed since the last pairing request or security request. +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +typedef void (*pfnPairStateCB_t) +( + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * GAP Bond Manager Callbacks. + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral or Peripheral/Broadcaster Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void gapBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* GAPPERIPHBONDMGR_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.c new file mode 100644 index 0000000..e1b647a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.c @@ -0,0 +1,316 @@ +/************************************************************************************************** + Filename: observer.c + Revised: $Date: 2011-05-05 10:12:10 -0700 (Thu, 05 May 2011) $ + Revision: $Revision: 25871 $ + + Description: GAP Observer Role + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "osal_cbTimer.h" +#include "osal_snv.h" +#include "hci_tl.h" +#include "gap.h" + +#include "observer.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Task ID +static uint8 gapObserverRoleTaskId; + +// App callbacks +static gapObserverRoleCB_t *pGapObserverRoleCB; + +/********************************************************************* + * Profile Parameters - reference GAPCENTRALROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapObserverRoleBdAddr[B_ADDR_LEN]; +static uint8 gapObserverRoleMaxScanRes = 0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapObserverRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapObserverRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_StartDevice( gapObserverRoleCB_t *pAppCallbacks ) +{ + if ( pAppCallbacks ) + { + pGapObserverRoleCB = pAppCallbacks; + } + + return GAP_DeviceInit( gapObserverRoleTaskId, GAP_PROFILE_OBSERVER, + gapObserverRoleMaxScanRes, NULL, NULL, NULL ); +} + +/** + * @brief Set a parameter in the Observer Profile. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPOBSERVERROLE_MAX_SCAN_RES: + if ( len == sizeof ( uint8 ) ) + { + gapObserverRoleMaxScanRes = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Get a parameter in the Observer Profile. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GAPOBSERVERROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapObserverRoleBdAddr, B_ADDR_LEN ) ; + break; + + case GAPOBSERVERROLE_MAX_SCAN_RES: + *((uint8*)pValue) = gapObserverRoleMaxScanRes; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ret; +} + +/** + * @brief Start a device discovery scan. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ) +{ + gapDevDiscReq_t params; + + params.taskID = gapObserverRoleTaskId; + params.mode = mode; + params.activeScan = activeScan; + params.whiteList = whiteList; + + return GAP_DeviceDiscoveryRequest( ¶ms ); +} + +/** + * @brief Cancel a device discovery scan. + * + * Public function defined in observer.h. + */ +bStatus_t GAPObserverRole_CancelDiscovery( void ) +{ + return GAP_DeviceDiscoveryCancel( gapObserverRoleTaskId ); +} + +/** + * @brief Observer Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +void GAPObserverRole_Init( uint8 taskId ) +{ + gapObserverRoleTaskId = taskId; + + // Register for HCI messages (for RSSI) + GAP_RegisterForHCIMsgs( taskId ); +} + +/** + * @brief Observer Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +uint16 GAPObserverRole_ProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapObserverRoleTaskId )) != NULL ) + { + gapObserverRole_ProcessOSALMsg( (osal_event_hdr_t *) pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapObserverRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapObserverRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + //hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *) pMsg; + } + break; + + case GAP_MSG_EVENT: + gapObserverRole_ProcessGAPMsg( (gapEventHdr_t *) pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapObserverRole_ProcessGAPMsg + * + * @brief Process an incoming task message from GAP. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapObserverRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *) pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + // Save off the information + VOID osal_memcpy( gapObserverRoleBdAddr, pPkt->devAddr, B_ADDR_LEN ); + } + } + break; + + default: + break; + } + + // Pass event to app + if ( pGapObserverRoleCB && pGapObserverRoleCB->eventCB ) + { + pGapObserverRoleCB->eventCB( (gapObserverRoleEvent_t *) pMsg ); + } +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.h new file mode 100644 index 0000000..8dcdf4f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/observer.h @@ -0,0 +1,230 @@ +/** + @headerfile: observer.h + $Date: 2011-03-11 15:48:31 -0800 (Fri, 11 Mar 2011) $ + $Revision: 25393 $ + + @mainpage TI BLE GAP Observer Role + + This GAP profile only discovers. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef OBSERVER_H +#define OBSERVER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "gap.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GAPOBSERVERROLE_PROFILE_PARAMETERS GAP Observer Role Parameters + * @{ + */ +#define GAPOBSERVERROLE_BD_ADDR 0x400 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPOBSERVERROLE_MAX_SCAN_RES 0x401 //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. +/** @} End GAPOBSERVERROLE_PROFILE_PARAMETERS */ + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Observer Event Structure + */ +typedef union +{ + gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. + gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. + gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. + gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. +} gapObserverRoleEvent_t; + +/** + * RSSI Read Callback Function + */ +typedef void (*pfnGapObserverRoleRssiCB_t) +( + uint16 connHandle, //!< Connection handle. + int8 rssi //!< New RSSI value. +); + +/** + * Observer Event Callback Function + */ +typedef void (*pfnGapObserverRoleEventCB_t) +( + gapObserverRoleEvent_t *pEvent //!< Pointer to event structure. +); + +/** + * Observer Callback Structure + */ +typedef struct +{ + pfnGapObserverRoleRssiCB_t rssiCB; //!< RSSI callback. + pfnGapObserverRoleEventCB_t eventCB; //!< Event callback. +} gapObserverRoleCB_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * Observer Profile Public APIs + */ + +/** + * @defgroup OBSERVER_PROFILE_API Observer Profile API Functions + * + * @{ + */ + +/** + * @brief Start the device in Observer role. This function is typically + * called once during system startup. + * + * @param pAppCallbacks - pointer to application callbacks + * + * @return SUCCESS: Operation successful.
+ * bleAlreadyInRequestedMode: Device already started.
+ */ +extern bStatus_t GAPObserverRole_StartDevice( gapObserverRoleCB_t *pAppCallbacks ); + +/** + * @brief Set a parameter in the Observer Profile. + * + * @param param - profile parameter ID: @ref GAPOBSERVERROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type. + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPObserverRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a parameter in the Observer Profile. + * + * @param param - profile parameter ID: @ref GAPOBSERVERROLE_PROFILE_PARAMETERS + * @param pValue - pointer to buffer to contain the read data + * + * @return SUCCESS: Operation successful.
+ * INVALIDPARAMETER: Invalid parameter ID.
+ */ +extern bStatus_t GAPObserverRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Start a device discovery scan. + * + * @param mode - discovery mode: @ref GAP_DEVDISC_MODE_DEFINES + * @param activeScan - TRUE to perform active scan + * @param whiteList - TRUE to only scan for devices in the white list + * + * @return SUCCESS: Discovery scan started.
+ * bleIncorrectMode: Invalid profile role.
+ * bleAlreadyInRequestedMode: Not available.
+ */ +extern bStatus_t GAPObserverRole_StartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ); + +/** + * @brief Cancel a device discovery scan. + * + * @return SUCCESS: Cancel started.
+ * bleInvalidTaskID: Not the task that started discovery.
+ * bleIncorrectMode: Not in discovery mode.
+ */ +extern bStatus_t GAPObserverRole_CancelDiscovery( void ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Observer Profile Task initialization function. + * + * @param taskId - Task ID. + * + * @return void + */ +extern void GAPObserverRole_Init( uint8 taskId ); + +/** + * @internal + * + * @brief Observer Profile Task event processing function. + * + * @param taskId - Task ID + * @param events - Events. + * + * @return events not processed + */ +extern uint16 GAPObserverRole_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* OBSERVER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.c new file mode 100644 index 0000000..b07e46f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.c @@ -0,0 +1,1253 @@ +/************************************************************************************************** + Filename: peripheral.c + Revised: $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + Revision: $Revision: 34101 $ + + Description: GAP Peripheral Role + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci_tl.h" +#include "l2cap.h" +#include "gap.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "osal_snv.h" + +#include "peripheral.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 // Start Advertising +#define RSSI_READ_EVT 0x0002 // Read RSSI +#define START_CONN_UPDATE_EVT 0x0004 // Start Connection Update Procedure +#define CONN_PARAM_TIMEOUT_EVT 0x0008 // Connection Parameters Update Timeout + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +#define RSSI_NOT_AVAILABLE 127 + +#define DEFAULT_MIN_CONN_INTERVAL 0x0006 // 100 milliseconds +#define DEFAULT_MAX_CONN_INTERVAL 0x0C80 // 4 seconds + +#define MIN_CONN_INTERVAL 0x0006 +#define MAX_CONN_INTERVAL 0x0C80 + +#define DEFAULT_TIMEOUT_MULTIPLIER 1000 + +#define CONN_INTERVAL_MULTIPLIER 6 + +#define MIN_SLAVE_LATENCY 0 +#define MAX_SLAVE_LATENCY 500 + +#define MIN_TIMEOUT_MULTIPLIER 0x000a +#define MAX_TIMEOUT_MULTIPLIER 0x0c80 + +#define MAX_TIMEOUT_VALUE 0xFFFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_IRK[KEYLEN]; +static uint8 gapRole_SRK[KEYLEN]; +static uint32 gapRole_signCounter; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // Limited Discoverable & BR/EDR not supported + (GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED), + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +static uint16 gapRole_ConnectionHandle = INVALID_CONNHANDLE; +static uint16 gapRole_RSSIReadRate = 0; + +static uint8 gapRole_ConnectedDevAddr[B_ADDR_LEN] = {0}; + +static uint8 gapRole_ParamUpdateEnable = FALSE; +static uint16 gapRole_MinConnInterval = DEFAULT_MIN_CONN_INTERVAL; +static uint16 gapRole_MaxConnInterval = DEFAULT_MAX_CONN_INTERVAL; +static uint16 gapRole_SlaveLatency = MIN_SLAVE_LATENCY; +static uint16 gapRole_TimeoutMultiplier = DEFAULT_TIMEOUT_MULTIPLIER; + +static uint16 gapRole_ConnInterval = 0; +static uint16 gapRole_ConnSlaveLatency = 0; +static uint16 gapRole_ConnTimeout = 0; + +static uint8 paramUpdateNoSuccessOption = GAPROLE_NO_ACTION; + +// Application callbacks +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; +static gapRolesParamUpdateCB_t *pGapRoles_ParamUpdateCB = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); +static void gapRole_HandleParamUpdateNoSuccess( void ); +static void gapRole_startConnUpdate( uint8 handleFailure ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapRole_signCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + if ( gapRole_state == GAPROLE_ADVERTISING ) + { + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING) + || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_RSSI_READ_RATE: + if ( len == sizeof ( uint16 ) ) + { + gapRole_RSSIReadRate = *((uint16*)pValue); + + if ( (gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED) ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapRole_ParamUpdateEnable = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_MIN_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL ) && + ( newInterval <= MAX_CONN_INTERVAL ) ) + { + gapRole_MinConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_MAX_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL) && + ( newInterval <= MAX_CONN_INTERVAL) ) + { + gapRole_MaxConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_SLAVE_LATENCY: + { + uint16 latency = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && (latency < MAX_SLAVE_LATENCY) ) + { + gapRole_SlaveLatency = latency; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + { + uint16 newTimeout = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) + && (newTimeout >= MIN_TIMEOUT_MULTIPLIER) && (newTimeout <= MAX_TIMEOUT_MULTIPLIER) ) + { + gapRole_TimeoutMultiplier = newTimeout; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_PARAM_UPDATE_REQ: + { + uint8 req = *((uint8*)pValue); + if ( len == sizeof ( uint8 ) && (req == TRUE) ) + { + // Make sure we don't send an L2CAP Connection Parameter Update Request + // command within TGAP(conn_param_timeout) of an L2CAP Connection Parameter + // Update Response being received. + if ( osal_get_timeoutEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT ) == 0 ) + { + // Start connection update procedure + gapRole_startConnUpdate( GAPROLE_NO_ACTION ); + + // Connection update requested by app, cancel such pending procedure (if active) + VOID osal_stop_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT ); + } + else + { + ret = blePending; + } + } + else + { + ret = bleInvalidRange; + } + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_IRK: + VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ; + break; + + case GAPROLE_SRK: + VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ; + break; + + case GAPROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapRole_signCounter; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + case GAPROLE_CONNHANDLE: + *((uint16*)pValue) = gapRole_ConnectionHandle; + break; + + case GAPROLE_RSSI_READ_RATE: + *((uint16*)pValue) = gapRole_RSSIReadRate; + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + *((uint16*)pValue) = gapRole_ParamUpdateEnable; + break; + + case GAPROLE_MIN_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MinConnInterval; + break; + + case GAPROLE_MAX_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MaxConnInterval; + break; + + case GAPROLE_SLAVE_LATENCY: + *((uint16*)pValue) = gapRole_SlaveLatency; + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + *((uint16*)pValue) = gapRole_TimeoutMultiplier; + break; + + case GAPROLE_CONN_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_ConnInterval; + break; + + case GAPROLE_CONN_LATENCY: + *((uint16*)pValue) = gapRole_ConnSlaveLatency; + break; + + case GAPROLE_CONN_TIMEOUT: + *((uint16*)pValue) = gapRole_ConnTimeout; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * @brief Register application's callbacks. + * + * Public function defined in peripheral.h. + */ +void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ) +{ + if ( pParamUpdateCB != NULL ) + { + pGapRoles_ParamUpdateCB = pParamUpdateCB; + } +} + +/********************************************************************* + * @brief Terminates the existing connection. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_TerminateConnection( void ) +{ + if ( gapRole_state == GAPROLE_CONNECTED ) + { + return ( GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ) ); + } + else + { + return ( bleIncorrectMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in peripheral.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = GAP_PROFILE_PERIPHERAL; + VOID osal_memset( gapRole_IRK, 0, KEYLEN ); + VOID osal_memset( gapRole_SRK, 0, KEYLEN ); + gapRole_signCounter = 0; + gapRole_AdvEventType = GAP_ADTYPE_ADV_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; + + // Restore Items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in peripheral.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + + // Notify the application with the new state change + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + return ( events ^ START_ADVERTISING_EVT ); + } + + if ( events & RSSI_READ_EVT ) + { + // Only get RSSI when in a connection + if ( gapRole_state == GAPROLE_CONNECTED ) + { + // Ask for RSSI + VOID HCI_ReadRssiCmd( gapRole_ConnectionHandle ); + + // Setup next event + if ( gapRole_RSSIReadRate ) + { + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + return ( events ^ RSSI_READ_EVT ); + } + + if ( events & START_CONN_UPDATE_EVT ) + { + // Start connection update procedure + gapRole_startConnUpdate( GAPROLE_NO_ACTION ); + + return ( events ^ START_CONN_UPDATE_EVT ); + } + + if ( events & CONN_PARAM_TIMEOUT_EVT ) + { + // Unsuccessful in updating connection parameters + gapRole_HandleParamUpdateNoSuccess(); + + return ( events ^ CONN_PARAM_TIMEOUT_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + int8 rssi = (int8)pPkt->pReturnParam[3]; + + if ( (gapRole_state == GAPROLE_CONNECTED) && (rssi != RSSI_NOT_AVAILABLE) ) + { + // Report RSSI to app + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead ) + { + pGapRoles_AppCGs->pfnRssiRead( rssi ); + } + } + } + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case L2CAP_SIGNAL_EVENT: + { + l2capSignalEvent_t *pPkt = (l2capSignalEvent_t *)pMsg; + + // Process the Parameter Update Response + if ( pPkt->opcode == L2CAP_PARAM_UPDATE_RSP ) + { + l2capParamUpdateRsp_t *pRsp = (l2capParamUpdateRsp_t *)&(pPkt->cmd.updateRsp); + + if ( ( pRsp->result == L2CAP_CONN_PARAMS_REJECTED ) && + ( paramUpdateNoSuccessOption == GAPROLE_TERMINATE_LINK ) ) + { + // Cancel connection param update timeout timer + VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT ); + + // Terminate connection immediately + GAPRole_TerminateConnection(); + } + else + { + uint16 timeout = GAP_GetParamValue( TGAP_CONN_PARAM_TIMEOUT ); + + // Let's wait for Controller to update connection parameters if they're + // accepted. Otherwise, decide what to do based on no success option. + VOID osal_start_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT, timeout ); + } + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, + TRUE, gapRole_AdvertDataLen, gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + gapRole_state = GAPROLE_ADVERTISING; + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN ); + gapRole_ConnectionHandle = pPkt->connectionHandle; + gapRole_state = GAPROLE_CONNECTED; + + if ( gapRole_RSSIReadRate ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + + // Store connection information + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + + // Check whether update parameter request is enabled + if ( gapRole_ParamUpdateEnable == TRUE ) + { + // Get the minimum time upon connection establishment before the + // peripheral can start a connection update procedure. + uint16 timeout = GAP_GetParamValue( TGAP_CONN_PAUSE_PERIPHERAL ); + + osal_start_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT, timeout*1000 ); + } + + // Notify the Bond Manager to the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL ); + } + else if ( pPkt->hdr.status == bleGAPConnNotAcceptable ) + { + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + + // Go to WAITING state, and then start advertising + gapRole_state = GAPROLE_WAITING; + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg; + + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN ); + + // Erase connection information + gapRole_ConnInterval = 0; + gapRole_ConnSlaveLatency = 0; + gapRole_ConnTimeout = 0; + + // Cancel all connection parameter update timers (if any active) + VOID osal_stop_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT ); + VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT ); + + // Go to WAITING state, and then start advertising + if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM ) + { + gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; + } + else + { + gapRole_state = GAPROLE_WAITING; + } + + notify = TRUE; + + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + } + break; + + case GAP_LINK_PARAM_UPDATE_EVENT: + { + gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg; + + // Cancel connection param update timeout timer (if active) + VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT ); + + if ( pPkt->hdr.status == SUCCESS ) + { + // Store new connection parameters + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + + // Make sure there's no pending connection update procedure + if ( osal_get_timeoutEx( gapRole_TaskID, START_CONN_UPDATE_EVT ) == 0 ) + { + // Notify the application with the new connection parameters + if ( pGapRoles_ParamUpdateCB != NULL ) + { + (*pGapRoles_ParamUpdateCB)( gapRole_ConnInterval, + gapRole_ConnSlaveLatency, + gapRole_ConnTimeout ); + } + } + } + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application with the new state change + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + gapRole_IRK, gapRole_SRK, + &gapRole_signCounter ); +} + +/********************************************************************* + * @fn gapRole_HandleParamUpdateNoSuccess + * + * @brief Handle unsuccessful connection parameters update. + * + * @param none + * + * @return none + */ +static void gapRole_HandleParamUpdateNoSuccess( void ) +{ + // See which option was choosen for unsuccessful updates + switch ( paramUpdateNoSuccessOption ) + { + case GAPROLE_RESEND_PARAM_UPDATE: + GAPRole_SendUpdateParam( gapRole_MinConnInterval, gapRole_MaxConnInterval, + gapRole_SlaveLatency, gapRole_TimeoutMultiplier, + GAPROLE_RESEND_PARAM_UPDATE ); + break; + + case GAPROLE_TERMINATE_LINK: + GAPRole_TerminateConnection(); + break; + + case GAPROLE_NO_ACTION: + // fall through + default: + //do nothing + break; + } +} + +/******************************************************************** + * @fn gapRole_startConnUpdate + * + * @brief Start the connection update procedure + * + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return none + */ +static void gapRole_startConnUpdate( uint8 handleFailure ) +{ + // First check the current connection parameters versus the configured parameters + if ( (gapRole_ConnInterval < gapRole_MinConnInterval) || + (gapRole_ConnInterval > gapRole_MaxConnInterval) || + (gapRole_ConnSlaveLatency != gapRole_SlaveLatency) || + (gapRole_ConnTimeout != gapRole_TimeoutMultiplier) ) + { + l2capParamUpdateReq_t updateReq; + uint16 timeout = GAP_GetParamValue( TGAP_CONN_PARAM_TIMEOUT ); + + updateReq.intervalMin = gapRole_MinConnInterval; + updateReq.intervalMax = gapRole_MaxConnInterval; + updateReq.slaveLatency = gapRole_SlaveLatency; + updateReq.timeoutMultiplier = gapRole_TimeoutMultiplier; + + VOID L2CAP_ConnParamUpdateReq( gapRole_ConnectionHandle, &updateReq, gapRole_TaskID ); + + paramUpdateNoSuccessOption = handleFailure; + + // Let's wait for L2CAP Connection Parameters Update Response + VOID osal_start_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT, timeout ); + } +} + +/******************************************************************** + * @fn GAPRole_SendUpdateParam + * + * @brief Update the parameters of an existing connection + * + * @param minConnInterval - the new min connection interval + * @param maxConnInterval - the new max connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected, or bleInvalidRange + */ +bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ) +{ + // If there is no existing connection no update need be sent + if ( gapRole_state != GAPROLE_CONNECTED ) + { + return ( bleNotConnected ); + } + + // Check that all parameters are in range before sending request + if ( ( minConnInterval >= DEFAULT_MIN_CONN_INTERVAL ) && + ( minConnInterval < DEFAULT_MAX_CONN_INTERVAL ) && + ( maxConnInterval >= DEFAULT_MIN_CONN_INTERVAL ) && + ( maxConnInterval < DEFAULT_MAX_CONN_INTERVAL ) && + ( latency < MAX_SLAVE_LATENCY ) && + ( connTimeout >= MIN_TIMEOUT_MULTIPLIER ) && + ( connTimeout < MAX_TIMEOUT_MULTIPLIER ) ) + { + gapRole_MinConnInterval = minConnInterval; + gapRole_MaxConnInterval = maxConnInterval; + gapRole_SlaveLatency = latency; + gapRole_TimeoutMultiplier = connTimeout; + + // Start connection update procedure + gapRole_startConnUpdate( handleFailure ); + + // Connection update requested by app, cancel such pending procedure (if active) + VOID osal_stop_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT ); + + return ( SUCCESS ); + } + + return ( bleInvalidRange ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.h new file mode 100644 index 0000000..50b6faa --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheral.h @@ -0,0 +1,285 @@ +/** + @headerfile: peripheral.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage TI BLE GAP Peripheral Role + + This GAP profile advertises and allows connections. + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef PERIPHERAL_H +#define PERIPHERAL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. +#define GAPROLE_ADVERT_OFF_TIME 0x306 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x307 //!< Advertisement Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x308 //!< Scan Response Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x309 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x30A //!< Direct Advertisement Address Type. Read/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x30B //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30C //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30D //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +#define GAPROLE_CONNHANDLE 0x30E //!< Connection Handle. Read Only. Size is uint16. +#define GAPROLE_RSSI_READ_RATE 0x30F //!< How often to read the RSSI during a connection. Read/Write. Size is uint16. The value is in milliseconds. Default is 0 = OFF. +#define GAPROLE_PARAM_UPDATE_ENABLE 0x310 //!< Slave Connection Parameter Update Enable. Read/Write. Size is uint8. If TRUE then automatic connection parameter update request is sent. Default is FALSE. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 4 seconds (0x0C80). +#define GAPROLE_SLAVE_LATENCY 0x313 //!< Update Parameter Slave Latency. Range: 0 - 499. Read/Write. Size is uint16. Default is 0. +#define GAPROLE_TIMEOUT_MULTIPLIER 0x314 //!< Update Parameter Timeout Multiplier (n * 10ms). Range: 100ms to 32 seconds (0x000a - 0x0c80). Read/Write. Size is uint16. Default is 1000. +#define GAPROLE_CONN_BD_ADDR 0x315 //!< Address of connected device. Read only. Size is uint8[B_MAX_ADV_LEN]. Set to all zeros when not connected. +#define GAPROLE_CONN_INTERVAL 0x316 //!< Current connection interval. Read only. Size is uint16. Range is 7.5ms to 4 seconds (0x0006 to 0x0C80). Default is 0 (no connection). +#define GAPROLE_CONN_LATENCY 0x317 //!< Current slave latency. Read only. Size is uint16. Range is 0 to 499. Default is 0 (no slave latency or no connection). +#define GAPROLE_CONN_TIMEOUT 0x318 //!< Current timeout value. Read only. size is uint16. Range is 100ms to 32 seconds. Default is 0 (no connection). +#define GAPROLE_PARAM_UPDATE_REQ 0x319 //!< Slave Connection Parameter Update Request. Write. Size is uint8. If TRUE then connection parameter update request is sent. +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/** + * Possible actions the peripheral device may take if an unsuccessful parameter + * update is received. + * + * Parameters for GAPRole_SendUpdateParam() only + */ + +#define GAPROLE_NO_ACTION 0 // Take no action upon unsuccessful parameter updates +#define GAPROLE_RESEND_PARAM_UPDATE 1 // Continue to resend request until successful update +#define GAPROLE_TERMINATE_LINK 2 // Terminate link upon unsuccessful parameter updates + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16 connInterval, + uint16 connSlaveLatency, + uint16 connTimeout ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_API GAP Peripheral Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connInterval - the new connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ); + +/** + * @brief Register application's callbacks. + * + * @param pParamUpdateCB - pointer to param update callback. + * + * @return none + */ +extern void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ); + +/** + * @} End GAPROLES_PERIPHERAL_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PERIPHERAL_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.c new file mode 100644 index 0000000..a322485 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.c @@ -0,0 +1,1111 @@ +/************************************************************************************************** + Filename: peripheralBroadcaster.c + Revised: $Date: 2011-08-04 12:05:19 -0700 (Thu, 04 Aug 2011) $ + Revision: $Revision: 27026 $ + + Description: GAP Peripheral + Broadcaster Role + + + Copyright 2010 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hci.h" +#include "l2cap.h" +#include "gap.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "osal_snv.h" + +#include "peripheralBroadcaster.h" +#include "gapbondmgr.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events +#define START_ADVERTISING_EVT 0x0001 +#define RSSI_READ_EVT 0x0002 +#define UPDATE_PARAMS_TIMEOUT_EVT 0x0004 + +#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds + +#define RSSI_NOT_AVAILABLE 127 + +#define DEFAULT_MIN_CONN_INTERVAL 0x0006 // 100 milliseconds +#define DEFAULT_MAX_CONN_INTERVAL 0x0C80 // 4 seconds + +#define MIN_CONN_INTERVAL 0x0006 +#define MAX_CONN_INTERVAL 0x0C80 + +#define DEFAULT_SLAVE_LATENCY 0 +#define DEFAULT_TIMEOUT_MULTIPLIER 1000 + +#define CONN_INTERVAL_MULTIPLIER 6 + +#define MAX_SLAVE_LATENCY 500 +#define MIN_TIMEOUT_MULTIPLIER 0x000a +#define MAX_TIMEOUT_MULTIPLIER 0x0c80 + +#define MAX_TIMEOUT_VALUE 0xFFFF + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_IRK[KEYLEN]; +static uint8 gapRole_SRK[KEYLEN]; +static uint32 gapRole_signCounter; +static uint8 gapRole_bdAddr[B_ADDR_LEN]; +static uint8 gapRole_AdvEnabled = TRUE; +static uint16 gapRole_AdvertOffTime = DEFAULT_ADVERT_OFF_TIME; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[B_MAX_ADV_LEN] = +{ + 0x02, // length of this data + GAP_ADTYPE_FLAGS, // AD Type = Flags + // Limited Discoverable & BR/EDR not supported + (GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED), + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[B_MAX_ADV_LEN] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[B_ADDR_LEN] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +static uint16 gapRole_ConnectionHandle = INVALID_CONNHANDLE; +static uint16 gapRole_RSSIReadRate = 0; + +static gapRolesCBs_t *pGapRoles_AppCGs = NULL; +static uint8 gapRole_ConnectedDevAddr[B_ADDR_LEN] = {0}; + +static uint8 gapRole_ParamUpdateEnable = FALSE; +static uint16 gapRole_MinConnInterval = DEFAULT_MIN_CONN_INTERVAL; +static uint16 gapRole_MaxConnInterval = DEFAULT_MAX_CONN_INTERVAL; +static uint16 gapRole_SlaveLatency = DEFAULT_SLAVE_LATENCY; +static uint16 gapRole_TimeoutMultiplier = DEFAULT_TIMEOUT_MULTIPLIER; + + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); +static void gapRole_SendUpdateParam( uint16 connInterval, uint16 connLatency ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_IRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_IRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SRK: + if ( len == KEYLEN ) + { + VOID osal_memcpy( gapRole_SRK, pValue, KEYLEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SIGNCOUNTER: + if ( len == sizeof ( uint32 ) ) + { + gapRole_signCounter = *((uint32*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_ENABLED: + if ( len == sizeof( uint8 ) ) + { + if ( (gapRole_state == GAPROLE_CONNECTED) || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + uint8 advEnabled = *((uint8*)pValue); + + if ( (gapRole_state == GAPROLE_CONNECTED) && (advEnabled == TRUE) ) + { + // Turn on advertising + osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + else if ( (gapRole_state == GAPROLE_CONNECTED_ADV) && (advEnabled == FALSE) ) + { + // Turn off Advertising + GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) + { + // Turn off Advertising + VOID GAP_EndDiscoverable( gapRole_TaskID ); + } + else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING ) + || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) + { + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_OFF_TIME: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADVERT_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_AdvertData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_SCAN_RSP_DATA: + if ( len <= B_MAX_ADV_LEN ) + { + VOID osal_memset( gapRole_ScanRspData, 0, B_MAX_ADV_LEN ); + VOID osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_EVENT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_ADTYPE_ADV_NONCONN_IND) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_TYPE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= ADDRTYPE_PRIVATE_RESOLVE) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_DIRECT_ADDR: + if ( len == B_ADDR_LEN ) + { + VOID osal_memcpy( gapRole_AdvDirectAddr, pValue, B_ADDR_LEN ) ; + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_CHANNEL_MAP: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_ADV_FILTER_POLICY: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= GAP_FILTER_POLICY_WHITE) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_RSSI_READ_RATE: + if ( len == sizeof ( uint16 ) ) + { + gapRole_RSSIReadRate = *((uint16*)pValue); + + if ( (gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED) ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) ) + { + gapRole_ParamUpdateEnable = *((uint8*)pValue); + } + else + { + ret = bleInvalidRange; + } + break; + + case GAPROLE_MIN_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL ) && + ( newInterval <= MAX_CONN_INTERVAL ) ) + { + gapRole_MinConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_MAX_CONN_INTERVAL: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= MIN_CONN_INTERVAL) && + ( newInterval <= MAX_CONN_INTERVAL) ) + { + gapRole_MaxConnInterval = newInterval; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_SLAVE_LATENCY: + { + uint16 latency = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && (latency < MAX_SLAVE_LATENCY) ) + { + gapRole_SlaveLatency = latency; + } + else + { + ret = bleInvalidRange; + } + } + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + { + uint16 newTimeout = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) + && (newTimeout >= MIN_TIMEOUT_MULTIPLIER) && (newTimeout <= MAX_TIMEOUT_MULTIPLIER) ) + { + gapRole_TimeoutMultiplier = newTimeout; + } + else + { + ret = bleInvalidRange; + } + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < TGAP_PARAMID_MAX) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case GAPROLE_PROFILEROLE: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case GAPROLE_IRK: + VOID osal_memcpy( pValue, gapRole_IRK, KEYLEN ) ; + break; + + case GAPROLE_SRK: + VOID osal_memcpy( pValue, gapRole_SRK, KEYLEN ) ; + break; + + case GAPROLE_SIGNCOUNTER: + *((uint32*)pValue) = gapRole_signCounter; + break; + + case GAPROLE_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_bdAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADVERT_ENABLED: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case GAPROLE_ADVERT_OFF_TIME: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case GAPROLE_ADVERT_DATA: + VOID osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case GAPROLE_SCAN_RSP_DATA: + VOID osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case GAPROLE_ADV_EVENT_TYPE: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case GAPROLE_ADV_DIRECT_TYPE: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case GAPROLE_ADV_DIRECT_ADDR: + VOID osal_memcpy( pValue, gapRole_AdvDirectAddr, B_ADDR_LEN ) ; + break; + + case GAPROLE_ADV_CHANNEL_MAP: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case GAPROLE_ADV_FILTER_POLICY: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + case GAPROLE_CONNHANDLE: + *((uint16*)pValue) = gapRole_ConnectionHandle; + break; + + case GAPROLE_RSSI_READ_RATE: + *((uint16*)pValue) = gapRole_RSSIReadRate; + break; + + case GAPROLE_PARAM_UPDATE_ENABLE: + *((uint16*)pValue) = gapRole_ParamUpdateEnable; + break; + + case GAPROLE_MIN_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MinConnInterval; + break; + + case GAPROLE_MAX_CONN_INTERVAL: + *((uint16*)pValue) = gapRole_MaxConnInterval; + break; + + case GAPROLE_SLAVE_LATENCY: + *((uint16*)pValue) = gapRole_SlaveLatency; + break; + + case GAPROLE_TIMEOUT_MULTIPLIER: + *((uint16*)pValue) = gapRole_TimeoutMultiplier; + break; + + case GAPROLE_CONN_BD_ADDR: + VOID osal_memcpy( pValue, gapRole_ConnectedDevAddr, B_ADDR_LEN ) ; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < TGAP_PARAMID_MAX ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = INVALIDPARAMETER; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( SUCCESS ); + } + else + { + return ( bleAlreadyInRequestedMode ); + } +} + +/********************************************************************* + * @brief Terminates the existing connection. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_TerminateConnection( void ) +{ + if ( (gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + return ( GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ) ); + } + else + { + return ( bleIncorrectMode ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in peripheral.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = (GAP_PROFILE_PERIPHERAL | GAP_PROFILE_BROADCASTER); + VOID osal_memset( gapRole_IRK, 0, KEYLEN ); + VOID osal_memset( gapRole_SRK, 0, KEYLEN ); + gapRole_signCounter = 0; + gapRole_AdvEventType = GAP_ADTYPE_ADV_IND; + gapRole_AdvDirectType = ADDRTYPE_PUBLIC; + gapRole_AdvChanMap = GAP_ADVCHAN_ALL; + gapRole_AdvFilterPolicy = GAP_FILTER_POLICY_ALL; + + // Restore Items from NV + VOID osal_snv_read( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_read( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + VOID osal_snv_read( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in peripheral.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + VOID task_id; // OSAL required parameter that isn't used in this function + + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != NULL ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } + + if ( events & GAP_EVENT_SIGN_COUNTER_CHANGED ) + { + // Sign counter changed, save it to NV + VOID osal_snv_write( BLE_NVID_SIGNCOUNTER, sizeof( uint32 ), &gapRole_signCounter ); + + return ( events ^ GAP_EVENT_SIGN_COUNTER_CHANGED ); + } + + if ( events & START_ADVERTISING_EVT ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + if ( gapRole_state == GAPROLE_CONNECTED ) + { + // While in a connection, we can only advertise non-connectable undirected. + params.eventType = GAP_ADTYPE_ADV_NONCONN_IND; + } + else + { + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN ); + } + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + return ( events ^ START_ADVERTISING_EVT ); + } + + if ( events & RSSI_READ_EVT ) + { + // Only get RSSI when in a connection + if ( (gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV) ) + { + // Ask for RSSI + VOID HCI_ReadRssiCmd( gapRole_ConnectionHandle ); + + // Setup next event + if ( gapRole_RSSIReadRate ) + { + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + } + return ( events ^ RSSI_READ_EVT ); + } + + if ( events & UPDATE_PARAMS_TIMEOUT_EVT ) + { + // Clear an existing timeout + if ( osal_get_timeoutEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ) ) + { + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // The Update Parameters Timeout occurred - Terminate connection + VOID GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ); + + return ( events ^ UPDATE_PARAMS_TIMEOUT_EVT ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case HCI_GAP_EVENT_EVENT: + if ( pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + + if ( pPkt->cmdOpcode == HCI_READ_RSSI ) + { + int8 rssi = (int8)pPkt->pReturnParam[3]; + + if ( ((gapRole_state == GAPROLE_CONNECTED) + || (gapRole_state == GAPROLE_CONNECTED_ADV)) + && (rssi != RSSI_NOT_AVAILABLE) ) + { + // Report RSSI to app + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead ) + { + pGapRoles_AppCGs->pfnRssiRead( rssi ); + } + } + } + } + break; + + case GAP_MSG_EVENT: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case L2CAP_SIGNAL_EVENT: + { + l2capSignalEvent_t *pPkt = (l2capSignalEvent_t *)pMsg; + + // Process the Parameter Update Response + if ( pPkt->opcode == L2CAP_PARAM_UPDATE_RSP ) + { + l2capParamUpdateRsp_t *pRsp = (l2capParamUpdateRsp_t *)&(pPkt->cmd.updateRsp); + if ( pRsp->result == SUCCESS ) + { + // All is good stop Update Parameters timeout + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = FALSE; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case GAP_DEVICE_INIT_DONE_EVENT: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == SUCCESS ) + { + // Save off the generated keys + VOID osal_snv_write( BLE_NVID_IRK, KEYLEN, gapRole_IRK ); + VOID osal_snv_write( BLE_NVID_CSRK, KEYLEN, gapRole_SRK ); + + // Save off the information + VOID osal_memcpy( gapRole_bdAddr, pPkt->devAddr, B_ADDR_LEN ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, + TRUE, gapRole_AdvertDataLen, gapRole_AdvertData ); + } + + if ( stat != SUCCESS ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = TRUE; + } + break; + + case GAP_ADV_DATA_UPDATE_DONE_EVENT: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + FALSE, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + } + + if ( pPkt->hdr.status != SUCCESS ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = TRUE; + } + } + break; + + case GAP_MAKE_DISCOVERABLE_DONE_EVENT: + case GAP_END_DISCOVERABLE_DONE_EVENT: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + if ( pMsg->opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT ) + { + if ( gapRole_state == GAPROLE_CONNECTED ) + { + gapRole_state = GAPROLE_CONNECTED_ADV; + } + else + { + gapRole_state = GAPROLE_ADVERTISING; + } + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + VOID osal_start_timerEx( gapRole_TaskID, START_ADVERTISING_EVT, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = FALSE; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_ESTABLISHED_EVENT: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg; + + if ( pPkt->hdr.status == SUCCESS ) + { + VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN ); + gapRole_ConnectionHandle = pPkt->connectionHandle; + gapRole_state = GAPROLE_CONNECTED; + + if ( gapRole_RSSIReadRate ) + { + // Start the RSSI Reads + VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate ); + } + + // Check whether update parameter request is enabled, and check the connection parameters + if ( ( gapRole_ParamUpdateEnable == TRUE ) && + ( (pPkt->connInterval < gapRole_MinConnInterval) || + (pPkt->connInterval > gapRole_MaxConnInterval) || + (pPkt->connLatency != gapRole_SlaveLatency) || + (pPkt->connTimeout != gapRole_TimeoutMultiplier) )) + { + gapRole_SendUpdateParam( pPkt->connInterval, pPkt->connLatency ); + } + + // Notify the Bond Manager to the connection + VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL ); + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = TRUE; + } + break; + + case GAP_LINK_TERMINATED_EVENT: + { + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN ); + + if ( gapRole_state == GAPROLE_CONNECTED_ADV ) + { + // End the non-connectable advertising + GAP_EndDiscoverable( gapRole_TaskID ); + gapRole_state = GAPROLE_CONNECTED; + } + else + { + gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg; + if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM ) + { + gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; + } + else + { + gapRole_state = GAPROLE_WAITING; + } + + notify = TRUE; + + VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); + } + + gapRole_ConnectionHandle = INVALID_CONNHANDLE; + } + break; + + case GAP_LINK_PARAM_UPDATE_EVENT: + { + gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg; + + if ( (pPkt->hdr.status != SUCCESS) + || (pPkt->connInterval < gapRole_MinConnInterval) + || (pPkt->connInterval > gapRole_MaxConnInterval) ) + { + // Ask to change the interval + gapRole_SendUpdateParam( pPkt->connInterval, pPkt->connLatency ); + } + else + { + // All is good stop Update Parameters timeout + VOID osal_stop_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT ); + } + } + break; + + default: + break; + } + + if ( notify == TRUE ) + { + // Notify the application + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + VOID GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + gapRole_IRK, gapRole_SRK, + &gapRole_signCounter ); +} + +/********************************************************************* + * @fn gapRole_SendUpdateParam + * + * @brief Send an Update Connection Parameters. + * + * @param connInterval - current connection interval + * @param connLatency - current connection latency + * + * @return none + */ +static void gapRole_SendUpdateParam( uint16 connInterval, uint16 connLatency ) +{ + l2capParamUpdateReq_t updateReq; // Space for Conn Update parameters + uint32 timeout; // Calculated response timeout + + // Calculate the current interval + uint16 effectiveOldInterval = (connInterval * (connLatency + 1)); + + // Calculate the interval we want + uint16 effectiveNewMaxInterval = (gapRole_MaxConnInterval * (gapRole_SlaveLatency + 1)); + + // Fill in the wanted parameters + updateReq.intervalMin = gapRole_MinConnInterval; + updateReq.intervalMax = gapRole_MaxConnInterval; + updateReq.slaveLatency = gapRole_SlaveLatency; + updateReq.timeoutMultiplier = gapRole_TimeoutMultiplier; + + VOID L2CAP_ConnParamUpdateReq( gapRole_ConnectionHandle, &updateReq, gapRole_TaskID ); + + // Set up the timeout for expected response + if( effectiveOldInterval > effectiveNewMaxInterval ) + { + timeout = (uint32)(effectiveOldInterval) * CONN_INTERVAL_MULTIPLIER; + } + else + { + timeout = (uint32)(effectiveNewMaxInterval) * CONN_INTERVAL_MULTIPLIER; + } + + if( timeout > MAX_TIMEOUT_VALUE ) + { + timeout = MAX_TIMEOUT_VALUE; + } + + VOID osal_start_timerEx( gapRole_TaskID, UPDATE_PARAMS_TIMEOUT_EVT, (uint16)(timeout) ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.h new file mode 100644 index 0000000..2b84cef --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Roles/peripheralBroadcaster.h @@ -0,0 +1,242 @@ +/** + @headerfile: peripheralBroadcaster.h + $Date: 2011-08-04 12:05:19 -0700 (Thu, 04 Aug 2011) $ + $Revision: 27026 $ + + @mainpage TI BLE GAP Peripheral + Broadcaster Roles + + This GAP profile advertises and allows connections and adds the ability to + advertise (non-connectable) during a connection. + + Copyright 2010 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + +#ifndef PERIPHERAL_BROADCASTER_H +#define PERIPHERAL_BROADCASTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#define GAPROLE_PROFILEROLE 0x300 //!< Reading this parameter will return GAP Role type. Read Only. Size is uint8. +#define GAPROLE_IRK 0x301 //!< Identity Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the IRK will be randomly generated. +#define GAPROLE_SRK 0x302 //!< Signature Resolving Key. Read/Write. Size is uint8[KEYLEN]. Default is all 0, which means that the SRK will be randomly generated. +#define GAPROLE_SIGNCOUNTER 0x303 //!< Sign Counter. Read/Write. Size is uint32. Default is 0. +#define GAPROLE_BD_ADDR 0x304 //!< Device's Address. Read Only. Size is uint8[B_ADDR_LEN]. This item is read from the controller. +#define GAPROLE_ADVERT_ENABLED 0x305 //!< Enable/Disable Advertising. Read/Write. Size is uint8. Default is TRUE=Enabled. During a connection, this will enable and display advertising (non-connectable undirected). Setting this variable during a connection does not change the permanent state of the parameter. +#define GAPROLE_ADVERT_OFF_TIME 0x306 //!< Advertising Off Time for Limited advertisements (in milliseconds). Read/Write. Size is uint16. Default is 30 seconds. +#define GAPROLE_ADVERT_DATA 0x307 //!< Advertisement Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Default is "02:01:01", which means that it is a Limited Discoverable Advertisement. +#define GAPROLE_SCAN_RSP_DATA 0x308 //!< Scan Response Data. Read/Write. Max size is uint8[B_MAX_ADV_LEN]. Defaults to all 0. +#define GAPROLE_ADV_EVENT_TYPE 0x309 //!< Advertisement Type. Read/Write. Size is uint8. Default is GAP_ADTYPE_ADV_IND (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_TYPE 0x30A //!< Direct Advertisement Address Type. Read/Write. Size is uint8. Default is ADDRTYPE_PUBLIC (defined in GAP.h). +#define GAPROLE_ADV_DIRECT_ADDR 0x30B //!< Direct Advertisement Address. Read/Write. Size is uint8[B_ADDR_LEN]. Default is NULL. +#define GAPROLE_ADV_CHANNEL_MAP 0x30C //!< Which channels to advertise on. Read/Write Size is uint8. Default is GAP_ADVCHAN_ALL (defined in GAP.h) +#define GAPROLE_ADV_FILTER_POLICY 0x30D //!< Filter Policy. Ignored when directed advertising is used. Read/Write. Size is uint8. Default is GAP_FILTER_POLICY_ALL (defined in GAP.h). +#define GAPROLE_CONNHANDLE 0x30E //!< Connection Handle. Read Only. Size is uint16. +#define GAPROLE_RSSI_READ_RATE 0x30F //!< How often to read the RSSI during a connection. Read/Write. Size is uint16. The value is in milliseconds. Default is 0 = OFF. +#define GAPROLE_PARAM_UPDATE_ENABLE 0x310 //!< Slave Connection Parameter Update Enable. Read/Write. Size is uint8. If TRUE then automatic connection parameter update request is sent. Default is FALSE. +#define GAPROLE_MIN_CONN_INTERVAL 0x311 //!< Minimum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 7.5 milliseconds (0x0006). +#define GAPROLE_MAX_CONN_INTERVAL 0x312 //!< Maximum Connection Interval to allow (n * 1.25ms). Range: 7.5 msec to 4 seconds (0x0006 to 0x0C80). Read/Write. Size is uint16. Default is 4 seconds (0x0C80). +#define GAPROLE_SLAVE_LATENCY 0x313 //!< Update Parameter Slave Latency. Range: 0 - 499. Read/Write. Size is uint16. Default is 0. +#define GAPROLE_TIMEOUT_MULTIPLIER 0x314 //!< Update Parameter Timeout Multiplier (n * 10ms). Range: 100ms to 32 seconds (0x000a - 0x0c80). Read/Write. Size is uint16. Default is 1000. +#define GAPROLE_CONN_BD_ADDR 0x315 //!< Address of connected device. Read only. Size is uint8[B_MAX_ADV_LEN]. Set to all zeros when not connected. +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral + Broadcaster Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_CONNECTED_ADV, //!< In a connection and advertising + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_BROADCASTER_API GAP Peripheral + Broadcaster Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @} End GAPROLES_PERIPHERAL_BROADCASTER_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PERIPHERAL_BROADCASTER_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.c new file mode 100644 index 0000000..be9800b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.c @@ -0,0 +1,449 @@ +/************************************************************************************************** + Filename: scanparamservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the Scan Parameters Service. + + Copyright 2011 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "linkdb.h" +#include "scanparamservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Scan parameters service +CONST uint8 scanParamServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_PARAM_SERVICE_UUID), HI_UINT16(SCAN_PARAM_SERVICE_UUID) +}; + +// Scan interval window characteristic +CONST uint8 scanIntervalWindowUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_INTERVAL_WINDOW_UUID), HI_UINT16(SCAN_INTERVAL_WINDOW_UUID) +}; + +// Scan parameter refresh characteristic +CONST uint8 scanParamRefreshUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(SCAN_PARAM_REFRESH_UUID), HI_UINT16(SCAN_PARAM_REFRESH_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Application callback +static scanParamServiceCB_t scanParamServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Scan Parameters Service attribute +static CONST gattAttrType_t scanParamService = { ATT_BT_UUID_SIZE, scanParamServUUID }; + +// Scan Interval Window characteristic +static uint8 scanIntervalWindowProps = GATT_PROP_WRITE_NO_RSP; +static uint8 scanIntervalWindow[SCAN_INTERVAL_WINDOW_CHAR_LEN]; + +// Scan Parameter Refresh characteristic +static uint8 scanParamRefreshProps = GATT_PROP_NOTIFY; +static uint8 scanParamRefresh[SCAN_PARAM_REFRESH_LEN]; +static gattCharCfg_t scanParamRefreshClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t scanParamAttrTbl[] = +{ + // Scan Parameters Service attribute + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&scanParamService /* pValue */ + }, + + // Scan Interval Window declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &scanIntervalWindowProps + }, + + // Scan Interval Window characteristic + { + { ATT_BT_UUID_SIZE, scanIntervalWindowUUID }, + GATT_PERMIT_WRITE, + 0, + scanIntervalWindow + }, + + // Scan Parameter Refresh declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &scanParamRefreshProps + }, + + // Scan Parameter Refresh characteristic + { + { ATT_BT_UUID_SIZE, scanParamRefreshUUID }, + 0, + 0, + scanParamRefresh + }, + + // Scan Parameter Refresh characteristic client characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *) &scanParamRefreshClientCharCfg + } +}; + +// Attribute index enumeration-- these indexes match array elements above +enum +{ + SCAN_PARAM_SERVICE_IDX, // Scan Parameters Service + SCAN_PARAM_INTERVAL_DECL_IDX, // Scan Interval Window declaration + SCAN_PARAM_INTERVAL_IDX, // Scan Interval Window characteristic + SCAN_PARAM_REFRESH_DECL_IDX, // Scan Parameter Refresh declaration + SCAN_PARAM_REFRESH_IDX, // Scan Parameter Refresh characteristic + SCAN_PARAM_REFRESH_CCCD_IDX // Scan Parameter Refresh characteristic client characteristic configuration +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bStatus_t scanParamWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static uint8 scanParamReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Service Callbacks +CONST gattServiceCBs_t scanParamCBs = +{ + scanParamReadAttrCB, // Read callback function pointer + scanParamWriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn ScanParam_AddService + * + * @brief Initializes the Battery Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t ScanParam_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, scanParamRefreshClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( scanParamAttrTbl, GATT_NUM_ATTRS( scanParamAttrTbl ), + &scanParamCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn ScanParam_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void ScanParam_Register( scanParamServiceCB_t pfnServiceCB ) +{ + scanParamServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn ScanParam_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ScanParam_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ScanParam_GetParameter + * + * @brief Get a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t ScanParam_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case SCAN_PARAM_PARAM_INTERVAL: + *((uint16*)value) = BUILD_UINT16(scanIntervalWindow[0], + scanIntervalWindow[1]); + break; + + case SCAN_PARAM_PARAM_WINDOW: + *((uint16*)value) = BUILD_UINT16(scanIntervalWindow[2], + scanIntervalWindow[3]); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn ScanParam_RefreshNotify + * + * @brief Notify the peer to refresh the scan parameters. + * + * @param connHandle - connection handle + * + * @return None + */ +void ScanParam_RefreshNotify( uint16 connHandle ) +{ + attHandleValueNoti_t noti; + uint16 value; + + value = GATTServApp_ReadCharCfg( connHandle, scanParamRefreshClientCharCfg ); + + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // send notification + noti.handle = scanParamAttrTbl[SCAN_PARAM_REFRESH_CCCD_IDX].handle; + noti.len = SCAN_PARAM_REFRESH_LEN; + noti.value[0] = SCAN_PARAM_REFRESH_REQ; + GATT_Notification( connHandle, ¬i, FALSE ); + } +} + +/********************************************************************* + * @fn scanParamReadAttrCB + * + * @brief GATT read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 scanParamReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + return ( status ); +} + +/********************************************************************* + * @fn scanParamWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t scanParamWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + + // Only one writeable attribute + if ( uuid == SCAN_INTERVAL_WINDOW_UUID ) + { + // require encryption + if ( linkDB_Encrypted( connHandle ) == FALSE ) + { + return ( ATT_ERR_INSUFFICIENT_ENCRYPT ); + } + + if ( len == SCAN_INTERVAL_WINDOW_CHAR_LEN ) + { + uint16 interval = BUILD_UINT16( pValue[0], pValue[1] ); + uint16 window = BUILD_UINT16( pValue[0], pValue[1] ); + + // Validate values + if ( window <= interval ) + { + osal_memcpy( pAttr->pValue, pValue, len ); + + (*scanParamServiceCB)( SCAN_INTERVAL_WINDOW_SET ); + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else if ( uuid == GATT_CLIENT_CHAR_CFG_UUID ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn ScanParam_HandleConnStatusCB + * + * @brief Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void ScanParam_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, scanParamRefreshClientCharCfg ); + } + } +} diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.h new file mode 100644 index 0000000..6f2c88b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/ScanParam/scanparamservice.h @@ -0,0 +1,176 @@ +/************************************************************************************************** + Filename: cmdenumservice.h + Revised: $Date: 2011-12-16 15:46:52 -0800 (Fri, 16 Dec 2011) $ + Revision: $Revision: 58 $ + + Description: This file contains the Scan Parameters Service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef SCANPARAMSERVICE_H +#define SCANPARAMSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Scan Parameters Service UUIDs +#define SCAN_PARAM_SERVICE_UUID 0x1813 +#define SCAN_INTERVAL_WINDOW_UUID 0x2A4F +#define SCAN_PARAM_REFRESH_UUID 0x2A31 + +// Scan Characteristic Lengths +#define SCAN_INTERVAL_WINDOW_CHAR_LEN 4 +#define SCAN_PARAM_REFRESH_LEN 1 + +// Scan Parameter Refresh Values +#define SCAN_PARAM_REFRESH_REQ 0x00 + +// Callback events +#define SCAN_INTERVAL_WINDOW_SET 1 + +// Get/Set parameters +#define SCAN_PARAM_PARAM_INTERVAL 0 +#define SCAN_PARAM_PARAM_WINDOW 1 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Scan Parameters Service callback function +typedef void (*scanParamServiceCB_t)( uint8 event ); + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn ScanParam_AddService + * + * @brief Initializes the Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t ScanParam_AddService( void ); + +/********************************************************************* + * @fn ScanParam_Register + * + * @brief Register a callback function with the Scan Parameters Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void ScanParam_Register( scanParamServiceCB_t pfnServiceCB ); + +/********************************************************************* + * @fn ScanParam_SetParameter + * + * @brief Set a Scan Parameters Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t ScanParam_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn ScanParam_GetParameter + * + * @brief Get a Scan Parameters Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t ScanParam_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn ScanParam_RefreshNotify + * + * @brief Notify the peer to refresh the scan parameters. + * + * @param connHandle - connection handle + * + * @return None + */ +extern void ScanParam_RefreshNotify( uint16 connHandle ); + +/********************************************************************* + * @fn ScanParam_HandleConnStatusCB + * + * @brief Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void ScanParam_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SCANPARAMSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.c new file mode 100644 index 0000000..857fef4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.c @@ -0,0 +1,634 @@ +/************************************************************************************************** + Filename: accelerometerservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Accelerometer service. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "accelerometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Accelerometer Service UUID +CONST uint8 accelServUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_SERV_UUID), +}; + +// Accelerometer Characteristic value Data UUID +CONST uint8 accelDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_DATA_UUID), +}; + +// Accelerometer Characteristic value Configuration UUID +CONST uint8 accelCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_CONF_UUID), +}; + +// Accelerometer Characteristic value Configuration UUID +CONST uint8 accelPeriodUUID[TI_UUID_SIZE] = +{ + TI_UUID(ACCELEROMETER_PERI_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static accelCBs_t *accel_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Accelerometer Profile Service attribute +static CONST gattAttrType_t accelService = { TI_UUID_SIZE, accelServUUID }; + +// Accelerometer Characteristic Properties +static uint8 accelDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 accelData[ACCELEROMETER_DATA_LEN] = { 0, 0, 0}; + +// Accelerometer Characteristic Configuration +static gattCharCfg_t accelDataConfig[GATT_MAX_NUM_CONN]; + +// Accelerometer Characteristic User Description +static uint8 accelDataUserDesp[] = "Accel. Data"; + +// Accelerometer Characteristic Configuration Properties +static uint8 accelCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Accelerometer Characteristic Configuration Value +static uint8 accelCfg = 0; + +// Accelerometer Characteristic Configuration User Description +static uint8 accelCfgUserDesp[] = "Accel. Conf."; + +// Accelerometer Characteristic Period Properties +static uint8 accPerProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Accelerometer Characteristic Period Value +static uint8 accPer = 0; + +// Accelerometer Characteristic Period User Description +static uint8 accPerUserDesp[] = "Acc. Period"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t accelAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&accelService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, accelDataUUID }, + GATT_PERMIT_READ, + 0, + accelData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)accelDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accelCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, accelCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accelCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accelCfgUserDesp + }, + // Characteristic Declaration "Period" + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &accPerProps + }, + + // Characteristic Value "Period" + { + { TI_UUID_SIZE, accelPeriodUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &accPer + }, + + // Characteristic User Description "Period" + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + accPerUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 acc_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t acc_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void acc_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t accCBs = +{ + acc_ReadAttrCB, // Read callback function pointer + acc_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Accel_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Accel_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( acc_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, accelDataConfig ); + + if (services & ACCELEROMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( accelAttrTbl, + GATT_NUM_ATTRS( accelAttrTbl ), + &accCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Accel_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ) +{ + if ( accel_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + accel_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Accel_SetParameter + * + * @brief Set an Accelrometer parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCELEROMETER_DATA: + if ( len == ACCELEROMETER_DATA_LEN ) + { + VOID osal_memcpy( accelData, value, ACCELEROMETER_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( accelDataConfig, accelData, FALSE, + accelAttrTbl, GATT_NUM_ATTRS( accelAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCELEROMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + accelCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case ACCELEROMETER_PERI: + if ( len == sizeof ( uint8 ) ) + { + accPer = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Accel_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Accel_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case ACCELEROMETER_DATA: + VOID osal_memcpy( value, accelData, ACCELEROMETER_DATA_LEN ); + break; + + case ACCELEROMETER_CONF: + *((uint8*)value) = accelCfg; + break; + + case ACCELEROMETER_PERI: + *((uint8*)value) = accPer; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn acc_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 acc_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case ACCELEROMETER_DATA_UUID: + *pLen = ACCELEROMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, ACCELEROMETER_DATA_LEN ); + break; + + case ACCELEROMETER_CONF_UUID: + case ACCELEROMETER_PERI_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn acc_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t acc_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + uint16 uuid; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case ACCELEROMETER_DATA_UUID: + // Should not get here + break; + + case ACCELEROMETER_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + + if( pAttr->pValue == &accelCfg ) + { + notifyApp = ACCELEROMETER_CONF; + } + } + break; + + case ACCELEROMETER_PERI_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + // Write the value + if ( status == SUCCESS ) + { + if (pValue[0]>=(ACCELEROMETER_MIN_PERIOD/ACCELEROMETER_TIME_UNIT)) + { + + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &accPer ) + { + notifyApp = ACCELEROMETER_PERI; + } + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && accel_AppCBs && accel_AppCBs->pfnAccelChange ) + { + accel_AppCBs->pfnAccelChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn acc_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void acc_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, accelDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.h new file mode 100644 index 0000000..6f9482b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/accelerometerservice.h @@ -0,0 +1,151 @@ +/************************************************************************************************** + Filename: accelerometerservice.h + Revised: $Date: 2013-02-07 05:39:50 -0800 (Thu, 07 Feb 2013) $ + Revision: $Revision: 33009 $ + + Description: Accelerometer service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ACCELEROMETERSERVICE_H +#define ACCELEROMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define ACCELEROMETER_DATA 2 // R uint8 - Profile Attribute value +#define ACCELEROMETER_CONF 3 // RW uint8 - Profile Attribute value +#define ACCELEROMETER_PERI 4 // RW uint8 - Profile Attribute Value + +// Service UUID +#define ACCELEROMETER_SERV_UUID 0xAA10 // F0000000-0451-4000-B000-00000000-AA10 +#define ACCELEROMETER_DATA_UUID 0xAA11 +#define ACCELEROMETER_CONF_UUID 0xAA12 +#define ACCELEROMETER_PERI_UUID 0xAA13 + +// Sensor Profile Services bit fields +#define ACCELEROMETER_SERVICE 0x00000002 + +// Length of sensor data in bytes +#define ACCELEROMETER_DATA_LEN 3 + + // Minimum accelerometer period +#define ACCELEROMETER_MIN_PERIOD 100 +#define ACCELEROMETER_TIME_UNIT 10 // resolution 10 ms + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*accelChange_t)( uint8 paramID ); + +typedef struct +{ + accelChange_t pfnAccelChange; // Called when characteristic value changes +} accelCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Acc_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Accel_AddService( uint32 services ); + +/* + * Acc_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Accel_RegisterAppCBs( accelCBs_t *appCallbacks ); + +/* + * Acc_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Acc_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Accel_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* ACCELEROMETERSERVICE_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.c new file mode 100644 index 0000000..4019078 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.c @@ -0,0 +1,632 @@ +/************************************************************************************************** + Filename: barometerservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Barometer service + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "barometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Barometer Service UUID +CONST uint8 barServUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_SERV_UUID), +}; + +// Barometer Characteristic value Data UUID +CONST uint8 barDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_DATA_UUID), +}; + +// Barometer Characteristic value Configuration UUID +CONST uint8 barCalUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_CALI_UUID), +}; + +// Barometer Characteristic value Configuration UUID +CONST uint8 barCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(BAROMETER_CONF_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static barometerCBs_t *barometer_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Barometer Profile Service attribute +static CONST gattAttrType_t barService = { TI_UUID_SIZE, barServUUID }; + +// Barometer Characteristic Properties +static uint8 barDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 barData[BAROMETER_DATA_LEN] = { 0, 0, 0, 0}; + +// Barometer Data Characteristic Configuration +static gattCharCfg_t barDataConfig[GATT_MAX_NUM_CONN]; + +// Barometer Characteristic User Description +static uint8 barDataUserDesp[] = "Barometer Data"; + +// Barometer Characteristic Configuration Properties +static uint8 barCalProps = GATT_PROP_READ; + +// Barometer Calibration Characteristic Configuration Value +static uint8 barCal[BAROMETER_CALI_LEN] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +// Barometer Calibration Characteristic Configuration +static gattCharCfg_t barCalConfig[GATT_MAX_NUM_CONN]; + +// Barometer Calibration Characteristic Configuration User Description +static uint8 barCalUserDesp[] = "Barometer Cali."; + +// Barometer Characteristic Configuration Properties +static uint8 barCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Barometer Characteristic Configuration Value +static uint8 barCfg = 0; + +// Barometer Characteristic Configuration User Description +static uint8 barCfgUserDesp[] = "Barometer Conf."; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t sensorBarometerAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&barService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, barDataUUID }, + GATT_PERMIT_READ, + 0, + barData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)barDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barDataUserDesp + }, + + // Characteristic Config Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, barCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &barCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barCfgUserDesp + }, + + + // Characteristic Calibration Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &barCalProps + }, + + // Characteristic Value "Calibration" + { + { TI_UUID_SIZE, barCalUUID }, + GATT_PERMIT_READ, + 0, + barCal + }, + + // Characteristic configuration "Calibration" + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)barCalConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + barCalUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 barometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t barometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void barometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t sensorProfileCBs = +{ + barometer_ReadAttrCB, // Read callback function pointer + barometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Barometer_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Barometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, barDataConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, barCalConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( barometer_HandleConnStatusCB ); + + if ( services & BAROMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorBarometerAttrTbl, + GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + &sensorProfileCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Barometer_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Barometer_RegisterAppCBs( barometerCBs_t *appCallbacks ) +{ + if ( barometer_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + barometer_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Barometer_SetParameter + * + * @brief Set a Barometer service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Barometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BAROMETER_DATA: + if ( len == BAROMETER_DATA_LEN ) + { + VOID osal_memcpy( barData, value, BAROMETER_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( barDataConfig, barData, FALSE, + sensorBarometerAttrTbl, GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case BAROMETER_CALI: + if ( len == BAROMETER_CALI_LEN ) + { + VOID osal_memcpy( barCal, value, BAROMETER_CALI_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( barCalConfig, barCal, FALSE, + sensorBarometerAttrTbl, GATT_NUM_ATTRS( sensorBarometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case BAROMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + barCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Barometer_GetParameter + * + * @brief Get a Barometer parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Barometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case BAROMETER_DATA: + VOID osal_memcpy( value, barData, BAROMETER_DATA_LEN ); + break; + + case BAROMETER_CALI: + VOID osal_memcpy( value, barCal, BAROMETER_CALI_LEN ); + break; + + case BAROMETER_CONF: + *((uint8*)value) = barCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn barometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 barometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + // 16-bit UUID + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case BAROMETER_DATA_UUID: + *pLen = BAROMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, BAROMETER_DATA_LEN ); + break; + + case BAROMETER_CALI_UUID: + *pLen = BAROMETER_CALI_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, BAROMETER_CALI_LEN ); + break; + + case BAROMETER_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn barometer_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t barometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint16 uuid; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case BAROMETER_DATA_UUID: + //Should not get here + break; + + case BAROMETER_CALI_UUID: + //Should not get here + break; + + case BAROMETER_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &barCfg ) + { + notifyApp = BAROMETER_CONF; + } + + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && barometer_AppCBs && barometer_AppCBs->pfnBarometerChange ) + { + barometer_AppCBs->pfnBarometerChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn barometer_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void barometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, barDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.h new file mode 100644 index 0000000..6ca159b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/barometerservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: barometerservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Barometer service definitions and prototypes + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef BAROMETERSERVICE_H +#define BAROMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define BAROMETER_DATA 10 // R uint8 - Profile Attribute value +#define BAROMETER_CALI 11 // RW uint8 - Profile Attribute value +#define BAROMETER_CONF 12 // RW uint8 - Profile Attribute value + +// Service UUID +#define BAROMETER_SERV_UUID 0xAA40 // F0000000-0451-4000-B000-00000000-AA40 +#define BAROMETER_DATA_UUID 0xAA41 +#define BAROMETER_CONF_UUID 0xAA42 +#define BAROMETER_CALI_UUID 0xAA43 + +// Sensor Profile Services bit fields +#define BAROMETER_SERVICE 0x00000010 + +// Length of sensor data in bytes +#define BAROMETER_DATA_LEN 4 +#define BAROMETER_CALI_LEN 16 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*barometerChange_t)( uint8 paramID ); + +typedef struct +{ + barometerChange_t pfnBarometerChange; // Called when characteristic value changes +} barometerCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Barometer_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Barometer_AddService( uint32 services ); + +/* + * Barometer_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Barometer_RegisterAppCBs( barometerCBs_t *appCallbacks ); + +/* + * Barometer_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Barometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Barometer_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Barometer_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* BAROMETERSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.c new file mode 100644 index 0000000..144fac4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.c @@ -0,0 +1,545 @@ +/************************************************************************************************** + Filename: gyroservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Gyroscope Service + + + Copyright 2012 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "gyroservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Gyroscope Service UUID +CONST uint8 gyroServUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_SERV_UUID), +}; + +// Gyroscope Characteristic value Data UUID +CONST uint8 gyroDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_DATA_UUID), +}; + +// Gyroscooe Characteristic value Configuration UUID +CONST uint8 gyroCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(GYROSCOPE_CONF_UUID), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static gyroCBs_t *gyro_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + + +// Gyroscope Profile Service attribute +static CONST gattAttrType_t gyroService = { TI_UUID_SIZE, gyroServUUID }; + +// Accelerometer Characteristic Properties +static uint8 gyroDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 gyroData[GYROSCOPE_DATA_LEN] = {0, 0, 0, 0, 0, 0}; + +// Gyroscope Characteristic Configuration +static gattCharCfg_t gyroDataConfig[GATT_MAX_NUM_CONN]; + +// Gyroscope Characteristic User Description +static uint8 gyroDataUserDesp[] = "Gyro. Data"; + +// Gyroscope Characteristic Configuration Properties +static uint8 gyroCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Gyroscope Characteristic Configuration Value +static uint8 gyroCfg = 0; + +// Gyroscope Characteristic Configuration User Description +static uint8 gyroCfgUserDesp[] = "Gyro. Conf."; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t sensorGyroscopeAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&gyroService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gyroDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, gyroDataUUID }, + GATT_PERMIT_READ, + 0, + gyroData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gyroDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + gyroDataUserDesp + }, + // Characteristic 2 Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &gyroCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, gyroCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &gyroCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + gyroCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gyro_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t gyro_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void gyro_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t gyroCBs = +{ + gyro_ReadAttrCB, // Read callback function pointer + gyro_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Gyro_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Gyro_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( gyro_HandleConnStatusCB ); + + if (services & GYROSCOPE_SERVICE ) + { + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorGyroscopeAttrTbl, + GATT_NUM_ATTRS( sensorGyroscopeAttrTbl ), + &gyroCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Gyro_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Gyro_RegisterAppCBs( gyroCBs_t *appCallbacks ) +{ + if ( gyro_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + gyro_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Gyro_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gyro_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GYROSCOPE_DATA: + if ( len == GYROSCOPE_DATA_LEN ) + { + VOID osal_memcpy( gyroData, value, GYROSCOPE_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gyroDataConfig, gyroData, FALSE, + sensorGyroscopeAttrTbl, GATT_NUM_ATTRS( sensorGyroscopeAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case GYROSCOPE_CONF: + if(len == sizeof ( uint8 ) ) + { + gyroCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Gyro_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gyro_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case GYROSCOPE_DATA: + VOID osal_memcpy (value, gyroData, GYROSCOPE_DATA_LEN ); + break; + + case GYROSCOPE_CONF: + *((uint8*)value) = gyroCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn gyro_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 gyro_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case GYROSCOPE_DATA_UUID: + *pLen = GYROSCOPE_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, GYROSCOPE_DATA_LEN ); + break; + + case GYROSCOPE_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn gyro_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t gyro_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case GYROSCOPE_DATA_UUID: + //Should not get here + break; + + case GYROSCOPE_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &gyroCfg ) + { + notifyApp = GYROSCOPE_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && gyro_AppCBs && gyro_AppCBs->pfnGyroChange ) + { + gyro_AppCBs->pfnGyroChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn gyro_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void gyro_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, gyroDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.h new file mode 100644 index 0000000..97f5184 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/gyroservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: gyroservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Gyroscope service definitions and prototypes + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef GYROSERVICE_H +#define GYROSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define GYROSCOPE_DATA 12 // R uint8 - Profile Attribute value +#define GYROSCOPE_CONF 13 // RW uint8 - Profile Attribute value + +// Service UUID +#define GYROSCOPE_SERV_UUID 0xAA50 // F0000000-0451-4000-B000-00000000-AA50 +#define GYROSCOPE_DATA_UUID 0xAA51 +#define GYROSCOPE_CONF_UUID 0xAA52 + +// Sensor Profile Services bit fields +#define GYROSCOPE_SERVICE 0x00000020 + +// Length of sensor data in bytes +#define GYROSCOPE_DATA_LEN 6 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*gyroChange_t)( uint8 paramID ); + +typedef struct +{ + gyroChange_t pfnGyroChange; // Called when characteristic value changes +} gyroCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Gyro_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Gyro_AddService( uint32 services ); + +/* + * Gyro_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Gyro_RegisterAppCBs( gyroCBs_t *appCallbacks ); + +/* + * Gyro_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gyro_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Gyro_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gyro_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* GYROSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.c new file mode 100644 index 0000000..a98005f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.c @@ -0,0 +1,546 @@ +/************************************************************************************************** + Filename: humidservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Humidity service. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "humidityservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static humidityCBs_t *humid_AppCBs = NULL; + +// Humidity Service UUID +CONST uint8 humidServUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_SERV_UUID), +}; + +// Humidity Characteristic value Data UUID +CONST uint8 humidDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_DATA_UUID), +}; + +// Humidity Characteristic value Configuration UUID +CONST uint8 humidCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(HUMIDITY_CONF_UUID), +}; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// Humidity Profile Service attribute +static CONST gattAttrType_t humidService = { TI_UUID_SIZE, humidServUUID }; + +// Humidity Characteristic Properties +static uint8 humidDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 humidData[HUMIDITY_DATA_LEN] = { 0, 0, 0, 0}; + +// Humidity Characteristic Configuration +static gattCharCfg_t humidDataConfig[GATT_MAX_NUM_CONN]; + +// Humidity Characteristic User Description +static uint8 humidDataUserDesp[] = "Humid. Data"; + +// Humidity Characteristic Configuration Properties +static uint8 humidCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Humidity Characteristic Configuration Value +static uint8 humidCfg = 0; + +// Humidity Characteristic Configuration User Description +static uint8 humidCfgUserDesp[] = "Humid. Conf."; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t humidAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&humidService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &humidDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, humidDataUUID }, + GATT_PERMIT_READ, + 0, + humidData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)humidDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + humidDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &humidCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, humidCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &humidCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + humidCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 humid_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t humid_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void humid_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t humidCBs = +{ + humid_ReadAttrCB, // Read callback function pointer + humid_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Humidity_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Humidity_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( humid_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, humidDataConfig ); + + if (services & HUMIDITY_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( humidAttrTbl, + GATT_NUM_ATTRS( humidAttrTbl ), + &humidCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Humidity_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Humidity_RegisterAppCBs( humidityCBs_t *appCallbacks ) +{ + if ( humid_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + humid_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + +/********************************************************************* + * @fn Humidity_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Humidity_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HUMIDITY_DATA: + if ( len == HUMIDITY_DATA_LEN ) + { + VOID osal_memcpy( humidData, value, HUMIDITY_DATA_LEN ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( humidDataConfig, humidData, FALSE, + humidAttrTbl, GATT_NUM_ATTRS( humidAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case HUMIDITY_CONF: + if ( len == sizeof ( uint8 ) ) + { + humidCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Humidity_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Humidity_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case HUMIDITY_DATA: + VOID osal_memcpy( value, humidData, HUMIDITY_DATA_LEN ); + break; + + case HUMIDITY_CONF: + *((uint8*)value) = humidCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn humid_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 humid_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case HUMIDITY_DATA_UUID: + *pLen = HUMIDITY_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, HUMIDITY_DATA_LEN ); + break; + + case HUMIDITY_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn humid_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t humid_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case HUMIDITY_DATA_UUID: + //Should not get here + break; + + case HUMIDITY_CONF_UUID: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + if( pAttr->pValue == &humidCfg ) + { + notifyApp = HUMIDITY_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && humid_AppCBs && humid_AppCBs->pfnIrTempChange ) + { + humid_AppCBs->pfnIrTempChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn humid_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void humid_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, humidDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.h new file mode 100644 index 0000000..6dc2fdb --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/humidityservice.h @@ -0,0 +1,146 @@ +/************************************************************************************************** + Filename: humidityservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: Humidity service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef HUMIDITYSERVICE_H +#define HUMIDITYSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define HUMIDITY_DATA 5 // R uint8 - Profile Attribute value +#define HUMIDITY_CONF 6 // RW uint8 - Profile Attribute value + +// Service UUID +#define HUMIDITY_SERV_UUID 0xAA20 // F0000000-0451-4000-B000-00000000-AA20 +#define HUMIDITY_DATA_UUID 0xAA21 +#define HUMIDITY_CONF_UUID 0xAA22 + +// Sensor Profile Services bit fields +#define HUMIDITY_SERVICE 0x00000004 + +// Length of sensor data in bytes +#define HUMIDITY_DATA_LEN 4 + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*humidityChange_t)( uint8 paramID ); + +typedef struct +{ + humidityChange_t pfnIrTempChange; // Called when characteristic value changes +} humidityCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Humidity_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Humidity_AddService( uint32 services ); + +/* + * Humidity_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Humidity_RegisterAppCBs( humidityCBs_t *appCallbacks ); + +/* + * Humidity_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Humidity_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Humidity_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Humidity_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* HUMIDITYSERVICE_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.c new file mode 100644 index 0000000..5ee13e9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.c @@ -0,0 +1,552 @@ +/************************************************************************************************** + Filename: irtempservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: IR Temperature service. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "irtempservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static irTempCBs_t *irTemp_AppCBs = NULL; + +// IR Temperatur Service UUID +CONST uint8 irTempServUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_SERV_UUID), +}; + +// IR Temp Characteristic value Data UUID +CONST uint8 irTempDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_DATA_UUID), +}; + +// IR Temp Characteristic value Configuration UUID +CONST uint8 irTempConfUUID[TI_UUID_SIZE] = +{ + TI_UUID(IRTEMPERATURE_CONF_UUID), +}; + + +/********************************************************************* + * Profile Attributes - variables + */ + +// IR Temperature Profile Service attribute +static CONST gattAttrType_t irTempService = { TI_UUID_SIZE, irTempServUUID }; + +// IR Temperature Characteristic Properties +static uint8 irTempDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +// IR Temperature Characteristic Value +static uint8 irTempData[IRTEMPERATURE_DATA_LEN] = { 0, 0, 0, 0}; + +// IR Temperature Characteristic Configuration +static gattCharCfg_t irTempDataConfig[GATT_MAX_NUM_CONN]; + +// IR Temperature Characteristic User Description +static uint8 irTempDataUserDesp[] = "IR Temp. Data"; + +// IR Temperature Characteristic Configuration Properties +static uint8 irTempCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// IR Temperature Characteristic Configuration Value +static uint8 irTempCfg = 0; + +// IR Temperature Characteristic Configuration User Description +static uint8 irTempCfgUserDesp[] = "IR Temp. Conf."; + + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t irTempAttrTbl[] = +{ + // Sensor Profile Services + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&irTempService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &irTempDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, irTempDataUUID }, + GATT_PERMIT_READ, + 0, + irTempData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)irTempDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + irTempDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &irTempCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, irTempConfUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &irTempCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + irTempCfgUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 irTemp_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t irTemp_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void irTemp_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +CONST gattServiceCBs_t irTempCBs = +{ + irTemp_ReadAttrCB, // Read callback function pointer + irTemp_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn IRTemp_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t IRTemp_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( irTemp_HandleConnStatusCB ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, irTempDataConfig ); + + if (services & IRTEMPERATURE_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( irTempAttrTbl, + GATT_NUM_ATTRS( irTempAttrTbl ), + &irTempCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn IRTemp_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t IRTemp_RegisterAppCBs( irTempCBs_t *appCallbacks ) +{ + if ( irTemp_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + irTemp_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); + +} + + +/********************************************************************* + * @fn IRTemp_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t IRTemp_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case IRTEMPERATURE_DATA: + if ( len == IRTEMPERATURE_DATA_LEN ) + { + VOID osal_memcpy( irTempData, value, IRTEMPERATURE_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( irTempDataConfig, irTempData, FALSE, + irTempAttrTbl, GATT_NUM_ATTRS( irTempAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case IRTEMPERATURE_CONF: + if ( len == sizeof ( uint8 ) ) + { + irTempCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn IRTemp_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t IRTemp_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case IRTEMPERATURE_DATA: + VOID osal_memcpy (value, irTempData, IRTEMPERATURE_DATA_LEN ); + break; + + case IRTEMPERATURE_CONF: + *((uint8*)value) = irTempCfg; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn irTemp_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 irTemp_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case IRTEMPERATURE_DATA_UUID: + *pLen = IRTEMPERATURE_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, IRTEMPERATURE_DATA_LEN ); + break; + + case IRTEMPERATURE_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn irTemp_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t irTemp_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case IRTEMPERATURE_DATA_UUID: + // Should not get here + break; + + case IRTEMPERATURE_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &irTempCfg ) + { + notifyApp = IRTEMPERATURE_CONF; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && irTemp_AppCBs && irTemp_AppCBs->pfnIrTempChange ) + { + irTemp_AppCBs->pfnIrTempChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn irTemp_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void irTemp_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, irTempDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.h new file mode 100644 index 0000000..84d9882 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/irtempservice.h @@ -0,0 +1,145 @@ +/************************************************************************************************** + Filename: irtempservice.h + Revised: $Date: 2012-08-15 16:57:31 -0700 (Wed, 15 Aug 2012) $ + Revision: $Revision: 31256 $ + + Description: IR temperature service definitions and prototypes + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef IRTEMPSERVICE_H +#define IRTEMPSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define IRTEMPERATURE_DATA 0 // R uint8 - Profile Attribute value +#define IRTEMPERATURE_CONF 1 // RW uint8 - Profile Attribute value + +// Service UUID +#define IRTEMPERATURE_SERV_UUID 0xAA00 // F0000000-0451-4000-B000-00000000-AA00 +#define IRTEMPERATURE_DATA_UUID 0xAA01 +#define IRTEMPERATURE_CONF_UUID 0xAA02 + +// Sensor Profile Services bit fields +#define IRTEMPERATURE_SERVICE 0x00000001 + +// Length of sensor data in bytes +#define IRTEMPERATURE_DATA_LEN 4 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*irTempChange_t)( uint8 paramID ); + +typedef struct +{ + irTempChange_t pfnIrTempChange; // Called when characteristic value changes +} irTempCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * IRTemp_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t IRTemp_AddService( uint32 services ); + +/* + * IRTemp_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t IRTemp_RegisterAppCBs( irTempCBs_t *appCallbacks ); + +/* + * IRTemp_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t IRTemp_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * IRTemp_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t IRTemp_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* IRTEMPSERVICE_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.c new file mode 100644 index 0000000..4c48d82 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.c @@ -0,0 +1,638 @@ +/************************************************************************************************** + Filename: magnetometerservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Magnetometer Service + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "linkdb.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" + +#include "magnetometerservice.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Magnetometer Service UUID +CONST uint8 magnetometerServUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_SERV_UUID), +}; + +// Magnetometer Characteristic value Data UUID +CONST uint8 magnetometerDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_DATA_UUID), +}; + +// Magnetometer Characteristic value Configuration UUID +CONST uint8 magnetometerCfgUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_CONF_UUID), +}; + +// Magnetometer Characteristic value Period UUID +CONST uint8 magnetometerPerUUID[TI_UUID_SIZE] = +{ + TI_UUID(MAGNETOMETER_PERI_UUID), +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static magnetometerCBs_t *magnetometer_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Magnetometer Profile Service attribute +static CONST gattAttrType_t magnetometerService = { TI_UUID_SIZE, magnetometerServUUID }; + +// Magnetometer Characteristic Properties +static uint8 magnetometerDataProps = GATT_PROP_READ | GATT_PROP_NOTIFY; + +static uint8 magnetometerData[MAGNETOMETER_DATA_LEN] = { 0, 0, 0, 0, 0, 0}; + +// Magnetometer Characteristic Configuration +static gattCharCfg_t magnetometerDataConfig[GATT_MAX_NUM_CONN]; + +// Magnetometer Characteristic User Description +static uint8 magnetometerDataUserDesp[] = "Mag. Data"; + +// Magnetometer Characteristic Configuration Properties +static uint8 magnetometerCfgProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Magnetometer Characteristic Configuration Value +static uint8 magnetometerCfg = 0; + +// Magnetometer Characteristic Configuration User Description +static uint8 magnetometerCfgUserDesp[] = "Mag. Conf."; + +// Magnetometer Characteristic Period Properties +static uint8 magnetometerPerProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Magnetometer Characteristic Period Value +static uint8 magnetometerPer = 0; + +// Magnetometer Characteristic Period User Description +static uint8 magnetometerPerUserDesp[] = "Mag. Period"; + + +/********************************************************************* + * Profile Attributes - Table + */ + + +static gattAttribute_t sensorMagnetometerAttrTbl[] = +{ + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&magnetometerService /* pValue */ + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerDataProps + }, + + // Characteristic Value "Data" + { + { TI_UUID_SIZE, magnetometerDataUUID }, + GATT_PERMIT_READ, + 0, + magnetometerData + }, + + // Characteristic configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)magnetometerDataConfig + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerDataUserDesp + }, + + // Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerCfgProps + }, + + // Characteristic Value "Configuration" + { + { TI_UUID_SIZE, magnetometerCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &magnetometerCfg + }, + + // Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerCfgUserDesp + }, + + // Characteristic Declaration "Period" + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &magnetometerPerProps + }, + + // Characteristic Value "Period" + { + { TI_UUID_SIZE, magnetometerPerUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &magnetometerPer + }, + + // Characteristic User Description "Period" + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + magnetometerPerUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 magnetometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t magnetometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void magnetometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Magnetometer Profile Service Callbacks +CONST gattServiceCBs_t magnetometerCBs = +{ + magnetometer_ReadAttrCB, // Read callback function pointer + magnetometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Magnetometer_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Magnetometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, magnetometerDataConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( magnetometer_HandleConnStatusCB ); + + if ( services & MAGNETOMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorMagnetometerAttrTbl, + GATT_NUM_ATTRS( sensorMagnetometerAttrTbl ), + &magnetometerCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Magnetometer_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Magnetometer_RegisterAppCBs( magnetometerCBs_t *appCallbacks ) +{ + if ( magnetometer_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + magnetometer_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} + + +/********************************************************************* + * @fn Magnetometer_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Magnetometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case MAGNETOMETER_DATA: + if ( len == MAGNETOMETER_DATA_LEN ) + { + VOID osal_memcpy( magnetometerData, value, MAGNETOMETER_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( magnetometerDataConfig, magnetometerData, FALSE, + sensorMagnetometerAttrTbl, GATT_NUM_ATTRS( sensorMagnetometerAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case MAGNETOMETER_CONF: + if ( len == sizeof ( uint8 ) ) + { + magnetometerCfg = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + case MAGNETOMETER_PERI: + if ( len == sizeof ( uint8 ) ) + { + magnetometerPer = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Magnetometer_GetParameter + * + * @brief Get a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Magnetometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case MAGNETOMETER_DATA: + VOID osal_memcpy( value, magnetometerData, MAGNETOMETER_DATA_LEN ); + break; + + case MAGNETOMETER_CONF: + *((uint8*)value) = magnetometerCfg; + break; + + case MAGNETOMETER_PERI: + *((uint8*)value) = magnetometerPer; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn magnetometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 magnetometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + *pLen = 0; + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case MAGNETOMETER_DATA_UUID: + *pLen = MAGNETOMETER_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, MAGNETOMETER_DATA_LEN ); + break; + + case MAGNETOMETER_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + case MAGNETOMETER_PERI_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn magnetometer_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* +* @return Success or Failure +*/ +static bStatus_t magnetometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case MAGNETOMETER_DATA_UUID: + //Should not get here + break; + + case MAGNETOMETER_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &magnetometerCfg ) + { + notifyApp = MAGNETOMETER_CONF; + } + } + break; + + case MAGNETOMETER_PERI_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + if (pValue[0]>=(MAGNETOMETER_PERIOD_MIN/MAGNETOMETER_TIME_UNIT)) + { + + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &magnetometerPer) + { + notifyApp = MAGNETOMETER_PERI; + } + } + else + { + status = ATT_ERR_INVALID_VALUE; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && magnetometer_AppCBs && magnetometer_AppCBs->pfnMagnetometerChange ) + { + magnetometer_AppCBs->pfnMagnetometerChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn magnetometer_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void magnetometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, magnetometerDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.h new file mode 100644 index 0000000..674db88 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/magnetometerservice.h @@ -0,0 +1,150 @@ +/************************************************************************************************** + Filename: magnetometerservice.h + Revised: $Date: 2013-03-25 07:58:08 -0700 (Mon, 25 Mar 2013) $ + Revision: $Revision: 33575 $ + + Description: Magnetometer service definitions and prototypes + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef MAGNETOMETERSERVICE_H +#define MAGNETOMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters +#define MAGNETOMETER_DATA 7 // R uint8 - Profile Attribute value +#define MAGNETOMETER_CONF 8 // RW uint8 - Profile Attribute value +#define MAGNETOMETER_PERI 9 // RW uint8 - Profile Attribute value + +// Service UUID +#define MAGNETOMETER_SERV_UUID 0xAA30 // F0000000-0451-4000-B000-00000000-AA30 +#define MAGNETOMETER_DATA_UUID 0xAA31 +#define MAGNETOMETER_CONF_UUID 0xAA32 +#define MAGNETOMETER_PERI_UUID 0xAA33 + +// Sensor Profile Services bit fields +#define MAGNETOMETER_SERVICE 0x00000008 + +// Length of sensor data in bytes +#define MAGNETOMETER_DATA_LEN 6 + +// Lower limits +#define MAGNETOMETER_PERIOD_MIN 100 +#define MAGNETOMETER_TIME_UNIT 10 // resolution 10 ms + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*magnetometerChange_t)( uint8 paramID ); + +typedef struct +{ + magnetometerChange_t pfnMagnetometerChange; // Called when characteristic value changes +} magnetometerCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Magnetometer_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Magnetometer_AddService( uint32 services ); + +/* + * Magnetometer_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Magnetometer_RegisterAppCBs( magnetometerCBs_t *appCallbacks ); + +/* + * Magnetometer_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Magnetometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Magnetometer_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Magnetometer_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* MAGNETOMETERSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.c new file mode 100644 index 0000000..036d78c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.c @@ -0,0 +1,87 @@ +/************************************************************************************************** + Filename: st_util.c + Revised: $Date: 2012-09-25 06:26:26 -0700 (Tue, 25 Sep 2012) $ + Revision: $Revision: 31617 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*------------------------------------------------------------------- + * INCLUDES + */ +#include "bcomdef.h" +#include "gatt.h" +#include "st_util.h" + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pUuid - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pUuid) +{ + bStatus_t status = SUCCESS; + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID direct + *pUuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); +#ifdef GATT_TI_UUID_128_BIT + } + else if (pAttr->type.len == ATT_UUID_SIZE) + { + // 16-bit UUID extracted bytes 12 and 13 + *pUuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]); +#endif + } else { + *pUuid = 0xFFFF; + status = FAILURE; + } + + return status; +} + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.h new file mode 100644 index 0000000..a0c3a79 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/st_util.h @@ -0,0 +1,79 @@ +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ST_UTIL_H +#define ST_UTIL_H + +/********************************************************************* + * MACROS + */ +#ifdef GATT_TI_UUID_128_BIT + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 +#define TI_UUID_SIZE ATT_UUID_SIZE +#define TI_UUID(uuid) TI_BASE_UUID_128(uuid) + +#else + +// Using 16-bit UUID +#define TI_UUID_SIZE ATT_BT_UUID_SIZE +#define TI_UUID(uuid) LO_UINT16(uuid), HI_UINT16(uuid) + +#endif + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + +#endif /* ST_UTIL_H */ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.c new file mode 100644 index 0000000..4461a61 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.c @@ -0,0 +1,537 @@ +/************************************************************************************************** + Filename: testservice.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: Test Service. + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" + +#include "testservice.h" +#include "st_util.h" + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Test GATT Profile Service UUID +CONST uint8 testServUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_SERV_UUID) +}; + +// Data Characteristic UUID +CONST uint8 testDataUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_DATA_UUID) +}; + +// Config Characteristic UUID +CONST uint8 testConfUUID[TI_UUID_SIZE] = +{ + TI_UUID(TEST_CONF_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static testCBs_t *test_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Test Profile Service attribute +static CONST gattAttrType_t testService = { TI_UUID_SIZE, testServUUID }; + +// Test Profile Data Characteristic Properties +static uint8 testDataProps = GATT_PROP_READ; + +// Test Profile Data Characteristic Value +static uint8 testData[TEST_DATA_LEN] = {0,0}; + +// Test Characteristic Configuration +static gattCharCfg_t testDataConfig[GATT_MAX_NUM_CONN]; + +// Test Profile Data Characteristic User Description +static uint8 testDataUserDesp[] = "Test Data"; + +// Test Profile Config Characteristic Properties +static uint8 testConfProps = GATT_PROP_READ | GATT_PROP_WRITE; + +// Test Profile Config Characteristic Value +static uint8 testConf = 0x00; + +// Test Profile Config Characteristic User Description +static uint8 testConfUserDesp[] = "Test Config"; + + +/********************************************************************* + * Profile Attributes - Table + */ +static gattAttribute_t testAttrTbl[] = +{ + // Test Profile Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&testService /* pValue */ + }, + + // Data Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &testDataProps + }, + + // Data Characteristic Value + { + { TI_UUID_SIZE, testDataUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + testData + }, + + // Data Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + testDataUserDesp + }, + + // Config Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &testConfProps + }, + + // Config Characteristic Value + { + { TI_UUID_SIZE, testConfUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + &testConf + }, + + // Config Characteristic User Description + { + { ATT_BT_UUID_SIZE, charUserDescUUID }, + GATT_PERMIT_READ, + 0, + testConfUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 test_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t test_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void test_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// Test Profile Service Callbacks +CONST gattServiceCBs_t testCBs = +{ + test_ReadAttrCB, // Read callback function pointer + test_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Test_AddService + * + * @brief Initializes the Test Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Test_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, testDataConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( test_HandleConnStatusCB ); + + if ( services & TEST_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( testAttrTbl, + GATT_NUM_ATTRS( testAttrTbl ), + &testCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Test_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t Test_RegisterAppCBs( testCBs_t *appCallbacks ) +{ + if ( test_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + test_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); + +} + +/********************************************************************* + * @fn TestProfile_SetParameter + * + * @brief Set a Test Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Test_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case TEST_DATA_ATTR: + if ( len == TEST_DATA_LEN ) + { + VOID osal_memcpy( testData, value, TEST_DATA_LEN ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( testDataConfig, testData, FALSE, + testAttrTbl, GATT_NUM_ATTRS( testAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + case TEST_CONF_ATTR: + if(len == sizeof ( uint8 ) ) + { + testConf = *((uint8*)value); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn TestProfile_GetParameter + * + * @brief Get a Test Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Test_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case TEST_DATA_ATTR: + VOID osal_memcpy (value, testData, TEST_DATA_LEN ); + break; + + case TEST_CONF_ATTR: + *((uint8*)value) = testConf; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn test_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 test_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case TEST_DATA_UUID: + *pLen = TEST_DATA_LEN; + VOID osal_memcpy( pValue, pAttr->pValue, TEST_DATA_LEN ); + break; + + case TEST_CONF_UUID: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn test_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t test_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + uint16 uuid; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) + { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + case TEST_CONF_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + // Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &testConf ) + { + notifyApp = TEST_CONF_ATTR; + } + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! (characteristics 2 and 4 do not have write permissions) + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && test_AppCBs && test_AppCBs->pfnTestChange ) + { + test_AppCBs->pfnTestChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn test_HandleConnStatusCB + * + * @brief Test Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void test_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, testDataConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.h new file mode 100644 index 0000000..b253a2f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/SensorProfile/testservice.h @@ -0,0 +1,147 @@ +/************************************************************************************************** + Filename: testservice.h + Revised: $Date: 2013-03-25 07:58:08 -0700 (Mon, 25 Mar 2013) $ + Revision: $Revision: 33575 $ + + Description: Test service definitions and prototypes + + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef TESTSERVICE_H +#define TESTSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Test Service Parameters +#define TEST_DATA_ATTR 0 // RW uint8 - Profile Attribute value +#define TEST_CONF_ATTR 1 // RW uint8 - Profile Attribute value + +// Service UUID +#define TEST_SERV_UUID 0xAA60 // F0000000-0451-4000-B000-00000000-AA60 +#define TEST_DATA_UUID 0xAA61 +#define TEST_CONF_UUID 0xAA62 + +// Test Profile Services bit fields +#define TEST_SERVICE 0x00000001 + +// Test Data Length +#define TEST_DATA_LEN 2 + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*testChange_t)( uint8 paramID ); + +typedef struct +{ + testChange_t pfnTestChange; // Called when characteristic value changes +} testCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Test_AddService- Initializes the Test Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Test_AddService( uint32 services ); + +/* + * Test_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Test_RegisterAppCBs( testCBs_t *appCallbacks ); + +/* + * Test_SetParameter - Set a Test Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Test_SetParameter( uint8 param, uint8 len, void *pValue ); + +/* + * Test_GetParameter - Get a Test Profile parameter. + * + * param - Profile parameter ID + * pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Test_GetParameter( uint8 param, void *pValue ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* TESTPROFILE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.c new file mode 100644 index 0000000..5d4c109 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.c @@ -0,0 +1,756 @@ +/************************************************************************************************** + Filename: thermometerService.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the Simple BLE Peripheral sample application + for use with the CC2540 Bluetooth Low Energy Protocol Stack. + + Copyright 2011 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "gapbondmgr.h" +#include "thermometerservice.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Thermometer service +CONST uint8 thermometerServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_SERV_UUID), HI_UINT16(THERMOMETER_SERV_UUID) +}; + +// Thermometer temperature characteristic +CONST uint8 thermometerTempUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_TEMP_UUID), HI_UINT16(THERMOMETER_TEMP_UUID) +}; + +// Thermometer Site +CONST uint8 thermometerTypeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_TYPE_UUID), HI_UINT16(THERMOMETER_TYPE_UUID) +}; + +// Thermometer Immediate Measurement +CONST uint8 thermometerImeasUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_IMEAS_UUID), HI_UINT16(THERMOMETER_IMEAS_UUID) +}; + +// Thermometer Measurement Interval +CONST uint8 thermometerIntervalUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_INTERVAL_UUID), HI_UINT16(THERMOMETER_INTERVAL_UUID) +}; + +// Thermometer Test Commands +CONST uint8 thermometerIRangeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(THERMOMETER_IRANGE_UUID), HI_UINT16(THERMOMETER_IRANGE_UUID) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static thermometerServiceCB_t thermometerServiceCB; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Thermometer Service attribute +static CONST gattAttrType_t thermometerService = { ATT_BT_UUID_SIZE, thermometerServUUID }; + +// Client Characteristic configuration. Each client has its own instantiation +// of the Client Characteristic Configuration. Reads of the Client Characteristic +// Configuration only shows the configuration for that client and writes only +// affect the configuration of that client. + +// Thermometer Temperature Characteristic +static uint8 thermometerTempProps = GATT_PROP_INDICATE; +static uint8 thermometerTemp = 0; +static gattCharCfg_t thermometerTempConfig[GATT_MAX_NUM_CONN]; +static uint8 thermometerTempFormat = 12; + +// Site +static uint8 thermometerTypeProps = GATT_PROP_READ; +static uint8 thermometerType = 0; + +// Intermediate Measurement +static uint8 thermometerImeasProps = GATT_PROP_NOTIFY; +static uint8 thermometerImeas=0; +static gattCharCfg_t thermometerIMeasConfig[GATT_MAX_NUM_CONN]; + +// Measurement Interval +static uint8 thermometerIntervalProps = GATT_PROP_INDICATE|GATT_PROP_READ|GATT_PROP_WRITE; +static uint8 thermometerInterval=30; //default +static gattCharCfg_t thermometerIntervalConfig[GATT_MAX_NUM_CONN]; + +// Measurement Interval Range +static thermometerIRange_t thermometerIRange = {1,60}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t thermometerAttrTbl[] = +{ + // Thermometer Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&thermometerService /* pValue */ + }, + + + // TEMPERATURE + // 1. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerTempProps + }, + + // 2. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerTempUUID }, + 0, + 0, + &thermometerTemp + }, + + // 3. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerTempConfig + }, + // 4. Presentation Format + { + { ATT_BT_UUID_SIZE, charFormatUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&thermometerTempFormat + }, + + // MEASUREMENT TYPE + + // 5. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerTypeProps + }, + + // 6. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerTypeUUID }, + GATT_PERMIT_READ, + 0, + &thermometerType + }, + + // IMMEDIATE MEASUREMENT + + // 7. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerImeasProps + }, + + // 8. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerImeasUUID }, + 0, + 0, + &thermometerImeas + }, + + // 9. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerIMeasConfig + }, + + // INTERVAL + + // 10. Characteristic Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + &thermometerIntervalProps + }, + + // 11. Characteristic Value + { + { ATT_BT_UUID_SIZE, thermometerIntervalUUID }, + GATT_PERMIT_READ | GATT_PERMIT_AUTHEN_WRITE, + 0, + &thermometerInterval + }, + // 12. Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)&thermometerIntervalConfig + }, + // 13. Interval Range + { + { ATT_BT_UUID_SIZE, thermometerIRangeUUID }, + GATT_PERMIT_READ, + 0, + (uint8 *)&thermometerIRange + }, +}; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 thermometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t thermometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void thermometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Thermometer Service Callbacks +CONST gattServiceCBs_t thermometerCBs = +{ + thermometer_ReadAttrCB, // Read callback function pointer + thermometer_WriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Thermometer_AddService + * + * @brief Initializes the Thermometer service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Thermometer_AddService( uint32 services ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerTempConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerIMeasConfig ); + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, thermometerIntervalConfig ); + + // Register with Link DB to receive link status change callback + VOID linkDB_Register( thermometer_HandleConnStatusCB ); + + if ( services & THERMOMETER_SERVICE ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( thermometerAttrTbl, + GATT_NUM_ATTRS( thermometerAttrTbl ), + &thermometerCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Thermometer_Register + * + * @brief Register a callback function with the Thermometer Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern void Thermometer_Register( thermometerServiceCB_t pfnServiceCB ) +{ + thermometerServiceCB = pfnServiceCB; +} + +/********************************************************************* + * @fn Thermometer_SetParameter + * + * @brief Set a thermomter parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Thermometer_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + + case THERMOMETER_TYPE: + thermometerType = *((uint8*)value); + break; + + case THERMOMETER_INTERVAL: + thermometerInterval = *((uint8*)value); + break; + + case THERMOMETER_TEMP_CHAR_CFG: + // Need connection handle + //thermometerTempConfig.value = *((uint8*)value); + break; + + case THERMOMETER_IMEAS_CHAR_CFG: + // Need connection handle + //thermometerIMeasConfig.value = *((uint8*)value); + break; + + case THERMOMETER_INTERVAL_CHAR_CFG: + // Need connection handle + //thermometerIntervalConfig.value = *((uint8*)value); + break; + + case THERMOMETER_IRANGE: + thermometerIRange = *((thermometerIRange_t*)value); + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Thermometer_GetParameter + * + * @brief Get a Thermometer parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Thermometer_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case THERMOMETER_TYPE: + *((uint8*)value) = thermometerType; + break; + + case THERMOMETER_INTERVAL: + *((uint8*)value) = thermometerInterval; + break; + + case THERMOMETER_IRANGE: + *((thermometerIRange_t*)value) = thermometerIRange; + break; + + case THERMOMETER_TEMP_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerTempConfig.value; + break; + + case THERMOMETER_IMEAS_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerIMeasConfig.value; + break; + + case THERMOMETER_INTERVAL_CHAR_CFG: + // Need connection handle + //*((uint16*)value) = thermometerIntervalConfig.value; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Thermometer_TempIndicate + * + * @brief Send a indication containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_TempIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerTempConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle (uses stored relative handle to lookup actual handle) + pNoti->handle = thermometerAttrTbl[pNoti->handle].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn Thermometer_IntervalIndicate + * + * @brief Send a interval change indication + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_IntervalIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerIntervalConfig ); + + // If indications enabled + if ( value & GATT_CLIENT_CFG_INDICATE ) + { + // Set the handle (uses stored relative handle to lookup actual handle) + pNoti->handle = thermometerAttrTbl[pNoti->handle].handle; + + // Send the Indication + return GATT_Indication( connHandle, pNoti, FALSE, taskId ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn Thermometer_IMeasNotify + * + * @brief Send a notification containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +bStatus_t Thermometer_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti) +{ + uint16 value = GATTServApp_ReadCharCfg( connHandle, thermometerIMeasConfig ); + + // If notifications enabled + if ( value & GATT_CLIENT_CFG_NOTIFY ) + { + // Set the handle + pNoti->handle = thermometerAttrTbl[THERMOMETER_IMEAS_VALUE_POS].handle; + + // Send the Notification + return GATT_Notification( connHandle, pNoti, FALSE ); + } + + return bleIncorrectMode; +} + +/********************************************************************* + * @fn thermometer_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 thermometer_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // If attribute permissions require authorization to read, return error + if ( gattPermitAuthorRead( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + if ( pAttr->type.len == ATT_BT_UUID_SIZE ) + { + // 16-bit UUID + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case THERMOMETER_TYPE_UUID: + *pLen = THERMOMETER_TYPE_LEN; + VOID osal_memcpy( pValue, &thermometerType, THERMOMETER_TYPE_LEN ) ; + break; + + case THERMOMETER_INTERVAL_UUID: + *pLen = THERMOMETER_INTERVAL_LEN; + VOID osal_memcpy( pValue, &thermometerInterval, THERMOMETER_INTERVAL_LEN ) ; + break; + + case THERMOMETER_IRANGE_UUID: + *pLen = THERMOMETER_IRANGE_LEN; + VOID osal_memcpy( pValue, &thermometerIRange, THERMOMETER_IRANGE_LEN ) ; + break; + + default: + *pLen = 0; + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + } + + return ( status ); +} + +/********************************************************************* + * @fn thermometer_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t thermometer_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = SUCCESS; + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + // Validate/Write Temperature measurement setting + if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_TEMP_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_TEMP_IND_DISABLED : + THERMOMETER_TEMP_IND_ENABLED ); + } + } + // Validate/Write Intermediate measurement setting + else if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_IMEAS_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + // Notify application + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_IMEAS_NOTI_DISABLED : + THERMOMETER_IMEAS_NOTI_ENABLED); + } + } + // Validate/Write Interval Client Char Config + else if ( pAttr->handle == thermometerAttrTbl[THERMOMETER_INTERVAL_CHAR_CONFIG_POS].handle ) + { + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_INDICATE ); + if ( status == SUCCESS ) + { + uint16 value = BUILD_UINT16( pValue[0], pValue[1] ); + + // Notify application + (*thermometerServiceCB)( (value == GATT_CFG_NO_OPERATION) ? + THERMOMETER_INTERVAL_IND_DISABLED : + THERMOMETER_INTERVAL_IND_ENABLED); + } + else + { + status = ATT_ERR_INVALID_HANDLE; + } + } + else + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + break; + + case THERMOMETER_INTERVAL_UUID: + // Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != THERMOMETER_INTERVAL_LEN ) + status = ATT_ERR_INVALID_VALUE_SIZE; + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //validate range + if ((*pValue >= thermometerIRange.high) | ((*pValue <= thermometerIRange.low) & (*pValue != 0))) + { + status = ATT_ERR_INVALID_VALUE; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + // *pCurValue = *pValue; + VOID osal_memcpy( pCurValue, pValue, THERMOMETER_INTERVAL_LEN ) ; + + //notify application of write + (*thermometerServiceCB)(THERMOMETER_INTERVAL_SET); + + } + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + return ( status ); +} + + +/********************************************************************* + * @fn thermometer_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void thermometer_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, thermometerTempConfig ); + GATTServApp_InitCharCfg( connHandle, thermometerIMeasConfig ); + GATTServApp_InitCharCfg( connHandle, thermometerIntervalConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.h new file mode 100644 index 0000000..a9f4a6f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/Thermometer/thermometerservice.h @@ -0,0 +1,238 @@ +/************************************************************************************************** + Filename: ThermomterService.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Thermometer service definitions and + prototypes. + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef THERMOMETERSERVICE_H +#define THERMOMETERSERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Thermometer Service Parameters +#define THERMOMETER_TEMP 0 +#define THERMOMETER_TEMP_CHAR_CFG 1 +#define THERMOMETER_TYPE 2 +#define THERMOMETER_INTERVAL 3 +#define THERMOMETER_INTERVAL_CHAR_CFG 4 +#define THERMOMETER_IMEAS_CHAR_CFG 5 +#define THERMOMETER_IRANGE 6 + + +// Position in attribute array +#define THERMOMETER_TEMP_VALUE_POS 2 +#define THERMOMETER_TEMP_CHAR_CONFIG_POS 3 +#define THERMOMETER_IMEAS_VALUE_POS 8 +#define THERMOMETER_IMEAS_CHAR_CONFIG_POS 9 +#define THERMOMETER_INTERVAL_VALUE_POS 11 +#define THERMOMETER_INTERVAL_CHAR_CONFIG_POS 12 + + // Length of bytes +#define THERMOMETER_INTERVAL_LEN 1 +#define THERMOMETER_TYPE_LEN 1 +#define THERMOMETER_IRANGE_LEN 2 + +// Thermometer Service UUIDs +#define THERMOMETER_SERV_UUID 0x1809 //thermometer service +#define THERMOMETER_TEMP_UUID 0x2A1C //temperature +#define THERMOMETER_TYPE_UUID 0x2A1D //meas site, type +#define THERMOMETER_IMEAS_UUID 0x2A1E //immediate meas +#define THERMOMETER_INTERVAL_UUID 0x2A21 //meas interval +#define THERMOMETER_IRANGE_UUID 0x2906 //valid range UUID + +// Maximum length of thermometer +// measurement characteristic +#define THERMOMETER_MEAS_MAX (ATT_MTU_SIZE -5) + +// Values for flags +#define THERMOMETER_FLAGS_CELCIUS 0x00 +#define THERMOMETER_FLAGS_FARENHEIT 0x01 +#define THERMOMETER_FLAGS_TIMESTAMP 0x02 +#define THERMOMETER_FLAGS_TYPE 0x04 + +// Values for sensor location +#define THERMOMETER_TYPE_ARMPIT 0x01 +#define THERMOMETER_TYPE_BODY 0x02 +#define THERMOMETER_TYPE_EAR 0x03 +#define THERMOMETER_TYPE_FINGER 0x04 +#define THERMOMETER_TYPE_GASTRO 0x05 +#define THERMOMETER_TYPE_MOUTH 0x06 +#define THERMOMETER_TYPE_RECTUM 0x07 +#define THERMOMETER_TYPE_TOE 0x08 +#define THERMOMETER_TYPE_TYMPNUM 0x09 + +// Thermometer Service bit fields +#define THERMOMETER_SERVICE 0x00000001 + +// Callback events +#define THERMOMETER_TEMP_IND_ENABLED 1 +#define THERMOMETER_TEMP_IND_DISABLED 2 +#define THERMOMETER_IMEAS_NOTI_ENABLED 3 +#define THERMOMETER_IMEAS_NOTI_DISABLED 4 +#define THERMOMETER_INTERVAL_IND_ENABLED 5 +#define THERMOMETER_INTERVAL_IND_DISABLED 6 +#define THERMOMETER_INTERVAL_SET 7 +#define THERMOMETER_TESTCMD_C 8 +#define THERMOMETER_TESTCMD_F 9 + +/********************************************************************* + * TYPEDEFS + */ + +// Thermometer Service callback function +typedef void (*thermometerServiceCB_t)(uint8 event); + +/** + * Thermometer Interval Range + */ +typedef struct +{ + uint8 low; + uint8 high; +} thermometerIRange_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Thermometer_AddService- Initializes the Thermometer service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t Thermometer_AddService( uint32 services ); + +/* + * Thermometer_Register - Register a callback function with the + * Thermometer Service + * + * @param pfnServiceCB - Callback function. + */ + +extern void Thermometer_Register( thermometerServiceCB_t pfnServiceCB ); + +/* + * Thermometer_SetParameter - Set a Thermometer parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Thermometer_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Thermometer_GetParameter - Get a Thermometer parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Thermometer_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Thermometer_TempIndicate + * + * @brief Send a notification containing a thermometer + * measurement. + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_TempIndicate( uint16 connHandle, attHandleValueInd_t *pNoti, uint8 taskId ); + +/********************************************************************* + * @fn Thermometer_IntervalIndicate + * + * @brief Send a interval change indication + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_IntervalIndicate( uint16 connHandle, attHandleValueInd_t *pNoti,uint8 taskId ); + +/********************************************************************* + * @fn Thermometer_IMeasNotify + * + * @brief Send a intermediate temperature notification + * + * @param connHandle - connection handle + * @param pNoti - pointer to notification structure + * + * @return Success or Failure + */ +extern bStatus_t Thermometer_IMeasNotify( uint16 connHandle, attHandleValueNoti_t *pNoti ); + + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* THERMOMETERSERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.c b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.c new file mode 100644 index 0000000..b22c72e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.c @@ -0,0 +1,436 @@ +/************************************************************************************************** + Filename: timeservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Current Time service. + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OSAL.h" +#include "hal_adc.h" +#include "linkdb.h" +#include "att.h" +#include "gatt.h" +#include "gatt_uuid.h" +#include "gattservapp.h" +#include "hid_uuid.h" +#include "hiddev.h" + +#include "timeservice.h" +#include "wimu_util.h" +#include "st_util.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Current Time service +CONST uint8 timeServUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(TIME_SERVICE_UUID), HI_UINT16(TIME_SERVICE_UUID) +}; + +// Current Time characteristic +CONST uint8 currentTimeUUID[ATT_BT_UUID_SIZE] = +{ + LO_UINT16(CURRENT_TIME_UUID), HI_UINT16(CURRENT_TIME_UUID) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static timeCBs_t *Time_AppCBs = NULL; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Time Service attribute +static CONST gattAttrType_t timeService = { ATT_BT_UUID_SIZE, timeServUUID }; + +// Current Time characteristic +static uint8 currentTimeProps = GATT_PROP_READ | GATT_PROP_NOTIFY | GATT_PROP_WRITE; +static uint8 currentTime[WIMU_GPS_CURRENT_TIME_PACKET_SIZE]; +static gattCharCfg_t currentTimeClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t timeAttrTbl[] = +{ + // Current Time Service + { + { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */ + GATT_PERMIT_READ, /* permissions */ + 0, /* handle */ + (uint8 *)&timeService /* pValue */ + }, + + // Current Time Declaration + { + { ATT_BT_UUID_SIZE, characterUUID }, + GATT_PERMIT_READ, + 0, + ¤tTimeProps + }, + + // Current Time Value + { + { ATT_BT_UUID_SIZE, currentTimeUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8*)¤tTime + }, + + // Current Time Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)currentTimeClientCharCfg + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 timeReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t timeWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +//static void battNotifyCB( linkDBItem_t *pLinkItem ); +//static uint8 battMeasure( void ); +//static void battNotifyLevel( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Current Time Service Callbacks +CONST gattServiceCBs_t timeCBs = +{ + timeReadAttrCB, // Read callback function pointer + timeWriteAttrCB, // Write callback function pointer + NULL // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Time_AddService + * + * @brief Initializes the Current Time Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t Time_AddService( void ) +{ + uint8 status = SUCCESS; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( INVALID_CONNHANDLE, currentTimeClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( timeAttrTbl, + GATT_NUM_ATTRS( timeAttrTbl ), + &timeCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn Time_Register + * + * @brief Register a callback function with the Current Time Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +bStatus_t Time_Register( timeCBs_t *appCallbacks ) +{ + if ( Time_AppCBs == NULL ) + { + if ( appCallbacks != NULL ) + { + Time_AppCBs = appCallbacks; + } + + return ( SUCCESS ); + } + + return ( bleAlreadyInRequestedMode ); +} +/********************************************************************* + * @fn Time_SetParameter + * + * @brief Set a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Time_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = SUCCESS; + + switch ( param ) + { + case CURRENT_TIME_PARAM: + if ( len == WIMU_GPS_CURRENT_TIME_PACKET_SIZE ) + { + osal_memcpy( currentTime, value, WIMU_GPS_CURRENT_TIME_PACKET_SIZE ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( currentTimeClientCharCfg, currentTime, FALSE, + timeAttrTbl, GATT_NUM_ATTRS( timeAttrTbl ), + INVALID_TASK_ID ); + } + else + { + ret = bleInvalidRange; + } + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Time_GetParameter + * + * @brief Get a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Time_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = SUCCESS; + switch ( param ) + { + case CURRENT_TIME_PARAM: + + osal_memcpy( value, currentTime, WIMU_GPS_CURRENT_TIME_PACKET_SIZE ); + //*((uint8*)value) = currentTime; + break; + + default: + ret = INVALIDPARAMETER; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn timeReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ + +static uint8 timeReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = SUCCESS; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( ATT_ERR_ATTR_NOT_LONG ); + } + + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1] ); + + if ( uuid == CURRENT_TIME_UUID ) + { + *pLen = WIMU_GPS_CURRENT_TIME_PACKET_SIZE; + VOID osal_memcpy( pValue, pAttr->pValue, WIMU_GPS_CURRENT_TIME_PACKET_SIZE ); + } + else + { + status = ATT_ERR_ATTR_NOT_FOUND; + } + + return ( status ); +} + +/********************************************************************* + * @fn timeWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t timeWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = SUCCESS; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( gattPermitAuthorWrite( pAttr->permissions ) ) + { + // Insufficient authorization + return ( ATT_ERR_INSUFFICIENT_AUTHOR ); + } + + if (utilExtractUuid16(pAttr,&uuid) == FAILURE) { + // Invalid handle + return ATT_ERR_INVALID_HANDLE; + } + + switch ( uuid ) + { + + case CURRENT_TIME_UUID: + //Validate the value + if ( offset == 0 ) + { + if ( len != WIMU_GPS_CURRENT_TIME_PACKET_SIZE ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + //*pCurValue = pValue[0]; + osal_memcpy( pCurValue, pValue, WIMU_GPS_CURRENT_TIME_PACKET_SIZE ); + + osal_set_event(/*WIMU_TaskID*/10, WIMU_TIME_EVT); + + /*if( pAttr->pValue == ¤tTime ) + {*/ + notifyApp = CURRENT_TIME_PARAM; + //} + } + break; + + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + // Should never get here! + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && Time_AppCBs && Time_AppCBs->pfnTimeChange ) + { + Time_AppCBs->pfnTimeChange( notifyApp ); + } +/* + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + */ + return ( status ); +} + +/********************************************************************* + * @fn Time_HandleConnStatusCB + * + * @brief Current Time link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Time_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, currentTimeClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.h b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.h new file mode 100644 index 0000000..1983be4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/Profiles/TimeService/timeservice.h @@ -0,0 +1,134 @@ +/************************************************************************************************** + Filename: timeservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Current Time service definitions and + prototypes according to the BLE standard + +**************************************************************************************************/ + +#ifndef TIMESERVICE_H +#define TIMESERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Service UUIDs +#define TIME_SERVICE_UUID 0x1805 // Current Time Service +#define CURRENT_TIME_UUID 0x2A2B // Current Time Characteristics + +// Parameters +#define CURRENT_TIME_PARAM 0 + +/********************************************************************* + * TYPEDEFS + */ + +// Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef NULL_OK void (*timeChange_t)( uint8 paramID ); + +typedef struct +{ + timeChange_t pfnTimeChange; // Called when characteristic value changes +} timeCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Time_AddService + * + * @brief Initializes the Current Time service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Time_AddService( void ); + +/********************************************************************* + * @fn Time_Register + * + * @brief Register a callback function with the Current Time Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Time_Register( timeCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Time_SetParameter + * + * @brief Set a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Time_GetParameter + * + * @brief Get a Current Time parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Time_HandleConnStatusCB + * + * @brief Current Time Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Time_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* TIMESERVICE_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.d51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.d51 new file mode 100644 index 0000000..f872039 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.d51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.hex b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.hex new file mode 100644 index 0000000..dbafd86 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Exe/WIMU.hex @@ -0,0 +1,6950 @@ +:020000040000FA +:0600000002010A02264A7B +:03002B00022A7432 +:03004300022A4E40 +:030053000226C0C2 +:03007300022A8DD1 +:1000830002253BE5C754F84401F5C7790122000076 +:100093000080FB120086B900030200F4E4792178A2 +:1000A30008B800028004F709D8FCE479297802B87B +:1000B30000028004F709D8FCE4900301782D790C41 +:1000C3008002F0A3D8FCD9FA900E2DAA82AB8390BC +:1000D300013A78B679048015E493A3AC82AD838AA0 +:1000E300828B83F0A3AA82AB838C828D83D8E9D9D8 +:1000F300E775822B7583B1740312011C75829175A8 +:100103008300740012011C75D00075812A751801D3 +:10011300751903759F00020096C09FF59FE473D085 +:100123009F22D083D082C09FE493C0E0740193C028 +:10013300E0740293F59F22FF0000B400002800281A +:1001430000283075A000A000A000A000000800084F +:10015300E001F0001000100010001000100010006B +:1001630050005000500010001000D00700000000A5 +:1001730000000F00010005003075070010000100AA +:1001830081FF0000FFED060B07F306FF02020208E2 +:10019300025000A0000000E80302B18F01000093A9 +:1001A3008F02B58F010000820E02E58F010000323D +:1001B3000302B58F010000830E02BD8F01000048CA +:1001C3000302B58F010000840E02BF8F0100004AB5 +:1001D3000302B58F010000850E02C18F0800004B9A +:1001E3000302B58F010000860E02C38F0100008752 +:1001F3000EFF0100FF2002B18F0100008A8F02B5BC +:100203008F010000EB0E02C58F000000000002B951 +:100213008F0300009803110D110D110D110D110D18 +:10022300110D110D110D110D110D110D110D110DDB +:10023300E10FF90FDB0FFFFF12416374696D657402 +:10024300727920494D5520446174610012416374F1 +:10025300696D65747279205175617465726E696F29 +:100263006E2044617461001A416374696D65747230 +:100273007920436F6E66696700416374696D6574C5 +:10028300727920436F6E74726F6C0002B18F01003C +:1002930000968F02B58F0100002E0F02DF8F010041 +:1002A30000FA0702B98F0300000E0802B78F01009E +:1002B300002F0F02B58F010000420F02D78F0100FC +:1002C300001A0802B98F0300002A0802B78F010041 +:1002D30000430F02B58F0100005D0F02D58F0100AF +:1002E30000360802B98F0100003C0802B78F0100F5 +:1002F300005E0F02D38F030000480802B98F03008A +:10030300004B0802B78F0100006F0F1202B18F017B +:100313000000998F02B58F010000011002A78F0121 +:100323000000570802B98F030000580802020202B6 +:100333000202020202010D000000100102B18F014E +:1003430000009C8F02B58F010000221002A38F01D1 +:100353000000640802B58F010000231002A18F0181 +:100363000000F48E02B58F0100002410029F8F015C +:1003730000006C0802B58F010000251002E78F0111 +:1003830000006E0802B58F010000261002DD8F0108 +:1003930000008B0802B58F010000271002D18F01E6 +:1003A30000008D0802B58F010000281002BB8F01E9 +:1003B3000000008F02B58F010000291002AB8F01EE +:1003C3000000AD8E02B58F0100002A1002A58F0137 +:1003D30000002B1001053F10020000605D101202A7 +:1003E30002B18F010000908F02B58F010000CE1083 +:1003F30002C98F010000CF1002B58F010000D31096 +:1004030002CB8F010000560902B98F030000670970 +:1004130002B58F010000D41002CD8F0100007309D3 +:1004230002B98F0300007A0902B58F010000D510CD +:1004330002CF8F0100008609FF000130750302011E +:1004430006000000000000000000000000000000A3 +:1004530000000000000000000000000000FFFF0695 +:1004630000800CE8031A02B18F0100008D8F02B5E2 +:100473008F0100005B1102DB8F030000070D02B93F +:100483008F030000110D0B0957494D55332D787813 +:1004930078780201060702EE7019180F180518572D +:1004A300494D55333031323334353637383941429B +:1004B3004344454600286E756C6C20706F696E74FA +:1004C300657229003F3F3F000000807F0000803FAE +:1004D300F9021550B743BA510000204100E7DB2E63 +:1004E3000000A0401000000008000000120125A435 +:1004F300A303120125BBA303120125EAA3031201DF +:100503002523A4031201254BA40312012579A40377 +:1005130012012590A403120125A7A403120125BDEE +:10052300A403120125E4A403120125F7A403120175 +:10053300250DA50312012520A50312012545A503B9 +:1005430012012506A30212012505A4021201253A70 +:10055300A4021201255BA4021201256BA40212015D +:10056300258CA40212012598A50212012565A60275 +:10057300120125D8A6021201255EA702120125A1A8 +:10058300A702120125D8A7021201255EA8021201B3 +:100593002530A9021201258EA902120125A6A9025E +:1005A30012012520AA0212012523AA0212012526DF +:1005B300AA02120125CDAA02120125E5AA021201FF +:1005C3002515AB0212012535AB0212012523AC021E +:1005D300120125D9AC0212012594F302120125BCA4 +:1005E300F302120125EAF30212012521F40212019A +:1005F3002589F402120125D2F4021201251DF50208 +:100603001201255BF50212012598F502120125C698 +:10061300F5021201256DF60212012577F602120189 +:100623002584F602120125B7F60212012579F70295 +:1006330012012585F7021201259DF702120125A754 +:10064300F70212012594AD03120125A2AD03120195 +:1006530025BAAD03120125D2AD0312012596BE01C1 +:1006630012012534BF01120125ACBF01120125C1BE +:10067300C001120125FBC001120125A4C101120111 +:100683002579C201120125DDC30112012534C401FC +:10069300120125BBC401120125A2C501120125EFD8 +:1006A300C5011201257DC601120125A1C601120152 +:1006B3002576C801120125B7C801120125D9C80141 +:1006C3001201255AC90112012544CA011201250A42 +:1006D300CB011201254ED70212012520D8021201A7 +:1006E30025C9D8021201250CD90212012599D90274 +:1006F30012012525DA0212012506DB021201253536 +:10070300DB0212012531DC0212012579DC02120120 +:10071300257BDD02120125BFDD02120125E5DD0285 +:100723001201250BAF03120125ED900312012503DE +:1007330091031201252991031201255192031201FC +:10074300255B9203120125B49303120125B494038C +:10075300120125ACE902120125E1EA021201251476 +:10076300EB021201255EEB021201251CED021201C0 +:10077300253BA0011201259EA001120125E3A10141 +:10078300120125F3A10112012516A201120125610F +:10079300A20112012506A301120125FCA3011201E6 +:1007A30025C6A4011201253EA60112012580A6013A +:1007B3001201251EA7011201256BA7011201259124 +:1007C300A7011201257FA90112012584A9011201A4 +:1007D3002565AB01120125B9AB011201251BAC0143 +:1007E30012012543AC01120125E7AC01120125A931 +:1007F300AD01120125DAAD01120125DDAD011201B2 +:100803002525AE0112012567AE01120125CEAE01E9 +:10081300120125A49D03120125B79D03120125D0C2 +:100823009D031201251B9E03120125F69E0312014F +:1008330025859F03120125D09F03120125F72A0066 +:10084300120125032B001201253C2B0012012581E7 +:100853002B00120125382C00120125BE2C00120199 +:1008630025232D001201254F2D00120125882D006F +:100873001201259C2F0012012578310012012563F6 +:1008830033001201259A3400120125FA36001201B1 +:1008930025E637001201252C3900120125393A00CB +:1008A300120125563A001201258E3A00120125A89D +:1008B3003A00120125103B00120125AA3F00120144 +:1008C300254B40001201259C4000120125C3400026 +:1008D3001201251141001201252F41001201258328 +:1008E30041001201255C4200120125E3430012017D +:1008F300256B44001201250080031201250A8003A1 +:10090300120125D58003120125F08003120125165B +:1009130081031201255A81031201259281031201D9 +:1009230025BB810312012534820312012549820369 +:100933001201255E8203120125958203120125A966 +:100943008203120125DA82031201251483031201A3 +:1009530025408303120125B7830312012500840375 +:100963001201252A84031201254F84031201250154 +:100973008D03120125CB8D03120125AE8E031201C7 +:1009830025248F03120125668F03120125939003FB +:10099300120125008002120125298002120125423D +:1009A300800212012587810212012565820212014C +:1009B3002584820212012511830212012554830228 +:1009C300120125A18402120125408502120125BFCF +:1009D30087021201255688021201252A8902120173 +:1009E300250C8A02120125788B021201250B8C0239 +:1009F300120125A9A90312012512AA0312012566D2 +:100A0300AA031201258DAA0312012577840312017B +:100A130025E484031201252F85031201252486036F +:100A23001201252087031201250A88031201258D4F +:100A3300BF02120125CFBF02120125A9C002120174 +:100A43002582C1021201257DC2021201255CC30267 +:100A5300120125C8C3021201258FC402120125FA0F +:100A6300C40212012561C5021201258CC5021201BF +:100A730025FDC50212012590C602120125F9C60201 +:100A83001201250EC70212012556C7021201256F56 +:100A9300C702120125D4C702120125D7C7021201CA +:100AA30025F67C001201251E7D001201255C7D00C8 +:100AB3001201251A7E00120125857E00120125A14F +:100AC3007E00120125C97E00120125F97E00120164 +:100AD30025087F00120125827F00120125A87F00CF +:100AE30012012598AF0112012535B1011201251B11 +:100AF300B301120125E5B3011201252CB401120142 +:100B03002573B40112012585B401120125C5B40171 +:100B1300120125F4B40112012540B5011201257813 +:100B2300B501120125A6B501120125F7B501120180 +:100B33002586B60112012574B9011201254EBB01A8 +:100B43001201258ABB01120125E4BC011201252BE8 +:100B5300BD01120125A0BD01120125EEBD01120147 +:100B6300258AB602120125A7B60212012541BC024D +:100B730012012543BD02120125BDBE021201256BE0 +:100B8300BF02120125D244001201251B45001201A8 +:100B9300254845001201257B4500120125884500A3 +:100BA300120125944500120125A645001201257B5B +:100BB3004600120125D946001201250E47001201F5 +:100BC30025AA4800120125F748001201251B4900F8 +:100BD3001201258849001201252D4A00120125E939 +:100BE3004A00120125684B001201252C4C0012010A +:100BF300253B4C00120125BC4C001201255B4D0026 +:100C03001201258D4D00120125284E001201258663 +:100C13004E00120125C04E00120125414F00120162 +:100C2300250A5000120125B350001201253A510044 +:100C3300120125925100120125F351001201251CC6 +:100C43005200120125D252001201251C5400120138 +:100C5300255F54001201257C54001201259B54008A +:100C6300120125E654001201250B5500120125340B +:100C73005500120125A35500120125E55500120167 +:100C830025E956001201258357001201254F58000C +:100C930012012568580012012532F601120125853B +:100CA300F60112012591F60112012566F7011201E1 +:100CB300258DF701120125C8F70112012534F8012A +:100CC30012012568F801120125A1F801120125B9C5 +:100CD300F80112012512F9011201252BF901120164 +:100CE3002574F90112012587F901120125A1F901E2 +:100CF300120125B7F901120125D3FA01120125E4E6 +:100D0300FB0112012531FD0112012516FE0112011D +:100D130025F4FF021201254CE90112012580E901A6 +:100D2300120125EBEC0112012535EE01120125FF1D +:100D3300EE0112012589F00112012564F10112016E +:100D4300259EF101120125C1F10112012503F201D2 +:100D53001201250CF20112012556F2011201256040 +:100D6300F2011201250CF301120125E0F301120136 +:100D73002534F40112012596F401120125E9F40149 +:100D830012012518F50112012557F5011201259AC3 +:100D93005800120125F46000120125FA60001201C7 +:100DA30025B566001201259B6A00120125BE940336 +:100DB3001201253495031201254A95031201258753 +:100DC3009503120125BF95031201253C96031201D9 +:100DD30025779603120125F296031201252E970318 +:100DE3001201253797031201254397031201255D4D +:100DF3009703120125829703120125989703120185 +:100E030025DC9703120125D2EE02120125E5EE023D +:100E1300120125FFEE0212012528EF021201256BB4 +:100E2300EF02120125AAEF02120125E8EF021201D7 +:100E3300254DF00212012562F0021201256DF00228 +:100E43001201257AF00212012591F0021201259F69 +:100E5300F002120125AAF002120125B6F0021201D6 +:100E630025C9F002120125D4F002120125F7F00280 +:100E7300120125A0F102120125B0F102120125CAC7 +:100E8300F102120125E7F10212012503F202120118 +:100E93002528F20212012532F20212012546F2023E +:100EA30012012565F202120125C6F202120125CCB8 +:100EB300F202120125D2F202120125D8F202120126 +:100EC30025E4F20212012517F302120125C2DB0108 +:100ED30012012544DC01120125EDDC011201253547 +:100EE300DE0112012543E00112012529E10112016E +:100EF300255EE10112012580E10112012529E201AC +:100F0300120125F9E30112012522E4011201259AB8 +:100F1300E401120125CCE401120125D9E4011201F7 +:100F23002524E50112012548E50112012599E70170 +:100F3300120125A3E801120125FFE8011201253F53 +:100F4300CD0112012550CE0112012534CF0112012A +:100F5300253ECF0112012560CF011201256CCF017F +:100F630012012510D1011201253DD1011201255392 +:100F7300D201120125A8D201120125F7D3011201D2 +:100F830025CCD40112012528D50112012593D501C1 +:100F9300120125C8D5011201250BD601120125D551 +:100FA300D801120125EDD8011201257ED9011201C4 +:100FB300258CD901120125D9D901120125E7D901BF +:100FC30012012553DA01120125CEDA01120125257A +:100FD300DB01120125E897021201250A980212018A +:100FE300251B9A02120125DA9C02120125049E0296 +:100FF300120125C29E02120125AE9F02120125EBAA +:10100300A10312012510A20312012586A2031201D6 +:101013002531D0021201253AD00212012543D00214 +:101023001201251BD102120125CCD202120125FC8B +:10103300D20212012527D30212012557D30212012E +:101043002582D302120125B6D302120125E2D3026F +:1010530012012525D40212012550D402120125972D +:10106300D402120125ECD4021201252ED50212015D +:101073002588D502120125B3D50212012502D60215 +:1010830012012532D6021201255DD6021201258BEB +:10109300D602120125AED60212012594AF03120126 +:1010A30025C0AF03120125EDAF03120125F7AF03EE +:1010B30012012507B0031201252AE4021201253487 +:1010C300E40212012575E402120125BEE4021201B5 +:1010D30025F8E4021201254EE5021201256FE5020F +:1010E30012012578E502120125CCE502120125F54E +:1010F300E502120125FFE5021201256DE602120148 +:1011030025FDE60212012558E70212012586E702B2 +:101113001201250EE8021201254DE8021201258273 +:10112300E80212012594E802120125B3E802120134 +:1011330025BCE8021201257EE902120125C0AB039A +:10114300120125FA9F0312012530A0031201256421 +:10115300A003120125B1A10312012511B00312014D +:101163002527B00312012531B003120125CC8803D2 +:10117300120125DF8803120125A38903120125E249 +:101183008903120125FF8903120125388A031201FD +:1011930025858A03120125B78A03120125EE8A03E6 +:1011A3001201257BB003120125B7AC03120125DA26 +:1011B300AC0312012509AD031201254BAD03120146 +:1011C300255ADE02120125A2DE021201251EE002CB +:1011D300120125DAE0021201256EE202120125CC8A +:1011E300E302120125EFA6031201251FA703120133 +:1011F3002578A703120125F2A7031201250C9803F2 +:10120300120125319803120125999803120125D55E +:10121300B003120125F46A00120125936C00120138 +:10122300253E6D00120125BE6D00120125436E009F +:101233001201256C6E00120125477200120125BEB2 +:101243007200120125D573001201250F74001201DB +:1012530025507400120125977500120125ED7500C4 +:10126300120125367600120125A5760012012511FB +:1012730077001201254277001201255A77001201E7 +:1012830025737800120125837800120125397A002D +:10129300120125507A00120125827A0012012524B9 +:1012A3007C00120125B87C00120125DEFC0212012C +:1012B300252EFD0212012511FE02120125D6FE0282 +:1012C30012012541FF0212012531B2031201257ECD +:1012D300B103120125BDB1031201251EB203120190 +:1012E3002585FF0212012595FF02120125A7FF02A2 +:1012F300120125EBFF02120125BEAA0312012543A9 +:10130300AB03120125A7AB03120125F7FF0212015C +:1013130025F07F001201253CF802120125D3F802C3 +:101323001201257FF90212012509FA02120125A5EE +:10133300FA021201258BFB021201256CFC02120139 +:101343002576FC0212012589FC02120125A3FC0269 +:10135300120125BAFC02120125C4FC02120125DB8D +:10136300FC0212012557A503120125A9A5031201A9 +:10137300251CA60312012589A6031201255BA803D8 +:1013830012012537A903120125FBC702120125C744 +:10139300C80212012508C90212012542C90212011D +:1013A30025A0C902120125F4C90212012552CA025D +:1013B300120125E8CA02120125F0CB021201257A97 +:1013C300CD0212012518CE021201257FCE02120191 +:1013D3002592CE0212012586CF02120125CFCF021C +:1013E300120125828C02120125BC8F0212012513E2 +:1013F3009002120125309002120125B090021201D1 +:10140300252C9202120125FB9202120125689602F5 +:10141300120125529702120125C7B1031201254576 +:101423009B031201257F9B03120125E19B031201FC +:1014330025089C03120125879C0312012544AD0254 +:10144300120125C7AD0212012521AE021201259D0D +:10145300AE0212012512AF021201259AB002120147 +:101463002581B10212012593B1021201253DB50276 +:1014730012012572B502120125FAB502120125D314 +:10148300FF011201256BAE0312012595AE03120174 +:101493002500B203120125EC8F011201250A9501E3 +:1014A300E066701008A3E066700A08A3E0667004A3 +:1014B30008A3E06622C008C3E096F50808A3E096F7 +:1014C300420808A3E096420808A3E0964208A2D285 +:1014D30065D033E5087001D3D00822C3E796080925 +:1014E300E7960809E7960809E79622C3E09608A35A +:1014F300E09608A3E09608A3E09622C008C3E0960E +:10150300F50808A3E096420808A3E096420808A35A +:10151300E09645087001D3D00822080808E630E7B2 +:1015230011121DD9121535080808C64480C61818AB +:101533001822181818E9799EC608CAC608CBC60827 +:10154300CCC6C370207996CACBCC7019798ECBCC1C +:1015530070137986CC700EF9802ACA33CACB33CB89 +:10156300CC33CC331930E7F2CCCBCA3350147004EC +:10157300EA30E00DE4CA3ACACB3BCBCC3CCC5002B8 +:1015830009C3E913C6CC182313C6CB18C6CA18C699 +:10159300F9221215D520F01430E72B74FFFCFBFA67 +:1015A300747F8022E4FCFBFA7480801AB48008BC48 +:1015B30000F2BB00EF800F50EBF9E4C39AFAE49B0F +:1015C300FBE49CFCE499C6CC18C6CB18C6CA18C663 +:1015D300F922E4C9C608CAC608CBC6D3330308CC6C +:1015E300C63392F0C3947F402E94184019C9B907AB +:1015F30004CACBCC225025C309CA33CACB33CBCCC4 +:1016030033CC33D9F422F4600DC9CCC313CB13CB41 +:10161300CA13CAD9F6CC22E4FCFBFA2214FCFBFA67 +:1016230022E6C33318461846184622E7C333194740 +:101633001947194722181818E6084608700AE608D9 +:10164300C3337005E633F4220822191919E7094751 +:1016530009700AE709C3337005E733F4220922E668 +:10166300084608C3134608336002E633F422E70949 +:101673004709C3134709336002E733F422121662A2 +:1016830060251216716020121624700302162E08AC +:101693000808E76670101819E766700A1819E766F4 +:1016A30070041819E76622F422121662601C1216DF +:1016B300716017121624700712162E7001D322C000 +:1016C300D012162E7006D0D0B322C32233D0D050FE +:1016D3001430E0F6C3E7960809E7960809E7960889 +:1016E30009E796B32220E0D5E6970809E6970809AB +:1016F300E6970809E697B322121662601B12167169 +:101703006016121624700712162E600CB322C0D076 +:1017130012162E7005D0D022C32233D0D0501330EE +:10172300E0EBC3E7960809E7960809E7960809E797 +:10173300962220E0E4E6970809E6970809E6970869 +:1017430009E6972200121662604F1216716012E7C3 +:10175300548066F6121638701112162E703B090962 +:1017630009F4F618F618F618F62212164D7015122B +:10177300162408080860EAE6447FF618768018E421 +:10178300F618F622121624601612162E7012E4F6BC +:1017930008F608F608E65480F6090909181818220D +:1017A300EAC0E0EBC0E0ECC0E0EDC0E0E687F0A407 +:1017B300FBACF008E687F0A42CFCE435F0FA18093A +:1017C300E687F0A42C4B60027401CA35F0FCE433C5 +:1017D300FB09E687F0D2F7A42CCB35F0FC1908E619 +:1017E30087F0A42BCC35F0FBE433FD0819E687F032 +:1017F300D2E7A42C4ACB35F0CD3400FC09E687F0C0 +:10180300D2E7A42DCC35F0FDE433FA0918E687F0CE +:10181300D2F7A42CCD35F0CA3400FC08E687F0D209 +:10182300E7D2F7A42ACC35F07A7E20E70B0ACB3334 +:10183300CBCD33CDCC33CC33CB3350147004ED301C +:10184300E00ED2F1E4CD3DCDCC3CCC3B5005DA05E6 +:10185300C2F1EB547FC63308E63392F0FBE733095A +:10186300E733C39A502D2B70190C0D4C4D7015187E +:1018730006E608C333700D20F10AA2F013F6E4184C +:10188300800B4024E4F630F002768018F618F61840 +:10189300F68024D33B14501074FFA2F013F618768D +:1018A30080E418F618F6800FA2F013F618E6330357 +:1018B300F618ECF618EDF6D0E0FDD0E0FCD0E0FB36 +:1018C300D0E0FA221216716046121662603DE96892 +:1018D3007008F618F618F618F622748067F71218CF +:1018E300FB090909748067F722121662601D12163C +:1018F300717005191919801A121638701F12164DB6 +:10190300C37003E66733191919400718181822081A +:10191300080874FFF618F618F618F62212164D602A +:101923001712162E702192F01216247019501720D8 +:10193300F014080808090909E7F61819E7F6181951 +:10194300E7F61819E7F62212162460E6E869701F15 +:101953000808E62480F608E436F618547FB47F0CB2 +:10196300E654806007F6E418F618F622181822E900 +:10197300C6CC08C6CD08C6CE08C6CFC0E0E8C0E0D6 +:10198300EAC0E0EBC0E009E9F809E7FA09E7FBE69A +:10199300F918E6F8C3EC98ED99EE9AEBC2E7F5F087 +:1019A300EFC2E795F0500E600CEBCFFBEACEFAE9FD +:1019B300CDF9E8CCF8EAA2E7D2E7FAEB33FB13F56B +:1019C300F0EEA2E7D2E7FEEF33FFC5F013A2E73054 +:1019D300E601B313C5F0C3C0E0C0F07F00C39BFBB7 +:1019E300605B9418600C401AD0E023F9D0E0F80251 +:1019F3001ACA8AF0E9486003D2F0E4AFF0FAF9F8C2 +:101A0300803BEB30E40D89F0EA6003D2F0E4AFF001 +:101A1300F9CAF8EB30E30D88F0EF6002D2F0AFF0D3 +:101A2300E4CAC9F8EB54076014FBC3EA13FAE913D9 +:101A3300F9E813F8EF135002D2E0FFDBEDD0E0C07A +:101A4300E030E739C3E49FFFF5F0EC98FC42F0ED9A +:101A530099FD42F0EE9AFE42F0D0E0F9D0E0F8E5CD +:101A6300F0607AE923F9EE20E742D8028067C3EFFA +:101A730033FFEC33FCED33FDEE33FE80EAEC28FC60 +:101A8300ED39FDEE3AFED0E023F9D0E0F8400280D4 +:101A93001BC3EE13FEED13FDEC13FCEF135002D248 +:101AA300E0FF08B800067F7F74FF802EEF335017E6 +:101AB3008CF020F00260100CBC000C0DBD00080E71 +:101AC300BE000408E860DFE933E813FFEE2313FEEA +:101AD3004F4D4C8008E95480FFE4FEFDFCEE33EFEC +:101AE30033F47004FCFD7E80D0E0FBD0E0FAD0E05C +:101AF300F8D0E0CFC618CEC618CDC618CCC6F9228A +:101B0300121662700418181822121671700D74FFE1 +:101B1300F61819F61819F61819F622E7548066F61E +:101B2300121624700F12162E70F014F608F608F62B +:101B330008F680D112162E700CF608F60876800887 +:101B4300E6447F80EC121650700C12163B60BFE621 +:101B53005480F6E480BB12163B700519191980A551 +:101B6300E869700C763F18768018F618F6E8F922C3 +:101B7300E6CDC0E018ECC0E0E633CD33CDD313F6A9 +:101B8300E719FCE7191933CC33C3947F400ECD9D7D +:101B9300502408E65480F6E418F6800FF4043D144C +:101BA300501408E6447FF6187680E418F618F6D049 +:101BB300E0FCD0E0FD22CCD313CCFD18E4C6CBC0AF +:101BC300E018E4C6CAC0E00808ED08C633E613F619 +:101BD30018E433C675F003C3CA97CA09CB97CB1968 +:101BE3009C40047D08802EBD0003021CAC16B6FF8A +:101BF300050606081618C3CA33CACB33CB33CA2724 +:101C0300CA09CB37CB193CC37D08803E187D082019 +:101C1300E75CC633C6CA33CACB33CB33DDF1D5F069 +:101C2300EB30E77BCA97CA09CB974ACB199C406F25 +:101C33004B7025E620E0218066187D08C3CA97CA49 +:101C430009CB97CB199CD3C633C6CA33CACB33CB84 +:101C53003350C9DDE7D5F0E1D3E4C636C608C6364E +:101C6300C608C636C608C636C61818188031C3CA91 +:101C730097CA09CB97CB199CB34097C633C6CA33CF +:101C8300CACB33CB33DD34D5F02EC6A2E0C640C871 +:101C9300CA27CA09CB37194A70BECB3CB480B908EE +:101CA30008E63308E633601F181818D0E0FAD0E0CE +:101CB300FBD0E0FCD0E0FD22187D08CA27CA09CB7F +:101CC30037CB193CD3808013F618E4B67F11F6188E +:101CD300B6FF0EF618C60470D20808768080CAF6DE +:101CE30018F618F680C5080808EAC0E0EBC0E086DD +:101CF300F0E7A4FA180986F0E7A42AFA180986F08F +:101D0300E7A42AFA180986F0E7A42AFA1986F0E765 +:101D1300A4FBE5F02AFA190886F0E7A42BFBE5F00B +:101D23003AFA190886F0E7A42BFBE5F03AFA1818FB +:101D33000986F0E7A4C5F02BFBE43AFA1908E7C5D6 +:101D4300F0C6A426F6E5F03BFBE43AFA1886F0E782 +:101D5300A4F6E5F00826F6E43B08F6E43A08F6D0E4 +:101D6300E0FBD0E0FA22E4CFC0E0E4CEC0E0E4CD73 +:101D7300C0E0E4CCC0E075F020C3E633F608E633F8 +:101D8300F608E633F608E633F6181818EC33FCEDDC +:101D930033FDEE33FEEF33FFC3EC9709ED9709EE06 +:101DA3009709EF97191919400FFFEC97FC09ED9765 +:101DB300FD09EE97FE191906D5F0BEECF709EDF70C +:101DC30009EEF709EFF7191919D0E0FCD0E0FDD0BF +:101DD300E0FED0E0FF22181818E4C396F608E49654 +:101DE300F608E496F608E496F6226016080808C694 +:101DF300C313C618C613C618C613C618C613C6D54A +:101E0300E0EA227009080808226016181818C6C3E9 +:101E130033C608C633C608C633C608C633C6D5E0BC +:101E2300EA22E627F60809E637F60809E637F60850 +:101E330009E637F622E026F608A3E036F608A3E023 +:101E430036F608A3E036F622E026F008A3E036F0E3 +:101E530008A3E036F008A3E036F022C3E697F608BD +:101E630009E697F60809E697F60809E697F622C306 +:101E7300E096F008A3E096F008A3E096F008A3E04C +:101E830096F022E056F608A3E056F608A3E056F6CD +:101E930008A3E056F622E056F008A3E056F008A3A4 +:101EA300E056F008A3E056F022E0F608A3E0F608B7 +:101EB300A3E0F608A3E0F622E6F008A3E6F008A301 +:101EC300E6F008A3E6F022E0FAA3E0FBA3E0FCA31C +:101ED300E0FD22EAF0A3EBF0A3ECF0A3EDF022CABD +:101EE300C0E0E6F0A308DAFAD0E0FA22CAC0E0E0E4 +:101EF300A3C582CCC582C583CDC583F0A3C582CCDF +:101F0300C582C583CDC583DAE6D0E0CA22C3E4988F +:101F1300F8E499F9121F518026C3E49AFAE49BFB73 +:101F2300E920E7E9121F51E498F8E499F922C3E4A0 +:101F330098F8E499F9121F51E498F8E499F9C3E485 +:101F43009AFAE49BFB22EB20E7CFE920E7E0B90014 +:101F530010BB0008E88AF084F8AAF022E4FBC8FA70 +:101F630022EB70227B10C833C8C933C9335007C36F +:101F73009AC3DBF280069A50012ADBEAC833F4C81D +:101F8300C933F4C9FA2275F008E4C833C8C933C9A0 +:101F930033C99AC99B5004C92AC93BD5F0ECFBC885 +:101FA30033F4C8E4C9FA22600D08C6A2E713C618C1 +:101FB300C613C6D5E0F322600C08C6C313C618C601 +:101FC30013C6D5E0F422700422600D18C6C333C6CD +:101FD30008C633C6D5E0F41822251810AF08F51843 +:101FE300400215198008F51840021519D2AF22C016 +:101FF300D0251810AF08F518500205198008F518F8 +:1020030050020519D2AFD0D0222518F58210AF089F +:10201300F518400215198008F51840021519D2AFBA +:1020230085198322C5822518C582C583351910AF4A +:1020330007F5198582188007F519858218D2AFC56F +:1020430083222518F582E43519F58322E4732518D4 +:10205300C582C0E0E51934FFC583C0E0E518C39528 +:102063008224F810AF088583198582188008858338 +:1020730019858218D2AFCEF0A3E520F0A37808E645 +:1020830008F0A3DEFAEFF0A3E58124FAF8E608F0FE +:10209300A3E608F0A3E608F0A30808E608F0A3E621 +:1020A30008F0A315811581D0E0FED0E0F815811565 +:1020B300811581E8C0E0EEC0E0222518C582C0E0AA +:1020C300E51934FFC583C0E0E518C3958224F910F0 +:1020D300AF0885831985821880088583198582183E +:1020E300D2AFCEF0A3E520F0A37808E608F0A3DE94 +:1020F300FAEFF0A3E58124FBF8E608F0A3E608F085 +:10210300A30808E608F0A3E608F0A315811581D01B +:10211300E0FED0E0F815811581E8C0E0EEC0E022D2 +:10212300851983851882E0A3FEE0A3F5207808E0F3 +:10213300A3F608DFFAE0A3FFE0A3C0E0E0A3C0E05A +:10214300E0A3C0E0E0A3C0E0E0A3C0E010AF0885D7 +:1021530082188583198008858218858319D2AFD0A8 +:1021630083D082020122851983851882E0A3FEE0D1 +:10217300A3F5207808E0A3F608DFFAE0A3FFE0A3C5 +:10218300C0E0E0A3C0E0E0A3C0E0E0A3C0E010AF84 +:10219300088582188583198008858218858319D25A +:1021A300AFD083D08222C0D02518C582C0E0E51904 +:1021B30034FFC583C0E0E518C3958224F310AF084C +:1021C3008583198582188008858319858218D2AF83 +:1021D300C8F0A3E9F0A3EAF0A3EBF0A37908E709B9 +:1021E300F0A3D8FAECF0A3EDF0A3EEF0A3EFF0A385 +:1021F300D0E0F0A3D0E0F0A3D0E0F0A3E520F0A37B +:10220300E5F0F0A322851983851882E0C0E0A3E0FE +:10221300F9A3E0FAA3E0FBA37808E0F608A3DFFA4A +:10222300E0FCA3E0FDA3E0FEA3E0FFA3E0C0E0A386 +:10223300E0C0E0A3E0F5D0A3E0F520A3E0A3F5F030 +:1022430010AF0885831985821880088583198582D4 +:1022530018D2AFD082D083D0E0F8D0E032740480BB +:1022630006740280027401C0E0F40412200CD0E072 +:10227300121EE2227404800474028000CCC0E0EDDC +:10228300C0E0E518C39CCCAD1950011D10AF068CFE +:10229300188D1980068C188D19D2AF121EEFD0E05D +:1022A300FDD0E0FC22D083D082E9C0E0E493A3C355 +:1022B30086F0C5F095F0F908E493A386F0C5F09590 +:1022C300F0700BE493A3C3994005E9048002A3E4EF +:1022D30075F002A42582F582E5F03583F583D0E01D +:1022E300F9E493A3C0E0E493C0E022D083D082EC6E +:1022F300C0E0EDC0E0E493A3FCE493A3FDED4C60E8 +:102303000D12233AEC24FFFCED34FFFD80EFE49340 +:10231300A3FCE493A3FDED4C600D122379EC24FFA1 +:10232300FCED34FFFD80EFD0E0FDD0E0FCE493A3AF +:10233300C0E0E493C0E022C0E0C3E49396087401D4 +:10234300939618400FE49366700808740193661817 +:1023530070007019A3A3C3E49396087401939618AD +:10236300A3A3400DD0E0D0E0D0E002232AA3A3A38F +:10237300A3A3A3D0E022C0E0C0F088F0E49366708A +:10238300080874019366187000A8F0A3A3700BD01B +:10239300F0D0E0D0E0D0E002232AA3A3D0F0D0E035 +:1023A30022FFFFFFFFFFFFFFFF74F51220BDEAFED0 +:1023B300EBFFEE2434F8EF3400F988088909EE24A2 +:1023C300351224E4F8EE24371224E4F50AEC850AE6 +:1023D300F0A4FCAAF0850AF0EDA42AFDE82CF8E4A9 +:1023E3003DF97A257B00121F51EA8508828509830E +:1023F300F05407F87401B800028004C333D8FCC05A +:10240300E0E0131313541FF8EE28F8EF3400F9E853 +:10241300245DF582E93400F583D0E0F8E0586008E4 +:10242300850882850983801DEE24361224E4F5F0A5 +:10243300EA84A8F0EE28F8EF3400F9E82438F582AE +:10244300E93400F583E0F97F0402216974F5122071 +:10245300BDEAFEEBFFEE24341224E4C0E0EE2435A3 +:10246300F582EF3400F583D0E0F08E828F83A3A34F +:10247300A3A3A3E0FAA3E0FB8E828F83A3A3A3A36A +:10248300A3A3A3E0FCA3E0FDECC39AF50AED9BF53F +:102493000BEE2480F508EF3400F509850882F583F7 +:1024A300E06401702BEE2481F582EF3400F5831292 +:1024B300227B1224ED7402121FF2E960137C7D7DEE +:1024C30005EEFAEFFB120C3F850882850983E4F0E1 +:1024D300AC0AAD0BEEFAEFFB1223AC122A40022436 +:1024E3004AF582EF3400F583E022C082C083851869 +:1024F30082851983E0F8A3E0F9C3EA9CEB9D5012AF +:10250300C3EC98ED994019C3EA98EB9950127901FD +:102513008010C3EA98EB9940F5C3EC98ED9950EE1F +:102523007900D083D08222EAC39CFAEB9DFB220080 +:10253300008521878522C622C0E074EF1221A97588 +:102543009B00906182E0A2E640030225FCE591A294 +:10255300E640030225FC7591BF900442E0640570D8 +:1025630008120DDD120DE98003120DE3752100122F +:102573000E4FE9900443F07900120E43120BA97A2F +:10258300017B00900441E0F9121113907803E06499 +:102593004260030226459005DFE014F06003022643 +:1025A30045C2AF1225A900782AD0E0F618D0E0F68C +:1025B300E59F5407F97005908F828003908F2678EA +:1025C30008121EACE9C4C0E07829E65508F50808EE +:1025D300E65509F509740B7808121FBAD0E02508EF +:1025E300F8906270E0A2E740F8E8C333906272F0BB +:1025F300906270E0D2E0F08049E0A2E55024E591DA +:10260300A2E5501E7591DF900442E0640D701390B3 +:102613000464E004F064287002E4F07A00E0F91244 +:102623000EC1906181E0A2E35009E5E9A2E3500302 +:1026330075E9F7A3E0A2E75009E591A2E750037516 +:10264300917F7F04022208C0E0C0D0C082C0839083 +:102653006183E0A2E05009E5BFA2E0500375BFFE2D +:10266300E0A2E15009E5BFA2E1500375BFFDE0A27E +:10267300E25009E5BFA2E2500375BFFBE0A2E350BD +:1026830009E5BFA2E3500375BFF7E0A2E45009E5F3 +:10269300BFA2E4500375BFEFE0A2E55009E5BFA276 +:1026A300E5500375BFDFE0A2E65009E5BFA2E6509F +:1026B3000375BFBFD083D082D0D0D0E032C0E074E6 +:1026C300F21221A9E5A7A2E4500FE5A1A2E4500963 +:1026D30053A7EF75A1EF122714E5A7A2E5500CE568 +:1026E300A1A2E5500653A7DF75A1DFE5A7A2E1503C +:1026F30009E5A1A2E1500375A1FDE5A7A2E2500CF3 +:10270300E5A1A2E2500653A7FB75A1FB7F010222BC +:102713000874F81220BD752101900442E06406702C +:10272300077A007B00120DC5A2AFE433FED2AF904F +:102733000448E0640170187A207B00900441E0F9BA +:102743001211917A207B00900441E0F91211199043 +:102753006182E0D2E6F09005DEE0602185C622804A +:1027630016900447E064017008E5C654F84405F583 +:10277300C653BEFC1225347401652160E4EEA2E069 +:1027830092AF7F0102216900008E238F2485822866 +:10279300858327851882851983E0CEA3E0CF85281A +:1027A30082852783EBC9EAC8EDCBECCA75F010C369 +:1027B300E833C8E933C9EA33CAEB33CBC3EA9EF53E +:1027C30026EB9FF525B35004AB25AA26EC33CCEDBD +:1027D30033CDD5F0DAAE23AF242274F11220BD8AB3 +:1027E300088B098C0A8D0B740F122045780C121E6E +:1027F300AC908F367808121E86908F36780C121E96 +:10280300867808790C1214DE50157808790C121E9C +:102813005E908F2278081214FE4015790180137898 +:102823000C7908121E5E908F22780C1214FE40EB76 +:1028330079007F0802216974ED1220BD8A088B0993 +:102843008C0A8D0B7413122045780C121EAC908FDA +:10285300367808121E86908F36780C121E86780CF6 +:1028630079081214DE40117808790C121E5EAA084A +:10287300AB09AC0AAD0B80227510007511007512FF +:10288300007513017810790C121E5E781079081206 +:102893001E25AA10AB11AC12AD137F0C0221699057 +:1028A3008F367808121EAC8A828B837808121E99A1 +:1028B3007F0402216974F51220BD8C828D83780810 +:1028C300121EAC8A828B837808121E7212290CC3E3 +:1028D300E098F0A3E0991228FE401E908F627808DA +:1028E300121EAC8A828B837808121E4B8E828F83D2 +:1028F300E02420F0A3E0344EF080A4F08E828F8396 +:10290300C3E09420A3E0944E22EA2404F8EB3400BD +:10291300F9E8FEE9FF8C828D83A3A3A3A3E0F8A3C8 +:10292300E0F98E828F832274F51220BDE9FE9005B3 +:1029330094E0FAA3E0FBEEC333F8E433F9749D2883 +:10294300F582748E39F583E02AF508A3E03BF50997 +:102953007808122264908F6A121ECA12278C74029E +:10296300121FF28A088B098C0A8D0B7410780812D7 +:102973001DEDAA08AB097F0402216974F11220BD81 +:102983008A0C8B0D8C0E8D0F740F122045E0FAA369 +:10299300E0FB7411122045E0F508A3E0F509741378 +:1029A300122045E0FEA3E0FF7808122264EA240126 +:1029B300F508EB3400F509E4F50AF50B780C790812 +:1029C300121CE9908F2E7808121EAC780C7908122D +:1029D3001CE9AA0CAB0DAC0EAD0F12278C740212BE +:1029E3001FF28B09EA450960047A0180027A00EC40 +:1029F3002AFCED3400FDECF8EDF97A717B02121F2D +:102A03005188088909E4F50AF50B8E828F837808CB +:102A1300121EBBECF8EDF97A717B02121F518A0882 +:102A23008B0974057808121FC98E828F83A3A3A311 +:102A3300A3E508F0A3E509F07F08022169C082C07D +:102A430083E9906000F0D083D08222C0E074F21258 +:102A530021A9A2AFE433FED2AFC2C0E5D1A2E450B4 +:102A63000653D1EF12135FEEA2E092AF7F01022271 +:102A730008C0E0C0D0E8C0E0E5A8D2AFC2C7A2E773 +:102A830092AFD0E0F8D0D0D0E032C0E0C0D0E8C000 +:102A9300E0E9C0E0C008C009C082C083A2AFE4334C +:102AA300F9D2AF900C4FE0F8A3E0687008539AF79F +:102AB300A374018026C2EA900C4FE0F50874012547 +:102AC30008F0741D2508F582740C3400F583E0F5D5 +:102AD300F9900C4FE0C394324002E4F0E9A2E09293 +:102AE300AFD083D082D009D008D0E0F9D0E0F8D0BD +:102AF300D0D0E032C082C083E9900EEAF0022D7B91 +:102B030074F7122051E9900360F07C987D037AFFFB +:102B13007BFF1208CD90036174FFF0A3F0A3E4F0F0 +:102B2300A3F07905120855900360E0F912077D7A46 +:102B3300EB7B08120AA7023A8974F41220518A081F +:102B43008B09EB54806030900360E0F91210FB8A2C +:102B53000A8B0BAE0AAF0BEE4F60138E828F83E0AE +:102B630064B0700312086DEEFAEFFB1210E9AA08C5 +:102B7300E5096480FB80047A007B00022D4A74F22D +:102B830012205174FC121FDCEAFEEBFF74121220B8 +:102B930045123F70EE4F7003022C2474021220453D +:102BA300EEF0A3EF122F85ECF0A3ED122F85AA828E +:102BB300AB83120777E9F50A706AE5084509606493 +:102BC3008E828F83123F56EE4F60567A067B001239 +:102BD300114F8A0C8B0DA80CA90DE8497005750AD5 +:102BE30013804188828983E4122C31EEF0A3EF1223 +:102BF3003F81E508F0A3E509F0900366122CB89035 +:102C030003667005123A33801B123A218003EAFCF3 +:102C1300EBFD8C828D83122CB870F38C828D8380B4 +:102C2300E3750A02A90A7404121FF2024170F0A3A9 +:102C3300123F27A32274F2122051890AE975F01773 +:102C4300A4FEAFF0900365E4F0900363122CB86028 +:102C53000A121155900363E4F0A3F0EEFAEFFB12AE +:102C6300114F8A088B09EA4509602FEEFCEFFD79C5 +:102C7300001210D7900363E508F0A3E509F07B0089 +:102C83008008122CA2E4F0A3F00BEBC3950A40F2E8 +:102C9300E50A900365F0790080027913024170EB35 +:102CA30075F017A4F8A9F0900363E028FAA3E039BC +:102CB3008A82F583221236C5EA4B2274F41220511C +:102CC300740C122045123F4BFEE9FF75080075098D +:102CD30000800CE5082401F508E5093400F509C373 +:102CE300E5089CE5099D503285080A85090B7403A4 +:102CF300780A121FC9EA250AF8EB350BF98882898D +:102D030083A3A3A3A3A3A3123B08EE650A7003EF57 +:102D1300650B70BFE8FAE9FB80047A007B0080272B +:102D230074F41220517900EAA2E0501B7508DC7597 +:102D3300098E78081222647C047D007AEC7B0E12E3 +:102D4300084F7402121FF27F04022123C082C08342 +:102D5300900366122D82601C88828983A3A3E06A94 +:102D63007003A3E06B8882898370E8A3A3A3A312F3 +:102D730036C180047A007B00D083D0820201221204 +:102D83004256E8492274EE12205174FC121FDCEA09 +:102D9300FEEBFF851882851983E4F0A3F0EE24028D +:102DA300123A13EE2405123F2EEE2404F50EEF1211 +:102DB300333AE024FE603924FC604624FE6052244A +:102DC300FE605E24FE7003022E9B24FE7003022E1F +:102DD300FF24FE7003022F0E24FE7003022F1D2416 +:102DE300FC7003022F2C24FE7003022F3B022F786A +:102DF30090037F7417F0A3E4122F8D1204F5022FB2 +:102E030078851882851983AC82AD83120873022FEB +:102E130048851882851983AC82AD83120879022F05 +:102E230048850C08850D097402122045AC82AD83D8 +:102E33008508828509831236C112079B8A0C8B0D84 +:102E4300AC0CAD0DEC4D603BE4F50CF50D780C12BC +:102E53002264750C7F750D03780C122264750C8047 +:102E6300750D03780C122264740812204512227B1C +:102E73001243D2121FF2E9F50C700B1236B712058A +:102E83000D800F750C01850882850983122F7B1233 +:102E93003A33850C08022F4B7402122045AC82ADE5 +:102EA30083850C82850D8312348C603C850C82856E +:102EB3000D83A3A312227B75107F75110378101263 +:102EC300226475108075110378101222647408123D +:102ED300204512227B1243D2121FF2E9F509700B2F +:102EE3001236B7120513800F750901850C82850D03 +:102EF30083122F7B123A33850908804C851882850B +:102F03001983AC82AD8312087F803A8518828519B4 +:102F130083AC82AD83120885802B85188285198343 +:102F2300AC82AD8312088B801C851882851983AC13 +:102F330082AD83120891800D851882851983AC8236 +:102F4300AD83120897E9F508E50860298E828F831F +:102F5300A3E06414601F850E82850F83E090037FD6 +:102F6300122F85124252900380123A33E508A312BE +:102F73002F8D1204EF0239221242568518828519C9 +:102F83008322F085188285198322F07C7F7D038557 +:102F93000A82850B831236C52274EE12205174FC0B +:102FA300121FDC8A0A8B0B8C0E8D0FEA2405F508A1 +:102FB300EB3400F5097C157D0079007A7F7B0312E1 +:102FC30010D7E5082402F50CE509123F3185188274 +:102FD30085198385821085831178101222648508F0 +:102FE30082850983A3A3A3A3123483122264E50871 +:102FF3002405F510E5093400F511781012226485D3 +:103003000C82850D831237D81207957406121FF2AE +:103013008A108B11AE10AF11E50A2402F50AE50BF5 +:10302300123A16EE4F700302315A801774021220BF +:10303300451236C188828983EAF0A3EBF090037FBF +:10304300E004F090037FE0C39405400302315AE4A7 +:10305300F510F51178101222647510687511037854 +:1030630010122264751069751103781012226474AA +:103073000612204512227B7910EEFCEFFD1243D499 +:10308300121FF2E9705E850882850983A3A3A3A3B7 +:10309300A3A3A3E0F8900368E06870481234831296 +:1030A30022647C697D03E5082408FAE5093400FB02 +:1030B3001210D17402121FF2E960298E828F83A34A +:1030C300A3A3A31236C190037FE0F5107402781016 +:1030D300121FC974802510F58274033511F583EA34 +:1030E300F0A3EBF0740212204585821085831178DA +:1030F30010122264740212204512227B850C8285F1 +:103103000D831236E7121FF28A108B11AE10AF1126 +:1031130090037FE0F51075110074027810121FC937 +:10312300747F2510F874033511F988828983A312FB +:103133002CB87003023026E82403080808E9340099 +:10314300F9EE4F600302302F8882898374FFF0A366 +:10315300F090037FE004F090037FE0600A1236B73B +:103163001205017900800B850882850983123A2AAA +:10317300790A02392274EA12205174FE121FDC8C80 +:10318300128D13EA2405F50CEB1243BC123F5A755A +:103193000800750900EA2402F510EB3400F51185E7 +:1031A300188285198385820A85830B780A12226423 +:1031B300850C82850D83A3A3A3A31233501222642B +:1031C300E50C2405F50AE50D123A16780A12226475 +:1031D300850C82850D831233541207957406121FD2 +:1031E300F28A0A8B0BEA450B70030232F5EA2404D8 +:1031F300F50EEB12333A123F5A8A828B83A3A3A3B1 +:10320300E0F98510828511831236CB60030232F513 +:10321300E4F514F515781412226475146875150312 +:1032230078141222647514697515037814122264D4 +:10323300740612204512227B7913AC0AAD0B85105C +:10324300828511831243DA121FF2E9F50960030242 +:1032530032F5900368E0F8E5087009E02402900372 +:1032630080F08014900380E0FCE82402FAE4340048 +:10327300FBEA6C7001EB707E850882AA8212347AB5 +:103283009414123472506B850E82850F83E0C0E074 +:1032930074812A123331D0E0F00508850E82850F40 +:1032A30083A3E0C0E085080A7481250A123331D074 +:1032B300E0F005089003681233501222647C697DA4 +:1032C3000385080A7481250A123344121FF29003FE +:1032D30068E02508F50874FF6E700374FF6F6012D1 +:1032E300EE24010EEF3400FFE508C39414500302EB +:1032F30031A2E50860131236D58510828511831239 +:1033030036C112050779008014E509700375090AAF +:10331300851282851383EEF0A3EFF0A909740212DC +:103323001FF27F0E02212385080C7481250CF58280 +:1033330074033400F583223400F50F850E82F58380 +:1033430022FA74033400FB1210BF740222123F905E +:1033530022A3A312335A22123A21FDEEFAEFFB22E3 +:1033630074EE12205174FE121FDC8C0E8D0FEA24B2 +:1033730005F50CEB123F31750B0090037FE4F0F57C +:103383000AEA2402F508EB3400F509804490037F30 +:10339300E0FA900368E0F812347A9417123472401A +:1033A3000D90037FE0F87416C398900368F012340D +:1033B300831222647C697D0374802AFA74031233B6 +:1033C30047121FF2900368E0F890037FE028F005AE +:1033D3000AE50C2416F582E50D123335E0F8E50A0B +:1033E300C398507490037FE0C39416506BE50AC3EF +:1033F30033F8E433F9E50C28FEE50D39FF8518822F +:10340300851983AC82AD838E828F8312348C7008CE +:10341300750B01123A268050E4F510F5117810125D +:10342300226475106875110378101222647510698F +:103433007511037810122264740612204512227B40 +:1034430079168508828509831243DA121FF2E9F59A +:103453000B700302339080BB7C7F7D0385088285DC +:1034630009831236C1120519A90B7402023924E922 +:103473009400C365D03322EA28F8E43400F9E82243 +:10348300E0F5107511007810221239198A108B118A +:10349300AC10AD11EC4D2274EA12205174FC121FD2 +:1034A300DC8A0C8B0D8C128D13EA2405F50AEB12C2 +:1034B3003A16750800750900E50A2402F510E50BB4 +:1034C3003400F511740212204585820E85830F782E +:1034D3000E122264850A82850B83A3A3A3A3123F42 +:1034E30036122264E50A2405F50EE50B3400F50FC8 +:1034F300780E122264851082851183123A1C1236CB +:10350300BB1207957406121FF28A0E8B0FAE0EAF15 +:103513000FE50C2402F50EE50D3400F50F80388815 +:1035230082898374FFF0050812332A74FFF00508BB +:10353300900368E0F50C750D00780C1222647C6929 +:103543007D0385080C7481250C123344121FF290FD +:103553000368E02508F508EE4F60278E828F83A36A +:10356300A3A3E0F9850E82850F831236CBEE2404E4 +:10357300123F2EE96027850C82850D831236AD122A +:103583003A33E50870030236931236D5850E8285E9 +:103593000F831236C112051F79000236A8E4F51411 +:1035A300F5157814122264751468751503781412CE +:1035B3002264751469751503781412226474081251 +:1035C300204512227B7911EEFCEFFD850E82850FDB +:1035D300831243DA121FF2E9F509709A850882AA69 +:1035E30082EA9003687009E02404900380F0802548 +:1035F300E0F8900380E0F514E82404FCE43400FDD3 +:10360300EC65147001ED708112347A9412123472E5 +:10361300400302358C850C82850D83E0C0E0748104 +:103623002A123331D0E0F00508850C82850D83A37F +:10363300E0C0E012332AD0E01236F085820C858395 +:103643000D780C122264740412204512227B85101B +:10365300828511831236E7121FF28A0C8B0DAE0C92 +:10366300AF0D85080C7481250CF874033400F9EE52 +:103673004F7003023522851882851983E088828979 +:10368300831236F0A3E0C0E012332AD0E0023530D3 +:10369300E509700375090A850A82850B831236AD25 +:1036A300123A33A909740402332212425685128254 +:1036B300851383227C7F7D03850A82850B831236E3 +:1036C300C522E0FAA3E0FB221236C5120783E9F50F +:1036D3000922900380E0F5F0E5088490037FF07CF5 +:1036E3007F7D032212335A1207A1740422F00508C6 +:1036F3008518828519832274EC12205174FE121FDF +:10370300DC8A088B098C0E8D0FEA2405FEEB34004E +:10371300FF123903EE2418123F2EEA450B70030201 +:1037230037A61238EC50291237CB8A108B11EA4591 +:1037330011606B7912AC0AAD0B850882850983127F +:1037430036C185108285118312204FE9F50A70581E +:10375300E4F50AF50B780A1222648E828F83A3A301 +:10376300E0F50A780A122264EE2403123A13780A67 +:103773001222648E828F831237D81208BB7406120A +:103783001FF2E9F50A7021850C82850D83E0701F15 +:103793008508828509831236C11205258011750AB1 +:1037A3000E8009750A018004E50A6003123A268532 +:1037B3000C82850D83E0600479008002A90A7402FB +:1037C300121FF27F0C02212385188285198312367A +:1037D300C51208A922123A21FD85088285098312A0 +:1037E30036C52274EE12205174FE121FDC8A088B38 +:1037F300098C0C8D0DEA2405FEEB3400FF750E00D9 +:10380300123903EA450B70030238CA1238EC502C04 +:103813001237CB8A0E8B0FEA450F604A7912AC0A36 +:10382300AD0B8508828509831236C1850E82850F0B +:103833008312204FE9F50E60030238CD8508828597 +:103843000983123B08AA0AFB1238DE70147AFF7B45 +:10385300FF1238DE606C88828983E50AF0A3E50BEA +:10386300F0750A008007750E0E805F050A900365E8 +:10387300E0FAE50AC39A504AE50A75F017A4FAABD1 +:10388300F088828983A3A3E02AFAA3E03BFB8A8220 +:103893008B83123A1CEC4D70D2750A17750B0078A6 +:1038A3000A122264EEFCEFFD1210BF7402121FF223 +:1038B300EEFCEFFD8508828509831236C112052BC4 +:1038C3008014750E098003750E0112424E850C8219 +:1038D300850D83123A33A90E02346D12089D8A10A6 +:1038E3008B11A810A911E84922E5082402F508E57F +:1038F300093400F5098A828B83A3A3A3E0A2E522FE +:10390300851882851983AC82AD838E828F831239A9 +:10391300198A0A8B0B22E0FAA3E0FB12079B22749D +:1039230004121FF27F0A02212374EC1220518C101F +:103933008D11EA2405F50CEB123F31750F00EA24D3 +:1039430002F50AEB123A16850A82F5831236C11282 +:1039530044607003023A08750E008071850C8285FD +:103963000D83E06401704F8E828F83A3A312227BA9 +:103973008E828F83A3A3A3A3E0F51275130078129D +:10398300122264EE2405F512EF3400F513781212B7 +:1039930022641236BB1208BB7406121FF2E9F50F3C +:1039A3006014850C82850D83E4F012424E851082EB +:1039B300851183123A337C177D007900EEFAEFFB11 +:1039C3001210D78E828F83E4F0A3F0050E90036567 +:1039D300E0F8E50EC398501EE50E75F017A4F8A99C +:1039E300F0850882850983A3A31243C6123A1CEC0F +:1039F3004D600302395F85088285098374FFF0A354 +:103A0300F0E50F70061236BB120531A90F0237C657 +:103A1300F50AEF3400F50B22A3123A21FD22E0FC54 +:103A2300A3E0228E828F83124256850E82850F83F6 +:103A3300E8F0A3E9F022C082C083900361E06A70DA +:103A430003A3E06B70067A617B0380047A007B003A +:103A5300022D7B74F71220517F00EF75F003A4F859 +:103A6300A9F0EC28F8ED39F988828983E06A7003BC +:103A7300A3E06B7006E8FAE9FB800B0FEFC3940237 +:103A830040D87A007B007F0102212374F612205173 +:103A930012403F70067A007B008007A3A3A3A31202 +:103AA30036C102410074F2122051E9FE740E122055 +:103AB30045123B087410122045123F708C828D838F +:103AC300E06402703BA312425288828983E0F50CC2 +:103AD300A3E0F9A80C740268700374296970217556 +:103AE3000C02750D00780C12226478081222647897 +:103AF3000A122264EEF91208DF7406121FF2800222 +:103B03007901024170E0F50AA3E0F50B2274E81293 +:103B1300205174FB121FDCE9851882851983F08A12 +:103B2300168B178C0E8D0F741F122045123F707465 +:103B330021122045123B087423122045123F5A7567 +:103B430010008C828D83A3A3A3E0A2E4502A741DEA +:103B53001220451237D18A828B83E5824583700315 +:103B6300023C1C790AAC0EAD0FAA16AB1712204FFC +:103B7300E9F5106003023C1F850E82850F83E06424 +:103B8300026003023ED5A31242528508828509834F +:103B9300A3858212858313E50E2406F50CE50F1227 +:103BA3003F3188828983E0FAA3E0F9EA2400F5141F +:103BB300E439F51578141222EE010000280128E4F7 +:103BC3003B07000228BB3C03282B3C0029E53D01B1 +:103BD300290D3E0229B43D0329E53D0429763ED54E +:103BE3003EEE4F703E850C82850D83123F4BFAE902 +:103BF300FB8A828B83E0850A82850B83123F8712BF +:103C030022648A828B83A3123A21FDAA08AB09128C +:103C130010BF7402121FF2800375100EA9107405F1 +:103C23000243B475100B80F4EE4F70F7850A82855A +:103C33000B837401F0123F60850882850983F07C51 +:103C4300007D00850E82850F83A3A3A3A3E0240137 +:103C5300FAA3E03400FB12079BEA4B60418A828B94 +:103C630083E02402F8850A82850B83E028F0EA24A6 +:103C730004F8EB3400F988828983E0851282851386 +:103C830083123F99123F871222648A828B83123AEE +:103C93001BE5082403FAE5093400FB023C12850AFC +:103CA30082850B83E02404F07C047D007900AA1252 +:103CB300AB131210D7023C1FEE4F6003023C2612D7 +:103CC3003F60FEA3E0FF850A82850B837404F0EE58 +:103CD300850882850983F0EF851282851383F0744A +:103CE30003122045AC82AD83EEFAEFFB12402D7038 +:103CF30003023D918A828B83A3A3123F5674011260 +:103D0300204585820E85830F780E12226474051276 +:103D1300204512227B7CFF7DFF1207A17404121F32 +:103D2300F28B0FEA450F7033850C82850D83123FAA +:103D330036122264850C82850D83A312227B7C02BA +:103D43007D007AB37B8F1205CD7404121FF2E970E4 +:103D53000A740112204574FFF0A3F08E828F83E072 +:103D630064027034750C02750D00780C1222648E97 +:103D7300828F83123A1BE5082404FAE509123347BC +:103D8300121FF2850A82850B83E0240280097401E5 +:103D9300122045EEF0A3EFF07401122045123F47C5 +:103DA300F07401122045A3123F3FA3A3A3F0023CEA +:103DB3001FEE4F6003023C26850C82850D83123A69 +:103DC3001CAA16AB171208D3850A82850B837402CB +:103DD300F0EA850882850983F0851282851383EBD7 +:103DE30080CBEE4F6003023C26123F60F8A3E0F95C +:103DF300850A82850B837402F0E88508828509832E +:103E0300F0E985128285138380A3850C82850D8357 +:103E13001236C11210B9EAFC8C82A882C39EE49FB9 +:103E2300404BE86E7001EF70047C00801F851882A0 +:103E3300851983E0FAEE2AFAEF3400FBC3EA98EB24 +:103E430094005003E08004EECCC39CFCEC850A8212 +:103E5300850B83F08C0A750B00780A122264850C9B +:103E630082850D83E02EFCA3E03F023C0D75100715 +:103E7300023C1FEE4F6003023C26850C82850D83B6 +:103E8300124252850A82850B837407F088828983E4 +:103E9300123F3F123F27E0851282851383F0E82407 +:103EA30002FAE93400FB8A828B83123F3F123F7888 +:103EB300123F47A3123F81123F50F0E82405F8E96F +:103EC3003400F988828983123F50A3123F99A302D9 +:103ED3003DAD741D1220451240387003023C1C1284 +:103EE3004252880C890DE8450D7003023C1C8E106C +:103EF3008F117810122264780A1222647808122231 +:103F0300647406122045E0F9AC0EAD0FAA16AB1788 +:103F1300850C82850D8312204F7406121FF2E9F57A +:103F230010023C1FF088828983A322F50CEF340032 +:103F3300F50D22E0F50E750F00780E22E08508825C +:103F430085098322123FA022124256E822123FA083 +:103F5300A3A322A3A3A3A3E0FEA3E0FF22850C82D5 +:103F6300850D83E0F8A3E0F5838882E022E0F5087D +:103F7300A3E0F50922A3A3F08A828B83A322122C48 +:103F830033A3A322F08A828B83123F9022E0F50AA7 +:103F9300750B00780A22123F27123FA022E0850802 +:103FA30082850983A3A32274EE12205174FE121F8B +:103FB300DC8A0A8B0BECFAEDFB7414122045E0F556 +:103FC30010A3E0F5117416122045E0FE74181220B8 +:103FD30045E0F50EA3E0F50F851882851983AC82C1 +:103FE300AD8312402D603E851882851983124038B7 +:103FF300602FA3A3123F70E50845096024780E12D1 +:1040030022647810122264EEF9AC0CAD0DAA0AAB4F +:104013000B85088285098312204F7404121FF280D6 +:1040230006790E8002790102346D12079B8A0C8B8C +:104033000DEA450D221236C512403F221208678A47 +:10404300828B83E58245832274F612205174FE121B +:104053001FDC740C122045123F4B8518828519838F +:10406300F07401122045E9F0E4F508F50978081227 +:1040730022647508027808122264740412204585AC +:10408300820885830978081222641208BB74061219 +:104093001FF27402121FF2806474F7122051EAFEB9 +:1040A300EBFF89087C987D031208D3EA5402600B66 +:1040B300A908EEFAEFFB12078F80027901023A8911 +:1040C30074F612205174FF6A700374FF6B701C7BCB +:1040D30000EB75F003A4F8A9F0EC28F8ED39F91218 +:1040E30041050BEBC39402501480E61208A38A081F +:1040F3008B09A808A909E84960031241057F020258 +:1041030021238882898374FF122C31E4F02274F610 +:104113001220511208A38A828B83E58245836006AD +:10412300A3A3E0FA80027A007B0080D174F212200C +:10413300518A088B09ECFEEDFF740E122045E0F561 +:104143000A124175701CEEFCEFFD7AFF7BFF1241F2 +:104153007570047911801688828983E508F0A3E5D8 +:1041630009F088828983A3A3E50AF079007F060218 +:1041730021231208A38A0C8B0DA80CA90DE8492250 +:1041830074EE122051EAFEEBFF8C088D09890C7442 +:10419300121220451242527414122045123A1C7412 +:1041A300161220451236C1750D00EC4D6003024214 +:1041B300467402650C600302424188828983123A85 +:1041C30021F9EC2400F50EE439F50FEAF4F8EBF4E9 +:1041D300F9EC58F8E50F59F9E849705DE50824064C +:1041E300F8E5093400F9880A890B8882F5831233CC +:1041F300561208D38A108B11E50E65107004E50F73 +:1042030065116042780E122264850A82850B83123F +:1042130033561208D97402121FF2E9F50D7027788C +:104223000E122264850882850983A3A312335412D4 +:1042330008F17402121FF2800D750D808008750D50 +:104243000D8003750D0BA90D0239278E828F831202 +:10425300425622E0F8A3E0F92274E812205174E7F1 +:10426300121FDC851882851983EAF0A3EBF08C1604 +:104273008D17890E7431122045E0F512A3E0F51372 +:104283007433122045E0F514A3E0F51574351220BC +:1042930045E0F50F750800750900E50975F003A4FD +:1042A300F8A9F08518828519831243C6E0F47003D8 +:1042B300A3E0F470030243A4EE2402F50CEF1243CF +:1042C300BCE070030243A485160A85170B780A1213 +:1042D3002264AC14AD15AA12AB1312085B7402125C +:1042E3001FF28A0A8B0BEA450B70030243A4E4F521 +:1042F30010F511781012226474061220458582107D +:104303008583117810122264740912204585821066 +:104313008583117810122264851282851383A3A3E7 +:10432300A3A312227B7914AC0AAD0B8E828F831266 +:1043330043DA121FF2E97069850A82850B83A3A30E +:10434300A3A31242527402122045123A33850C82FF +:10435300850D83E0A2E05018A90E7402122045AC2B +:1043630082AD838E828F831236C11207B3E942086E +:10437300850C82850D83E0A2E15026E50FF50A78CE +:104383000A122268A90E7403122045AC82AD838EF3 +:10439300828F831236C11207AD7401121FF2E942F4 +:1043A300080509E509C39402500302429DA9087454 +:1043B30019121FF27F100221233400F50D850C82A0 +:1043C300F58322E028FEA3E039FF8E828F832279D2 +:1043D30016850A82850B831236C51208B574082226 +:1043E30074F2122051EAFEEBFF890B7401650B6036 +:1043F3000E7402650B70637901120AC5E9705BEEF6 +:10440300FAEFFB1244606047750A00800B7C177D4E +:104413000079001210D7050A900365E0F8E50AC396 +:10442300985021E50A75F017A4F8A9F0850882854C +:104433000983A3A3E028FAA3E039FB8A828B8312C2 +:104443002D8270C985088285098374FFF0A3F07CEF +:10445300987D03EEFAEFFB1208CD02417012089D1E +:104463008A088B09EA45092274F21220518A088BC3 +:1044730009ECFEEDFF740E122045123B08900EEA84 +:10448300E0F4603D7A097B001210E3EA4B60328A64 +:10449300828B8374B1F0A3E4123F7AA3123F78A313 +:1044A300E508F0A3E5091244C7EEF0A3EF1244C7F1 +:1044B300A3A3E50AF0A3E50BF0900EEAE0F91210CE +:1044C300EF024170F08A828B83A3A3A3A3A322C02C +:1044D30082C0839061907404F0A37448F0A3E4F065 +:1044E3009061807440F09061BC7407F090618774B0 +:1044F30069F09061B67416F07900120BAF7902126D +:104503000BB59023A8E493F46006E493F9120B8BA4 +:104513007905120EA3024914C082C083E9540FF92E +:10452300906185E0696012E5C654804449F5C6E5AB +:104533009E547F644970F8E9F053C680E59E547F2A +:1045430070FA02491474F7122051E5A8FE53A87EAD +:10455300120B97C2BA539AFEC289759B00C2C2124C +:104563000B9D75A91175B905120BA3D2BA439A0114 +:1045730074805E42A8024EA1C082C083906181E430 +:10458300F0A302491175E90075910075BF0002019E +:1045930022C082C083906181E4F0A374C0F0A3E4DD +:1045A300024913C082C08374F8121FDC90044412C2 +:1045B3004D83E849700302465D900444E054406033 +:1045C300237908851882851983AA82AB83120CA5E7 +:1045D300851882851983AA82AB83120957900444F4 +:1045E300E054BFF0E054806010790C7A007B06122F +:1045F3000CA5900444E0547FF0E0A2E05008790059 +:1046030012466554FEF0E0540260087901124665D3 +:1046130054FDF0E054046008790012467054FBF036 +:10462300E054086008790112467054F7F0E0541022 +:104633006008790212467054EFF0E0542060087964 +:104643000312467054DFF0A3E05401600D120BC156 +:10465300120969900445E054FEF07408121FF20237 +:104663004914120BAF12095D900444E022120BB5FA +:10467300120963900444E022C082C083E9600514F8 +:10468300602A804F90619A7433F0A37455F090615F +:10469300A0743AF09005DCE064017009C2919004C3 +:1046A300467467802D9004467461802690619A74E5 +:1046B3003FF0A3745AF09061A0747FF09005DCE0A2 +:1046C30064017009D2919004467471800590044688 +:1046D300746AF0024914C082C083E9600B14600D50 +:1046E30014600F14601180209023A480159023A5DB +:1046F30080109023A6800B9005DCE0640160F390AA +:1047030023A7E493906186F002491474EE122051BA +:1047130074F4121FDC851882851983AC82AD83750E +:10472300838F7582327404121EEF9023A493F46076 +:10473300030248A0907808E0C39402500302488023 +:104743007404122045AC82AD8375838E7582BB746D +:1047530008121EEFF97AFF7BFF7FFF7E00898285B7 +:104763008210801874086E700302483574096E70E5 +:1047730003024835740A6E7003024835E510C333EB +:10478300FCE433FD7404122045E5822CF582E583B5 +:104793003DF583E0F50EA3E0F50F8E08750900746F +:1047A300027808121FC974482508FC74783509FD7E +:1047B3008C828D837808121EAC74087808121DED64 +:1047C30085080C85090D8C828D837808121EAC74C4 +:1047D300187808121DEDE50C4508F508E50DF509F7 +:1047E300C3E50E9508E50F95098C828D8378081231 +:1047F3001EAC8C828D837808121EAC741878084026 +:1048030014121DEDE50C4508FCAD0DE50EC39CFC33 +:10481300E50F9D800F121DEDE50C4508C3950EFCB9 +:10482300E50D950FFDC3EC9AED9B5006ECFAEDFBFD +:10483300EEFF0EEEC39413500302476774FF6A70D2 +:104843000374FF6B602D8F0874027808121FC974FC +:104853004812552F74783509F5837808121EAC85F4 +:104863001882851983E5822510F582E5831252BCEF +:10487300E508F009E9C39404500302475875080199 +:1048830075090078081222647402122045AC82ADC7 +:10489300837AE97B081212FF7402121FF2740C125E +:1048A3001FF27F0A022123C082C083906186E0F851 +:1048B3009023A7E4936870099023A6E493906186FC +:1048C300F09061AE7468F0A3746AF090624574FB73 +:1048D300F0A304F053F4FD43FE029005DC7401F0F1 +:1048E3009061A0E0643A7004790080027901120BB0 +:1048F300AF024914C082C08390058EE06401700A40 +:10490300900593E06004790C800279008003F0A3A2 +:10491300F0D083D082020122C082C08375E1F1907E +:104923000591E0604D146008146051146049805192 +:10493300120BD3900587E0F97A887B05120E259038 +:104943008F2A121ECA120E5B908F46121ECA120EB7 +:1049530031900592E0F9120E3D7901120E97900500 +:1049630085E02416124AA974EBF0A3740BF07900C6 +:10497300809F120BD980BC120BDF80B7120BE5802E +:10498300B2791280EB74F412205175D90D9005762B +:10499300E0A2E0E4331313F8124A15484401F5D9B1 +:1049A3007800124A9340FB78008808747712552FD9 +:1049B3007405124A9D40F275E195900576E0F97A07 +:1049C300777B05120E2B900F0C7461F0A3740B12FE +:1049D3004AB8124AD8124ACF124C10124A1F78080A +:1049E300121EAC908F4A7808121E38908F367808C2 +:1049F300121E86124AA37808121EBB900585E02476 +:104A030014124AA97413F09004427402F07F040252 +:104A13002123900587E0C4333354C022900585E0F9 +:104A2300F8A3E0F5838882A3A32274F6122051121F +:104A33004BE18AD97800124A9340FB780080061232 +:104A43004B47124C93E8C39940F5124BD3124A9348 +:104A530040FB7800800812552B7405124C93E8C371 +:104A63009940F375E195900F0C746DF0A3740B12DC +:104A73004AB8124AC2121ECA124AA3121ED690057F +:104A830085E02414124AA97412F0900442024E7E67 +:104A9300880874882508F5827405124DEF94062260 +:104AA300900585E0240EF8A3E0124AB0223400F901 +:104AB3008882898322124BF97467F0A3740B221244 +:104AC3004AD8124ACF124C14908F6222F0A3747FFB +:104AD300F0A3740B22124ADC22124AE022F0A374E0 +:104AE30011F0A3740D2274F6122051124B3C124A9A +:104AF300154402F5D97800124A9340FB78008006EA +:104B0300124B47124C93E8C39940F575E195900F0A +:104B13000C124B52F0A3124B52124AC5121ECA1268 +:104B23004AA3121ED6900585E02414124AA97414D0 +:104B3300F09004427404024E80900597E0F97407E4 +:104B430029F5D922880874982508F58274052274FA +:104B530079124B5F124B5FF0A3740B22F0A3740B1B +:104B6300F0A374792274F6122051124BE174064AB1 +:104B7300F5D97800124A9340FB78008006124B4720 +:104B8300124C93E8C39940F5124BD3124A9340FB5E +:104B93007800800812552B7405124C93E8C3994092 +:104BA300F375E195900F0C7473F0A3740B124BEF34 +:104BB300124AC2121ECA124AA3121ED6900585E0DB +:104BC3002414124AA97415F09004427403024E800F +:104BD3009005B7124B3F74044AF5D9780022124B63 +:104BE3003C900587E0C4333354C0FA22124BF97466 +:104BF30011F0A3740D22124BFD22124C0A7411F012 +:104C0300A3740D124C0A22124AE0F0A322124C1490 +:104C130022F0900F1A7411F0A3740D124BFD74114E +:104C2300F0A3740D124ADCF022C082C083124A1F23 +:104C3300A3A3A3A3E402491174F7122051125771DD +:104C4300F8740439F9E82405FAE93400FB8A828B05 +:104C5300831254E088828983A3A3A3A3A3A3A3A35A +:104C6300A3ECF0A3EDF088828983A3A3A3A3A3A35A +:104C7300A3E024FFF8A3E034FFF98A828B83E8F0F2 +:104C8300A3E9F0024EA1880874E02508F5827405B3 +:104C9300125407F5D90822EAFEEBFF9061D0E0F841 +:104CA3007480C398FAEE248322124CB29404221225 +:104CB30052CAE0F5D90AEAC32274F6122051EAFE79 +:104CC300EBFF9061D0E0707575D90E75D90375D976 +:104CD300047A008A08EE250812583F248C124D5599 +:104CE30040F17A008A08EE250812583F2484124CBA +:104CF300AC40F175E1957908EE248C124D4E248475 +:104D0300124D457C008C82AA82C3E49AF895E0F99F +:104D1300EE28F8EF39F9E8248BF582E9125403C041 +:104D2300E0EE2A12583F24ABF582E91252BCD0E0E0 +:104D3300F00CECC3940840CD124E0B8002790002B4 +:104D43004E81FAEF3400FB120C9922124D4579047F +:104D5300EE22124CB2940822C082C08375D9027528 +:104D6300D90375D90575E195EA2470F582EB124DE7 +:104D730080EA2472F582EB124E1D0249141252CDC1 +:104D8300124D8722E0F8A3E0F92274F6122051EACB +:104D9300FEEBFF9005E07406124DF91222647C01CC +:104DA3007903125125121FF275D90675D9037800BC +:104DB300124DDF40FB75E195900442E064087017E3 +:104DC300EE2470F582EF124D80EE2472F582EF121D +:104DD30052BCE8F0A3E9F07901024E81880874E03F +:104DE3002508F5827405124DEF9405221252CDE089 +:104DF300F5D908E8C322F07508E07509057808229B +:104E030075E1957904120E61EE2470F582EF12526A +:104E1300CD124D87EE2472F582EF1252CDE8F0A346 +:104E2300E9F079012274F6122051EAFEEBFF90615A +:104E3300D0E0704379019005E0740BF0900442E0F8 +:104E4300640770177508E075090578081222647CF9 +:104E5300010909125125121FF27905740129F5D9A7 +:104E630075D90378008003124C89E8C39940F8751B +:104E7300E195124E0B8002790080037401F07F02EA +:104E830002212374F7122051EAFEEBFF75D9037553 +:104E9300D90375D90DEE24DE124EA6124E037F01FF +:104EA300022123F582EF125407F5D9227F03022151 +:104EB300237401250AF5D975D90378002274F512F4 +:104EC3002051124F356004780480027800E8240BE7 +:104ED300F8EAC3984041750A099005E07409F0792E +:104EE30008124F1E60147508E07509057808122230 +:104EF3006412511D121FF2750A0D124EB480031273 +:104F03004C89E8C3950A40F775E1957904120E615F +:104F130012509A7901800279008091EE24E3FCEF2C +:104F23003400FD7AE17B05120C93850882850983A1 +:104F3300E022124C9AF8EF1254D4F583E02274F372 +:104F43001220518A088B09125130FAE5082483F59F +:104F53000AEB124FFF6004780480027800E824080B +:104F6300F8EAC3985003024FF8750C069005E074F5 +:104F73000CF090045FE09005E1F07402C0E0F97C6E +:104F8300607D047AE27B05120C93D0E0F97C627DAC +:104F930004120C93850A82850B83E0601C750AE07A +:104FA300750B05780A1222647C067903AA08AB09FB +:104FB300125125121FF2750C0A7401250CF5D975CF +:104FC300D90378008009880A74E0250A124C8FE817 +:104FD300C3950C40F175E1957904120E61E508243F +:104FE30070F582E509124D80E5082472F582E50922 +:104FF300124E1D800279007F050221233400F50B38 +:10500300850A82F583E02274F6122051EAFEEBFF53 +:10501300125130FCEE2483F8EF12512B60047A0412 +:1050230080027A00EA2404FAECC39A405E7A029082 +:1050330005E0EAF0EE24F5F582EF1250A66019754B +:1050430008E075090578081222647C027903EEFAF8 +:10505300125125121FF27A0674012AF5D975D90364 +:1050630078008003124C89E8C39A40F875E195EE05 +:105073002474125093EE248012509312509A7904A0 +:10508300120E61EE240D124E0E80027900024E8143 +:10509300F582EF12521622EE241DF582EF125216FC +:1050A300A3F0221254079005E1F088828983E0225D +:1050B30074F6122051125130FEEA2483F8EB125198 +:1050C3002B60047C0480027C00EC2404FCEEC39C73 +:1050D30040437C029005E07407F0EA24F6F582EB86 +:1050E3001250A660157508E0750905780812226448 +:1050F3007903125125121FF27C0674012CF5D97520 +:10510300D90378008003124C89E8C39C40F875E109 +:1051130095790180027900024E817C097903EEFAC8 +:10512300EFFB120D05740222124AB0E0229061D007 +:10513300E0F87480C3982274F5122051E9FEA2AFFF +:10514300E433F50AC2AF7F00EA246FF8EB3400F9C9 +:1051530080010F88828983E0FCEFC39C50188F087D +:10516300EA2508FCEB3400FDEC246BF582ED1254C8 +:10517300036E70DE8010EA2CFAEB3400FB1252B699 +:10518300EE1250AC04F0E50AA2E092AF024EAF7407 +:10519300F6122051A2AFE433FFC2AFEA246FF8EB5B +:1051A300125841FCE9FD8C828D83E014F07E00806F +:1051B300218E08EA2508F8EB125841246CF582E9A0 +:1051C300125403C0E0E8246BF582E91252BCD0E02C +:1051D300F00E8C828D83E0F8EEC39840D4EA246EFF +:1051E3001252B974FF12520BEFA2E092AF024E813A +:1051F300C082C083E5A8F8C2AF1252B6E912520BBF +:10520300E8A2E792AF024914F0EA246AF582EB12AE +:105213005216221252CDE4F02274F21220518C82E3 +:105223008D83A3A3A3A3E0541FF0EA243612557879 +:105233008E828F83E4F0F50C850C8285820AEC253F +:105243000AF8ED1254D0F583E0C0E0EA250AF8EB42 +:105253001252C0D0E0F0750D00850882850983E005 +:10526300F50A750B00E50D780A121FAAE50AA2E0FC +:10527300502AE50C33333354F8250DC0E08E828F6A +:1052830083E0F8EA28F8EB1258412438F582E91252 +:1052930052BCD0E0F08E828F83E004F0050DE50D63 +:1052A300C3940840B4050CE50CC39405408A7F06FB +:1052B300022123EA246BF582EB1252CD223400F94A +:1052C300E8245D1252CA22F582E93400F583227480 +:1052D300F612205190046EE0640170077A007B009F +:1052E3000253FD7E00900474E070F17401F0A3E4B6 +:1052F300F0A3F09004D404F09004D7E4F0A3F0906A +:1053030004DA04F0900477E412541490048104F056 +:105313009004A7E4F0908F42121ECA90048A121ED2 +:10532300D690048EE4F0A3F0A3F09004F2F090047E +:10533300E6F09004DB7480F0A3E4F09004E1F090D5 +:1053430004D9F090055D12540C900566F09004F5B5 +:10535300F0900545F0A3F0908F42121ECA900547C6 +:10536300121ED6908F42121ECA90054B121ED69063 +:105373000551E4F0900553F090054FF09005691244 +:10538300540C8E0874DD12552F74041252BC74FF32 +:10539300F00EEEC3940440EA7E008E82A882747DF0 +:1053A30028F5827405125403C0E074CF28F5827483 +:1053B300041252BCD0E0F00EEEC3940540DC7E0034 +:1053C3008E82A882745628F5827404125403C0E0B6 +:1053D300745528F58274051252BCD0E0F00EEEC36A +:1053E300940840DC90046EE004F0640170089004BB +:1053F30076E0900470F07A727B04024E81F582EFBE +:10540300125407221252CDE022125414A312541440 +:1054130022F0A3F0A3F0A3F022C082C083EA240306 +:10542300F582EB1254036008E4F090046FE014F08B +:1054330090046EE014F0700690047074FFF08A829A +:105443008B83A3A3E4F0900582E0700D90046FE0DA +:10545300640170057900120E43024914C082C083AF +:10546300900475E4F0900474F090046EF0A3F0A33C +:1054730074FFF075E1F1024914C082C083780079AA +:1054830000900475E060047872790488828983A3AC +:10549300A3A3A3E0F902491474F6122051EAFEEB28 +:1054A300FF120C4BEE2465F8EF1254D01254DEECCD +:1054B3004D6010900470125769850882850983E452 +:1054C300F0A3F0EEFAEFFB120D3B024E811254D41F +:1054D300223400F988088909888222F583E0FCA335 +:1054E300E0FD2274F7122051EAFEEBFF8E828F83D8 +:1054F300A3A3A3A3E0FA7B001209CFEEFAEFFB12FA +:105503000C5D120D1D024EA174F612205178008815 +:1055130008745612552F740412509608E8C3940861 +:1055230040ED900456024E7E880874B82508F58233 +:105533002274F6122051EA240D125578EC2403F854 +:10554300ED3400F988088909EC2407F8ED12584175 +:10555300FCE9FD125582121F518E828F83E8F0A35E +:10556300E9F0125582121F518B09EA4509600312B3 +:105573005595024E81F8EB3400F9E8FEE9FF228CE1 +:10558300828D83124D87850882850983E0FAA3E023 +:10559300FB228E828F83E02401F0A3E03400F0220B +:1055A30074F6122051EA242EF582EB34001254DEF5 +:1055B300EA2470125578780079FAECFAEDFB121FA1 +:1055C300518E828F83E8F0A3E9F0780079FAECFA40 +:1055D300EDFB121F518B09EA450960031255950231 +:1055E3004E8174F0122051EAFEEBFF741012204535 +:1055F3007808121EAC120DF58A0C8B0D8C0E8D0FD4 +:10560300908F1E780C121E38908F36780C121E86DF +:10561300780C1222608E828F83124A22121ECA12C3 +:1056230027DD7404121FF2E960030256CD8E828FC8 +:1056330083E02402F8A3E0125841FAE9FB8A828B43 +:10564300837808121E4B908F367808121EAC8A821C +:105653008B837808121E99EE240BF582EF1252BC4D +:10566300C082C0838E828F83A3A3A3A3A3E024015C +:10567300F8A3E03400F9D083D082E0687003A3E09C +:1056830069700479018045EE2407F8EF124AB012DD +:105693005599EE24741258467014EE24751256D49C +:1056A3007003A3E06D70078A828B83125599EE24F1 +:1056B300801258467014EE24811256D47003A3E06E +:1056C3006D70078A828B8312559979007F080221B6 +:1056D30023FAEF3400FB8A828B83E0FCA3E0FD888E +:1056E300828983E06C2274F3122051125771FE7485 +:1056F3000439FFEE2404F50AEF3400F50BEE2465BC +:10570300F508EF3400F50980101254E0850882850E +:105713000983E4F0A3F01257638508828509831295 +:1057230054E0EC4D6030EE2464125400F50C780C18 +:10573300122268EE2463125400F9EEFAEFFB120C06 +:10574300877401121FF2E985088285098360BA1202 +:105753004D83E84970077C007D00125763024FFABE +:10576300850A82850B83E0FA7B0012098D2290045F +:1057730070E0F875F004A4C8AAF02AF9747228221C +:1057830074F2122051EAFEEBFF890A740E122045CF +:10579300E0FAEE2462125846600302583A1251307E +:1057A300F50CEE2483125400FB6004780480027825 +:1057B300008908E928F8E412584124020808E9346A +:1057C30000F9E50C98E499A2D265D0334065EA70FC +:1057D30005750B028003750B01EB603375090078C7 +:1057E300081222647AE07B05120CCF7402121FF2B6 +:1057F3007508E07509057808122264AC0AA90B1232 +:105803005121121FF27404250AF50A7CE07D057408 +:1058130001250AF5D9850BD97800800A8808EC128E +:10582300552FED124C93E8C3950A40F075E1957935 +:105833000080067907800279FF0252B1F8EF340045 +:10584300F9E822F582EF125407640122C082C08373 +:10585300800312587DE9F874FF28190470F4ECFAF8 +:10586300EDFB024914C082C083800312587DE9F81E +:1058730074FF28190470F40249148C828D83E08A22 +:10588300828B83F08C828D83A3AC82AD838A828BDF +:1058930083A3AA82AB832274E8122051907803E099 +:1058A3006442705E9005DFE014F07056C2AF125888 +:1058B300B400782AD0E0F618D0E0F6E59F5407F953 +:1058C3007005908F828003908F267808121EACE9B2 +:1058D300C4C0E07829E65508F50808E65509F50936 +:1058E300740B7808121FBAD0E02508F8906270E0B4 +:1058F300A2E740F8E8C333906272F0906270E0D29E +:10590300E0F0900470E0F874FF687003025BCCE889 +:105913001266252402F8EF3401F98882898312661E +:105923009FEA4B600FEE2401F582EF3401F583E02B +:10593300F9121113EE2405F514EF3400F5158E82D8 +:105943008F83A3A3A3A3A3A3A31260B112663B9067 +:105953006054E0900449F0906055E090044AF09060 +:105963006056E090044BF0906057E090044CF09048 +:105973006058E090044DF0906059E090044EF09030 +:10598300605AE090044FF090605BE0900450F09018 +:10599300605CE0FC900451F090605DE0FD90045287 +:1059A300F090605EE0F50C900453F090605FE0F5DA +:1059B3000D900454F090044FE0F5108C082508F87E +:1059C300E43400F9850C0812605C8D0812605C8574 +:1059D3000D0812605CEE24F71265E71266918C8263 +:1059E30085820AEE24F9F582EF1260A5EE24FB12FC +:1059F3006099EE24FFFAEF3400FB8A828B83E0F593 +:105A030008A3E0F509E5084509603A906000E0C3A2 +:105A130033F508E433F5098A828B83E02508F50E14 +:105A2300A3E03509850E82F583126691906000E04C +:105A3300C333F8E433F98A828B8312664C244AF524 +:105A430082E91260A5EE240BF8EF3400F9EE241D71 +:105A5300F50EEF3400F50FEE2420FAEF3400FBEEE1 +:105A6300241C1265CFEE240FF50AEF3400F50BE585 +:105A730010700BED7008E50C7004E50D607985146A +:105A830082851583126667EE240D1265F12CFCA343 +:105A9300E03DFD88828983ECF0A3EDF0126076701F +:105AA300031260DC90044AE0602485088285098340 +:105AB3007401F0EE246A1265F17013EE247412651A +:105AC300F1700BEE24801265F170031260DC9060BC +:105AD30062E08E828F837003025B5FE02406FCA387 +:105AE300E03400FD12667E120DEF8E828F83E02478 +:105AF30012126641E48079EC601812607670238A92 +:105B0300828B83126667850E82850F83ECF0A3ED8B +:105B1300800FEE24FD126099850E82850F83E4F0D9 +:105B2300A3F0888289831260B1E0687003A3E069FF +:105B33006003025AA7850A82850B83E0600F8514F0 +:105B430082851583E064057002A3E0600B7908EE9B +:105B5300FAEFFB120C638071793E80F3E0F8A3E067 +:105B6300F5838882A3A3A3A3A3A3E4F0A3126A3AB1 +:105B7300F0A3F0906060E0C0E0EE24691265E7D026 +:105B8300E0F090044FE0F81265EE28F0EE247AF589 +:105B930016EF3400F517025CB89005DDE064017080 +:105BA3002B120EAF1265EE70069060607480F0EEFB +:105BB300FAEFFB120DA1E96401600E120C81120DC4 +:105BC3009BE964016003120D1D0260EFEE24831252 +:105BD30065F16004780480027800E50CC398F9123B +:105BE30009818A0A8B0BEA450B60B6EE24831265A2 +:105BF300F170048A088B0978008015E5D9C0E08824 +:105C030010E5082510F582E5091265EAD0E0F008F1 +:105C1300E8C3950C40E5EE24831265F1603774FC0C +:105C2300250CF50C7808122264AC0CA90DEEFAEFE2 +:105C3300FB120D0B7402121FF2E970197403650D48 +:105C43007003025CF2E50A24FBFAE50B34FFFB1256 +:105C53001155025CF27403650D7003025CF7850C49 +:105C6300107511007810122264AC08AD09AA0AABB2 +:105C73000B120CCF7402121FF2EE24691265F16449 +:105C8300807004747F8001E0F5087808122268E5CB +:105C93000DF5087808122268A90CAC0AAD0B900424 +:105CA30070E0FA7B001209877402121FF2120EBB16 +:105CB3001265EE14F0E07003025BAC7508E0750941 +:105CC30005750A00750B00E5D914F50CE5D95403E5 +:105CD300F50D601B7403650D7003025BFAE50C7030 +:105CE30003025B9CEE24681265F16003025B9C79FE +:105CF3003D025B52850882850983E0FAA385820809 +:105D0300858309A3A882A9836038147003025E4ABD +:105D1300147003026000147003025E8B24FD700391 +:105D2300025F2E146087147003025F5524FE700314 +:105D3300025F37147003025F50147003025FA802FE +:105D43005FAD850882850983E0C0E0EE24771265A4 +:105D5300E7D0E0F0880889097902AC08AD09EE24A0 +:105D63007812601D7902AC08AD09AA16AB17120CA4 +:105D73008D8A088B097902AC08AD09EE247C126088 +:105D830042247E12601DEE24771265F1C333F0EED8 +:105D930024781265E71260D1EE2478126638126017 +:105DA300CB85168285178312663BEE247E1265F13E +:105DB300F50AA3E0F50B7404780A121FC9EE247EDA +:105DC3001265E7E50AF0A3E50BF07902AC08AD092B +:105DD300EE247512602E24751265E7C082C0838598 +:105DE3001482851583126658D083D0821260BB401B +:105DF300057928025B52EE247C1265F12401F50833 +:105E0300A3E01265D2E4F50AF50B1260CB88108982 +:105E130011E4F512F51378087910121CE9EE247ECB +:105E23001265F1F510A3E0F511781079081214DE6C +:105E33004005793B025B52EE2474126A18126A3AE7 +:105E4300E4F0A3F0025CB07402C0E07905AC08ADE5 +:105E5300097A7D7B05120C8DEAFCEBFDD0E0F9EEAF +:105E6300248112602E24811265E7C082C0838514C9 +:105E730082851583126658D083D0821260BB40039B +:105E8300025DF4EE248080B2EE24E21265F1701418 +:105E93007A0012604DC0E0126065D0E0F00AEAC3F8 +:105EA300940840EEEE24E31265F1A2E0EE401424E0 +:105EB300DE1265E7741AF0790DEEFAEFFB120C2D82 +:105EC300025CB012608C24E11266167908AC08AD4E +:105ED30009EE249C12604224A412603CAC08AD0974 +:105EE300EE249412603CEE2494FAEF3400FB120C7F +:105EF300997904AC08AD09EE24881260337904EE75 +:105F03002488FAEF3400FB120C99EE248CFAEF3458 +:105F130000FB120CABEE2484FAEF3400FB120CB13D +:105F2300900444E04480F07904808EEE24DF126A0A +:105F330018025E46EE12608C24D3126608EE24DD4E +:105F4300126A2624D4126608790B025EBCEE24E0A2 +:105F530080DC7A0012604DC0E0126065D0E0F00A88 +:105F6300EAC3940840EE7A008A82A882745628F520 +:105F73008274041265EAC082C0838508828509831E +:105F8300E0D083D082FBE05BC0E0126065D0E0121A +:105F93006084A38582088583090AEAC3940840C8FC +:105FA3007909025EBC126A2C700DEE24F61265E7C5 +:105FB300EAF07907025EBC850882850983E0C0E0C8 +:105FC300EE24EE1265E7D0E0F0880889097402C078 +:105FD300E0F9AC08AD09EE24EF126033EAFCEBFD07 +:105FE300D0E0F9EE24F112602E24EB126A2624EDA0 +:105FF3001265F16003025CB0790C025EBCEE24F51D +:10600300F8EF12661BE088828983F0EE24F41266AF +:106013001688828983E0F9025B5212602122FAEF2B +:106023003400FB120C8D8A088B0922126033EE2296 +:10603300FAEF3400FB120C8D221260217908221230 +:1060430060217902AC08AD09EE228A82A8827456D7 +:1060530028F58274041265F822E82508F8E934006B +:10606300F922EE28F8EF3400F9E824E3F582E91287 +:10607300661122850A82850B83E4126084E0640141 +:1060830022F085088285098322246212660EE412B7 +:106093006A49E4F0EE221265F52401F0A3E034002E +:1060A300F0221265F8250AF0A3E03400F02212660C +:1060B3005C85148285158322E0C398F8A3E099F9DF +:1060C300C3E894FFE9947F228516828517831266BD +:1060D3005CE8C333F8E933F9228A828B8312665C66 +:1060E300850E82850F83E8F0A3E9F0227F10022159 +:1060F3002353BFEF02012274E8122051900470E091 +:10610300F81266252420F50EEF3400F50FEE241C5B +:10611300F50CEF3400F50DEE241DF510EF3400F50A +:10612300119061D0E0600B851082851183E4F0A3A8 +:106133008030EE246A1265F17029EE24741265F141 +:106143007021EE24801265F17019850C82850D8310 +:10615300E06401700E850E82850F8312666DE8F090 +:10616300A3E9F0EE24071265CF8E828F83A3A3A346 +:10617300A3A312666D12664C240108E912661B1272 +:10618300663BEEFAEFFB120DA7E964016008900588 +:1061930084E06401701F851082851183E4F0A3F00D +:1061A3008E828F83A3A3A3A3A3E02401F8A3E01209 +:1061B300661B12663BEE2474126A2F60030263614E +:1061C300EE24751265D712227B8508828509831216 +:1061D30066678E828F83A3A3A3A3A312669F122451 +:1061E300ED7402121FF2E97003026361850A82856E +:1061F3000B831266A52477FCEF3400FDEEFAEFFB68 +:10620300120C6F1265E41260E0850C82850D83E445 +:10621300F0851082851183F0A3F0EE240F12661629 +:10622300850882850983126662240D1265F128F8B8 +:10623300A3E039F9EE240B1266388E828F83A3A371 +:10624300A3A3A3126667850A82850B8312669F1236 +:10625300252A8A088B09EE242E126699E4F50AF59D +:106263000B8A0C8B0DF50EF50F7808790C121CE9CF +:10627300EE24781265FE7808790C121E2585080C29 +:1062830085090D850A0E850B0FEE247EF516EF3476 +:1062930000F517851682F583126662247AF512EFEC +:1062A3003400F513851282F583126667EE2430F508 +:1062B3000AEF3400F50BEE24321265CFEA6C70025C +:1062C300EB6D7024850882850983E0687003A3E081 +:1062D300697015EE247C126699850A82850B83E02A +:1062E3006A7003A3E06B6031881489157404781411 +:1062F300121FBA78141222641265E412227BEDC3D2 +:1063030013FDEC13FC8E828F83A3A3A3A3E0FA7B7C +:10631300001209D57404121FF2EE24771265F1C03E +:10632300E0EE242B1265E7D0E0F08512828513831B +:10633300126662242E126638EE247C126655850A94 +:1063430082850B8312663B8516828517831266A5A9 +:10635300FAEFFB120C75EE2474126608800BEE2420 +:106363002E1265FEE4F50EF50F851082851183E08C +:10637300F514A3E0F515EE24121265CFEE241FF5F4 +:1063830012EF3400F513EE24181265D7780C1214AB +:10639300A37011851282851383E0F8E514687002F7 +:1063A300E51560237808122264EE24101265E712C3 +:1063B300227B7814122264AA0CAB0DAC0EAD0F1223 +:1063C300297E7406121FF2850A82850B83780C12CC +:1063D3001EBB851082851183E0851282851383F0AD +:1063E300AC08AD09126677906062E060077CC47DFB +:1063F3008E1266778E828F8312665888828983A372 +:10640300A3E82408FCE93400FD7406121EEF85108E +:106413008285118312669F8E828F83E02402F8A304 +:10642300E03400F9E8FCE9FD8A108B11E4F512F57C +:1064330013908F767810121E387810790C121CE99D +:106443008C828D837810121E4B908F367810121E1B +:10645300AC8C828D837810121E99900582E06401C2 +:10646300600302654F7901120E438E828F83E0F53C +:106473000AA3E0F50B908F62121ECAE50A240EF5FB +:1064830082E50B1265EA121ED6E50A2412F8E50B23 +:106493003400F9E8FCE9FD850882850983780C124C +:1064A3001EAC850C08850D09E50875F0E2A4C50846 +:1064B300A8F075F004A428F875F0E2E509A428F51E +:1064C300098C828D83E02508F0A3E03509F0EE24E2 +:1064D300161265F1F508A3E0F50974047808121F94 +:1064E300BAE5082401F8E509340012668C9060626D +:1064F300E08C828D8370030265A7E02410F0A3E093 +:106503003401F0EE240F1265F16016EE242B1265B0 +:10651300F1F875F071A4C8AAF075F002A42A126606 +:106523008CE50A2414F582E50B1265EA7410F08EEB +:10653300828F83E0241612664174F1F0A3740BF08A +:10654300EEFAEFFB12244F79000260EF908F86780A +:106553000C1214FE500302646DEA4B600302646D77 +:10656300780C122260EEFAEFFB120C7B7404121FFC +:10657300F2E96401600302646DEE240F1265F160B9 +:10658300128E828F83A3A3A3A3A3E064057002A347 +:10659300E0600479088002793EEEFAEFFB120C63A7 +:1065A300790180A5E02410F8A3E034FFF97A717B28 +:1065B30002121F5188088909EE242E126655C3E57D +:1065C3000898E50999500302650680C7F508EF347A +:1065D30000F50922F50AEF3400F50B850A82F583ED +:1065E30022EE247CF582EF12661122EE24671265F7 +:1065F300F522F582EF3400F583E0221265F5F50C00 +:10660300A3E0F50D2212660EE4F022F582EF3400CA +:10661300F58322126A1CF0223400F9850882850969 +:10662300832275F004A4C8AAF02AF9747228FE74B0 +:106633000439FFEE2212660EE8F0A3E9F022F8A374 +:10664300E03400F98882898322E028F8A3E039F94D +:10665300E82212660E12665C22E0F8A3E0F9221229 +:10666300665CEE22E0FCA3E0FD2212665C851082EC +:106673008511832212667E1228B8228E828F83E0D0 +:106683002402FAA3E03400FB22F98C828D83E028F4 +:10669300F0A3E039F022F582EF126611E0FAA3E0ED +:1066A300FB2212665C850882850983E8F0A3E9F082 +:1066B300EE2274E8122051EAFEEBFFEE24DFF51020 +:1066C300EF3400F511EE24E0F50EEF3400F50FEE94 +:1066D3002462F516EF3400F517EE2483F50CEF343E +:1066E30000F50DEE241DF512EF3400F513EE24042E +:1066F300F50AEF3400F50BEE246A1265CF8039906A +:10670300044CE07003026952EEFAEFFB120C33EE15 +:1067130024A4F514EF3400F5157814122264EE2442 +:106723009CFCEF3400FD850A82850B83E0FA7B0035 +:106733001209E17402121FF2EE246F1265F1606A0E +:10674300EE246B1265F124FE602F24FE606014605A +:106753007414700302687A147003026A0624FE70CC +:106763000302696924FE70030268E6147003026978 +:106773009014700302692980BF850882850983E02C +:106783006401701790044BE070030269527916EEAE +:10679300FAEFFB120C6379010260EFEEFAEFFB12E2 +:1067A3000C21E9850882850983F0790080EA850850 +:1067B30082850983E064017003026702EEFAEFFB4E +:1067C300120BF780DD850882850983E06401704739 +:1067D30090044CE06027850C82850D837401F09052 +:1067E3008F42121ECAEE24D51265E7121ED6908F71 +:1067F30042121ECAEE24D91265E7121ED6851082F4 +:10680300851183E0640160030269527906EEFAEFB1 +:10681300FB120C3902673BEE24D3126A2F701CEE75 +:10682300FAEFFB120BFDE9640160030267AD85100B +:1068330082851183E4126A350267ACEE24D41265B3 +:10684300F170030267ADEE24B3F514EF3400F515D0 +:106853007814122264EE248CFCEF3400FDEE24C382 +:10686300FAEF3400FB120CBD7402121FF2EE24D3B4 +:10687300126A18F002673B850882850983E0640188 +:10688300705790044CE07003026952126A67EEFA83 +:10689300EFFB120C338516828517837401126A424B +:1068A300850A82850B83E0FA7B00EE24DD126A2FD2 +:1068B300700779001209ED80077C0179001209E75E +:1068C300EE24DD126608EE24E11265E7E4126A3A6B +:1068D300F0851082851183809AEEFAEFFB120C0388 +:1068E3000267A5850882850983E064017015850E1A +:1068F30082850F83E064017056EEFAEFFB120C33CE +:1069030002673BEEFAEFFB120C09E9640160030234 +:1069130067AD850E82850F83E4F0850C82850D8338 +:10692300126A35026876850882850983E0640170FE +:106933002B90044CE06012850C82850D83E4F08576 +:10694300168285178304126A4290044BE070AA12E0 +:106953006A7C60030267AD7922026792EEFAEFFB6D +:10696300120C0F0267A5850882850983E064017014 +:106973001290044CE060D8EE24E2126616126A67A5 +:106983000268FCEEFAEFFB120C150267A58508827C +:10699300850983E06401705C126A2C702DEE24EC8F +:1069A300126A2F60030268FCEE24F11265E71222DB +:1069B3007BEE24EF1265E712227B126A55790012EF +:1069C30009DB7404121FF20268FC126A7C60030282 +:1069D30067ADEE24F11265E712227BEE24EF126518 +:1069E300E712227B126A5579221209DB7404121F03 +:1069F300F202695AEE24ED126A26FAEFFB120C1B1F +:106A03000267A5EEFAEFFB120C27E96401600302AB +:106A130067AD0268FC126A1C22F582EF3400F5832D +:106A2300740122126A1CF0EE22EE24EB1265F56467 +:106A330001221260840422F0850E82850F832212C4 +:106A43006A497401F022F0EE2468F582EF3400F510 +:106A53008322EE24EE1265F5FC850A82850B83E022 +:106A6300FA7B0022EE242012660E12665C851282E7 +:106A7300851383E8F0A3E9F022EE2472F8EF3400E3 +:106A8300F988828983E024FFF0A3E034FFF0888251 +:106A9300898312665CE84922C082C0838A828B8321 +:106AA300A3A3A3A3A3A3A3126658EA240BF582EB23 +:106AB30012669CC3EA98EB995014E8C39AF8E99BD1 +:106AC300F9C3E894AAE99410501479018012EAC337 +:106AD30098F8EB99F9C3E894ABE9941050EC79007A +:106AE300D083D082020122740E121FF27F0402218E +:106AF3002374F012205174CC121FDC8C0A8D0B749A +:106B030044122045E0FE7420122045AC82AD83750B +:106B1300838E7582E27406121EEF7420122045AC38 +:106B230082AD8312121BE9F508C3940A4003026C79 +:106B33005875F006E9A4F5097426122045AC82AD18 +:106B4300837A0E7420250912769F700974321220FD +:106B530045E0FF80027F009010CAE0640270047475 +:106B6300018001E4F50D780D122268EEFDEFFCA91A +:106B730008AA0AAB0B12129F7401121FF27C147D38 +:106B8300007900740C122045AA82AB831210D774CB +:106B93000C122045AC82AD837A1074242509127639 +:106BA3009F70377C1079FF740C1220451273CC70E0 +:106BB30029741C122045AC82AD837A0474252509FF +:106BC300F91213D7740C122045AC82AD83EFA2E007 +:106BD300E433F9AA0AAB0B1206638518828519837D +:106BE300AC82AD837A0C7470250812769F7055853C +:106BF3001882851983AA82AB8312124B750800E5AC +:106C03000875F003A4F8A9F0851882851983E58235 +:106C130028F8E58312740812721DEC4D601D8882FA +:106C23008983A3A3E0F50E750F00780E122264AAE0 +:106C33000AAB0B1208C17402121FF20508E508C360 +:106C4300940440BBEFA2E1500C9008AAE0F9AA0A11 +:106C5300AB0B1208C774046E702A9010CAE064026A +:106C630070229008BEE060047A0180027A009008E6 +:106C7300ABE06004780480027800E84AF9AA0AAB22 +:106C83000B12072379007434121FF27F08022123A9 +:106C930074F0122051EAFEEBFF8C088D09750A0A85 +:106CA300E9600C14600914602E14607F026D3912C0 +:106CB300125DE9F50AC3940A507CE508450960763C +:106CC300750E06750F00780E122264EEFCEFFD12AE +:106CD30075E3121FF2805F750B00750E06750F00CA +:106CE300780E122264EEFCEFFDE50B75F00EA4F8AE +:106CF300A9F074CC28FA740839FB1210D17402126B +:106D03001FF2E9601B850B0AE50AC3940A5027E5C5 +:106D13000845096021AA08AB09A90A12125780166F +:106D2300050BE50BC3940A500D80AF121263E9F50E +:106D33000AC3940A40D9A90A026C8E74F412205132 +:106D4300890875091574FF6A700374FF6B70277ED9 +:106D530000AC087A027B00EEF9121239E960037580 +:106D630009000EEEC3940A40E8E50860497A8D7B7A +:106D730012120AD78040120AB98A0A8B0BAE0AAFE5 +:106D83000BEE4F602E7C007D00EE2405FAEF3400FD +:106D9300FB8E828F83126E35500CAC087A027B0017 +:106DA300121239750900E508600CEEFAEFFB1212B6 +:106DB3008D8003750914A909026AEF74F212205138 +:106DC300ECFEEDFF740E1220451272107508157457 +:106DD300FF6A700374FF6B7021750900AC0AAD0B79 +:106DE300EEFAEFFBA90912123FE9600375080005EB +:106DF30009E509C3940A503580E2120AB98A828BE5 +:106E030083E582458360237C007D00E5822405FAC7 +:106E1300E5833400FB126E355013AC0AAD0BEEFA6A +:106E2300EFFB12123F7508008003750814A90802CE +:106E33007C0EA3A3A3A3E0F912121BE9C3940A22B5 +:106E4300C082C0839008C4EAF0A3EBF09008AAE0E4 +:106E5300FC7D007A257B001205D99008AAE0F9127F +:106E6300083DD083D08202012274EA12205174ECCF +:106E7300121FDCEAFEEBFFEE240CF514EF3400F5F1 +:106E830015EE240AF510EF3400F511EE2405F50E86 +:106E9300EF3400F50FEE2409F50AEF3400F50BEE9D +:106EA3002403F508EF3400F5098E828F83A3A3E052 +:106EB30024FA70030271D924FD700302710814705F +:106EC30003026F5714601024FD70030270D914700D +:106ED3000302713D0271F712723C604AE0F5838848 +:106EE30082127223880C890DE8450D60398514825E +:106EF300851583E0F50E780E122268EE240BF582D9 +:106F0300EF3400F583E0F9850A82850B8312721D45 +:106F13000A0A0AAB09850C82850D8312204F74017E +:106F2300121FF20271F7850A82850B8312227B906E +:106F330008C0121ECA1206757402121FF2E970030A +:106F43000271F77901850A82850B83127A3312065F +:106F53006F0271F78E828F83A3858212858313E07C +:106F630060030270B2850E82850F83E0A2E04003C6 +:106F73000270B27C0E7D007900851882851983AA80 +:106F830082AB831210D7EE2408F50AEF3400F50B19 +:106F9300850A82F58312723F6019750C06750D0020 +:106FA300780C122264850A82850B83E02410FCA3EB +:106FB300E0801A127201EA4B70030271F7750C0636 +:106FC300750D00780C122264EA2405FCEB3400FDF5 +:106FD3007402122045AA82AB831275E7121FF28551 +:106FE3000E82850F83E0A2E25004D2F08002C2F049 +:106FF300A2F0E433F8740C122045E048F0851082C7 +:1070030085118312723F6015851082851183E024F8 +:1070130010F8A3E03400F9888289838003908F629B +:10702300780C121EAC85108285118312723F600F9B +:10703300851082851183E0F510A3E0F511800675B4 +:107043001000751100850A82850B8312723F600B55 +:10705300850A82850B831272108006750A00750BF0 +:1070630000780C1222607810122264780A122264CB +:1070730085148285158312227B8E828F83A31272DD +:1070830018740A122045AA82AB83121251740A1291 +:107093001FF2850882850983127223900954E8F050 +:1070A300A3E9F07A017B009008AAE0F91211131208 +:1070B300723C70030271F712722970030271F78533 +:1070C3001282851383E0FC7901127A2D8E828F83DD +:1070D30012204F0271F712723C70030271F7E0F550 +:1070E300838882A3A3127223890BE8450B700302E2 +:1070F30071F78E828F83A3E0FC7902127A2D888246 +:10710300850B8380CB7C007D00EE2404FAEF3400F2 +:10711300FB850882850983E0F912121BE9F8C39401 +:107123000A40030271F7AC10AD117A0475F006E85A +:10713300A42425F91213D10271F79008BFE0600E61 +:107143009010CBE0F9850882850983026F4E901079 +:10715300CAE07004790580ED1272018A0C8B0DA8C8 +:107163000CA90DE82404F50CE93400F50D8E828F8B +:1071730083A3A3A3A3A3A3A3E0A2E05036E849609B +:1071830073850C82850D83E0FE6028850A82850B5A +:1071930083E05410701D740E122045AC82AD83E859 +:1071A3002405FAE93400FBEEF912121BE9700479A5 +:1071B300038092AC0EAD0F850C82850D83E0F9122E +:1071C3007A2D12129912723C602A12722960257C60 +:1071D3000079000270CC12073BE97018900953E064 +:1071E30064017008121275900953E4F07950121378 +:1071F300DD1212697414121FF27F0E022123850817 +:1072030082850983E0FAA3E0FB120AB922E0F50ABA +:10721300A3E0F50B22A3A3A3A3A3E0FCA3E0FD2219 +:10722300E0F8A3E0F922E0F5838882A3A3E0F8A3C2 +:10723300E0F9E8FEE9FFEE4F229008C4E0F8A3E08E +:10724300F9E8492274F412205174F2121FDCEAFEA9 +:107253008C0B75F006E9A42420F50885188285199E +:1072630083AC82AD837A0E12769F704A7C061273CA +:10727300C47043740C122045127223E8F509E50B20 +:107283006005EE42098004EEF45209850982AA8260 +:10729300E86A7001E9601B740C122045EAF0A3E46C +:1072A300F0851882851983AC82AD837A0EA9081202 +:1072B30013D1790180027900026AEA74F212205133 +:1072C30074E6121FDC890A8A088B09ECFEEDFF7451 +:1072D3000C12204512769260030273787C0679FFC4 +:1072E300740C1220451273CC6003027378747025FA +:1072F3000AF50B851882851983AC82AD837A0C124B +:10730300769F60030273BD851882851983AA82ABB9 +:107313008312124BE508450970217C0C7900127326 +:10732300C660030273BD7C0C7D00790085188285DD +:107333001983AA82AB831210D780618518828519BD +:1073430083AC82AD83AA08AB091212458A0C8B0D5C +:10735300A80CA90DE849702CEE4F60198518828599 +:107363001983AC82AD837A007B00121245EAF8EBF5 +:10737300F9EA4B70047900804388828983E508F039 +:10738300A3E509F0127444FAEE6A7001EF602BEE84 +:10739300F04F700888828983E4F0A3F08518828512 +:1073A3001983AA82AB8312124B851882851983AC89 +:1073B30082AD837A0CA90B1213D17901741A027C62 +:1073C3000B79FF851882851983AA82AB8312113743 +:1073D300E92274F71220517F00EF75F003A4F8A996 +:1073E300F0EC28F8ED127408E06A7003A3E06B7008 +:1073F30006E8FAE9FB800B0FEFC3940440DB7A0045 +:107403007B0002773D39F9888289832274F7122041 +:10741300517E00EE75F003A4F8A9F0EA28F8EB1208 +:107423007408E0F4FCA3E0F4FD88828983ECF0A304 +:10743300EDF0127444F4F00EEEC3940440D50277D9 +:107443003DE82402F582E93400F583E02274EE126C +:10745300205174F4121FDCEAFEEBFF8C0A8D0B74CF +:107463001E122045E0F50CA3E0F50D742012204513 +:10747300E0F508A3E0F5097422122045E0F510A316 +:10748300E0F511EE4F7005790A02757512125DE988 +:10749300F50EC3940A4023750F007C0679FFE50FB0 +:1074A30075F00EA4FAABF074C62AFA74083BFB120B +:1074B30073D0700302757F850F0EE50EC3940A40E7 +:1074C3000302757375F006E50EA4F50FEEFCEFFDF0 +:1074D3007A0E7420127590E50A450B600BAC0AAD69 +:1074E3000B7A1B7421127590E50C450D600BAC0CE7 +:1074F300AD0D7A1B7422127590E5084509600BAC3B +:1075030008AD097A107423127590E5104511601BBC +:10751300AC10AD117A1074241275907424122045A6 +:10752300AC82AD837A0474251275907C0C7D00794E +:10753300FF127C9C7A0C7470250EF91213D1750816 +:107543000E7509007808122264EEFCEFFDE50E7556 +:10755300F00EA4F8A9F074C628FA740839FB127562 +:10756300E7121FF2900952E060031212A512129360 +:10757300A90E740C121FF27F0A022123050FE50FD7 +:10758300C3940A500302749D750E0A80E3250FF914 +:107593001213D12274F412205174F2121FDCEAFE8A +:1075A300EBFFE9C3940A5004EE4F70047902802D77 +:1075B300851882851983127692F508701E750A065E +:1075C300750B00780A1222647402122045AC82AD56 +:1075D30083EEFAEFFB1275E7121FF2A908026AEABB +:1075E300AA08AB091210BF74022274F4122051EAE4 +:1075F300FEEBFF750800750A06750B00780A122268 +:1076030064EEFCEFFDE50875F00EA4F8A9F074C66E +:1076130028FA740839FB1210D17402121FF2E960C0 +:1076230004A908800B0508E508C3940A40C8790A31 +:10763300026AEF74F712205174F0121FDCEAFEEBBA +:10764300FF750800851882851983AC82AD837A1093 +:1076530075F006E508A4242312769F701F7C101290 +:1076630073C47018EEFCEFFD851882851983AA8216 +:10767300AB83120645E97004A908800B0508E508E9 +:10768300C3940A40BF790A7410121FF202773DAC0B +:1076930082AD837A0E75F006E9A42420F91213D77C +:1076A300E92274F7122051750800E50875F00EA45D +:1076B300F8A9F074C628FE740839FFEEFCEFFD7AD2 +:1076C3000E75F006E50812769C602C7C067D007929 +:1076D300FFEEFAEFFB1210D77C067D0079FFEE2454 +:1076E30006FAEF3400FB1210D7EE240CF582EF34C8 +:1076F30000F583E4F0A3F00508E508C3940A40AA63 +:10770300900952E060031212A5121293802C74F7B1 +:107713001220517E007F007C0679FFEF75F00EA4E6 +:10772300FAABF074C62AFA74083BFB1273D07001EB +:107733000E0FEFC3940A40DFEEF97F010221237499 +:10774300F71220517E00EEF912127B0EEEC3940A5B +:107753005003E960F180E374F312205174CB121FDC +:10776300DCE9FF75F006A4F50874202508FE7427EC +:10777300122045AC82AD837A0EEE12769F6003022F +:10778300785C7C0679FF74271220451273CC600362 +:1077930002785C7C0E7D0079FF7427122045AA8253 +:1077A300AB831210D77C1B7D0079FF740C1220452C +:1077B300AA82AB831210D77C0C7D0079FF851882D7 +:1077C300851983AA82AB831210D77427122045AC84 +:1077D30082AD837A0EEEF91213D1E9F509740C1216 +:1077E3002045AC82AD837A1B742112786BFE740C36 +:1077F300122045AC82AD837A1B742212786BF50A92 +:10780300740C122045AC82AD837A10742312786B0A +:10781300F50B740C122045AC82AD837A10742412DC +:10782300786BF50C740C122045AC82AD837A04742A +:107833002512786BF508851882851983AC82AD8390 +:107843007A0C74702FF91213D1E9F8EE450A450B3F +:10785300450C45084842098003750900A909743598 +:10786300121FF27F050221232508F91213D1E92201 +:1078730074F7122051E99008AAF012126902773DB9 +:1078830074F212205174FB121FDC8A088B09EB542B +:107893008070030279279008AAE0F91210FB8A0A84 +:1078A3008B0BA80AA90BE8FEE9FFE849606CEE24FC +:1078B30004F8EF3400F98E828F83E024506038148B +:1078C300600624E1604A804B88828983E070448E9D +:1078D300828F83A3A3A3A3A3A3A312227B8E828F4E +:1078E300831272188E828F83A3A3127A3312122704 +:1078F3007402121FF2801C88828983E0641E701355 +:1079030079008E828F83A3A3127A3312122180030C +:10791300121233EEFAEFFB1210E9AA08E5096480AC +:10792300FB027A28EAA2E04003027A249009541267 +:107933007210740312204585820C85830D780C1216 +:107943002264750C02750D00780C122264750CB953 +:10795300750D8F780C1222647CFF7DFF7A017B000A +:107963001207957406121FF2027A0CE4F50CF50D5A +:10797300780C122264740412204585820C85830DD1 +:10798300780C122264740412204585820C85830DC1 +:10799300780C122264740912204512227B7902EEBC +:1079A300FCEFFDAA0AAB0B1208B57408121FF2E92B +:1079B3007035851882851983E0FA7401122045E039 +:1079C300F9EA2400F50CE439F50DEA450D60187861 +:1079D3000C1222648E828F83127219AA0AAB0B12C5 +:1079E30012277402121FF2E4F50CF50D780C122223 +:1079F30064740512204512227B7CFF7DFFEEFAEFB3 +:107A0300FB1207A17404121FF28A0C8B0DAE0CAF8C +:107A13000DEE4F600302796EE5086401FAAB09804D +:107A2300047A007B007405027C0B85088285098338 +:107A3300E0FAA3E0FB22C082C0839008AAE0F98A9F +:107A4300828B83A3127A331208C7026E65C082C089 +:107A53008374FF121FDC12126FE9C394028518822C +:107A6300851983400474028002740AF0AC82AD83EA +:107A73007A0179051207537401121FF2026E6574BD +:107A8300F212205174E8121FDCEAFEEBFF890A8C24 +:107A9300088D097C187D007900127CA4EEF0A3EF19 +:107AA300F09008ACE0C0E07402122045D0E0F09002 +:107AB30008ADE0C0E07403122045D0E0F09010CD93 +:107AC300E0C0E07417122045D0E0F0741512204591 +:107AD300E054FEF8A3E0F99010CCE0A2E0E433FA1E +:107AE300E84AF87415122045127C1AA2E15004D218 +:107AF300F08002C2F0E854FDFAA2F0E43333F8EA6E +:107B030048F87415122045127C1AA2E35004D2F0EF +:107B13008002C2F0E854F7FAA2F0E433F50C750DD5 +:107B2300007403780C121FC9127C13122045127CB7 +:107B33001AA2E45004D2F08002C2F0E854EFFAA291 +:107B4300F0E433F50C7404780C121FC9127C131281 +:107B53002045127C1AA2E55004D2F08002C2F0E85C +:107B630054DFFAA2F0E433F50C7405780C121FC944 +:107B7300127C13122045127C1AA2E25004D2F08028 +:107B830002C2F0E854FBFAA2F0E433F50C74027875 +:107B93000C121FC9127C13122045E8F0A3E9F090E0 +:107BA30008ADE0601B750C10780C1222647CAE7D6E +:107BB300087406122045AA82AB831275E7121FF2DE +:107BC3009008BEE06011E50A60097415122045E0D3 +:107BD3004402F07801800278007414122045E048D2 +:107BE300F09008ABE060047804800278007414120B +:107BF3002045E048F0AC08AD09851882851983AAB1 +:107C030082AB831206697418121FF27F06022123C6 +:107C1300EA450CF8741522E8F0A3E9F09010CCE0E3 +:107C23002274F312205174E5121FDCEAFEEBFF8C81 +:107C3300098D0A7428122045E0F50C75F006E9A4B5 +:107C4300F87408650A700474228002742128F50B05 +:107C53007C1B7D007900127C9C7A1BA90B1276A0F9 +:107C63007032741A122045E024F9C3940A5025E5B2 +:107C73000CF50B780B1222687401122045AC82AD0F +:107C830083E509A2E0E433F9EEFAEFFB12067B7415 +:107C930001121FF2741B027863127CA4AC82AD83C1 +:107CA30022851882851983AA82AB831210D785187F +:107CB300828519832274F71220511209397508003D +:107CC300E50875F00EA4F8A9F074C628FE74083907 +:107CD300FF7C0679FFEEFAEFFB1273D07009EEFA20 +:107CE300EFFB790012093F0508E508C3940A40D069 +:107CF30002773DC082C0839003F574FFF0A3F0A325 +:107D0300E4F0900415F0A3F0FAEA127FDFE4F0A3A5 +:107D1300F00AEAC3940C40F1027EC274F7122051B8 +:107D23007E00EEC333F8E433F9741728F87404398A +:107D3300F988828983E0FCA3E0FDEC4D700D888215 +:107D43008983EAF0A3EBF0790080090EEEC3940C6B +:107D530040D079137F0102212374EC122051890C46 +:107D6300EAFEEBFF8C0D8D0E7414122045E0F51026 +:107D7300A3E0F5117416122045E0F50AA3E0F50B14 +:107D8300120AB98B09EA450960057911027E157A51 +:107D9300FF7BFF120AB98A088B09EA450960718AD9 +:107DA300828B83A3A3A3A3E50EF0751206751300BC +:107DB3007812122264AC10AD11EA2405FAEB3400F8 +:107DC300FB1210BF7402121FF2850882850983A378 +:107DD300EEF0A3EFF0850882850983A3A3A3E50D45 +:107DE300F0850882850983E50CF0E5082421127FDC +:107DF30079E4F0A3F0E508240B127F79E50AF0A3F8 +:107E0300E50BF07900EEFAEFFB120ADD7900800250 +:107E130079157F0C02212374F6122051120AB98AB4 +:107E2300088B09AE08AF09EE4F60498E828F83A39A +:107E33008582088583097901127E7CEE2421F582EF +:107E4300EF127F7DE0FAA3E0FBEA4B6003121155CA +:107E53007C237D007900EEFAEFFB1210D7850882B0 +:107E630085098374FFF0A3F08E828F83A3A3A3E419 +:107E7300F0F980027902027EF4E0FAA3E0FB120A31 +:107E8300DD22C082C0839003F5E06A7003A3E06B38 +:107E930070067AF47B0380047A007B008021C08221 +:107EA300C0839003F5E0F47003A3E0F4600D900346 +:107EB300F4E06970067AF47B0380047A007B00D0D7 +:107EC30083D08202012274F6122051E9FE74FE6A05 +:107ED300700374FF6B700479018016120AB98A82E9 +:107EE3008B83E58245836007A3A3A3E05E70E879F3 +:107EF300007F02022123C082C08379009003F7E050 +:107F030060010980BA74F4122051EAFEEBFF89087C +:107F1300120AB9EA4B701274FE6E700374FF6F702D +:107F2300047900804C79148048EA2421F582EB120D +:107F33007F7DE0F8A3E0F9EA2403F582EB127F7D6D +:107F4300E849700FE0A2E4500654126410701179EE +:107F530005801EE0A2E150F7A2E44004790F8011EE +:107F6300E8241AF582E9127F7DE0C3950850B279BF +:107F73000C7F04022123F582E5093400F58322C036 +:107F830082C083EAF8EBF9E84960179003F5E0F45F +:107F93007003A3E0F4600B7AF47B03888289831275 +:107FA300204F027EC274F6122051EAFEEBFF8908CD +:107FB300750900E509127FDFE0F8A3E0F9888289FB +:107FC30083E58245836009A908EEFAEFFB12204F8F +:107FD3000509E509C3940C40DA027EF4C333F8E4DF +:107FE30033F9741728F582740439F58322C082C0EB +:0D7FF300839009C0E0F9D083D08202012202 +:10800000033F0000030004280D9808900790019496 +:10801000011B0195111B08F00939821F0EA4FECD2A +:1080200082210622FB381818162118F0EF3818F2B2 +:10803000ED3828F2EB3868F003392A1FE73F08F0E3 +:108040000428C33868F0393C08F1053C88F1173C36 +:10805000A8F10E3CE09F2C1F0128104A291FD63F93 +:1080600015D0033827D0093800900428A83F0128EC +:10807000154101980128014A25D01F38041F831F8C +:108080000EA4FECD042205381421202807A0083FA5 +:108090000628711527D0E939202807D0F238832126 +:1080A00078F10238042188F1083D0628A14001F04A +:1080B00004288D38042807A00528561528F1163CF9 +:1080C00068F1143D77CF1240599202D80F3912D07F +:1080D0000739699222D00439799242D004380528B0 +:1080E000F8151E3FC09F0428753F08F1233C88F116 +:1080F000203D094028F1103D4540F7C759F2083DA1 +:108100009303131183E1B9F00F3C23E00D3F09D82D +:10811000EA38F9C30B3F68F1033D59F2F23C09D844 +:10812000F9390528C6150528F91501900128214AB5 +:10813000051F48F00C3C08F10A3868F1033C98F13F +:1081400006390C96062802150228843F47A00C9693 +:108150000528FC15531F0528EC1507288CED05286C +:10816000F51501280195711B01280CE40528EE1571 +:10817000511F88F10B3808F1073868F109390128D7 +:10818000214201F00B3947D009383521063F28F14B +:10819000033838F10339351F341F04280CE047D069 +:1081A000033903280CE80528D115571F28F0063895 +:1081B000561F811F021F38F0063930215B900528B9 +:1081C0004415FD3F88F1033D0528001505288A1553 +:1081D00047D0133808F10F392C470CF00C38C40382 +:1081E000B4125C110C3E04F00A38C103802801A0CF +:1081F000411B063F3021043F07284CED4C1B5B9090 +:1082000047D0173827D00328F1390EA4FECD02221B +:108210000D39002208381021002914E00328E63C1B +:108220004C1BF13F0528A715EE3F46181221033FCE +:1082300005280B1588F1303905281A150128FB414E +:10824000302100291BE00A3D0428FF1505281015E0 +:10825000F6C35192166A3B906B080428F615052860 +:1082600007150BF0FB3917D004382D1F0128C43F28 +:108270000328214701F008390328314701F0043968 +:10828000A2958090033FC29500920328BF15201B42 +:1082900054900128B33F08F10539052111900128B8 +:1082A000214A38F103390021023F302110216A03AD +:1082B0000428CB156B033141224128F1093D02F01E +:1082C0000239F29101F00B39FF28F191083F02F0D9 +:1082D0000239529201F00339FF28F193F7CB1B06C4 +:1082E000023907A4B20C073D47D003287738249001 +:1082F00003287E3F1690B6080428BA15A603042862 +:10830000B7153BE0F7CE28F1703C012807A0F090AC +:10831000A00668F1323D149030F0053938F1032899 +:108320006738073F50F00328633958F10328603855 +:1083300038F104380328B415033F032892150328A5 +:108340007E15012807D0033907A1563F424130F07E +:108350000C3907A112D0033807D84E3887A0C14086 +:1083600041D04A38F7CE483F38F1033822D044385C +:1083700007D8423907A1403F78F1123847D02D384D +:1083800000F0033860F00639C14011D0073887A0EB +:10839000113F10F0033820F0AB3977CF0B3F00F0DE +:1083A000033810F0A539414181D00439032859150B +:1083B000093F0328751568F10539414141D002395B +:1083C00007B810F0063903283A15012807D00338FA +:1083D00007D8123907A1103F40F0032805390328B8 +:1083E0001D1507D8F838083FA10383403112310525 +:1083F00011D0023907A14BF0063C042826150428A9 +:108400003715FA3F042821151BF0FD3D38F10338DC +:108410000328AA15F7CD0328214701F005390328C1 +:10842000314701F0033807A2F7CE224082D00A3844 +:10843000060304281D1506937606261196040428C3 +:10844000171571034112002871C021070438E7CFC6 +:108450004198043F17D0043951980728214817D074 +:108460000538F295202800901D3F07D20438C295A8 +:108470000092183F07D10438D2950094133F07D4D7 +:108480000438E29500980E3F809028F10A3D319023 +:10849000A10631F0063903A4B2950228B31500A154 +:1084A000A2950228AF15201B28F1633D08F10A3977 +:1084B000012807D00739072851411128C14A01284E +:1084C00007A017D20539E3CF8AD0023813A007D20C +:1084D0000539B3CF4AD0023843A083D01E393103C7 +:1084E0001112310521D00739319907282148002977 +:1084F00015E0133F529502288515454003D10D39EB +:10850000429502287F15281F21990728214803D268 +:10851000043862950228761573CF834808F109392B +:1085200077CF17D0063907D203390AD1023887A08E +:10853000349007D2073807D803383090543F07A843 +:10854000023FF7C718F15A3927D04C39314011D0C2 +:10855000493987D0073917D0453907D203390AD1AD +:10856000413805F04B39414001F0483850903B3FCD +:1085700068F1153878F13938149017D03D3907D2A1 +:108580003D3987D003383490393F07D137391190BE +:108590000128214A409003287715253F47D01C38F1 +:1085A000249007D30C3911900128214A87D008382C +:1085B0005144002911E0043A514C023877CF17D0CA +:1085C0001B3987D003383490193F07D31739C1407E +:1085D00021D01438073F17D00F3907D30338309014 +:1085E000023F009044900A3F249017D0053907D3EA +:1085F00005393490033FA09F44900221C190511B44 +:108600008121342124F0083927D004390C9CFD2B1A +:10861000AE3F10904490B7CF34F00E395321032869 +:10862000E195711B541F0F28CC9506282141F1C0FC +:1086300081111C09143F0190511B0728F19F711BE8 +:10864000802114F001288F3854F0FD2B0A380128BE +:10865000B63F541F03286D151028CCED032876155E +:1086600076217821501F0128A29A217001B2218021 +:1086700001B221802CE30328691574210128ACE4A0 +:1086800008F1073C88F1033D0228A01503282A15AC +:10869000011F0128349D03285915201F002168F06F +:1086A000093D069058F003390728364102289C15E9 +:1086B000FA3F0728504078F10439331F321F042154 +:1086C000500000DC0128853828F1103D8340F7CBAD +:1086D00031031112310521D0033903D1033900D8F8 +:1086E000103807A41B901A90163F00D80128713942 +:1086F00098F107394B700128E2412B0800288E3F82 +:10870000102807A04B701BF0FC2BED3C4A70224157 +:1087100028F1303D02F00239F29112E0B20CFC2B4C +:10872000E23C419031061111FF2BE29F32045200CE +:1087300022111A042A043240002862C018F10339B9 +:1087400027D00D3922F0093907280141B109002944 +:1087500021E0093A0AA1073F42F00339FACE033F6C +:1087600062F0F93818F1253977CF0AD1223887A07D +:10877000203F02F00239529212E0B20CFC2BB33CC3 +:1087800068F1123D38F1153887D01339012831428C +:1087900001F00F38402807A00728914231C0C1A03E +:1087A0000728914A063F02280190710621121A04F7 +:1087B000FF2BF29FB2084BE0A603022815152603F3 +:1087C0000228121568F1293CFBF0273C62904670A4 +:1087D00002280A15D2370428609662904670062D4A +:1087E00002280215C23778F11839D04000D8153860 +:1087F000DBF0133C829046700128F615D2377644A0 +:1088000000D40338060E023F060D41700128EC1516 +:10881000417086120128E8153290B20C053D467071 +:108820000128E215FB3F08F1063941721128C14ABF +:10883000012807A0EF28F7CF28F11E3D8340309094 +:10884000A00631031112310521D003398295043F6E +:1088500030F0043972950028D51553C843D002383A +:1088600023A007D4023803A130F0023903A28348C1 +:1088700092950028C71506900BF005380128B4150D +:10888000591FFB3F0EA4FECD0122043902287315A7 +:10889000FA3F551F1121031F249008F10F390AD107 +:1088A000033987D02438314011D0213905F02139DE +:1088B000414001F01E3850901B3F48F1073828F125 +:1088C000033858F1063987D0143877CF1490113F08 +:1088D00078F1053911900128214A093F98F10939A9 +:1088E000829500289315281F5490033F00904490D0 +:1088F0000EA4FECD0322043902283D15FA3F1321B0 +:108900002C1801210321741FD1900000F13724F0AD +:10891000093800000190511B0728F19F711B80212D +:10892000063F4190511B0328E195711B3221072816 +:10893000914231C00728914ABF28F7CF28F1063C61 +:1089400088F1043D92955E15281F44F0383814F0E4 +:108950000A3854F0FB2B853801280CE40128F61561 +:10896000FB2BF93F01289015009027D0283902D819 +:10897000083838F12439329001289215E237193F2E +:1089800019E089F2043C38F11A39599238F1033967 +:108990000128861512409103002951E2120E12D0CF +:1089A000F038012886150128B915124001289115C3 +:1089B0003199072821482C18FE2B4C3F0128104ADA +:1089C0000028A915FB2B223FF09F043FD09F023FB8 +:1089D000B09F0028D0152C1FF23F28F1053C68F10C +:1089E000033D1490053F2090023F10904490419821 +:1089F0000728214838F1FE2B01380028B515FD2B3A +:108A0000FD3F217011E0218002000128214107284B +:108A10002148217811E021880200F7C776157103FB +:108A20003112A10501D4023907A804286496311532 +:108A30000238F7C70428C4F6FB3C0200FE28F7CF33 +:108A4000641551417111A10501D80339012807A00E +:108A500064911F150338FE28F7CFC4F1FB3C0200D8 +:108A6000F7C753155141022807A00AD40339FD283E +:108A7000F7CF5111A10501D4023907A8C4910428E8 +:108A8000659607150238F7C7563124F2FB3C020001 +:108A90000028DB150028EC15412D160C0200F7C745 +:108AA0003415D032D332234268F109394141904024 +:108AB00041D0043850000306023F0303314202282C +:108AC00007A00AD404395100FD28F7CF13064492B9 +:108AD000042865960028B9150028CA155631FF28C4 +:108AE000E19F4070060C023813068EA0810064E0FE +:108AF00044F5F83C0029F4E2A4F2ED3C03F002381E +:108B000007A8D32FD02F02009BF0023C020007A140 +:108B10002DE0020098F10938102807D0033908F138 +:108B2000043831990728214808F10C39012807D069 +:108B30000938072851411128C042010C0338072881 +:108B400050491190082807D005380628B148F72861 +:108B5000F7CF042807D005380628A148FB28F7CF0F +:108B60003021291F0200311FFF28F19F411B301FB8 +:108B70003121020002210121032153230938062853 +:108B8000D14001D112384198072821480B3F542386 +:108B90000C385021F1910000F137741FF190000062 +:108BA000F13768F0023C2B1F0190511B81210728EF +:108BB000F19F711B80210728914231C00728914AFB +:108BC000BF28F7CF322134210200082807D0073907 +:108BD0000628B14001F00438082807A00200042844 +:108BE0000D98FE2BF43F402807D00D390EA4FECD82 +:108BF000012204390028BF15FA3F661B1121002904 +:108C00001BE002000728A64A0EA4FECD012204396B +:108C10000028B115FA3F01283142B10941E0053A77 +:108C200008384BF00C38EA3D0728A142611BE73FAA +:108C30000728914271CF0728914AF73F07289142B0 +:108C400081A20728914ADA3F0EA4FECD0222043900 +:108C500000289115FA3F4618122100291BE01BF04D +:108C60000639581F0628E0400128004A020017D0A4 +:108C70000A393122063817A0419807282148033FB6 +:108C80000728A6480200124038F1093802D80739EF +:108C90009103002941E2120E120D1248020047A072 +:108CA0007B280C9C10215215FF2B5E15B7CF0200BC +:108CB00059F203396391083F69F20339E392043FA3 +:108CC00079F203394396020004280D98FA2B0B3FE2 +:108CD00002D407389103002901E211700628614887 +:108CE000020088F10A3C012831410728814AB14637 +:108CF0000328314FA1460F3F0728894A28F1063D36 +:108D000031440328314F5140053F552851950328E0 +:108D1000314F81110328214F0200E3F3033CF1900E +:108D2000033F23E051920628614A06284348020087 +:108D30007B21772141900000F137702175217A2144 +:108D40008CEE0415521F801F02004C1B001F47D0E1 +:108D5000033827D009390EA4FECD002203390B15A4 +:108D6000F73F1021020004280D9838F1FE2B273818 +:108D7000FE2B3C3FD23202180119210601D41A38C9 +:108D80001218162162F003392A1F2D3F12F21538EE +:108D900022F22838FE2BEF1568F0063C619001287E +:108DA000114AFE2BB8153021280304280D98F92B01 +:108DB0002E3F01D114381421202807D00D3878F126 +:108DC000123904231038714401F00239814400291A +:108DD00011E0714C083F202807A0053F01D205385B +:108DE000152127A0D22F020011D006381021042807 +:108DF0000D98FD2BF33FF2CE5200121BF43F4F05AE +:108E0000C5075B05CB076705D1077305D7077F0546 +:108E1000DD079105DD079D05E3077305E9078B0570 +:108E2000EF0700000000AF05EF07BB05F5070000E6 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000010120 +:108E500002010201010201020303040103010101F5 +:108E600001010303020103E90AED12A110110A3501 +:108E7000071F080510FB13871249085B14FB349B7E +:108E80005F80000080001000000000000000000073 +:108E900000000000000000000000000087F401FA5C +:108EA00000960064004B0032001E001400FE0065B6 +:108EB00078706572696D656E74616C7869E0AB504D +:108EC000C3F0D20000000000001B65076B07000024 +:108ED000091200000000F111F71100000000AF08B6 +:108EE0000000000000000000D311D9110000B712EB +:108EF000BD12000057494D5533003114371400009E +:108F000043445256003030255800F1FFFFFF1A004D +:108F10000000E7FFFFFF07000000F6FFFFFF020071 +:108F2000000001C80000FF7FFFFFD6BE898E7102DE +:108F300000000595D5F5FFFFFF0006000000F401D5 +:108F4000000000000000555555000008000000001A +:108F50000000900100006400000000001000030009 +:108F60000000FFFFFFFF0500000040420F00E80384 +:108F700000000A000000010000000C00000060EA90 +:108F80000000FFFF00005000000002AF8F02D98FE9 +:108F900002C78F02AD8F02E38F02A98F02E98F25EE +:108FA0002A242A232A502A192A0F182A2A001801AB +:108FB0001800280128032801290229292A012A0248 +:108FC0002A032A042A052A19186A2A672A082A69FC +:108FD0002A282AAD76AC769D7505182B2A272A8675 +:108FE000740400EE70002A262A0A180B74F012206E +:108FF0005174FD121FDC7402122045E9F08A088BBF +:10900000098C0A8D0B7415122045E0FEA3E0FF8544 +:109010001882851983E4F0A3F08E828F83A3AA823D +:10902000AB839011BE780C121EAC7808790C121626 +:109030008070188E828F8374691294CB746EF0A343 +:109040007466F0A30A0AAB83029466780879081262 +:10905000168060118E828F83746E1294CB7461F0CF +:10906000A3746E80DD9011C2780C121EAC78087962 +:109070000C1216AC5003029116908F42780C121EFF +:10908000AC7808790C121680600302916A7417128A +:109090002045E070030291AC851882851983C08257 +:1090A000C0837413122045129F09D083D08212947A +:1090B000A4502C851882851983C3E094FCA3E09406 +:1090C000FFA2D265D03340177402122045E4129FEC +:1090D000DDF97413122045C3E098F0A3E099F07411 +:1090E000131220451294C17418122045E070030237 +:1090F00091A97417122045E40291AB9011C6780C27 +:10910000121EAC7808790C121B038518828519830E +:10911000E0240A12A01A9011CA780C121EAC78082A +:10912000790C1216AC40D49011CE780C121EAC788B +:1091300008790C1216AC400302908D9011CE780C79 +:10914000121EAC7808790C121B0312A01180D89063 +:1091500011C6780C121EAC7808790C1217478518C6 +:1091600082851983E024F61294C49011D2780C12EF +:109170001EAC7808790C1216FB40D49011C2780C02 +:10918000121EAC7808790C1216FB400302908D90E9 +:1091900011CE780C121EAC7808790C12174785187E +:1091A000828519831294C180D27401F07402122056 +:1091B00045E060077A007B000292B81294B0507DBF +:1091C0008E828F837430F0EAFEEBFF741312204519 +:1091D000E0FCA3E0FDEC4D70087418122045E0603F +:1091E0000B8E828F83742EF0A30EAF837A007B00E8 +:1091F00080118E828F8374301294EC741312204588 +:109200001294C1EA24FF1AEB34FFFB8518828519FA +:1092100083129498500B7413122045129F0D4970BD +:10922000D185188285198374FFC39CF874FF9DF95A +:109230001294A450030293867A010291B685188293 +:10924000851983129F09C3E498FAE499FB80698524 +:10925000080C85090D850A0E850B0F780C121595E3 +:10926000AC0CE50D3395E0F50EF50F780C12151DDD +:109270007808790C1218C79011CE780C121EAC78B1 +:1092800008790C121747EC1294E6EAF8EBF9E82497 +:10929000010AE93400FBE849701E741312204512DC +:1092A0009F0D4970087418122045E0600B8E828F64 +:1092B00083742EF0A30EAF8374131220451294987A +:1092C000508D9011D6780C121EAC7808790C1216BD +:1092D000AC40030293867C01EE24FFF8EF34FFF9E3 +:1092E0007415122045E0F508A3E0F509888289830A +:1092F000E0642E6010E02CF0643A70077430F07C6B +:109300000180027C00E8FAE9FBEA24FF18EB34FF55 +:10931000F9C3E5089AE5099B40D2ECA2E0506774D6 +:1093200002122045E06036EEF8EF800A129483E8DE +:1093300024FF18E934FFF9C3E50898E509995018A6 +:10934000129470E0642E70E4E824FEF582E934FFA4 +:10935000F58312947DF980D712A011801E8E828F22 +:1093600083A3AE82AF83EEF8EF800612947012945E +:109370007DF9C3E50898E5099940F0741512204578 +:10938000129F287431F07417122045E07005801A7E +:109390001EAF83EE24FFF582EF34FFF583E06430E7 +:1093A00060EEE0642E70031EAF837402122045E06D +:1093B00070030294621294E8A3A9831294B08E827F +:1093C0008F835014742DF00EE9FF85188285198360 +:1093D000129F511294D98006742BF00EE9FF7C0085 +:1093E0007D00EE240AFEEF3400FFEC24010CED3486 +:1093F00000FD12948A121F49EA1294E612948A120E +:109400001F491294F34970E2C3EC9402ED129EBA24 +:1094100040D8ECFAEDFBC3E49CF8E49DF9EE28F5A6 +:1094200082EF39F583E0C0E0C3E49AF8E49BF9EEFB +:1094300028F8EF39F9E82CF8E93DF9E824F5F58248 +:10944000E934FFF583D0E0F0EC24FF1CED34FFFDA0 +:10945000C3EC9401ED129EBA50BCEE24F6FEEF343C +:10946000FFFFEEFAEFFB7403121FF27F08022123C5 +:10947000E824FFFAE934FFFB8A828B83221294836B +:1094800018EB22E088828983F0228518828519836F +:10949000129F5E7A0A7B0022C3E09AA3E09BA2D2CD +:1094A00065D03322C3E098A3E099A2D265D03322DD +:1094B000851882851983C3A3E09400A2D265D033B6 +:1094C00022E024FFF0A3E034FFF022F0EAFEEBFFFD +:1094D0008E828F8322A3E03400F985188285198358 +:1094E000E8F0A3E9F02224308E828F83F0A3AE82CD +:1094F000AF83228518828519831294FD22E8F0A398 +:10950000E9F0851882851983E02274F012205174E5 +:10951000B0121FDC851882851983129FC37418123C +:109520002045ECF0A3EDF0740F122045E4F0A38089 +:10953000227460122045129EF97404122045E0F94D +:109540007418122045129F2812204F740F122045C4 +:10955000129EC2F0129F3CFA129FFC122045EAF0C4 +:1095600074256A6010E070C9740F122045129EF9CC +:109570007450029468129F3C642570198518828586 +:109580001983E02401081294D57460122045129EBC +:10959000F9792580AB740E122045E4F0740D122089 +:1095A00045E4F0740C122045E4F07405122045E403 +:1095B000F0741E122045A882A983740212204580EF +:1095C000157405122045E070077405122045EAF075 +:1095D0008518828519831294F9129EF0129F83FADE +:1095E00024E060DD24FD601724F860DD24FE6006C1 +:1095F00024FD600F8011740C122045E00480D074AB +:109600000D80F5740E80F1129F83642A705B746282 +:10961000122045129F8EFB8A828B83E0FCA3E0FD23 +:10962000740A122045ECF0A3EDF0EA24020A0AEBDA +:109630003400FB7462122045129FBB740A1220454D +:109640001294B6501F740A122045129EF9C3E49A70 +:10965000FAE49BFB740A122045129FC3740C12207B +:1096600045E004F01294DA804A740A122045E4F0CE +:10967000A3802D740A122045129F0D75F00AA4F8DC +:10968000AAF075F00AE9A42AF9E50828F8E439F9FE +:10969000E824D0F8E934FFF9740A12204512A02119 +:1096A000129FDDF5838882E0F50874D02508C39405 +:1096B0000A40C0740C122045E06007740E12204569 +:1096C000E4F0129F3C642E60030297558518828552 +:1096D0001983E0240108A3E03400F91294F3129FE7 +:1096E0002DE0642A702C7462122045129F42F8A368 +:1096F000E0F988828983E0FEA3E0FFE824020808FD +:10970000E93400F97462122045129F7612A021F00C +:1097100080477E007F00851882851983129F4B74D5 +:10972000D02508C3940A5031EE75F00AA4FEA8F0C3 +:1097300075F00AEFA428FFE5082EF8E43FF9E824C5 +:10974000D0FEE934FFFF851882851983E02401F8F3 +:109750001294D580C17EFF7FFF7A0085188285191B +:1097600083129EEB851882851983E0FBA3E0F583C5 +:109770008B82E024B4600824E4600524FC70040AB1 +:109780001294DA129F3CFB129FFC122045EBF07002 +:1097900003029D6024BB7003029C2624FE7003021A +:1097A0009C0824EF700302995224F5700302985725 +:1097B0001470030299F7147003029C2614700302BC +:1097C0009C24147003029C0824FE70030299F72461 +:1097D000FB6024147003029942147003029952240E +:1097E000FD700302989024FE700302995224FD70CC +:1097F00003029952029D6C7462122045129FB512A9 +:1098000020451294E0EAA2E0740F5033122045E0A4 +:10981000FCA3E0FD3395E0FE7406122045129F96EE +:10982000ECF0A3EDF0A3EEF0A3F074621220451269 +:109830009F9D122045129F76E8F0A3E902955312EE +:109840002045129F097406122045129F8EF5838AC7 +:1098500082E8F0A3E980D27462122045129F96E05C +:10986000C0E0741E122045D0E0F074621220451250 +:109870009F9D122045129F761294E0741F1220457E +:10988000A882A9837412122045E8F0A3E9029D83FF +:109890007462122045129FB51220451294E074069E +:1098A000122045129FB5122045E02402FAA3E034AD +:1098B00000FB7462122045129FBB740212204512F5 +:1098C00094E0E849700C740212204574ABF0A37464 +:1098D00011F0129EB850047E107F277408122045A4 +:1098E000E4F0A380087408122045129EC2F07402AE +:1098F000122045129F0988828983A3AA82AB8374B0 +:1099000002122045129FC388828983E0600A74088E +:10991000122045129F1240CD7402122045129ED98A +:1099200074121220451294E07408122045129F51BF +:10993000F97412122045E028F8A3E039F974020204 +:109940009886740D122045E06008EE4F70047E0189 +:109950007F007462122045129FB512204512A009A3 +:10996000122045E0647070387406122045129FABD7 +:10997000122045129FE4122045E02402129F6D122E +:109980002045129F761294E09011DA121ECA741AC2 +:10999000122045121ED67405122045E4F0029A8763 +:1099A000EAA2E07406501B122045129F28121ECA1C +:1099B0007414122045121ED67406122045E02404A9 +:1099C0008012122045129FAB122045129FE41220F4 +:1099D00045E02402129F6D122045129F7612A009C5 +:1099E000122045E0646F70059011DE809EE0647582 +:1099F0007096908F7280947462122045129FB512F7 +:109A000020451294E0EAA2E0740650161220451296 +:109A10009F287808121EAC7406122045E02404F832 +:109A2000801B122045129F4BA3E0F5093395E0F50A +:109A30000AF50B7406122045E024020808129F6EF6 +:109A4000122045129FF11220457808121EBB908FFC +:109A50004278081214B840217405122045742DF084 +:109A600074141220457808121EAC7808121DDC749C +:109A7000141220457808121EBB908F72121ECA74F1 +:109A80001A122045121ED6744F122045A882A983AF +:109A900074021220451294E07412122045129FF4B1 +:109AA0001220457808121EACE5084509450A450B09 +:109AB000600974111220457401800674111220454A +:109AC000E4F0EE4F7008E0A2E04003029B7B7402DA +:109AD000122045129F22122045129FF41220457831 +:109AE0000C121EAC741A1220457808121EAC780CA9 +:109AF0007908121D69749A2508F58274113509F5E3 +:109B000083E0C0E07402122045129F28D0E0F07478 +:109B100014122045780C121EAC741A1220457808D5 +:109B2000121EAC780C7908121D6974141220457845 +:109B30000C121EBB74141220457808121EACE508E6 +:109B40004509450A450B7086129EB8502E740E12B8 +:109B50002045E060267405122045E06004D2F080C4 +:109B600002C2F0740A122045129ECB800E740212BB +:109B70002045129FD5122045129F357402122045B0 +:109B8000129ED9744F122045C082C08374021220E5 +:109B900045129EF9D083D082E582C39AFAE5839B71 +:109BA000FBC3EA9EEB129F1B40C3740D122045E0DD +:109BB0007003029D847411122045E0A2E04003026C +:109BC0009D847404122045E064786005E064587058 +:109BD0001E129483E824FF18E934FFF9740212205E +:109BE00045129FD5122045129F287430029D83E0B4 +:109BF000646F6003029D847402122045129F896481 +:109C0000307003029D8480D474081220457401F0E2 +:109C1000A3E4F07404122045E024FEF0EE4F700F30 +:109C20007E018012E4F07408122045E4F0A3F012E3 +:109C30009EB850047E067F007462122045129FB5C4 +:109C40001220451294E07406122045129F28780CC9 +:109C5000121EAC7406122045E02404129F6D1220DF +:109C600045129FF1122045780C121EBB908F42784E +:109C700008121EAC780C79081216FB5022740512DB +:109C80002045742DF074141220457808121EACE59E +:109C90000BB2E7F50B74141220457808121EBB7442 +:109CA0000A122045129F09741E122045E58228F8E9 +:109CB000E58339F974021220451294E0740D1220E4 +:109CC00045E0F50878081222687409122045E0F58D +:109CD000087808122268740412204512227B8E082C +:109CE0008F097808122264740A122045E0F9741A68 +:109CF000122045121ECA1214977406121FF2741213 +:109D0000122045129FC3740E122045E06076740540 +:109D1000122045E06004D2F08002C2F0740A1220E2 +:109D200045129ECB7412122045C082C08374021269 +:109D30002045129F09D083D082E0C398F8A3E09910 +:109D4000F9C3E89EE9129F1B503A74021220451293 +:109D50009F22122045129FD5122045129F3580C4A4 +:109D6000851882851983129EE21294D974021220FA +:109D70004574BAF0A37411F0741212204574BDF04A +:109D8000A37411F07412122045C082C083740212B1 +:109D90002045129F09D083D082E0C398FEA3E099AA +:109DA000FF740A122045129F12500A7408122045AF +:109DB000E4F0A380307405122045E06004D2F08006 +:109DC00002C2F0740A122045E0C39EF8A3E09FF996 +:109DD000A2F0E433FAE89AF8E99400F97408122042 +:109DE00045E8F0A3E9F0740C122045E0702B8019CF +:109DF0007460122045129EFF122045129F281220E7 +:109E00004F740F12204512A0177408122045129F9C +:109E1000C91220451294B650D77405122045E0604F +:109E2000507460122045129EF97405122045E0F925 +:109E30007418122045129F2812204F802C74601233 +:109E40002045129EF97402122045129F42F974189F +:109E5000122045129F2812204F7402122045129E94 +:109E6000EB74021220451294E0740F12204512A0E8 +:109E700017EE24FF1EEF34FFFFC3129EBA50BE74CC +:109E80000C122045E070030295547408122045120C +:109E90009FC91220451294B6500302955474601263 +:109EA0002045129EFF122045129F2812204F740F4A +:109EB00012204512A01780D2C3EF9400A2D265D021 +:109EC0003322E02401F0A3E0340022A2F0E433F8CE +:109ED000E098FEA3E09400FF22129EDD22129EE293 +:109EE000F922E024FFF8A3E034FF22E0129EF022E2 +:109EF0002401F8A3E03400F922E0FAA3E0FB22E019 +:109F0000FAA3E0FB7920741822129F5E22129F5E52 +:109F1000E822C3E09EA3E0129F1B229FA2D265D03D +:109F20003322129EDD740222129F2C22E0F8A3E05D +:109F3000F583888222129F2C7430F0228518828546 +:109F40001983129F4622129F64E022129F46F50851 +:109F500022129F5EC3E498F8E49922129F64E0F80D +:109F6000A3E0F922E0F8A3E0F583888222F8A3E0D9 +:109F70003400F9746222129F7A22E0FAA3E0F5839A +:109F80008A8222851882851983129F7AE022129F85 +:109F90007AE0FAA3E022129F46129F2D22129F46DA +:109FA0002402F8A3E03400F9746222129F5BE8FAFD +:109FB000E9FB741422129F5B740622E0FCA3E0F517 +:109FC000838C82EAF0A3EBF022E024FFF0A3E034DC +:109FD000FFF0740822E8F0A3E9F074022212950160 +:109FE000F8A3E022EAF0A3EBF0A3E4F0A3F07406F8 +:109FF00022129F7AE8F0A3E9F07414228518828572 +:10A000001983E024010812A02FE8F0A3E9F07404FA +:10A0100022851882851983E02401F0A3E03400F042 +:10A02000221294FD2401F812A02FE8F0A3E922A344 +:10A03000E03400F98518828519832274F6122051C4 +:10A0400090035174FEF0A304F0900354F090035376 +:10A05000F07A018A0875090074027808121FC91283 +:10A06000AE5CEA88828983700774FEF0A3048004E2 +:10A0700074FFF0A3F088828983A3A3A3F088828968 +:10A0800083A3A3F00AEAC3940240C87ABF7B0712F5 +:10A0900008137A0D7B08120AA7790002ABFE74F24E +:10A0A000122051EAFEEBFF8E828F8312A678604663 +:10A0B00012AD8E12A1D8750B00780A1222648A8222 +:10A0C0008B83A312227B12A630121FF2E9702C851B +:10A0D000088285098312A1D8780A1222648A828BA9 +:10A0E00083A312227B7C027D007AB37B8F12A63879 +:10A0F000121FF2E97005790202A1C4900EE812A6BF +:10A1000078600CC3E498FAE499FB12A1C950057970 +:10A110000102A1C47A067B0012114F8A0A8B0BEA56 +:10A12000450B7005791302A1C47A007B0080409032 +:10A130000EE812AB4C8A0C8B0D7403780C121FC9FD +:10A14000850882850983E0250CF8A3E0350D888217 +:10A15000F583A3A3A3A3ECF0A3EDF0900EE8E02415 +:10A1600001F0A3E03400F0EA24010AEB3400FB1212 +:10A17000A1C940BB850A82850B83E4F0A3F0750872 +:10A1800004F5097808122264EEFCEFFDE50A2402CA +:10A19000FAE50B12AB3F121FF290035912A678900A +:10A1A00003596017E0FAA3E08003E8FAE9FB8A822A +:10A1B0008B8312A67870F38A828B83E50AF0A3E57D +:10A1C0000BF079007F060221238E828F83E0F8A3B3 +:10A1D000E0F9C3EA98EB992212ADA38A828B83E05F +:10A1E000F50A22C082C083E9900EE7F0D083D082C6 +:10A1F00002012274F7122051E9FE74145E6007799F +:10A2000010120AD1800BEEA2E0400479028002799C +:10A21000007F0102212374F7122051ECFEEDFFE9CB +:10A22000A2E550077910120AD18034A2E3502679B2 +:10A2300010120AD1E96026EE2418F582EF3400F5F9 +:10A2400083E0601BEE2417F582EF3400F583E064B1 +:10A2500001600A800AA2E14004790380027900804B +:10A26000B074F412205174E9121FDCEAFEEBFF898E +:10A2700008E4F50AF50B780A122264750A02780AD6 +:10A28000122264750AC5750B8F780A1222647CFF4E +:10A290007DFF7A017B0012AD88121FF28A828B83C8 +:10A2A000E5824583605412ACC685188285198312F5 +:10A2B000AE1F74021220457404F01412204574017C +:10A2C000F07404122045E4F0740512204574FFF088 +:10A2D000740612204574FFF0E508F509780912228A +:10A2E0006879007401122045AC82AD83EEFAEFFB71 +:10A2F0001207AD7401121FF2800279017417121F48 +:10A30000F27F0402212374E81220518A168B178CE5 +:10A31000128D137418122045E0F514A3E0F515749E +:10A320001A122045E0F50AA3E0F50B741C12204533 +:10A33000E0F510A3E0F511900359800685088285A9 +:10A340000983E0F508A3E0F509E508450970030273 +:10A35000A3F37E007F00E5082404F50EE509340030 +:10A36000F50F8008EE24010EEF3400FF850882858A +:10A37000098312ACC8C3EE98EF9950C08E0C8F0DB4 +:10A380007403780C121FC9850E82850F83E0250C9B +:10A39000F50CA3E0350DF50D850C82F58312ACC6E6 +:10A3A000C3E89516E9951740BBC3E51298E51399E4 +:10A3B00040B2E50A450B6020780A12226478141234 +:10A3C0002264850C82850D83E0FC7D0012AD9E1217 +:10A3D000A638121FF2E9608CE5104511600F850E5A +:10A3E00082850F8312A97612ACC612AE19AA0CABE5 +:10A3F0000D80047A007B007F1002212374EE12206E +:10A4000051ECFEEDFF900359E0FCA3E0800A8C8242 +:10A410008D8312ACCAE8FCE9FDEC4D700302A4BDCB +:10A420008C828D8312ACC6880889098882F583A343 +:10A43000A3A3A3E0F50CA3E0F50DC3EA950CEB95FF +:10A440000D40CB8C828D83A3A3E0F50EA3E0F50F26 +:10A45000E50C250EF8E50D350FF9C3EA98EB995098 +:10A46000AD750A00750B00800CE50A2401F50AE5BC +:10A470000B3400F50BC3E50A950EE50B950F508ED6 +:10A48000850A10850B1174037810121FC9E5082581 +:10A4900010F8E5093511F988828983A3A3A3A3E005 +:10A4A0006A7003A3E06B70C1EE4F600B8E828F83E6 +:10A4B000E50CF0A3E50DF0E8FAE9FB80047A007BF7 +:10A4C000007F0A02212374EC12205174FE121FDC5B +:10A4D000EAFEEBFF7416122045E0F50EA3E0F50F3F +:10A4E0007418122045E0F510A3E0F5117508007509 +:10A4F0000900851882851983E4F0A3F0EE2404F5A1 +:10A500000CEF3400F50D850C82F58312ACBEA385EB +:10A51000820A85830B74FF6A700374FF6B603B854E +:10A520001882851983858208858309780812226438 +:10A530008E828F83E0F50875090078081222648501 +:10A540000A82850B8312227BEA24010AEB3400FB8A +:10A5500012AD88121FF28A088B098E828F83E0F574 +:10A56000127513007812122264850A82850B8312F9 +:10A57000227B12A630121FF2E970268E828F83E0B2 +:10A58000F5127812122264850A82850B8312227BCF +:10A590007C027D007AB37B8F12A638121FF2E9602D +:10A5A00016850C82850D8312AD9F1207B98A0A8B1E +:10A5B0000BA80AA90B80628E828F83E0F5127812B5 +:10A5C000122264850A82850B8312227B7C027D0025 +:10A5D0007AB57B8F12A638121FF2E96031E5084583 +:10A5E000096011851882851983E0650E7004A3E067 +:10A5F000650F6006AA0EAB0F80B0850882850983BF +:10A60000A3A3A3A3E024FFF8A3E034FF800A850CF2 +:10A6100082850D83E0F8A3E0F9E51045116003128F +:10A62000AE19AA08AB097402121FF27F0C02212393 +:10A630007C027D007AB17B8F1205CD740422C0822A +:10A64000C08390035912A678602788828983A3A3C8 +:10A65000A3A3E0FCA3E0F5838C82A3A3A3A3E06AF9 +:10A660007003A3E06B8882898370DAA312AD9E80A9 +:10A67000047A007B0002A1ECE0F8A3E0F9E84922AB +:10A6800074F312205174FE121FDCEAFEEBFF8C08FB +:10A690008D09890A740F122045E0F50B8518828513 +:10A6A0001983AC82AD831207FBE9F50C7064E50AEF +:10A6B000600E7910EEFAEFFB120AD1E9F50C705238 +:10A6C000AC08AD09EEFAEFFB12053DE9F50C70425E +:10A6D000851882851983E0FEA3E0FF74FF650B6097 +:10A6E00031EE2402F508EF12ABB212226475081E97 +:10A6F0007509007808122264EEFCEFFD7A077B08EA +:10A700001208317404121FF28E828F83A3A3A3E573 +:10A710000BF0A90C7402121FF27F0502212374F5BD +:10A7200012205174FE121FDCEAFEEBFF8C088D092B +:10A73000890A851882851983AC82AD831207FB7460 +:10A7400017696010E50A60167910EEFAEFFB120A3D +:10A75000D1E9600A7402121FF27F03022123AC08C0 +:10A76000AD09EEFAEFFB12053780E974F6122051BD +:10A77000EAFEEBFF1207A7EA4B600FEE24FFF8EFAB +:10A7800034FFF9EA28FAEB398003EEFAEFFB02AB6B +:10A79000FE74F012205174E3121FDC8A088B09EC5E +:10A7A0002402FEED12AEB7F50E741E650E70531244 +:10A7B00008018A0A8B0BEA450B6042EA2403F50C78 +:10A7C000EB3400F50DE4F50EF50F780E1222648ED1 +:10A7D000828F83E0FD7C00AA08AB09850C82850D81 +:10A7E0008312AEC6121FF2E50A2402FAE50B34000A +:10A7F000FB120837850C82850D8374FFF079000207 +:10A80000A971900EE7E0F46065E50EC39419505EFF +:10A81000E50EC333F8E433F9E854FCF874FE28F885 +:10A82000748D39F9E824FCFAE934FFFB8A0C8B0DAE +:10A830008A82F58312AD9FEA4B6033E824FEF582ED +:10A84000E934FFF58312A67860248C828D83A3857A +:10A85000820A85830B8C828D83E0F9700B850A82D6 +:10A86000850B83E06401700B7412650E6005790638 +:10A8700002A971740412204585820E85830F780E1B +:10A880001222648C828D83A3A3A312227B8C828DDF +:10A8900083A3A3A3A3A312AB4C850A82850B83E0F9 +:10A8A000FA850C82850D8312A97612204F7404124A +:10A8B0001FF2E9F50C600302A96F7404122045AC85 +:10A8C00082AD83AA08AB098E828F83E0C333F8E49C +:10A8D00033F9E854FCF874FC28F582748D39F5835B +:10A8E00012A97612204FE9F50C702C8E828F83E02E +:10A8F000FD74046D6079740412204585820A858395 +:10A900000B780A1222647C00AA08AB09900EE712A9 +:10A91000AEC6121FF28058850A82850B83E0704F05 +:10A920008E828F83E0851882851983F0740312204C +:10A9300045E9F08E828F83E0F8740468600D740638 +:10A940006860087408686003741068740412204515 +:10A9500012ACCA740112204512AE1F8518828519E7 +:10A9600083AC82AD83AA08AB091204EF750C00A971 +:10A970000C741D02ACDFE0F8A3E0F5838882227935 +:10A980000002012274F012205174EA121FDC8A0CBA +:10A990008B0D8C828D8312AD9F750A00EC2402FE14 +:10A9A000ED3400FF8E828F83C3E09AA3E09B4004C6 +:10A9B000EA4B7005790102AB34851882851983E46E +:10A9C000F0E4F508F5097808122264780812226488 +:10A9D00078081222648E828F8312AB4C12AD8812DB +:10A9E0001FF28A088B09A808A909E849700302AB7D +:10A9F0001A88828983A3AA82AB83E82404F508E934 +:10AA00003400F509851882851983E0707188828980 +:10AA100083E06402700A74011220457401F08068BA +:10AA200074011220457402F012AB5275F012A4F8B2 +:10AA300085F00BA90BE58228F582E58339F583A320 +:10AA4000A3ECF0A3EDF0750E10750F00780E122236 +:10AA50006412AB487402122045E075F012A4F8A904 +:10AA6000F0E58228F8E5833912AB39121FF2851818 +:10AA700082851983E004F0600302AAFF80727401EA +:10AA8000122045E0640170A088828983E06402603E +:10AA90000302AB1A12AB52F50E750F007402780E5A +:10AAA000121FC9E582250EF582E583350FF583A3D4 +:10AAB000A3ECF0A3EDF0750E02750F00780E1222D4 +:10AAC0006412AB487402122045E0F50E7402780E51 +:10AAD000121FC9E582250EF8E583350F12AB391236 +:10AAE0001FF2851882851983E004F0C39405500F86 +:10AAF000850882850983E0F47003A3E0F470037590 +:10AB00000A01850882850983E02401FAA3E0340064 +:10AB1000FBE50AA2E0400302A9C1851882851983DA +:10AB2000E07004790A800DAC82AD83AA0CAB0D12E3 +:10AB300004FB7900741602ACDFF9E82404FAE93466 +:10AB400000FB1210BF7402228A828B83E0FCA3E018 +:10AB5000FD22850882850983E0FCA3E0FD8518823B +:10AB6000851983E02274F612205112AC034004EAE6 +:10AB70004B700479018033E4F508F5097808122256 +:10AB8000648C828D83A3A3A3A3E0F5087808122226 +:10AB90006412ABAC12226412AD84121FF28B09EA6C +:10ABA00045097004790A800279008052EC2405F589 +:10ABB00008ED3400F50978082274F612205112AC21 +:10ABC000034004EA4B700479018033E4F508F50989 +:10ABD00078081222648C828D83A3A3A3A3E0F508D6 +:10ABE000780812226412ABAC12226412AD84121FD8 +:10ABF000F28B09EA45097004790A800279007F0224 +:10AC00000221238C828D83A3A3E0FEA3E0FF8C822C +:10AC10008D8312ADA3C3EE9AEF9B2274F6122051DE +:10AC2000EAFEEBFF8C828D837C007D0012ACD0703D +:10AC3000047901800CA3A3A3E0F9EEFAEFFB12075D +:10AC40008380BB74F01220518A0A8B0BECFEEDFF5F +:10AC5000750C008002050CEE2416F582EF3400F529 +:10AC600083E0F8E50CC3985051E50CC333F8E433A6 +:10AC7000F9EE28F508EF39F5097C007D008508829A +:10AC8000F58312ACD0701485088285098312ACCA92 +:10AC90008E828F8312AE1F79018021A3A3A3E0F9D6 +:10ACA000AA0AAB0B120783E960AB8508828509838A +:10ACB00012ACBEEAF0A3EBF080027900802412AD62 +:10ACC000A38E828F8322A3A3A3A3E0F8A3E0F9229B +:10ACD00012ADA312079B8A828B83E58245832212E1 +:10ACE0001FF27F0802212374F0122051ECFEEDFFC9 +:10ACF0008E828F8312ACCA12AD8EC3E098A3E09906 +:10AD00004004E849700479018077EE2405F50CEFE2 +:10AD10003400F50DEE2404F50AEF3400F50B850A36 +:10AD200082F583E0F50E750F00780E122264780C20 +:10AD300012226412A630121FF2E9700479108041C9 +:10AD4000E4F50E780E122264850A82850B83E0F505 +:10AD50000A750B00780A122264780C1222648508A6 +:10AD60008285098312AB4C8E828F8312AD9F12AD08 +:10AD700088121FF28B09EA45097004790A8002796A +:10AD80000002ACE2EEFCEFFD120795740622EE2401 +:10AD900002F508EF3400F509850882F58322A31235 +:10ADA000ADA322E0FAA3E0FB2274F41220518A083A +:10ADB0008B09ECFEEDFF7C007D008E828F8312AC50 +:10ADC000D0700479018010EEFCEFFDA3A3A3E0F99D +:10ADD000AA08AB0912078902A30102A97F74F6121F +:10ADE0002051ECFEEDFF12AF8A6029EE4F60078E16 +:10ADF000828F8312AE1F88828983A3A3E0F874FE3A +:10AE00006870047917800F74FF68700479008006F9 +:10AE100079168002790202ABFE851082851183E8E3 +:10AE2000F0A3E9F02274F61220517C008C08750919 +:10AE30000074027808121FC912AE5C88828983E010 +:10AE40006A7003A3E06B7006E8FAE9FB800B0CEC78 +:10AE5000C3940240D77A007B0002ABFE74512508F0 +:10AE6000F874033509F92274F4122051EA4B604456 +:10AE7000EA2402FEEB12AEB7F46039E064FE6034FF +:10AE8000EA2403F508EB3400F509E4F50AF50B783C +:10AE90000A1222647D1E7C178A828B8312AD9F1258 +:10AEA000AEC0121FF28E828F8374FEF085088285F9 +:10AEB000098304F002A3013400FF8E828F83E02215 +:10AEC000850882850983E0F912082B74022274F048 +:10AED0001220518A0A8B0B890C74FE650A70047467 +:10AEE000FF650B700302AF87E970251208018B091B +:10AEF000EA4509600302AF877AFF7BFF12AF8A70D1 +:10AF00000302AF8788828983E50AF0A3E50B807688 +:10AF10007401650C701012AF8A606C88828983742A +:10AF2000FFF0A3F080177402650C705B7901120AC0 +:10AF3000C5E97053AA0AAB0B12AF8A604AE8240233 +:10AF4000FEE912AEB7FA74FF6A603CE82403F50824 +:10AF5000E93400F50974FE6A6018E4F50EF50F781F +:10AF60000E1222647D1E7C14AA0AAB0B12AEC01214 +:10AF70001FF2EEFAEFFB1208378508828509837409 +:10AF8000FFF08E828F83F002ACE21208018A088BF8 +:10AF900009A808A909E8492274F4122051E990048B +:10AFA00041F0120E07907800E0C4540F5407640378 +:10AFB0007004793F8002797F75080675090078086A +:10AFC0001222647C2F7D047AEA7B071212F9740244 +:10AFD000121FF290042FE0F47049A3E0F47044A330 +:10AFE000E0F4703FA3E0F4703AA3E0F47035A3E01E +:10AFF000F4703090780EE090042FF090780FE0908D +:10B000000430F0907810E0900431F0907811E090E6 +:10B010000432F0907812E0900433F0907813E090CE +:10B020000434F090043512B12C12BE2F90045F74DA +:10B0300006F0A3740D12B95F7432F0A37401F0909E +:10B04000058812B12C900587E4F090058EF0A3746A +:10B05000A012B95F7403F0A3740712B95F742812C9 +:10B06000B95F04F0A3E4F09005B7F09005DA74FF3F +:10B07000F0A3E4F09005DCF09005DE04F0120BBBC9 +:10B08000120AEF120DAD79017ADF7B05120CA59043 +:10B0900005DFE075F01484E5F004F0790C7A007BAC +:10B0A00006120CA5120CC37A00900441E0F91211AB +:10B0B00067907803E06442705E9005DFE014F07002 +:10B0C00056C2AF12B0C600782AD0E0F618D0E0F62B +:10B0D000E59F5407F97005908F828003908F267842 +:10B0E00008121EACE9C4C0E07829E65508F5080846 +:10B0F000E65509F509740B7808121FBAD0E0250847 +:10B10000F8906270E0A2E740F8E8C333906272F012 +:10B11000906270E0D2E0F090046CE4F0A3F07A80EA +:10B12000FB900441E0F912111302BCC074FF12B38A +:10B13000DCF0A3F02274F6122051EAFEEBFFEEA23F +:10B14000E05043900443E0C39480E0500FC333F8D1 +:10B15000E433F9740C28F582740F800EF4C333F8CD +:10B16000E433F9741A28F582740F39F58312BCDBC5 +:10B1700012204F7A00900441E0F9121167EE640149 +:10B18000FAEFFB02B2F35402603775080078081238 +:10B190002268E4F50978081222647808122264789B +:10B1A000081222647508777509057808122264125E +:10B1B000B30F793C1209C97409121FF2EE640280C0 +:10B1C000BFEE5404607B900470E0F875F004A4C8EE +:10B1D000AAF012B59BEA242A12BD99F50878081244 +:10B1E0002268EA243212B2FEF50974047808121FAC +:10B1F000BA7808122264EA242012B2F612227BEAFC +:10B20000242E12B2FEC313F509E50813F5087808D9 +:10B210001222647508777509057808122264900572 +:10B2200076E0FD7C018A828B83A3A3A3A3E0FA7B53 +:10B230000079001209C97409121FF2EE640402B108 +:10B2400080EE544060387508007808122268E4F5F2 +:10B25000097808122264780812226478081222649D +:10B26000750877750905780812226412B30F793BC7 +:10B270001209C97409121FF2EE644002B180EE5443 +:10B280008060217900121161908F521222777A002A +:10B290007B01900441E0F91211857404121FF2EE53 +:10B2A0006480809AEF5401600D7901121161EEFA09 +:10B2B000EF640102B182900448E064017031EE5401 +:10B2C00020602C900442E024F9600314701B793F45 +:10B2D000900470E0FA75F004A4CAA8F028FB747218 +:10B2E0002AFA74043BFB120C63EE642002B1807AEC +:10B2F000007B0002BD1DF582EB3400F5832212B302 +:10B3000006F508A3E022F582EB3400F583E02290F5 +:10B310000576E0FD7C017A007B0022C082C083C2FA +:10B32000AF120DE3E5E170FC75E10112B96A120E8E +:10B330001F7907120E917901120E977902120E49A8 +:10B34000120E67120E857900120E8B7901120E8B88 +:10B35000908F46121ECA120E31900576E412B12E5D +:10B36000A3F090058EF0A3F0A3F09005927407F07F +:10B370009005917403F0900597E4F0900596F09095 +:10B3800005B7F0120C51120D17120C697900120E4C +:10B390009D90057D74FF12B3DC741FF0906012E481 +:10B3A000F0A3F0906063F0752100900442F09004E7 +:10B3B00044F0A3F0900582F090058304F09005849A +:10B3C000E4F0900447F090044804F090045E7403A5 +:10B3D000F09005DDE4F0D2AFF902BE1EF0A3F0A3B9 +:10B3E000F0A3F0A322C082C08390042F12B426F0F1 +:10B3F00090043012B419F090043112B419A3F090F3 +:10B40000043212B419A3A3F090043312B41EF090C6 +:10B41000043412B41EA302BE1B12B426A32212B41B +:10B4200026A3A3A3A322E08A828B8322C082C083A7 +:10B430008A828B83E090043512B462E09004361265 +:10B44000B462A3E090043712B462A3A3E09004387E +:10B4500012B469E090043912B469A3E090043A028E +:10B46000BE1BF08A828B83A322F08A828B83A3A3E4 +:10B47000A3A322C082C083120BC7E97005120E6716 +:10B48000790002BE1E74F7122051EAFEEBFF890814 +:10B49000120BC7E9702CE508600A74016508600AA0 +:10B4A0007912801E7C00790080047C007901EEFA1C +:10B4B000EFFB120E6DE9F8740368700479078002DF +:10B4C000790002B96574F6122051740A12204512EF +:10B4D000BE25600AEC4D6006E50845097004791246 +:10B4E000800F7808122264120CBD7402121FF279C8 +:10B4F0000002BD1D74F4122051EAFEEBFF89089092 +:10B500000442E064096014E0640A600FE0640B60C8 +:10B510000AE0640C6005E0640D7004790C801E1272 +:10B520000D418B0BEA450B700BA908EEFAEFFB12ED +:10B530000CA58009900444E04440F0790D02BCC0A1 +:10B5400074F4122051EAFEEBFF890BEE4F6003E921 +:10B5500070047912801F750A00120C9F850A08EE8C +:10B560002508F582EF12B2F9E9F0050AE50AC3955C +:10B570000B40E6790002BCC0C082C083E9F87401C8 +:10B5800068700B9005DD7401F0790002BE1EE87052 +:10B59000069005DDE480F1791280F02AF9747228B2 +:10B5A000FA740439FB2274F6122051EAFEEBFF8C88 +:10B5B000088D09900442E0640C700590618E801241 +:10B5C00012BDE4702F12BE7074DB2EF58274043F3E +:10B5D000F583E0F9748069700A85088285098374AF +:10B5E0007F800E900446E0F8E9C3988508828509BB +:10B5F00083F0790002BD1D74F7122051EAFEEBFFC3 +:10B60000890874056508602874136508602274143D +:10B610006508601C741565086016741A650860106A +:10B6200074296508600A743B650860047912803DDE +:10B6300012BDE4703812BDE9241DF8EB3400F9EABC +:10B6400024F5FCEB3400FDEA246A12B6707016EAA9 +:10B65000246B12BD9964027004793A801012B67698 +:10B66000120C39800612B676120C2D790002B965DB +:10B6700012B3066401228C828D83E50812BB48E474 +:10B68000F0A3F079022274E812205174FE121FDC3C +:10B69000E9851882851983F08A0C8B0D8C0A8D0B35 +:10B6A000741A122045E0F508EC450B6016851882E7 +:10B6B000851983E0C3941C500AE508600B7401658A +:10B6C000086005791202B94D12BDE4600302B94D5C +:10B6D000A80CE875F004A4C8AAF02AFA75F004E5ED +:10B6E0000DA42AF9747228FE740439FFEE2465F55E +:10B6F00010EF3400F51185108212B957E84970C374 +:10B70000A2AFE433C0E07401122045D0E0F0C2AF34 +:10B71000120D418A148B158A828B83E0F87440687D +:10B720006017748068600302B913900470E0650CC0 +:10B730007002E50D600302B913120DFB8A0C8B0D2C +:10B74000120DFBEA650C7003EB650D700302B91373 +:10B7500012BE86E5142402F516E5153400F517909F +:10B760008F76780C121E38780C122260851682852E +:10B770001783121ECA12BE15121FF2E9640160037C +:10B7800002B913E508F5097809122268740112203C +:10B7900045E0F9AC0AAD0BEEFAEFFB120C87740131 +:10B7A000121FF2E9600302B913900583E06401609F +:10B7B0000302B905EE241DF582EF340012B957E8F3 +:10B7C00049700302B90512BE86EE242EF508EF3447 +:10B7D00000F509850882F583E0F510A3E0F511E492 +:10B7E000F512F513780C7910121E25908F3A780C0B +:10B7F000121E38780C122260851682851783121E5D +:10B80000CA12BE15121FF2E96401600302B905E510 +:10B81000142408F50AE5153400F50B850A82F58332 +:10B82000122277AA0CAB0DAC0EAD0F12BE0F121F79 +:10B83000F285088285098312227B12278C740212FA +:10B840001FF28A0C8B0D8C0E8D0F7410780C121D4C +:10B85000ED8E828F83A3A3A3A3A3A3A3A3A312B953 +:10B86000598E828F83A3A3A3A3A3E8F0A3E9F0E8F2 +:10B87000250CF8E9350DF98E828F83A3A3A3A3A32A +:10B88000A3A3E8F0A3E9F0850A82850B83C082C0F8 +:10B8900083850882850983E0F508A3E0F509E4F5CE +:10B8A0000AF50B780C7908121CE9D083D082780C49 +:10B8B000121E38908F36780C121E868516828517D8 +:10B8C00083E50CF0A3E50DF0A3E50EF0A3E50FF082 +:10B8D000851482851583A3A3A3A3A3A3E4F0A3F0F7 +:10B8E000EE2435F582EF12BD9CC0E0EE2434F582E3 +:10B8F000EF12B2F9D0E0F0EEFAEFFB12244FAA14E7 +:10B90000AB15120D237401122045E0A2E092AF792D +:10B9100000803A851082851183E50AF0A3E50BF0DB +:10B92000851882851983E0C0E0EE2463F582EF126A +:10B93000B2F9D0E0F0EE2464F582EF12B2F9E50836 +:10B94000F07401122045E0A2E092AF790774021270 +:10B950001FF27F10022123F583E0F8A3E0F922F023 +:10B96000A3E4F0A3227F01022123120B91120B8585 +:10B9700075E1F12274F3122051EAFEEBFF8908749D +:10B980000D122045E0F509740E122045E0F50A7409 +:10B990000F12204512B9597411122045E0F50B74AD +:10B9A00012122045E0F50CE5086038740165086066 +:10B9B00022740365086006740265087068EE2460EE +:10B9C000FAEF12BB30505EEC2460FAED12BB30404F +:10B9D000268052E849604EE50A601C7401650A70D1 +:10B9E000448014EE24E0FAEF12BB255038EC24E03A +:10B9F000FAED12BB25502EC3EC9EED9F4027E509C2 +:10BA0000600674016509701DE50C60127401650C17 +:10BA1000600C7402650C60067403650C7007740793 +:10BA2000550BFA7005791202BB2090058EE0640177 +:10BA30007005790C02BB20E508900591F0EAA3F0AF +:10BA4000E50CA3F0E509900587702FE4F090042F32 +:10BA5000E0900588F0900430E0900589F090043182 +:10BA6000E090058AF0900432E090058BF09004336A +:10BA7000E090058CF0900434802E7401F090043531 +:10BA8000E0900588F0900436E0900589F090043746 +:10BA9000E090058AF0900438E090058BF09004392E +:10BAA000E090058CF090043AE090058DF07401650B +:10BAB00008703CE50A90057612BB48E090057712C5 +:10BAC000BB3BE090057812BB3BA3E090057912BB2D +:10BAD0003BA3A3E090057A12BB40E090057B12BB2C +:10BAE00040A3E090057CF090058FE4F0A3802EE564 +:10BAF0000C70047900801C7401650C70047901805D +:10BB0000127402650C7004790280087403650C706D +:10BB1000057903120E7390058FEEF0A3EFF0790014 +:10BB20007F0502212334FFFBC3EA94E1EB943F221B +:10BB300034FFFBC3EA9461EB943F2212BB48A3227B +:10BB400012BB48A3A3A3A322F0888289832274F6A0 +:10BB5000122051E9FEC39420400479128029EE900E +:10BB60000597F0601AEA4B60F112BD22122264EAD6 +:10BB7000FCEBFD7A987B051210BF7402121FF29045 +:10BB800005967401F0790002BD1D74F4122051E98C +:10BB9000FE900442E064096014E0640A600FE0640F +:10BBA0000B600AE0640C6005E0640D700579210209 +:10BBB000BCC0900591E0F8600F740168600A7403DE +:10BBC0006860057402687023900587E0F960057469 +:10BBD000016970177403686005740268701290053B +:10BBE0008FC3E094A0A3E094005005791202BCC07A +:10BBF000EE60761470F590058EE0640160AFE86049 +:10BC0000057401687008120D4DE954FD709F7901AB +:10BC1000120D35900585EAF0A3EBF090058E7401C6 +:10BC2000F0900442E0600302BCBE120DF58A088B5E +:10BC3000098C0A8D0B908F5E7808121E38908F3613 +:10BC40007808121E8612BCD27808121EBB12BCD213 +:10BC5000A3A3A3A3E4F0A3F0120BCDE9600612BCEA +:10BC6000C502BBAD120D1D805590058EE07003021C +:10BC7000BBADA2AFE433FFC2AF12BCC5120D59E990 +:10BC80007037120DE3906182E0C2E6F0E5E170FCEE +:10BC900075E1017591BF75E1F1900448E0640170B0 +:10BCA000187A207B00900441E0F91211917A207BF0 +:10BCB00000900441E0F9121119EFA2E092AF79006F +:10BCC0007F040221237A857B05120D3B90058EE4CB +:10BCD000F02290058512BCDBA3A322E0F8A3E0F5D7 +:10BCE0008388822274F6122051E9FEC39420400416 +:10BCF00079128029EE9005B7F0601AEA4B60F112D4 +:10BD0000BD22122264EAFCEBFD7AB87B051210BF5B +:10BD10007402121FF29005967401F079007F0202FE +:10BD20002123E0F50875090078082274F6122051E5 +:10BD3000EAFEEBFF8C088D09900442E06407600482 +:10BD4000790C8053EC450970047912804A12BDE4E5 +:10BD5000704512BE607E008E82AC82E5082CF582B2 +:10BD6000E50912BD9CC0E0C3E49CF895E0F9EA281F +:10BD7000F8EB39F9E824D2F582E912B2F9D0E0F013 +:10BD80000EEEC3941040D0EA24D412B2F67401F03F +:10BD90007905120C2D79008084F582EB12B309220B +:10BDA00074F7122051EAFEEBFF900442E064076052 +:10BDB00004790C802C12BDE4702712BDE924DD1239 +:10BDC000B670700DEA24F512B2F67406F0790280AE +:10BDD0000BEA24DE12B2F67406F0790D120C2D79FE +:10BDE0000002B965120B5BE92212BE64EA22C0822E +:10BDF000C083C3EB940F5004EA4B60047912800CAB +:10BE0000900475E0700479028002790002BE1E126F +:10BE1000283A7404221227DD740422F07900D083BA +:10BE2000D082020122E0F508A3E0F509EA4B229056 +:10BE3000042FE090043BF0900430E090043CF0903C +:10BE40000431E090043DF0900432E090043EF09024 +:10BE50000433E090043FF0900434E0900440F0227A +:10BE600012BE642212BE7474722EFA74043FFB2256 +:10BE700012BE7422EE75F004A4CEA8F028F875F076 +:10BE800004EFA428FF2212BE8A22120DF58A0C8B21 +:10BE90000D8C0E8D0F2274F41220518908EAFEEBEE +:10BEA000FF75091274FE6E700374FF6F701B9003B0 +:10BEB0002212C4B3606412BF21605F7AFE7BFFA9C7 +:10BEC0000812204FE9F509805174FF6E700374FF6A +:10BED0006F702F90032212C4B3601B12BF21601633 +:10BEE0007AFF7BFFA90812204FE9F5097008E508E1 +:10BEF000900324F08024A9081206A5E9F509701A18 +:10BF000080EC12C6716013E06508700B7913EEFACD +:10BF1000EFFB12090380AD750903A9097F04022113 +:10BF200023E0F5838882E0F8A3E0F988828983E53D +:10BF30008245832274F2122051890AECFEEDFF90B3 +:10BF40000301E064026005E064017004791280502E +:10BF5000EE4F70047902804812C94570047914804C +:10BF60003FE50A600B8A828B83A3A3A3E0D2E1F0B2 +:10BF7000750C10750D00780C122264EEFCEFFDEAD2 +:10BF8000240DFAEB12BFA3121FF212C597121ECA9C +:10BF9000E508241DF582E50912CCF0121ED67900C1 +:10BFA00002C4A43400FB1210BF74022274F21220E7 +:10BFB000518A088B09ECFEEDFF900301E0640260FA +:10BFC0000EE064016009E064087009EE4F600579D5 +:10BFD0001202C0A6EA45097005790202C0A612C481 +:10BFE000B06005791102C0A68A828B8312C4A98A27 +:10BFF0000A8B0BEA450B7005791402C0A67A1F7BE9 +:10C000000012114F900320EAF0A3EBF012C4B070BD +:10C0100005791302C0A67C1F7D0079001210D7128B +:10C02000C84A12C0A9A3EAF0A3EBF0750C16750D6F +:10C0300000780C122264E5082402FCE5093400FDB6 +:10C04000900320E02403FAA3E012BFA3121FF21210 +:10C05000C0A97402F0900301E0A2E35004D2F08082 +:10C0600002C2F0900320E02403F50CA3E03400F5B5 +:10C070000D780C12226412C0B590032BE0FAA2F0E6 +:10C08000E433F9120F3F7402121FF2E9F508EE4F84 +:10C09000600BEEFCEFFDAA0AAB0B120F7BE508600C +:10C0A000031206B1A90802C4A4900320E0F8A3E09B +:10C0B000F583888222850882850983E0FCA3E0FD60 +:10C0C0002274F412205174FF121FDCEAFEEBFF8988 +:10C0D00008120AB98B0BEA450B7004791480148599 +:10C0E0001882851983E508F0AC82AD83EEFAEFFB88 +:10C0F000120F637401121FF202BF1C74F012205160 +:10C1000074F0121FDC8A0C8B0D8C0E8D0F742012B4 +:10C110002045E0FEA3E0FFEEFAEFFB120AB98B091F +:10C12000EA4509700479128071908F6A780C1214B4 +:10C13000FE5004790280637C107D007900851882AE +:10C14000851983AA82AB831210D78518828519833B +:10C15000E50CF0850D09E509F5087401122045E5A7 +:10C1600008F0850C08850E0A850F0B7410780812EC +:10C170001DED7402122045E508F07418780C121DAC +:10C18000ED7403122045E50CF0EEFCEFFD851882FE +:10C19000851983AA82AB83120F457410121FF27F98 +:10C1A0000802212374F01220518A0A8B0B890E8C0D +:10C1B0000C8D0D7410122045E0F50F900301E06422 +:10C1C000026005E064017005791202C276EC450D4B +:10C1D0007005790202C276120AB98A088B09AE0884 +:10C1E000AF09EE4F7005791402C276EE2421F508EE +:10C1F000EF12C3D2850882F58312CCFB60031211C3 +:10C20000557C1B7D00AA0CAB0D1210CB85088285D6 +:10C210000983EAF0A3EBF012C0B5EC4D700479137A +:10C220008054900301E0A2E35036E50F6032EC2425 +:10C2300012F508ED12C3D27808122264EC2410F52E +:10C2400082ED12CCF012227BEC241AF582ED12C39F +:10C25000D7F9AA0AAB0B120F817404121FF28002E5 +:10C260007900EE2403F582EF12C3D7D2E2F0E50E97 +:10C270006004E0D2E1F002C19F74EA1220518A0EFC +:10C280008B0FEA450F700302C3C990031E12C4B39B +:10C29000600512C0AF8003900E2DE0F50C90032CCA +:10C2A00012C4B3600F12C0AFA3A312BF26600579FA +:10C2B0000012204FE50E2407F50AE50F3400F50BB8 +:10C2C000E50E2408F508E50F12C3D2AA08FB850A7B +:10C2D00082850B83E0F9120609E9FB850A82850B4A +:10C2E00083F0E50E2403FEE50F3400FFE50E240481 +:10C2F000F512E50F3400F513E50E240EF510E50FE9 +:10C300003400F511E50E2414F582E50F12C3D7F5BC +:10C31000147515007814122264E50E2412F582E5D6 +:10C320000F12CCF012227BE50E2410F582E50F12DD +:10C33000CCF012227B85108285118312227B85121C +:10C340008285138312227BAC08AD09AA0C8E828FE2 +:10C3500083E0F9120693740A121FF28E828F83E033 +:10C36000703185108285118312227B780812226435 +:10C37000850A82850B83E0FD7C018512828513830B +:10C3800012C850A90C120AAD7404121FF2E98E8271 +:10C390008F83F090031E12C4B3602E1206B7900371 +:10C3A00024E06025F91206A5E9601E8E828F83E0E5 +:10C3B000FB85128285138312C0BB900324E0FAEB45 +:10C3C000F9120699900324E4F07F0E022123F50868 +:10C3D000E5093400F509223400F583E02274F712F0 +:10C3E0002051EAF8EBF988828983A3A3A3A3A3A32E +:10C3F000A3A3A3A312227B88828983A3A3A3A3A3BD +:10C40000A3A3A312227B88828983A3A3A3A3A3A3AC +:10C4100012C0BB88828983A3A3A3A312C8508882B9 +:10C420008983A3A3A3E0F912069F7404121FF27F6D +:10C430000102212374F2122051EAFEEBFF750A007B +:10C44000EE2403F8EF3400F9880889098882F5831F +:10C4500012C4A98A828B83E58245836009E0F50ACC +:10C4600012C84A120AB3900324E06011650A700DE5 +:10C47000E0F91206A5E96024900324E4F0E50A60DF +:10C480001B8E828F83A3A3A3A3A3E0FB12C0B5AA34 +:10C490000A8E828F83A3A3E0F912069912C4B060BA +:10C4A000031206B17F0602212312C854120AB922D0 +:10C4B000900320E0F8A3E0F9E8492274E812205143 +:10C4C000890B8A0E8B0A8C0C8D0D741A122045E094 +:10C4D000F516A3E0F517741C122045E0F514A3E04F +:10C4E000F515741E122045E0F510A3E0F511742037 +:10C4F000122045E0F5087A1312C661700302C59256 +:10C500008E828F8374D0F0A3E50B12CA0F740512CC +:10C51000CA17E50AF0EE2404FAEF3400FBE50C45F7 +:10C520000D60177512067513007812122264AC0C98 +:10C53000AD0D12BFA6121FF280097C067D007900A6 +:10C540001210D77418122045E0F8A3E0F98E828FFC +:10C5500083A3A3A3A3A3A3A3A3A3A3E8F0A3E91284 +:10C56000CAFEE516F0A3E517F0EE240E12CCEDE5B9 +:10C5700014F0A3E515F012C597E510F0A3E511F04E +:10C58000EE241212CCEDE508F0EEFAEFFBA90E1244 +:10C5900010EF7F10022123EE2410F582EF3400F516 +:10C5A000832274F212205189098A08ECFEEDFF8B78 +:10C5B0000A7A067B001210E3EA4B60278A828B839B +:10C5C00074D0F0A3E509F08A828B83A3A3740612CA +:10C5D000C5E6EEF0A3EF12C5E6A3A3E50AF0A908AD +:10C5E0001210EF02C4A4F08A828B83A3A3A3227447 +:10C5F000EC12205189108A088B098C0A8D0B741457 +:10C6000012204512C85A7416122045E0F50EA3E018 +:10C61000F50F7A0C12C6616045AA08AB0912C67103 +:10C620007003900E2DE0F98E828F8374D0F0A3E515 +:10C630001012CA0F740712CA28E508F012CA2DA3F7 +:10C64000E50B12CA37E50CF0A3E50D12CA37A3A318 +:10C65000E50EF0A3E50FF0EEFAEFFB1210EF02C8C3 +:10C660001A7B001210E38A128B13AE12AF13EE4F37 +:10C6700022120AB98A828B83E58245832274F612DC +:10C680002051120ABF8A828B83E5824583600B7931 +:10C6900013A312C850120903800279127F020221EB +:10C6A0002374EC12205189118A088B098C107414A0 +:10C6B00012204512C85A120AB98A0E8B0FEA450F8A +:10C6C000700302C81A12C4B0700302C81A7A0E7B33 +:10C6D0000012CD2F60027A29900320E0241B12CD96 +:10C6E000356008EA2416FAE43400FB900320E024C5 +:10C6F0001D12CD356008EA2414FAEB3400FBE50C7A +:10C70000450D6008EA241BFAEB3400FB1210E38AA3 +:10C710000A8B0BEA450B700302C81A7C0E12CA0082 +:10C720008A128B13AE12AF13EE4F7008850E8285FE +:10C730000F83E0FE850A82850B8374D0F0A3E51198 +:10C7400012C824740A12C81FE508F0A3E50912C82C +:10C750001FA3A3E510F0E50A240EF508E50B12C3AC +:10C76000D212CD2F6023E50A240612C82E241B12F4 +:10C77000C3CE750E1B750F00780E12226490032035 +:10C78000E0241912C862121FF2900320E0241B1249 +:10C79000CD356023E50A240812C82E241612C3CE14 +:10C7A000750E16750F00780E122264900320E02497 +:10C7B0001B12C862121FF2900320E0241D12CD3517 +:10C7C0006023E50A240A12C82E241412C3CE750E63 +:10C7D00014750F00780E122264900320E0241D12BD +:10C7E000C862121FF2E50C450D6023E50A240C1205 +:10C7F000C83475081B7509007808122264AC0CADAA +:10C800000D8A828B8312C85012BFA6121FF2AA0A89 +:10C81000AB0BEEF91210EF1206B17F0C02212312BE +:10C82000C824A322F0850A82850B83A3A32212C801 +:10C8300034E50822F8E50B3400F9E8FAE9FB8A82CE +:10C840008B83E508F0A3E509F0228508828509833A +:10C8500012C85422E0FAA3E0FB22E0F50CA3E0F5B5 +:10C860000D2212CD23FCA3E0FD8A828B8312C854D3 +:10C870001210BF740222C082C08312C4B060311291 +:10C88000CD136003121155900320E0241B12CD1923 +:10C890006003121155900320E0241D12CD1960038E +:10C8A00012115590032012C8D2900320E4F0A3F097 +:10C8B000D083D082020122C082C08390031E12C4A2 +:10C8C000B3600D90031E12C8D290031EE4F0A3F0D3 +:10C8D00080DE12C8541211552274F0122051890CB6 +:10C8E0008A0A8B0B12C94560597A257B001205DF35 +:10C8F0008A0E8B0FAE0EAF0FEE4F70088508828543 +:10C900000983E0FE7A057B001210E38A088B09EAAE +:10C910004509602E7C057D0079001210D7850882BC +:10C9200085098374D0F0A3E50C12C950740E12C9A6 +:10C9300050A3E50AF0A3E50BF0AA08AB09EEF91243 +:10C9400010EF02C19F120AB98A088B09EA45092231 +:10C95000F0850882850983A3A32274EC12205189F3 +:10C96000088A0E8B0F8C098D0A7414122045E0F58D +:10C970000C7415122045E0F50B120AB98A128B13BC +:10C98000EA451360787A0B7B001210E38A108B1152 +:10C99000AE10AF11EE4F60657C0B12CA008A108B8F +:10C9A00011A810A911E8497008851282851383E047 +:10C9B000F88E828F8374D0F0A3E50812CA0F740F2B +:10C9C00012CA17E50EF0A3E50F12CA2812CA2D8E5F +:10C9D000828F83A3A3A3A3A3A3A3E50C12CA37E565 +:10C9E0000BF07416122045EE2409FCEF3400FD74A0 +:10C9F00002121EEFEEFAEFFBE8F91210EF02C81A6E +:10CA00007D0079001210D77A257B001205DF22F015 +:10CA10008E828F83A3A32212CA1B2212CA1F22F066 +:10CA20008E828F83A3A3A32212CA1BA322A3E5098C +:10CA300012CA3DE50AF02212CA3DA3A32212CA1F60 +:10CA4000A3A3A32274EE1220518A0A8B0B890E1223 +:10CA50000AB98A0C8B0DEA450D700302CAF97A0DEA +:10CA60007B001210E38A088B09AE08AF09EE4F7005 +:10CA70000302CAF97A257B001205DF8A088B09EACE +:10CA800045097009850C82850D83E0F5088E828F3B +:10CA90008374D0F0A3E412CA0F740BF075100675FE +:10CAA00011007810122264E50C2405FCE50D340019 +:10CAB000FDEE2403FAEF12BFA3121FF28E828F83C2 +:10CAC000A3A3A3A3A3A3A3A3A3E50AF0A3E50BF049 +:10CAD000EE240B12CCEDE50EA2E0500474018001AF +:10CAE000E412CAFEE50EA2E1500474018001E4F0F4 +:10CAF000EEFAEFFBA9081210EF7F0A022123F0EEF5 +:10CB0000240CF582EF3400F5832274E81220518959 +:10CB1000148A118C088D098B10741812204512C8C4 +:10CB20005A741A122045E0F50EA3E0F50F741C129A +:10CB30002045E0F516A3E0F517741E122045E0FE2F +:10CB4000A3E0FFAA08AB09120AB98A0A8B0BEA45CF +:10CB50000B700302CC1CE514600302CC1CEA240316 +:10CB6000F582EB12C3D7D2E4F0E510A2E2E0500464 +:10CB7000D2E18002C2E1F0E50C450D7010E50E45F2 +:10CB80000F700AE51645177004EE4F6060E0D2E2C0 +:10CB9000F0EE4F603012C597121ECAE50A241DF54B +:10CBA00082E50B12CCF0121ED675121075130078A8 +:10CBB00012122264EEFCEFFDE50A240DFAE50B12D9 +:10CBC000BFA3121FF2E50A2421F50AE50B3400F594 +:10CBD0000BE50C450D601BE511701712CCF56003D9 +:10CBE0001211557C1B7D00AA0CAB0D8021E0C2E226 +:10CBF0008029E50E450F602474016511701E12CC6A +:10CC0000F560031211557C1B7D00AA0EAB0F1210AC +:10CC1000CB850A82850B83EAF0A3EBF012C4B070D7 +:10CC20000302CCDCE50C450D602912CD2F700A7A89 +:10CC30001B12CCDF241912CD0112CD136015750A19 +:10CC40001B750B00780A122264AC0CAD0D12BFA646 +:10CC5000121FF2E51645176035900320E0241B12E1 +:10CC6000CD35700A7A1612CCDF241B12CD01900349 +:10CC700020E0241B12CD196015750A16750B00787B +:10CC80000A122264AC16AD1712BFA6121FF2EE4FA5 +:10CC90006035900320E0241D12CD35700A7A1412FD +:10CCA000CCDF241D12CD01900320E0241D12CD19EC +:10CCB0006015750A14750B00780A122264EEFCEFF9 +:10CCC000FD12BFA6121FF2780E122264AC10AA0841 +:10CCD000AB09A9141206AB7402121FF202C5927BB3 +:10CCE0000012114F8A0A8B0B900320E022F582EF8D +:10CCF0003400F58322850A82850B8312C854EA4BDF +:10CD000022FAA3E03400FB8A828B83E50AF0A3E5D4 +:10CD10000BF022900320E0241912CD23FAA3E0FBAC +:10CD2000EA4B22F8A3E03400F988828983E022905C +:10CD30000320E0241912CD23F8A3E0F9E849227476 +:10CD4000EE122051890B8A0C8C0E8D0F741212205A +:10CD500045E0F508A3E0F509750A0012CE45600527 +:10CD6000791102CE23E5084509603C7A217B001247 +:10CD700005DF8A108B11A810A911E5082415FEE51E +:10CD8000093400FF8E828F83E0C398E49940187ABB +:10CD9000227B001205DF8A108E828F83E0FAC3E5C2 +:10CDA000109AEB94005004790280787A637B001229 +:10CDB000114F9007CEEAF0A3EBF012CE4570047944 +:10CDC0001380607C637D0079001210D712CE28E4B6 +:10CDD000F09007CEE012DBB1E50B12CE3DE50C1270 +:10CDE000CE3DA3E50EF0A3E50FF09007CE12D523BC +:10CDF000A3E508F0A3E509F012D8ABE4F0A3F090A6 +:10CE000007CEE0241A12DAB2E4F0E50B6006120F46 +:10CE100087E9F50A12CE287401F0E50A6003120FC3 +:10CE2000BDA90A7F0A02212312CE2C229007CE121E +:10CE3000CE3322E0F8A3E0F5838882A322F012CE5D +:10CE40002CA322E9FE9007CEE0F8A3E0F9E84922FE +:10CE500074F61220517E0012CE457005791202CF71 +:10CE6000189007CEE0241A12DAC5F8740268600A36 +:10CE7000740368600574046870E212CF296C700353 +:10CE8000A3E06D6005790202CF187508108E09784D +:10CE900008122264EAFCEB12CF1B12D5F9121FF222 +:10CEA00079109007CEE0242BFAA3E03400FB120F98 +:10CEB0000F9007CEE0241BF508A3E03400F50978B5 +:10CEC0000812226412D5FF12CF1B120F75740212C2 +:10CED0001FF29007CEE0240112DAC5FA9007CEE0E7 +:10CEE000FBA3E0F5838B82E0600D74036A702788F2 +:10CEF0008289837402801974046A70098882898324 +:10CF00007402F0801174036A700C8882898374053E +:10CF1000F0120F8DE9FEEEF902D96FFD9007CEE019 +:10CF20002407FAA3E03400FB229007CEE0F8A31216 +:10CF3000D8CCE022C082C0839007D002D29C74F784 +:10CF400012205112CE43601312CF2F6A7003A3E058 +:10CF50006B700874016E7003120FBD7F01022123F4 +:10CF6000C082C0837917120FC302D2A174F41220B9 +:10CF70005174ED121FDCEAF8EBF9851882851983EC +:10CF8000E4F088828983A3A3A3A3A3A312D94B8A25 +:10CF9000828B83E0F50AE824020808E93400F9E806 +:10CFA000FEE9FFE50A14603614603314604F146024 +:10CFB0007A14700302D03914700302D0471470033E +:10CFC00002D05514700302D06314700302D07114A0 +:10CFD000700302D07F14700302D08E02D09D7401C2 +:10CFE000122045AC82AD83121023E9F874126870E8 +:10CFF0001A8518828519837406F002D0F67401121E +:10D000002045AC82AD8312102FE9F8E8600302D00E +:10D01000ED750B078E828F8312D94B120AB9EA4B3A +:10D02000600302D0A875080802D0E47401122045FC +:10D03000AC82AD8312103B80D07401122045AC82CB +:10D04000AD8312104780C27401122045AC82AD83BB +:10D0500012105380B47401122045AC82AD831210BB +:10D060005F80A67401122045AC82AD8312107180DE +:10D07000987401122045AC82AD83121077808A74B7 +:10D0800001122045AC82AD8312108302D0097401D5 +:10D09000122045AC82AD8312108F02D00985188210 +:10D0A000851983740702CFF9900301E0A2E35005CC +:10D0B0009007D280039007D012CE48602412D57C0E +:10D0C000F8A3E0F98909E8450960167401122045C2 +:10D0D000AC82AD83A90A888285098312204FE9F5C5 +:10D0E0000B850B08851882851983E508F085188261 +:10D0F000851983E0600DAC82AD838E828F8312D45C +:10D10000C38003120EEB7413121FF27F040221235B +:10D1100074F6122051ECFEEDFF7508417509107888 +:10D1200008122264790212D978121FF2E9F5088EEA +:10D13000828F83E0F9120FC3A90802D96F74F41229 +:10D140002051EAFEEBFF890812CE45700302D22976 +:10D1500012CF2F6E7003A3E06F600302D2299007F5 +:10D16000CEE0240108A3E03400F9E8FAE9FB8A8262 +:10D170008B83E0F8740668600302D21912D3EC6066 +:10D180007C9007CF12D8C5F8A3E0F99007CEE02431 +:10D1900018FCA3E03400FD8C828D83E0FCA3E0FD4D +:10D1A000E8241312DBA8F8A2E050178C828D83A329 +:10D1B000A3A3A3A3E0A2E050098A828B837407F0A3 +:10D1C000804BE8540260168C828D83A3A3A3A3A393 +:10D1D000E0540260088A828B83740980E2E8540478 +:10D1E00060168C828D83A3A3A3A3A3E054046008DC +:10D1F0008A828B83740B80C79007D280039007D0FC +:10D2000012CE48600812D289600312204F12D282D7 +:10D21000703C7900120FC38035741168700BE508FB +:10D220006003750832A90880EBE5087018EEFAEF84 +:10D23000FB120AB98A828B83E58245836007A3A328 +:10D24000A3E0D2E4F0EEFAEFFBA9081206BD7901E3 +:10D2500002D10BC082C08312CE45602412D57C70EF +:10D26000059007D080039007D212CE48600812D2F2 +:10D2700089600312204F12D28270057900120FC309 +:10D28000801F12CE2CE064122212DBB7A3A3E0F8B9 +:10D29000A3E0F988828983E582458322EAF0A3EB43 +:10D2A000F0D083D08202012274E812205174E91276 +:10D2B0001FDC851882851983EAF0A3EBF08C168DAC +:10D2C00017742F122045E0F514A3E0F51512CE4592 +:10D2D0007005791202D3E212D581120AB98A088B3D +:10D2E00009AE08AF09EE4F7005791402D3E274025B +:10D2F000122045AA82AB83120FCF12D8B5FAA3E051 +:10D30000FBEE2405F512EF3400F513EE2404F510BE +:10D31000EF3400F51112D3EC602F74021220458512 +:10D32000820C85830DEAFEEBFF12062DE9F50E79DE +:10D33000001206338A0A8B0B851082851183E0F573 +:10D340000F851208851309802B8A0C8B0D7402122D +:10D350002045AE82AF8312062DE9F50F7900120643 +:10D36000338A088B09851082851183E0F50E8512BA +:10D370000A85130B7410122045AC82AD83EEFAEFD0 +:10D38000FB1210177409122045AC82AD83AA0CABB6 +:10D390000D12101178141222647808122264E50F1D +:10D3A000F5087808122268780A1222647410122094 +:10D3B0004585820885830978081222647419122031 +:10D3C000458582088583097808122264A90EAC1667 +:10D3D000AD17740B12204512D94B120EFD740B12AF +:10D3E0001FF27417121FF27F100221239007CEE064 +:10D3F000F8A312DBB7E02274F612205174F7121F63 +:10D40000DCEAFEEBFF8C088D099007D012CE487045 +:10D410000302D4BE12DBB312CE48700302D4BE8C1A +:10D42000828D83E0C0E07402122045D0E0F08C824F +:10D430008D83A3E0C0E07403122045D0E0F08C821D +:10D440008D83A3A3E0F97404122045AA82AB831252 +:10D450000F1B850882850983A3A3A3E0C0E074069F +:10D46000122045D0E0F0850882850983A3A3A3A3F9 +:10D47000C082C0837407122045AC82AD83D083D0B4 +:10D48000827402121EEF7402122045AC82AD8379C1 +:10D4900001EEFAEFFB9007D012D3EF12DBB11220AE +:10D4A0004FE9851882851983F060137401122045B5 +:10D4B000E9F0AC82AD838E828F83A312D4C374094A +:10D4C00002D96CE0FAA3E0FB120F632274F212207F +:10D4D000518908740E122045E0F50AA3E0F50B749B +:10D4E00010122045E0F50CA3E0F50D9007D212CE06 +:10D4F0004860299007D212D523E0FEA3E0FFEE4F4B +:10D50000601A780C122264780A122264A9088E82AA +:10D510008F8312204F7404121FF2800279027F065B +:10D5200002212312D58DA32274F612205174F91210 +:10D530001FDC12CE45603B851882851983AA82AB19 +:10D5400083120FCF12D58112D579601E750811751F +:10D55000091078081222647402122045AC82AD834F +:10D56000790712D978121FF2800A75081775091009 +:10D5700080E07901740702D96C9007CF12DBB7E025 +:10D58000229007CE12D58DE0FAA3E0FB2212CE3313 +:10D59000A3A32274F612205174F0121FDC75081038 +:10D5A00075090078081222649007CEE0241BFCA3C2 +:10D5B000E03400FD740212204512D5F5121FF275F9 +:10D5C000082975091002D95174F612205174F0120D +:10D5D0001FDC750810750900780812226412D5FF47 +:10D5E000FD740212204512D5F5121FF2750835752B +:10D5F000091002D951AA82AB831210BF7402229083 +:10D6000007CEE0242BFCA3E034002274F01220515A +:10D610008A088B09750A007A077B0012114F12D80D +:10D62000ABEAF0A3EBF088828983E0FA4B70030247 +:10D63000D87D12D8BFFEA3E0FF750C07750D0078EA +:10D640000C122264AC08AD0912D5F9121FF212D3E4 +:10D65000EC600302D7DCEE2413FCEF3400FD12D89B +:10D66000B52405F50CA3E03400F50D8C828D83E024 +:10D67000F8A3E0F9850C82850D83E0A2E092F0E842 +:10D68000A2E020F001B35007A2E0E433FA80027A6E +:10D6900000E854FE4AF88C828D8312D899C313A2F5 +:10D6A000E092F0E8C313A2E020F001B35012E85476 +:10D6B000026004D2F08002C2F0A2F0E433FA8002E9 +:10D6C0007A00E854FDF8EAC333FAE433FBE84AF899 +:10D6D000E94B12D8A5543FA2E092F0E81313543F4F +:10D6E000A2E020F001B35013E854046004D2F080AB +:10D6F00002C2F0A2F0E433F50E8003750E00750F40 +:10D7000000E854FBFAE9FB7402780E121FC9EA45DF +:10D710000EF8EB450F12D8A513541FA2E092F0E8C3 +:10D72000131313541FA2E020F001B35013E8540860 +:10D730006004D2F08002C2F0A2F0E433F50E800360 +:10D74000750E00750F00E854F7FAE9FB7403780EC4 +:10D75000121FC912D887540FA2E092F0E8C4540FE8 +:10D76000A2E020F001B35013E854106004D2F0801E +:10D7700002C2F0A2F0E433F50E8003750E00750FBF +:10D7800000E854EFFAE9FB7404780E121FC912D8AE +:10D7900087135407A2E092F0E8C4135407A2E020D4 +:10D7A000F001B35013E854206004D2F08002C2F0BC +:10D7B000A2F0E433F50C8003750C00750D00E854FD +:10D7C000DFFAE9FB7405780C121FC9EA450CF8EB87 +:10D7D000450DF98C828D83E8F0A3E9F09007CEE047 +:10D7E000241AF8A3E03400F9850882850983A3E0B0 +:10D7F00060118E828F83A3E060098882898374051B +:10D80000F0807D850882850983A3A3E05404701508 +:10D81000EE2412F582EF12DBABA2E2400888828987 +:10D8200083740180DB850882850983E0FA8E828F0C +:10D8300083E0FB9007CEE0FCA3E0F5838C82E06000 +:10D8400006EBFEEAFD8004EBFDEAFEEEC394055014 +:10D8500027EDC3940550218E08ED75F005A4FAABB1 +:10D86000F0744E2AFA748E3BFBEA2508F582EB121F +:10D87000DBAB888289838088750A188003750A1358 +:10D88000A90A7F08022123EA450EF8EB450F12D8BA +:10D8900093C422F98C828D83E8F0A3E9F0850C8291 +:10D8A000850D83E02212D8931313229007CEE02433 +:10D8B0001812DAB6229007CEE0241812DAC92290A4 +:10D8C00007CEE0F8A312D8CCA3A3E022E0F583882A +:10D8D00082A3A3A32274F612205175084D75091076 +:10D8E0007808122264791112D97802D96C74F61270 +:10D8F000205174EE121FDCEAFEEBFF741C1220456F +:10D9000012D94B851882851983ECF0A3EDF07508C8 +:10D91000087509007808122264EAFCEBFD74041211 +:10D92000204512D5F5121FF27508597509107808AF +:10D930001222647402122045AC82AD83790B12D995 +:10D9400074121FF2741280249007CEE0FAA3E0FB59 +:10D950002278081222647402122045AC82AD8379C9 +:10D960001112D58112D978121FF27410121FF27F92 +:10D9700002022123EEFAEFFB12109574022274F6D4 +:10D9800012205175086575091002D8E074F4122050 +:10D990005174F9121FDCEAFEEBFF851882851983AA +:10D9A000E9F0750A06750B00780A122264740312F6 +:10D9B000204512D5F5121FF2750A6B750B10780A07 +:10D9C0001222647402122045AC82AD83790812D908 +:10D9D00074121FF2740702D10874F61220517508F0 +:10D9E0007D75091002D8E0C082C08312CE45605315 +:10D9F0009007CEE0241812DA4960031211559007FF +:10DA0000CEE0245B12DA4960031211559007CEE094 +:10DA1000245D12DA4960031211559007CEE0245FAD +:10DA200012DA4960031211559007CEE0246112DA30 +:10DA300049600312115512D9481211559007CEE4CE +:10DA4000F0A3F0120EF102D2A112DAC9FAA3E0FBA0 +:10DA5000EA4B2274F712205112CE4360529007CE47 +:10DA6000E0246112DAB212227B9007CEE0245F122A +:10DA7000DAB212227B9007CEE0245D12DAB21222D3 +:10DA80007B9007CEE0245B12DAB212227B9007CEA5 +:10DA9000E0241712DAC5FB12CF29FCA3E0FD12D552 +:10DAA00079FAEEF91206CF7408121FF2120FBD02B6 +:10DAB000CF5B12DAB62212DABA22F8A3E03400F908 +:10DAC000888289832212DAC92212DABAE022C0825D +:10DAD000C083791012D948EA4B60479007CEE02402 +:10DAE00018FAA3E03400FB8A828B8312D94BEA4BED +:10DAF000603012D8BFFCA3E0FDEC4D6025EC24158E +:10DB0000F8ED3400F9EA2404FAEB3400FB8882894A +:10DB100083E0FC8A828B83E0C39C400488828983F3 +:10DB2000E0F902D2A174F6122051EAFEEBFF12CE08 +:10DB300045606912DBB3A3A3A3A3A312CE48605C24 +:10DB40008808890988828983E08E828F83F08882A1 +:10DB50008983A3E08E828F83A3F0E8241212DBA8CE +:10DB6000F9EE24020A0AEF3400FB120F1BE5082429 +:10DB700015F582E50912DBAB8E828F83A3A3A3A3E5 +:10DB8000F0E5082413F582E5093400F583EE240559 +:10DB9000FCEF3400FD7402121EEF80097C077D004B +:10DBA00079001210D702D96FF582E93400F583E0CD +:10DBB00022F8A312DBB722E0F5838882227F0102DC +:10DBC000212374F412205174FD121FDCEAFEEBFFD6 +:10DBD0008C088D09EE4F6005EC45097004790280D0 +:10DBE0005E7903851882851983AA82AB83120F0F91 +:10DBF0007402122045E0543F4440F0780812226439 +:10DC00007402122045AC82AD83EEFAEFFB120EF7E0 +:10DC10007402121FF2E9FE7024750A03750B007876 +:10DC20000A1222647402122045AC82AD83E50824F6 +:10DC300003FAE5093400FB12E789121FF2EEF974CA +:10DC40000302DCE574F412205174FA121FDC8A0816 +:10DC50008B09ECFEEDFFEA45096004EE4F70047994 +:10DC600002807E750A03750B00780A122264EE2486 +:10DC7000030C0C0CEF3400FD740212204512E785F2 +:10DC8000121FF27402122045E0543F4440F0740326 +:10DC900012204585820A85830B780A122264740259 +:10DCA000122045AC82AD83AA08AB09120EF77402AC +:10DCB000121FF2E9702B750803750900780812220B +:10DCC00064EEFCEFFD7405122045AA82AB831210AE +:10DCD000D17402121FF2E9640170047900800279A4 +:10DCE0000174068000121FF27F0402212374E812DF +:10DCF000205174E8121FDC8A0A8B0B89178C088D5F +:10DD000009EA450B6005EC45097005790202DE263B +:10DD100074042517F51612E032700302DE21120694 +:10DD20001B8A0C8B0D8C0E8D0F85171075110078CA +:10DD300010122264AC0AAD0BEE2404FAEF3400FB9F +:10DD400012E3EB121FF28E828F83A3A3A3E50CF0E4 +:10DD5000E50DF5158E828F83A3A3F0850C10F511C8 +:10DD6000850E12850F1374107810121DEDE510F555 +:10DD7000148E828F83A3F0850C10850D11F512850A +:10DD80000F1374187810121DEDE510F50A8E828FAE +:10DD900083F07510107810122264120615EAFCEB5D +:10DDA000FD740A12204512E3E7121FF285188285DE +:10DDB00019838582108583117810122264A916EECA +:10DDC000FCEFFD740A122045AA82AB83120F277460 +:10DDD00002121FF2E9F50B703F850882850983E581 +:10DDE0000CF0A3E51512DE2BE51412DE2BA3E50AD9 +:10DDF000F0750C08750D00780C1222647402122064 +:10DE000045AC82AD83E5082404FAE5093400FB1231 +:10DE1000E3EB121FF2120621EEFAEFFB121155800E +:10DE200003750B13A90B741802E3DFF085088285D4 +:10DE30000983A3A32274E812205174DD121FDC743D +:10DE400001122045EAF0A3EB12E78F8C168D1774B0 +:10DE50003B122045E0F50B743C12204512E3F1EC37 +:10DE600045176006E50845097005790202E02D7442 +:10DE70000112204512E117120AB98A148B15EA45DE +:10DE8000157005791402E02D850882850983E0F577 +:10DE900010E4F511F512F513A3E0F50CE4F50DF51A +:10DEA0000EF50F7408780C121E067810790C121EED +:10DEB00025850882850983A3A3E0F50CE4F50D749C +:10DEC00010780C121E067810790C121E2585088217 +:10DED000850983A3A3A3E0F50CE4F50E7418780C70 +:10DEE000121E067810790C121E25EA241DF582EB0D +:10DEF00012E8FA780C121EAC7810790C1214DE407D +:10DF00000D908F62780C1214A3600302DE6A8518EC +:10DF100082851983E060118A828B83A3A3A3E0A288 +:10DF2000E14005790102E02D7C087D007900740351 +:10DF3000122045AA82AB831210D77404250BF50A70 +:10DF400012E0327005791302E02D850B0C750D007F +:10DF5000780C122264AC16AD17EE2404FAEF3400EC +:10DF6000FB12E3EB121FF2750C04780C122264AC66 +:10DF700008AD09EEFAEFFB12E3EB121FF2750C107D +:10DF8000780C122264E514240DFCE5153400FD74B0 +:10DF90001512204512E3E7121FF274031220458583 +:10DFA000820C85830D780C122264A90AEEFCEFFD29 +:10DFB0007415122045AA82AB83120F277402121F18 +:10DFC000F2E9F50A705E750C08750D00780C1222E6 +:10DFD000647405122045AC82AD83740D1220451285 +:10DFE000E3E7121FF2780C122264E5082404FCE532 +:10DFF000093400FD740D122045AA82AB831210D1A2 +:10E000007402121FF2E964016005750A0180157837 +:10E0100010122260740512204512E11712062774AF +:10E0200004121FF2EEFAEFFB121155A90A74230233 +:10E03000E3DFFA7B0012114F8A0C8B0DAE0CAF0D93 +:10E04000EE4F2274F4122051890812E17570030218 +:10E05000E106E508704B12E123E0750A08750B0034 +:10E06000780A7025122264EAFCEBFD9007CCE024CC +:10E070000212E10B121FF2120945E9700712E11DAD +:10E080007401807D7508018013122264EAFCEBFDA7 +:10E090009007CCE0240A12E10B121FF212E1756026 +:10E0A000617A127B001210E38A0A8B0BAE0AAF0B67 +:10E0B000EE4F603E8E828F8374C1F0A3E508F07549 +:10E0C0000A10750B00780A1222649007CCE0240233 +:10E0D000FCA3E03400FDEE24020A0AEF3400FB1238 +:10E0E000E789121FF2EEFAEFFB12E11DA3E0F9122D +:10E0F00010EF9007CC12E1171211559007CCE4F005 +:10E10000A3F079018002790002DCE8FAA3E0340090 +:10E11000FB1210BF740222E0FAA3E0FB229007CCAE +:10E12000E0F8A3E0F58388822274F21220517A206D +:10E130007B001205DF8A088B09E4F50AF50B8B0DCD +:10E14000EA450D601678081222607A017B0090077C +:10E15000D4E0F91211857404121FF202E224C08285 +:10E16000C0837A017B009007D4E0F9121191D0832B +:10E17000D0820201229007CCE0F8A3E0F9E849221E +:10E1800074F212205174D0121FDC8A0A8B0BECFE41 +:10E19000EDFF743E12204512E1E2122264AC0AAD9A +:10E1A0000B740212204512E3E7121FF2750A037581 +:10E1B0000B00780A122264EEFCEFFD741F1220455A +:10E1C00012E3E7121FF212E1D2780A122264742FCE +:10E1D000803A851882851983AA82AB83120F21E9C0 +:10E1E000FE22E0F508A3E0F5097C307D007900858A +:10E1F0001882851983AA82AB831210D7750C10750B +:10E200000D00780C22780A1222647422122045AC88 +:10E2100082AD83AA08AB0912E3EB121FF2EEF97488 +:10E2200030121FF27F0602212374E812205174B0CD +:10E23000121FDCEAFEEBFF8C168D17890A74681238 +:10E24000204512E3F1746A122045E0F50CA3E0F5D5 +:10E250000D746C122045E0F510A3E0F511746E12F8 +:10E260002045E0F50B746F122045E0F514A3E0F5AE +:10E27000157471122045E0F50EA3E0F50F7C307D9A +:10E280000079007420122045AA82AB831210D77542 +:10E2900012107513007812122264EEFCEFFD742246 +:10E2A00012204512E3E7121FF27C107D00790085F1 +:10E2B0001882851983AA82AB831210D7751207784A +:10E2C00012122264AC08AD09740212204512E3E771 +:10E2D000121FF27508077509007808122264AC0C49 +:10E2E000AD0D740912204512E3E7121FF2E50B6031 +:10E2F00009740E12204574018006740E122045E444 +:10E30000F0E50A6009740F12204574018006740F4D +:10E31000122045E4F07C107D007900EC122045AA23 +:10E3200082AB831210D77508067808122264AC10ED +:10E33000AD11741612204512E3E7121FF27808128D +:10E340002264AC14AD15741C12204512E3E7121FB1 +:10E35000F27508107808122264AC16AD17743212E8 +:10E36000204512E3E7121FF2851882851983AC82DB +:10E37000AD837430122045AA82AB83120F03742040 +:10E3800012204512E1D87808122264744212204506 +:10E39000AC82AD83743212204512E785121FF274ED +:10E3A00010122045AC82AD837430122045AA82AB96 +:10E3B00083120F037420122045AA82AB83120F210F +:10E3C000E9FF78081222647442122045AC82AD83C2 +:10E3D000AA0EAB0F12E3EB121FF2EE4FF9745012BC +:10E3E0001FF27F10022123AA82AB831210C5740290 +:10E3F00022E0F508A3E0F5092274F7122051791004 +:10E400008C828D83E0F88A828B83E068F0A3AA82F5 +:10E41000AB838C828D83A3AC82AD8319E970E1025A +:10E42000DBBD74F212205174D0121FDC8C0A8D0BEC +:10E43000743E122045E0FEA3E0FF74401220451216 +:10E44000E3F1750C10750D00780C122264EAFCEBF8 +:10E45000FD740212204512E3E7121FF2750C0878D2 +:10E460000C122264AC0AAD0B741212204512E3E7C1 +:10E47000121FF2750A08750B00780A122264EEFC6E +:10E48000EFFD741A12204512E3E7121FF212E49313 +:10E4900002E20512E1D2750A102274F4122051EA48 +:10E4A000FEEBFF890B750A0080181210DD12E8F1EF +:10E4B000EBF0050AE50AC3950B500712E8F1EAF004 +:10E4C000050AE50AC3950B40E102DCE8C082C0837F +:10E4D0008A828B83E0F902E16E74F6122051898200 +:10E4E000AE82E9A2E25004D2F08002C2F08A828BAE +:10E4F00083E054FCFCA3E0FDEC4E5403FCA2F0E4EA +:10E5000033F50875090074027808121FC9EC450834 +:10E51000FEE954F8FCEE4C8A828B83F0A3EDF07F89 +:10E520000202212374F6122051EA2420F508EB346C +:10E5300000F5097808122264EA2410FCEB3400FD8F +:10E5400012E87C121FF280D774E812205174ED1289 +:10E550001FDC7401122045ECF0A3ED12E78F8A1640 +:10E560008B177A107B0012114F8A128B137A107B53 +:10E570000012114F8A108B11E5124513700302E748 +:10E5800061EA4511700302E7617810122264AC124F +:10E59000AD13AA16AB17120F2D7402121FF2E9F574 +:10E5A0000A600302E76A12E8908A0E8B0FE50C45B9 +:10E5B0000D700302E742EA450F700302E742851837 +:10E5C00082851983E0240FF8E43400F97A107B0087 +:10E5D000121F4988088909AE08AF09E0540FFCEE04 +:10E5E0004F70067E017F008007EC70047801800286 +:10E5F0007800EE14C454F0FA7401122045E02AFAAF +:10E60000A3E03400FBE8A2E0500B780E122264ACC9 +:10E6100012AD1380588C0B750800850882AC82748B +:10E6200003122045E5822CF8E5833400F9ECC3950C +:10E630000B500FEA2CF582EB12E8FAE0888289830E +:10E64000800FE50B650888828983700474808001DF +:10E65000E4F00508E508C3941040BF780E12226468 +:10E66000AC10AD117405122045AA82AB8312E88A62 +:10E67000121FF27C107D007900AA0CAB0D1210D78E +:10E68000750800750900804C7403122045858214BA +:10E690008583157814122264E508C454F0F87403D5 +:10E6A000122045E028FCA3E03400FDAA0CAB0D12BB +:10E6B000E88A121FF2780C122264740512204512A7 +:10E6C000E874121FF2E9F50AE5082401F508E509E6 +:10E6D0003400F509EE24FFF8EF34FFF9C3E508989C +:10E6E000E50999A2D265D0335004E50A609AE50A9B +:10E6F00070597403122045858208858309780812B1 +:10E700002264AC0EAD0FAA0CAB0D12E88A121FF2F8 +:10E71000780C122264740512204512E874121FF25C +:10E72000E9F50A7508087509007808122264AC0C2E +:10E73000AD0D742D12204512E11712E789121FF258 +:10E740008009750A13E50C450D6007AA0CAB0D1284 +:10E750001155E50E450F6012AA0EAB0F1211558030 +:10E7600009750A13E51245136007AA12AB131211BB +:10E7700055E51045116007AA10AB11121155A90AF1 +:10E78000741302E3DFAA82AB831210BF740222F07B +:10E79000E9851882851983F02274EE1220518A08C7 +:10E7A0008B098C0E8D0F7412122045E0F510A3E03A +:10E7B000F51112E8908A0A8B0BAE0AAF0BE50C45F7 +:10E7C0000D700302E852EE4F700302E8527C107D98 +:10E7D0000079001210D7780C122264EEFCEFFDAA2B +:10E7E00008AB0912E87C121FF2E9F50A706D750892 +:10E7F0008D75098E850C82850D83E0A2E7400DACF6 +:10E800000EAD0FAA0CAB0D120F398016EEFCEFFD0A +:10E81000AA0CAB0D120F39780E12226412E8821284 +:10E820001FF2850E82850F83E0A2E7400DAC10AD8C +:10E8300011AA0EAB0F120F398021EEFCEFFDAA0ECC +:10E84000AB0F120F39781012226412E882121FF2F5 +:10E850008009750A13E50C450D6007AA0CAB0D1273 +:10E860001155EE4F6007EEFAEFFB121155A90A7F22 +:10E870000A022123AC82AD83AA16AB17120B0D74CA +:10E880000222AC08AD09EEFAEFFB120F337402223C +:10E890007A107B0012114F8A0C8B0D7A107B0012BC +:10E8A000114F2274F6122051740A122045E0F8A389 +:10E8B000E0F9750900850982AE82EC2EF582ED1231 +:10E8C000E8FAC082C083EA2EF582EB12E8FAE0D0C3 +:10E8D00083D082F508E06508C0E0E82EF582E912F1 +:10E8E000E8FAD0E0F00509E509C3941040C702E555 +:10E8F0001F850A08EE2508F582EF3400F58322749F +:10E90000F512205175090075080FE508F83395E0F8 +:10E91000F9EC28FEED39FFEA28F8EB39F98882890D +:10E9200083E0C3338E828F83F04509F08882898328 +:10E93000E0A2E7E433F50974FF2508F508C3940065 +:10E94000A2D265D03350C37F03022123C082C0838B +:10E950007B0012F1E9A3E412EE22A3A3A3A374FFA8 +:10E96000F00BEBC3940240EA90060E74FFF09006A1 +:10E970000DE4F090060CF090060FF0A3F002F1BA4F +:10E9800074EC12205190060FE0F50AA3E0F50BE5B8 +:10E990000A450B7006120BA902EC88850A82850BCA +:10E9A00083E0F914601814601524FE601124C4700B +:10E9B0000302EAFB24C0700302EAFB02EC8812ECBB +:10E9C0009AEE240EF512EF3400F513EE2402F5084A +:10E9D000EF3400F50990046FE0700302EA6512EC71 +:10E9E000CCF510A3E0F511AC10FDEEFAEFFB120D23 +:10E9F00029E9F50E7402650E60618E828F83E064F2 +:10EA000001600302EC88EE650A7003EF650B60039A +:10EA1000120BCDE50E701912ECA6121E38908F362F +:10EA2000780C121E86850882850983780C121EBB1D +:10EA3000851082851183A3A37808121EAC908F0ADB +:10EA40007808121E38908F367808121E868512823A +:10EA50008513837808121EBB02EC7B12ECAFAA1060 +:10EA6000AB1102EC85EE650A7003EF650B700302D3 +:10EA7000EC858E828F83E06401600302EC8812EEE5 +:10EA8000EC908F72780C121E38780C122260850878 +:10EA900082850983121ECA12EEE6121FF2E970582F +:10EAA00012ECA6121E38908F36780C121E8685083E +:10EAB00082850983780C121EBB900442E0640270C8 +:10EAC000288508828509837808121EAC908F4A78C1 +:10EAD00008121E38908F367808121E86851282859D +:10EAE00013837808121EBB800F908F62121ECA8596 +:10EAF0001282851383121ED602EC7B90046FE070A5 +:10EB00000302EBDB12ECCCF508A3E0F509900470EE +:10EB1000E0F875F004A4C8AAF02AF9747228F50A7E +:10EB2000740439F50BE50A2404F50EE50B3400F501 +:10EB30000F90060DE054076075A3E0F9120D2F8ABF +:10EB4000108B11AE10AF11AC08AD09120D29E9F50B +:10EB500010740265106057850E82850F83E0F912EC +:10EB60000D838E828F83E064017043120BCDE5101C +:10EB7000701912ECA6121E38908F36780C121E8671 +:10EB80008E828F83A3A3780C121EBB850882850911 +:10EB900083A3A37808121EAC908F0A7808121E383F +:10EBA000908F367808121E8612EE1B02EA53E50C8F +:10EBB000650A7004E50D650B601A850A82850B8372 +:10EBC000A3A3A3E0600B850E82850F83E0F9120DED +:10EBD0008312ECAFAA08AB0902EC8590060DE05455 +:10EBE00007700302EC88A3E0F912EC9A8E828F83FF +:10EBF000E06401600302EC8812EEEC12EC8D908F61 +:10EC000072780C121E38780C122260850882898373 +:10EC1000121ECA12EEE6121FF2E9705F12ECA61283 +:10EC20001E38908F36780C121E86850882850983DF +:10EC3000780C121EBBEE240EF8EF3400F9880A900F +:10EC40000442E064027027850882850983780C12EB +:10EC50001EAC908F4A780C121E38908F36780C12AA +:10EC60001E86850A828983780C121EBB800D908FC8 +:10EC700062121ECA88828983121ED690060E740103 +:10EC8000F0EEFAEFFB120D237F0C022123EE24029B +:10EC9000F8EF3400F98808890922120D2F8A088BB1 +:10ECA00009AE08AF092212EEF3908F5E780C22E5D0 +:10ECB0000C2404FEE50D3400FF8E828F83E0F912F0 +:10ECC0000D898E828F83E0900470F022120C57E938 +:10ECD000F875F004A4C8AAF02AF9747228F50C7427 +:10ECE0000439F50D850C82F583E02274F012205171 +:10ECF000EAFEEBFF8E828F83A3A3A3A3A3A3E0FA74 +:10ED0000A3E0FB120DD712EC8D8882F583121ECA88 +:10ED1000120DCB850882850983121ECA120DBF12FF +:10ED2000EE1B121ECA120DD18E828F83E0644070DA +:10ED300019EE2412F8EF3400F988828983E090609C +:10ED40006412EE22E09060658006906064E4F0A3B7 +:10ED5000F090060FEEF0A3EF12F15C12F5E812202E +:10ED60004F906054E412EE29A312EE29906182E0E4 +:10ED7000C2E6F07591BFEE2415F8EF3400F9880A69 +:10ED8000890B8882F583E064017003120E0DE5E1C2 +:10ED900070FC12F14DE0F874FF68600288E1850AAA +:10EDA00082850B837401F0900448E064017067125F +:10EDB000EEEF780C122260850882850983121ECA44 +:10EDC00012283A7404121FF28A088B098C0A8D0BE0 +:10EDD000908F66780C121EAC7808790C121CE974BE +:10EDE000037808121DEDE50824F4F508E50934015F +:10EDF000F5099005DEE0600312113DE4F50AF50B1C +:10EE000078081222607A207B00900441E0F9121108 +:10EE1000857404121FF27F08022123EE240E12F1E2 +:10EE20005422F088828983A322F0A3F0A3F0A3F0F8 +:10EE3000A3F0A3F02274EC122051EAFEEBFF8C0841 +:10EE40008D09EE4F7005790202EEE312EEEF908F1E +:10EE500076780C121E38908F36780C121E86E508D4 +:10EE60002402F8E50912EC92780C122260850882DF +:10EE70008983121ECA12283A7404121FF28A108B58 +:10EE8000118C128D13908F0E78101214FE50B7EE65 +:10EE90002402EF34000E0EFF85088285098378086E +:10EEA000121EAC908F127808121E38780812226059 +:10EEB0008E828F83121ECA12EEE6121FF2E970864E +:10EEC000908F16780C121E38780C1222608E828F6A +:10EED00083121ECA12EEE6121FF2E9700479008056 +:10EEE00002790102EC881227DD740422120BCD1284 +:10EEF000EEF322120DF58A0C8B0D8C0E8D0F227401 +:10EF0000EE122051890874FF6508702E90060DE0FE +:10EF10005407602312F08070087904120D5302F038 +:10EF20006B790112F0827004790180EF790212F09E +:10EF3000827007790280E402F067A908120D538AF3 +:10EF4000108B11A90812F0827005750901800375F4 +:10EF50000900E5102402F50AE5113400F50BE50877 +:10EF600014600F14700302EFFF24FE700302F04CD4 +:10EF700080C5790212F0827038790212F070506701 +:10EF80008E828F83A3A3780C121EAC908F1A780CFC +:10EF9000121E38780C122260850A82850B83121E9D +:10EFA000CA12EEE6121FF2E9703DAA10AB1102F090 +:10EFB0006B12F0807037790412F070502A8E828FB5 +:10EFC00083A3A3780C121EAC908F1A780C121E38F3 +:10EFD000780C122260850A82850B83121ECA12EEFB +:10EFE000E6121FF2E960C3EEFAEFFB807EE509A2AC +:10EFF000E05006AA10AB1180727A007B00806C1280 +:10F00000F0807034790412F07050DC8E828F83A30C +:10F01000A3780C121EAC908F1A780C121E38780C44 +:10F02000122260850A82850B83121ECA12EEE61236 +:10F030001FF2E970B202EFAA790112F0827004792E +:10F040000180C3E509A2E0501E02EFAA790112F087 +:10F050008260EC790212F0827004790280A8E509DE +:10F06000A2E0500302EFAA7A007B007F0A0221236C +:10F07000120D538A0C8B0DAE0CAF0DE509A2E022E8 +:10F080007904120D47E964012274F5122051890AAE +:10F090007C00EC75F018A4FAABF0740C2AF8740636 +:10F0A0003BF9880889098882F583A3A3A3A3A3A3B6 +:10F0B000E0600302F13A74112AFE74063BFF8E826F +:10F0C0008F83A37401F08E828F83E50AF0120DF511 +:10F0D0008E828F83A3A3121ED68E828F83A3A3A3B7 +:10F0E000A3A3A3E4F0A3F0908F62121ECA12EE1B3A +:10F0F000121ED612F14D7401F0EE241512F1547463 +:10F100000112F15CE4F0A3F090060DE0450AF090E6 +:10F11000060CE004F0E5082405FAE5093400FBE0FC +:10F120006401600C7480650A60067440650A70189A +:10F1300090060FEAF0A3EBF0800E0CECC3940250A3 +:10F140000302F0927A007B007F03022123EE241455 +:10F1500012F15422F582EF3400F58322F0EE2416EA +:10F1600012F15422C082C0838A828B83E0F8A3E02C +:10F17000F98A828B83E4F0A312EE22F088828983DD +:10F18000E0F4F890060DE058F090060CE014F070F2 +:10F190000B90060FE4F0A3F0900442F0801CC082B4 +:10F1A000C08390060CE0600A90060FE0FAA3E0FB33 +:10F1B00080047A007B008002E0F9D083D0820201D3 +:10F1C00022C082C083E9FC7B0012F1E9E06C700E82 +:10F1D00088828983A3A3A3A3A3A3E0F980090BEBEF +:10F1E000C3940240E4790080D1EB75F018A4F8A92B +:10F1F000F0740C28F8740639F988828983A3A3A3D4 +:10F20000A3A322C082C08390060D80AC74F71220A5 +:10F21000517E00EE75F018A4FAABF0740C2AFA7463 +:10F22000063BFBEAFCEBFDEC2405FAED3400FB8A1F +:10F23000828B83E069700F8C828D83A3A3A3A3A329 +:10F24000A3E06401600B0EEEC3940240C67A007B1B +:10F25000007F01022123C082C08390060C02F1B816 +:10F2600074F2122051EAFEEBFFEE2400F8EF3401B5 +:10F27000F989099061D0E088828983F09061D7E0B4 +:10F28000FAEE240108EF3401F9880A890B9061D560 +:10F2900012F3CA240208EF3401F9880C890D906139 +:10F2A000D612F3BB70149061C5E0A2E4500CE0A24A +:10F2B000E75007888289837480F0120EA9850A823C +:10F2C000850B83E07019850C82850D83E0701090AA +:10F2D00061C5E0A2E45008E0A2E7500312F3CF7545 +:10F2E000E195780080129061D3E0C0E0880AEE25B5 +:10F2F0000A12F154D0E0F0088E82850983E0F9E823 +:10F30000C39940E275E1917F0602212374F2122035 +:10F3100051EAFEEBFFEE2403F8EF3401F988088987 +:10F32000099061C8E088828983F09061CFE0FAEEAD +:10F33000240408EF3401F9880A890B9061CD12F397 +:10F34000CA240508EF3401F9880C890D9061CE12AA +:10F35000F3BB70149061C5E0A2E0500CE0A2E35052 +:10F3600007888289837480F0120EAF850A82850B2C +:10F3700083E07019850C82850D83E070109061C563 +:10F38000E0A2E05008E0A2E3500312F3CF120EB562 +:10F390007A0080149061CBE0C0E08A0AEE250AF87A +:10F3A000EF12F489D0E0F00A850882850983E0F83D +:10F3B000EAC39840DF75E18102F30712F3BF22E050 +:10F3C000C39A547F88828983F02212F3BFEE22858C +:10F3D0000C82850D837480F0850A82850B83F02270 +:10F3E00074F61220519061C6E0FCE0540FF075E114 +:10F3F00091780080118808EA2508F582EB12F15710 +:10F40000E09061D2F008EA240012F480F9E8C39990 +:10F4100040E3EA240212F48060049061D6F0EA240A +:10F420000112F48060049061D5F0EC9061C6F07F29 +:10F430000202212374F61220519061C6E0FDE054CF +:10F44000F0F075E1817C0080108C08EA2508F8EB6B +:10F4500012F489E09061CAF00CEA240312F480F8F7 +:10F46000ECC39840E4EA240512F48060049061CE75 +:10F47000F0EA240412F48060049061CDF0ED80ABDA +:10F48000F582EB3401F583E0223400F9E82480F5BD +:10F4900082E912F15722C082C083906195E0C0E0FA +:10F4A000EA2486F582EB3401F583D0E0F090619692 +:10F4B000E0C0E0EA2487F582EB3401F583D0E0F088 +:10F4C000906197E0C0E0EA2488F582EB3401F5838F +:10F4D000D0E0F0906198E0C0E0EA2489F582EB3456 +:10F4E00001F583D0E0F002F1BAC082C083EA24863D +:10F4F00012F480906195F0EA248712F4809061966E +:10F50000F0EA248812F480906197F0EA248912F4DA +:10F5100080906198F002F1BA74F4122051890812B7 +:10F52000F619120D65EEFAEFFB120D5F750A807584 +:10F530000B00780A1222647C007D60EE2406FAEF4C +:10F540003401FB120CCF7402121FF2EEFAEFFB1221 +:10F550000D777F0402212374F21220518982858263 +:10F560000812F619120D71EEFAEFFB120D6B750C05 +:10F5700080750D00780C122264EE2406FCEF340135 +:10F58000FD7A007B60120CCF7402121FF2EEFAEFCC +:10F59000FB120D7DE50875F004A4C508A8F028F558 +:10F5A0000974722508F58274043509F58312F5E8AB +:10F5B000E0648070079004427408801E900F0C1263 +:10F5C000F5F112F5F17411F0A3740D12F5F77495BD +:10F5D000F0A3740DF09004427407F0900F1A12F625 +:10F5E00002A312F60202F307E0F8A3E0F583888293 +:10F5F00022748FF0A3740DF0A3748FF0A3740DF038 +:10F60000A322741112F61012F610F0A3740DF0225A +:10F61000F0A3740DF0A3741122A808E875F08AA471 +:10F62000C8AAF02AF9744128FE740639FFEEFAEFF1 +:10F63000FB2274F4122051E9FE74FF2EF50B04C373 +:10F6400013FE7F0080358F82AC82EA2CF8EB340009 +:10F65000F988828983E0F50A850B08E508C39CFCDC +:10F6600095E0FDEA2CFCEB3DFD8C828D83E08882E9 +:10F670008983F08C828D83E50AF00FEFC39E40C62C +:10F680007F04022123C082C08390618FE0F902F7DA +:10F69000C174F512205174FE121FDC890AE970054D +:10F6A000791202F75153B4F390619A743FF0A37446 +:10F6B0005AF09061A0E4F0906184F0E5E170FC758F +:10F6C000E1027C009061BFE070070CECC394FA404B +:10F6D000F374FA6C7004791F80777C009061BF121C +:10F6E000FFCA9061BFE0FD7401122045EDF085185E +:10F6F00082851983E0FEEDF9EEF849600A7403682B +:10F70000700374806970070CECC394FA40CE74FAED +:10F710006C60C37C00801D9061BF12F75912F759CD +:10F72000E5BCC0E08C08EA2508F582EB3400F583DF +:10F73000D0E0F00CECC3950A40DDE5E170FC75E12A +:10F74000018DBC851882851983E0F5BC120B857983 +:10F75000007402121FF202F853E0F5BDE0F5BDE0BF +:10F76000F5BDE0F5BD22C082C0837C008C82A882FA +:10F77000740028F58274063400F583E0C0E012F7C7 +:10F78000B4D0E0F00CECC3940840E18034C082C0F7 +:10F79000837C008C82A882740828F5827406340069 +:10F7A000F583E0C0E012F7B4D0E0F00CECC39404B1 +:10F7B00040E1800DEA28F582EB3400F58322120C3B +:10F7C000E1D083D082020122C082C08374FC121F68 +:10F7D000DC851882851983EAF0A3EBF0A3ECF0A393 +:10F7E000EDF07404122045E0FAA3E0FB8518828551 +:10F7F0001983E08A828B83F0740112204512F82D60 +:10F80000F0740212204512F82DA3F0740312204563 +:10F8100012F82DA3A3F0E9A2E0E43313138A828B3C +:10F8200083A3A3A3A3F07404121FF28094E08A823E +:10F830008B83A32274F5122051ECFEEDFF740B12A2 +:10F84000204512F85812226812FCEB121FF27900C0 +:10F85000120CE17F03022123E0F508A3E0F5091271 +:10F860000CED750A10780A22C082C0839009A17439 +:10F8700070F0A374B1F0A3E0541FF09009A5741DBB +:10F88000F0A37442F0A37470F0A374B2F09009ABCB +:10F89000E0541FF09009AD741EF0A37412F002F74B +:10F8A000C1C082C08390099BE0541FF090099D74F1 +:10F8B00020F0A37452F002F7C174F41220518A08A8 +:10F8C0008B09ECFEEDFF740C122045E0F50AA3E075 +:10F8D000F50BEA6E7002EB6F6035120CC9EF900900 +:10F8E00097F0EEA3F0E509A3F0E508A3F0E50A9090 +:10F8F000099CF0E50BF50A90099BE054E0450AF0FD +:10F9000053D1FE75D60175D701E5D1A2E050FA02B8 +:10F91000F680C082C083EB90099FF0EAA3F0E91261 +:10F92000F96853D1FD75D60202F7C174F712205160 +:10F930007409122045E0F8ED90099FF0ECA3F0E87F +:10F9400012F968EB9009A9F0EAA3F0E99009ACF08C +:10F950009009ABE054E0F053D1FD53D1FB75D602D2 +:10F9600075D6047F010221239009A4F09009A3E039 +:10F9700054E0F022E5B354F849F5B343B301E5B3DD +:10F98000A2E350FA020122C082C083E5B3548F443F +:10F9900050F5B379107A2E7B8E120CD5790602F7CA +:10F9A000BEC082C083E5B3548F4440F5B3791012D2 +:10F9B0000CD5790402F7BE74F012205174E0121FC6 +:10F9C000DC8A0A8B0B8908ECFEEDFF7430122045AF +:10F9D000E0F50CA3E0F50D740F5508600478018084 +:10F9E000027800E9C4540F28F509750E10750F0050 +:10F9F000780E1222647C2E7D8E741212204512FA2B +:10FA0000C2121FF274101220457401F0750E0D78A9 +:10FA10000E122264AC0AAD0B741312204512FAC206 +:10FA2000121FF212FBC012204512FBCC122268AC4E +:10FA30000CAD0D79107401122045AA82AB8312FC23 +:10FA4000F5121FF27900120CE1741F12204512FB0F +:10FA5000D512204512FBAFE509C454F0F9F50A7838 +:10FA60000A122268EEFCEFFDEEFAEFFB12FCF51233 +:10FA70001FF280057900120CE1AA0974FF2AF5092A +:10FA80000470F185080AEE250AF8EF3400F98518AC +:10FA900082851983E088828983F0740112204512DF +:10FAA000FACCF0740212204512FACCA3F0740312BF +:10FAB000204512FACCA3A3F07420121FF27F080293 +:10FAC0002123AA82AB83120CCF740222E0888289A0 +:10FAD00083A32274F012205174E0121FDC8A0A8B77 +:10FAE0000B89098C0C8D0D743012204512FD1F609E +:10FAF00004780180027800E9C4540F28F508750ED7 +:10FB000010750F00780E1222647C2E7D8E741212F6 +:10FB1000204512FAC2121FF274101220457401F02F +:10FB2000750E0D780E122264AC0AAD0B7413122000 +:10FB30004512FAC2121FF212FBC012204512FBCC72 +:10FB4000122268EEFCEFFD79107401122045AA82A2 +:10FB5000AB8312FCF5121FF27900120CE112FCFBD0 +:10FB600012204512FD1112204512FD2912204512C6 +:10FB7000FD0A741F12204512FBD512204512FBAF5F +:10FB8000E508C454F0F9F50A780A122268AC0CAD05 +:10FB90000DAA0CAB0D12FCF5121FF28005790212B2 +:10FBA0000CE1A80874FF28F5080470F102FAB812F5 +:10FBB000FBB322AA82AB83120CD57906120CE12288 +:10FBC000E5B3548F4410F5B37910E92212FBB375F5 +:10FBD0000A10780A227401F0E5B3548F4430F5B36B +:10FBE0007910E92274EE12205174E0121FDC8A0CA5 +:10FBF0008B0D890A8C097432122045E0F50EA3E0C2 +:10FC0000F50F743412204512FD1F60047801800244 +:10FC10007800ECC4540F28F508120CE77510207515 +:10FC2000110078101222647C2E7D8E740212204501 +:10FC300012FAC2121FF28518828519837449F07571 +:10FC4000100D7810122264AC0CAD0D740312204517 +:10FC500012FAC2121FF2740F122045E509F0741156 +:10FC60001220457401F07412122045E50AF0792043 +:10FC7000851882851983AA82AB83120CD57900126C +:10FC80000CE17900120CE1E508C454F0F50B780B97 +:10FC9000122268AC0EAD0F79107401122045AA82B1 +:10FCA000AB8312FCF5121FF2800D7800748F5A4856 +:10FCB000F5B37900120CE1AB0874FF2BF508046072 +:10FCC0000BE5B3FAE50860E2785080E012FCFB1225 +:10FCD000204512FD1112204512FD2912204512FD6A +:10FCE0000A7420121FF27F0A022123EEFCEFFD7935 +:10FCF00010AA08AB09120CDB740122851882851941 +:10FD000083E08E828F83F074012212FD18A3A3F08A +:10FD10002212FD18F0740222E08E828F83A322E06B +:10FD2000FEA3E0FF740F55092212FD18A3F074031F +:10FD30002274EC12205174FC121FDCEAFEEBFF89E6 +:10FD40000D8C0C7418122045E0F50EA3E0F50F128F +:10FD5000FFB324D5F510EF3400F511851082F5833B +:10FD60007808121EACEE24A6F512EF3400F51390BD +:10FD70000442E06408781270071222647901800559 +:10FD80001222647900AA08AB09AC0AAD0B120CB7B9 +:10FD90007402121FF2850C82AA827420C39AF5089D +:10FDA00095E0F50978081222647C2E7D8EE50E2AF6 +:10FDB000FAE50F3400FB12FAC6121FF2851882858D +:10FDC00019838582088583097808122264780E12C7 +:10FDD0002264AC0CA90DAA12AB13120CFF7404120E +:10FDE0001FF27808122264AC0EAD0FA90CAA12AB58 +:10FDF00013120CF37402121FF2908F767808121E01 +:10FE0000AC8510828511837808121E4B7404121F72 +:10FE1000F27F0C02212374E812205174F8121FDCC7 +:10FE2000EAFEEBFF890B8C0A7420122045E0F514E2 +:10FE3000A3E0F51512FFB324D9F516EF3400F5173A +:10FE4000851682F583780C121EAC850C10850D1179 +:10FE5000850E12850F13EE24A6F50CEF3400F50D78 +:10FE6000900442E06408780C7007122264790080E4 +:10FE7000051222647901AA10AB11AC12AD13120C59 +:10FE8000B77402121FF2850A82A882E51428F508C9 +:10FE9000E5153400F509850882F58312FFCA850847 +:10FEA00082850983A3E0C0E07401122045D0E012EE +:10FEB000FFC0E0C0E07402122045D0E012FFC0A3F2 +:10FEC000E0C0E07403122045D0E0F07420C398FE37 +:10FED00095E0FF750E2E750F8E8E108F1178101213 +:10FEE0002264AC0EAD0FAA08AB0912FAC6121FF2BB +:10FEF00085188285198385821085831178101222D6 +:10FF000064AC14AD15A90AAA0CAB0D120CF974025D +:10FF1000121FF28E108F117810122264AC0EAD0FEA +:10FF2000AA08AB0912FAC6121FF274041220458502 +:10FF3000820885830978081222647814122264AC3E +:10FF40000AA90BAA0CAB0D120CFF7404121FF28548 +:10FF50001882851983E0F87404122045E068703037 +:10FF60007401122045E0F87405122045E068702005 +:10FF70007402122045E0F87406122045E068701003 +:10FF80007403122045E0F87407122045E06860040D +:10FF900079008015908F76780C121EAC85168285BC +:10FFA0001783780C121E4B79017408121FF27F1010 +:10FFB000022123EE24B3FAEF3400FB120CEDEE2203 +:10FFC000F0850882850983A3A322E085188285191C +:10FFD00083F02274F71220517409122045E0F8A32F +:10FFE000E0F98A828B838003ECF0A3E8FEE9FFEE60 +:10FFF00024FF18EF34FFF9EE4F70ED7F010221234B +:020000040001F9 +:10000000C082C0839003C674FFF0A3F0A3F0A3F0F6 +:10001000A3F0A3749FF0A3E4F0A37420F09003C5B1 +:1000200014F0D083D08202012274F6122051E9FE2E +:10003000128BCE60081282F5741A1282DF7F0202E0 +:10004000212374EE122051890AEAFEEBFF8C088D01 +:10005000099007D8E06003028155E9333354FC046A +:10006000F50B7407250BFA7B001210E38A0C8B0D3D +:10007000AC0CAD0DEC4D70030281558C828D8374F8 +:1000800001F0A374FFF0EC2402F8ED3400F9880CC1 +:10009000890DEC24040808ED3400F9850C82850DE7 +:1000A00083E8F0A3E91281767404128176A37413B5 +:1000B000128181E50B128181A3E50AF0750B000224 +:1000C0008145850B8285820E750F00E50EC333FADC +:1000D000E433FBEE2AF8EF3BF988108911740278BB +:1000E0000E121FC9A80EA90F851082851183E0F595 +:1000F0000EC00E12815FD0E0F0851082851183A3BF +:10010000E0F50EC00E12815AD0E0F0E5082AFAE5BB +:10011000093BFB8A828B83E0F50EC00E12815AA345 +:10012000D0E01284FEA3E0C0E0850C82850D83E060 +:1001300028FAA3E0398A82F583A3A3A3A3A3A3A3E8 +:10014000D0E0F0050BE50BC3950A50030280C2EC2A +:10015000FAED128BC47F0A02212312815FA322854C +:100160000C82850D83E028F50EA3E039850E82F51B +:1001700083A3A3A3A32212817A2212845B1289C8CB +:100180002212817AA3A32274EE1220518A088B09CD +:10019000890B8C0E8D0F9007D7E070099007D9E07E +:1001A000700302825190039EE060030282518982B3 +:1001B00085820C750D00E92407FAE43400FB121067 +:1001C000E38A108B11AE10AF11EE4F700302826202 +:1001D00074186508700474206509600C741765084C +:1001E00070047420650970109007D9E0600AF50A60 +:1001F0008E828F837492800C9007D7E0F50A8E82EE +:100200008F837491F0A3740E12834E8E828F83A31A +:10021000A3F08E828F8312891FEE2405F8EF34003D +:10022000F9E8FAE9FBEE24070808EF128515F078E3 +:100230000C122264AC0EAD0F8A828B83E0FAA3E02D +:1002400012847F121FF2EEFAEFFBA90A1210EF8060 +:1002500011780E122264AC0B790E1209BD740212D1 +:100260001FF202815574F6122051E9FE8C088D09A7 +:100270007808122264EEFC79FF1209BD7402121F85 +:10028000F202803D74F5122051890AEAFEEBFF90DC +:1002900007D7E0603690039EE070307A06128BD06C +:1002A00060388A828B837491F0A3740F12883BE5C7 +:1002B0000A12834E8A828B83A3A3A3128900EEF0D5 +:1002C000A3EFF09007D7128BC8800FEEFCEFFD89EB +:1002D00008AA087B00790F1209B77F0302212312B5 +:1002E0008843740112830D12846DEEF09007D5E0FF +:1002F000F91210EF22128BE8FCA3E0F5838C8274D4 +:100300000412830DFCA3E0F5838C82A322128C04DB +:100310002274F712205174FC121FDCEA85188285C2 +:10032000198312834EC0E07401122045D0E0F074AE +:1003300002122045ECF07403122045ED128C767AFF +:10034000041209C37404121FF27F01022123F090EA +:1003500003A2E02274F012205189098A0A8B0B8CC7 +:10036000087410122045E0F50CA3E0F50D74072584 +:1003700008FA74FF65096004780380027802E82AAD +:10038000FA7B001210E38A0E8B0FAE0EAF0FEE4F0A +:1003900070030284568E828F837401F0A374FFF081 +:1003A000EE24020A0AEF3400FBEE2404F8EF128573 +:1003B00008E5091284FEE02402128728A90B74FFC5 +:1003C000650960317403250812834EC0E01284640D +:1003D000D0E012848FE50A12848FA3E9F085080A21 +:1003E000750B00780A122264AC0CAD0D8A828B83E7 +:1003F000E0240680557402250812845BC0E0128454 +:1004000064D0E0128486E0C0E0128471D0E01284EF +:1004100086A3E0C0E0128471A3D0E012849BE50AB9 +:1004200012849BA3E9F085080AE50A24FDF50AE495 +:1004300034FFF50B780A122264E50C2403FCE50D69 +:100440003400FD8A828B83E02408128476121FF226 +:10045000EEFAEF128BC47F08022123F0850C82850F +:100460000D83E022128468228A828B83E012853910 +:1004700022128468A322FAA3E0340012847F22FBB4 +:100480001210BF740222F0850C82850D83A3221204 +:10049000849322128525A3A3A3A322128493A3A34A +:1004A0002274F2122051890A8A0BECFEEDFF7407C8 +:1004B000250BFA128B586041128B700A0AFBE50873 +:1004C00024040808E509128508E50A1284FE12854D +:1004D00033A3E50BF0601BF50C750D00780C1222B0 +:1004E00064EEFCEFFD8A828B83E024031284761293 +:1004F0001FF2AA08AB09128BC57F060221231285C1 +:100500000222F08A828B83221285151285217404BF +:10051000128521A3223400F98A828B83E8F0A3E9B3 +:100520002212852522F08A828B831289C7227F10AE +:100530000221231289C3A322E01289C8A3A3A32204 +:1005400074E812205189158A0C8B0D8C148D13744C +:1005500018122045E0F516A3E0F517741A1220458D +:10056000E0FEA3E0FF741C122045E0F508A3E0F5CF +:1005700009741E1220451289D07420122045E0F51E +:10058000129007D7E0700302862E7A157B001210B6 +:10059000E38A0E8B0FEA450F70030287251287A4AA +:1005A0007401F0EA2408FAEB3400FBE50E24031290 +:1005B0008B4FE5157018E4F0751006F511781012E0 +:1005C0002264AC16AD17128480121FF2800C7431B5 +:1005D000F07C067D0079001210D7850E82850F838E +:1005E000A3A3A3A3E50CF0A3E50D128768E51412FD +:1005F0008768A3E513F0E50E240E128B4FEEF0A3EF +:10060000EFF0E50E2410128B4F128922E50E241212 +:10061000128B4FE50AF0A3E50BF0E50E2414128BC4 +:100620004FE512F0AA0EAB0F9007D7028722900376 +:10063000CDE0A2E540030287259003C5E0A2E0409B +:10064000030287257A1A7B001210E38A108B11EAC5 +:1006500045117003028725128751F50EEB3400F522 +:100660000F128748850E82850F83E8F0A3E9128771 +:10067000837404128783A3743E12879274131287C3 +:1006800092A37401128798E515128798A3E50CF0E0 +:10069000E50DF50C850E82850F83128830E50C126E +:1006A00087B8E5141287B8A3E513F0750C06750D2D +:1006B00000780C122264AC16AD17850E82850F836C +:1006C000E02409128476121FF2850E82850F83E0E2 +:1006D000240F1287371287762410128728EF12878B +:1006E000762411128742F0E509F508850E82850F00 +:1006F00083E02412128742128776241312873CF07B +:10070000E50BF50A850E82850F83E0241412873CE1 +:100710001287762415128728E512F0AA10AB1190E3 +:1007200007D5128BC802852E12872C22F8A3E0343D +:1007300000F9888289832212872CEE2212872CE509 +:100740000A2212872CE50822EA2404F8EB3400F987 +:100750002212875522128759228A828B837401F0D4 +:10076000A374FFF0EA240222F0850E82850F83A392 +:10077000A3A3A3A3A32212877A22F0850E82850F5A +:1007800083E0221287872212878B2212877A1289AE +:10079000C822128787A3A32212879C2212878BA3C9 +:1007A000A3A3A3228A828B8374911287AE22F0A323 +:1007B000743E128502A3A32212879CA3A3A32274D2 +:1007C000F4122051EAFEEBFF89089007D7E060237E +:1007D0007A06128BD060548A828B837491F0A37452 +:1007E0000512883BE41284FE128906E508F09007A2 +:1007F000D780359003C6E0A2E450307A0B128BD03C +:1008000060291282F5740512883F740412883FA390 +:10081000E4128850EE128850A3EFF0888289831288 +:100820008830E508F09007D5128BC87F0402212399 +:1008300012883422128538A3A3A3221287B222126F +:10084000884322128C04FCA3E0F5838C82A3A322AC +:10085000128843A3A32274F01220518A088B09EC5A +:10086000FEEDFF74101220451289D074121220453B +:10087000E0F50CA3E0F50D9007D7E0603E9003C5CE +:10088000E0A2E250787A0C128BD060711287A474C7 +:100890000312883BA3E4F012891A8A828B83A3A3F4 +:1008A000A3128906A3A3A3E50AF0A3E50B1289000E +:1008B000A3A3A3128B659007D7803F9003CDE0A23E +:1008C000E5503A9003C5E0A2E250327A11128BD083 +:1008D000602B128BD8743EF0A3740AF0A37403F05B +:1008E000A3E4F0128921A3EEF0A3EFF0A3E50AF050 +:1008F000A3E50BF0128B679007D5128BC8028456C4 +:100900001287B2A3A32212890A22A3A3A3EEF0A303 +:10091000EF128502A3A3A3A3A3228A828B83A3A39E +:10092000A3A3E508F0A3E509F02274F01220518991 +:100930000DEAFEEBFF8C0C7410122045E0F508A3C5 +:10094000E0F50974121220451289D09003C7E0A285 +:10095000E350677A0F128BD06060128751FCEB3442 +:1009600000FD1287488C828D83E8F0A3E9F08C8229 +:100970008D831289BD1289E2740C1289E2A3740876 +:100980001289F4E50D1289F4A3EE1289FAEF1289A7 +:10099000FAA3E50C128A06E508F0E509F5081289C4 +:1009A000D8E508128A06A3A3E50AF0E50BF50A12BA +:1009B00089D8A3A3E50AF0128BC50284561289C315 +:1009C0007404221289C722E0F8A3E0F5838882220A +:1009D000E0F50AA3E0F50B228C828D83128834A304 +:1009E000A3221289E6221289EA22F08C828D8312D8 +:1009F00089C7A3221289E6A3A3221289FE221289A3 +:100A0000EAA3A3A3A3221289FEA3A32274EC1220BB +:100A1000518A0C8B0D8C0E8D0F7414122045128987 +:100A2000D0850A82F583A38582108583119007D92A +:100A3000E060757A0F7B001210E38A088B09AE081C +:100A4000AF09EE4F7003028B4A8E828F837492F04F +:100A5000A3743EF08E828F83A3A37405F08E828FE1 +:100A600083128B657508087509007808122264AC3A +:100A70000EAD0FEE2405FAEF128479121FF2850AEB +:100A800082850B83E0FA851082851183E0F9EAF80C +:100A9000EE240DF582EF128B53E8F0A3E9F0EEFAA5 +:100AA000EFFB9007D9028B479003CDE0A2E55008F9 +:100AB0009003C5E0A2E44006120B55028B4A7A145B +:100AC000128B587003028B4A128B70F9EA2404FAD5 +:100AD000EB3400FB88828983EAF0A3EB12830DFEDE +:100AE000A3E0FF8E828F837404F0A3743EF0A3749E +:100AF0000DF0A37405F0128B67A3AE82AF83750C63 +:100B000008750D00780C122264AC0EAD0FEEFAEFF2 +:100B100012847F121FF2EE2408FEEF3400FF850AD4 +:100B200082850B83E08E828F83F085100A85110BFE +:100B3000A30EAF83850A82850B83E08E828F83F0BC +:100B4000AA08AB099007D5128BC87F0C022123F5A8 +:100B500082E50F3400F583227B001210E38A088BB4 +:100B600009EA450922A3A3A3E50CF0A3E50DF022B1 +:100B7000128755F8EB34002274F4122051EAFEEB90 +:100B8000FF89088C099007D9E060127A07128BD090 +:100B9000602F128C5EE509F09007D980219003C682 +:100BA000E0A2E7501C7A0B128BD06015128BD87420 +:100BB00008F0A37404128C531289249007D5128B69 +:100BC000C802882BFB9007D5E0F91210EF227A08B3 +:100BD0007B001210E3EA4B22128BE8F8A3E0F988BD +:100BE0008289837404F0A322128759F8EB3400F948 +:100BF000EA2404FCEB3400FD88828983ECF0A3ED49 +:100C0000128C0422F088828983E02274F41220512D +:100C1000EAFEEBFF89089007D9E060127A07128B91 +:100C2000D0602D128C5E7401F09007D9801F900364 +:100C3000CBE0A2E7501A7A0A128BD06013128BD83D +:100C40007430F0A37403128C53F09007D5128BC844 +:100C500002882BF0A3E508F0A3EEF0A3EF228A822E +:100C60008B8374921287AE740812850212890AE58A +:100C700008128911A322F0851882851983AC82ADF0 +:100C8000832274F2122051E9FE8C088D097F008EB8 +:100C90008285820A8F0B8A0C8B0D780C1222A80198 +:100CA00003185E8FD68CF58C088D5E8F1D8D708D30 +:100CB000868DB58DE48DFF8D1A8E318E4D8E5E8FB3 +:100CC000698EA08EBC8ED68EEB8E088F5E8F5E8F67 +:100CD0005E8F5E8F258F74106E7015750A10780AFE +:100CE0001222647A9B7B0C129226121FF2028F7CD6 +:100CF0007F18028F7C74106E70F6750A10780A12D5 +:100D000022647AAB7B0C80DF74046E70E38C828D7E +:100D100083121ECA900CBB121ED6028F7C74016E09 +:100D200070CE901130E0F88C828D83E0901130F01D +:100D3000E8601CE06003028F7C900C99E064026024 +:100D400003028F7C900C98E0F91206E1028F7CE0A0 +:100D50007003028F7C900C99E06401600DE06403E5 +:100D60006008E064046003028F7C129609028F7CA5 +:100D700074026E6003028CF0129735901131E8F026 +:100D8000A3E9F0028F7CEEC394204003028CF07C38 +:100D90001F7D0079007A347B111210D7780A122255 +:100DA00064AC08AD097A347B11129226121FF2EE60 +:100DB00090113380CDEEC394204003028CF07C1F51 +:100DC0007D0079007AC67B0C1210D7780A12226453 +:100DD000AC08AD097AC67B0C129226121FF2EE9077 +:100DE0000CC5809E74016E6003028CF08C828D8332 +:100DF000E0C394044003028CF0E0900CE58083741F +:100E0000016E6003028CF08C828D83E0C3940440F9 +:100E100003028CF0E0900CE680C874066E6003025A +:100E20008CF0750A06780A1222647AE77B0C028C31 +:100E3000E774016E6003028CF08C828D83E0C394B2 +:100E4000084003028CF0E0900CED028D8274016E7C +:100E50006003028CF08C828D83E0C3940440030213 +:100E60008CF0E0900CEE028D8274026E6003028CB6 +:100E7000F0129735900CEF129603E8497003028F39 +:100E80007C900C99E064056003028F7C900CEF125B +:100E900096547808122260129743121FF2028F7C38 +:100EA00074016E6003028CF08C828D83E0C3940227 +:100EB0004003028CF0E0900CF7028D82128F976055 +:100EC00003028CF0128F8B4003028CF0901155EAD4 +:100ED000F0A3EB028D82128F976003028CF0128FC9 +:100EE0008B4003028CF090115780E4129735740206 +:100EF0006E6003028CF0C3E894F4E99401400302AD +:100F00008CF0900CF8028D7E128F976003028CF0AB +:100F1000EA24F6128F839477E9940C4003028CF054 +:100F200090115980AA74016E6003028CF08C828D3E +:100F300083E064016003028CF07A087B00900C98D7 +:100F4000E0F9121197EAF8EBF9ECFAEDFBE8494AFF +:100F50004B70077900128FA480227F16801EC3EA8F +:100F60009426EB9400501374026E700E8C828D8365 +:100F70001292201205D9E9FF80020F0FEFF97F06C8 +:100F8000022123F8EB34FFF9C3E822EA24FA128F96 +:100F900083947BE9940C228C828D83E0FAA3E0FB9E +:100FA00074026E2212140D7A047B00900C98E0F902 +:100FB00012119122121FF27F0402212374F61220D3 +:100FC00051900C99E0703EEA4B6008900D01EAF0F8 +:100FD000A3EBF07508BB75090C780812226475083C +:100FE000AB75090C78081222647C9B7D0C7B009009 +:100FF0000C9AE0FA900C98E0F912120F7404121F88 +:10100000F27900800279117F02022123D083D082FD +:10101000020122C082C083900C99E06405700D1219 +:10102000961F900C98E0F912065D8002791280DC20 +:1010300074F7122051E9900C98F0900C99E4F0901C +:10104000115374FFF0A3F0120729900C9A7404F066 +:101050007C107D0079007A9B7B0C1210D77C107D70 +:101060000079007AAB7B0C1210D7908F42121ECA07 +:10107000900CBB121ED6900CE5E4F0900CE6F090BC +:101080000CED7407F0900CEEE4F07C9B7D0C7A1074 +:1010900079021213D77CAB7D0C7A1079031213D727 +:1010A0007CBB7D0C7A0479041213D77F01022123C3 +:1010B00074F412205174F6121FDCEAFEEBFF548028 +:1010C0006025900C98E0F91210FB8A088B09A90999 +:1010D000EA49600A121401AA08AB091210E9EEFAF3 +:1010E000EF6480FB02921BEF544060127CBB7D0CCE +:1010F0007A0479041213D1EEFAEF644080E5EEA28F +:10110000E0400302919F901130E0700302919790AC +:101110000CE5E0851882851983F0900CE6E0C0E0CC +:101120007401122045D0E0F07508067509007808B2 +:101130001222647CE77D0C7404122045AA82AB83E2 +:10114000129226121FF2900CEDE0C0E074081220FB +:1011500045D0E0F0900CEEE0C0E07409122045D0DC +:10116000E0F0851882851983AA82AB83900C98E001 +:10117000F91206D5E96020900C997406F012965F7A +:10118000601512961912973988828983E582458302 +:101190006005790612204FEE6401FAEF0290E354E5 +:1011A00002602A900C99E06405701D12961F1209C6 +:1011B0000F900CEF129662600F900CEF12964C128B +:1011C0002260129743121FF2EE640280CDEE5404A7 +:1011D000600A790012140DEE640480BEEE540860BB +:1011E00036900D00E01460081470271213EF80226F +:1011F00090115912227B900CF812227B79019011E8 +:101200005712922090115512962212141374041240 +:101210001FF2EE640880837A007B00740A028FB4A8 +:10122000E0FCA3E0FD221210BF74022274F412202D +:1012300051EA2405F8EB3400F98A828B83E0246FAD +:10124000600B24EF606724D2605E0292F8A3E06432 +:101250000E60030292F88A828B83A3A3A3E0640545 +:101260007004A3E0641460030292F88882898312F8 +:101270009616A3A3A3E0F9900C99E0640570797425 +:101280007F696074900D01129622EA4B606A900D9E +:1012900001129616A3A31296228A828B83E58245B9 +:1012A00083605512204F8050121407804B8882892A +:1012B00083E0641370428A828B83A3A3A3A3A3A3B6 +:1012C000E064017002A3E07012900D00E06402700F +:1012D0000A7A08128FA91213EF801D7A057B00127B +:1012E00005DF8A088B09E4F50AF50B7808122260FD +:1012F0007A08129745121FF2028FB774EE1220512E +:10130000EAFEEBFF8E828F83A3A3E0F8EE2403F5C1 +:1013100008EF3400F509EE240AF50AEF3400F50B66 +:101320008E828F83A385820C85830DE8602724FE3F +:1013300070030293CD14700302940414700302949A +:101340000414700302943E14700302953414700365 +:101350000295878073E070497C9B7D0C7A1079023E +:101360001213D17CAB7D0C7A1079031213D1750A5C +:1013700006750B00780A122264AC08AD097ABF7BAF +:101380000C129226121FF2900C997401F07C347D9D +:1013900011901133E0FB7A01900C98E0F91206DB12 +:1013A000E96006900C997406F012965F601A129626 +:1013B00019129739E8FAE9FBEA4B600C900C99E0B6 +:1013C000F98A828B8312204F7F0A022123E0702941 +:1013D000850882850983E0601D7CC67D0C900CC564 +:1013E000E0FB7A00900C98E0F91206DBE9850C82AC +:1013F000850D83F08003129609850C82850D83E0AC +:1014000070A180C4E0709C7403687007900C99749C +:101410000280959011311296629011306016E06052 +:101420001590113112964C1222607A0112974512D2 +:101430001FF28002E4F0900C9974030293A8E0601C +:1014400003029527EE2404F510EF3400F511750C16 +:1014500006750D00780C122264AC10AD117AF17B88 +:101460000C129226121FF2850A82850B831297397D +:10147000901153129603900C997405F0900CEF1292 +:101480009662601A900CEFE0F50CA3E0F50DE4F520 +:101490000EF50F780C122260129743121FF2EE2401 +:1014A0000CF582EF3400F583129640EE240EF5829F +:1014B000EF3400F583129634EE2410F582EF3400F9 +:1014C000F583129628900CF7E0640170327A1F7B46 +:1014D000001205DF8A0CEA75F0E8A4C50CA8F075C7 +:1014E000F003A428F875F0E8EBA428F50DE4F50E58 +:1014F000F50F780C1222607A04129745121FF275CC +:101500000C04780C122268850A82850B83129220C3 +:10151000AA10AB11850882850983E0F912121574AF +:1015200001121FF20293A9643160030293A3901188 +:10153000300294341212337C067D0079007AF17BFC +:101540000C1210D7900CFAE4F0A3F0900CFCF0A36E +:10155000F0900CFEF0A3F07A04FB128FAB7A081225 +:101560008FA98E828F83A3A3A3A3A3E06408900C0A +:10157000997004740480027403F012960990115358 +:1015800074FFF0A30293A87A08128FA9850C8285B4 +:101590000D83E060030293C88E828F83A3A3A3A36D +:1015A000A3A31296408E828F83A3A3A3A3A3A3A376 +:1015B000A3129634850A82850B831296287A047BBF +:1015C00000900C98E0F9121197EA4B4C4D60030221 +:1015D00093C8900D0312966270030293C8900CFE9C +:1015E00012227B900CFC129220900CFA1296229000 +:1015F0000D0312961612961612204F7402121FF245 +:101600000293C8E8F0A3E9F0227A017B00900C98DD +:10161000E0F912111322E0F8A3E0F583888222900A +:101620001153E0FAA3E0FB2212973D900CFEE8F084 +:10163000A3E9F02212973D900CFCE8F0A3E9F02218 +:1016400012973D900CFAE8F0A3E9F022129654F5B7 +:101650000B780822E0F508A3E0F509E4F50A2290EA +:101660000D0112973DE8492274F412205174F812CA +:101670001FDCE9FE90115512973975830C7582FABB +:10168000C3E098A3E0994038900CFA12973975831B +:1016900011758257C3E098A3E0994024900CFC1286 +:1016A0009739900CF8E0687003A3E0697012900C11 +:1016B000FE129739901159E0687003A3E0696070D9 +:1016C0007A057B001205DF8A088B09901155129765 +:1016D000398518828519831296039011571297390C +:1016E0007402122045129603900CF8129739740474 +:1016F0001220451296039011591297397406122040 +:1017000045129603900C98E0F9851882851983ACF0 +:1017100082AD8312961F120A05EE900D00F0E4F5DB +:101720000AF50B78081222607A08129745121FF208 +:101730007408028FB48C828D8312973D22E0F8A347 +:10174000E0F9227A027B00900C98E0F9121185747E +:10175000042274F4122051E9FE740C122045E0F5C5 +:101760000AA3E0F50B740E122045E0F508A3E0F59E +:1017700009900C99E0640560047914805FEA24FA0A +:10178000F8EB1297DF5053EC24FAF8ED1297DF5084 +:1017900049C3E50A94F4E50B9401503EE50824F6AC +:1017A000F8E509128F859476E9940C502D90115527 +:1017B000EAF0A3EBF0901157ECF0A3EDF0900CF8E9 +:1017C000E50AF0A3E50BF0901159E508F0A3E5094F +:1017D000F0EEF9128FA4790080027918028FB71207 +:1017E0008F85947AE9940C22C082C083900301E033 +:1017F000A2E250067A267B0F80047A007B00120F4B +:101800004B7900D083D08202012274F212205174ED +:10181000E0121FDCEAFEEBFF8C0A8D0B742E122007 +:1018200045E0F508A3E0F5097C107D0079008518F6 +:1018300082851983AA82AB831210D712A2BDE84910 +:1018400070030298F8129CBDE06E7003A3E06F6015 +:10185000030298F89007CF129CCD60030298F8120B +:101860009A03FC74066C704F741012204585820C2C +:1018700085830D780C1222649007CEE0244BF50C82 +:10188000A3E03400F50D780C1222649007CEE0241A +:101890002BFCA3E03400FD129DB7120F0974041253 +:1018A0001FF2E970531299D7122264741212204564 +:1018B000AC82AD83029968129A0B603C129F7B74D4 +:1018C000116C600302998AE065087004A3E0650961 +:1018D0007021750C08750D00780C1222641299E3C2 +:1018E000121FF2E96401700B1299D7122264129947 +:1018F000F580757932120FC3EEFAEFFB120AB98A3E +:101900000C8B0DA80CA90DE84970030299C4E824BA +:1019100021F50CE93400F50D850C82F58312A30046 +:10192000EA4B70030299C412A2A765087004A3E0F1 +:10193000650960030299C4750808750900780812E2 +:1019400022641299E3121FF2E964017077850C8218 +:10195000850D83E0FCA3E0FDEC241AF582ED12A2D4 +:10196000ADF50878081222647402122045AA82ABF1 +:1019700083129DB1121FF2EEFAEFFB8518828519D2 +:1019800083AC82AD8312094B8041E065087004A3EB +:10199000E0650960030298F8750C08750D00780C75 +:1019A0001222641299E3121FF2E9640160030298A3 +:1019B000F81299F5EC241AF582ED12A2ADF508752E +:1019C0000900809FEEFAEFFB120951790174201291 +:1019D0001FF27F06022123120FC9E9F508750900DD +:1019E000780822EA2412FCEB3400FDAA0AAB0B12A1 +:1019F00010D17402229007CEE0245B129DE9FCA373 +:101A0000E0FD229007CF129EACE0229007CEE024AA +:101A10005B129DE9FAA3E0FBEA4B2274F21220511B +:101A2000890DECFEEDFF750C008A828B83A3858205 +:101A30000A85830B8E828F83A38582088583091292 +:101A4000A2BDE849705D7401650D7052EE2402FA82 +:101A5000EF3400FB120F158E828F83A3A3A3A3A3E1 +:101A6000740212227F8E828F83A3A3A3A3E0F50CBE +:101A7000780C122268E9F50C780C1222688508822D +:101A8000850983E0FD8E828F83E0FC850A82850BC9 +:101A90008312A30079001206C37404121FF27900A6 +:101AA000029CBA129CBD12A2C0850A82850B83E0FB +:101AB000687003A3E06960057908029CBA129CC7AC +:101AC000640170057907029CBAE50D14603124FEAB +:101AD000603A147003029B6B147003029CAD147087 +:101AE00003029B74147003029BCF147003029BD9F2 +:101AF000147003029C1B147003029C5C029CB5EEE4 +:101B0000FAEFFB120FE7E9F50C029CB875080075B7 +:101B10000A10750B00780A1222649007CEE0243B6D +:101B2000129E91121FF29007CEE02401129DDB64F9 +:101B30000470047403802D9007CEE0241BF50AA3E3 +:101B4000E03400F50B780A1222649007CEE0242BD3 +:101B5000129EB3121FF2120F8DE96003750808126E +:101B60009E9E7405F085080C029CB8EEFAEFFB12FD +:101B70000FED8092129A03640C6003029CB59007EB +:101B8000CEE0245D12A2E2700812A297245D12A298 +:101B9000C69007CEE0245D129A117003029CB575C1 +:101BA00008107509007808122264129DAD121FF208 +:101BB000120FC9E9C0E09007CEE0245D129DDB243E +:101BC0001A129DC8D0E0129E9D740DF0029CB8EED2 +:101BD000FAEFFB120FF3029B06129A03640E6003E6 +:101BE000029CB59007CEE0245F12A2E2700A7A163A +:101BF00012A299245F12A2C69007CEE0245F129A27 +:101C00001160117508107509007808122264129D80 +:101C1000AD121FF2129E9E740F80B0129A03640FD1 +:101C20006003029CB5750A06750B00780A122264DF +:101C3000AC08AD099007CEE0245F129CD4129E91AF +:101C4000121FF2129F8688828983E0542060571207 +:101C50009F9F6052129E9E7410029BCB12A2DC705A +:101C6000147A1412A299246112A2C612A2DC700581 +:101C7000750C0880439007CEE02461129A1160260B +:101C80007508107509007808122264129DAD121FA4 +:101C9000F2908F62121ECA9007CEE02461129CD48B +:101CA000129DC8121ED67900120FC3800B8E828F30 +:101CB00083E0F980F3750C07A90C0299D2129CC13C +:101CC00022129EACA3A3229007CEE0F8A3E0F583F6 +:101CD0008882E022129DE924102274F61220517E9F +:101CE00000120F99E9F86003029D9A120F87129D66 +:101CF000FA2412129DDBA2E050209007CEE02418B7 +:101D0000129DC8129EA1A3E054036401700C9007B9 +:101D1000CEE02417129DDBD2E0F0129DDFF87402B2 +:101D200068601D7403686005740468701779011297 +:101D3000A2F41206C9129DEE129E9D7404F08066F4 +:101D4000790280EB74016860057405687058129E12 +:101D50009E7402F0129DB7129DDF6401700B7C101F +:101D60007D0079001210D7801E7508108E09780842 +:101D7000122264129DFA2402FCA3E03400129DB0EA +:101D8000121FF2129DEEF079109007CEE0242BFA8C +:101D9000A3E03400FB120F0F800C74186870050E5E +:101DA0000E0E80027E08EEF97F02022123EEFCEF88 +:101DB000FD1210BF740222129DBB229007CEE024B8 +:101DC00007FAA3E03400FB22129DCC22129DD02200 +:101DD000F8A3E03400F98882898322129DE92290D9 +:101DE00007CEE0241A129DE922129DD0E02290072E +:101DF000CEE02417129DE9D2E2229007CEE0F8A3AC +:101E0000129F982274F612205174F0121FDC7E008B +:101E10007508108E097808122264EAFCEBFD900721 +:101E2000CEE0244B129E91121FF2851882851983F1 +:101E300085820885830978081222649007CEE02401 +:101E40004B129EB3121FF27508108E0978081222E9 +:101E5000649007CEE0243BFCA3E03400FD74021242 +:101E60002045AA82AB831210D17402121FF2E964DA +:101E7000017012120F93E960047E08800A129E9E80 +:101E80007406F080027E04EEF97410121FF2029DB7 +:101E9000A8FAA3E03400FB1210BF740222F09007EE +:101EA000CE129EA522E0F8A3129EAC22E0F5838814 +:101EB00082A322FCA3E03400FD129DBB120F7574B7 +:101EC000022274F6122051EAFCEBFD9007CEE024CA +:101ED0005D129A117003029F769007CEE0F8A3126C +:101EE0009A06640D6003029F768C828D8312A2C0D5 +:101EF000129F7BE8F0A3E9F07508087509007808DF +:101F0000122264EC24020C0CED3400FDEA2412FAD7 +:101F1000EB3400FB129DB1121FF2129F869007CE88 +:101F2000E02401FAA3E03400FB88828983E05410A6 +:101F300060259007CEE02418FCA3E03400FD8C82DD +:101F40008D8312A2B3A3A3A3A3E0541060098A82D5 +:101F50008B83740EF0801B88828983E05420600D8F +:101F6000129F9F60088A828B83741080E779001229 +:101F70000FC3790080027907029DA8EA2410F58238 +:101F8000EB3400F583229007CE129F952413F8A31B +:101F9000E03400F922E0F8A3129CC1A3A3E0229050 +:101FA00007CEE02418129DCC129F9554202274F085 +:101FB000122051129CC7600302A2929007CF129E7A +:101FC00000F8A3E0F99007CEE0241812A2D112A3E2 +:101FD000009007CE12A2B3E0F50AEA2405FEEB3426 +:101FE00000FFE82413F508E93400F5097406650AD2 +:101FF000707F850882850983E0F8A2E0500C8E820C +:102000008F83E0A2E0500302A08CE8540260408E6F +:10201000828F83E054026037750A0912063912A2D2 +:10202000EC120FAB7408650A600302A22F850882C8 +:10203000850983E05402700302A15D8E828F83E0E4 +:102040005402700302A15D129E9E740902A18CE8E5 +:102050005404700302A2468E828F83E054047003FE +:1020600002A246750A0B12061512A2EC120FB780D7 +:10207000B3E50A24F9601514700302A10514609BEE +:1020800014700302A1311460DD02A17E9007CEE03E +:10209000245B12A2E2700812A297245B12A2C690DF +:1020A00007CEE0245B129DDBFEA3E0FFEE4F700342 +:1020B00002A1877C107D007900EEFAEFFB1210D7A9 +:1020C000120FC9EEFAEFFB120F0F1210DDEE241003 +:1020D000F582EF3400F583EAF0A3EBF07908EE2403 +:1020E00012FAEF3400FB120F0F120FC9EE241AF58B +:1020F00082EF3400F583E9F0EEFCEFFD12A2F4125A +:102100000F9F02A187129A0B700302A02DEA2412DE +:10211000F50AEB3400F50B780A12226412A2A7FC30 +:10212000A3E0FD12A2F4120FA57402121FF202A086 +:102130002D750B0112062DE9F50A7401650A70056B +:10214000750B008003750A00A90B1206338A0C8BED +:102150000DAC0CAD0DA90A12A2F4120FB1850882C4 +:10216000850983E05404700302A2468E828F83E0C7 +:102170005404700302A246129E9E740B800E7407D4 +:10218000650A600302A024129E9E7408F09007CE98 +:10219000E0F8A3129A06F87407686017740868607C +:1021A00012740968600D740A686008740B68600333 +:1021B00002A29212A2F4120AB98A088B09A808A9ED +:1021C00009E849700302A274E8240BF582E934009F +:1021D000F58312A2C0880C890DE4F50EF50FE9C352 +:1021E00013F9E813F888088909E4F50AF50B780C67 +:1021F0007908121E2502A27CE8541060128E828F8C +:1022000083E0541060098A828B83740E02A18CE8EB +:10221000542060128E828F83E0542060098A828B62 +:1022200083741002A18C8A828B83741202A18C7435 +:1022300009650A7008129E9E740A02A18C740A65D0 +:102240000A700302A15D9007CEE02401F8A3E034F8 +:1022500000F9E8FAE9FB850882850983E0F854086B +:1022600060968E828F83E05408608D8A828B83749F +:102270000C02A18C908F3E780C121EAC780C1222AE +:10228000607A027B009007D4E0F912118574041281 +:102290001FF27F080221237A1B7B0012114F8A084C +:1022A0008B099007CEE022EA2410F582EB3400F58A +:1022B00083E022E0FCA3E0F5838C82A3229007CE8A +:1022C000E0F8A3E0F92212A2D1E508F0A3E509F0B5 +:1022D00022FAA3E03400FB8A828B83229007CEE0AF +:1022E0002461129DE9F8A3E0F9E849228A0C8B0DDC +:1022F000AC0CAD0D9007CE129EA5A3A312A3002295 +:10230000E0FAA3E0FB2274F2122051ECFEEDFF8A0A +:10231000828B83A3A3A3A3A3A3A3A3E0F50A6027AF +:10232000EA2406F8EB3400F9880889098882F583E5 +:10233000E0FCA3E0FD8C828D83E0F50BA2E7504E1C +:10234000E50AC3940D5005790102A40074F4250A2E +:10235000F50AF50CEC250CF50CED3400F50D780CB8 +:10236000122264E50AF50C780C12226879018A823F +:102370008B83A3A312A8E1120EDF7403121FF2E9EC +:102380008E828F83700474018009740280058E82AE +:102390008F83E4F0E50BA2E65004D2F08002C2F095 +:1023A000A2F0E433A3F0743F550B8E828F83A3A376 +:1023B000F0EE2403F8EF3400F9E50A24FFFAE434E0 +:1023C000FFFB88828983EAF0A3EBF0EE2405FAEFA5 +:1023D0003400FB8882898312A6C949601985088266 +:1023E000850983E02401F8A3E03400F98A828B8315 +:1023F000E8F0A3E980078A828B83E4F0A3F07900F8 +:102400007F0602212374F712205112AAD9A3AA82AF +:10241000AB838C828D83A3A882A98312A6C18C82F0 +:102420008D83A3A3A312AADD7A047B0002A466C055 +:1024300082C08312A9107A02802374F7122051748B +:102440000912204512A7CA12204512A7C37001EB3A +:10245000700512A7D280027904800B80D27B00D055 +:1024600083D0820201227F0102212374F7122051BE +:10247000740912204512A7CA12204512A9527001F0 +:10248000EB700512A9598002790480DA74EE1220EB +:1024900051EAFEEBFF8C0C8D0D7508017509008C5F +:1024A000828D83A385820E85830F12A58F750A0006 +:1024B0008036E51075F012A4F510E5F0F51112A5BF +:1024C0004C751010751100781012226412A53E127E +:1024D0001FF2EE2410FEEF3400FFE5082412F50889 +:1024E000E5093400F509050A850C82850D83E0F8BD +:1024F000E50AC39850418E828F83A3AA82AB83855D +:102500000A82858210751100850E82850F83E06432 +:1025100001709F74027810121FC912A54C75100229 +:10252000751100781012226412A53E121FF212A536 +:1025300085E508240480A7AA08AB0902AC1EEC2498 +:1025400004FCED3400FD0AEF12AAAD22E50C2510C3 +:10255000FCE50D3511FD12A56812A57EEAFEEBFF24 +:102560008882898312A57522EC2402F8ED3400F9E3 +:102570008882898322A312A57EA30EAF8322E08ED8 +:10258000828F83F022EE24020E0EEF3400FF22121F +:10259000A57EA3AE82AF832274F2122051ECFEED31 +:1025A000FF740E122045E0F50AA3E0F50B7410123B +:1025B000204512A65DC3E50A9406E50B940050037E +:1025C00002A6588E828F83E0FAA3E0F9EA8508829A +:1025D000850983F0A3E9F08E828F83A3A3E0FA8EAE +:1025E000828F83A3A3A3E0F8E4C8F9EA8508828573 +:1025F0000983A3A3F0A3E912AD37A3A3A37402F048 +:10260000F50C880D780C122264EE2404FCEF3400E3 +:10261000FDE5082405FAE50912AA9D121FF2E50A54 +:1026200024FAF50A850882850983A3A3A3A3A3A39B +:10263000A3F0C394115021750B00780A122264EEA6 +:102640002406FCEF3400FDE5082408FAE50912AA87 +:102650009D121FF279008002790402A400E0F508BF +:10266000A3E0F5092274F5122051750A0080308527 +:102670000A0875090074027808121FC9EC2508F8C9 +:10268000ED3509F988828983A3AE82AF8312A991BF +:10269000E82403080808E912A56D12A6C1050A8CF2 +:1026A000828D83E0F8E50AC39840C4E0F508750917 +:1026B0000074027808121FC9AA08AB097F0302211F +:1026C0002312A84FA30AAB832212AA1AE82274107D +:1026D000121FF27F0402212374F6122051740A1291 +:1026E000204512AAC512204512A8E1EA2404F8EBFD +:1026F0003400F974066E7001EF7046888289837425 +:1027000002F08C828D8312A7558A828B83F0A3EF0F +:1027100012AAB4A3E0FEE4CEFFE5088A828B83A36D +:10272000A3F0A3EFF088828983E0F5088E0978088A +:1027300012226412AA8612AA9C121FF2790002A821 +:102740002A74146E7001EF70088882898374108077 +:10275000B0790480E9E0F508A3E0FFE5082274F60B +:102760001220518C828D83A3E0F8F5F08C828D834A +:10277000E0A4FEE88A828B83F0A3AA82AB838E0852 +:102780007509007808122264EC240212A797121F20 +:10279000F2EE240102A8250C0CED3400FD12AAAEC5 +:1027A0002274F7122051740912204512A7CA122070 +:1027B0004512A7C37001EB700512A7D280027904FD +:1027C00002A46612AA1A74026A22E0FAA3E0FB7459 +:1027D0000B2212A97B79002274F6122051ECFEED37 +:1027E00012A8331222648E828F83A3AC82AD83122F +:1027F000AD40121FF28E828F83E0FA7B00802B7433 +:10280000F612205112A841A30AAB83EC240412A8AB +:102810002F122264EC2405FC12A799121FF28E825B +:102820008F83E02404FAE43400FB7F02022123FEBC +:10283000ED3400FF8E828F83E0F50875090078087B +:102840002212A914A30AAB8312A56812A84F221260 +:10285000A929A30AAB838882898312A9282274F448 +:1028600012205189088A09740C12204512AA167484 +:102870000E12204512A8E1C3E89402E994004054E6 +:102880008C828D83E0F50AA3E0FFE50A8A828B83C0 +:10289000F0A3EFF0EA241712A8D9E508F0EA24180B +:1028A00012A8D9E509F0E50870047E1480027E08BC +:1028B000E824FEF50A8A828B83A3A3F0EEC3950A6F +:1028C0004012750B00780A12226412AA93121FF2AA +:1028D00079008002790402A6D3F582EB3400F583F7 +:1028E00022E0FAA3E0FB2274F612205112A910A3F1 +:1028F0000AAB83EC240212A82F122264EC24030CEE +:1029000012A797121FF28E828F83E0240202A8255D +:1029100012A914228C828D8312A929A3AA82AB83C7 +:102920008C828D8312A92822A3E08A828B83F022D5 +:1029300074F7122051740912204512A7CA122045BB +:1029400012A9527001EB700512A959800279040294 +:10295000A46612AA1A74046A2212A97B8C828D833F +:10296000A3A3E0FE8C828D83A3A3A3E0FBEE888269 +:102970008983A3A3F0A3EBF07900228C828D83E0FE +:10298000FEA3E0FBEE88828983F0A3EBF02202A78E +:10299000D812AAE1A3AA82AB838E828F83A312AA44 +:1029A000E1A30AAB832274F6122051740A12204567 +:1029B00012AA16740C12204512A8E1E8A2E04051B8 +:1029C000E9C313E813F50974FE2509C3940A5041BD +:1029D000EA241612A8D9E509F075080080288C822F +:1029E0008D83E0FEA3E0F9EE2400E439FFE508332F +:1029F000F8E433F9EA28F582EB39F583EEF0A3EF3A +:102A0000F012AAA30508E508C3950940D179008012 +:102A100002790402A82A12AA1A22E0F8A3E0F922F5 +:102A200002A7D802A75E74F6122051740A1220453C +:102A300012AAC512204512AB259404EF9400404120 +:102A40008C828D8312AAD08A828B83F0A3E912AA8A +:102A5000B412AB18A3A3F0A3E9F0EE24FCF5088AA6 +:102A6000828B83A3A3A3A3F0C39413501488097883 +:102A70000812226412AA8612AA9C121FF279008000 +:102A800002790402A82AEC2404FCED3400FDEA24B7 +:102A900005FA2212AAA3EA24030A0A0AEB34001256 +:102AA000AAAD22EC24020C0CED3400FD22FB121026 +:102AB000BF740222F08C828D83A3A3E0F5088C8280 +:102AC0008D83A3A322E0FEA3E0FF740C2202A7FFE4 +:102AD000E0F508A3E0F9E508228C828D8312AAE1D3 +:102AE0002212A92922C082C08385188285198312E7 +:102AF000A8E1740212204512AA1674016A7001EB53 +:102B0000700E8C828D83E088828983F07900800248 +:102B1000790402A45F02A8E7A3E0F8E4C8F9E50895 +:102B20008A828B832212AB2AEE22E0F8A3E0F9E836 +:102B3000FAE9FBC32274EE12205174FA121FDC8AE8 +:102B40000E8B0F8C0A8D0B890C7418122045E0F542 +:102B500010A3E0F5117A177B00120A9B8A088B09F3 +:102B6000AE08AF09EE4F700302AC148E828F8375EE +:102B70000801750900E50CF0A3E50A450B601BACE4 +:102B800010AD11AA82AB83850A82850B8312204F78 +:102B9000EA2401F508EB3400F509E50CA2E7502E14 +:102BA0007910AA0EAB0F120AC5E97063EE2508FC76 +:102BB000EF3509FDA908EEFAEFFB120ED9E9F50A87 +:102BC0007044E508240CF508E5093400F50985187A +:102BD000828519837404F0A3E4F07402122045EE98 +:102BE000F0A3EFF07404122045E508F0A3E509F026 +:102BF000851882851983AC82AD83AA0EAB0F1209AA +:102C0000F9E9F50A6011EEFAEFFB12136B80087513 +:102C10000A1980F2750A13A90A7406121FF27F0AB4 +:102C200002212374F412205174F0121FDCEAFEEB2F +:102C3000FF741C12204512A65D741E12204512ACB2 +:102C4000D27001ED600C74106C7001ED60047900BD +:102C5000807D7402687001E960087410687001E991 +:102C600070ECE86C7002E96D700F8C0A8D0B780ABD +:102C7000122264AC08AD09804E74106C7001ED85B1 +:102C80001882851983AC82AD837021AA08AB091222 +:102C900005D37508107509007808122264740212B1 +:102CA0002045AC82AD83EEFAEFFB801B1205D37595 +:102CB0000A10750B00780A1222647402122045ACC7 +:102CC00082AD83AA08AB091210D17402121FF2025E +:102CD000A6CE12AA1A74026C2274F41220518A0829 +:102CE0008B09ECFEEDFFEA45096047EE4F60437546 +:102CF0000A10750B00780A1222647C7D7D8EEEFA34 +:102D0000EFFB12AD40121FF2850882850983E0C0F7 +:102D1000E0EE240CF582EF12A8DCD0E012AD37E033 +:102D2000C0E0EE240DF582EF12A8DCD0E0F07901CE +:102D30008002790002A6D3F0850882850983A32248 +:102D400012AAAE22C082C08374E3121FDC7C007D15 +:102D50000179FF7A1E7B0D1210D7851882851983A1 +:102D60007401F0122045740AF07402122045E4F058 +:102D700074031220457480F0A3E4F074051220451A +:102D80007406F0740A122045E4F0A304F0741212E1 +:102D900020457432F0A3E4F074161220457401F05B +:102DA000741B1220457461F0A37414F08518828599 +:102DB0001983AA82AB837901121341741D121FF289 +:102DC000D083D082020122C082C08374FA121FDC39 +:102DD0007404122045AC82AD8375838F7582E174D3 +:102DE00002121EEF908F5E1222777404122045ACFF +:102DF00082AD837408122045AA82AB8312147374C7 +:102E000004121FF27403122045E4F07C04FD8518BF +:102E100082851983AA82AB83790112134D740680CF +:102E20009C74F612205174F4121FDC8518828519E7 +:102E3000837405F07401122045740312AF09122245 +:102E400064EAFCEBFD740412204512AE93121FF2EB +:102E5000740B122045E4F0908F66122277740912E9 +:102E60002045AC82AD837404122045AA82AB831244 +:102E700014737404121FF27C077D00740512204540 +:102E8000AA82AB83790112134D740C121FF27F02D8 +:102E9000022123AA82AB831210BF74022274F6129D +:102EA000205174E6121FDC8518828519837406F0A0 +:102EB0007401122045740A12AF09122264EAFCEB75 +:102EC000FD740412204512AE93121FF274191220E1 +:102ED00045E4F0908F7A1222777410122045AC826C +:102EE000AD837404122045AA82AB83121473740458 +:102EF000121FF27C0E7D00740C122045AA82AB8357 +:102F0000790112134D741A8082F0F5087509007862 +:102F1000082274F712205174F3121FDCE9900D1D82 +:102F2000F074021220457401F0740B122045E4F095 +:102F3000A3F004122045E4F074091220457404F053 +:102F4000A3E4F074071220457404F0A3E4F07405C0 +:102F5000122045E4F0A3F074031220457440F0A35E +:102F60007406F07402122045AC82AD8379017A05B3 +:102F70007B031213E3740B122045AC82AD837902FC +:102F80007A067B031213E37C7C7D11790C7A087B33 +:102F9000031213E37C887D11790D7A077B031213EA +:102FA000E37401122045AC82AD8379017A107B0372 +:102FB0001213E37409122045AC82AD8379027A11B1 +:102FC0007B031213E37407122045AC82AD837902B0 +:102FD0007A127B031213E37405122045AC82AD8391 +:102FE00079027A137B031213E37403122045AC8237 +:102FF000AD8379027A147B031213E3851882851955 +:10300000837403F0AC82AD837A0179061207537C96 +:10301000957D117A1579001207537CA07D007A0600 +:1030200012B0907A0712B0907A0812B0907A097BA9 +:10303000001205D9908F62121ECA120759908F6232 +:10304000121ECA120861908F62121ECA1211C1129A +:1030500011FD1211E5908F62121ECA1212AB1214EA +:103060001F12133B7C007D0112B52712143D7A011B +:103070007B00900D1DE0F91211137A057B03900D72 +:103080001DE0F9121113740D121FF27F01022123AA +:103090007B001205D97CA07D002274F612205174A9 +:1030A000F3121FDCEAFEEBFF54806018900D1DE068 +:1030B000F91210FBEA4B60031210E9EEFAEF64809C +:1030C000FB02B17CEEA2E0502C7A227B0E1213E9B7 +:1030D0007A267B0E12122D908F661222777A027B4F +:1030E00000900D1DE0F91211857404121FF2EE64B8 +:1030F00001FAEF80CB5402601C908F661222777A1F +:10310000027B00900D1DE0F91211857404121FF26C +:10311000EE640280DCEE5405F8EF5403F9E84960F0 +:103120000C121443EE6405FAEF64038093EE540826 +:103130006021851882851983AA82AB83790F1211C9 +:10314000CD851882851983AA82AB83121449EE6457 +:1031500008809EEE541060207403122045AA82ABB2 +:1031600083790012142B7403122045AA82AB8312B8 +:10317000144FEE641002B0F17A007B00740D02AEC1 +:103180008B74F7122051E9FE74016E7003121467FC +:1031900002B08B74F21220517582FC7583FE1220EE +:1031A000277901121359900E2AEAF0A3EBF0900E42 +:1031B0002AC3E09401A3E094014008900E2AE4F0B1 +:1031C000A304F0900E1EE0F8A3E0F9900E2AE02888 +:1031D000F8A3E039F9C3E89401E994014007900E9F +:1031E0001EE4F0A3F0900E2AE0FCA3E0FD12B5303F +:1031F0007901121347900E2AE0F8A3E0F9900E1E11 +:10320000E028F0A3E039F0807D75080378081222E9 +:10321000647488122045AC82AD8374071220451275 +:10322000AE93121FF27405122045AC82AD837A036F +:10323000790F1211C7850C82AE82900E1EE0C395E5 +:103240000CF508A3E09400F5097808122264741FB5 +:103250002EFC740D3400FD7A1E7B0D12AE97121FEA +:10326000F2EE2401F8E43400F9900E1EE098F0A389 +:10327000E099F0900E1EE0F8A3E0F974FFC398FC0B +:10328000E499FD12B52712146DE9F50CE50C7003F5 +:1032900002B519F508E4F509F50AF50B78081222CC +:1032A000607488122045AC82AD837A1E7B0D1214A7 +:1032B000797404121FF27485122045E0900E20F0FC +:1032C000A3E4F0900E2CE004F07484122045E01486 +:1032D000700302B41714700302B46F14700302B3C6 +:1032E000E714601514700302B20914700302B4BE2F +:1032F00014700302B4ED02B235750820780812226A +:10330000647488122045AC82AD8374661220451225 +:10331000AE93121FF27464122045AC82AD837A0220 +:1033200079021212037466122045AC82AD837A01D1 +:1033300079041212037467122045AC82AD837A1DA2 +:1033400079031212037467122045AC82AD837A1D93 +:103350007905121203901184E06478600302B2359B +:10336000A3E06478600302B235A3E06478600302EE +:10337000B235A3E06478600302B2357401122045CF +:10338000AC82AD8375838F75824E7404121EEF7408 +:103390006412204512227B7C057D8F740312204528 +:1033A000AA82AB8312148B7402121FF274011220D2 +:1033B00045E0901184F07402122045E0901185F0F0 +:1033C0007403122045E0901186F07404122045E049 +:1033D000901187F07C7C7D117B0C7A00900D1DE0B4 +:1033E000F91206DB02B235750801780812226474FE +:1033F00088122045AC82AD83740212204512AE9330 +:10340000121FF2851882851983AC82AD837A017907 +:10341000001211EB02B23575081478081222647498 +:1034200088122045AC82AD83745212204512AE93AF +:10343000121FF27508107808122264749C1220453D +:10344000AC82AD83744212204512AE93121FF27407 +:1034500050122045AC82AD837A14790C1211C774D6 +:1034600040122045AC82AD837A10790D02B23275DC +:10347000082878081222647488122045AC82AD8333 +:10348000741A12204512AE93121FF2741F122045B7 +:10349000AC82AD837A1179011212B17430122045D9 +:1034A000AC82AD837A1079021212B17418122045E1 +:1034B000AC82AD837A0779031212B102B235750876 +:1034C0000A78081222647488122045AC82AD837495 +:1034D0001012204512AE93121FF2740E122045AC4A +:1034E00082AD837A0A790012142502B23575080676 +:1034F00078081222647488122045AC82AD83740A65 +:1035000012204512AE93121FF27408122045AC82AD +:10351000AD837A06790E02B2327582047583011288 +:1035200020277F0602212379FF12B5301210D722FF +:10353000900E1EE0241EFAA3E0340DFB22C082C0D0 +:103540008379007A007B008008EA24010AEB3400CA +:10355000FB900E1EE0FCA3E0FDC3EA9CEB9D500F28 +:10356000741E2AF582740D3BF583E070DCEAF902E3 +:10357000ADC074F412205174FF121FDC740D1220C0 +:10358000457808121EACEA2508FEEB3509FFECF879 +:10359000EDF98C828D83A3AC82AD83750801801B0D +:1035A0008C828D83F0A3AC82AD83050874FF65081F +:1035B000601E8A828B83A3AA82AB83C3EA9EEB9FA1 +:1035C00050278A828B83E0851882851983F070D01A +:1035D00088828983E508F0ECF8EDF98C828D83A36D +:1035E000AC82AD8375080180C988828983E508F0C3 +:1035F0007401121FF27F0402212374F3122051740C +:103600000D1220457808121EACEA2508F8EB3509A2 +:10361000F98808890980528A828B83E08C828D83A5 +:10362000F08A828B83A3AA82AB83E8FCE9FDE50ADA +:103630002401F50AE50B3400F50B8C828D83A3A8D9 +:1036400082A983C3EA9508EB9509500FC3E50A9E4A +:10365000E50B9400A2D265D03340BCEEF4600A8C36 +:10366000828D83E4F0E8FCE9FDC3EA9508EB950957 +:1036700050138A828B83E0FEA3AA82AB83750A0172 +:10368000750B0080B57F05022123C082C083120D17 +:10369000E312BF8075E1F17A02FB12BF62120D1DC9 +:1036A000D083D08202012274EA12205190058EE468 +:1036B000F07A857B05120D3B120C458A088B09AE0A +:1036C00008AF098E828F83A3A3A37401F090046FC7 +:1036D000E004F07940120D358E828F83EAF0A3EB7F +:1036E00012BC122406FCA3E03400FD12BBD3120D61 +:1036F000EFE5D9E5D9A2E6E433900576F07800E568 +:10370000D9C0E0880874772508F582740512BB9942 +:10371000D0E0F008E8C3940640E57806E5D918E85B +:1037200070FAEE242212BB8F49700A7A04E5D91A86 +:10373000EA601D80F87C00E5D9C0E012BB7E24223F +:10374000F582EB12BB99D0E0F00CECC3940440E797 +:1037500088828983121ECA120E5BEE242612BB8F4A +:1037600049700A7A03E5D91AEA601D80F87C00E501 +:10377000D9C0E012BB7E2426F582EB12BB99D0E0C3 +:10378000F00CECC3940340E7888289837808121E0A +:10379000AC908F367808121E86AA08AB09AC0AAD29 +:1037A0000B120E31EE242BF514EF3400F515E5D98C +:1037B000851482851583F0EE242CF50AEF3400F58C +:1037C0000BE50A450B700A7802E5D918E8601F80FE +:1037D000F87A00E5D9C0E08A08EE250812BB8F24EC +:1037E0002CF582E912BB99D0E012BC0B40E5EE2427 +:1037F0002EF508EF3400F509E5084509700A78024E +:10380000E5D918E8601A80F87A00E5D9C0E012BB63 +:103810008A242EF582E912BB99D0E012BC0B40EA53 +:10382000851482851583E0C333F0850A82850B8376 +:1038300012BBFA850A82850B83E8F0A3E9F012BB7C +:10384000F4850882850983E8F0A3E9F0EE242012CC +:10385000BB8FFCE9FDEC4D700A7802E5D918E860F1 +:103860001A80F87A00E5D9C0E012BB8A2420F582DC +:10387000E912BB99D0E012BC0B40EAEE2432FAEF19 +:103880003400FBEA4B700A7802E5D918E86023801F +:10389000F8750E00E5D9C0E0850E0C12BB8C243201 +:1038A000F582E912BB99D0E0F0050EE50EC3940253 +:1038B00040E212BBAD7404780C121FC98A828B835C +:1038C000E50CF0A3E50DF08C828D83E02401F5106A +:1038D000A3E03400F511E4F512F51312BBF4880CE3 +:1038E000890DE4F50EF50F7810790C121CE912BB66 +:1038F000AD780C79101214DE500C8508828509838E +:1039000012BC0449700F7A4012BF60EEFAEFFB124E +:103910000C5D02BB76AC14AD15EEFAEFFB120C6F2A +:10392000EE240B12BB967405F0A3E4F0EEFAEFFB65 +:10393000120C75EE245DF510EF3400F511E510451D +:1039400011700A7805E5D918E8601D80F87A00E55D +:10395000D9C0E012BB8A245DF582E912BB99D0E0A0 +:10396000F00AEAC3940540E7E5D9F8880CEE242A6A +:1039700012BB96E8C4135407F0EE2410F512EF348E +:1039800000F513E0F912292A851282851383EAF0E3 +:10399000A3EBF0E50C541FC0E0EE243712BB96D029 +:1039A000E0F0AC10AD11EEFAEFFB120C3F120EBBC3 +:1039B000120E557904120E617901120E9790606013 +:1039C0007480F075E1F1900F0C12BC1912BC1974DF +:1039D00011F0A3740D12BC1F7495F0A3740DF09038 +:1039E0000F1A12BC2AA312BC2A7A0412BF60850ADD +:1039F00082850B8312BBB1908F1E780C121E388506 +:103A00000A82850B8312BC0449600F850A82850BEC +:103A100083E064027002A3E0702C8508828509832C +:103A200012BE45121E257C027D00EEFAEFFB12232A +:103A3000AC122A408E828F8312BB9E8E828F83A30C +:103A4000A312BB9E800E7C017D00EEFAEFFB1223D9 +:103A5000AC122A4012BBE1780C121E4B908F3678C4 +:103A600008121EAC12BBE17808121E99EE2412F562 +:103A700008EF3400F5097808122264851282851354 +:103A80008312227BEE241D12BB9612227BAA0CAB62 +:103A90000DAC0EAD0F12297E7406121FF2EE241823 +:103AA00012BB96780C121EBBAC08AD0912BBCC7CC5 +:103AB000C47D8E12BBCC12BBE1C082C0838E828FCC +:103AC00083E02408FCA3E03400FDD083D082740698 +:103AD000121EEF908F62121ECA8E828F8312BE5901 +:103AE000121ED6851482851583E0FA850882850921 +:103AF000837808121EAC74017808121FC9EA2508E1 +:103B0000F8E43509F9E875F071A4C8AAF075F00277 +:103B1000A42AFA75F071E9A42A12BBB9E8F0A3E966 +:103B2000F0EE241612BB96E0F508A3E0F509740444 +:103B30007808121FBAE5082401F8E509340012BB21 +:103B4000B9E028F0A3E03912BC12241212BE5CE0E6 +:103B50002410F0A3E0340112BC12241412BE5C74D1 +:103B60001012BC12241612BE5C74F1F0A3740BF098 +:103B70009004427407F0120D1D7F0E0221238C0861 +:103B8000EE2508FAEF3400FBEA228A0CEE250CF849 +:103B9000EF3400F9E822F582EF3400F58322A3A385 +:103BA000A3A3A3E02401F0A3E03400F0228A828BD7 +:103BB00083E0F50CA3E0F50D22F98E828F83E024DB +:103BC00012FAA3E03400FB8A828B832212BBD31249 +:103BD00028B8228E828F83E02402FAA3E03400FB0F +:103BE000228E828F8312BBE922E0F8A3E0F583885E +:103BF00082A3A32285088285098312BC04C333F8FB +:103C0000E933F922E0F8A3E0F9E822F00AEAC394E4 +:103C10000222F08E828F83E022748FF0A3740DF065 +:103C2000A3748FF0A3740DF0A322741112BC381288 +:103C3000BC38F0A3740DF022F0A3740DF0A374113E +:103C40002274F0122051120E37E9700312BE05756E +:103C5000E181907803E06442705E9005DFE014F04B +:103C60007056C2AF12BC6700782AD0E0F618D0E0D8 +:103C7000F6E59F5407F97005908F828003908F2698 +:103C80007808121EACE9C4C0E07829E65508F508AA +:103C900008E65509F509740B7808121FBAD0E0251B +:103CA00008F8906270E0A2E740F8E8C333906272CF +:103CB000F0906270E0D2E0F012BF57707E12BE0E3C +:103CC00060069005D712BF65900596E064017034D8 +:103CD00012BE2B8AD9780012BE3040FB78008003D8 +:103CE00012BDEEE8C39940F812BE1912BE3040FB77 +:103CF0007800800312BDE0E8C39940F875E1959023 +:103D00000596E4F012BE6B121E3812BE42121E253A +:103D1000908F36780C121E868A828B83780C121E46 +:103D2000BB12BE99121ECA12BE56121ED69005852F +:103D3000E0241412BE5C741212BEAB120D1D7F087B +:103D400002212374F012205175E181120E37E970BF +:103D50000312BE0512BF57600302BDDD12BE0E6026 +:103D6000069005D712BF65900596E0640170371282 +:103D7000BE2B74064AF5D9780012BE3040FB78009D +:103D8000800312BDEEE8C39940F812BE1912BE308E +:103D900040FB7800800312BDE0E8C39940F875E16C +:103DA00095900596E4F012BE6B121E3812BE4212B8 +:103DB0001E25908F36780C121E868A828B83780C93 +:103DC000121EBB12BE99121ECA12BE56121ED690E9 +:103DD0000585E0241412BE5C741512BEAB02BD3B17 +:103DE000880874B82508F582740512BDFC2288087D +:103DF00074982508F582740512BDFC223400F58301 +:103E0000E0F5D90822900592E0F9120E3D229005C6 +:103E1000D8E0FAA3E0FBEA4B229005B7E0F974077B +:103E200029F5D974044AF5D978002212BF42FA2242 +:103E3000880874882508F582740512BDFCE8C394CF +:103E4000062290058FE0F508A3E0F509E4F50AF5F0 +:103E50000B780C790822900585E0240E12BE6022B2 +:103E6000F8A3E03400F98882898322120C9FE9FCD0 +:103E7000900585E02402F8A3E03400F9E8FAE9FBB4 +:103E80008A828B83EC75F0118485F00885080CE438 +:103E9000F50DF50EF50F780C2290058512BBE9A300 +:103EA000A3A3A3E4F0A3F0908F6222F0900585E035 +:103EB000241612BE6074EBF0A3740BF02274F0129F +:103EC000205175E181120E37E9700312BE0512BF51 +:103ED00057706C12BE0E60069005D712BF65900534 +:103EE00096E06401702212BF424402F5D9780012B4 +:103EF000BE3040FB7800800312BDEEE8C39940F865 +:103F000075E195900596E4F012BE6B121E3812BE54 +:103F100042121E25908F36780C121E868A828B8361 +:103F2000780C121EBB12BE99121ECA12BE56121E69 +:103F3000D6900585E0241412BE5C741412BEAB0248 +:103F4000BD3B75E191A3E0F9740729F5D990058788 +:103F5000E0C4333354C0227901120D47E9640122D1 +:103F60007B00900441E0F912111322C082C08353F8 +:103F7000BFEF12BF57700312BF8075E1F102B69D0B +:103F80007A857B05120D3B90058EE4F02274F712C2 +:103F900020518C828D8312C2618C828D83A3E08A32 +:103FA000828B8312BFB5E0FE8C828D8312BFBEF080 +:103FB000A3E902C4F4A3F08C828D83A3A322A3A35C +:103FC00012BFC422A3E0F9EE8A828B83A3A32274DA +:103FD000EE1220518A088B09890A8C0E8D0F7412FB +:103FE00012204512C17A7414122045E0F50B7415A5 +:103FF000122045E0FE7901120AC5E96039EEF91296 +:104000000A778A108B11AE10AF11EE4F60238E82AB +:104010008F83A3A3A3A3E508F0A3E509F08E828F05 +:1040200083E50BF09003F3E004F0700F7401F0806F +:104030000A750815806C7508148067F8EE24030A69 +:104040000A0AEF3400FBE88A828B83F0780C122294 +:1040500064780E1222648A828B83E0FCA90AAA0883 +:10406000AB09120A3B7404121FF2E9F508702CEE3A +:104070002407F50CEF3400F50D780C122264750C52 +:1040800030750D75780C122264EEFCEFFD7A8F7B93 +:104090000A12137D7404121FF28007EEFAEFFB126E +:1040A0000A7DA9087F0A02212374EE12205174FAB6 +:1040B000121FDC8A0E8B0F890A8C0B741812204594 +:1040C00012C17A741A12204512C4877A177B001223 +:1040D0000A9B8A108B11AE10AF11EE4F700302C114 +:1040E0006DE5084509601FAC0CAD0DEE2404FAEF38 +:1040F0003400FB85088285098312204F8A088B09CA +:10410000A808A9098004780079008E828F83E50AC7 +:10411000F0A3E50BF0E88E828F83A3A3F0E98E82F3 +:104120008F83A3A3A3F08518828519837405F0A358 +:10413000E4F07402122045EEF0A3EFF0E82404F856 +:10414000E93400F97404122045E8F0A3E9F0851879 +:1041500082851983AC82AD83AA0EAB0F120A41E9A6 +:10416000F508600CEEFAEFFB12136B800375081371 +:10417000A9087406121FF202C0A4E0F50CA3E0F532 +:104180000D2274F21220518A0A8B0BECFEEDFF7C9B +:10419000047D008E828F83A3A3E0FAA3E0FB1213B9 +:1041A000718A0C8B0DEE2404F8EF12C45612C26112 +:1041B000A385820885830988828983A312C2651238 +:1041C000C265A312C27488828983E02404F8C39470 +:1041D0001C400302C25A8882AE8274FE650A7004D3 +:1041E00074FF650B70467A097B001210E3EA4B609E +:1041F000378A828B837490F0A3A3A3A37402F08AFE +:10420000828B83A3A374FEF0A30412C6E9A3E50C7A +:10421000F0A3E50D12C6EEEEF0A3E4F09003CEE0BD +:10422000F91210EF7900803479138030780C122263 +:1042300064EEFC7D007900AA0AAB0B1208FD740243 +:10424000121FF2E924FE600A24FB600A24F5600ACA +:10425000800A791480067904800279027F0602219F +:104260002312C3C42212C274A38582088583098ED7 +:10427000828F8322E0850882850983F02274F212FE +:1042800020518A088B09EA240212C352E4F012BFBB +:10429000B5A3A3E06402600302C31F8C828D83A3D5 +:1042A000A3A3A3A3E0F50AA3E0F50BC3E50A9404D6 +:1042B000E50B940040698C828D83A3A3A3A3A3A3E1 +:1042C000A3E0FAA3E0FB8A828B83E0FCA3E0F9EC95 +:1042D0002400E439FD8A828B83A3A3E0F50C8A8253 +:1042E0008B83A3A3A3E0F9A80CEC2404F50CED3414 +:1042F00000F50DE50A650C7004E50B650D70207482 +:1043000007687001E9601C7405687001E960147445 +:1043100004687001E9600C7406687001E960047952 +:1043200001802C850882850983A3A3A3A3ECF0A3B5 +:10433000EDF0850882850983E8F0A3E9F07CFC7D37 +:10434000FF1213718E828F83EAF0A3EBF0790002E3 +:10435000C25CFEEB3400FF8E828F832274F5122044 +:104360005175080275090012C4D5A3A983EC240273 +:10437000FEED3400FF8C828D83E064017002A3E0C7 +:10438000700812C3B1750804801E8C828D83E064AE +:10439000027002A3E0701112C3B1A30AAB83EC2434 +:1043A00004F812C4B2750806AA08AB097F030221FB +:1043B000238E828F8312C3C40AE9FB8E828F83A36C +:1043C00012C3C42212C4C52274F6122051740A12F8 +:1043D000204512C532C3E89402E99400406712C533 +:1043E0004AEA2402F8EB3400F98A828B83E0640104 +:1043F0007002A3E070148C828D8312C44AA3E0FB88 +:10440000EE88828983F0A3EB80368A828B83E06416 +:10441000027002A3E0702A8C828D83A3A3E0F508CA +:104420008C828D83A3A3A3E0FFE50888828983F0B3 +:10443000A3EF12BFB612C44A12BFBEA3A3F0A3E9F2 +:10444000F079008002790102C46EA3A3E0FE8C82A1 +:104450008D83A3A322ED3400F98882898322D0833F +:10446000D08202012212C4C5A3AA82AB83227F029A +:104470000221237F04022123F012C47D22EC2402B6 +:104480000C0CED3400FD22E0F508A3E0F5092274E0 +:10449000F712205112C4D5EC2402F812C4CC240423 +:1044A000080812C4CC2406080812C4B27A087B009B +:1044B000804312C4B62212C45512C4E9888289838B +:1044C000A312C4C522E08A828B83F02212C4B6A351 +:1044D0000AAB83EC228C828D8312C4658C828D831F +:1044E000A312C4E52212C4E922E08A828B83F0A3DE +:1044F0000AAB8322F07F0102212374F7122051744A +:104500000912204512C5327408687001E9701F1243 +:10451000C54A12C47D8C828D83E0FE12BFC012C5D5 +:104520003812C538A3A3F0A3E9F07900800279011D +:1045300080C3E0F8A3E0F922F0A3E912C4788C82EA +:104540008D83E0FE12BFC4A3A32212C54E228C822B +:104550008D83E0FEA3E0F9EE8A828B83F0A3E9F07D +:104560002274F7122051740912204512C57D700182 +:10457000E9700512C5868002790102C4F5E0F8A34E +:10458000E0F97402682212C54E79002274F01220FC +:1045900051890A8A0C8B0D8C088D097A0A7B0012CE +:1045A00010E38A0E8B0FAE0EAF0FEE4F60488E8277 +:1045B0008F8374A0F0A3E412C682E50CF0A3E50D8E +:1045C000F0EE2404FAEF3400FBE50845096011859C +:1045D0000882850983EAFCEBFD7406121EEF800950 +:1045E0007C067D0079001210D7EEFAEFFBA90A12C3 +:1045F00010EF7900800279017F0802212374EE1206 +:104600002051890E8A0A8B0B8C0C8D0D741212208E +:1046100045E0F50F741312204512C4877A127B000F +:104620001210E38A108B11AE10AF11EE4F60508E56 +:10463000828F8374A2F0A3E50C12C682E50AF0A370 +:10464000E50B12C68AE50F12C68AA3E50DF0EE242B +:1046500006FAEF3400FBE5084509601185088285FC +:104660000983EAFCEBFD740C121EEF80097C0C7DC3 +:104670000079001210D7EEFAEFFBA90E1210EF022C +:10468000C0A4F08E828F83A3A32212C682A3A3228A +:1046900074F4122051890A750B00850B82AC828C50 +:1046A0000875090074037808121FC912C746A8824A +:1046B000A983E0FEA3E0FFEE4F701E8A828B83E4A5 +:1046C000F0EC2440FCE43400FD88828983ECF0A304 +:1046D000ED12C6E9E50AF0800D050BE50BC3940366 +:1046E00040B87A007B0002C47312C6EEA322F08A9F +:1046F000828B83A3A3A3A3A322C082C0838A828BBD +:1047000083A3E4F0A3F08A828B83F002C45E74F684 +:104710001220517E008E0875090074037808121F5C +:10472000C912C746E0FCA3E0FDEC4D600B8A828B0A +:1047300083A3A3A3E069600B0EEEC3940340D67A73 +:10474000007B0002C46E74DB2508FA74033509FB94 +:104750008A828B83A32274F7122051EA240712C3A2 +:1047600052E0F91213838E828F8374FF02C4F474B3 +:10477000F6122051EAFEEBFFEE4F60558E828F83DA +:10478000A312C532E8496049E4F508F50978081232 +:10479000226478081222687D137C178E828F83A38F +:1047A000A3A3A3E0FAA3E0FB8E828F83A3A3A3A31A +:1047B000A3A3E0F9120A717403121FF28E828F8391 +:1047C000A3A3A3A3A3A3A374FFF0EEFAEFFB120A23 +:1047D0007D02C46E02012274F6122051EA2404FA0A +:1047E000EB3400FB1208F7EA4B60097CFC7DFF12FA +:1047F000137180047A007B0002C46E74F41220519D +:1048000074FC121FDC7E00900C97E4F0900C94F086 +:104810007F7D7508047509007808122264740212FD +:104820002045AC82AD837A007B00EF12CE11121FBF +:10483000F2851882851983C082C083908F5A7808C8 +:10484000121EACD083D08278081214A37019900C79 +:1048500094E06010F91213A1EFF91213A1900C94D7 +:10486000E4F08021EF80FA85188285198378081298 +:104870001EACE5084509450A450B7004EFFE8005AE +:10488000EFF91213A10FEFC3947F4086900C94E0D0 +:104890007026EE7018797D12138F900C957404F0C9 +:1048A000A3E4F0900C97E0601979008017F01213E0 +:1048B000A7EEF91213B9800AEE6004F912139B12E5 +:1048C00013A7790102C99674F712205174FC121FC4 +:1048D000DCE9FE908F5A121ECA8518828519831250 +:1048E0001ED6851882851983AC82AD837A007B0041 +:1048F0001213C5900C97E07005EE900C94F07404C0 +:10490000121FF27F01022123C082C08374FC121F98 +:10491000DC908F42121ECA851882851983121ED61A +:10492000851882851983AC82AD837A007B00900C58 +:1049300094E0F91213C57404121FF2D083D08202DE +:10494000012274F412205174FF121FDC8908900CAC +:1049500097E06008900C977401F080361213057E82 +:10496000007F00750A01750B00780A122264740238 +:10497000122045AC82AD83EEFAEFFBA90812CE12ED +:10498000121FF2851882851983E0F470C712C9E8F6 +:1049900040D1740180027404121FF27F04022123AB +:1049A00074F412205174FF121FDC89087E007F000E +:1049B000750A01750B00780A1222647402122045F0 +:1049C000AC82AD83EEFAEFFBA90812CE12121FF2F1 +:1049D000851882851983E0F46007A90812139B806B +:1049E0000512C9E840CA80AAEE24010EEF3400FF88 +:1049F000C394082274F412205174FC121FDC7EFC54 +:104A00007F07750804750900780812226474021281 +:104A1000204512CE05121FF2851882851983C082A7 +:104A2000C083908F627808121EACD083D082780841 +:104A30001214A3700AEE24FCFEEF12CADD50C3EE7E +:104A40002404F8EF3400F9900C95E8F0A3E9F002A3 +:104A5000C99674F412205174FC121FDC8909EAFE15 +:104A6000EBFF8C08EE24FCFEEF12CADD4068750AED +:104A700004750B00780A1222647402122045AC827D +:104A8000AD83EEFAEFFBA90912CE12121FF27402E7 +:104A9000122045E0F8A3E0F985188285198385087E +:104AA0000AE0650A7002A3E0700AEEC398FAEF9478 +:104AB00000FB8026E9548070ABE82404FAE9340056 +:104AC000FBC3EE9AEF9B400EEEC398F8EF99F9E81E +:104AD00024FCFEE980937A007B0002C99634FFFF34 +:104AE000C3EE9404EF94002274EC12205174FC1273 +:104AF0001FDC890AEAFEEBFF8C0B7418122045E0DC +:104B0000F50EA3E0F50F741A122045E0F50CA3E0B2 +:104B1000F50D85188285198374FFF0A3F0E50F4425 +:104B200080F97402122045E50EF0A3E9F0EE250E9F +:104B3000F508EF350FF509851882851983AC82AD2C +:104B400083AA08FBA90A1213C5740212204512CBCE +:104B5000D77402780E121FBAE50EF510900C97E08C +:104B60007050750F00780E122264AC0CAD0D8E0ED5 +:104B70008F0F7402780E121FBA850A12F51374098A +:104B80007812121FC9E50E2400FAE50F3513FB1247 +:104B900012FF7402121FF2E510F50E780E12226851 +:104BA000AC0CAD0DEEFAEFFBA90A1213BF740112A3 +:104BB0001FF2850B0CE50C851882851983F0A37410 +:104BC0008012CBDB85188285198312CBD77404122F +:104BD0001FF27F0C022123A3E0547FF08518828509 +:104BE0001983AC82AD83AA08AB09A90A1213C522A6 +:104BF00074EA12205174F8121FDC8910750DFF74CD +:104C00007D65107005750C7E8003750C7D750A043A +:104C1000750B00900C95E024FCFEA3E08005EE24CB +:104C2000FCFEEF12CADD500302CD4D900C97E06000 +:104C30000302CD67750804750900780812226474B0 +:104C400002122045AC82AD83EEFAEFFBA91012CE22 +:104C500012121FF2851882851983E0F47003A3E015 +:104C6000F4702D7402122045E0F8A3E0F95480702E +:104C7000AD12CF7CEE98EF99500302CD677402120B +:104C8000204512CD71F8EF99F9E824FCFEE98093F4 +:104C9000851882851983A3E0548070E18518828588 +:104CA0001983850D08E065087002A3E060CF8518C0 +:104CB00082851983E0F50DFCAA0AAB0BA90C12132F +:104CC000AD8B09EA450970B5740212204512CD7109 +:104CD000F508EF99F50988148915750E00750F0010 +:104CE000751204751300781212226474061220459E +:104CF000AC82AD83E508250EFAE509350F12CE0C1E +:104D0000121FF27404122045AC82AD83E50A250E11 +:104D1000FAE50B350FFBA90C1213C5E50E2404F5BB +:104D20000EE50F3400F50FC3E514950EE515950F4C +:104D300050AE7402122045E02404F8A3E03400F9D8 +:104D4000E50A28F50AE50B39F50B02CC7DA90C1212 +:104D5000138F900C97E0700A900C95E50AF0A3E58C +:104D60000BF0A91012139B7408121FF27F0E022180 +:104D700023E0F8A3E0F9EEC3982274F012205174F6 +:104D8000FC121FDC890B8A088B09ECFEEDFF741402 +:104D9000122045E0F50A8014E5082404F508E50929 +:104DA0003400F509EE2404FEEF3400FF850A0C748C +:104DB000FF250CF50A046043750E04750F00780E8C +:104DC0001222647402122045AC82AD83AA08AB099A +:104DD000A90B12CE12121FF2780E122264EEFCEF13 +:104DE000FD7402122045AA82AB831210D174021204 +:104DF0001FF2E970A3900C977401F07404121FF273 +:104E00007F08022123AC82AD83EEFAEFFB900C9475 +:104E1000E0F91212F974022274F1122051890E8AFB +:104E2000088B09ECFEEDFF900C97E0704D750A01C0 +:104E3000750B00780A1222648A0A8B0B7402780AB6 +:104E4000121FBA890CF50D7409780C121FC9E50AF6 +:104E50002400FAE50B350DFB1212FF7402121FF24B +:104E6000750A01780A122268EEFCEFFDAA08AB0968 +:104E7000A90E1213BF7401121FF27F07022123C073 +:104E800082C083121389E9700479018002790002DB +:104E9000C93B74F012205174FF121FDC89088A0983 +:104EA0008C0A8D0BAC0812CFBA8A0C8B0DAE0CAFEE +:104EB0000DEE4F604D750E00803B750C01750D00B9 +:104EC000780C122264740212204512CE05121FF2D1 +:104ED000851882851983E0F8850E0CE50A250CF506 +:104EE00082E50B3400F583E0687017EE24010EEFC5 +:104EF0003400FF050EE50EC3950940BEE509650EB9 +:104F0000607385090CE50C2403F8E43400F97A0495 +:104F10007B00121F49880E890F7402780E121FC978 +:104F2000850E0C850F0D900C95E0250CF8A3E0354F +:104F30000DF912CF7CE89401E99408400312D025C2 +:104F4000780A122264780C122264AC0812CFC112C3 +:104F500013B37404121FF2900C97E06004790A8076 +:104F600016E50C2404F8E50D3400F9900C95E028C2 +:104F7000F0A3E039F07900740102CDFDE82404F8D3 +:104F8000E93400F9C32274F4122051890A8A0BEC27 +:104F9000FEEDFFAC0A12CFBAEA4B6019850B08751B +:104FA00009007808122264EEFCEFFD12CE0D121FEC +:104FB000F279008002790A02C99B12CFC11213ADA7 +:104FC00022900C95E0FAA3E0FB900C94E0F9227497 +:104FD000F0122051E9FE74BA2EC3941A40047902EB +:104FE0008040900C95E0F508A3E0F509E4F50AF59A +:104FF0000B908F56780C121EAC7808790C121CE9B5 +:105000008E0CE4F50DF50EF50F740B780C121E06E0 +:10501000780C79081214DE400712D025790080023E +:10502000790A02CE00121395900C94E0F91213B98C +:1050300022C082C083790102D3ACC082C0837902CE +:1050400002D3AC74F51220518A088B09ECFEEDFFF7 +:10505000EE4F6005EA45097005790202D0FD8E82A7 +:105060008F83E912D41E8A828B8312D1038A828BAA +:105070008312D102EA24020A0AEB3400FB120F1554 +:10508000E912D104850882850983A3A3A312D10262 +:1050900012D2B788828983E054086004D2F080027B +:1050A000C2F0A2F012D10E541060047A0280027A8B +:1050B000008E828F83E04A12D114542060047A0457 +:1050C00080027A008E828F83E04A12D1088882891A +:1050D00083E0A2E012D10E540260047A0280027AC8 +:1050E000008E828F83E04A12D11454046004780445 +:1050F000800278008E828F83E048F079007F03027F +:105100002123A3E08E828F83F0A30EAF8322E433AA +:105110008E828F83F088828983E02274ED12205181 +:10512000EAFEEBFF8C088D09EE4F6005EC45097037 +:1051300005790202D2B28E828F83A3AE82AF83E062 +:105140008C828D8312D2C28C828D83A385820A8544 +:10515000830B8E828F83E0850A82850B8312D2C2F5 +:10516000E0F9EC2402FAED3400FB120F1B8E828F63 +:1051700083A30EAF83E5082404F50CE5093400F59C +:105180000DE0850C82850D83F08E828F83A3E0F580 +:1051900012A30E0EAF83A2E0E433F50E750F00E507 +:1051A00012A2E15004D2F08002C2F0A2F0E433F582 +:1051B00010751100E512A2E25004D2F08002C2F094 +:1051C00012D2B7E8FAE9FB8A828B83E054F7FCA39A +:1051D000E0FD7403780E121FC9EC450E54EFFC7409 +:1051E000047810121FC9EC451054DFFCA2F0E43320 +:1051F000F50E7405780E121FC9EC450EFC8A828BE1 +:1052000083F0A3EDF08E828F83E0F512A2E0E43309 +:10521000FEE512A2E15004D2F08002C2F0A2F0E456 +:1052200033F8E512A2E25004D2F08002C2F0EC544E +:10523000FE4E54FDFCE8C333F8EC48F8EDF9E854B1 +:105240003BFCA2F0E433F50E7402780E121FC9EC99 +:10525000450E8A828B83F0A3E9F07A217B00120548 +:10526000DF8A0E8B0FA80EA90F850C82850D83E0B7 +:10527000C398E499401A7A227B001205DF8A0E85D2 +:105280000C82850D83E0FAC3E50E9AEB940050047E +:105290007912801E850882850983E0C39405500C2D +:1052A000850A82850B83E0C394024004791880024A +:1052B00079007F0B022123E5082405F8E509340075 +:1052C000F922F08E828F83A30EAF832274F6122010 +:1052D00051ECFEEDFFEE4F6004EA4B700479028062 +:1052E000188E828F83740312D412122264EAFCEBAC +:1052F000FD12D524121FF2790002D4E774F61220B1 +:1053000051ECFEEDFFEA4B6004EE4F700479028031 +:1053100013750810750900780812226412D51B1243 +:105320001FF2790002D4E774F6122051ECFEEDFF73 +:10533000EE4F6004EA4B7004790280188E828F83EE +:10534000740412D412122264EAFCEBFD12D524126A +:105350001FF2790002D4E774F6122051ECFEEDFF43 +:10536000EA4B6004EE4F70047902801375081075E3 +:105370000900780812226412D51B121FF27900026C +:10538000D4E7C082C083EC4D6004EA4B700479021C +:1053900080188C828D837405F0A3AC82AD838A82E1 +:1053A0008B83E08C828D83F07900800312101DD0F6 +:1053B00083D082020122C082C083EA4B6004EC4D9C +:1053C00070047902801A8A828B83A3E0F88C828D24 +:1053D00083F0C3940A5003E87004791880027900BE +:1053E00080CD74F6122051ECFEEDFFEE4F6004EA22 +:1053F0004B7004790280188E828F83740612D41247 +:10540000122264EAFCEBFD12D524121FF27900028D +:10541000D4E712D41E750810750900780822F0A38D +:10542000AE82AF832274F6122051ECFEEDFFEA4B00 +:105430006004EE4F7004790280137508107509003E +:10544000780812226412D51B121FF2790002D4E7E9 +:1054500074F6122051EAFEEBFFECFAEDFBEA4B602A +:1054600004EE4F70047902802C8A828B83740712B9 +:10547000D56F8E828F83A312D57D750808750900BC +:105480007808122264EE2402FCEF3400FD12D528C5 +:10549000121FF27900805074F6122051ECFEEDFFDD +:1054A000EA4B6004EE4F70047902803B8A828B8362 +:1054B000A3AA82AB83E0FCA3E0F8E4C8F9EC8E82F7 +:1054C0008F83F0A3E9F07508088809780812226430 +:1054D000EA2402FCEB3400FDEE2402FAEF34001261 +:1054E000D527121FF279007F0202212374F61220C1 +:1054F00051ECFEEDFFEE4F6004EA4B700479028040 +:10550000188E828F83740812D412122264EAFCEB84 +:10551000FD12D524121FF2790080CC8A828B83A3DE +:10552000AC82AD83EEFAEFFB1210BF74022274F668 +:10553000122051EAFEEBFFECFAEDFBEA4B6004EEC1 +:105540004F7004790280258A828B83740912D56F8B +:1055500075080675090078081222648E828F83A36D +:10556000AC82AD8312D528121FF2790002D4E7F085 +:10557000A3AA82AB838E828F8312D57D22E08A829A +:105580008B83F0A30AAB832274F6122051ECFEED5C +:10559000FFEA4B6004EE4F70047902801375081027 +:1055A000750900780812226412D51B121FF27900C7 +:1055B00002D4E774F6122051ECFEEDFFEA4B6004D2 +:1055C000EE4F7004790280378A828B83A3AA82AB64 +:1055D00083E08E828F83F08A828B83A30AAB8375EC +:1055E00008067509007808122264EAFCEBFD8E8239 +:1055F0008F83A3AA82AB8312D528121FF2790002EF +:10560000D4E774F6122051ECFEEDFFEE4F6004EA91 +:105610004B7004790280188E828F83740A12D41220 +:10562000122264EAFCEBFD12D524121FF27900026B +:10563000D4E774F6122051ECFEEDFFEA4B6004EE65 +:105640004F700479028013750810750900780812EC +:10565000226412D51B121FF2790002D4E774F712EC +:105660002051ECFEEDFFEE4F6004EA4B700479022E +:1056700080148E828F83740B12D41E120F15E98E44 +:10568000828F83F079007F01022123C082C083EAE8 +:105690004B6004EC4D7004790280108A828B83A3E6 +:1056A000E0F9ECFAEDFB120F1B790002D3AF74F3B3 +:1056B00012205174FA121FDC8A088B09890CECFE47 +:1056C000EDFF7413122045E0F8A3E0F9880A890B76 +:1056D0008518828519837406F0A3E4F0850C82AAEC +:1056E00082FB7404122045EAF0A3E4F0120A9B74D2 +:1056F00002122045EAF0A3EBF07402122045E0FC10 +:10570000A3E0FDEC4D6036EEFAEFFB850A82850BD7 +:105710008312204FE9FE7013851882851983AC82AD +:10572000AD83AA08AB091209F9E9FEEE6011740213 +:10573000122045E0FAA3E0FB12136B80027E1312E5 +:105740000EEBEEF97406121FF27F0502212374F4AA +:1057500012205112DE4B6005791102D81D90030111 +:10576000E054057005791202D81D90032512DE540D +:10577000600512DE467005791002D81D900301E025 +:10578000A2E0400612073BE960108E828F83E0F8AA +:10579000740368600574026870CB7A0C7B00121188 +:1057A0004F90031CEAF0A3EBF012DE51606B12DCA9 +:1057B0002BE50812DC1FE4F0750A0AF50B780A12D3 +:1057C0002264EEFCEFFD90031CE02402FAA3E01239 +:1057D000DD43121FF21206F3E9FE6005120717807F +:1057E0003A900302E0640370327A1D7B001205DFF9 +:1057F000900303EAF0A3EBF090030312DE54601B66 +:10580000908F7E1222777A047B0090032BE0F912AE +:10581000118B7404121FF280027E13EEF902DD2F49 +:1058200074EE122051890C8A0A8B0B8C0E8D0F900E +:105830000301E05405700302D8C27401650A700DBB +:1058400090032512DE54607A900325800B90032785 +:1058500012DE54606D900327E0FEA3E0FFEBC394DB +:105860002040047902805DEB6005EC450F60F4E5B3 +:105870000C900E7AF08E828F83A38582088583092F +:105880007C1F7D007900AA08AB091210D7850B1088 +:105890007511007810122264AC0EAD0FAA08AB0986 +:1058A0001210BF7402121FF28E828F83E50BF0F983 +:1058B000E50AAA08AB096005120927800712092D1D +:1058C000800279127F0A02212374F7122051E9FE27 +:1058D00012DE5170047912802912DE466E6004795E +:1058E00003801F12DD177A04FB90032BE0F91211DD +:1058F00091900303E4F0A312DC1F7403F07900120B +:10590000093302D986D083D08202012274F7122093 +:105910005190032512DE54600312D98B9003271295 +:10592000DE54600D90032712DDD8900327E4F0A326 +:10593000F0900301E0540560447A7B7B0E12074D22 +:105940007E00900301E05405602F12DD5C9003257A +:1059500012DE5460227C207D0079001210D712DD07 +:105960004C90032712DE54600B7C207D00790012DE +:1059700010D7800512D98B7E13EEF980097A007B4F +:105980000012074D79007F0102212390032512DDCB +:10599000DC900325E4F0A3F02274F61220517E017E +:1059A0008A828B83A3A3A3E0FCA3E0FD8C088D096E +:1059B00078081222A80620041FDAC4D91FDAFFD9FA +:1059C000FFD9D7D98A828B83A3A3A3A3A312DD6CAB +:1059D0001206F9E9FE80498A828B83A3A3A3A3A3BD +:1059E00012DD3D88828983A3E0FC88828983A3A39A +:1059F000E0FBECFA88828983E0F91206FF80D47418 +:105A0000086C700374206D70047901800279008A3B +:105A1000828B83A3A3A312DE41FA12070580011E25 +:105A2000EEF902DC6C74F212205112DE51700302A6 +:105A3000DAE412DC26A3E0F50A12073BE960097AF2 +:105A40000A12DAEB7A0B801612071DE960097A0652 +:105A500012DAEB7A0780077A0812DAEB7A097B0010 +:105A60001205DF8A088B09900302E07005750B00B0 +:105A70008003750B0190031CE02404FAA3E03400BA +:105A8000FB12DAF9E0F9120603E9FA90031CE024AC +:105A90000BF8A3E012DD34F50C780C12226812DA50 +:105AA000F9A3A3A3A3A3A3A3E0F50C780C12226887 +:105AB00090031CE02404F50CA3E03400F50D780CF1 +:105AC000122264EAF50C780C122268780B12226814 +:105AD000A90AAC08AD09EEFAEFFB1209217406120F +:105AE0001FF2800279017F060221237B001205DF6D +:105AF0008A088B09AE08AF092290031CE0F8A312B4 +:105B0000DC2BA3A3A32274F7122051E9FE12DE516D +:105B1000601EEE700C12DC267401F0F9120933E9F4 +:105B2000FEEE60087A007B00F9120711790180020D +:105B3000790002D98674EC122051890A12DE4D7068 +:105B40000302DC0912DC26E06401600302DBDF12E1 +:105B5000071DE9604A7A0112DC10C3EA9442EB9413 +:105B600000402B908F7E1222777A027B0090032BCD +:105B7000E0F912118B7404121FF2E50C24C4F8E54D +:105B80000D34FFF9900329E8F0A3E9F08036908FF7 +:105B90006E7810121EAC780C7910121CE980057A10 +:105BA0000012DC10E50C450D450E450F6016780C13 +:105BB0001222607A027B0090032BE0F912118574A7 +:105BC00004121FF212DC207402F0900305E0700B47 +:105BD000EEFAEFFBA90A120711802AE4F080269062 +:105BE0000305E070207A037B001210E3EA4B601299 +:105BF0008A828B8374D0F0A3E50A12DC71740412DC +:105C0000DDB41207177901800279007F0C0221238D +:105C10007B001205DF8A0C8B0DE4F50EF50F22F0E8 +:105C200090031CE0F8A312DC2BA322E0F58388820A +:105C30002274F6122051E9FEEAFF900E7AE0F46039 +:105C40002B7A047B001210E3EA4B60208A828B835C +:105C500074D0F0EFA312DC717402F0EE8A828B83B1 +:105C6000A3A3A3F0900E7AE0F91210EF7F020221B5 +:105C700023F08A828B83A3A32274F4122051E9FEBD +:105C800074016E707D90032912DE54600690030546 +:105C9000E0600E12DE51607D12DE46F91206E180F0 +:105CA00074900329C3E0943CA3E09400400E900359 +:105CB00029E024C4F0A3E034FFF0805912DD1FE096 +:105CC000F508A3E0F509E50875F0E8A4C508A8F013 +:105CD00075F003A428F875F0E8E509A428F509E4AF +:105CE000F50AF50B78081222607A027B0090032BEC +:105CF000E0F91211857404121FF2900329E4F0A355 +:105D000080B712DE51600E900301E0A2E25006124D +:105D1000DD17120717801812DD1FE4F0A3F0227AB6 +:105D2000027B0090032BE0F9121191900329227F4E +:105D3000040221233400F988828983E022E0F8A359 +:105D4000E0F9223400FB1210BF7402227A207B009B +:105D500012114F900327EAF0A3EBF0227A207B0088 +:105D600012114F900325EAF0A3EBF02212DD70220E +:105D7000E0F8A3E0F5838882E0F92274F412205160 +:105D800012DE4B602C7A057B001210E3EA4B601A9E +:105D90008A828B8374D0F0A3E50812DC717403123D +:105DA000DC71A3EEF0A3EF12DDB4E5086003120787 +:105DB0001702DD2FF090031C12DD701210EF22C0CD +:105DC00082C08312DE51600D90031C12DDD8900357 +:105DD0001CE4F0A3F002D90512DDDC22E0FAA3E016 +:105DE000FB1211552274F612205174FF121FDC9021 +:105DF000032512DE546040900325E02401F508A33A +:105E0000E03400F509780812226490032512DE437D +:105E1000FC7402122045AA82AB83790112065774E2 +:105E200002121FF28A828B83E58245836009E0A219 +:105E3000E050047901800279007401121FF202DC43 +:105E40006CA3A3E0F8A312DC2BE0228908EAFEEBA6 +:105E5000FF90031C12DD3DE8492274F01220518AA4 +:105E60000C8B0D8C0E8D0F7E007ADF7B11120AA732 +:105E7000E9F8850C08850D09E5085420601D7508B2 +:105E8000E875098E78081222647C107D007A817B87 +:105E90000F12084F7402121FF2E9FEEEF97F08029A +:105EA000212374F0122051890A8A09ECFEEDFF7556 +:105EB0000800E50A24F4601214607314700302DF12 +:105EC0009314700302DFBB02E01474146509705868 +:105ED000750C14750D00780C122264EEFCEFFD7A3F +:105EE000FA7B071210BF7402121FF28A0E8B0F8505 +:105EF0000E0C850F0D750BFF780B122268750E10B6 +:105F0000750F00780E122264750E81750F0F780ED2 +:105F100012226479007CFA7D077A0E7B081208E56C +:105F20007405121FF2E9800375081802E017741057 +:105F300065097059750C10750D00780C122264EE0D +:105F4000FCEFFD7A1A7B081210BF7402121FF28A4E +:105F50000E8B0F850E0C850F0D750BFF780B122223 +:105F600068750E10750F00780E122264750E81751B +:105F70000F0F780E12226479007C1A7D087A2A7B32 +:105F8000081208E57405121FF2E902E017750818F7 +:105F900002E01774066509701D85090C750D0078FF +:105FA0000C122264EEFCEFFD7A367B081210BF74EF +:105FB00002121FF28061750818805C740365097015 +:105FC0004E85090C750D00780C122264EEFCEFFD75 +:105FD0007A487B081210BF7402121FF2750BFF780B +:105FE0000B122268750C10750D00780C1222647566 +:105FF0000C81750D0F780C12226479007C487D08A5 +:106000007A4B7B081208E57405121FF2E9800875C7 +:1060100008188003750802A9087F0802212374F478 +:106020001220518909EAFEEBFF750800E50924F406 +:10603000600C14603014605414607802E0D0750A6B +:1060400014750B00780A1222647CFA7D07EEFAEFD1 +:10605000FB1210BF7402121FF28A0A8B0B850A8290 +:10606000850B83806E750A10750B00780A12226406 +:106070007C1A7D08EEFAEFFB1210BF7402121FF2B9 +:106080008A0A8B0B850A82850B838047750A067501 +:106090000B00780A1222647C367D08EEFAEFFB12C0 +:1060A00010BF7402121FF28A0A8B0B850A82850BBD +:1060B000838020750A03750B00780A1222647C48DD +:1060C0007D08EEFAEFFB1210BF7402121FF280037C +:1060D000750802A9087F0402212374EC1220517470 +:1060E000FE121FDC8A108B11ECFEEDFF890B74167B +:1060F000122045E0F50CA3E0F50D7418122045E0E0 +:10610000F508A3E0F509741A122045E0F50EA3E0A6 +:10611000F50F750A008E828F83A3A3A3E0A2E4503B +:1061200005790802E264E50E450F6005790B02E28D +:1061300064851882851983AC82AD83EEFAEFFB1279 +:106140001419E96401700E8508828509837400F0D2 +:10615000790102E264851882851983E0F512A3E0D3 +:10616000F51378121222EE0000040086747DE19D82 +:1061700075B9E1AC76F4E1AD7625E256E2850882A8 +:106180008509837414F075121475130078121222A5 +:10619000648E828F83A3A3A3A3A3A3E0FCA3E0FD4B +:1061A000AA0CAB0D1210BF7402121FF28A128B13CD +:1061B00085128285138302E26285088285098374D1 +:1061C00010F075121075130078121222648E828FEF +:1061D00083A3A3A3A3A3A3E0FCA3E0FDAA0CAB0DA0 +:1061E0001210BF7402121FF28A128B13851282855D +:1061F0001383806E8508828509837406F075120604 +:1062000075130078121222648E828F83A3A3A3A336 +:10621000A3A3E0FCA3E0FDAA0CAB0D1210BF740217 +:10622000121FF2803D8508828509837403F0751280 +:106230000375130078121222648E828F83A3A3A3A6 +:10624000A3A3A3E0FCA3E0FDAA0CAB0D1210BF7446 +:1062500002121FF2800C8508828509837400F07594 +:106260000A0AA90A7402121FF27F0C02212374EC9D +:1062700012205174FE121FDC8A0E8B0FECFEEDFF14 +:1062800089087416122045E0F512A3E0F51374187E +:10629000122045E0F510A3E0F511750900750AFF1D +:1062A0008E828F83A3A3A3E0A2E55005790802E3C1 +:1062B000C2851882851983AC82AD83EEFAEFFB129A +:1062C0001419E964017005790102E3C28518828519 +:1062D0001983E0F50CA3E0F50D780C1222EE000016 +:1062E0000500022953E3867482E39D7582E3AC7650 +:1062F00082E3AD76F8E27FE3E5104511700B74039D +:106300006508600875090D800375090BE509707251 +:106310008E828F83A3A3A3A3A3A3E0F50CA3E0F530 +:106320000D851282851383E0850C82850D83F07ABA +:10633000087B00790A121113E98E828F83A3A3A32D +:10634000A3A3A3E064487004A3E064087034750A52 +:106350000F802F750C01750D00780C1222647810D7 +:106360001222647812122264A908EEFCEFFDAA0E34 +:10637000AB0F1208DF7406121FF2E9F509800375EE +:10638000090A74FF650A60389007F8E0F8A3E0F99D +:10639000E849602C9007F8E0F8A3E0F5838882E0F4 +:1063A000F8A3E0F9E8496018A90A9007F8E0F8A313 +:1063B000E0F5838882E0F8A3E0F583888212204F1D +:1063C000A9097402121FF27F0C02212374F7122014 +:1063D00051EAFEEBFF890874FE6E700374FF6F6074 +:1063E000447401650860127402650870387901EE22 +:1063F000FAEFFB120AC5E9702C7C0E7D08EEFAEF6D +:10640000FB1208CD7C2A7D08EEFAEFFB1208CD7C4A +:106410003C7D08EEFAEFFB1208CD7C4B7D08EEFACE +:10642000EFFB1208CD7F01022123C082C08312142A +:106430009102E5EE74F7122051ECF8EDF9740912AF +:106440002045E0FCA3E0FD801988828983E08A82F0 +:106450008B8312E5C5A882A9838A828B83A3AA8233 +:10646000AB83ECFEEDFFEE24FF1CEF34FFFDEE4F9F +:1064700070D702E74E74F71220517409122045E0DC +:10648000FEA3E0FFEC2EF8ED3FF9E824FF18E93415 +:10649000FFF9801788828983E08A828B83F0E82461 +:1064A000FF18E934FFF9A3AA82AB83EEFCEFFDEC01 +:1064B00024FF1EED34FFFFEC4D70D902E74E74F25D +:1064C0001220518A088B098C0A8D0BAA0AAB0B1279 +:1064D000114F8A0C8B0DAE0CAF0DEE4F6011780A88 +:1064E000122264AC08AD091210BF7402121FF2EE42 +:1064F000FAEFFB7F0602212374F5122051ECF8ED30 +:10650000F9740B12204512E6F5AC08AD09EC24FF36 +:10651000F508ED34FFF509EC4D602CEAFCEBFD8C41 +:10652000828D83A3AA82AB83E8FEE9FF8E828F83EC +:10653000A3A882A9838C828D83E0FC8E828F83E066 +:106540006C60C67900800279017F0302212374F612 +:10655000122051E9FE8C088D0978081222648E08F9 +:10656000AC087D0012147F7402121FF202E753C0C0 +:1065700082C0831211AF807674F6122051EAFEEBCE +:10658000FFEE4F70067A007B008037EE2405FAEFAD +:106590003400FB12114F8A088B09A808A909E849A1 +:1065A00060E388828983E4F0A312E5C5A3EEF0A33B +:1065B000EF12E5C5A3A3A374FFF0E82405FAE934BC +:1065C00000FB02E753F088828983A322C082C08344 +:1065D000EA4B70047905801612E660600479048045 +:1065E0000DEA24FBFAEB34FFFB1211557900D0833E +:1065F000D08202012274F71220517C0002E74B7412 +:10660000F7122051E9FEECFFEA4B70047905804D4A +:10661000908FEBE0F8EEC39840071210E979038001 +:106620003C12E7F312E976700512E660600512107D +:10663000E980D9EEF074016F700DEAFCEBFD7ADBB6 +:106640007B07121107800BEAFCEBFD7ADB7B07125C +:1066500011017A007B80EEF9121113790002E74EE6 +:10666000EA24FFF582EB34FFF583E0F42274F212A2 +:106670002051890B750C00750D007E007F00A2AFC4 +:10668000E433F50AC2AF9007DB8015EE4F70068544 +:10669000080C85090DE50824FBF582E50912E7F9E8 +:1066A00012E6F5E50845096023E50824FFF582E5D3 +:1066B0000912E7F9E0650B70D2EE4F7006AE08AF35 +:1066C0000980D27A007B80121113800B7A007B80C4 +:1066D000121119EE4F6015780C122264EEFCEFFDDA +:1066E0007ADB7B0712110D7402121FF2E50AA2E099 +:1066F00092AF02E4EFE0F508A3E0F5092274F71287 +:106700002051A2AFE433FEC2AFEC24FBF582ED12C0 +:10671000E7F9E4F0A3F012E97270098A828B8380B2 +:106720000C12E80812E7398882898370F4ECF0A330 +:10673000EDF0EEA2E092AF8015E824FBF8E934FF1B +:10674000F98882898312E802EA4B221210F57F0150 +:106750000221237F0202212374F7122051E5A8FEB3 +:10676000C2AF8A828B8312E808EC24FBF582ED121B +:10677000E7F9E8F0A3E9F08A828B83ECF0A3EDF06F +:10678000EEA2E702E73574F5122051740B12204592 +:1067900012E808A2AFE433F50AC2AFEC24FBFEED29 +:1067A00034FFFF8A828B8312E6F5EC65087003EDF7 +:1067B00065098E828F83700D12E8088A828B83E8C8 +:1067C000F0A3E9801012E7FEE824FBF582E912E766 +:1067D000F9EAF0A3EBF08E828F83E4F0A3F0EC24CF +:1067E000FFF582ED12E7F974FFF0E50AA2E092AF3F +:1067F00002E549EA24FBF582EB34FFF5832212E837 +:106800000222E0FAA3E0FB22E0F8A3E0F92274F709 +:10681000122051E9FD908FEBE0F8EDC3985029E587 +:10682000A8FEC2AFEDC333F8E433F99007F5E028D2 +:10683000FCA3E0398C82F583E04AF0A3E04BF0EE54 +:10684000A2E792AF79008002790302E74E74F71253 +:106850002051E9FE908FEBE0F8EEC398501FE5A8B9 +:10686000FFC2AFEAF4FCEBF4FDEE12E95EE05CF08F +:10687000A3E05DF0EFA2E792AF7900800279030216 +:10688000E74EE9F874FF687006C2AF7900800279BC +:1068900007020122C082C0831211439007DBE4F09B +:1068A000A3F012116D12115B1211A312114979009C +:1068B00002E5EEC082C08312113180FB74F6122013 +:1068C0005175080012113D1212F3E50812E95E122B +:1068D000E976700D0508908FEBE0F8E508C3984065 +:1068E000E9908FEBE0F8E508C3985066E5A8FCC294 +:1068F000AFE508C333FEE433FF9007F5E02EF8A3BD +:10690000E03FF98882898312E7FE88828983E4F078 +:10691000A3F0ECA2E792AFE508900F2CF0F97467B2 +:106920002EF582748E3FF58312E95512204F900F99 +:106930002C74FFF0E5A8F9C2AF9007F5E02EF8A39C +:10694000E03F8882F583E04AF0A3E04BF0E9A2E75C +:1069500092AF02E753E0F8A3E0F583888222C333C5 +:10696000F8E433F99007F5E028FAA3E0398A82F5D4 +:1069700083228A828B83E0F8A3E0F9E8492274F647 +:10698000122051E9FDEA4B70047900801C780080E8 +:10699000118808EA2508F582EB3400F583E06D7074 +:1069A000E808E8C39C40EA790102E75374F2122038 +:1069B000518A09ECFEEDFF750800E9602714605963 +:1069C00014606E14700302EA7214700302EA8914F0 +:1069D000606F14700302EA9E14700302EAB9146037 +:1069E0007202EAD7EAC3941650297C167D0079001A +:1069F0007A327B031210D785090C750D00780C12C2 +:106A00002264EEFCEFFD7A327B0312ED16121FF2C8 +:106A100002EADA75081802EADA7402650970F48E7F +:106A2000828F8312ED0F900348E8F0A3E9F002EAA9 +:106A3000DA7401650970DC8E828F83E090034A80EE +:106A4000EC7401650970CC8E828F83E0900E84F027 +:106A500002EADA7401650970BA8E828F83E0F9A2C6 +:106A6000E140B0900EBD12ECF37AC27B0E12075FCC +:106A7000806874066509709B750C06750D00780CAE +:106A80001222647A4B7B0380817408650970848EBE +:106A9000828F837C877D0E7408121EEF803C740108 +:106AA0006509600302EA13900E9D12ECF37AA27B53 +:106AB0000E8E828F83E0F980B47401650960030251 +:106AC000EA13900EAD12ECF37AB27B0E8E828F83B6 +:106AD000E0F912075F8003750802A9087F0602210A +:106AE0002374F41220517900EAA2E0501B7508CA01 +:106AF00075098E78081222647C0B7D007A8F7B0EDC +:106B000012084F7402121FF27F04022123D083D097 +:106B100082020122C082C083E9A2E18A828B83E0E3 +:106B20005004D2E18002C2E1F0E9A2E3E05004D2D5 +:106B3000E38002C2E3F0E9A2E5E05004D2E580027E +:106B4000C2E5F0742A5960098C828D83E0440C8080 +:106B50000AE970088C828D83E054F3F080AF74EE04 +:106B6000122051890E7412122045E0FEA3E0FF743A +:106B700014122045E0F50AA3E0F50B741612204527 +:106B800012ED0F750900E8496005790B02ECDA8C0B +:106B9000828D83E06402600302ECCD12ED0E8E82E2 +:106BA0008F83A3AA82AB83EC2406F50CED3400F5A9 +:106BB0000D88828983E0FCA3E0F9EC2400F510E461 +:106BC00039F51178101222A8002A04CDECD7EB1465 +:106BD000EC3CEC32EC4DEC850C82850D8312EEAA78 +:106BE000F508E50EC395085003850E08850A8285D1 +:106BF0000B83E508F0F50A750B00780A122264850C +:106C00000C82850D8312ECF3EEFAEF12ED15121FD4 +:106C1000F202ECD812ECFF12ED0F850A82850B838D +:106C20007402F0E88E828F83F0E98A828B83F0020F +:106C3000ECD8850A82850B83740680B8850A828524 +:106C40000B837401F012ECFF12ECDF80E1850C8203 +:106C5000850D8312EEB7850A82850B83606B7408FD +:106C6000F08882898312ECDFF088828983A3E08A2E +:106C7000828B83F0E82402FAE93400FB8A828B835A +:106C800012ECDFA3A3F08A828B83A312ECDFA3A311 +:106C9000A3F0E824040A0AE93400FB8A828B8312F9 +:106CA000ECE5F08A828B83A312ECE5A3F0E82406DE +:106CB000F8E93400F98882898312ECF9F088828936 +:106CC00083A312ECF9A302EC2EE402EC2E850A82D7 +:106CD000850B83E4F0750901A9097F0A022123E0ED +:106CE0008E828F832212ECE922E08E828F83A3A30F +:106CF000A3A322E0FCA3E0FD2212ECE9A3A32285DA +:106D00000C82850D83E0F8A3E0F583888222A3E05E +:106D1000F8A3E0F922FB1210BF74022274EE1220D5 +:106D200051890F7412122045E0F50CA3E0F50D74A3 +:106D300014122045E0FEA3E0FF750E008C828D83C7 +:106D4000E06402600302EE9712ED0E88828983EC04 +:106D50002406F50AED3400F50B12EEA5F9EA24003D +:106D6000F508E439F50978081222A8002A0397EEFD +:106D700078EDF7ED5DEE2BEE850A82850B8312EE42 +:106D8000AAC39EE49F4024850F828582107511005E +:106D9000EE2510F508EF3400F509C3E5089416E573 +:106DA000099400400C750E0D02EE9A750E0702EE66 +:106DB0009A7810122264AC0CAD0D850A82850B8383 +:106DC000E02EFAA3E03F12ED15121FF2850A82852C +:106DD0000B83E02508F8A3E035098882F583E412E7 +:106DE000EEB3700302EE9A12EEBF700302EE9A79D0 +:106DF0000012204F02EE9AEE4F702B7402650F7056 +:106E0000A4850C82850D8312EEA5F9EAF812EE9F97 +:106E1000F5838A82E8F0A3E912EEB3607D12EEBF3B +:106E20006078790180CB750E0B806F90034AE0701B +:106E300005750E038064EE4F70EC7406650F6003F9 +:106E400002EDA57508067509007808122264AC0CDD +:106E5000AD0D12EE9F12ED15121FF2803D900E84C3 +:106E6000E0A2E350CCEE4F70BD7401650F600302E9 +:106E7000EDA5850C82850D83E0F8600A74016860D9 +:106E800005750E808014E8C0E0850A82850B8312A8 +:106E9000ED05D0E0F08003750E01A90E02ECDA8555 +:106EA0000A82850B83E0FAA3E02212EEA5FB121002 +:106EB000B9EA22F0900330E0F8A3E0F9E84922E0D3 +:106EC000F5838882E0F8A3E0F988828983E582452A +:106ED0008322C082C083120E13120E19120E1F12CB +:106EE0000E0D02F25EC082C0839061B1E0C2E0F09C +:106EF000E0D2E0F0906188E0640470F802F25EC0D5 +:106F000082C0839061B1E0C2E0F09061F3E4F09060 +:106F100061F2F0F8F912EF5F9061F012EF9A94FECF +:106F2000E9940D40F002F25EC082C0839061F3E408 +:106F3000F09061F2F0F8F99061F0E0FA12EF5F6A18 +:106F4000700A12EF9F94FEE9940D40EB74FE687096 +:106F500003740D69700479008002790102F25E7495 +:106F60000028F582748039F583E022C082C08390C6 +:106F700061C0E0FAE4F0F8F9E82400F582E9346051 +:106F8000F583E412EF9A9480E9940140EBEA906172 +:106F9000C0F090618A740102F259F012EF9F22E86A +:106FA000240108E93400F9C3E822C082C0838A8240 +:106FB0008B83E090601612F1FDA3E090601712F051 +:106FC0002690601812F02F90601912F03490601A19 +:106FD00012F03990601BF0E99060157005E0C2E096 +:106FE0008003E0D2E002F25DC082C0838A828B839C +:106FF000E090601C12F1FDA3E090601D12F026905D +:10700000601E12F02F90601F12F03490602012F07A +:1070100039906021F0E99060157005E0C2E18003CD +:10702000E0D2E102F25DF08A828B83A3A3E0221218 +:10703000F044E02212F03FE02212F03FA3E02212DF +:10704000F044A322F08A828B83A3A3A32274F012BC +:107050002051EA906005F0EBA3F0ECA3F07F08026A +:107060002123C082C083906001E002F0F3C082C09F +:107070008374075990600102F25DC082C08374017D +:10708000699060037005E0D2E08003E0C2E002F2A4 +:107090005DC082C083906003E054F94902F25DC094 +:1070A00082C083906061E002F0F3C082C083906090 +:1070B00008740B02F25D74F01220519061947420F8 +:1070C000F0EAA312F25002F05BC082C083E9906044 +:1070D0000402F25DC082C0839007CBE4F09060228E +:1070E000F0A3F0A37830F0A3D8FC02F25EF07F02A8 +:1070F000022123F902F25E74F4122051EAFEEBFF42 +:1071000089088C099007CBE0640870047903807EBD +:10711000120EC7E9F46004790080737900750A01E2 +:10712000750B00E9780A121FC9AC0A906022E05C76 +:107130007053E04C12F193FA74603BFB78068E8238 +:107140008F8312F21F8E828F83A3AE82AF838A82D7 +:107150008B83A3AA82AB8318E870E3E508700AEC7E +:10716000F4F8906023E0588005906023E04CF090A4 +:1071700007CBE004F0740165097005120E79809761 +:10718000120E7F809209E9C39408409179017F042F +:10719000022123F0E975F006A4FAABF074242A2248 +:1071A000C082C083906014E054FCF0E04902F25DBC +:1071B00074F6122051750801750900E97808121F4C +:1071C000C9906009E0450802F0ED74F6122051758F +:1071D0000801750900E97808121FC9E508F4F8905C +:1071E0006009E05802F0EDC082C083906009E402BB +:1071F000F25D3400F583E0229061C07401F08A8270 +:107200008B8322C082C0837A007B60E970027A336C +:1072100012F1F8E4F0A3F0A3F09061C002F25D1265 +:10722000F2232212F2DEF022C082C083E9906002D3 +:10723000802BC082C083E99060027005E0D2E380B9 +:1072400003E0C2E38017C082C083E99061C6800D6D +:10725000F0EBA3F0ECA3F0ED22F0A3F0A3F0D083C9 +:10726000D082020122C082C083E9601714601C141E +:10727000602114602614602B146030146036146092 +:107280003C80419061E9E054FC80389061E9E0D2B3 +:10729000E080309061E9E0C2E080289061E9E0D2CE +:1072A000E180209061E9E0C2E180189061E9E0C2EC +:1072B000E1F080DA9061E9E0C2E0F080E19061E91C +:1072C000E04403F0809875E19302012275E18302A6 +:1072D000012275E18502012275E182020122E08A24 +:1072E000828B8322C082C083E9C3332417906184D8 +:1072F000F074016A70079061A6740A8017E9C3945C +:1073000014E0500904F09061A67425800714F090F1 +:1073100061A6740F02F25D74F5122051890A79009A +:10732000750801750900E97808121FC9906022E00C +:1073300055086052E975F006A4FCADF074242CFCED +:1073400074603DFD750800850882AE82EC2EF582E2 +:10735000ED12F1F2F8EA2EF582EB12F1F268700903 +:107360000508E508C3940640DE74066508701790AA +:107370006023E0F508750900E97808121FAAE508FE +:107380005401650A600909E9C39408409379FF7FB5 +:1073900003022123C082C083C3EA9426EB940050E9 +:1073A0001674FF6C700374FF6D600C12F3D8ECF070 +:1073B000A3EDF079008002790202F591C082C083CA +:1073C000C3EA9426EB9400500812F3D812F4838099 +:1073D000047AFF7BFF02F591EAC333FAEB33FB74C7 +:1073E0002E2AF582740E3BF5832274F7122051E9A0 +:1073F000FEEAFF7C107D0079007A067B031210D72D +:10740000EE900E2DF0EF900301F0120909E99003C0 +:107410000670057401F08004E4F079127F01022106 +:107420002374F7122051EAFEEBFFECFAEDFB74092E +:1074300012204512F65590030BE8F0A3E9F09003F3 +:1074400009EAF0A3EBF0900307EEF0A3EFF07C1055 +:107450007900121137E9640170087910900309125C +:10746000F47C7C107900EEFAEFFB121137E964012D +:107470007008791090030712F47C80A012F4831234 +:107480000F0F22E0FAA3E0FB2274F6122051E9FF6D +:107490007E00701CEA4B60187508068E0978081289 +:1074A0002264EAFCEBFD7A0D7B0312F82D121FF229 +:1074B000900306E0640170130EEF70087402F0127E +:1074C00009158007E4F0EFF912063FEEF97F02029A +:1074D000212374F71220517E00EA4B603B8A828B95 +:1074E00083E0701212F654900313E8F0A3E912F847 +:1074F00033E0900315F0900306E06402701A0E8AE0 +:10750000828B83E0900306700474038001E4F08AA8 +:10751000828B83E0F912063FEEF902F41C74F61236 +:107520002051900302E0602E750806750900780866 +:10753000122264EAFCEBFD7A167B0312F82D121F6F +:10754000F27A167B03900302E0F91206037A167BA7 +:107550000312091B8002790002F4CDC082C083E9C6 +:10756000F87900EA4B6025E86022EA2405F582EB11 +:107570003400F5837401687005E044C0800CE05469 +:107580003FF07403687004E0D2E6F009800312F45F +:1075900083D083D082020122C082C083EA4B602460 +:1075A000E960218A828B83A3A3A3A3A3E054C0F83C +:1075B00074C06870047901800B74406870047903AA +:1075C0008002790280CB74F41220518908900E2D2C +:1075D000E0F4603A7A0A12F815603312F65B740828 +:1075E000F0900302E08E828F83A3A3A3F0750A06B6 +:1075F000750B00780A1222647C167D0312F825129E +:107600001FF2EEFAEFFB900E2DE0F91210EF90034F +:1076100005E06401703990032C12F655E8496018B2 +:10762000E0F5838882A3A3A312F65488828983E5B8 +:10763000824583600312204F908F7E1222777A0456 +:107640007B0090032BE0F912118B7404121FF27F60 +:1076500004022123A3E0F8A3E0F9228E828F837431 +:10766000D0F0A3E508F08E828F83A3A322C082C04E +:107670008390030902F58EC082C08312F6AB121EFE +:10768000CA02F59174F4122051908F767808121E78 +:10769000AC12F6AB7808121E4B900E2DE0F4600988 +:1076A0007A007B40E0F912111380A490030BE0F8FC +:1076B000A3E0F58388822274EE1220517412122006 +:1076C00045780C121EAC120AB98A088B09EA4509E2 +:1076D000700302F774EA241DF8EB3400F9E8FEE9C0 +:1076E000FF8E828F83780C121EBB7A257B001205D9 +:1076F000DFEAF50A7009850882850983E0F50A8EBC +:10770000828F83780C121EAC850882850983A3A31F +:10771000A3A3E0F50B7A0E7B001210E38A108B1105 +:10772000AE10AF11EE4F604C8E828F8374D0F0A3F9 +:10773000E412F665740912F665A3E50BF075100600 +:107740007511007810122264E5082405FCE509345F +:1077500000FD12F825121FF28E828F83A3A3A3A32C +:10776000A3A3A3A3A3A3780C121EBBEEFAEFFBA95D +:107770000A1210EF7F0A022123C082C08390030205 +:10778000E0F902F591C082C0837A0D7B03E9700AAB +:10779000900302E060047A167B0302F591C082C078 +:1077A0008390030702F58E74F41220518908900E1D +:1077B0002DE0F4605D7A0C12F815605612F65BE469 +:1077C000F0750A06F50B780A1222647C0D7D03EE33 +:1077D00024030A0A0A12F829121FF290031312F660 +:1077E000558E828F83A3A3A3A3A3A3A3A3A3E8F08F +:1077F000A3E9F0900315E0C0E0EE240BF582EF342E +:1078000000F583D0E0F0EEFAEFFB900E2DE0F912D8 +:1078100010EF02F64F7B001210E38A0A8B0BAE0AC0 +:10782000AF0BEE4F22EE2404FAEF3400FB1210BF30 +:10783000740222F08A828B83A3A3A32274F61220FF +:107840005174FF121FDC43F10243F4C075F88075D8 +:10785000FB8053FF3F43FF4075D6889009AF74709B +:10786000F0A374F9F09009B3E0541FF09009B574D7 +:10787000D0F0A3E0540F4410F074099009B1F0A3C4 +:1078800074C1F09009B4742CF09009B37401F090B5 +:1078900009B67412F09070F9E0851882851983F0AA +:1078A00053D1F775D6087508587509027808122261 +:1078B00064E5FAF4FC7D007AC17B0912147F74023E +:1078C000121FF27401121FF28004EEFAEFFB7F0226 +:1078D000022123C082C083EA241BF582EB3400F529 +:1078E0008312FB5A900C52E8F0A3E9F08A828B8352 +:1078F000A3E0F87407686014740868600F74036884 +:10790000600A7404686005740A68700575FAD880A6 +:107910000375FA3BE0602614602814602A1460277F +:1079200024FE600F14601114601314601524FE60AF +:1079300020801975FC06801C75FC07801775FC08F3 +:10794000801275FC09800D75FC0A800875FC0B809F +:107950000375FC0C8A828B83A3A3E0600875FB424D +:1079600043F410800375FB0275F8C0E5FBA2E650F6 +:1079700005C29543FE20D2EAD083D0820201227450 +:10798000F61220517E007F00803888828983E08A49 +:10799000828B83F0A3AA82AB83E5FAF4F50912F98E +:1079A000F2F582740939F583E4F0A3E509F012FBDE +:1079B000604007900C19E4F0A3F0EE24010EEF34C0 +:1079C00000FFC3EE9CEF9D501212F9F2F8740939D2 +:1079D000F988828983A3E065FA60AFE5FBA2E650EF +:1079E0000E121335C3EA942BEB94015002C2950298 +:1079F000F8CA900C1912F9F922E0F8A3E0F9E8C3EB +:107A000033F8E933F974C1282274F7122051900C2D +:107A100050E0FF8F82A882900C4FE0FEEFC39EE003 +:107A20005018C398F895E0F9E824FF18E934FFF9F5 +:107A3000E849701B780079008029C398F895E0F92F +:107A4000E82431F8E93400F9C3E89CE99D50E57A6F +:107A5000007B00804DE004F0439A08E8240108E927 +:107A60003400F9C3E89CE99D50348A828B83E0C0DE +:107A7000E0900C50E0FE741D2EF582740C3400F57D +:107A800083D0E0F08A828B83A3AA82AB83900C51CF +:107A9000E4F0900C50E0C3943140BAE480B9ECFAC1 +:107AA000EDFB02FC9E74F61220517E00900C191220 +:107AB000FB7C604F900C5412FB7C702D12FB6040DD +:107AC00007900C19E4F0A3F0900C19E0FAA3E0FB86 +:107AD000EAF8EBF912FC5670E3900C54EAF0A3EBD1 +:107AE000F0900C1BEAF0A3EBF0900C5412FB729098 +:107AF0000C54C3E0942CA3E094014007900C54E490 +:107B0000F0A3F01213358A088B09A808A909E849DF +:107B100060217E04C3E8941CE9940140030E8013A5 +:107B2000C3E8942BE99401400A0E0EE5FBA2E6504F +:107B300002D295900C51E06006E4F0EED2E4FEEE45 +:107B40006015A312FB5A88828983E582458360070A +:107B5000EEFA790112204F02F8CEE0F8A3E0F92204 +:107B6000900C1912FB72900C19C3E0942CA3E094B2 +:107B70000122E02401F0A3E03400F02212F9F9F52B +:107B800082740939F583A3E065FA2274F612205154 +:107B9000900C1B12FB5A900C19E0FCA3E0FDE8FAD4 +:107BA000E9FBEAC333FAEB33FB74C12AF5827409AB +:107BB0003BF583A3E065FA701DE8240108E9340071 +:107BC000F9C3E8942CE99401400478007900EC684A +:107BD0007002ED6970C8900C1BE8F0A3E9F0E8C3EF +:107BE0009CFEE99DFFEE4F705912FC567065ECFA51 +:107BF000EDFBEA24FFF8EB34FFF9EA4B7004782B35 +:107C0000790112FC5670357508587509027808120A +:107C10002264E5FAF4FC7D007AC17B0912147F74BA +:107C200002121FF2900C1912FB5A900C54E8F0A3A8 +:107C3000E9F0900C1BE8F0A3E9F080177E017F00CB +:107C40008011C3EE942DEF94014008EE242CFEEF3A +:107C50003401FF02F8CAE8C333F8E933F974C128E4 +:107C6000F582740939F583A3E065FA22C082C083E6 +:107C700012131702F97874F7122051E9FE74016E9D +:107C8000700312131D7900801574F7122051E9FE5C +:107C900074016E700512132380047A007B007F014B +:107CA00002212374F7122051E9FE74016E7005124F +:107CB000132980047A007B0080E4C082C083121301 +:107CC0002F02F97874F7122051E9FE74016E7005E5 +:107CD00012133580047A007B0080C302012274F401 +:107CE0001220518A087E007C677D097AFF7BFF1293 +:107CF00008CD7C7A7D097AFF7BFF1208CD7AC37BA1 +:107D000012120AA7E508A2E0501D7508EE75098E4B +:107D100078081222647C0B7D007AD67B1012084F03 +:107D20007402121FF2E9FEEEF97F0402212374F4BB +:107D3000122051EAFF7E00E9600F146027147003DF +:107D400002FDEC14606602FE0874046F7011750A7F +:107D5000048E0B780A1222647ACF7B1002FE027E18 +:107D60001802FE0874116F70F6750A118E0B780AEE +:107D70001222647A567B0912FE0B121FF27509FF5C +:107D80007809122268750A0B780A122264750AD6DD +:107D9000750B10780A12226479007C567D097A6787 +:107DA0007B091208E57405121FF2805C74076F707E +:107DB000AE750A078E0B780A1222647A737B091259 +:107DC000FE0B121FF27509FF7809122268750A0B63 +:107DD000780A122264750AD6750B10780A1222648A +:107DE00079007C737D097A7A7B0980B674106F60A4 +:107DF0000302FD5F750A108E0B780A1222647A86E0 +:107E00007B0912FE0B121FF202FD271210BF740233 +:107E10002274F4122051740C122045E0FAA3E0FB06 +:107E2000740E122045E0F8A3E0F9E8FEE9FF7508BA +:107E3000008C828D83A3A3A3E0A2E45005790802FD +:107E4000FED38C828D83E06402707D12FF36EC24B9 +:107E500006F8ED3400F9E8FCE9FDE0F50AA3E0F9E5 +:107E6000E50A2400E439F50B780A1222EE0000043A +:107E700000082AADFE672AA5FE692AB5FE6A2A8394 +:107E8000FEBDFE8E828F837404F0F50A750B0078B8 +:107E90000A1222648C828D83E0FCA3E0FD12FE0BAB +:107EA000121FF2802C8E828F83741180DC8E828F61 +:107EB00083740780D48E828F83741080CC8E828FDF +:107EC00083E4F075080A80098E828F83E4F07508D8 +:107ED00001A90802FD2974F2122051E9FE740E1264 +:107EE0002045E0F50AA3E0F50B7410122045E0F5FB +:107EF00008A3E0F5098C828D8312FF36E0F50CA310 +:107F0000E0F9A80C74026870037429697021750C7B +:107F100001750D00780C1222647808122264780A28 +:107F2000122264EEF91208DF7406121FF280027941 +:107F30000A7F06022123A3E0F8A3E0F9888289835F +:107F40002274F7122051EAFEEBFF890874FE6E706E +:107F50000374FF6F602A74016508600E740265087F +:107F6000701E7901120AC5E970167C677D09EEFA68 +:107F7000EFFB1208CD7C7A7D09EEFAEFFB1208CDFB +:107F80007F01022123C082C083E99009BFF0D08322 +:107F9000D082020122C082C0831212C91212DB12E7 +:107FA00012D512133B80E774F6122051EAFEEBFF64 +:107FB0005480601980031210E99009BFE0F9121093 +:107FC000FBEA4B70F1EEFAEF6480FB8019EE54206F +:107FD0006006EE6420FA800EEE54106005EE641028 +:107FE00080F37A007B007F02022123C082C08312CB +:0A7FF0001353809A020122020122BD +:10800000C082C08312136502837E74F512205174FE +:10801000FC121FDC851882851983EAF0A3EBF08936 +:108020000AECFEEDFF740F122045E0F508A3E0F521 +:108030000990039EE064017005790C0280CB8518DD +:1080400082851983E0FA120B5BE960277402122023 +:10805000457401F0A3E4F07402122045AC82AD83B4 +:10806000851882851983AA82AB83790112099F79C9 +:10807000028058EE4F602FE5084509602985188277 +:10808000851983A3E0701F7808122264EEFCEFFDCF +:10809000A90A7402122045E0FAA3E0FB12096F74EA +:1080A00002121FF2802574021220457401F0A3E42D +:1080B000F07402122045AC82AD8385188285198345 +:1080C000AA82AB83790112099F79127404121FF2FC +:1080D0007F0302212374F7122051120B2B7A067BA7 +:1080E000041209B179000283917900740902837B3B +:1080F000C082C08374F9121FDC7401122045AA8269 +:10810000AB83120AF512828879077A097B101282F2 +:1081100082740702837B74F712205174FC121FDCF7 +:10812000EAFEEBFF7403122045AC82AD83120B25EF +:10813000E9851882851983F07401122045EEF074E8 +:108140000212204512814E7A057B1402836EEF12D3 +:1081500082C27904227B20028378C082C08374FCAF +:10816000121FDC851882851983E4F00412204574FF +:108170001BF07402122045E4F074031220457404CD +:108180001282BEF97A027B201209A57900740402DA +:10819000837BC082C08374FF121FDCEA4B600C1229 +:1081A0000AFBE9851882851983800885188285195C +:1081B00083741212827A7A0502815574F412205166 +:1081C00074FF121FDCE9FE740D122045E0F9740EF5 +:1081D000122045E0FF740F122045E0F508A3E0F5FA +:1081E000097411122045E0F50A7412122045E0F5D9 +:1081F0000B780B122268780A12226878081222641F +:10820000EFF5087808122268E9F508780812226864 +:10821000EEF9120B377406121FF21282737A067B84 +:108220002012822C121FF27F040221231209A57949 +:108230000074012274F712205174FF121FDC120B1C +:108240003D1282737A0802838574F712205174FFFD +:10825000121FDC120B491282737A0902838574F7AC +:1082600012205174FF121FDC120B431282737A0A20 +:10827000028385E9851882851983F0AC82AD837904 +:1082800001221209A5790022E9851882851983F057 +:10829000AC82AD8322C082C08374FF121FDC120B3C +:1082A000011282737A1002815574F712205174FF03 +:1082B000121FDC120B071282737A1102838512825D +:1082C000C2221282C622F0851882851983AC82AD43 +:1082D0008322121FF27F02022123C082C08374F71F +:1082E000121FDC79087401122045AA82AB83120B9D +:1082F00013E9851882851983F0640D6014E0AC825F +:10830000AD8370047909800279017A187B20120903 +:10831000A50280E974F712205174FD121FDCEAFEF9 +:10832000EBFF120B4FE9851882851983F074011257 +:108330002045EEF07402122045EF1283AC0283A0B8 +:1083400074F712205174FD121FDCEAFEEBFF120BD2 +:1083500055E9851882851983F07401122045EEF0E5 +:108360007402122045EF1283967A1B0283A0120931 +:10837000A57900740402838E12822C121FF2D0831E +:10838000D0820201227B201209A579007401121FFC +:10839000F27F0102212312839A221282C6790322DC +:1083A0007B201209A57900740302838E12839A7AC6 +:1083B0001A22740302837B74F612205174F7121F81 +:1083C000DC851882851983E4F0750808F5097808BA +:1083D000122264EAFCEBFD7403122045AA82AB83EF +:1083E0001210BF7402121FF2851882851983AC82A5 +:1083F000AD8379097A187B201209A574090282D20B +:10840000C082C08374FD121FDC851882851983E445 +:10841000F0041220457404F07402122045E4128323 +:1084200096FA7BFC1209AB0283B2C082C08374FD52 +:10843000121FDC8518828519837401F0122045749F +:1084400004F07402122045E41283967A0180D3C0AE +:1084500082C08374FD121FDC85188285198374160F +:10846000F074011220457404F07402122045E412E5 +:1084700083967A1602842274F6122051E99003CE74 +:10848000F07A00EA75F003A4F8A9F074CF28F58219 +:10849000740339F583E4F0A3F00AEAC3940440E3DB +:1084A0007A008A0875090074037808121FC974DB02 +:1084B0002508F874033509F988828983A3E4F0A3B9 +:1084C000F088828983F0A3A3A3A3A3A3A374FFF0DE +:1084D0000AEAC3940340CB9003CEE0F91210AD7FBB +:1084E0000202212374F41220518A088B09EB548074 +:1084F00060349003CEE0F91210FB8A0A8B0BA80AB5 +:10850000A90BE8FEE9FFE84960138E828F83E064DF +:10851000907003120A17EEFAEFFB1210E9AA08E5B1 +:10852000096480FB80047A007B007F0402212374AD +:10853000F712205174FA121FDCEAFEEBFFEEFCEF9B +:10854000FD851882851983AA82AB83120A47E9FA4E +:1085500074021220451288C54970030285FE8E827E +:108560008F83A3A3E0FAA3E0FB851882851983E03B +:1085700064057002A3E08518828519837009AC82B6 +:10858000AD83120A1D807CE064047002A3E0601ECB +:10859000851882851983E064067002A3E0600F8568 +:1085A0001882851983E064077002A3E0705585186E +:1085B000828519831288C575F003A4F8ACF075F0B4 +:1085C00003E9A42CF974CF28F8740339F9E824F4EA +:1085D000F582E934FFF583E0FCA3E0FDEC4D602378 +:1085E000851882851983AC82AD83E824F6F582E98B +:1085F00034FFF583E0F9120A6BE97007801C7401FF +:108600006A70178E828F83A3A3A3A3A3A3A3E0FA08 +:10861000A3E0FBEA4B600312136B7406121FF27F98 +:108620000102212374F412205174F6121FDC8A0A0D +:108630008B0BEC2404FEED3400FF8E828F83C3E0AD +:108640009404A3E0940050030286D4EC2402F508BD +:10865000ED3400F509850882F583E0FCA3E0FD8593 +:108660001882851983AA82AB83120A2F7402122002 +:1086700045E0F8A3E0F9C3E89418E9940050728E3D +:10868000828F83E82404F8E93400F9E0687003A3DA +:10869000E0697039850882850983E02404F508A320 +:1086A000E03400F509851882851983E0A2E0780896 +:1086B000502A1222647402122045AC82AD83AA0AA9 +:1086C000AB0B120A237402121FF2E96007AA0AAB6D +:1086D0000B120A95740A121FF202852A1222647480 +:1086E00002122045AC82AD83AA0AAB0B120A298084 +:1086F000D474041220457401F0A3E4F0740612202F +:10870000457417F0A3E4F07404122045AC82AD83E5 +:108710007401122045E0F9AA0AAB0B1209FF80B4DC +:1087200074F012205174F4121FDC8A0A8B0B8C082F +:108730008D09741C122045E0F50CA3E0F50D8C8228 +:108740008D83A3E0F9120A838A0E8B0FAE0EAF0F52 +:10875000EE4F700579000288008E828F83A3A3A359 +:10876000E4F0850882850983E014600624EE601930 +:1087700080E2A3A312227BAC0CAD0D740212204543 +:10878000AA82AB83120A5380248E828F83E0640313 +:1087900070C2850882850983A3A312227BAC0CAD2D +:1087A0000D7402122045AA82AB83120A657402126C +:1087B0001FF2E9F50CEEFAEFFB120A8985188285A3 +:1087C000198385820E85830F780E122264750D0041 +:1087D000780D122268850882850983E0FDAC0CAA19 +:1087E0000AAB0B8E828F83A3A3A3A3A3A3E0F912EA +:1087F0000A717403121FF2EEFAEFFB120A7DA90C44 +:10880000740C121FF27F0802212374F1122051749C +:10881000EE121FDC8A0A8B0BECFEEDFF7421122096 +:1088200045E0FCA3E0FD750E008E828F83A3858258 +:10883000088583098E828F83E06412705DA3A31282 +:10884000227B7408122045AA82AB83120A5F74024D +:10885000121FF2E9F50E70619003D21288C54960CB +:1088600058740612204585820C85830D780C1222DF +:1088700064850882850983E0F50878081222688EED +:10888000828F83E0FD7C00AA0AAB0B9003D4E0F951 +:10889000120A717403121FF2801F851882851983D2 +:1088A000E4F0A3F0851882851983AC82AD83850836 +:1088B00082850983E0F91209FFA90E7412121FF2D2 +:1088C0007F07022123E0F8A3E0F9E822C082C083F9 +:1088D000908F42121ECA9007F1121ED60289F874B8 +:1088E000EE12205189088A0A8B0B741212204578E7 +:1088F0000C121EAC1211798A108B11AE10AF11EE52 +:108900004F600E8E828F83A3A3780C121EBB028948 +:108910009E7A0D7B0012114F8A108B11AE10AF1191 +:10892000EE4F60768E828F83A3A3A3A3A3A3A3A3FA +:10893000E508F08E828F83A3A3A3A3A3A3E50AF087 +:10894000A3E50BF08E828F83A3A3780C121EBB8E3F +:10895000828F83E4F0A3F0908F42121ECA8E828F22 +:1089600083A3A3A3A3A3A3A3A3A3121ED69007EF3D +:10897000128CF99007EF6017E0FAA3E08003E8FAA1 +:10898000E9FB8A828B83128CF970F38A828B83EEE7 +:10899000F0A3EFF0EEFAEFFB80047A007B007F0A91 +:1089A000022123C082C0839007EF80048C828D83D4 +:1089B000E0FCA3E0FDEC4D60238C828D83A3A3A398 +:1089C000A3A3A3E06A7003A3E06B70E08C828D83A5 +:1089D000A3A3A3A3A3A3A3A3E06970D0ECFAEDFB28 +:1089E0008016C082C083EA4B600E8A828B83A3A369 +:1089F000A3A3A3A3E4F0A3F0D083D0820201227446 +:108A0000F4122051740C1220457808121EACE5A80F +:108A1000FFC2AF78081222601211737404121FF2A1 +:108A20008B09A909EFA2E792AFEA496004790080B7 +:108A30000279087F0402212374F2122051740E126D +:108A400020457808121EACA2AFE433FFC2AF78080D +:108A50001222601211737404121FF2EA4B60128A20 +:108A6000828B83A3A3A3A3A3A3A3A3A37808121E0B +:108A7000BBEFA2E092AFEA4B600479008002790874 +:108A80007F0602212374F4122051A2AFE433F509CA +:108A9000C2AF1211798A0A8B0BAE0AAF0BEE4F6090 +:108AA0000312117FE509A2E092AFEE4F6004790056 +:108AB00080027906028A3374F2122051908F427834 +:108AC00008121EACA2AFE433FFC2AF1211798A8242 +:108AD0008B83E58245836007A3A37808121EACEF61 +:108AE000A2E092AFAA08AB09AC0AAD0B809274E881 +:108AF00012205174FB121FDC8A088B098C0A8D0B23 +:108B000074011220457808121EBBE5A8F9C2AF9087 +:108B100007F17808121E4BE9A2E792AF9007EF1217 +:108B20008CF97003028CE99007EFE0FEA3E0FF757B +:108B30001200751300750800750900A2AFE43385B3 +:108B40001882851983F0C2AFEE2402F510EF3400CD +:108B5000F511EE2402F50AEF3400F50B7403122030 +:108B600045128CF970207402122045E070187401CF +:108B7000122045E0F8850A82850B83E0C398400601 +:108B8000E0C398F080457401122045C082C08385FF +:108B90001082851183780C121EACD083D082780CA1 +:108BA0001214EE50177401122045780C121EAC8579 +:108BB0001082851183780C121E72800F908F4212E2 +:108BC0001ECA851082851183121ED6EE2404F51666 +:108BD000EF3400F517128CF3705F851682851783CA +:108BE000128CF97059EE2409F514EF3400F515854F +:108BF0001482F583780C121EACE50C450D450E452C +:108C00000F60558E828F83A3A3A3A3A3A3E0FAA32F +:108C1000E0FBEA4B60428E828F83A3A3A3A3A3A3AE +:108C2000A3A3E0F9121113851482851583121ECABD +:108C3000851082851183121ED6128CF3700B851657 +:108C400082851783128CF9600F8E828F83A3A3A372 +:108C5000A3A3A3128CF970258E828F83E0F8A3E082 +:108C6000F9E512451370059007EF8006851282859D +:108C70001383E8F0A3E9F08E088F0980048E128F29 +:108C8000138E828F83E0FEA3E0FF8518828519830F +:108C9000E0A2E092AFE508450960478508828509B2 +:108CA00083A3A3128CF97033850882850983A3A35B +:108CB000A3A3128CF97024850882850983A3A3A33A +:108CC000A3A3A3E0FAA3E0FB850882850983A3A3FD +:108CD000A3A3A3A3A3A3E0F9121113AA08AB09123B +:108CE0001155EE4F6003028B357405121FF27F1091 +:108CF000022123850A82850B83E0F8A3E0F9E84985 +:108D00002274F11220518A0A8B0B8908ECFEEDFFC8 +:108D1000740F122045E0FCA3E0FD9003C4E0F50EC3 +:108D2000FA8A0C750D007403780C121FC974A32500 +:108D30000CF87403350DF9880C890D8882F583E0F1 +:108D40007072EA128EF7121F49EA9003C4F0850E82 +:108D50000974FF6509605D850C82850D837401F0DF +:108D6000A3E50AF0A3E50B128DC0E508128DC0A3A0 +:108D7000EEF0A3EFF0ECF8EDF9850C82850D83A3FE +:108D8000A3A3A3A3A3E8F0A3E9F09003C3E0F50A2B +:108D9000750B007403780A121FC974A3250AF582A3 +:108DA0007403350BF583E06402600579FF120975E1 +:108DB00079008007790112099979077F0702212339 +:108DC000F0850C82850D83A3A3A32274F612205193 +:108DD00074FE121FDCE9FE802385188285198374D6 +:108DE00001F0A3E4F0851882851983AC82AD837904 +:108DF0000112099F9003C3E0F912097B128E9112B0 +:108E00001FC9128E9FE8FCE9FD8C828D83E064010E +:108E10007074A3AA82AB8374FF6E600B8E08E0654A +:108E2000087002A3E0705F8C828D83A3A3A3E0F59A +:108E30000878081222688C828D83A3A3A3A3E0F98B +:108E40008C828D83A3A3A3A3A3A3E0FCA3E0FD8A4C +:108E5000828B83E0FAA3E0FB120B317401121FF244 +:108E6000E9FC128E91121FC9128E9F88828983A3FA +:108E7000AA82AB83EC7003028DD974076C700F88E3 +:108E80008289837402F07402121FF2028F61028DD4 +:108E9000D99003C3E0F5087509007403780822121D +:108EA0008EA32274A32508F874033509F92274F5FA +:108EB000122051890875090074037808121FC9121D +:108EC0008F03E82406F8E93400F9E8FEE9FF8E8212 +:108ED0008F83E0FAA3E0FBEA4B600B12136B8E82E8 +:108EE0008F83E4F0A3F09003C3E0128EF7121F49C2 +:108EF000EAF07F030221232401F8E43400F97A0424 +:108F00007B0022128EA388828983E4F0A374FF126F +:108F10008F19A3E4128F19F022F0A3F088828983BD +:108F2000A3A3A32274F6122051E9FE9007D8E060B3 +:108F30000B8E08AA087B001208F78025E92405FAA1 +:108F4000E43400FB12114F8A088B09A808A909E82C +:108F50004970067A007B008008E82405FAE93400AD +:108F6000FB7F0202212374F21220518A088B09EC44 +:108F7000FEEDFF890A740E122045E0F50B90039F69 +:108F8000E06401701D9003A0E024FFF0A3E034FF33 +:108F9000F09003A0E0F8A3E0F9E849700579011228 +:108FA0000B1F9007D8E0604C7A097B001210E3EAAF +:108FB0004B60388A828B837490F0A374FFF08A82AE +:108FC0008B83A3A3E508F0A3E509129082E50B12B9 +:108FD000907DE50AF0A3E412907DA3A3EEF0A3EF49 +:108FE000F09007D8E0F91210EF807BEEFAEFFB1259 +:108FF000136B80727A047B001210E38A0C8B0DA82D +:109000000CA90DEE24FBFAEF34FFFBE8496054880D +:109010008289837401F0A374FFF0E82402FCE93430 +:1090200000FD8C828D83EAF0A3EBF08A828B83743F +:1090300002F012906BE508F0E50BC454F0C0E0E5D7 +:1090400009F508D0E04508C0E012906BA3D0E0120B +:10905000908CE50A12908CA3E4F0E8FAE9FB900703 +:10906000D580811211557F0602212312906F228C28 +:10907000828D83E0FAA3E0F5838A82A32212908294 +:10908000A322F08A828B83A3A3A3A322F012906F62 +:10909000A3A322C082C08374FC121FDC85188285C2 +:1090A0001983EAF0A3EBF074021220457401F0A3D7 +:1090B000E4F0EC4D60209003C3E0F912097B7402E8 +:1090C000122045AC82AD83851882851983AA82ABB4 +:1090D00083790112099F851882851983E0F91209A5 +:1090E000757404121FF2D083D082020122C082C0A4 +:1090F00083E9900E818004EAF0A3EBF0D083D08264 +:1091000002012274F7122051E990032BF0120AA1F8 +:1091100090032BE0F91210A77A057B0090032BE057 +:10912000F91209F37F0102212374F412205174FA19 +:10913000121FDC8A088B09EB5480604490032BE0FB +:10914000F91210FB8A0A8B0BA80AA90BE8FEE9FFAB +:10915000E8496019120741E9701D900E81E0F46042 +:1091600016EEFAEFFBE0F91210EFE9700AAA08E533 +:10917000096480FB029247EEFAEFFB1210E980EDE2 +:10918000EAA2E0501E90032E1293A3600C1293AB40 +:1091900060077A007B0012204FE5086401FAAB09F2 +:1091A0000292475402601890032C1293A3600A1293 +:1091B00093AB6005790112204FE508640280DEEA76 +:1091C0005404607F9003031293A36062900303E052 +:1091D00024FFF0A3E034FFF018F9E849705C1206B0 +:1091E0004BE960189003057401F090032C1293A3CF +:1091F000600A1293AB6005790112204F85188285B1 +:109200001983AE82AF83120639EEFCEFFD120ECD4C +:10921000851882851983AA82AB831205FD7A1D7B8E +:10922000001205DF900303EAF0A3EBF0800C7A0450 +:109230007B0090032BE0F9121191E5086404FAAB6E +:109240000980047A007B007406121FF27F04022159 +:1092500023C082C083120ACB0290FC74F612205104 +:1092600074FA121FDCEAFCEBFD7E01EC2402F8ED3F +:109270003400F988088909EC24040808ED3400F961 +:10928000E8FAE9FB8C828D83E0246F600A24EF709A +:1092900003029348029345A3E024FB601A24F7607D +:1092A0000A14601D24D1605E029345ECFAEDFB12B6 +:1092B0000747E9FE029392ECFAEDFB12068D02934A +:1092C000927F018A828B83E0F508A3E0F509780894 +:1092D0001222EE000002000D20E1921320E1920222 +:1092E000939003221293A3601A12939E60158A82B0 +:1092F0008B83E0FAA3E0FB8882898312204FE9FF89 +:1093000080011FEF80AD7F01850882850983E0140D +:10931000600F146015147028ECFAEDFB12068780BC +:1093200020ECFAEDFB120681801790032E1293A316 +:10933000600F1293AB600AECFAEDFB12204F800134 +:109340001FEFFE804D1E804A900301E0A2E2502AEA +:10935000851882851983E4F0A3F085188285198326 +:10936000AC82AD838A828B83E0F98508828509838C +:10937000E0FAA3E0FB1209FF80189003221293A3E6 +:10938000601012939E600B7AFF7BFF8882898312A4 +:10939000204FEEF97406121FF27F0202212312946D +:1093A00095A3A3E0F8A3E0F9E84922129495A3A3BA +:1093B0001294A22274F41220517508018A828B83C0 +:1093C000A3A3A3E0FEA3E0FF8E0A8F0B780A12226C +:1093D000EE010008200A206A940700091018940280 +:1093E0002002940520F99306206A940B2039940CEE +:1093F0002034940E2053947C94129484F912060F16 +:10940000807D8A828B83A3A3A3A3A3E0FAA3E0FBBE +:109410001205F7E9F50880678A828B83A3A3A3A3CB +:10942000A31294AAA3AA82AB8388828983E0F9124B +:1094300005F180DF129484604690032E1293A3609E +:109440003E12949B6039EAFCEBFDEEFAEFFB122032 +:109450004F80C09003221293A360241293AB601F2D +:10946000EAFCEBFD7A0E7B2080E490032C1293A3A0 +:10947000600D12949B600812204F8097750800A918 +:109480000802924C8A828B83A3A3A3A3A3E0F8A330 +:10949000129495E022E0F58388822212949512942A +:1094A000A2221294AAE582458322E0F8A3E0F9887B +:1094B00082898322C082C08390032C0290F7C082ED +:1094C000C083120DB375A70075A100759C7775C395 +:1094D0000075A20075A30075A40075A50075A6000F +:1094E00075C31175A20075A30075A40075A500755C +:1094F000A60075C33375A20075A30075A40075A5F9 +:109500000075A60075C34475A20075A30075A4007C +:1095100075A50075A60075C32275A22075A34E75AA +:10952000A40075A50075A600759408120DB94394A2 +:1095300002029635A2AFE433F8C2AF5394FEE5942D +:10954000A2E240FAE8A2E0029758A2AFE433F8C2E0 +:10955000AF439401E594A2E250FA80E8E8A2E792D2 +:10956000AF801F75C303851882851983E0F5A27447 +:109570000122E8A2E792AF851882851983E0FAA359 +:10958000E0FB7402029632C082C08374FC121FDCBE +:1095900012966B1295B0122045129665122045E086 +:1095A000F5A675A1EF43A710E8A2E792AF029630A7 +:1095B00075C330851882851983E0F5A4740122C033 +:1095C00082C08374FE121FDC1295E275A1FD129514 +:1095D00063122045E0F5A3E59C54F04401F59C029C +:1095E000955C1295E953A7FD22851882851983EAB7 +:1095F000F0A3EBF0E5A8F8C2AF22E5A485188285B8 +:109600001983F0E5A5C0E07401122045D0E0F0E533 +:10961000A6C0E07402122045D0E0F0740312204589 +:10962000E4F0E8A2E792AF851882851983121ECA7A +:109630007404121FF2D083D082020122C082C08340 +:1096400074FC121FDC12966B75A1EF1295B01220FC +:1096500045129665122045E0F5A6E59C54F04404B9 +:10966000F59C0295A8E0F5A57402221296E0E5A803 +:10967000F8C2AF53A7EF2274F412205174FC121FEA +:10968000DC1296DCA2AFE433F9C2AF53A7DF75A1B9 +:10969000DF851882851983C082C083908F62780825 +:1096A000121EACD083D08278081214A37005439C9C +:1096B00070801A75C3401295B31220451296651238 +:1096C0002045E0F5A6E59C540F4450F59CE9A2E046 +:1096D00092AF7404121FF27F040221231296E0223B +:1096E000851882851983EAF0A3EBF0A3ECF0A3EDD3 +:1096F000F022C082C08374FE121FDC851882851997 +:1097000083EAF0A3EBF0851882851983E0F8A3E0E3 +:10971000F9E8496016E5A8F8C2AF75C3001295666E +:10972000122045E0F5A3E8A2E792AF029582E5A8F2 +:10973000C2AF53A7C9801CE5A8C2AF53A7C9759C87 +:10974000778010E5A8F8C2AFE59C54F04407F59C7B +:10975000E8800375A1C9A2E792AF020122C082C0CE +:1097600083E5A8F8C2AF75C311E5A28C828D83F0A2 +:10977000E5A31297C1A3A3A3E4F0E8A2E792AF0286 +:109780009635C082C08374FC121FDCE5A8F8C2AF16 +:1097900075C300E5A20295FAC082C08374FE121F51 +:1097A000DCE5A8F8C2AF75C300E5A285188285196B +:1097B00083F0E5A3C0E07401122045D0E0F00295EB +:1097C00072A3F0E5A48A828B83F0E5A5A3F0E5A659 +:1097D0008A828B83A3A3F08A828B8322C082C08378 +:1097E00074FE121FDCE5A8F8C2AFE5C3F975C3002B +:1097F000E5A2E5A4851882851983F0E5A5C0E0748B +:1098000001122045D0E0F089C302957274F612204F +:10981000517508D075098E78081222647C137D007A +:109820007A327B1012084F7402121FF27F0202215B +:109830002374F4122051E97E008A8285820A8E0BFD +:10984000600F24FE601E14602614602E14603680A3 +:109850003F780A1222647A647B081210BF740212E5 +:109860001FF2802E780A1222647A6C7B0880EB78D3 +:109870000A1222647A6E7B0880E0780A1222647AE7 +:109880008B7B0880D5780A1222647A8D7B0880CA87 +:109890000E0EEEF97F0402212374E81220518C0A87 +:1098A0008D0BE9FE7418122045E0FAA3E0FB741A50 +:1098B000122045E0F50EA3E0F50F741C122045E0E0 +:1098C000FCA3E0FD751600ECF87402C398FF741D4C +:1098D000C398F9850A82850B83A3E0F510A3E0F510 +:1098E000117402C39CF508E49DF509E50A2406F508 +:1098F00012E50B3400F513741DC39CF50CE49DF5C3 +:109900000D8E8285820A851082851183E0F514A36D +:10991000E0F511E5142400F51078101222EE000095 +:109920000900232A4899242A8A99252ABB99262A9C +:10993000E899272A1E9A282A539A292A759A2A2AA8 +:10994000AA9A502ADF9A159BEC9408ED94004006E1 +:10995000751607029B207408129B3950048E1780DD +:1099600008ECF87408C398F517850E82850F83E517 +:1099700017129B3012226474642CFC74083DFD1293 +:1099800010BF7402121FF2029B20EC9406ED9400AB +:1099900050BE7406129B3950048E158008ECF87482 +:1099A00006C398F515850E82850F83E515129B3049 +:1099B00012226474F42CFC748E80C2EC9402ED9438 +:1099C00000508DC3EE9508E4950950048E14800272 +:1099D0008F14850E82850F83E514129B301222644A +:1099E000746C2CFC74088095EC941DED940040037D +:1099F000029950C3EE950CE4950D50048E1180022F +:109A00008911850E82850F83E511129B3012226425 +:109A1000851282851383E02CFCA3E002997DEC94EF +:109A200002ED94004003029950C3EE9508E49509B5 +:109A300050048E1080028F10850E82850F83E510F2 +:109A4000129B30122264851282851383E02CFCA3C2 +:109A5000E08093EC941DED94004003029950C3EE16 +:109A6000950CE4950D5003EE8001E9FFEF850E8221 +:109A7000850F838095EC9405ED9400400302995086 +:109A80007405129B3950048E088008ECF87405C3E5 +:109A900098F508850E82850F83E508129B27122210 +:109AA0006474002CFC748F02997DEC940EED94008C +:109AB0004003029950740E129B3950048E0980089D +:109AC000ECF8740EC398F509850E82850F83E509BD +:109AD000129B2712226474AD2CFC748E02997DECCB +:109AE0009407ED940040030299507407129B39408B +:109AF00008ECF87407C398F50A850E82850F83E594 +:109B00000AF0F50C750D00780C122264742B2CFCF5 +:109B1000741002997D850E82850F83E4F075160A14 +:109B2000A9167F10022123F0F50A750B00780A228E +:109B3000F0F508750900780822C39CF8E49DF9C384 +:109B4000EE98E4992274F61220517C117D0D7AFF73 +:109B50007BFF1208CD7508FA75098E780812226409 +:109B60007C047D007A5C7B1112084F7402121FF294 +:109B70007F02022123900D05E0F8A3E0F9E82274AA +:109B8000F4122051E98A087E00704D740A6508704D +:109B900043750A0A8E0B780A1222647A077B0D122B +:109BA0009C81121FF27509FF7809122268750A0458 +:109BB000780A122264750A5C750B11780A12226405 +:109BC00079007C077D0D7A117B0D1208E574051272 +:109BD0001FF280067E1880020E0EEEF97F0402212D +:109BE0002374F6122051E97E00701675080A8E095A +:109BF00078081222647C077D0D129C81121FF2806E +:109C0000020E0EEEF9029B7074F4122051740C12C5 +:109C10002045E0FAA3E0FB740E122045129B78FE6B +:109C2000E9FF7410122045E0F8A3E0F9750800E898 +:109C3000496004790B80478C828D83A3129D9AE042 +:109C4000F50AA3E0F9A80A742B687003742A6970F6 +:109C5000288E828F83740AF0F50A750B00780A1239 +:109C600022648C828D83A3A3A3A3A3A3E0FCA3E01F +:109C7000FD129C81121FF2800375080AA908029B3D +:109C8000DC1210BF74022274EE12205174FE121FF7 +:109C9000DC8A088B09ECFEEDFF890A74141220455A +:109CA000E0F50CA3E0F50D7416122045E0F50EA3C7 +:109CB000E0F50F750B008E828F83A3A3A3E0A2E5CE +:109CC00050057908029D5F851882851983AC82ADA5 +:109CD00083EEFAEFFB121419E96401700479018034 +:109CE0007E851882851983E0F510A3E0F5117810C0 +:109CF0001222EE000002000229699D2B2A019D9587 +:109D00009DE50E450F700B740A650A600A750B0D10 +:109D1000804B750B0B804675080A75090078081290 +:109D20002264AC0CAD0D8E828F83A3A3A3A3A3A347 +:109D3000E0FAA3E0FB129C81121FF27A107B0079FB +:109D40000A121113129B75496013E0F58388821281 +:109D50009D9AE58245836005790012204FA90B7416 +:109D600002121FF27F0A022123751001751100787B +:109D700010122264780E122264780C122264A90A4E +:109D8000EEFCEFFDAA08AB091208DF7406121FF201 +:109D9000E9F50B80C8750B0A80C3E0F8A3E0F988E9 +:109DA00082898322C082C08390035CEAF0A3EBF037 +:109DB000D083D08202012274F7122051E990035B14 +:109DC000F07A047B001209F31207717F010221234C +:109DD00074F41220518A088B09EB5480603490038C +:109DE0005BE0F91210FB8A0A8B0BA80AA90BE8FEAC +:109DF000E9FFE84960138E828F83E064A07003124C +:109E00000825EEFAEFFB1210E9AA08E5096480FBC9 +:109E100080047A007B007F0402212374F612205113 +:109E200074F5121FDCEAFEEBFF7404122045AC82CD +:109E3000AD83120543E96003029EC8EE2402F508D3 +:109E4000EF3400F5097406122045E0A2E05021909D +:109E5000035EE0F8A3E0F9E849606D740412204560 +:109E6000129EE690035FE0F583888212204F8058AF +:109E700090035CE0F8A3E0F9E8496019740412204B +:109E800045129EE690035DE0F583888212204FE93B +:109E9000F87004803378067405122045E070297448 +:109EA00006122045E0851882851983F0740112207E +:109EB00045E4F0A3F07403122045E8F0851882858C +:109EC0001983129EE61204EF8E828F83A3A3A3A3AD +:109ED000A3A3129EF0EA4B600312136B740B121FC4 +:109EE000F27F02022123AC82AD838508828509833B +:109EF000E0FAA3E0FB2274EE122051890E8A0C8B4B +:109F00000D8C0A8D0B7412122045E0F508A3E0F5C4 +:109F1000097A1E7B001210E38A108B11AE10AF116C +:109F2000EE4F605C8E828F8374B0F0A3E50AF08EF2 +:109F3000828F83A3A3E50CF0A3E50DF08E828F83BF +:109F4000A3A3A3A3E50BF0EE2405FAEF3400FBE591 +:109F50000845096019750C19750D00780C122264FA +:109F6000AC08AD091210BF7402121FF280097C19EF +:109F70007D0079001210D7EEFAEFFBA90E1210EF58 +:109F80007F0A02212374F4122051740C122045E040 +:109F9000F508A3E0F509740E122045E0F50AA3E0E8 +:109FA000F50B780A122264E50875F0E8A4C508A844 +:109FB000F075F003A428F875F0E8E509A428F50980 +:109FC000780812226412137D7404121FF2029E1686 +:109FD00074F7122051EAFEEBFFEE4F601A8E828F6B +:109FE00083E0F974FF69600F74FE69600A121383DD +:109FF0008E828F8374FFF0029DCBC082C083901D40 +:10A00000E0E4F0A3F0901DE274E2F0A37411F0908C +:10A0100011E27448F0A37402F090142AF0A3748043 +:10A02000F0A374B4F0A37409F0D083D082020122AB +:10A0300074F61220517A017B0012114FE5A8FEC27E +:10A04000AFEA24FEF8EB34FFF9901DE2E8F0A3E953 +:10A05000F01211559007E77401F0EEA2E792AF7F7E +:10A060000202212374F21220517C007D008C09EA47 +:10A0700024020A0AEB3400FBA2AFE433F508C2AFB6 +:10A080009007E7E06008EA9411EB9400500A901DF5 +:10A09000E2E0F8A3E0F98004782C791488828983BF +:10A0A000E0FEA3E0FF5480600675090002A13AE5D6 +:10A0B00009A2E050718C828D83E0F50AA3E0F50BD4 +:10A0C0005480F50DE50A2EFEE50B3F547FFFE50DAC +:10A0D0004FFF8C828D83EEF0A3EFF0547FFFC3EE31 +:10A0E0009AEF9B4055ECF8EDF9E849700302A1A204 +:10A0F00088828983E0FCA3E0547FFDECC39AFCEDE9 +:10A100009BFDC3EC9404ED94004056E82AF582E9E7 +:10A110003BF583ECF0A3EDF0EB4480FB8882898370 +:10A12000EAF0A3EB8043EEFCEF547FFDC3EC9AED25 +:10A130009B50B6750901E8FCE9FD88828983E0FE41 +:10A14000A3E0547FFFE82EF8E93FF988828983E095 +:10A15000FEA3E0FFEE4F600302A09C780079008030 +:10A160004188828983A3E04480F09007E7E060297A +:10A17000901DE2E0FAA3E0FBE86A7002E96B701957 +:10A1800088828983E0FAA3E0547FFBE82AFAE93B5E +:10A19000FB901DE2EAF0A3EBF0E824020808E934A2 +:10A1A00000F9E508A2E092AFE8FAE9FB7F06022198 +:10A1B00023C082C083EA24FEF8EB34FFF9A2AFE4A7 +:10A1C00033FCC2AF88828983A3E0547FF0901DE204 +:10A1D000E0FAA3E0FBE89AE99B5008901DE2E8F062 +:10A1E000A3E9F0ECA2E092AF02A02974F71220518B +:10A1F000E99007D4F01210B37A067B009007D4E000 +:10A20000F91209F37A517B0F120AA77F0102212369 +:10A2100074F41220518A088B09EB54806041900736 +:10A22000D4E0F91210FB8A0A8B0BA80AA90BE8FEEE +:10A23000E9FFE849602012100BE97013900E81E0ED +:10A24000F4600CEEFAEFFBE0F91210EFE96007EEB4 +:10A25000FAEFFB1210E9AA08E5096480FB8022EA04 +:10A26000A2E0500C120F57E5086401FAAB09801107 +:10A2700054026009120F6FE508640280EE7A007BD9 +:10A28000007F0402212374F6122051EAFEEBFF75D1 +:10A2900008018E828F83E0246E600A24F27003022C +:10A2A000A37E02A379A3E024F2600724D0603D02DC +:10A2B000A3798E828F83A3A3A3E064187004A3E024 +:10A2C00064207022EE240512A3992401FAA3E0343D +:10A2D00000FB88828983E0F8A3E0F5838882E0F9B7 +:10A2E000120EE5E98001E4F50802A392750901EE7A +:10A2F0002403EF34000A0A0AFBEE2405FCEF3400C5 +:10A30000FD8E828F83A3A3E024FB601B24FD70617C +:10A310008C828D83E0F98A828B83E0FAA3E0FB12C2 +:10A320000F69E9F509804D900301E0A2E2504590E4 +:10A3300007D0E0F8A3E0F9E8496039E0F5838882C6 +:10A34000A3A3A3A3E0F8A3E0F9E8496027EE240D56 +:10A35000F582EF3400F58312227B8A828B83E0FA48 +:10A36000A3E0FB8882898312204F7402121FF280BF +:10A37000B175090085090880197508008014120F4D +:10A380005DEE240612A399FAA3E0FBEA4B600312E8 +:10A39000136BA9087F02022123F8EF3400F98882A9 +:10A3A0008983E02274F61220518C088D09780812F6 +:10A3B000226479017C497D0502A53A74F612205188 +:10A3C0008C828D83C3E09417A3E0940040178C081F +:10A3D0008D09780812226479037C557D0512A473D7 +:10A3E000121FF28002790202A54074F61220518CED +:10A3F000828D83A3E0F87401686005740268701EA2 +:10A400008C828D83E060178C088D09780812226495 +:10A4100079057C617D0512A473121FF28002790216 +:10A4200002A54074F61220518C828D83E060178C57 +:10A43000088D09780812226479077C6D7D0512A4C5 +:10A4400073121FF28002790202A54074F6122051A5 +:10A450008C828D83E060178C088D09780812226445 +:10A4600079097C797D0512A473121FF280027902AA +:10A4700002A5401205C774022274F61220518C08FE +:10A480008D097808122264790B7C857D0502A53A36 +:10A4900074F61220518C088D097808122264790D07 +:10A4A0007C977D0502A53A74F61220518C088D091F +:10A4B0007808122264790F7CA37D05807D74F612E2 +:10A4C00020518C828D83E060178C088D09780812EA +:10A4D000226479117CA97D0512A473121FF28002F7 +:10A4E0007902805C74F6122051E4F508F5097808C9 +:10A4F0001222647913803F74F61220518C088D0962 +:10A50000780812226479177CB57D05802D74F612C7 +:10A510002051E4F508F509780812226479198016AB +:10A5200074F61220518C088D097808122264791B68 +:10A530007CC17D0580047C007D0012A473121FF293 +:10A540007F0202212374F61220518C088D097808AD +:10A55000122264791D80D974F6122051EAFEEBFFB5 +:10A56000EE2404FAEF3400FB12114F8A088B09A87D +:10A5700008A909E849602988828983A3A3EEF0A38A +:10A58000EFF012A6E688828983EAF0A3EBF0900C44 +:10A5900056E8F0A3E9F0E82404FAE93400FB80046B +:10A5A0007A007B007F0202212374F7122051EAF81F +:10A5B000EBF97C007D0012A6E6E8FEE9FF800BEADD +:10A5C000FCEBFD8A828B8312A6E9EA4B6049EA2400 +:10A5D00004F8EB3400F9C3EE98EF9940E28A828BDD +:10A5E00083A3A312A6CEEA28F582EB39F583A3A3B1 +:10A5F000A3A3C3E5829EE5839F40C48A828B831216 +:10A60000A6CEEC4D7005900C5680048C828D83E8AC +:10A61000F0A3E9F01211557F0102212374F41220F6 +:10A620005112A6736044C3E49508FAE49509FBEE61 +:10A630002AFAEF3BFB8A088B09E82404FCE9340082 +:10A64000FDC3EA9CEB9D402288828983A3A3E0FCA2 +:10A65000A3E0FDE82CF582E93DF583A3A3A3A3C302 +:10A66000E5829508E58395095004EEFAEFFB7F0437 +:10A67000022123EAFEEBFF8C088D091213778A0A68 +:10A680008B0BA80AA90BE84922C082C083900C5604 +:10A6900012A6CEEAFCEBFD80078882898312A6CE43 +:10A6A000E849601FE82404FAE93400FBC3EC9AEDA2 +:10A6B0009B40E612A6D4A3A3A3A3C3E5829CE58393 +:10A6C0009D40D6E8FAE9FBD083D082020122E0F86F +:10A6D000A3E0F92288828983A3A312A6E9E82AF5D8 +:10A6E00082E93BF58322900C56E0FAA3E0FB22744A +:10A6F000F61220517C587D087AFF7BFF1208CD7539 +:10A7000008D675098E78081222647C047D007A02CE +:10A710007B1012084F7402121FF27F020221237471 +:10A72000F4122051E98A087E0070447401650870B3 +:10A730003A8C828D83E0900857F07509FF780912F2 +:10A740002268750A048E0B780A122264750A027553 +:10A750000B10780A12226479007C577D087A587BA6 +:10A76000081208E57405121FF280067E1880020E9A +:10A770000EEEF97F0402212374F4122051740C129E +:10A780002045E0FAA3E0FB740E12204512A7ECE886 +:10A79000FEE9FF741012204512A7EC750800E84985 +:10A7A0006004790B804312A84DF50AA3E0F9A80ACA +:10A7B0007419687003742A69702A8E828F837401F9 +:10A7C000F0F50A750B00780A1222648C828D83A33F +:10A7D000A3A3A3A3A3E0FCA3E0FD1210BF74021285 +:10A7E0001FF2800375080AA90802A773E0F8A3E026 +:10A7F000F92274F2122051E9FE740E122045E0F5A0 +:10A800000AA3E0F50B7410122045E0F508A3E0F56B +:10A810000912A84DF50CA3E0F9A80C7402687003A6 +:10A820007429697021750C01750D00780C12226471 +:10A830007808122264780A122264EEF91208DF7492 +:10A8400006121FF28002790A7F060221238C828D74 +:10A8500083A312A7EC88828983E02274EB12205133 +:10A860008A108B118C128D137415122045E0F50A95 +:10A87000A3E0F50B7417122045E0FEA3E0FFEA45C4 +:10A88000117005790202A91B751400851408750959 +:10A890000074027808121FC912A92085088212A923 +:10A8A0002D706A850A0C850B0DE4F50EF50F780CFA +:10A8B000122260750C01750D00E51475F00F84E52A +:10A8C000F0780C121FC9AA0CAB0D90112EE0F87590 +:10A8D000F00FE5148428F91211857404121FF2E9AF +:10A8E000702B850882850983E510F0A3E511F085BA +:10A8F0000882850983A3A3E512F0A3E513F0EE4FC8 +:10A9000060078E828F83E514F07900800E0514E5D0 +:10A9100014C3940F500302A88B79087F0D022123E2 +:10A9200074582508F508740C3509F50922F583E0FB +:10A93000F8A3E0F9E8492274F5122051890AE9C325 +:10A94000940F505E890875090074027808121FC9B7 +:10A9500074582508F8740C3509F9E8FEE9FF8E8271 +:10A960008F8312A92F603B750801750900E50A75F0 +:10A97000F00F84E5F07808121FC9AA08AB099011FE +:10A980002EE0F875F00FE50A8428F91211918E82F5 +:10A990008F83E4F0A3F08E828F83A3A3F0A3F0F95A +:10A9A000800279027F03022123C082C083E9FD7403 +:10A9B000076A7001EB601874056A7001EB6010742F +:10A9C000046A7001EB600874066A7001EB703AEA81 +:10A9D000F8EBF9E875F003A4F8ACF075F003E9A41E +:10A9E0002CF974CF28F8740339F9E824F4F582E9D6 +:10A9F00034FFF583EAF0A3EBF0E824F6F582E934BE +:10AA0000FFF583EDF0790080027902D083D08202D5 +:10AA1000012274F6122051EAFEEBFF8C088D098C9E +:10AA2000828D83E0F8A3E0F97407687001E9601C87 +:10AA30007405687001E960147404687001E9600CC1 +:10AA40007406687001E96004790280177901120ABE +:10AA5000C5E970047914800BAC08AD09EEFAEFFB80 +:10AA6000120A4102AAB974F6122051E9FE75084D86 +:10AA700075090A78081222648C088D097808122258 +:10AA800064EEFC790102AAB1120A35802774F6122D +:10AA90002051E9F508780812226875080378081231 +:10AAA000226875085975090A78081222647912809B +:10AAB000D7120A3B7404121FF27F0202212374F49E +:10AAC0001220518908740C122045E0FEA3E0FF74A7 +:10AAD0000F5508F50A750B00740B780A121FC9EAA6 +:10AAE0002400F8EB3480F9E82400E9350BF9E5C7D8 +:10AAF000F509A2AFE433F50AC2AFE508C4540FFA72 +:10AB0000E5C754F84AF5C7801C88828983E08C82A7 +:10AB10008D83F088828983A3A882A9838C828D8308 +:10AB2000A3AC82AD83EEFAEFFBEA24FF1EEB34FF09 +:10AB3000FFEA4B70D48509C7E50AA2E092AF7F0413 +:10AB400002212374F6122051740A122045E0F50800 +:10AB5000A3E0F509ED900997F0ECA3F0A37462F07F +:10AB6000A37473F0A3E0541FF0E508333354FCA33F +:10AB7000F074067808121FBAE50890099BF0900956 +:10AB80009D7412F0A37442F053D1FE75D601EA9081 +:10AB90006271F0EBA3F0906270E0D2E1F0E0A2E726 +:10ABA00040FB7F02022123C082C083E9C33390624D +:10ABB00072F0906270E0D2E0F0D083D08202012285 +:10ABC00074F2122051750C00750D00120E019007E1 +:10ABD000DDE06A7003A3E06B700302ACA59007DDB3 +:10ABE000E0F8A3E0F9EAC398F8EB99F99007DDEAF9 +:10ABF000F0A3EB801E24CFF8E934CCF9E50C24FE59 +:10AC0000F50CE50D341FF50D9007DFE02405F0A3EA +:10AC1000E03400F0C3E89432E99433E850D775F09B +:10AC200005A4F8AAF075F005E9A42AF99007DFE079 +:10AC300028FAA3E039FB8A088B0974037808121FED +:10AC4000BAE50C2508F50CE50D3509F50DEA5407B4 +:10AC50009007DFF0A3E4F0E50C450D60489007E1B4 +:10AC6000E0250CF0A3E0350DF09007E1C3E094E897 +:10AC7000A3E09403402512ACAA121F518808890949 +:10AC8000E4F50AF50B9007E37808121E4B12ACAA04 +:10AC9000121F519007E1EAF0A3EBF0AA0CAB0DE410 +:10ACA000FCFD12119D7F060221239007E1E0F8A32D +:10ACB000E0F97AE87B032274F7122051E9700E79EB +:10ACC000FF12111F7A00790F12131180089007F7F5 +:10ACD000740112AD8A7F01022123C082C08374FEF9 +:10ACE000121FDC7902851882851983AA82AB831230 +:10ACF0000B19851882851983E0FAA3E0FB74021210 +:10AD00001FF2D083D08202012274F6122051E9FE94 +:10AD1000EAFF900F2DE0F4602B7A047B001210E321 +:10AD2000EA4B601C8A828B8374C0F0EFA3A3F0EE21 +:10AD30008A828B83A3A3A3F0900F2DE0F91210EF6A +:10AD40007900800279017F0202212374F7122051D9 +:10AD5000E9FE9007F7E0640170047A008010EEA22B +:10AD6000E55004D2F08002C2F0A2F0E433FA1211EE +:10AD7000B5EE9007F76008E06401700BE48005E031 +:10AD80007005740112AD8A02ACD5F07ABB7B11F963 +:10AD900012130B22C082C083120ED3D083D0820242 +:10ADA0000122C082C08390031CE0F8A3E0F9E849C7 +:10ADB000600479018002790080E1E9F874FF28C31A +:10ADC0009416400574FF68700479018002790002CE +:10ADD000012274EE122051890C8A088B098C0D74A3 +:10ADE00012122045E0FEA3E0FF7510008A828B83DB +:10ADF000E4F08005E82510F510E510C3950D5046E8 +:10AE000085100AEE250AF582EF3400F583E0F5118E +:10AE100005106032851082A882850D0EF50AE8259E +:10AE20000AFAE43400FBE50E9AE49BC365D0334094 +:10AE300015EE28F582EF3400F583E0F50A0510F9E8 +:10AE4000120651E970067A007B00801A74FF251102 +:10AE5000F8850882850983F0E50C650A7096EE2571 +:10AE600010FAEF3400FB7F0A022123C082C0838ADC +:10AE7000828B8312AF02E9F08A828B83E02401FC8B +:10AE8000A3E03400FD8A828B83ECF0A3EDF0D08345 +:10AE9000D08202012274F612205174FC121FDC745D +:10AEA00002122045EAF0A3EBF0ECFAEDFB740E126F +:10AEB0002045A882A983851882851983E8F0A3E933 +:10AEC000F0851882851983858208858309780812A0 +:10AED000226474041220458582088583097808124B +:10AEE00022647C857D1412149D7404121FF2740276 +:10AEF00012204512AF02E4F07404121FF27F020226 +:10AF00002123E0F8A3E0F58388822274F412205113 +:10AF100074FE121FDCEAFEEBFF8909900301E0A238 +:10AF2000E2400479128063120AB98B0BEA450B6088 +:10AF300057900320E0F8A3E0F9E84960159003205A +:10AF4000E02415F8A3E03400F988828983E0F5084D +:10AF50008003850908A908851882851983AA82AB10 +:10AF600083120F1B750A89750B10780A12226474FC +:10AF700002122045AC82AD837902EEFAEFFB12108B +:10AF8000957402121FF2800279147402121FF27F6C +:10AF90000402212374F7122051E99007D5F090079D +:10AFA000D6E4F09007D7F09007D8F09007D9F0904A +:10AFB00007DAF012099390039EE4F07F0102212347 +:10AFC00074F6122051EAFEEBFF548060179007D50B +:10AFD000E0F91210FBEA4B60031210E9EEFAEF649D +:10AFE00080FB80047A007B007F02022123C082C0A4 +:10AFF00083E99007D78008C082C083E99007D8F022 +:10B00000D083D082020122C082C083E99007D98018 +:10B01000EEC082C0839007EEE4F09007E8F0A3F062 +:10B02000D083D082020122C082C083E99007EE80E3 +:10B03000EE74F6122051E9FB908FEBE0F8EBC39829 +:10B04000400479038030750801750900EB78081217 +:10B050001FC9AC08AD09EA7011ECF4F8EDF4F990F1 +:10B0600007E8E058F0A3E05980099007E8E04CF0C9 +:10B07000A3E04DF079007F02022123C082C0837AD1 +:10B08000167B0012114F9007F5EAF0A3EBF07C1647 +:10B090007D0079001210D77900120AE379011212AB +:10B0A000E1790212109B7903120A0B790412072F1F +:10B0B00079051208197906120FFF79071213F5792D +:10B0C000081212817909120843790A121455D083A3 +:10B0D000D08202012274F1122051ECFEEDFF740FB8 +:10B0E000122045E0F508A3E0F5097411122045E0AF +:10B0F000F50CA3E0F50D750E02EA14600424FD7052 +:10B10000231205E5E9F50E701B780C122264AC08D9 +:10B11000AD09EEFAEFFB1205EB7402121FF21206F4 +:10B12000E7120FD5A90E7F0702212353BEFBE59D31 +:10B13000A2E650FAE5C654804449F5C6E59E547F20 +:10B14000644970F853C67FE59EA2E740FA53C68073 +:10B15000E59E547F70FA43BE049062707408F079E3 +:10B16000001211A91212E71213CB121125D2AF79D6 +:10B17000021211A912112B7A007B00020122C08257 +:10B18000C0839009A17470F0A374B1F0A3E0541FC0 +:10B19000F09009A5741DF0A37442F0A37470F0A39D +:10B1A00074B2F09009ABE0541FF09009AD741EF03A +:10B1B000A37412F08000D083D082020122C082C02A +:10B1C000831212CF02B1B674F71220518A828B8398 +:10B1D0007900E06402701AA3E0FAA3E0FB8A828B94 +:10B1E00083E0FEA3E0FBEE8C828D83F0A3EBF08086 +:10B1F0000A8C828D8374FFF0A3F0097F0102212362 +:10B20000C082C0838A828B838001A3E070FCE582C8 +:10B21000C39AFAE5839BFBD083D082020122740992 +:10B22000F5D575D4977409F5D375D29FD2B80201BC +:10B2300022C082C0839009967480F0D083D08202AD +:02B240000122E9 +:040000050000010AEC +:00000001FF diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL.i new file mode 100644 index 0000000..7c7c09a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL.i @@ -0,0 +1,3948 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +/************************************************************************************************** + Filename: OSAL.c + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: This API allows the software components in the Z-stack to be written + independently of the specifics of the operating system, kernel or tasking + environment (including control loops or connect-to-interrupt systems). + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\string.h" +/* - STRING.H - + + The ANSI 'string' function declarations. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\string.h" + + + + + + + + + + + + + + + +__intrinsic void *memcpy(void *, const void *, size_t); + +__intrinsic void *memmove(void *, const void *, size_t); + +__intrinsic void *memchr(const void *, int, size_t); + +__intrinsic void *memset(void *, int, size_t); + +__intrinsic int memcmp(const void *, const void *, size_t); + +__intrinsic char *strchr(const char *, int); + +__intrinsic int strcmp(const char *, const char *); + +__intrinsic int strncmp(const char *, const char *, size_t); + +__intrinsic int strcoll(const char *, const char *); + +__intrinsic size_t strlen(const char *); + +__intrinsic size_t strcspn(const char *, const char *); + +__intrinsic size_t strspn(const char *, const char *); + +__intrinsic char *strpbrk(const char *, const char *); + +__intrinsic char *strrchr(const char *, int); + +__intrinsic char *strstr(const char *, const char *); + +__intrinsic char *strcat(char *, const char *); + +__intrinsic char *strncat(char *, const char *, size_t); + +__intrinsic char *strcpy(char *, const char *); + +__intrinsic char *strncpy(char *, const char *, size_t); + +__intrinsic char *strerror(int); + +__intrinsic char *strtok(char *, const char *); + +__intrinsic size_t strxfrm(char *, const char *, size_t); + + + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_PwrMgr.h" +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ + + + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Clock.h" +/****************************************************************************** + Filename: OSAL_Clock.h + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: OSAL Clock definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +typedef uint32 UTCTime; + +// To be used with +typedef struct +{ + uint8 seconds; // 0-59 + uint8 minutes; // 0-59 + uint8 hour; // 0-23 + uint8 day; // 0-30 + uint8 month; // 0-11 + uint16 year; // 2000+ +} UTCTimeStruct; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Updates the OSAL clock and Timers from the MAC 320us timer tick. + */ + extern void osalTimeUpdate( void ); + + /* + * Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern void osal_setClock( UTCTime newTime ); + + /* + * Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second counter. + * returns: number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern UTCTime osal_getClock( void ); + + /* + * Converts UTCTime to UTCTimeStruct + * + * secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * tm - pointer to breakdown struct + */ + extern void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ); + + /* + * Converts UTCTimeStruct to UTCTime (seconds since 00:00:00 01/01/2000) + * + * tm - pointer to UTC time struct + */ + extern UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ); + + /* + * Update/Adjust the osal clock and timers + * Msec - elapsed time in milli seconds + */ + extern void osalAdjustTimer( uint32 Msec ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + + + + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Message Pool Definitions +osal_msg_q_t osal_qHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Index of active task +static uint8 activeTaskID = 0xFF; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 urgent ); + +/********************************************************************* + * HELPER FUNCTIONS + */ +/* very ugly stub so Keil can compile */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + +/********************************************************************* + * @fn osal_strlen + * + * @brief + * + * Calculates the length of a string. The string must be null + * terminated. + * + * @param char *pString - pointer to text string + * + * @return int - number of characters + */ +int osal_strlen( char *pString ) +{ + return (int)( strlen( pString ) ); +} + +/********************************************************************* + * @fn osal_memcpy + * + * @brief + * + * Generic memory copy. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_memcpy( void *dst, const void *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 *pSrc; + + pSrc = src; + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc++; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_revmemcpy + * + * @brief Generic reverse memory copy. Starts at the end of the + * source buffer, by taking the source address pointer and moving + * pointer ahead "len" bytes, then decrementing the pointer. + * + * Note: This function differs from the standard memcpy(), since + * it returns the pointer to the next destination uint8. The + * standard memcpy() returns the original destination address. + * + * @param dst - destination address + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to end of destination buffer + */ +void *osal_revmemcpy( void *dst, const void *src, unsigned int len ) +{ + uint8 *pDst; + const uint8 *pSrc; + + pSrc = src; + pSrc += (len-1); + pDst = dst; + + while ( len-- ) + *pDst++ = *pSrc--; + + return ( pDst ); +} + +/********************************************************************* + * @fn osal_memdup + * + * @brief Allocates a buffer [with osal_mem_alloc()] and copies + * the src buffer into the newly allocated space. + * + * @param src - source address + * @param len - number of bytes to copy + * + * @return pointer to the new allocated buffer, or NULL if + * allocation problem. + */ +void *osal_memdup( const void *src, unsigned int len ) +{ + uint8 *pDst; + + pDst = osal_mem_alloc( len ); + if ( pDst ) + { + (void) osal_memcpy( pDst, src, len ); + } + + return ( (void *)pDst ); +} + +/********************************************************************* + * @fn osal_memcmp + * + * @brief + * + * Generic memory compare. + * + * @param src1 - source 1 addrexx + * @param src2 - source 2 address + * @param len - number of bytes to compare + * + * @return TRUE - same, FALSE - different + */ +uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ) +{ + const uint8 *pSrc1; + const uint8 *pSrc2; + + pSrc1 = src1; + pSrc2 = src2; + + while ( len-- ) + { + if( *pSrc1++ != *pSrc2++ ) + return 0; + } + return 1; +} + + +/********************************************************************* + * @fn osal_memset + * + * @brief + * + * Set memory buffer to value. + * + * @param dest - pointer to buffer + * @param value - what to set each uint8 of the message + * @param size - how big + * + * @return pointer to destination buffer + */ +void *osal_memset( void *dest, uint8 value, int len ) +{ + return memset( dest, value, len ); +} + +/********************************************************************* + * @fn osal_build_uint16 + * + * @brief + * + * Build a uint16 out of 2 bytes (0 then 1). + * + * @param swapped - 0 then 1 + * + * @return uint16 + */ +uint16 osal_build_uint16( uint8 *swapped ) +{ + return ( ((uint16)(((swapped[0]) & 0x00FF) + (((swapped[1]) & 0x00FF) << 8))) ); +} + +/********************************************************************* + * @fn osal_build_uint32 + * + * @brief + * + * Build a uint32 out of sequential bytes. + * + * @param swapped - sequential bytes + * @param len - number of bytes in the uint8 array + * + * @return uint32 + */ +uint32 osal_build_uint32( uint8 *swapped, uint8 len ) +{ + if ( len == 2 ) + return ( ((uint32)((uint32)((swapped[0]) & 0x00FF) + ((uint32)((swapped[1]) & 0x00FF) << 8) + ((uint32)((0L) & 0x00FF) << 16) + ((uint32)((0L) & 0x00FF) << 24))) ); + else if ( len == 3 ) + return ( ((uint32)((uint32)((swapped[0]) & 0x00FF) + ((uint32)((swapped[1]) & 0x00FF) << 8) + ((uint32)((swapped[2]) & 0x00FF) << 16) + ((uint32)((0L) & 0x00FF) << 24))) ); + else if ( len == 4 ) + return ( ((uint32)((uint32)((swapped[0]) & 0x00FF) + ((uint32)((swapped[1]) & 0x00FF) << 8) + ((uint32)((swapped[2]) & 0x00FF) << 16) + ((uint32)((swapped[3]) & 0x00FF) << 24))) ); + else + return ( (uint32)swapped[0] ); +} + + +/********************************************************************* + * @fn _ltoa + * + * @brief + * + * convert a long unsigned int to a string. + * + * @param l - long to convert + * @param buf - buffer to convert to + * @param radix - 10 dec, 16 hex + * + * @return pointer to buffer + */ +unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix) +{ + + + + unsigned char tmp1[10] = "", tmp2[10] = "", tmp3[10] = ""; + unsigned short num1, num2, num3; + unsigned char i; + + buf[0] = '\0'; + + if ( radix == 10 ) + { + num1 = l % 10000; + num2 = (l / 10000) % 10000; + num3 = (unsigned short)(l / 100000000); + + if (num3) _itoa(num3, tmp3, 10); + if (num2) _itoa(num2, tmp2, 10); + if (num1) _itoa(num1, tmp1, 10); + + if (num3) + { + strcpy((char*)buf, (char const*)tmp3); + for (i = 0; i < 4 - strlen((char const*)tmp2); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp2); + if (num3 || num2) + { + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num3 && !num2 && !num1) + strcpy((char*)buf, "0"); + } + else if ( radix == 16 ) + { + num1 = l & 0x0000FFFF; + num2 = l >> 16; + + if (num2) _itoa(num2, tmp2, 16); + if (num1) _itoa(num1, tmp1, 16); + + if (num2) + { + strcpy((char*)buf,(char const*)tmp2); + for (i = 0; i < 4 - strlen((char const*)tmp1); i++) + strcat((char*)buf, "0"); + } + strcat((char*)buf, (char const*)tmp1); + if (!num2 && !num1) + strcpy((char*)buf, "0"); + } + else + return ((void*)0); + + return buf; + +} + + +/********************************************************************* + * @fn osal_rand + * + * @brief Random number generator + * + * @param none + * + * @return uint16 - new random number + */ +uint16 osal_rand( void ) +{ + return ( Onboard_rand() ); +} + +/********************************************************************* + * API FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_msg_allocate + * + * @brief + * + * This function is called by a task to allocate a message buffer + * into which the task will encode the particular message it wishes + * to send. This common buffer scheme is used to strictly limit the + * creation of message buffers within the system due to RAM size + * limitations on the microprocessor. Note that all message buffers + * are a fixed size (at least initially). The parameter len is kept + * in case a message pool with varying fixed message sizes is later + * created (for example, a pool of message buffers of size LARGE, + * MEDIUM and SMALL could be maintained and allocated based on request + * from the tasks). + * + * + * @param uint8 len - wanted buffer length + * + * + * @return pointer to allocated buffer or NULL if allocation failed. + */ +uint8 * osal_msg_allocate( uint16 len ) +{ + osal_msg_hdr_t *hdr; + + if ( len == 0 ) + return ( ((void*)0) ); + + hdr = (osal_msg_hdr_t *) osal_mem_alloc( (short)(len + sizeof( osal_msg_hdr_t )) ); + if ( hdr ) + { + hdr->next = ((void*)0); + hdr->len = len; + hdr->dest_id = 0xFF; + return ( (uint8 *) (hdr + 1) ); + } + else + return ( ((void*)0) ); +} + +/********************************************************************* + * @fn osal_msg_deallocate + * + * @brief + * + * This function is used to deallocate a message buffer. This function + * is called by a task (or processing element) after it has finished + * processing a received message. + * + * + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_MSG_POINTER + */ +uint8 osal_msg_deallocate( uint8 *msg_ptr ) +{ + uint8 *x; + + if ( msg_ptr == ((void*)0) ) + return ( 0x05 ); + + // don't deallocate queued buffer + if ( ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id != 0xFF ) + return ( 0x04 ); + + x = (uint8 *)((uint8 *)msg_ptr - sizeof( osal_msg_hdr_t )); + + osal_mem_free( (void *)x ); + + return ( 0x00 ); +} + +/********************************************************************* + * @fn osal_msg_send + * + * @brief + * + * This function is called by a task to send a command message to + * another task or processing element. The sending_task field must + * refer to a valid task, since the task ID will be used + * for the response message. This function will also set a message + * ready event in the destination tasks event list. + * + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to new message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, 0 ) ); +} + +/********************************************************************* + * @fn osal_msg_push_front + * + * @brief + * + * This function is called by a task to push a command message + * to the head of the OSAL queue. The destination_task field + * must refer to a valid task, since the task ID will be used to + * send the message to. This function will also set a message + * ready event in the destination task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ) +{ + return ( osal_msg_enqueue_push( destination_task, msg_ptr, 1 ) ); +} + +/********************************************************************* + * @fn osal_msg_enqueue_push + * + * @brief + * + * This function is called by a task to either enqueue (append to + * queue) or push (prepend to queue) a command message to the OSAL + * queue. The destination_task field must refer to a valid task, + * since the task ID will be used to send the message to. This + * function will also set a message ready event in the destination + * task's event list. + * + * @param uint8 destination_task - Send msg to Task ID + * @param uint8 *msg_ptr - pointer to message buffer + * @param uint8 push - TRUE to push, otherwise enqueue + * + * @return SUCCESS, INVALID_TASK, INVALID_MSG_POINTER + */ +static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 push ) +{ + if ( msg_ptr == ((void*)0) ) + { + return ( 0x05 ); + } + + if ( destination_task >= tasksCnt ) + { + osal_msg_deallocate( msg_ptr ); + return ( 0x03 ); + } + + // Check the message header + if ( ((osal_msg_hdr_t *) (msg_ptr) - 1)->next != ((void*)0) || + ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id != 0xFF ) + { + osal_msg_deallocate( msg_ptr ); + return ( 0x05 ); + } + + ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id = destination_task; + + if ( push == 1 ) + { + // prepend the message + osal_msg_push( &osal_qHead, msg_ptr ); + } + else + { + // append the message + osal_msg_enqueue( &osal_qHead, msg_ptr ); + } + + // Signal the task that a message is waiting + osal_set_event( destination_task, 0x8000 ); + + return ( 0x00 ); +} + +/********************************************************************* + * @fn osal_msg_receive + * + * @brief + * + * This function is called by a task to retrieve a received command + * message. The calling task must deallocate the message buffer after + * processing the message using the osal_msg_deallocate() call. + * + * @param uint8 task_id - receiving tasks ID + * + * @return *uint8 - message information or NULL if no message + */ +uint8 *osal_msg_receive( uint8 task_id ) +{ + osal_msg_hdr_t *listHdr; + osal_msg_hdr_t *prevHdr = ((void*)0); + osal_msg_hdr_t *foundHdr = ((void*)0); + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (600 == -1); } while (600 == -1); + + // Point to the top of the queue + listHdr = osal_qHead; + + // Look through the queue for a message that belongs to the asking task + while ( listHdr != ((void*)0) ) + { + if ( (listHdr - 1)->dest_id == task_id ) + { + if ( foundHdr == ((void*)0) ) + { + // Save the first one + foundHdr = listHdr; + } + else + { + // Second msg found, stop looking + break; + } + } + if ( foundHdr == ((void*)0) ) + { + prevHdr = listHdr; + } + listHdr = ((osal_msg_hdr_t *) (listHdr) - 1)->next; + } + + // Is there more than one? + if ( listHdr != ((void*)0) ) + { + // Yes, Signal the task that a message is waiting + osal_set_event( task_id, 0x8000 ); + } + else + { + // No more + osal_clear_event( task_id, 0x8000 ); + } + + // Did we find a message? + if ( foundHdr != ((void*)0) ) + { + // Take out of the link list + osal_msg_extract( &osal_qHead, foundHdr, prevHdr ); + } + + // Release interrupts + do { EA = intState; } while (648 == -1); + + return ( (uint8*) foundHdr ); +} + +/************************************************************************************************** + * @fn osal_msg_find + * + * @brief This function finds in place an OSAL message matching the task_id and event + * parameters. + * + * input parameters + * + * @param task_id - The OSAL task id that the enqueued OSAL message must match. + * @param event - The OSAL event id that the enqueued OSAL message must match. + * + * output parameters + * + * None. + * + * @return NULL if no match, otherwise an in place pointer to the matching OSAL message. + ************************************************************************************************** + */ +osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event) +{ + osal_msg_hdr_t *pHdr; + halIntState_t intState; + + do { intState = EA; do { EA = 0; } while (676 == -1); } while (676 == -1); // Hold off interrupts. + + pHdr = osal_qHead; // Point to the top of the queue. + + // Look through the queue for a message that matches the task_id and event parameters. + while (pHdr != ((void*)0)) + { + if (((pHdr-1)->dest_id == task_id) && (((osal_event_hdr_t *)pHdr)->event == event)) + { + break; + } + + pHdr = ((osal_msg_hdr_t *) (pHdr) - 1)->next; + } + + do { EA = intState; } while (691 == -1); // Release interrupts. + + return (osal_event_hdr_t *)pHdr; +} + +/********************************************************************* + * @fn osal_msg_enqueue + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + void *list; + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (714 == -1); } while (714 == -1); + + ((osal_msg_hdr_t *) (msg_ptr) - 1)->next = ((void*)0); + // If first message in queue + if ( *q_ptr == ((void*)0) ) + { + *q_ptr = msg_ptr; + } + else + { + // Find end of queue + for ( list = *q_ptr; ((osal_msg_hdr_t *) (list) - 1)->next != ((void*)0); list = ((osal_msg_hdr_t *) (list) - 1)->next ); + + // Add message to end of queue + ((osal_msg_hdr_t *) (list) - 1)->next = msg_ptr; + } + + // Re-enable interrupts + do { EA = intState; } while (732 == -1); +} + +/********************************************************************* + * @fn osal_msg_dequeue + * + * @brief + * + * This function dequeues an OSAL message from an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * + * @return void * - pointer to OSAL message or NULL of queue is empty. + */ +void *osal_msg_dequeue( osal_msg_q_t *q_ptr ) +{ + void *msg_ptr = ((void*)0); + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (752 == -1); } while (752 == -1); + + if ( *q_ptr != ((void*)0) ) + { + // Dequeue message + msg_ptr = *q_ptr; + *q_ptr = ((osal_msg_hdr_t *) (msg_ptr) - 1)->next; + ((osal_msg_hdr_t *) (msg_ptr) - 1)->next = ((void*)0); + ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id = 0xFF; + } + + // Re-enable interrupts + do { EA = intState; } while (764 == -1); + + return msg_ptr; +} + +/********************************************************************* + * @fn osal_msg_push + * + * @brief + * + * This function pushes an OSAL message to the head of an OSAL + * queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * + * @return none + */ +void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (787 == -1); } while (787 == -1); + + // Push message to head of queue + ((osal_msg_hdr_t *) (msg_ptr) - 1)->next = *q_ptr; + *q_ptr = msg_ptr; + + // Re-enable interrupts + do { EA = intState; } while (794 == -1); +} + +/********************************************************************* + * @fn osal_msg_extract + * + * @brief + * + * This function extracts and removes an OSAL message from the + * middle of an OSAL queue. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message to be extracted + * @param void *prev_ptr - OSAL message before msg_ptr in queue + * + * @return none + */ +void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ) +{ + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (816 == -1); } while (816 == -1); + + if ( msg_ptr == *q_ptr ) + { + // remove from first + *q_ptr = ((osal_msg_hdr_t *) (msg_ptr) - 1)->next; + } + else + { + // remove from middle + ((osal_msg_hdr_t *) (prev_ptr) - 1)->next = ((osal_msg_hdr_t *) (msg_ptr) - 1)->next; + } + ((osal_msg_hdr_t *) (msg_ptr) - 1)->next = ((void*)0); + ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id = 0xFF; + + // Re-enable interrupts + do { EA = intState; } while (832 == -1); +} + +/********************************************************************* + * @fn osal_msg_enqueue_max + * + * @brief + * + * This function enqueues an OSAL message into an OSAL queue if + * the length of the queue is less than max. + * + * @param osal_msg_q_t *q_ptr - OSAL queue + * @param void *msg_ptr - OSAL message + * @param uint8 max - maximum length of queue + * + * @return TRUE if message was enqueued, FALSE otherwise + */ +uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ) +{ + void *list; + uint8 ret = 0; + halIntState_t intState; + + // Hold off interrupts + do { intState = EA; do { EA = 0; } while (856 == -1); } while (856 == -1); + + // If first message in queue + if ( *q_ptr == ((void*)0) ) + { + *q_ptr = msg_ptr; + ret = 1; + } + else + { + // Find end of queue or max + list = *q_ptr; + max--; + while ( (((osal_msg_hdr_t *) (list) - 1)->next != ((void*)0)) && (max > 0) ) + { + list = ((osal_msg_hdr_t *) (list) - 1)->next; + max--; + } + + // Add message to end of queue if max not reached + if ( max != 0 ) + { + ((osal_msg_hdr_t *) (list) - 1)->next = msg_ptr; + ret = 1; + } + } + + // Re-enable interrupts + do { EA = intState; } while (884 == -1); + + return ret; +} + +/********************************************************************* + * @fn osal_set_event + * + * @brief + * + * This function is called to set the event flags for a task. The + * event passed in is OR'd into the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to set + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_set_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + do { intState = EA; do { EA = 0; } while (907 == -1); } while (907 == -1); // Hold off interrupts + tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) + do { EA = intState; } while (909 == -1); // Release interrupts + return ( 0x00 ); + } + else + { + return ( 0x03 ); + } +} + +/********************************************************************* + * @fn osal_clear_event + * + * @brief + * + * This function is called to clear the event flags for a task. The + * event passed in is masked out of the task's event variable. + * + * @param uint8 task_id - receiving tasks ID + * @param uint8 event_flag - what event to clear + * + * @return SUCCESS, INVALID_TASK + */ +uint8 osal_clear_event( uint8 task_id, uint16 event_flag ) +{ + if ( task_id < tasksCnt ) + { + halIntState_t intState; + do { intState = EA; do { EA = 0; } while (936 == -1); } while (936 == -1); // Hold off interrupts + tasksEvents[task_id] &= ~(event_flag); // Clear the event bit(s) + do { EA = intState; } while (938 == -1); // Release interrupts + return ( 0x00 ); + } + else + { + return ( 0x03 ); + } +} + +/********************************************************************* + * @fn osal_isr_register + * + * @brief + * + * This function is called to register a service routine with an + * interrupt. When the interrupt occurs, this service routine is called. + * + * @param uint8 interrupt_id - Interrupt number + * @param void (*isr_ptr)( uint8* ) - function pointer to ISR + * + * @return SUCCESS, INVALID_INTERRUPT_ID, + */ +uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ) +{ + // Remove these statements when functionality is complete + (void)interrupt_id; + (void)isr_ptr; + return ( 0x00 ); +} + +/********************************************************************* + * @fn osal_int_enable + * + * @brief + * + * This function is called to enable an interrupt. Once enabled, + * occurrence of the interrupt causes the service routine associated + * with that interrupt to be called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are enabled. + * If a single interrupt is passed in, then interrupts still have + * to be enabled with another call to INTS_ALL. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_enable( uint8 interrupt_id ) +{ + + if ( interrupt_id == 0xFF ) + { + do { EA = 1; } while (990 == -1); + return ( 0x00 ); + } + else + { + return ( 0x07 ); + } +} + +/********************************************************************* + * @fn osal_int_disable + * + * @brief + * + * This function is called to disable an interrupt. When a disabled + * interrupt occurs, the service routine associated with that + * interrupt is not called. + * + * If INTS_ALL is the interrupt_id, interrupts (in general) are disabled. + * If a single interrupt is passed in, then just that interrupt is disabled. + * + * @param uint8 interrupt_id - Interrupt number + * + * @return SUCCESS or INVALID_INTERRUPT_ID + */ +uint8 osal_int_disable( uint8 interrupt_id ) +{ + + if ( interrupt_id == 0xFF ) + { + do { EA = 0; } while (1020 == -1); + return ( 0x00 ); + } + else + { + return ( 0x07 ); + } +} + +/********************************************************************* + * @fn osal_init_system + * + * @brief + * + * This function initializes the "task" system by creating the + * tasks defined in the task table (OSAL_Tasks.h). + * + * @param void + * + * @return SUCCESS + */ +uint8 osal_init_system( void ) +{ + // Initialize the Memory Allocation System + osal_mem_init(); + + // Initialize the message queue + osal_qHead = ((void*)0); + + // Initialize the timers + osalTimerInit(); + + // Initialize the Power Management System + osal_pwrmgr_init(); + + // Initialize the system tasks. + osalInitTasks(); + + // Setup efficient search for the first free block of heap. + osal_mem_kick(); + + return ( 0x00 ); +} + +/********************************************************************* + * @fn osal_start_system + * + * @brief + * + * This function is the main loop function of the task system (if + * ZBIT and UBIT are not defined). This Function doesn't return. + * + * @param void + * + * @return none + */ +void osal_start_system( void ) +{ + + for(;;) // Forever Loop + + { + osal_run_system(); + } +} + +/********************************************************************* + * @fn osal_run_system + * + * @brief + * + * This function will make one pass through the OSAL taskEvents table + * and call the task_event_processor() function for the first task that + * is found with at least one event pending. If there are no pending + * events (all tasks), this function puts the processor into Sleep. + * + * @param void + * + * @return none + */ +void osal_run_system( void ) +{ + uint8 idx = 0; + + + osalTimeUpdate(); + + + Hal_ProcessPoll(); + + do { + if (tasksEvents[idx]) // Task is highest priority that is ready. + { + break; + } + } while (++idx < tasksCnt); + + if (idx < tasksCnt) + { + uint16 events; + halIntState_t intState; + + do { intState = EA; do { EA = 0; } while (1122 == -1); } while (1122 == -1); + events = tasksEvents[idx]; + tasksEvents[idx] = 0; // Clear the Events for this task. + do { EA = intState; } while (1125 == -1); + + activeTaskID = idx; + events = (tasksArr[idx])( idx, events ); + activeTaskID = 0xFF; + + do { intState = EA; do { EA = 0; } while (1131 == -1); } while (1131 == -1); + tasksEvents[idx] |= events; // Add back unprocessed events to the current task. + do { EA = intState; } while (1133 == -1); + } +#line 1141 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL.c" + + /* Yield in case cooperative scheduling is being used. */ + + + + + +} + +/********************************************************************* + * @fn osal_buffer_uint32 + * + * @brief + * + * Buffer an uint32 value - LSB first. + * + * @param buf - buffer + * @param val - uint32 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint32( uint8 *buf, uint32 val ) +{ + *buf++ = (uint8)((uint32)(((val) >>((0) * 8)) & 0x00FF)); + *buf++ = (uint8)((uint32)(((val) >>((1) * 8)) & 0x00FF)); + *buf++ = (uint8)((uint32)(((val) >>((2) * 8)) & 0x00FF)); + *buf++ = (uint8)((uint32)(((val) >>((3) * 8)) & 0x00FF)); + + return buf; +} + +/********************************************************************* + * @fn osal_buffer_uint24 + * + * @brief + * + * Buffer an uint24 value - LSB first. Note that type uint24 is + * typedef to uint32 in comdef.h + * + * @param buf - buffer + * @param val - uint24 value + * + * @return pointer to end of destination buffer + */ +uint8* osal_buffer_uint24( uint8 *buf, uint24 val ) +{ + *buf++ = (uint8)((uint32)(((val) >>((0) * 8)) & 0x00FF)); + *buf++ = (uint8)((uint32)(((val) >>((1) * 8)) & 0x00FF)); + *buf++ = (uint8)((uint32)(((val) >>((2) * 8)) & 0x00FF)); + + return buf; +} + +/********************************************************************* + * @fn osal_isbufset + * + * @brief + * + * Is all of the array elements set to a value? + * + * @param buf - buffer to check + * @param val - value to check each array element for + * @param len - length to check + * + * @return TRUE if all "val" + * FALSE otherwise + */ +uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ) +{ + uint8 x; + + if ( buf == ((void*)0) ) + { + return ( 0 ); + } + + for ( x = 0; x < len; x++ ) + { + // Check for non-initialized value + if ( buf[x] != val ) + { + return ( 0 ); + } + } + return ( 1 ); +} + +/********************************************************************* + * @fn osal_self + * + * @brief + * + * This function returns the task ID of the current (active) task. + * + * @param void + * + * @return active task ID or TASK_NO_TASK if no task is active + */ +uint8 osal_self( void ) +{ + return ( activeTaskID ); +} + +/********************************************************************* + */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_ClockBLE.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_ClockBLE.i new file mode 100644 index 0000000..8b3151c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_ClockBLE.i @@ -0,0 +1,2282 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_ClockBLE.c" +/************************************************************************************************** + Filename: OSAL_ClockBLE.c + Revised: $Date: 2008-12-15 15:42:47 -0800 (Mon, 15 Dec 2008) $ + Revision: $Revision: 18616 $ + + Description: OSAL Clock definition and manipulation functions for BLE projects. + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_ClockBLE.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_ClockBLE.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Clock.h" +/****************************************************************************** + Filename: OSAL_Clock.h + Revised: $Date: 2012-02-02 12:55:32 -0800 (Thu, 02 Feb 2012) $ + Revision: $Revision: 29143 $ + + Description: OSAL Clock definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +typedef uint32 UTCTime; + +// To be used with +typedef struct +{ + uint8 seconds; // 0-59 + uint8 minutes; // 0-59 + uint8 hour; // 0-23 + uint8 day; // 0-30 + uint8 month; // 0-11 + uint16 year; // 2000+ +} UTCTimeStruct; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Updates the OSAL clock and Timers from the MAC 320us timer tick. + */ + extern void osalTimeUpdate( void ); + + /* + * Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern void osal_setClock( UTCTime newTime ); + + /* + * Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second counter. + * returns: number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + */ + extern UTCTime osal_getClock( void ); + + /* + * Converts UTCTime to UTCTimeStruct + * + * secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * tm - pointer to breakdown struct + */ + extern void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ); + + /* + * Converts UTCTimeStruct to UTCTime (seconds since 00:00:00 01/01/2000) + * + * tm - pointer to UTC time struct + */ + extern UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ); + + /* + * Update/Adjust the osal clock and timers + * Msec - elapsed time in milli seconds + */ + extern void osalAdjustTimer( uint32 Msec ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_ClockBLE.c" + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// (MAXCALCTICKS * 5) + (max remainder) must be <= (uint16 max), +// so: (13105 * 5) + 7 <= 65535 + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ +extern uint16 ll_McuPrecisionCount(void); + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint16 previousLLTimerTick = 0; +static uint16 remUsTicks = 0; +static uint16 timeMSec = 0; + +// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the +// 1st of January 2000 UTC +UTCTime OSAL_timeSeconds = 0; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ); + +static void osalClockUpdate( uint16 elapsedMSec ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimeUpdate + * + * @brief Uses the free running rollover count of the MAC backoff timer; + * this timer runs freely with a constant 320 usec interval. The + * count of 320-usec ticks is converted to msecs and used to update + * the OSAL clock and Timers by invoking osalClockUpdate() and + * osalTimerUpdate(). This function is intended to be invoked + * from the background, not interrupt level. + * + * @param None. + * + * @return None. + */ +void osalTimeUpdate( void ) +{ + uint16 tmp; + uint16 ticks625us; + uint16 elapsedMSec = 0; + + // Get the free-running count of 625us timer ticks + tmp = ll_McuPrecisionCount(); + + if ( tmp != previousLLTimerTick ) + { + // Calculate the elapsed ticks of the free-running timer. + ticks625us = tmp - previousLLTimerTick; + + // Store the LL Timer tick count for the next time through this function. + previousLLTimerTick = tmp; + + /* It is necessary to loop to convert the usecs to msecs in increments so as + * not to overflow the 16-bit variables. + */ + while ( ticks625us > ((uint16)(13105)) ) + { + ticks625us -= ((uint16)(13105)); + elapsedMSec += ((uint16)(13105)) * 5 / 8; + remUsTicks += ((uint16)(13105)) * 5 % 8; + } + + // update converted number with remaining ticks from loop and the + // accumulated remainder from loop + tmp = (ticks625us * 5) + remUsTicks; + + // Convert the 625 us ticks into milliseconds and a remainder + elapsedMSec += tmp / 8; + remUsTicks = tmp % 8; + + // Update OSAL Clock and Timers + if ( elapsedMSec ) + { + osalClockUpdate( elapsedMSec ); + osalTimerUpdate( elapsedMSec ); + } + } +} + +/********************************************************************* + * @fn osalClockUpdate + * + * @brief Updates the OSAL Clock time with elapsed milliseconds. + * + * @param elapsedMSec - elapsed milliseconds + * + * @return none + */ +static void osalClockUpdate( uint16 elapsedMSec ) +{ + // Add elapsed milliseconds to the saved millisecond portion of time + timeMSec += elapsedMSec; + + // Roll up milliseconds to the number of seconds + if ( timeMSec >= 1000 ) + { + OSAL_timeSeconds += timeMSec / 1000; + timeMSec = timeMSec % 1000; + } +} + +/********************************************************************* + * @fn osal_setClock + * + * @brief Set the new time. This will only set the seconds portion + * of time and doesn't change the factional second counter. + * + * @param newTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_setClock( UTCTime newTime ) +{ + OSAL_timeSeconds = newTime; +} + +/********************************************************************* + * @fn osal_getClock + * + * @brief Gets the current time. This will only return the seconds + * portion of time and doesn't include the factional second + * counter. + * + * @param none + * + * @return number of seconds since 0 hrs, 0 minutes, 0 seconds, + * on the 1st of January 2000 UTC + */ +UTCTime osal_getClock( void ) +{ + return ( OSAL_timeSeconds ); +} + +/********************************************************************* + * @fn osal_ConvertUTCTime + * + * @brief Converts UTCTime to UTCTimeStruct + * + * @param tm - pointer to breakdown struct + * + * @param secTime - number of seconds since 0 hrs, 0 minutes, + * 0 seconds, on the 1st of January 2000 UTC + * + * @return none + */ +void osal_ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ) +{ + // calculate the time less than a day - hours, minutes, seconds + { + uint32 day = secTime % 86400UL; + tm->seconds = day % 60UL; + tm->minutes = (day % 3600UL) / 60UL; + tm->hour = day / 3600UL; + } + + // Fill in the calendar - day, month, year + { + uint16 numDays = secTime / 86400UL; + tm->year = 2000; + while ( numDays >= ((!((tm->year) % 400) || (((tm->year) % 100) && !((tm->year) % 4))) ? 366 : 365) ) + { + numDays -= ((!((tm->year) % 400) || (((tm->year) % 100) && !((tm->year) % 4))) ? 366 : 365); + tm->year++; + } + + tm->month = 0; + while ( numDays >= monthLength( (!((tm->year) % 400) || (((tm->year) % 100) && !((tm->year) % 4))), tm->month ) ) + { + numDays -= monthLength( (!((tm->year) % 400) || (((tm->year) % 100) && !((tm->year) % 4))), tm->month ); + tm->month++; + } + + tm->day = numDays; + } +} + +/********************************************************************* + * @fn monthLength + * + * @param lpyr - 1 for leap year, 0 if not + * + * @param mon - 0 - 11 (jan - dec) + * + * @return number of days in specified month + */ +static uint8 monthLength( uint8 lpyr, uint8 mon ) +{ + uint8 days = 31; + + if ( mon == 1 ) // feb + { + days = ( 28 + lpyr ); + } + else + { + if ( mon > 6 ) // aug-dec + { + mon--; + } + + if ( mon & 1 ) + { + days = 30; + } + } + + return ( days ); +} + +/********************************************************************* + * @fn osal_ConvertUTCSecs + * + * @brief Converts a UTCTimeStruct to UTCTime + * + * @param tm - pointer to provided struct + * + * @return number of seconds since 00:00:00 on 01/01/2000 (UTC) + */ +UTCTime osal_ConvertUTCSecs( UTCTimeStruct *tm ) +{ + uint32 seconds; + + /* Seconds for the partial day */ + seconds = (((tm->hour * 60UL) + tm->minutes) * 60UL) + tm->seconds; + + /* Account for previous complete days */ + { + /* Start with complete days in current month */ + uint16 days = tm->day; + + /* Next, complete months in current year */ + { + int8 month = tm->month; + while ( --month >= 0 ) + { + days += monthLength( (!((tm->year) % 400) || (((tm->year) % 100) && !((tm->year) % 4))), month ); + } + } + + /* Next, complete years before current year */ + { + uint16 year = tm->year; + while ( --year >= 2000 ) + { + days += ((!((year) % 400) || (((year) % 100) && !((year) % 4))) ? 366 : 365); + } + } + + /* Add total seconds before partial day */ + seconds += (days * 86400UL); + } + + return ( seconds ); +} diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Memory.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Memory.i new file mode 100644 index 0000000..567acd8 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Memory.i @@ -0,0 +1,2356 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" +/************************************************************************************************** + Filename: OSAL_Memory.c + Revised: $Date: 2013-03-14 17:58:51 -0700 (Thu, 14 Mar 2013) $ + Revision: $Revision: 33490 $ + + Description: OSAL Heap Memory management functions. There is an Application Note that + should be read before studying and/or modifying this module: + SWRA204 "Heap Memory Management" + + Copyright 2004-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + +// Round a value up to the ceiling of OSALMEM_HDRSZ for critical dependencies on even multiples. + + +/* Minimum wasted bytes to justify splitting a block before allocation. + * Adjust accordingly to attempt to balance the tradeoff of wasted space and runtime throughput + * spent splitting blocks into sizes that may not be practically usable when sandwiched between + * two blocks in use (and thereby not able to be coalesced.) + * Ensure that this size is an even multiple of OSALMEM_HDRSZ. + */ + + + + + + + + +/* + * Profiling the sample apps with default settings shows the following long-lived allocations + * which should live at the bottom of the small-block bucket so that they are never iterated over + * by osal_mem_alloc/free(), nor ever considered for coalescing, etc. This saves significant + * run-time throughput (on 8051 SOC if not also MSP). This is dynamic "dead space" and is not + * available to the small-block bucket heap. + * + * Adjust this size accordingly to accomodate application-specific changes including changing the + * size of long-lived objects profiled by sample apps and long-lived objects added by application. + */ +#line 103 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +/* Adjust accordingly to attempt to accomodate the block sizes of the vast majority of + * very high frequency allocations/frees by profiling the system runtime. + * This default of 16 accomodates the OSAL timers block, osalTimerRec_t, and many others. + * Ensure that this size is an even multiple of OSALMEM_MIN_BLKSZ for run-time efficiency. + */ +#line 115 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +/* + * These numbers setup the size of the small-block bucket which is reserved at the front of the + * heap for allocations of OSALMEM_SMALL_BLKSZ or smaller. + */ + +// Size of the heap bucket reserved for small block-sized allocations. +// Adjust accordingly to attempt to accomodate the vast majority of very high frequency operations. + +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in +// order to prevent the small-block bucket from being coalesced with the wilderness. + +// Index of the first available osalMemHdr_t after the small-block heap which will be set in-use in + +// The size of the wilderness after losing the small-block heap, the wasted header to block the +// small-block heap from being coalesced, and the wasted header to mark the end of the heap. + +// Index of the last available osalMemHdr_t at the end of the heap which will be set to zero for +// fast comparisons with zero to determine the end of the heap. + + +// For information about memory profiling, refer to SWRA204 "Heap Memory Management", section 1.5. +#line 143 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + + + + + + + +/* ------------------------------------------------------------------------------------------------ + * Typedefs + * ------------------------------------------------------------------------------------------------ + */ + +typedef struct { + // The 15 LSB's of 'val' indicate the total item size, including the header, in 8-bit bytes. + unsigned len : 15; + // The 1 MSB of 'val' is used as a boolean to indicate in-use or freed. + unsigned inUse : 1; +} osalMemHdrHdr_t; + +typedef union { + /* Dummy variable so compiler forces structure to alignment of largest element while not wasting + * space on targets when the halDataAlign_t is smaller than a UINT16. + */ + halDataAlign_t alignDummy; + uint16 val; + osalMemHdrHdr_t hdr; +} osalMemHdr_t; + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + + +static __no_init osalMemHdr_t theHeap[3072 / sizeof(osalMemHdr_t)]; +static __no_init osalMemHdr_t *ff1; // First free block in the small-block bucket. + + + + + +static uint8 osalMemStat; // Discrete status flags: 0x01 = kicked. + +#line 193 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +#line 207 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +/* ------------------------------------------------------------------------------------------------ + * Global Variables + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/************************************************************************************************** + * @fn osal_mem_init + * + * @brief This function is the OSAL heap memory management initialization callback. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_init(void) +{ + ; + ; + ; + + + + + + // Setup a NULL block at the end of the heap for fast comparisons with zero. + theHeap[((3072 / sizeof(osalMemHdr_t)) - 1)].val = 0; + + // Setup the small-block bucket. + ff1 = theHeap; + ff1->val = (((((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) * 8) + (((((417) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t)) + (19 * sizeof(osalMemHdr_t)))); // Set 'len' & clear 'inUse' field. + // Set 'len' & 'inUse' fields - this is a 'zero data bytes' lifetime allocation to block the + // small-block bucket from ever being coalesced with the wilderness. + theHeap[((((((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) * 8) + (((((417) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t)) + (19 * sizeof(osalMemHdr_t)))) / sizeof(osalMemHdr_t))].val = (sizeof(osalMemHdr_t) | 0x8000); + + // Setup the wilderness. + theHeap[(((((((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) * 8) + (((((417) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t)) + (19 * sizeof(osalMemHdr_t)))) / sizeof(osalMemHdr_t)) + 1)].val = (3072 - (((((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) * 8) + (((((417) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t)) + (19 * sizeof(osalMemHdr_t)))) - sizeof(osalMemHdr_t)*2); // Set 'len' & clear 'inUse' field. + +#line 261 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" +} + +/************************************************************************************************** + * @fn osal_mem_kick + * + * @brief This function is the OSAL task initialization callback. + * @brief Kick the ff1 pointer out past the long-lived OSAL Task blocks. + * Invoke this once after all long-lived blocks have been allocated - + * presently at the end of osal_init_system(). + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return None. + */ +void osal_mem_kick(void) +{ + halIntState_t intState; + osalMemHdr_t *tmp = osal_mem_alloc(1); + + ; + do { intState = EA; do { EA = 0; } while (287 == -1); } while (287 == -1); // Hold off interrupts. + + /* All long-lived allocations have filled the LL block reserved in the small-block bucket. + * Set 'osalMemStat' so searching for memory in this bucket from here onward will only be done + * for sizes meeting the OSALMEM_SMALL_BLKSZ criteria. + */ + ff1 = tmp - 1; // Set 'ff1' to point to the first available memory after the LL block. + osal_mem_free(tmp); + osalMemStat = 0x01; // Set 'osalMemStat' after the free because it enables memory profiling. + + do { EA = intState; } while (297 == -1); // Re-enable interrupts. +} + +/************************************************************************************************** + * @fn osal_mem_alloc + * + * @brief This function implements the OSAL dynamic memory allocation functionality. + * + * input parameters + * + * @param size - the number of bytes to allocate from the HEAP. + * + * output parameters + * + * None. + * + * @return None. + */ + + + +void *osal_mem_alloc( uint16 size ) + +{ + osalMemHdr_t *prev = 0; + osalMemHdr_t *hdr; + halIntState_t intState; + uint8 coal = 0; + + size += sizeof(osalMemHdr_t); + + // Calculate required bytes to add to 'size' to align to halDataAlign_t. + if ( sizeof( halDataAlign_t ) == 2 ) + { + size += (size & 0x01); + } + else if ( sizeof( halDataAlign_t ) != 1 ) + { + const uint8 mod = size % sizeof( halDataAlign_t ); + + if ( mod != 0 ) + { + size += (sizeof( halDataAlign_t ) - mod); + } + } + + do { intState = EA; do { EA = 0; } while (343 == -1); } while (343 == -1); // Hold off interrupts. + + // Smaller allocations are first attempted in the small-block bucket, and all long-lived + // allocations are channeled into the LL block reserved within this bucket. + if ((osalMemStat == 0) || (size <= (((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))))) + { + hdr = ff1; + } + else + { + hdr = (theHeap + (((((((((16) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) * 8) + (((((417) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t)) + (19 * sizeof(osalMemHdr_t)))) / sizeof(osalMemHdr_t)) + 1)); + } + + do + { + if ( hdr->hdr.inUse ) + { + coal = 0; + } + else + { + if ( coal != 0 ) + { + + + + + + prev->hdr.len += hdr->hdr.len; + + if ( prev->hdr.len >= size ) + { + hdr = prev; + break; + } + } + else + { + if ( hdr->hdr.len >= size ) + { + break; + } + + coal = 1; + prev = hdr; + } + } + + hdr = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + + if ( hdr->val == 0 ) + { + hdr = 0; + break; + } + } while (1); + + if ( hdr != 0 ) + { + uint16 tmp = hdr->hdr.len - size; + + // Determine whether the threshold for splitting is met. + if ( tmp >= ((((((sizeof(osalMemHdr_t) * 2)) + sizeof(osalMemHdr_t) - 1) / sizeof(osalMemHdr_t)) * sizeof(osalMemHdr_t))) ) + { + // Split the block before allocating it. + osalMemHdr_t *next = (osalMemHdr_t *)((uint8 *)hdr + size); + next->val = tmp; // Set 'len' & clear 'inUse' field. + hdr->val = (size | 0x8000); // Set 'len' & 'inUse' field. + +#line 420 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + } + else + { + + + + + + hdr->hdr.inUse = 1; + } + +#line 437 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +#line 475 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + + if ((osalMemStat != 0) && (ff1 == hdr)) + { + ff1 = (osalMemHdr_t *)((uint8 *)hdr + hdr->hdr.len); + } + + hdr++; + } + + do { EA = intState; } while (484 == -1); // Re-enable interrupts. + + +#pragma diag_suppress=Pe767 + ; +#pragma diag_default=Pe767 +#line 496 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + return (void *)hdr; +} + +/************************************************************************************************** + * @fn osal_mem_free + * + * @brief This function implements the OSAL dynamic memory de-allocation functionality. + * + * input parameters + * + * @param ptr - A valid pointer (i.e. a pointer returned by osal_mem_alloc()) to the memory to free. + * + * output parameters + * + * None. + * + * @return None. + */ + + + +void osal_mem_free(void *ptr) + +{ + osalMemHdr_t *hdr = (osalMemHdr_t *)ptr - 1; + halIntState_t intState; + + + + + + ; + ; + + do { intState = EA; do { EA = 0; } while (530 == -1); } while (530 == -1); // Hold off interrupts. + hdr->hdr.inUse = 0; + + if (ff1 > hdr) + { + ff1 = hdr; + } + +#line 562 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + + do { EA = intState; } while (563 == -1); // Re-enable interrupts. +} + +#line 623 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +#line 643 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Memory.c" + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_PwrMgr.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_PwrMgr.i new file mode 100644 index 0000000..e03cd55 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_PwrMgr.i @@ -0,0 +1,2194 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" +/************************************************************************************************** + Filename: OSAL_pwrmgr.c + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_PwrMgr.h" +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ + + + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osal_pwrmgr_init + * + * @brief Initialize the power management system. + * + * @param none. + * + * @return none. + */ +void osal_pwrmgr_init( void ) +{ + pwrmgr_attribute.pwrmgr_device = 0; // Default to no power conservation. + pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve +} + +/********************************************************************* + * @fn osal_pwrmgr_device + * + * @brief Sets the device power characteristic. + * + * @param pwrmgr_device - type of power devices. With PWRMGR_ALWAYS_ON + * selection, there is no power savings and the device is most + * likely on mains power. The PWRMGR_BATTERY selection allows the + * HAL sleep manager to enter sleep. + * + * @return none + */ +void osal_pwrmgr_device( uint8 pwrmgr_device ) +{ + pwrmgr_attribute.pwrmgr_device = pwrmgr_device; +} + +/********************************************************************* + * @fn osal_pwrmgr_task_state + * + * @brief This function is called by each task to state whether or + * not this task wants to conserve power. + * + * @param task_id - calling task ID. + * state - whether the calling task wants to + * conserve power or not. + * + * @return SUCCESS if task complete + */ +uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ) +{ + if ( task_id >= tasksCnt ) + return ( 0x03 ); + + if ( state == 0 ) + { + // Clear the task state flag + pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id ); + } + else + { + // Set the task state flag + pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id); + } + + return ( 0x00 ); +} + +#line 191 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\OSAL_PwrMgr.c" + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Timers.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Timers.i new file mode 100644 index 0000000..5f713db --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_Timers.i @@ -0,0 +1,2888 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Timers.c" +/************************************************************************************************** + Filename: OSAL_Timers.c + Revised: $Date: 2012-11-28 00:37:02 -0800 (Wed, 28 Nov 2012) $ + Revision: $Revision: 32329 $ + + Description: OSAL Timer definition and manipulation functions. + + + Copyright 2004-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Timers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Timers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" +/************************************************************************************************** + Filename: hal_timer.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + + + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ +/* Timer ID definitions */ + + + + + + +/* Operation Modes for timer */ + + + + +/* Timer1 channels */ + + + + + + +/* Channel definitions */ +#line 95 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 0 Channel compare mode definitions */ +#line 103 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 1-5 channel compare mode definitions */ + + + + + // compare, clear on 0. + + // on compare, set on 0 + + + + + +/* Timer 1 Capture mode */ + + + + + + +/* Channel mode definitions */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Error Code */ +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 16bit timer1 and timer3 */ +#line 150 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer0 and timer2 */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer2 */ +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +typedef void (*halTimerCBack_t) (uint8 timerId, uint8 channel, uint8 channelMode); + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/* + * Initialize Timer Service + */ +extern void HalTimerInit ( void ); + +/* + * Configure channel in different modes + */ +extern uint8 HalTimerConfig ( uint8 timerId, + uint8 opMode, + uint8 channel, + uint8 channelMode, + bool intEnable, + halTimerCBack_t cback ); + +/* + * Start a Timer + */ +extern uint8 HalTimerStart ( uint8 timerId, uint32 timePerTick ); + +/* + * Stop a Timer + */ +extern uint8 HalTimerStop ( uint8 timerId ); + + +/* + * This is used for polling, provide the tick increment + */ +extern void HalTimerTick ( void ); + +/* + * Enable and disable particular timer + */ +extern uint8 HalTimerInterruptEnable (uint8 timerId, uint8 channelMode, bool enable); + +/* + * Configures timer 1 to control 4 PWM outputs + */ +void HalTimer1Init (halTimerCBack_t cBack); + + +/* + * Set dutycycle on timer 1 PWM output channel + */ +void halTimer1SetChannelDuty (uint8 channel, uint16 promill); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Timers.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +typedef union { + uint32 time32; + uint16 time16[2]; + uint8 time8[4]; +} osalTime_t; + +typedef struct +{ + void *next; + osalTime_t timeout; + uint16 event_flag; + uint8 task_id; + uint32 reloadTimeout; +} osalTimerRec_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +osalTimerRec_t *timerHead; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Milliseconds since last reboot +static uint32 osal_systemClock; + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ +osalTimerRec_t *osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ); +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ); +void osalDeleteTimer( osalTimerRec_t *rmTimer ); + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalTimerInit + * + * @brief Initialization for the OSAL Timer System. + * + * @param none + * + * @return + */ +void osalTimerInit( void ) +{ + osal_systemClock = 0; +} + +/********************************************************************* + * @fn osalAddTimer + * + * @brief Add a timer to the timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * @param timeout + * + * @return osalTimerRec_t * - pointer to newly created timer + */ +osalTimerRec_t * osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout ) +{ + osalTimerRec_t *newTimer; + osalTimerRec_t *srchTimer; + + // Look for an existing timer first + newTimer = osalFindTimer( task_id, event_flag ); + if ( newTimer ) + { + // Timer is found - update it. + newTimer->timeout.time32 = timeout; + + return ( newTimer ); + } + else + { + // New Timer + newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) ); + + if ( newTimer ) + { + // Fill in new timer + newTimer->task_id = task_id; + newTimer->event_flag = event_flag; + newTimer->timeout.time32 = timeout; + newTimer->next = (void *)0; + newTimer->reloadTimeout = 0; + + // Does the timer list already exist + if ( timerHead == 0 ) + { + // Start task list + timerHead = newTimer; + } + else + { + // Add it to the end of the timer list + srchTimer = timerHead; + + // Stop at the last record + while ( srchTimer->next ) + srchTimer = srchTimer->next; + + // Add to the list + srchTimer->next = newTimer; + } + + return ( newTimer ); + } + else + { + return ( (osalTimerRec_t *)0 ); + } + } +} + +/********************************************************************* + * @fn osalFindTimer + * + * @brief Find a timer in a timer list. + * Ints must be disabled. + * + * @param task_id + * @param event_flag + * + * @return osalTimerRec_t * + */ +osalTimerRec_t *osalFindTimer( uint8 task_id, uint16 event_flag ) +{ + osalTimerRec_t *srchTimer; + + // Head of the timer list + srchTimer = timerHead; + + // Stop when found or at the end + while ( srchTimer ) + { + if ( srchTimer->event_flag == event_flag && + srchTimer->task_id == task_id ) + { + break; + } + + // Not this one, check another + srchTimer = srchTimer->next; + } + + return ( srchTimer ); +} + +/********************************************************************* + * @fn osalDeleteTimer + * + * @brief Delete a timer from a timer list. + * + * @param table + * @param rmTimer + * + * @return none + */ +void osalDeleteTimer( osalTimerRec_t *rmTimer ) +{ + // Does the timer list really exist + if ( rmTimer ) + { + // Clear the event flag and osalTimerUpdate() will delete + // the timer from the list. + rmTimer->event_flag = 0; + } +} + +/********************************************************************* + * @fn osal_start_timerEx + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param uint32 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + do { intState = EA; do { EA = 0; } while (264 == -1); } while (264 == -1); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + + do { EA = intState; } while (269 == -1); // Re-enable interrupts. + + return ( (newTimer != 0) ? 0x00 : 0x08 ); +} + +/********************************************************************* + * @fn osal_start_reload_timer + * + * @brief + * + * This function is called to start a timer to expire in n mSecs. + * When the timer expires, the calling task will get the specified event + * and the timer will be reloaded with the timeout value. + * + * @param uint8 taskID - task id to set timer for + * @param uint16 event_id - event to be notified with + * @param UNINT16 timeout_value - in milliseconds. + * + * @return SUCCESS, or NO_TIMER_AVAIL. + */ +uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ) +{ + halIntState_t intState; + osalTimerRec_t *newTimer; + + do { intState = EA; do { EA = 0; } while (294 == -1); } while (294 == -1); // Hold off interrupts. + + // Add timer + newTimer = osalAddTimer( taskID, event_id, timeout_value ); + if ( newTimer ) + { + // Load the reload timeout value + newTimer->reloadTimeout = timeout_value; + } + + do { EA = intState; } while (304 == -1); // Re-enable interrupts. + + return ( (newTimer != 0) ? 0x00 : 0x08 ); +} + +/********************************************************************* + * @fn osal_stop_timerEx + * + * @brief + * + * This function is called to stop a timer that has already been started. + * If ZSUCCESS, the function will cancel the timer and prevent the event + * associated with the timer from being set for the calling task. + * + * @param uint8 task_id - task id of timer to stop + * @param uint16 event_id - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALID_EVENT_ID + */ +uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + osalTimerRec_t *foundTimer; + + do { intState = EA; do { EA = 0; } while (328 == -1); } while (328 == -1); // Hold off interrupts. + + // Find the timer to stop + foundTimer = osalFindTimer( task_id, event_id ); + if ( foundTimer ) + { + osalDeleteTimer( foundTimer ); + } + + do { EA = intState; } while (337 == -1); // Re-enable interrupts. + + return ( (foundTimer != 0) ? 0x00 : 0x06 ); +} + +/********************************************************************* + * @fn osal_get_timeoutEx + * + * @brief + * + * @param uint8 task_id - task id of timer to check + * @param uint16 event_id - identifier of timer to be checked + * + * @return Return the timer's tick count if found, zero otherwise. + */ +uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ) +{ + halIntState_t intState; + uint32 rtrn = 0; + osalTimerRec_t *tmr; + + do { intState = EA; do { EA = 0; } while (358 == -1); } while (358 == -1); // Hold off interrupts. + + tmr = osalFindTimer( task_id, event_id ); + + if ( tmr ) + { + rtrn = tmr->timeout.time32; + } + + do { EA = intState; } while (367 == -1); // Re-enable interrupts. + + return rtrn; +} + +/********************************************************************* + * @fn osal_timer_num_active + * + * @brief + * + * This function counts the number of active timers. + * + * @return uint8 - number of timers + */ +uint8 osal_timer_num_active( void ) +{ + halIntState_t intState; + uint8 num_timers = 0; + osalTimerRec_t *srchTimer; + + do { intState = EA; do { EA = 0; } while (387 == -1); } while (387 == -1); // Hold off interrupts. + + // Head of the timer list + srchTimer = timerHead; + + // Count timers in the list + while ( srchTimer != 0 ) + { + num_timers++; + srchTimer = srchTimer->next; + } + + do { EA = intState; } while (399 == -1); // Re-enable interrupts. + + return num_timers; +} + +/********************************************************************* + * @fn osalTimerUpdate + * + * @brief Update the timer structures for a timer tick. + * + * @param none + * + * @return none + *********************************************************************/ +void osalTimerUpdate( uint32 updateTime ) +{ + halIntState_t intState; + osalTimerRec_t *srchTimer; + osalTimerRec_t *prevTimer; + + osalTime_t timeUnion; + timeUnion.time32 = updateTime; + + do { intState = EA; do { EA = 0; } while (422 == -1); } while (422 == -1); // Hold off interrupts. + // Update the system time + osal_systemClock += updateTime; + do { EA = intState; } while (425 == -1); // Re-enable interrupts. + + // Look for open timer slot + if ( timerHead != 0 ) + { + // Add it to the end of the timer list + srchTimer = timerHead; + prevTimer = (void *)0; + + // Look for open timer slot + while ( srchTimer ) + { + osalTimerRec_t *freeTimer = 0; + + do { intState = EA; do { EA = 0; } while (439 == -1); } while (439 == -1); // Hold off interrupts. + + // To minimize time in this critical section, avoid 32-bit math + if ((timeUnion.time16[1] == 0) && (timeUnion.time8[1] == 0)) + { + // If upper 24 bits are zero, check lower 8 bits for roll over + if (srchTimer->timeout.time8[0] >= timeUnion.time8[0]) + { + // 8-bit math + srchTimer->timeout.time8[0] -= timeUnion.time8[0]; + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + } + else + { + // 32-bit math + if (srchTimer->timeout.time32 > timeUnion.time32) + { + srchTimer->timeout.time32 -= timeUnion.time32; + } + else + { + srchTimer->timeout.time32 = 0; + } + } + + // Check for reloading + if ( (srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0) && + (srchTimer->reloadTimeout) && (srchTimer->event_flag) ) + { + // Notify the task of a timeout + osal_set_event( srchTimer->task_id, srchTimer->event_flag ); + + // Reload the timer timeout value + srchTimer->timeout.time32 = srchTimer->reloadTimeout; + } + + // When timeout or delete (event_flag == 0) + if ( ((srchTimer->timeout.time16[0] == 0) && (srchTimer->timeout.time16[1] == 0)) || + (srchTimer->event_flag == 0) ) + { + // Take out of list + if ( prevTimer == 0 ) + { + timerHead = srchTimer->next; + } + else + { + prevTimer->next = srchTimer->next; + } + + // Setup to free memory + freeTimer = srchTimer; + + // Next + srchTimer = srchTimer->next; + } + else + { + // Get next + prevTimer = srchTimer; + srchTimer = srchTimer->next; + } + + do { EA = intState; } while (514 == -1); // Re-enable interrupts. + + if ( freeTimer ) + { + if ( (freeTimer->timeout.time16[0] == 0) && (freeTimer->timeout.time16[1] == 0) ) + { + osal_set_event( freeTimer->task_id, freeTimer->event_flag ); + } + osal_mem_free( freeTimer ); + } + } + } +} + +#line 597 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\osal\\common\\OSAL_Timers.c" + +/********************************************************************* + * @fn osal_GetSystemClock() + * + * @brief Read the local system clock. + * + * @param none + * + * @return local clock in milliseconds + */ +uint32 osal_GetSystemClock( void ) +{ + return ( osal_systemClock ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_WIMU.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_WIMU.i new file mode 100644 index 0000000..30d76e3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OSAL_WIMU.i @@ -0,0 +1,14519 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" +/************************************************************************************************** + Filename: OSAL_WIMU.c + + Description: This file contains function that allows user setup tasks + +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 12 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 13 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 14 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 17 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* LL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2013-05-15 05:57:26 -0700 (Wed, 15 May 2013) $ + Revision: $Revision: 34287 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/******************************************************************************* + * MACROS + */ + +// check if connection parameter ranges for CI (min/max), SL, and LSTO are valid +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// check if the CI/SL/LSTO combination is valid +// based on: LSTO > (1 + Slave Latency) * (Connection Interval * 2) +// Note: The CI * 2 requirement based on ESR05 V1.0, Erratum 3904. +// Note: LSTO time is normalized to units of 1.25ms (i.e. 10ms = 8 * 1.25ms). + + + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// Internal + + + +// Encryption Key Request Reason Codes + + + + +// Disconnect Reason Codes +#line 161 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// Disconnect API Parameter +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#line 195 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// LL Advertiser Channels + + + + + +// LL Advertiser Events + + + + + +// LL Address Type + + + +// Advertiser White List Policy + + + + + +// Scanner White List Policy + + + +// Initiator White List Policy + + + +// Black List Control + + + +// Advertiser Commands + + + + +// LL Scan Commands + + + +// LL Scan Filtering + + + +// LL Scan Types + + + +// LL Tx Power Types + + + +// Data Fragmentation Flag + + + + +// Connection Complete Role + + + +// Encryption Related + + + +// Feature Set Related + +// + + + +// Receive Flow Control + + + +// Direct Test Mode + + +// +#line 287 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// Vendor Specific + + +// + + + + + + + + + + + + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + + +// +#line 348 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// + + + +// Packet Lengths +#line 365 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Event Parameters +*/ + +// Advertising Report Data +#line 377 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// Sleep Clock Accuracy (SCA) +#line 389 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Miscellaneous +*/ + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ 37 ]; + uint16 numCrcErr[ 37 ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + + +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); + + + + +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); + + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + + +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); + + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + + +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); + + + + +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); + + + + +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); + + + + +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); + + + + +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); + + + +#line 1215 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + +#line 1244 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); + + + + +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); + + + + +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); + + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + + +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); + + + + +/******************************************************************************* + * @fn LL_EXT_SetSlaveLatencyOverride API + * + * @brief This API is used to enable or disable the suspention of slave + * latency. This can be helpful when the Slave application knows + * it will soon receive something that needs to be handled without + * delay. + * + * input parameters + * + * @param control - LL_EXT_DISABLE_SL_OVERRIDE, + * LL_EXT_ENABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetSlaveLatencyOverride( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); + + + + +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + + +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn LL_EXT_BuildRevision Vendor Specific API + * + * @brief This API is used to to set a user revision number or read the + * build revision number. + * + * input parameters + * + * @param mode - LL_EXT_SET_USER_REVISION | + * LL_EXT_READ_BUILD_REVISION + * @param userRevNum - A 16 bit value the user can set as their own + * revision number + * + * output parameters + * + * @param buildRev - Pointer to returned build revision, if any. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_BuildRevision( uint8 mode, uint16 userRevNum, uint8 *buildRev ); + + +/* +** LL Callbacks to HCI +*/ + + +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); + + + + +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); + + + + +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); + + + + +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); + + + +#line 2416 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); + + + + +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); + + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + + +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); + + + + +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); + + + + +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); + + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + + + + + + + +#line 20 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* HCI */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2013-05-14 12:23:59 -0700 (Tue, 14 May 2013) $ + Revision: $Revision: 34279 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags + + + + +// Receive Data Packet + + +// Disconnect Reasons +#line 158 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Tx Power Types + + + +// Host Flow Control + + + + + +// Device Address Type + + + +// Advertiser Events + + + + + +// Advertiser Channels + + + + + +// Advertiser White List Policy + + + + + +// Advertiser Commands + + + +// Scan Types + + + +// Scan White List Policy + + + +// Scan Filtering + + + +// Scan Commands + + + +// Initiator White List Policy + + + +// Encryption Related + + + +// Direct Test Mode + + +// +#line 231 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Vendor Specific + + +// + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + +// +#line 275 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +// + + +// + + +// + + + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[6]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[6]; // device address + uint8 dataLen; // length of report data + uint8 rspData[31]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[8]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_ValidConnTimeParams API + * + * @brief This API is used to check that the connection time parameter + * ranges are valid, and that the connection time parameter + * combination is valid. + * + * Note: Only connIntervalMax is used as part of the time parameter + * combination check. + * + * input parameters + * + * @param connIntervalMin - Minimum connection interval. + * @param connIntervalMax - Maximum connection interval. + * @param connLatency - Connection slave latency. + * @param connTimeout - Connection supervision timeout. + * + * output parameters + * + * @param None. + * + * @return TRUE: Connection time parameter check is valid. + * FALSE: Connection time parameter check is invalid. + */ +extern uint8 HCI_ValidConnTimeParams( uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + + +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + +/* +** HCI API +*/ + + +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); + + + + +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + + +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); + + + + +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); + + + + +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); + + + + +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); + + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); + + + +#line 1240 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + +#line 1266 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + + +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); + + + + +/******************************************************************************* + * @fn HCI_EXT_SetSlaveLatencyOverrideCmd API + * + * @brief This HCI Extension API is used to to enable or disable + * suspending slave latency. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_SL_OVERRIDE, + * HCI_EXT_DISABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSlaveLatencyOverrideCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); + + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + + +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn HCI_EXT_BuildRevisionCmd Vendor Specific API + * + * @brief This HCI Extension API is used set a user revision number or + * read the build revision number. + * + * input parameters + * + * @param mode - HCI_EXT_SET_USER_REVISION | HCI_EXT_READ_BUILD_REVISION + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS + */ +extern hciStatus_t HCI_EXT_BuildRevisionCmd( uint8 mode, uint16 userRevNum ); + + + + + + +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_data.h" +/******************************************************************************* + Filename: hci_c_data.h + Revised: $Date: 2011-08-22 08:41:40 -0700 (Mon, 22 Aug 2011) $ + Revision: $Revision: 27235 $ + + Description: This file handles HCI data for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_bufmgr.h" +/************************************************************************************************** + Filename: osal_bufmgr.h + Revised: $Date: 2009-01-14 14:59:55 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18763 $ + + Description: This file contains the buffer management definitions. + + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * VARIABLES + */ + + +/********************************************************************* + * MACROS + */ + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Allocate a block of memory. + */ +extern void *osal_bm_alloc( uint16 size ); + +/* + * Add or remove header space for the payload pointer. + */ +extern void *osal_bm_adjust_header( void *payload_ptr, int16 size ); + +/* + * Add or remove tail space for the payload pointer. + */ +extern void *osal_bm_adjust_tail( void *payload_ptr, int16 size ); + +/* + * Free a block of memory. + */ +extern void osal_bm_free( void *payload_ptr ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_data.h" + +/******************************************************************************* + * MACROS + */ + + + +/******************************************************************************* + * CONSTANTS + */ + + + +// Data State + + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 state; // DATA_BUF_FREE, DATA_BUF_IN_USE, DATA_BUF_PENDING + uint16 connHandle; // Connection Handle + uint8 fragFlag; // Packet Boundary Flag + uint16 len; // Data Length + uint8 *pData; // Pointer to Packet Payload +} hciTxData_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Data API +*/ + +/******************************************************************************* + * This function will initialize the buffers for transmit data. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataBufferInit( void ); + + + +/******************************************************************************* + * @fn HCI_TxDataBufferInsert + * + * @brief This function will insert a transmit data packet into the free + * buffers. + * + * input parameters + * + * @param connHandle - Connection handle. + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED + */ +extern hciStatus_t HCI_TxDataBufferInsert( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_TxDataSend + * + * @brief This function sends an ACL transmit data packet to the LL. If + * the packet is successfully transferred to the TX FIFO by the + * LL, then the buffer can be freed. Otherwise, the packet is + * still pending in the LL, so it can't be released. If any error + * occurs (due to parametric checks), then the buffer is freed + * and a Number of Completed Packets event is generated with the + * number of completed packets set to zero. + * + * input parameters + * + * @param connHandle - Connection handle, or HCI_TX_DATA_ANY_CONNECTION. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataSend( uint8 connHandle ); + + + +/******************************************************************************* + * @fn HCI_ReverseBytes + * + * @brief This function is used to reverse the order of the bytes in + * an array in place. + * + * input parameters + * + * @param *buf - Pointer to buffer containing bytes to be reversed. + * @param len - Number of bytes in buffer. + * + * Note: The length must be even. + * + * Note: The maximum length is 128 bytes. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ReverseBytes( uint8 *buf, + uint8 len ); + + + + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" +/******************************************************************************* + Filename: hci_c_event.h + Revised: $Date: 2012-05-01 12:13:50 -0700 (Tue, 01 May 2012) $ + Revision: $Revision: 30418 $ + + Description: This file contains the HCI Event types, contants, + external functions etc. for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_tl.h" +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" + +extern uint8 bleEvtMask; +extern uint8 pHciEvtMask[]; + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// Event Mask Default Values +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" +// + + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** Internal Functions +*/ + +extern void hciInitEventMasks( void ); + +/* +** HCI Controller Events +*/ + +/******************************************************************************* + * @fn HCI_DataBufferOverflowEvent + * + * @brief This function sends the Data Buffer Overflow Event to the Host. + * + * input parameters + * + * @param linkType - HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW, + * HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_DataBufferOverflowEvent( uint8 linkType ); + + +/******************************************************************************* + * @fn HCI_NumOfCompletedPacketsEvent + * + * @brief This function sends the Number of Completed Packets Event to + * the Host. + * + * Note: Currently, the number of handles is always one. + * + * input parameters + * + * @param numHandles - Number of handles. + * @param handlers - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets for + * each handle. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_NumOfCompletedPacketsEvent( uint8 numHandles, + uint16 *handlers, + uint16 *numCompletedPackets ); + + +/******************************************************************************* + * @fn HCI_CommandCompleteEvent + * + * @brief This function sends a Command Complete Event to the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandCompleteEvent( uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_VendorSpecifcCommandCompleteEvent + * + * @brief This function sends a Vendor Specific Command Complete Event to + * the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_VendorSpecifcCommandCompleteEvent( uint16 opcode, + uint8 len, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_CommandStatusEvent + * + * @brief This function sends a Command Status Event to the Host. + * + * input parameters + * + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandStatusEvent( uint8 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_HardwareErrorEvent + * + * @brief This function sends a Hardware Error Event to the Host. + * + * input parameters + * + * @param hwErrorCode - The hardware error code. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_HardwareErrorEvent( uint8 hwErrorCode ); + + +/******************************************************************************* + * @fn HCI_SendCommandStatusEvent + * + * @brief This generic function sends a Command Status event to the Host. + * It is provided as a direct call so the Host can use it directly. + * + * input parameters + * + * @param eventCode - The event code. + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandStatusEvent ( uint8 eventCode, + uint16 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_SendCommandCompleteEvent + * + * @brief This generic function sends a Command Complete or a Vendor + * Specific Command Complete Event to the Host. + * + * input parameters + * + * @param eventCode - The event code. + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandCompleteEvent ( uint8 eventCode, + uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_SendControllerToHostEvent + * + * @brief This generic function sends a Controller to Host Event. + * + * input parameters + * + * @param eventCode - Bluetooth event code. + * @param dataLen - Length of dataField. + * @param pData - Pointer to data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendControllerToHostEvent( uint8 eventCode, + uint8 dataLen, + uint8 *pData ); + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +extern uint8 hciTaskID; +// +extern uint8 hciTestTaskID; +extern uint8 hciGapTaskID; +extern uint8 hciL2capTaskID; +extern uint8 hciSmpTaskID; + +/******************************************************************************* + * MACROS + */ + + + +/******************************************************************************* + * CONSTANTS + */ + +// OSAL Task Events + + + + + +// OSAL Message Header Events + + + + + + +// Max Buffers Supported + + + +// Max Allowed HCI Packet + + + +// Max Data Length in Packet + + +// +// Minimum length for CMD packet is 1+2+1 +// | Packet Type (1) | OPCode(2) | Length(1) | +// + + +// +// Minimum length for EVENT packet is 1+1+1 +// | Packet Type (1) | Event Code(1) | Length(1) | +// + + +// +// Minimum length for DATA packet is 1+2+2 +// | Packet Type (1) | Handler(2) | Length(2) | +// + + +// Max Number of Connections + +// + + +// HCI Packet Types + + + + + +/* +** HCI Command Opcodes +*/ + +// Link Control Commands + + + +// Controller and Baseband Commands +#line 143 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// Information Parameters + + + + + +// Status Parameters + + +// LE Commands +#line 184 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// LE Vendor Specific LL Extension Commands +#line 214 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +/* +** HCI Event Codes +*/ + +// BT Events +#line 229 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// LE Event Code (for LE Meta Events) + + +// LE Meta Event Codes + + + + + + +// Vendor Specific Event Code + + +// LE Vendor Specific LL Extension Events +#line 272 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI OSAL API +*/ + +/******************************************************************************* + * @fn HCI_Init + * + * @brief This is the HCI OSAL task initialization routine. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_Init( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ProcessEvent + * + * @brief This is the HCI OSAL task process event handler. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * @param events - HCI OSAL task events. + * + * output parameters + * + * @param None. + * + * @return Unprocessed events. + */ +extern uint16 HCI_ProcessEvent( uint8 task_id, + uint16 events ); + + + + + + +#line 23 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_cbTimer.h" +/************************************************************************************************** + Filename: osal_cbtimer.h + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the Callback Timer definitions. + + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ +// Invalid timer id + + +// Timed out timer + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ +#line 77 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_cbTimer.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Callback Timer function prototype. Callback function will be called +// when the associated timer expires. +// +// pData - pointer to data registered with timer +// +typedef void (*pfnCbTimer_t)( uint8 *pData ); + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Callback Timer task initialization function. + */ +extern void osal_CbTimerInit( uint8 taskId ); + +/* + * Callback Timer task event processing function. + */ +extern uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ); + +/* + * Function to start a timer to expire in n mSecs. + */ +extern Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ); + +/* + * Function to update a timer that has already been started. + */ +extern Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ); + +/* + * Function to stop a timer that has already been started. + */ +extern Status_t osal_CbTimerStop( uint8 timerId ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 26 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + + +/* L2CAP */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 30 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* gap */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 33 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" +/************************************************************************************************** + Filename: gapgattserver.h + Revised: $Date: 2009-10-21 07:25:22 -0700 (Wed, 21 Oct 2009) $ + Revision: $Revision: 20946 $ + + Description: This file contains GAP GATT attribute definitions + and prototypes. + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + + +// Privacy Flag States + + + +// GAP GATT Server Parameters +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +// GAP Services bit fields + + +// Attribute ID used with application's callback when attribute value is changed OTA + + + +#line 88 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +/********************************************************************* + * TYPEDEFS + */ +// Callback to notify when attribute value is changed over the air. +typedef void (*ggsAttrValueChange_t)( uint8 attrId ); + +// GAP GATT Server callback structure +typedef struct +{ + ggsAttrValueChange_t pfnAttrValueChange; // When attribute value is changed OTA +} ggsAppCBs_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8 param, uint8 len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8 param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32 services ); + +/** + * @brief Delete function for the GAP GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GGS_DelService( uint32 services ); + +/** + * @brief Registers the application callback function. + * + * Note: Callback registration is needed only when the + * Device Name is made writable. The application + * will be notified when the Device Name is changed + * over the air. + * + * @param appCallbacks - pointer to application callbacks. + * + * @return none + */ +extern void GGS_RegisterAppCBs( ggsAppCBs_t *appCallbacks ); + +/** + * @brief Set a GGS Parameter value. Use this function to change + * the default GGS parameter values. + * + * @param value - new GGS param value + * + * @return void + */ +extern void GGS_SetParamValue( uint16 value ); + +/** + * @brief Get a GGS Parameter value. + * + * @param none + * + * @return GGS Parameter value + */ +extern uint16 GGS_GetParamValue( void ); + +/********************************************************************* + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 34 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 35 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* GATT */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 38 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 40 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/* Profiles */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\peripheral.h" +/** + @headerfile: peripheral.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage TI BLE GAP Peripheral Role + + This GAP profile advertises and allows connections. + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#line 86 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\peripheral.h" +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/** + * Possible actions the peripheral device may take if an unsuccessful parameter + * update is received. + * + * Parameters for GAPRole_SendUpdateParam() only + */ + + + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16 connInterval, + uint16 connSlaveLatency, + uint16 connTimeout ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_API GAP Peripheral Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connInterval - the new connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ); + +/** + * @brief Register application's callbacks. + * + * @param pParamUpdateCB - pointer to param update callback. + * + * @return none + */ +extern void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ); + +/** + * @} End GAPROLES_PERIPHERAL_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + + +/* Application */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.h" +/************************************************************************************************** + Filename: wimu.h + + Description: This file contains the WIMU application + (based on Simple BLE Peripheral sample application) + definitions and prototypes. + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * DATA TYPES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Simple BLE Peripheral Task Events + + + + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Task Initialization for the BLE Application + */ +extern void WIMU_Init( uint8 task_id ); + +/* + * Task Event Processor for the BLE Application + */ +extern uint16 WIMU_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\OSAL_WIMU.c" + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// The order in this table must be identical to the task initialization calls below in osalInitTask. +const pTaskEventHandlerFn tasksArr[] = +{ + LL_ProcessEvent, // task 0 + Hal_ProcessEvent, // task 1 + HCI_ProcessEvent, // task 2 + +//OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3 + + L2CAP_ProcessEvent, // task 4 + GAP_ProcessEvent, // task 5 + GATT_ProcessEvent, // task 6 + SM_ProcessEvent, // task 7 + GAPRole_ProcessEvent, // task 8 + GAPBondMgr_ProcessEvent, // task 9 + GATTServApp_ProcessEvent, // task 10 + WIMU_ProcessEvent // task 11 +}; + +const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] ); +uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalInitTasks + * + * @brief This function invokes the initialization function for each task. + * + * @param void + * + * @return none + */ +void osalInitTasks( void ) +{ + uint8 taskID = 0; + + tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); + osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); + + /* LL Task */ + LL_Init( taskID++ ); + + /* Hal Task */ + Hal_Init( taskID++ ); + + /* HCI Task */ + HCI_Init( taskID++ ); +/* +#if defined ( OSAL_CBTIMER_NUM_TASKS ) + // Callback Timer Tasks + osal_CbTimerInit( taskID ); + taskID += OSAL_CBTIMER_NUM_TASKS; +#endif*/ + + /* L2CAP Task */ + L2CAP_Init( taskID++ ); + + /* GAP Task */ + GAP_Init( taskID++ ); + + /* GATT Task */ + GATT_Init( taskID++ ); + + /* SM Task */ + SM_Init( taskID++ ); + + /* Profiles */ + GAPRole_Init( taskID++ ); + GAPBondMgr_Init( taskID++ ); + + GATTServApp_Init( taskID++ ); + + /* Application */ + WIMU_Init( taskID ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OnBoard.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OnBoard.i new file mode 100644 index 0000000..b9d4ec6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/OnBoard.i @@ -0,0 +1,2979 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" +/************************************************************************************************** + Filename: OnBoard.c + Revised: $Date: 2008-03-18 15:14:17 -0700 (Tue, 18 Mar 2008) $ + Revision: $Revision: 16604 $ + + Description: This file contains the UI and control for the + peripherals on the EVAL development board + Notes: This file targets the Chipcon CC2430DB/CC2430EB + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Task ID not initialized + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +uint8 OnboardKeyIntEnable; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ +extern uint8 LL_PseudoRand( uint8 *randData, uint8 dataLen ); + +#line 94 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\cc2540\\OnBoard.c" +void appForceBoot(void); + + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Registered keys task ID, initialized to NOT USED. +static uint8 registeredKeysTaskID = 0xFF; + +/********************************************************************* + * @fn InitBoard() + * @brief Initialize the CC2540DB Board Peripherals + * @param level: COLD,WARM,READY + * @return None + */ +void InitBoard( uint8 level ) +{ + if ( level == 0 ) + { + // Interrupts off + osal_int_disable( 0xFF ); + // Turn all LEDs off + HalLedSet( (0x01 | 0x02 | 0x04 | 0x08), 0x00 ); + // Check for Brown-Out reset +// ChkReset(); + } + else // !OB_COLD + { + /* Initialize Key stuff */ + OnboardKeyIntEnable = 0x01; + //OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } +} + +/********************************************************************* + * @fn Onboard_rand + * + * @brief Random number generator + * + * @param none + * + * @return uint16 - new random number + * + *********************************************************************/ +uint16 Onboard_rand( void ) +{ + uint16 randNum; + + LL_PseudoRand( (uint8 *)&randNum, 2 ); + + return ( randNum ); +} + +/********************************************************************* + * @fn _itoa + * + * @brief convert a 16bit number to ASCII + * + * @param num - + * buf - + * radix - + * + * @return void + * + *********************************************************************/ +void _itoa(uint16 num, uint8 *buf, uint8 radix) +{ + char c,i; + uint8 *p, rst[5]; + + p = rst; + for ( i=0; i<5; i++,p++ ) + { + c = num % radix; // Isolate a digit + *p = c + (( c < 10 ) ? '0' : '7'); // Convert to Ascii + num /= radix; + if ( !num ) + break; + } + + for ( c=0 ; c<=i; c++ ) + *buf++ = *p--; // Reverse character order + + *buf = '\0'; +} + +/********************************************************************* + * "Keyboard" Support + *********************************************************************/ + +/********************************************************************* + * Keyboard Register function + * + * The keyboard handler is setup to send all keyboard changes to + * one task (if a task is registered). + * + * If a task registers, it will get all the keys. You can change this + * to register for individual keys. + *********************************************************************/ +uint8 RegisterForKeys( uint8 task_id ) +{ + // Allow only the first task + if ( registeredKeysTaskID == 0xFF ) + { + registeredKeysTaskID = task_id; + return ( 1 ); + } + else + return ( 0 ); +} + +/********************************************************************* + * @fn OnBoard_SendKeys + * + * @brief Send "Key Pressed" message to application. + * + * @param keys - keys that were pressed + * state - shifted + * + * @return status + *********************************************************************/ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ) +{ + keyChange_t *msgPtr; + + if ( registeredKeysTaskID != 0xFF ) + { + // Send the address to the task + msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) ); + if ( msgPtr ) + { + msgPtr->hdr.event = 0xC0; + msgPtr->state = state; + msgPtr->keys = keys; + + osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); + } + return ( 0x00 ); + } + else + return ( 0x01 ); +} + +/********************************************************************* + * @fn OnBoard_KeyCallback + * + * @brief Callback service for keys + * + * @param keys - keys that were pressed + * state - shifted + * + * @return void + *********************************************************************/ +void OnBoard_KeyCallback ( uint8 keys, uint8 state ) +{ + uint8 shift; + (void)state; + + // shift key (S1) is used to generate key interrupt + // applications should not use S1 when key interrupt is enabled + shift = (OnboardKeyIntEnable == 0x01) ? 0 : ((keys & 0x20) ? 1 : 0); + + if ( OnBoard_SendKeys( keys, shift ) != 0x00 ) + { + // Process SW1 here + if ( keys & 0x01 ) // Switch 1 + { + } + // Process SW2 here + if ( keys & 0x02 ) // Switch 2 + { + } + // Process SW3 here + if ( keys & 0x10 ) // Switch 3 + { + } + // Process SW4 here + if ( keys & 0x08 ) // Switch 4 + { + } + // Process SW5 here + if ( keys & 0x04 ) // Switch 5 + { + } + // Process SW6 here + if ( keys & 0x20 ) // Switch 6 + { + } + } + + /* If any key is currently pressed down and interrupt + is still enabled, disable interrupt and switch to polling */ + if( keys != 0 ) + { + if( OnboardKeyIntEnable == 0x01 ) + { + OnboardKeyIntEnable = 0x00; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } + /* If no key is currently pressed down and interrupt + is disabled, enable interrupt and turn off polling */ + else + { + if( OnboardKeyIntEnable == 0x00 ) + { + OnboardKeyIntEnable = 0x01; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } +} + +/********************************************************************* + * @fn Onboard_soft_reset + * + * @brief Effect a soft reset. + * + * @param none + * + * @return none + * + *********************************************************************/ +__near_func void Onboard_soft_reset( void ) +{ + do { EA = 0; } while (320 == -1); + asm("LJMP 0x0"); +} + + + + + + +/********************************************************************* + * @fn appForceBoot + * + * @brief Common force-boot function for the HCI library to invoke. + * + * @param none + * + * @return void + *********************************************************************/ +void appForceBoot(void) +{ + // Dummy function for HCI library that cannot depend on the SBL build defines. +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU.map b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU.map new file mode 100644 index 0000000..a7e9dc8 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU.map @@ -0,0 +1,30140 @@ +################################################################################ +# # +# IAR Universal Linker V5.0.2.5/W32 # +# # +# Link time = 27/Mar/2017 11:08:50 # +# Target CPU = x51 # +# List file = D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\List\WIMU.map # +# Output file 1 = D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Exe\WIMU.hex # +# Format: intel-extended # +# Output file 2 = D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Exe\WIMU.d51 # +# Format: debug # +# UBROF version 10.0.3 # +# Using library modules for C-SPY (-rt) # +# Command line = "-IC:\Program Files (x86)\IAR Systems\Embedded Wo # +# rkbench 6.0\8051\CONFIG\" # +# -D_NR_OF_BANKS=0x07 -D_CODEBANK_END=0xFFFF # +# -D_CODEBANK_START=0x8000 -D?CBANK_MASK=0xFF # +# -D?CBANK=0x9F # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\Libraries\CC2540 # +# DB\bin\CC2540_BLE_peri.lib # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\Libraries\Common # +# \bin\CC254x_BLE_HCI_TL_None.lib # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL_ClockBLE.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL_Memory.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL_PwrMgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL_Timers.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OSAL_WIMU.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\OnBoard.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\WIMU_Main.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\actimetryservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\battservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\devinfoservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\gap.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\gapbondmgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\gatt_uuid.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\gpsservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_adc.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_aes.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_crc.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_dma.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_drivers.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_flash.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_key.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_led.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_sleep.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_startup.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_timer.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\hal_uart.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\npi.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\osal_bufmgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\osal_cbtimer.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\osal_snv.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\peripheral.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\st_util.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\timeservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\wimu.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Obj\wimu_util.r51 # +# -o # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\Exe\WIMU.d51 # +# -l # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC # +# 2540F128-WIMU\List\WIMU.map # +# -xmsn -f # +# D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\ # +# Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\.. # +# \..\common\cc2540\ti_51ew_cc2540f128b.xcl # +# (-D_IDATA0_START=0x00 -D_IDATA0_END=0xFF # +# -D_PDATA0_START=0x1E00 -D_PDATA0_END=0x1EFF # +# -D_IXDATA0_START=0x0001 -D_IXDATA0_END=0x1EFF # +# -D_XDATA0_START=_IXDATA0_START # +# -D_XDATA0_END=_IXDATA0_END # +# -D_NEAR_CODE_START=0x0000 # +# -D_FIRST_BANK_ADDR=0x10000 -D?REGISTER_BANK=0x0 # +# -D_REGISTER_BANK_START=0x0 -D?PBANK_NUMBER=0x1E # +# -D_BREG_START=0x00 -D?VB=0x20 -D?ESP=0x9B # +# -Z(BIT)BREG=_BREG_START -Z(BIT)BIT_N=0-7F # +# -Z(DATA)REGISTERS+8=_REGISTER_BANK_START # +# -Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F # +# -Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F # +# -Z(DATA)PSP,XSP=08-7F -Z(DATA)DOVERLAY=08-7F # +# -Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F # +# -U(IDATA)0-7F=(DATA)0-7F # +# -Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA0_END # +# -Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA0_END # +# -Z(IDATA)IOVERLAY=08-FF -Z(CODE)INTVEC=0 # +# -Z(CODE)CSTART=_NEAR_CODE_START-(_CODEBANK_START- # +# 1) # +# -Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_I # +# D,PDATA_ID,XDATA_ID=_NEAR_CODE_START-(_CODEBANK_S # +# TART-1) # +# -D_SLEEP_CODE_SPACE_START=(_CODEBANK_START-8) # +# -D_SLEEP_CODE_SPACE_END=(_CODEBANK_START-1) # +# -Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP # +# _CODE_SPACE_END # +# -Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_C,CODE_N,N # +# EAR_CODE=_NEAR_CODE_START-(_CODEBANK_START-1) # +# -P(CONST)XDATA_ROM_C=0x8000-0xFFFF # +# -P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF # +# -QXDATA_ROM_C=XDATA_ROM_C_FLASH # +# -P(CODE)BANKED_CODE=_NEAR_CODE_START-(_CODEBANK_S # +# TART-1),[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_COD # +# EBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 # +# -Z(CODE)CHECKSUM#(_CODEBANK_START-1) # +# -Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED # +# _STACK_START # +# -Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA0_START-_ # +# PDATA0_END # +# -Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA0_START-_ # +# XDATA0_END # +# -Z(XDATA)PDATA_Z,PDATA_I=_PDATA0_START-_PDATA0_EN # +# D # +# -P(XDATA)PDATA_N=_PDATA0_START-_PDATA0_END # +# -Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA0_START-_IXDATA # +# 0_END # +# -P(XDATA)IXDATA_N=_IXDATA0_START-_IXDATA0_END # +# -Z(XDATA)XDATA_Z,XDATA_I=_XDATA0_START-_XDATA0_EN # +# D # +# -P(XDATA)XDATA_N=_XDATA0_START-_XDATA0_END # +# -Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA0_STAR # +# T-_XDATA0_END # +# -cx51 -D_BLENV_ADDRESS_SPACE_START=0x3E800 # +# -D_BLENV_ADDRESS_SPACE_END=0x3F7FF # +# -Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_ # +# START-_BLENV_ADDRESS_SPACE_END # +# -M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_COD # +# EBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000 # +# =0x8000 # +# -ww69=i -D_BANK0_START=0x00000 # +# -D_BANK0_END=0x07FFF -D_BANK1_START=0x18000 # +# -D_BANK1_END=0x1FFFF -D_BANK2_START=0x28000 # +# -D_BANK2_END=0x2FFFF -D_BANK3_START=0x38000 # +# -D_BANK3_END=(_BLENV_ADDRESS_SPACE_START-1) # +# -P(CODE)BANK0=_BANK0_START-_BANK0_END # +# -P(CODE)BANK1=_BANK1_START-_BANK1_END # +# -P(CODE)BANK2=_BANK2_START-_BANK2_END # +# -P(CODE)BANK3=_BANK3_START-_BANK3_END # +# -D_FLASH_LOCK_BITS_START=0x3FFF0 # +# -D_FLASH_LOCK_BITS_END=0x3FFFF # +# -Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_F # +# LASH_LOCK_BITS_END # +# -U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLAS # +# H_LOCK_BITS_END) # +# -D_NR_OF_VIRTUAL_REGISTERS=10 -D?PBANK=0x93 # +# -e?BCALL_FF=?BCALL -e?BRET_FF=?BRET # +# -e?BDISPATCH_FF=?BDISPATCH # +# -e_medium_write=_formatted_write # +# -e_medium_read=_formatted_read -rt # +# -Ointel-extended=D:\Simon_Dev\WIMuGPS\Workspace\o # +# penwimu\Firmware\Radio\Projects\Wimu\Projects\ble # +# \WIMU\CC2540DB\CC2540F128-WIMU\Exe\WIMU.hex # +# -s __program_start # +# "C:\Program Files (x86)\IAR Systems\Embedded Work # +# bench 6.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51" # +# -D_IDATA_STACK_SIZE=0xD5 # +# -D_EXTENDED_STACK_START=0x00 # +# -D_EXTENDED_STACK_SIZE=0x00 # +# -D_PDATA_STACK_SIZE=0x00 # +# -D_XDATA_STACK_SIZE=0x300 # +# -D_XDATA_HEAP_SIZE=0xFFF -D_FAR_HEAP_SIZE=0xFFF # +# -D_HUGE_HEAP_SIZE=0xFFF # +# -D_FAR22_HEAP_SIZE=0xFFF # +# # +# Copyright (C) 1987-2010 IAR Systems AB. # +################################################################################ + + + + + + **************************************** + * * + * CROSS REFERENCE * + * * + **************************************** + + Program entry at : CODE 0000010A Relocatable, from module : CSTARTUP + + + + + **************************************** + * * + * RUNTIME MODEL * + * * + **************************************** + + __SystemLibrary = CLib + __calling_convention = xdata_reentrant + __code_model = banked + __core = plain + __data_model = large + __dptr_size = 16 + __extended_stack = disabled + __location_for_constants = data + __number_of_dptrs = 1 + __rt_version = 1 + + + + **************************************** + * * + * MODULE MAP * + * * + **************************************** + + + DEFINED ABSOLUTE ENTRIES + ************************************************************************* + + DEFINED ABSOLUTE ENTRIES + PROGRAM MODULE, NAME : ?ABS_ENTRY_MOD + +Absolute parts + ENTRY ADDRESS REF BY + ===== ======= ====== + _FAR22_HEAP_SIZE 00000FFF + _HUGE_HEAP_SIZE 00000FFF + _FAR_HEAP_SIZE 00000FFF + _XDATA_HEAP_SIZE 00000FFF + _XDATA_STACK_SIZE 00000300 + _PDATA_STACK_SIZE 00000000 + _EXTENDED_STACK_SIZE 00000000 + _EXTENDED_STACK_START 00000000 + _IDATA_STACK_SIZE 000000D5 + ?PBANK 00000093 + _NR_OF_VIRTUAL_REGISTERS + 00000010 + _FLASH_LOCK_BITS_END 0001FFFF + _FLASH_LOCK_BITS_START + 0001FFF0 + _BANK3_END 0001E7FF + _BANK3_START 00018000 + _BANK2_END 00017FFF + _BANK2_START 00010000 + _BANK1_END 0000FFFF + _BANK1_START 00008000 + _BANK0_END 00007FFF + _BANK0_START 00000000 + _BLENV_ADDRESS_SPACE_END + 0001F7FF + _BLENV_ADDRESS_SPACE_START + 0001E800 + _SLEEP_CODE_SPACE_END 00007FFF + _SLEEP_CODE_SPACE_START + 00007FF8 + ?ESP 0000009B + ?VB 00000020 ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + _BREG_START 00000000 + ?PBANK_NUMBER 0000001E + _REGISTER_BANK_START 00000000 + ?REGISTER_BANK 00000000 Segment part 6 (CSTARTUP) + _FIRST_BANK_ADDR 00010000 + _NEAR_CODE_START 00000000 + _XDATA0_END 00001EFF + _XDATA0_START 00000001 + _IXDATA0_END 00001EFF + _IXDATA0_START 00000001 + _PDATA0_END 00001EFF + _PDATA0_START 00001E00 + _IDATA0_END 000000FF + _IDATA0_START 00000000 + ?CBANK 0000009F ?RESET_CODE_BANK (CSTARTUP) + Segment part 0 (?BANKED_CODE_SUPPORT) + ?CBANK_MASK 000000FF + _CODEBANK_START 00008000 + _CODEBANK_END 0000FFFF + _NR_OF_BANKS 00000007 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\Libraries\CC2540DB\bin\CC2540_BLE_peri.lib + LIBRARY MODULE, NAME : att_server + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3A4 - 0001A3BA (0x17 bytes), align: 0 + Segment part 6. Intra module refs: ATT_ErrorRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ErrorRsp 0001A3A4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3BB - 0001A3E9 (0x2f bytes), align: 0 + Segment part 8. Intra module refs: ATT_ExchangeMTURsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExchangeMTURsp 0001A3BB + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3EA - 0001A422 (0x39 bytes), align: 0 + Segment part 10. Intra module refs: ATT_FindInfoRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindInfoRsp 0001A3EA + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A423 - 0001A44A (0x28 bytes), align: 0 + Segment part 12. Intra module refs: ATT_FindByTypeValueRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindByTypeValueRsp + 0001A423 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A44B - 0001A472 (0x28 bytes), align: 0 + Segment part 14. Intra module refs: ATT_ReadByTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByTypeRsp 0001A44B + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A473 - 0001A478 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: ATT_ExchangeMTURsp + ATT_FindByTypeValueRsp + ATT_FindInfoRsp + ATT_ReadByGrpTypeRsp + ATT_ReadByTypeRsp + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A479 - 0001A48F (0x17 bytes), align: 0 + Segment part 17. Intra module refs: ATT_ReadRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadRsp 0001A479 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A490 - 0001A4A6 (0x17 bytes), align: 0 + Segment part 19. Intra module refs: ATT_ReadBlobRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadBlobRsp 0001A490 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4A7 - 0001A4BC (0x16 bytes), align: 0 + Segment part 21. Intra module refs: ATT_ReadMultiRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadMultiRsp 0001A4A7 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4BD - 0001A4E3 (0x27 bytes), align: 0 + Segment part 23. Intra module refs: ATT_ReadByGrpTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByGrpTypeRsp 0001A4BD + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4E4 - 0001A4F6 (0x13 bytes), align: 0 + Segment part 25. Intra module refs: ATT_WriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_WriteRsp 0001A4E4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4F7 - 0001A50C (0x16 bytes), align: 0 + Segment part 27. Intra module refs: ATT_PrepareWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_PrepareWriteRsp 0001A4F7 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A50D - 0001A51F (0x13 bytes), align: 0 + Segment part 29. Intra module refs: ATT_ExecuteWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExecuteWriteRsp 0001A50D + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A520 - 0001A52F (0x10 bytes), align: 0 + Segment part 31. Intra module refs: ATT_HandleValueNoti::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueNoti 0001A520 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A530 - 0001A535 (0x6 bytes), align: 0 + Segment part 33. Intra module refs: ATT_HandleValueInd + ATT_HandleValueNoti + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A536 - 0001A539 (0x4 bytes), align: 0 + Segment part 34. Intra module refs: ATT_ExecuteWriteRsp + ATT_WriteRsp + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A53A - 0001A53F (0x6 bytes), align: 0 + Segment part 35. Intra module refs: ATT_ErrorRsp + ATT_PrepareWriteRsp + ATT_ReadBlobRsp + ATT_ReadMultiRsp + ATT_ReadRsp + Segment part 33 + Segment part 34 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A540 - 0001A544 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: ATT_ExchangeMTURsp + ATT_FindByTypeValueRsp + ATT_FindInfoRsp + ATT_ReadByGrpTypeRsp + ATT_ReadByTypeRsp + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A545 - 0001A556 (0x12 bytes), align: 0 + Segment part 37. Intra module refs: ATT_HandleValueInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueInd 0001A545 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004EF - 000004F4 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ErrorRsp::?relay 000004EF gattProcessRxData (gatt_task) + gattServApp_ProcessMsg (gattservapp) + gattServerProcessMsgCB (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004F5 - 000004FA (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExchangeMTURsp::?relay + 000004F5 gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004FB - 00000500 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindInfoRsp::?relay + 000004FB gattProcessFindInfoReq (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000501 - 00000506 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindByTypeValueRsp::?relay + 00000501 gattServApp_ProcessFindByTypeValueReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000507 - 0000050C (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByTypeRsp::?relay + 00000507 gattServApp_ProcessReadByTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000050D - 00000512 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadRsp::?relay 0000050D gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000513 - 00000518 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadBlobRsp::?relay + 00000513 gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000519 - 0000051E (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadMultiRsp::?relay + 00000519 gattServApp_ProcessReadMultiReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000051F - 00000524 (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByGrpTypeRsp::?relay + 0000051F gattServApp_ProcessReadByGrpTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000525 - 0000052A (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_WriteRsp::?relay 00000525 gattServApp_ProcessWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000052B - 00000530 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_PrepareWriteRsp::?relay + 0000052B gattServApp_ProcessPrepareWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000531 - 00000536 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExecuteWriteRsp::?relay + 00000531 gattServApp_ProcessExecuteWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000537 - 0000053C (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueNoti::?relay + 00000537 GATT_Notification (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000053D - 00000542 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueInd::?relay + 0000053D GATT_Indication (gatt_server) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : att_util + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E7D - 00008E8C (0x10 bytes), align: 0 + Segment part 6. Intra module refs: ATT_ConvertUUIDto128 + ENTRY ADDRESS REF BY + ===== ======= ====== + btBaseUUID 00008E7D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012306 - 000123FF (0xfa bytes), align: 0 + Segment part 7. Intra module refs: ATT_ParsePacket::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePacket 00012306 + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012400 - 00012404 (0x5 bytes), align: 0 + Segment part 9. Intra module refs: ATT_ParseFindByTypeValueReq + ATT_ParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012405 - 0001242E (0x2a bytes), align: 0 + Segment part 10. Intra module refs: ATT_BuildErrorRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildErrorRsp 00012405 + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001242F - 00012439 (0xb bytes), align: 0 + Segment part 16. Intra module refs: ATT_BuildExchangeMTURsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001243A - 0001245A (0x21 bytes), align: 0 + Segment part 17. Intra module refs: ATT_ParseExchangeMTUReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExchangeMTUReq + 0001243A + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245B - 0001245C (0x2 bytes), align: 0 + Segment part 19. Intra module refs: ATT_BuildExchangeMTURsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildExchangeMTURsp + 0001245B + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245D - 0001245E (0x2 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 16 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245F - 00012465 (0x7 bytes), align: 0 + Segment part 23. Intra module refs: ATT_ParseExecuteWriteReq + Segment part 22 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012466 - 0001246A (0x5 bytes), align: 0 + Segment part 26. Intra module refs: ATT_BuildErrorRsp + ATT_ParseExchangeMTUReq + ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001246B - 0001248B (0x21 bytes), align: 0 + Segment part 29. Intra module refs: ATT_ParseFindInfoReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindInfoReq 0001246B + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001248C - 0001253D (0xb2 bytes), align: 0 + Segment part 31. Intra module refs: ATT_BuildFindInfoRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindInfoRsp 0001248C + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001253E - 0001254B (0xe bytes), align: 0 + Segment part 33. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001254C - 00012567 (0x1c bytes), align: 0 + Segment part 34. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012568 - 00012568 (0x1 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 34 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012569 - 0001256C (0x4 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001256D - 00012574 (0x8 bytes), align: 0 + Segment part 37. Intra module refs: ATT_BuildFindByTypeValueRsp + Segment part 36 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012575 - 00012575 (0x1 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 34 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012576 - 0001257D (0x8 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001257E - 00012584 (0x7 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 34 + Segment part 39 + Segment part 47 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012585 - 0001258E (0xa bytes), align: 0 + Segment part 43. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001258F - 00012597 (0x9 bytes), align: 0 + Segment part 47. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012598 - 0001265C (0xc5 bytes), align: 0 + Segment part 48. Intra module refs: ATT_ParseFindByTypeValueReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindByTypeValueReq + 00012598 + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001265D - 00012664 (0x8 bytes), align: 0 + Segment part 50. Intra module refs: ATT_CompareUUID + ATT_ParseFindByTypeValueReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012665 - 000126BB (0x57 bytes), align: 0 + Segment part 51. Intra module refs: ATT_BuildFindByTypeValueRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindByTypeValueRsp + 00012665 + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126BC - 000126C0 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126C1 - 000126C8 (0x8 bytes), align: 0 + Segment part 54. Intra module refs: ATT_BuildErrorRsp + ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126C9 - 000126CD (0x5 bytes), align: 0 + Segment part 57. Intra module refs: ATT_ParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126CE - 000126D2 (0x5 bytes), align: 0 + Segment part 58. Intra module refs: ATT_CompareUUID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126D3 - 000126D7 (0x5 bytes), align: 0 + Segment part 59. Intra module refs: ATT_ConvertUUIDto128 + ATT_ParseWriteReq + Segment part 58 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126D8 - 00012754 (0x7d bytes), align: 0 + Segment part 62. Intra module refs: ATT_ParseReadByTypeReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadByTypeReq + 000126D8 + calls direct + XSTACK = 00000004 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012755 - 0001275D (0x9 bytes), align: 0 + Segment part 64. Intra module refs: ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001275E, align: 0 + Segment part 65. Intra module refs: ATT_BuildReadByTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByTypeRsp + 0001275E + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001275E - 00012796 (0x39 bytes), align: 0 + Segment part 67. Intra module refs: ATT_BuildReadByGrpTypeRsp + ATT_BuildReadByTypeRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012797 - 00012798 (0x2 bytes), align: 0 + Segment part 68. Intra module refs: Segment part 67 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012799 - 000127A0 (0x8 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127A1 - 000127C2 (0x22 bytes), align: 0 + Segment part 74. Intra module refs: ATT_ParseReadReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadReq 000127A1 + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127C3 - 000127C9 (0x7 bytes), align: 0 + Segment part 76. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127CA - 000127D1 (0x8 bytes), align: 0 + Segment part 77. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D2 - 000127D7 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D8, align: 0 + Segment part 79. Intra module refs: ATT_BuildReadRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadRsp 000127D8 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D8 - 000127FE (0x27 bytes), align: 0 + Segment part 81. Intra module refs: ATT_BuildReadBlobRsp + ATT_BuildReadMultiRsp + ATT_BuildReadRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127FF - 00012824 (0x26 bytes), align: 0 + Segment part 84. Intra module refs: ATT_BuildPrepareWriteRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012825 - 00012829 (0x5 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 67 + Segment part 84 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001282A - 0001282E (0x5 bytes), align: 0 + Segment part 86. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ATT_ParseReadMultiReq + Segment part 81 + Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001282F - 00012832 (0x4 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 84 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012833 - 00012840 (0xe bytes), align: 0 + Segment part 88. Intra module refs: Segment part 81 + Segment part 87 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012841 - 0001284E (0xe bytes), align: 0 + Segment part 89. Intra module refs: Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001284F - 0001285D (0xf bytes), align: 0 + Segment part 90. Intra module refs: Segment part 54 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001285E - 000128D8 (0x7b bytes), align: 0 + Segment part 91. Intra module refs: ATT_ParseWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseWriteReq 0001285E + calls direct + XSTACK = 00000004 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128D9 - 000128DB (0x3 bytes), align: 0 + Segment part 93. Intra module refs: ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128DC - 000128E0 (0x5 bytes), align: 0 + Segment part 94. Intra module refs: ATT_ConvertUUIDto128 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128E1 - 000128E6 (0x6 bytes), align: 0 + Segment part 95. Intra module refs: ATT_ParseExecuteWriteReq + ATT_ParsePacket + ATT_ParseReadByTypeReq + ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128E7 - 0001290F (0x29 bytes), align: 0 + Segment part 98. Intra module refs: ATT_BuildHandleValueInd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012910 - 00012913 (0x4 bytes), align: 0 + Segment part 99. Intra module refs: Segment part 16 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012914 - 00012927 (0x14 bytes), align: 0 + Segment part 100. Intra module refs: Segment part 89 + Segment part 99 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012928 - 00012928 (0x1 bytes), align: 0 + Segment part 101. Intra module refs: Segment part 100 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012929 - 0001292F (0x7 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 100 + Segment part 101 + Segment part 159 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012930 - 00012951 (0x22 bytes), align: 0 + Segment part 107. Intra module refs: ATT_ParseReadBlobReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadBlobReq 00012930 + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012952 - 00012958 (0x7 bytes), align: 0 + Segment part 109. Intra module refs: ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012959 - 0001297A (0x22 bytes), align: 0 + Segment part 110. Intra module refs: ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001297B - 0001298D (0x13 bytes), align: 0 + Segment part 111. Intra module refs: Segment part 110 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001298E - 00012990 (0x3 bytes), align: 0 + Segment part 112. Intra module refs: ATT_BuildReadBlobRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadBlobRsp 0001298E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012991 - 000129A5 (0x15 bytes), align: 0 + Segment part 118. Intra module refs: ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000129A6 - 00012A15 (0x70 bytes), align: 0 + Segment part 119. Intra module refs: ATT_ParseReadMultiReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadMultiReq 000129A6 + XSTACK = 00000004 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A16 - 00012A19 (0x4 bytes), align: 0 + Segment part 121. Intra module refs: ATT_ParseExecuteWriteReq + ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A1A - 00012A1F (0x6 bytes), align: 0 + Segment part 122. Intra module refs: Segment part 109 + Segment part 121 + Segment part 178 + Segment part 57 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A20 - 00012A22 (0x3 bytes), align: 0 + Segment part 123. Intra module refs: ATT_BuildReadMultiRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadMultiRsp 00012A20 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A23 - 00012A25 (0x3 bytes), align: 0 + Segment part 128. Intra module refs: ATT_BuildReadByGrpTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByGrpTypeRsp + 00012A23 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A26 - 00012A85 (0x60 bytes), align: 0 + Segment part 136. Intra module refs: ATT_ParsePrepareWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePrepareWriteReq + 00012A26 + calls direct + XSTACK = 00000004 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A86 - 00012A92 (0xd bytes), align: 0 + Segment part 138. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A93 - 00012A99 (0x7 bytes), align: 0 + Segment part 139. Intra module refs: ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9A - 00012A9B (0x2 bytes), align: 0 + Segment part 140. Intra module refs: Segment part 139 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9C - 00012A9C (0x1 bytes), align: 0 + Segment part 141. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + Segment part 140 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9D - 00012AA2 (0x6 bytes), align: 0 + Segment part 142. Intra module refs: ATT_ParseFindByTypeValueReq + Segment part 141 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AA3 - 00012AAC (0xa bytes), align: 0 + Segment part 143. Intra module refs: ATT_ParseReadMultiReq + Segment part 139 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AAD - 00012AAD (0x1 bytes), align: 0 + Segment part 144. Intra module refs: Segment part 142 + Segment part 33 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AAE - 00012AB3 (0x6 bytes), align: 0 + Segment part 145. Intra module refs: Segment part 144 + Segment part 186 + Segment part 69 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AB4 - 00012AC4 (0x11 bytes), align: 0 + Segment part 146. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AC5 - 00012ACC (0x8 bytes), align: 0 + Segment part 147. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012ACD - 00012ACF (0x3 bytes), align: 0 + Segment part 148. Intra module refs: ATT_BuildPrepareWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildPrepareWriteRsp + 00012ACD + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AD0 - 00012AD8 (0x9 bytes), align: 0 + Segment part 152. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AD9 - 00012ADC (0x4 bytes), align: 0 + Segment part 157. Intra module refs: ATT_BuildErrorRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012ADD - 00012AE0 (0x4 bytes), align: 0 + Segment part 158. Intra module refs: ATT_BuildErrorRsp + Segment part 157 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AE1 - 00012AE4 (0x4 bytes), align: 0 + Segment part 159. Intra module refs: Segment part 118 + Segment part 158 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AE5 - 00012B14 (0x30 bytes), align: 0 + Segment part 160. Intra module refs: ATT_ParseExecuteWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExecuteWriteReq + 00012AE5 + XSTACK = 00000004 ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B15 - 00012B17 (0x3 bytes), align: 0 + Segment part 164. Intra module refs: ATT_BuildHandleValueInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildHandleValueInd + 00012B15 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B18 - 00012B24 (0xd bytes), align: 0 + Segment part 168. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B25 - 00012B29 (0x5 bytes), align: 0 + Segment part 169. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B2A - 00012B34 (0xb bytes), align: 0 + Segment part 170. Intra module refs: Segment part 169 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B35 - 00012C1D (0xe9 bytes), align: 0 + Segment part 173. Intra module refs: attSendMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + attSendMsg 00012B35 + calls direct + XSTACK = 00000002 ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012C1E - 00012C22 (0x5 bytes), align: 0 + Segment part 175. Intra module refs: ATT_BuildFindInfoRsp + attSendMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012C23 - 00012CD1 (0xaf bytes), align: 0 + Segment part 176. Intra module refs: ATT_CompareUUID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_CompareUUID 00012C23 + calls direct + XSTACK = 00000004 ( 0000001E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012CD2 - 00012CD8 (0x7 bytes), align: 0 + Segment part 178. Intra module refs: ATT_CompareUUID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012CD9 - 00012D36 (0x5e bytes), align: 0 + Segment part 179. Intra module refs: ATT_ConvertUUIDto128::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ConvertUUIDto128 00012CD9 + calls direct + XSTACK = 0000001C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D37 - 00012D3F (0x9 bytes), align: 0 + Segment part 181. Intra module refs: ATT_ConvertUUIDto128 + ATT_ParseFindByTypeValueReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D40 - 00012D43 (0x4 bytes), align: 0 + Segment part 186. Intra module refs: ATT_ConvertUUIDto128 + Segment part 81 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000543 - 00000548 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePacket::?relay + 00000543 gattProcessRxData (gatt_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000549 - 0000054E (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildErrorRsp::?relay + 00000549 ATT_ErrorRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000054F - 00000554 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExchangeMTUReq::?relay + 0000054F Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000555 - 0000055A (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildExchangeMTURsp::?relay + 00000555 ATT_ExchangeMTURsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000055B - 00000560 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindInfoReq::?relay + 0000055B Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000561 - 00000566 (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindInfoRsp::?relay + 00000561 ATT_FindInfoRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000567 - 0000056C (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindByTypeValueReq::?relay + 00000567 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000056D - 00000572 (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindByTypeValueRsp::?relay + 0000056D ATT_FindByTypeValueRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000573 - 00000578 (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadByTypeReq::?relay + 00000573 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000579 - 0000057E (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByTypeRsp::?relay + 00000579 ATT_ReadByTypeRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000057F - 00000584 (0x6 bytes), align: 0 + Segment part 75. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadReq::?relay + 0000057F Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000585 - 0000058A (0x6 bytes), align: 0 + Segment part 80. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadRsp::?relay + 00000585 ATT_ReadRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000058B - 00000590 (0x6 bytes), align: 0 + Segment part 92. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseWriteReq::?relay + 0000058B Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000591 - 00000596 (0x6 bytes), align: 0 + Segment part 108. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadBlobReq::?relay + 00000591 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000597 - 0000059C (0x6 bytes), align: 0 + Segment part 113. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadBlobRsp::?relay + 00000597 ATT_ReadBlobRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000059D - 000005A2 (0x6 bytes), align: 0 + Segment part 120. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadMultiReq::?relay + 0000059D Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005A3 - 000005A8 (0x6 bytes), align: 0 + Segment part 124. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadMultiRsp::?relay + 000005A3 ATT_ReadMultiRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005A9 - 000005AE (0x6 bytes), align: 0 + Segment part 129. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByGrpTypeRsp::?relay + 000005A9 ATT_ReadByGrpTypeRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005AF - 000005B4 (0x6 bytes), align: 0 + Segment part 137. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePrepareWriteReq::?relay + 000005AF Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005B5 - 000005BA (0x6 bytes), align: 0 + Segment part 149. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildPrepareWriteRsp::?relay + 000005B5 ATT_PrepareWriteRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005BB - 000005C0 (0x6 bytes), align: 0 + Segment part 161. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExecuteWriteReq::?relay + 000005BB Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005C1 - 000005C6 (0x6 bytes), align: 0 + Segment part 165. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildHandleValueInd::?relay + 000005C1 Segment part 33 (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005C7 - 000005CC (0x6 bytes), align: 0 + Segment part 174. + ENTRY ADDRESS REF BY + ===== ======= ====== + attSendMsg::?relay 000005C7 Segment part 16 (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005CD - 000005D2 (0x6 bytes), align: 0 + Segment part 177. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_CompareUUID::?relay + 000005CD GATTServApp_ReadAttr (gattservapp) + Segment part 39 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005D3 - 000005D8 (0x6 bytes), align: 0 + Segment part 180. Intra module refs: ATT_CompareUUID + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ConvertUUIDto128::?relay + 000005D3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E7D - 00008E8C (0x10 bytes), align: 0 + Segment part 192. Intra module refs: btBaseUUID + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_configmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000E2D - 00000E2D (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_ParamsInit + gapIncSignCounter + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAppTaskID 00000E2D gapProcessConnectionCompleteEvt (gap_linkmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000301 - 00000301 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAP_ParamsInit + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProfileRole 00000301 GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + SM_ResponderInit (sm_rsppairing) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessOSALMsg (gap_task) + smProcessDataMsg (sm_pairing) + smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000302 - 00000302 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: gapGetDevAddress + gapGetDevAddressMode + gapProcessNewAddr + gapProcessRandomAddrComplete + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDeviceAddrMode 00000302 GAP_MakeDiscoverable (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000303 - 00000304 (0x2 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPrivateAddrChangeTimeout + 00000303 GAP_EndDiscoverable (gap_peridevmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000305 - 00000305 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: gapProcessRandomAddrComplete + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAutoAdvPrivateAddrChange + 00000305 GAP_ProcessEvent (gap_task) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000306 - 00000315 (0x10 bytes), align: 0 + Segment part 12. Intra module refs: GAP_ParamsInit + GAP_SecParamsInit + Segment part 58 + gapGetDevAddress + gapGetIRK + gapGetSRK + gapReadBD_ADDRStatus + gapReadBufSizeCmdStatus + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E2E - 00000E79 (0x4c bytes), align: 0 + Segment part 13. Intra module refs: Segment part 22 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000316 - 0000031B (0x6 bytes), align: 0 + Segment part 15. Intra module refs: gapGetDevAddress + gapProcessNewAddr + gapProcessRandomAddrComplete + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017394 - 000173BB (0x28 bytes), align: 0 + Segment part 18. Intra module refs: GAP_SetParamValue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SetParamValue 00017394 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000173BC - 000173D7 (0x1c bytes), align: 0 + Segment part 20. Intra module refs: GAP_GetParamValue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_GetParamValue 000173BC + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000173D8 - 000173E9 (0x12 bytes), align: 0 + Segment part 22. Intra module refs: GAP_GetParamValue + GAP_SetParamValue + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000173EA - 0001741B (0x32 bytes), align: 0 + Segment part 23. Intra module refs: GAP_ParamsInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ParamsInit 000173EA + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001741C - 00017420 (0x5 bytes), align: 0 + Segment part 25. Intra module refs: GAP_ParamsInit + GAP_SecParamsInit + gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017421 - 0001747B (0x5b bytes), align: 0 + Segment part 26. Intra module refs: GAP_SecParamsInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SecParamsInit 00017421 + calls direct + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001747C - 00017482 (0x7 bytes), align: 0 + Segment part 28. Intra module refs: GAP_SecParamsInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017483 - 00017488 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: GAP_GetParamValue + Segment part 28 + Segment part 41 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017489 - 000174CC (0x44 bytes), align: 0 + Segment part 32. Intra module refs: gapReadBD_ADDRStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBD_ADDRStatus 00017489 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000174CD - 000174D1 (0x5 bytes), align: 0 + Segment part 34. Intra module refs: gapProcessNewAddr + gapReadBD_ADDRStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000174D2 - 0001751C (0x4b bytes), align: 0 + Segment part 35. Intra module refs: gapReadBufSizeCmdStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBufSizeCmdStatus + 000174D2 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001751D - 0001755A (0x3e bytes), align: 0 + Segment part 37. Intra module refs: gapProcessNewAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessNewAddr 0001751D + calls direct + XSTACK = 00000014 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001755B - 0001758D (0x33 bytes), align: 0 + Segment part 39. Intra module refs: gapAddAddrAdj::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAddAddrAdj 0001755B + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001758E - 00017590 (0x3 bytes), align: 0 + Segment part 41. Intra module refs: gapGetIRK + gapGetSRK + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017591 - 00017597 (0x7 bytes), align: 0 + Segment part 42. Intra module refs: GAP_GetParamValue + GAP_SetParamValue + Segment part 41 + gapAddAddrAdj + gapDetermineAddrType + gapGetDevAddress + gapGetDevAddressMode + gapGetSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017598 - 000175C5 (0x2e bytes), align: 0 + Segment part 43. Intra module refs: gapDetermineAddrType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDetermineAddrType 00017598 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000175C6 - 0001764E (0x89 bytes), align: 0 + Segment part 45. Intra module refs: gapProcessRandomAddrComplete::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessRandomAddrComplete + 000175C6 + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001764F - 00017653 (0x5 bytes), align: 0 + Segment part 47. Intra module refs: gapIncSignCounter + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017654 - 00017654 (0x1 bytes), align: 0 + Segment part 48. Intra module refs: gapProcessRandomAddrComplete + gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017655 - 0001765A (0x6 bytes), align: 0 + Segment part 49. Intra module refs: GAP_SecParamsInit + Segment part 48 + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001765B - 00017664 (0xa bytes), align: 0 + Segment part 50. Intra module refs: gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017665 - 0001766C (0x8 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + gapUpdateConnSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001766D - 00017676 (0xa bytes), align: 0 + Segment part 52. Intra module refs: gapGetSRK::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSRK 0001766D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017677 - 00017683 (0xd bytes), align: 0 + Segment part 54. Intra module refs: gapGetSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSignCounter 00017677 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017684 - 000176AA (0x27 bytes), align: 0 + Segment part 56. Intra module refs: gapIncSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIncSignCounter 00017684 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000176AB - 000176B6 (0xc bytes), align: 0 + Segment part 58. Intra module refs: gapGetSignCounter + gapIncSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000176B7 - 00017778 (0xc2 bytes), align: 0 + Segment part 59. Intra module refs: gapUpdateConnSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUpdateConnSignCounter + 000176B7 + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017779 - 00017784 (0xc bytes), align: 0 + Segment part 61. Intra module refs: gapGetDevAddressMode::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddressMode 00017779 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017785 - 0001779C (0x18 bytes), align: 0 + Segment part 63. Intra module refs: gapGetDevAddress::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddress 00017785 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001779D - 000177A6 (0xa bytes), align: 0 + Segment part 65. Intra module refs: gapGetIRK::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetIRK 0001779D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000177A7 - 00017814 (0x6e bytes), align: 0 + Segment part 67. Intra module refs: gapSendDeviceInitDoneEvent::?relay + LOCAL ADDRESS + ===== ======= + gapSendDeviceInitDoneEvent + 000177A7 + calls direct + XSTACK = 0000000A ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017815 - 00017824 (0x10 bytes), align: 0 + Segment part 69. Intra module refs: gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017825 - 00017828 (0x4 bytes), align: 0 + Segment part 72. Intra module refs: gapProcessRandomAddrComplete + gapUpdateConnSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017829 - 00017829 (0x1 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 72 + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001782A - 0001782C (0x3 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001782D - 00017832 (0x6 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + gapProcessNewAddr + gapReadBD_ADDRStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017833 - 0001783B (0x9 bytes), align: 0 + Segment part 76. Intra module refs: gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000013A - 0000013A (0x1 bytes), align: 0 + Segment part 7. Intra module refs: gapAppTaskID + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000013B - 00000186 (0x4c bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F7E - 00008F81 (0x4 bytes), align: 0 + Segment part 16. Intra module refs: GAP_MakeDiscoverable (gap_peridevmgr) + gapProcessRandomAddrComplete + gapWriteAdvEnableStatus (gap_peridevmgr) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ea60 00008F7E + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F76 - 00008F79 (0x4 bytes), align: 0 + Segment part 17. Intra module refs: LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_TxData (ll) + gapIncSignCounter + llFindStartType (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1 00008F76 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005D9 - 000005DE (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SetParamValue::?relay + 000005D9 ?Subroutine4 (wimu) + GAPBondMgr_Register (gapbondmgr) + GAPRole_SetParameter (peripheral) + WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005DF - 000005E4 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: gapUpdateConnSignCounter + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_GetParamValue::?relay + 000005DF GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + SM_StartPairing (sm_pairing) + Segment part 40 (gap_peridevmgr) + Segment part 46 (gap_peridevmgr) + Segment part 88 (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + smStartRspTimer (sm_mgr) + smpParsePairingReq (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005E5 - 000005EA (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ParamsInit::?relay + 000005E5 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005EB - 000005F0 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SecParamsInit::?relay + 000005EB GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005F1 - 000005F6 (0x6 bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBD_ADDRStatus::?relay + 000005F1 gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005F7 - 000005FC (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBufSizeCmdStatus::?relay + 000005F7 gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005FD - 00000602 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessNewAddr::?relay + 000005FD GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000603 - 00000608 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: gapProcessNewAddr + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAddAddrAdj::?relay 00000603 gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000609 - 0000060E (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDetermineAddrType::?relay + 00000609 gapProcessConnectionCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000060F - 00000614 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessRandomAddrComplete::?relay + 0000060F gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000615 - 0000061A (0x6 bytes), align: 0 + Segment part 53. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSRK::?relay 00000615 SM_GenerateAuthenSig (sm_mgr) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000061B - 00000620 (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSignCounter::?relay + 0000061B SM_GenerateAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000621 - 00000626 (0x6 bytes), align: 0 + Segment part 57. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIncSignCounter::?relay + 00000621 SM_GenerateAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000627 - 0000062C (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUpdateConnSignCounter::?relay + 00000627 SM_VerifyAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000062D - 00000632 (0x6 bytes), align: 0 + Segment part 62. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddressMode::?relay + 0000062D smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000633 - 00000638 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddress::?relay + 00000633 smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000639 - 0000063E (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetIRK::?relay 00000639 GAP_ProcessEvent (gap_task) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000063F - 00000644 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: gapReadBD_ADDRStatus + gapReadBufSizeCmdStatus + LOCAL ADDRESS + ===== ======= + gapSendDeviceInitDoneEvent::?relay + 0000063F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F7E - 00008F81 (0x4 bytes), align: 0 + Segment part 77. Intra module refs: __Constant_ea60 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F76 - 00008F79 (0x4 bytes), align: 0 + Segment part 78. Intra module refs: __Constant_1 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_devmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000031C - 0000031D (0x2 bytes), align: 0 + Segment part 7. Intra module refs: gapIsAdvertising + ENTRY ADDRESS REF BY + ===== ======= ====== + pGapAdvertState 0000031C GAP_MakeDiscoverable (gap_peridevmgr) + Segment part 41 (gap_peridevmgr) + Segment part 48 (gap_peridevmgr) + Segment part 87 (gap_peridevmgr) + Segment part 99 (gap_peridevmgr) + gapFreeAdvertState (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD94 - 0001AD9A (0x7 bytes), align: 0 + Segment part 8. Intra module refs: GAP_ResolvePrivateAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ResolvePrivateAddr + 0001AD94 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD9B - 0001ADA1 (0x7 bytes), align: 0 + Segment part 10. Intra module refs: GAP_ResolvePrivateAddr + gapIsAdvertising + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ADA2 - 0001ADB9 (0x18 bytes), align: 0 + Segment part 11. Intra module refs: gapIsAdvertising::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIsAdvertising 0001ADA2 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ADBA - 0001ADD1 (0x18 bytes), align: 0 + Segment part 15. Intra module refs: gapValidADType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapValidADType 0001ADBA + XSTACK = 00000012 ( 00000000 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ADD2 - 0001AE6A (0x99 bytes), align: 0 + Segment part 17. Intra module refs: gapFindADType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFindADType 0001ADD2 + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000645 - 0000064A (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ResolvePrivateAddr::?relay + 00000645 gapBondMgrResolvePrivateAddr (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000064B - 00000650 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIsAdvertising::?relay + 0000064B GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000651 - 00000656 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: gapFindADType + ENTRY ADDRESS REF BY + ===== ======= ====== + gapValidADType::?relay + 00000651 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000657 - 0000065C (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFindADType::?relay 00000657 isLimitedDiscoverableMode (gap_peridevmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_linkmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000031E - 0000031F (0x2 bytes), align: 0 + Segment part 6. Intra module refs: gapFreeEstLink + gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + pEstLink 0000031E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000320 - 00000321 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: GAP_Authenticate + Segment part 102 + Segment part 108 + Segment part 111 + Segment part 25 + Segment part 49 + gapFreeAuthLink + gapPairingCompleteCB + sendAuthEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + pAuthLink 00000320 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000322 - 00000323 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: GAP_TerminateLinkReq + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnCentralConnCBs 00000322 gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000324 - 00000324 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: GAP_TerminateLinkReq + gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE96 - 0000BF1B (0x86 bytes), align: 0 + Segment part 14. Intra module refs: GAP_TerminateLinkReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateLinkReq 0000BE96 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF1C - 0000BF20 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: GAP_TerminateAuth + GAP_TerminateLinkReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF21 - 0000BF25 (0x5 bytes), align: 0 + Segment part 17. Intra module refs: GAP_TerminateLinkReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF26 - 0000BF33 (0xe bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF34 - 0000BFA2 (0x6f bytes), align: 0 + Segment part 19. Intra module refs: GAP_Signable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Signable 0000BF34 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFA3 - 0000BFA5 (0x3 bytes), align: 0 + Segment part 21. Intra module refs: GAP_Authenticate + GAP_Signable + gapPairingCompleteCB + gapPasskeyNeededCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFA6 - 0000BFAB (0x6 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 21 + gapPairingCompleteCB + sendAuthEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFAC - 0000C0A8 (0xfd bytes), align: 0 + Segment part 23. Intra module refs: GAP_Authenticate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Authenticate 0000BFAC + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0A9 - 0000C0AE (0x6 bytes), align: 0 + Segment part 25. Intra module refs: GAP_Authenticate + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0AF - 0000C0B4 (0x6 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0B5 - 0000C0BA (0x6 bytes), align: 0 + Segment part 27. Intra module refs: GAP_Authenticate + GAP_Bond + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0BB - 0000C0C0 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: Segment part 27 + gapProcessConnUpdateCompleteEvt + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0C1 - 0000C0FA (0x3a bytes), align: 0 + Segment part 29. Intra module refs: GAP_TerminateAuth::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateAuth 0000C0C1 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0FB - 0000C19E (0xa4 bytes), align: 0 + Segment part 33. Intra module refs: GAP_PasscodeUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PasscodeUpdate 0000C0FB + calls direct + XSTACK = 00000016 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C19F - 0000C1A3 (0x5 bytes), align: 0 + Segment part 35. Intra module refs: GAP_Bond + GAP_PasscodeUpdate + gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C1A4 - 0000C278 (0xd5 bytes), align: 0 + Segment part 36. Intra module refs: GAP_Bond::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Bond 0000C1A4 + calls direct + XSTACK = 00000001 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C279 - 0000C3CD (0x155 bytes), align: 0 + Segment part 38. Intra module refs: gapProcessConnectionCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnectionCompleteEvt + 0000C279 + calls direct + XSTACK = 00000000 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3CE - 0000C3D1 (0x4 bytes), align: 0 + Segment part 40. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3D2 - 0000C3D6 (0x5 bytes), align: 0 + Segment part 41. Intra module refs: GAP_Bond + Segment part 40 + gapProcessConnectionCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3D7 - 0000C3DC (0x6 bytes), align: 0 + Segment part 42. Intra module refs: GAP_Bond + gapPairingCompleteCB + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3DD - 0000C433 (0x57 bytes), align: 0 + Segment part 43. Intra module refs: gapProcessConnUpdateCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnUpdateCompleteEvt + 0000C3DD + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C434 - 0000C4A3 (0x70 bytes), align: 0 + Segment part 45. Intra module refs: gapProcessDisconnectCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessDisconnectCompleteEvt + 0000C434 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4A4 - 0000C4A8 (0x5 bytes), align: 0 + Segment part 47. Intra module refs: GAP_Authenticate + GAP_Signable + gapProcessDisconnectCompleteEvt + sendTerminateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4A9 - 0000C4AF (0x7 bytes), align: 0 + Segment part 48. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4B0 - 0000C4B2 (0x3 bytes), align: 0 + Segment part 49. Intra module refs: GAP_Authenticate + gapFreeAuthLink + gapPairingCompleteCB + gapProcessDisconnectCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4B3 - 0000C4BA (0x8 bytes), align: 0 + Segment part 50. Intra module refs: GAP_TerminateLinkReq + Segment part 49 + gapFreeEstLink + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4BB - 0000C591 (0xd7 bytes), align: 0 + Segment part 51. Intra module refs: sendEstLinkEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sendEstLinkEvent 0000C4BB + calls direct + XSTACK = 00000020 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C592 - 0000C596 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: gapPairingCompleteCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C597 - 0000C5A1 (0xb bytes), align: 0 + Segment part 54. Intra module refs: GAP_Signable + gapPairingCompleteCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5A2 - 0000C5E5 (0x44 bytes), align: 0 + Segment part 55. Intra module refs: sendTerminateEvent::?relay + LOCAL ADDRESS + ===== ======= + sendTerminateEvent 0000C5A2 + calls direct + XSTACK = 00000016 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5E6 - 0000C5EE (0x9 bytes), align: 0 + Segment part 57. Intra module refs: sendTerminateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5EF - 0000C660 (0x72 bytes), align: 0 + Segment part 58. Intra module refs: gapSendLinkUpdateEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendLinkUpdateEvent + 0000C5EF + calls direct + XSTACK = 0000000D ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C661 - 0000C670 (0x10 bytes), align: 0 + Segment part 60. Intra module refs: gapSendLinkUpdateEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C671 - 0000C67C (0xc bytes), align: 0 + Segment part 61. Intra module refs: GAP_TerminateLinkReq + gapSendLinkUpdateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C67D - 0000C6A0 (0x24 bytes), align: 0 + Segment part 62. Intra module refs: disconnectNext::?relay + LOCAL ADDRESS + ===== ======= + disconnectNext 0000C67D + calls direct + XSTACK = 00000016 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C6A1 - 0000C819 (0x179 bytes), align: 0 + Segment part 64. Intra module refs: sendAuthEvent::?relay + LOCAL ADDRESS + ===== ======= + sendAuthEvent 0000C6A1 + calls direct + XSTACK = 0000001A ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C81A - 0000C81E (0x5 bytes), align: 0 + Segment part 66. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C81F - 0000C823 (0x5 bytes), align: 0 + Segment part 67. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C824 - 0000C82D (0xa bytes), align: 0 + Segment part 68. Intra module refs: Segment part 67 + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C82E - 0000C833 (0x6 bytes), align: 0 + Segment part 69. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C834 - 0000C849 (0x16 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 69 + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C84A - 0000C84F (0x6 bytes), align: 0 + Segment part 71. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C850 - 0000C853 (0x4 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + disconnectNext + gapProcessConnUpdateCompleteEvt + gapProcessConnectionCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C854 - 0000C859 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 106 + Segment part 48 + Segment part 72 + Segment part 75 + Segment part 81 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C85A - 0000C861 (0x8 bytes), align: 0 + Segment part 74. Intra module refs: gapPairingCompleteCB + gapSendLinkUpdateEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C862 - 0000C875 (0x14 bytes), align: 0 + Segment part 75. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C876 - 0000C8AF (0x3a bytes), align: 0 + Segment part 76. Intra module refs: gapFreeAuthLink::?relay + LOCAL ADDRESS + ===== ======= + gapFreeAuthLink 0000C876 + calls direct + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8B0 - 0000C8B6 (0x7 bytes), align: 0 + Segment part 78. Intra module refs: gapFreeAuthLink + gapFreeEstLink + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8B7 - 0000C8D1 (0x1b bytes), align: 0 + Segment part 79. Intra module refs: gapFreeEstLink::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFreeEstLink 0000C8B7 + calls direct + XSTACK = 00000016 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8D2 - 0000C8D8 (0x7 bytes), align: 0 + Segment part 81. Intra module refs: gapFreeAuthLink + gapFreeEstLink + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8D9 - 0000C944 (0x6c bytes), align: 0 + Segment part 82. Intra module refs: gapSendBondCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendBondCompleteEvent + 0000C8D9 + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C945 - 0000C94F (0xb bytes), align: 0 + Segment part 84. Intra module refs: GAP_Signable + gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C950 - 0000C959 (0xa bytes), align: 0 + Segment part 85. Intra module refs: gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C95A - 0000C9FF (0xa6 bytes), align: 0 + Segment part 86. Intra module refs: gapSendPairingReqEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendPairingReqEvent + 0000C95A + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA00 - 0000CA0E (0xf bytes), align: 0 + Segment part 88. Intra module refs: gapSendPairingReqEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA0F - 0000CA16 (0x8 bytes), align: 0 + Segment part 89. Intra module refs: gapPasskeyNeededCB + gapSendLinkUpdateEvent + gapSendPairingReqEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA17 - 0000CA1A (0x4 bytes), align: 0 + Segment part 90. Intra module refs: gapSendPairingReqEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA1B - 0000CA1E (0x4 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + Segment part 93 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA1F - 0000CA27 (0x9 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 91 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA28 - 0000CA2C (0x5 bytes), align: 0 + Segment part 93. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA2D - 0000CA36 (0xa bytes), align: 0 + Segment part 94. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA37 - 0000CA3C (0x6 bytes), align: 0 + Segment part 95. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA3D - 0000CA43 (0x7 bytes), align: 0 + Segment part 96. Intra module refs: Segment part 94 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA44 - 0000CAFD (0xba bytes), align: 0 + Segment part 97. Intra module refs: gapPasskeyNeededCB::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPasskeyNeededCB 0000CA44 + calls direct + XSTACK = 00000000 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CAFE - 0000CB09 (0xc bytes), align: 0 + Segment part 99. Intra module refs: gapPasskeyNeededCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CB0A - 0000CCDE (0x1d5 bytes), align: 0 + Segment part 100. Intra module refs: gapPairingCompleteCB::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPairingCompleteCB 0000CB0A + calls direct + XSTACK = 00000008 ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CCDF - 0000CCEC (0xe bytes), align: 0 + Segment part 102. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CCED - 0000CCEF (0x3 bytes), align: 0 + Segment part 103. Intra module refs: gapPasskeyNeededCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CCF0 - 0000CCF4 (0x5 bytes), align: 0 + Segment part 104. Intra module refs: GAP_Bond + GAP_Signable + Segment part 103 + gapPairingCompleteCB + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CCF5 - 0000CCFA (0x6 bytes), align: 0 + Segment part 105. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CCFB - 0000CD00 (0x6 bytes), align: 0 + Segment part 106. Intra module refs: GAP_Bond + Segment part 105 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD01 - 0000CD12 (0x12 bytes), align: 0 + Segment part 107. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD13 - 0000CD18 (0x6 bytes), align: 0 + Segment part 108. Intra module refs: gapFreeAuthLink + gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD19 - 0000CD22 (0xa bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + gapFreeAuthLink + gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD23 - 0000CD2E (0xc bytes), align: 0 + Segment part 110. Intra module refs: Segment part 109 + Segment part 112 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD2F - 0000CD34 (0x6 bytes), align: 0 + Segment part 111. Intra module refs: gapPairingCompleteCB + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD35 - 0000CD3E (0xa bytes), align: 0 + Segment part 112. Intra module refs: Segment part 111 + gapPairingCompleteCB + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F72 - 00008F75 (0x4 bytes), align: 0 + Segment part 12. Intra module refs: _formatted_write (?largewr) + llScheduler (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_a 00008F72 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000065D - 00000662 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateLinkReq::?relay + 0000065D GAPRole_TerminateConnection (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000663 - 00000668 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Signable::?relay 00000663 GAPBondMgr_LinkEst (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000669 - 0000066E (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Authenticate::?relay + 00000669 gapBondMgrAuthenticate (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000066F - 00000674 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateAuth::?relay + 0000066F GAPBondMgr_ProcessGAPMsg (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000675 - 0000067A (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PasscodeUpdate::?relay + 00000675 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000067B - 00000680 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Bond::?relay 0000067B gapBondMgrBondReq (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000681 - 00000686 (0x6 bytes), align: 0 + Segment part 39. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnectionCompleteEvt::?relay + 00000681 gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000687 - 0000068C (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnUpdateCompleteEvt::?relay + 00000687 gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000068D - 00000692 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessDisconnectCompleteEvt::?relay + 0000068D gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000693 - 00000698 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + sendEstLinkEvent::?relay + 00000693 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000699 - 0000069E (0x6 bytes), align: 0 + Segment part 56. Intra module refs: gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + LOCAL ADDRESS + ===== ======= + sendTerminateEvent::?relay + 00000699 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000069F - 000006A4 (0x6 bytes), align: 0 + Segment part 59. Intra module refs: gapProcessConnUpdateCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendLinkUpdateEvent::?relay + 0000069F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006A5 - 000006AA (0x6 bytes), align: 0 + Segment part 63. Intra module refs: GAP_TerminateLinkReq + gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + LOCAL ADDRESS + ===== ======= + disconnectNext::?relay + 000006A5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006AB - 000006B0 (0x6 bytes), align: 0 + Segment part 65. Intra module refs: gapPairingCompleteCB + LOCAL ADDRESS + ===== ======= + sendAuthEvent::?relay 000006AB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006B1 - 000006B6 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + sendAuthEvent + LOCAL ADDRESS + ===== ======= + gapFreeAuthLink::?relay + 000006B1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006B7 - 000006BC (0x6 bytes), align: 0 + Segment part 80. Intra module refs: gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFreeEstLink::?relay + 000006B7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006BD - 000006C2 (0x6 bytes), align: 0 + Segment part 83. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendBondCompleteEvent::?relay + 000006BD smProcessEncryptChange (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006C3 - 000006C8 (0x6 bytes), align: 0 + Segment part 87. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendPairingReqEvent::?relay + 000006C3 smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006C9 - 000006CE (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPasskeyNeededCB::?relay + 000006C9 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006CF - 000006D4 (0x6 bytes), align: 0 + Segment part 101. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPairingCompleteCB::?relay + 000006CF smEndPairing (sm_pairing) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F72 - 00008F75 (0x4 bytes), align: 0 + Segment part 117. Intra module refs: __Constant_a + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_peridevmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000E7A - 00000E7A (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_UpdateAdvertisingData + gapWriteAdvDataStatus + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000325 - 00000326 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GAP_MakeDiscoverable + GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 35 + Segment part 76 + isLimitedDiscoverableMode + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000327 - 00000328 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 75 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000329 - 0000032A (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 58 + gapProcessAdvertisingEvt + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E7B - 00000E80 (0x6 bytes), align: 0 + Segment part 12. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001574E - 0001581F (0xd2 bytes), align: 0 + Segment part 16. Intra module refs: GAP_MakeDiscoverable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_MakeDiscoverable 0001574E + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015820 - 000158C8 (0xa9 bytes), align: 0 + Segment part 18. Intra module refs: GAP_UpdateAdvertisingData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_UpdateAdvertisingData + 00015820 + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000158C9 - 00015904 (0x3c bytes), align: 0 + Segment part 20. Intra module refs: GAP_EndDiscoverable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_EndDiscoverable 000158C9 + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015905 - 0001590B (0x7 bytes), align: 0 + Segment part 31. Intra module refs: gapFreeAdvertState + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001590C - 00015985 (0x7a bytes), align: 0 + Segment part 32. Intra module refs: GAP_PeriDevMgrInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PeriDevMgrInit 0001590C + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015986 - 0001598A (0x5 bytes), align: 0 + Segment part 34. Intra module refs: GAP_EndDiscoverable + GAP_PeriDevMgrInit + gapSetAdvParamsStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001598B - 00015998 (0xe bytes), align: 0 + Segment part 35. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015999 - 00015A24 (0x8c bytes), align: 0 + Segment part 36. Intra module refs: gapPeriProcessHCICmdCompleteEvt::?relay + LOCAL ADDRESS + ===== ======= + gapPeriProcessHCICmdCompleteEvt + 00015999 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015A25 - 00015AEA (0xc6 bytes), align: 0 + Segment part 38. Intra module refs: gapSetAdvParams::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParams 00015A25 + calls direct, is indirectly called + XSTACK = 0000000C ( 00000014 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015AEB - 00015AF8 (0xe bytes), align: 0 + Segment part 40. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015AF9 - 00015B05 (0xd bytes), align: 0 + Segment part 41. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B06 - 00015B34 (0x2f bytes), align: 0 + Segment part 42. Intra module refs: gapSetAdvParamsStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParamsStatus 00015B06 + calls direct + XSTACK = 0000000A ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B35 - 00015C0F (0xdb bytes), align: 0 + Segment part 44. Intra module refs: gapWriteAdvEnableStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvEnableStatus + 00015B35 + calls direct + XSTACK = 0000000A ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C10 - 00015C1E (0xf bytes), align: 0 + Segment part 46. Intra module refs: gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C1F - 00015C1F (0x1 bytes), align: 0 + Segment part 47. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C20 - 00015C25 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C26 - 00015C2A (0x5 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + gapSetAdvParams + gapSetAdvParamsStatus + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C2B - 00015C30 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: GAP_MakeDiscoverable + Segment part 41 + Segment part 49 + Segment part 96 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C31 - 00015C6B (0x3b bytes), align: 0 + Segment part 51. Intra module refs: gapWriteAdvDataStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvDataStatus 00015C31 + calls direct + XSTACK = 0000000A ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C6C - 00015C70 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: gapPeriProcessHCICmdCompleteEvt + gapWriteAdvDataStatus + isLimitedDiscoverableMode + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C71 - 00015C78 (0x8 bytes), align: 0 + Segment part 54. Intra module refs: gapSendMakeDiscEvent + gapWriteAdvDataStatus + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C79 - 00015D16 (0x9e bytes), align: 0 + Segment part 55. Intra module refs: gapProcessAdvertisingEvt::?relay + LOCAL ADDRESS + ===== ======= + gapProcessAdvertisingEvt + 00015C79 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D17 - 00015D1E (0x8 bytes), align: 0 + Segment part 57. Intra module refs: GAP_EndDiscoverable + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D1F - 00015D2E (0x10 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 57 + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D2F - 00015D33 (0x5 bytes), align: 0 + Segment part 61. Intra module refs: GAP_MakeDiscoverable + gapProcessAdvertisingEvt + gapSendMakeDiscEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D34 - 00015D3C (0x9 bytes), align: 0 + Segment part 64. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D3D - 00015D42 (0x6 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 100 + gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D43 - 00015D4B (0x9 bytes), align: 0 + Segment part 73. Intra module refs: GAP_MakeDiscoverable + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D4C - 00015D5B (0x10 bytes), align: 0 + Segment part 75. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D5C - 00015D6B (0x10 bytes), align: 0 + Segment part 76. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D6C - 00015D6F (0x4 bytes), align: 0 + Segment part 81. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D70 - 00015D7A (0xb bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + Segment part 87 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D7B - 00015DB3 (0x39 bytes), align: 0 + Segment part 85. Intra module refs: gapSendMakeDiscEvent::?relay + LOCAL ADDRESS + ===== ======= + gapSendMakeDiscEvent 00015D7B + calls direct + XSTACK = 00000014 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DB4 - 00015DBE (0xb bytes), align: 0 + Segment part 87. Intra module refs: gapSendMakeDiscEvent + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DBF - 00015DD7 (0x19 bytes), align: 0 + Segment part 88. Intra module refs: gapFreeAdvertState::?relay + LOCAL ADDRESS + ===== ======= + gapFreeAdvertState 00015DBF + calls direct + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DD8 - 00015DDB (0x4 bytes), align: 0 + Segment part 90. Intra module refs: GAP_PeriDevMgrInit + gapFreeAdvertState + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DDC - 00015DE4 (0x9 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 35 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DE5 - 00015E40 (0x5c bytes), align: 0 + Segment part 92. Intra module refs: isLimitedDiscoverableMode::?relay + LOCAL ADDRESS + ===== ======= + isLimitedDiscoverableMode + 00015DE5 + calls direct + XSTACK = 00000014 ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E41 - 00015E42 (0x2 bytes), align: 0 + Segment part 94. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E43 - 00015E45 (0x3 bytes), align: 0 + Segment part 95. Intra module refs: Segment part 94 + isLimitedDiscoverableMode + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E46 - 00015E4A (0x5 bytes), align: 0 + Segment part 96. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + Segment part 95 + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E4B - 00015E4C (0x2 bytes), align: 0 + Segment part 97. Intra module refs: GAP_MakeDiscoverable + gapSendMakeDiscEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E4D - 00015E50 (0x4 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 97 + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E51 - 00015E53 (0x3 bytes), align: 0 + Segment part 99. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + Segment part 98 + gapFreeAdvertState + gapProcessAdvertisingEvt + gapSetAdvParams + gapSetAdvParamsStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E54 - 00015E59 (0x6 bytes), align: 0 + Segment part 100. Intra module refs: GAP_MakeDiscoverable + GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 99 + gapProcessAdvertisingEvt + isLimitedDiscoverableMode + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000187 - 00000187 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000188 - 0000018D (0x6 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F6E - 00008F71 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: gapWriteAdvEnableStatus + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3e8 00008F6E + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006D5 - 000006DA (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_MakeDiscoverable::?relay + 000006D5 GAPRole_ProcessEvent (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006DB - 000006E0 (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_UpdateAdvertisingData::?relay + 000006DB WIMU_updateProfileSensors (wimu) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006E1 - 000006E6 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: gapProcessAdvertisingEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_EndDiscoverable::?relay + 000006E1 GAPRole_SetParameter (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006E7 - 000006EC (0x6 bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PeriDevMgrInit::?relay + 000006E7 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006ED - 000006F2 (0x6 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 13 + LOCAL ADDRESS + ===== ======= + gapPeriProcessHCICmdCompleteEvt::?relay + 000006ED + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006F3 - 000006F8 (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GAP_MakeDiscoverable + Segment part 13 + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParams::?relay + 000006F3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006F9 - 000006FE (0x6 bytes), align: 0 + Segment part 43. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParamsStatus::?relay + 000006F9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006FF - 00000704 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvEnableStatus::?relay + 000006FF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000705 - 0000070A (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvDataStatus::?relay + 00000705 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000070B - 00000710 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 13 + LOCAL ADDRESS + ===== ======= + gapProcessAdvertisingEvt::?relay + 0000070B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000711 - 00000716 (0x6 bytes), align: 0 + Segment part 86. Intra module refs: gapSetAdvParamsStatus + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + gapSendMakeDiscEvent::?relay + 00000711 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000717 - 0000071C (0x6 bytes), align: 0 + Segment part 89. Intra module refs: GAP_MakeDiscoverable + gapProcessAdvertisingEvt + gapSendMakeDiscEvent + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + gapFreeAdvertState::?relay + 00000717 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000071D - 00000722 (0x6 bytes), align: 0 + Segment part 93. Intra module refs: gapSetAdvParams + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + isLimitedDiscoverableMode::?relay + 0000071D + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F6E - 00008F71 (0x4 bytes), align: 0 + Segment part 102. Intra module refs: __Constant_3e8 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_perilinkmgr + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF0B - 0001AF93 (0x89 bytes), align: 0 + Segment part 6. Intra module refs: GAP_SendSlaveSecurityRequest::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SendSlaveSecurityRequest + 0001AF0B + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000723 - 00000728 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SendSlaveSecurityRequest::?relay + 00000723 GAPBondMgr_LinkEst (gapbondmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000032B - 0000032B (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_Init + GAP_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gapTaskID 0000032B GAP_Authenticate (gap_linkmgr) + GAP_EndDiscoverable (gap_peridevmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + Segment part 58 (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E81 - 00000E81 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAP_ProcessEvent + GAP_RegisterForHCIMsgs + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUnwantedTaskID 00000E81 SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000032C - 0000032D (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapRegisterPeripheral + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnPeripheralCBs 0000032C gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessRandomAddrComplete (gap_configmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000032E - 0000032F (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190ED - 000190F6 (0xa bytes), align: 0 + Segment part 11. Intra module refs: GAP_RegisterForHCIMsgs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_RegisterForHCIMsgs + 000190ED + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190F7 - 000190FA (0x4 bytes), align: 0 + Segment part 13. Intra module refs: gapRegisterPeripheral + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190FB - 000190FB (0x1 bytes), align: 0 + Segment part 14. Intra module refs: GAP_RegisterForHCIMsgs + Segment part 13 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190FC - 00019102 (0x7 bytes), align: 0 + Segment part 15. Intra module refs: GAP_NumActiveConnections + Segment part 14 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019103 - 00019128 (0x26 bytes), align: 0 + Segment part 16. Intra module refs: GAP_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Init 00019103 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019129 - 0001924B (0x123 bytes), align: 0 + Segment part 18. Intra module refs: GAP_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ProcessEvent 00019129 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001924C - 00019250 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019251 - 0001925A (0xa bytes), align: 0 + Segment part 21. Intra module refs: GAP_NumActiveConnections::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_NumActiveConnections + 00019251 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001925B - 0001939D (0x143 bytes), align: 0 + Segment part 23. Intra module refs: gapProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + gapProcessOSALMsg 0001925B + calls direct + XSTACK = 00000012 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001939E - 000193A2 (0x5 bytes), align: 0 + Segment part 25. Intra module refs: gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000193A3 - 000193AA (0x8 bytes), align: 0 + Segment part 26. Intra module refs: GAP_ProcessEvent + Segment part 25 + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000193AB - 000193B3 (0x9 bytes), align: 0 + Segment part 27. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000193B4 - 00019483 (0xd0 bytes), align: 0 + Segment part 28. Intra module refs: gapProcessHCICmdCompleteEvt::?relay + LOCAL ADDRESS + ===== ======= + gapProcessHCICmdCompleteEvt + 000193B4 + calls direct + XSTACK = 00000010 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019484 - 00019494 (0x11 bytes), align: 0 + Segment part 30. Intra module refs: gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019495 - 0001949A (0x6 bytes), align: 0 + Segment part 31. Intra module refs: Segment part 25 + Segment part 27 + Segment part 30 + Segment part 32 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001949B - 000194A1 (0x7 bytes), align: 0 + Segment part 32. Intra module refs: gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000194A2 - 000194A9 (0x8 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 27 + Segment part 32 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000194AA - 000194B3 (0xa bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000194B4 - 000194BD (0xa bytes), align: 0 + Segment part 37. Intra module refs: gapRegisterPeripheral::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapRegisterPeripheral 000194B4 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000018E - 0000018E (0x1 bytes), align: 0 + Segment part 8. Intra module refs: gapUnwantedTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000729 - 0000072E (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_RegisterForHCIMsgs::?relay + 00000729 GAPRole_Init (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000072F - 00000734 (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Init::?relay 0000072F osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000735 - 0000073A (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ProcessEvent::?relay + 00000735 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000073B - 00000740 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_NumActiveConnections::?relay + 0000073B GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000741 - 00000746 (0x6 bytes), align: 0 + Segment part 24. Intra module refs: GAP_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapProcessOSALMsg::?relay + 00000741 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000747 - 0000074C (0x6 bytes), align: 0 + Segment part 29. Intra module refs: gapProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapProcessHCICmdCompleteEvt::?relay + 00000747 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000074D - 00000752 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapRegisterPeripheral::?relay + 0000074D GAP_PeriDevMgrInit (gap_peridevmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gapgattserver + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000330 - 00000331 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: Segment part 64 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F93 - 00008F95 (0x3 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E82 - 00000E82 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000332 - 00000347 (0x16 bytes), align: 0 + Segment part 10. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E83 - 00000E83 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000348 - 00000349 (0x2 bytes), align: 0 + Segment part 13. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E84 - 00000E84 (0x1 bytes), align: 0 + Segment part 14. Intra module refs: GGS_SetParameter + Segment part 25 + ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000034A - 0000034A (0x1 bytes), align: 0 + Segment part 16. Intra module refs: GGS_SetParameter + Segment part 25 + ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E85 - 00000E85 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000034B - 00000350 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E86 - 00000E86 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E87 - 00000E8E (0x8 bytes), align: 0 + Segment part 22. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E8F - 00000EE6 (0x58 bytes), align: 0 + Segment part 24. Intra module refs: GGS_AddService + GGS_SetParameter + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008ECA - 00008ECF (0x6 bytes), align: 0 + Segment part 26. Intra module refs: GGS_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gapServiceCBs 00008ECA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169AC - 00016AE0 (0x135 bytes), align: 0 + Segment part 27. Intra module refs: GGS_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_SetParameter 000169AC + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016AE1 - 00016B07 (0x27 bytes), align: 0 + Segment part 35. Intra module refs: GGS_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_AddService 00016AE1 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B08 - 00016B0C (0x5 bytes), align: 0 + Segment part 37. Intra module refs: GGS_AddService + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B0D - 00016B13 (0x7 bytes), align: 0 + Segment part 42. Intra module refs: ggs_SetAttrWPermit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B14 - 00016B5D (0x4a bytes), align: 0 + Segment part 43. Intra module refs: ggs_SetAttrWPermit::?relay + LOCAL ADDRESS + ===== ======= + ggs_SetAttrWPermit 00016B14 + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B5E - 00016CD9 (0x17c bytes), align: 0 + Segment part 45. Intra module refs: ggs_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + ggs_ReadAttrCB 00016B5E + calls direct, is indirectly called + XSTACK = 00000006 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CDA - 00016CDE (0x5 bytes), align: 0 + Segment part 47. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CDF - 00016CE4 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CE5 - 00016CE8 (0x4 bytes), align: 0 + Segment part 49. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CE9 - 00016CF2 (0xa bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + Segment part 52 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CF3 - 00016CF8 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: GGS_SetParameter + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CF9 - 00016CFE (0x6 bytes), align: 0 + Segment part 52. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CFF - 00016D04 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D05 - 00016D0D (0x9 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D0E - 00016D0E (0x1 bytes), align: 0 + Segment part 55. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D0F - 00016D14 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: GGS_SetParameter + Segment part 55 + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D15 - 00016D15 (0x1 bytes), align: 0 + Segment part 57. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D16 - 00016D1B (0x6 bytes), align: 0 + Segment part 58. Intra module refs: GGS_SetParameter + Segment part 57 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016D1C - 00016E9E (0x183 bytes), align: 0 + Segment part 59. Intra module refs: ggs_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + ggs_WriteAttrCB 00016D1C + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E9F - 00016EA4 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EA5 - 00016EA9 (0x5 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + Segment part 63 + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EAA - 00016EB2 (0x9 bytes), align: 0 + Segment part 63. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EB3 - 00016EB6 (0x4 bytes), align: 0 + Segment part 64. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EB7 - 00016EBE (0x8 bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EBF - 00016ED1 (0x13 bytes), align: 0 + Segment part 66. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000018F - 0000018F (0x1 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000190 - 00000190 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 11 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000191 - 00000191 (0x1 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 14 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000192 - 00000192 (0x1 bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000193 - 00000193 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000194 - 0000019B (0x8 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000019C - 000001F3 (0x58 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000753 - 00000758 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_SetParameter::?relay + 00000753 WIMU_Init (wimu) + gapBondSetupPrivFlag (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000759 - 0000075E (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_AddService::?relay + 00000759 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000075F - 00000764 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: GGS_SetParameter + LOCAL ADDRESS + ===== ======= + ggs_SetAttrWPermit::?relay + 0000075F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000765 - 0000076A (0x6 bytes), align: 0 + Segment part 46. Intra module refs: gapServiceCBs + LOCAL ADDRESS + ===== ======= + ggs_ReadAttrCB::?relay + 00000765 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000076B - 00000770 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: gapServiceCBs + LOCAL ADDRESS + ===== ======= + ggs_WriteAttrCB::?relay + 0000076B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F93 - 00008F95 (0x3 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008ECA - 00008ECF (0x6 bytes), align: 0 + Segment part 68. Intra module refs: gapServiceCBs + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gatt_server + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000351 - 00000358 (0x8 bytes), align: 0 + Segment part 6. Intra module refs: GATT_InitServer + Segment part 99 + ENTRY ADDRESS REF BY + ===== ======= ====== + serverInfoTbl 00000351 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EE7 - 00000EE7 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GATT_RegisterForReq + gattServerProcessMsgCB + ENTRY ADDRESS REF BY + ===== ======= ====== + reqTaskId 00000EE7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000359 - 0000035A (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GATT_FindHandle + GATT_FindHandleUUID + GATT_RegisterService + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EE8 - 00000EE9 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008DFE - 00008E2D (0x30 bytes), align: 0 + Segment part 12. Intra module refs: gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A03B - 0000A09D (0x63 bytes), align: 0 + Segment part 13. Intra module refs: GATT_InitServer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_InitServer 0000A03B + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A09E - 0000A1C8 (0x12b bytes), align: 0 + Segment part 15. Intra module refs: GATT_RegisterService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterService 0000A09E + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1C9 - 0000A1D7 (0xf bytes), align: 0 + Segment part 17. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1D8 - 0000A1E2 (0xb bytes), align: 0 + Segment part 18. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1E3 - 0000A1EB (0x9 bytes), align: 0 + Segment part 21. Intra module refs: GATT_RegisterForReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterForReq 0000A1E3 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1EC - 0000A1F2 (0x7 bytes), align: 0 + Segment part 23. Intra module refs: GATT_RegisterForReq + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1F3 - 0000A210 (0x1e bytes), align: 0 + Segment part 24. Intra module refs: GATT_VerifyReadPermissions::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyReadPermissions + 0000A1F3 + calls direct + XSTACK = 00000010 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A211 - 0000A215 (0x5 bytes), align: 0 + Segment part 26. Intra module refs: GATT_VerifyReadPermissions + GATT_VerifyWritePermissions + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A216 - 0000A260 (0x4b bytes), align: 0 + Segment part 27. Intra module refs: GATT_VerifyWritePermissions::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyWritePermissions + 0000A216 + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A261 - 0000A300 (0xa0 bytes), align: 0 + Segment part 29. Intra module refs: GATT_ServiceChangedInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceChangedInd + 0000A261 + calls direct + XSTACK = 00000000 ( 00000029 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A301 - 0000A305 (0x5 bytes), align: 0 + Segment part 31. Intra module refs: GATT_ServiceChangedInd + gattProcessWriteReq + gattServerHandleTimerCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A306 - 0000A3FB (0xf6 bytes), align: 0 + Segment part 32. Intra module refs: GATT_FindHandleUUID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandleUUID 0000A306 + calls direct + XSTACK = 0000002C ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A3FC - 0000A4C5 (0xca bytes), align: 0 + Segment part 34. Intra module refs: GATT_FindHandle::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandle 0000A3FC + XSTACK = 00000010 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A4C6 - 0000A62F (0x16a bytes), align: 0 + Segment part 36. Intra module refs: GATT_FindNextAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindNextAttr 0000A4C6 + calls direct + XSTACK = 00000004 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A630 - 0000A637 (0x8 bytes), align: 0 + Segment part 38. Intra module refs: GATT_FindNextAttr + GATT_RegisterService + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A638 - 0000A63D (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GATT_FindHandleUUID + GATT_FindNextAttr + GATT_RegisterService + Segment part 38 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A63E - 0000A677 (0x3a bytes), align: 0 + Segment part 40. Intra module refs: GATT_ServiceNumAttrs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceNumAttrs 0000A63E + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A678 - 0000A67F (0x8 bytes), align: 0 + Segment part 42. Intra module refs: GATT_RegisterService + GATT_ServiceNumAttrs + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A680 - 0000A71D (0x9e bytes), align: 0 + Segment part 43. Intra module refs: GATT_Indication::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Indication 0000A680 + calls direct + XSTACK = 00000024 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A71E - 0000A76A (0x4d bytes), align: 0 + Segment part 45. Intra module refs: GATT_Notification::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Notification 0000A71E + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A76B - 0000A790 (0x26 bytes), align: 0 + Segment part 47. Intra module refs: gattServiceLastHandle::?relay + LOCAL ADDRESS + ===== ======= + gattServiceLastHandle 0000A76B + calls direct + XSTACK = 00000016 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A791 - 0000A975 (0x1e5 bytes), align: 0 + Segment part 49. Intra module refs: gattServerProcessMsgCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerProcessMsgCB + 0000A791 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000031 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A976 - 0000A97E (0x9 bytes), align: 0 + Segment part 51. Intra module refs: GATT_FindHandleUUID + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A97F, align: 0 + Segment part 52. Intra module refs: gattProcessExchangeMTUReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessExchangeMTUReq + 0000A97F + is indirectly called + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A97F - 0000A983 (0x5 bytes), align: 0 + Segment part 54. Intra module refs: gattProcessExchangeMTUReq + gattProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A984 - 0000AB38 (0x1b5 bytes), align: 0 + Segment part 55. Intra module refs: gattProcessFindInfoReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessFindInfoReq + 0000A984 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000002C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB39 - 0000AB3E (0x6 bytes), align: 0 + Segment part 57. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB3F - 0000AB47 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: GATT_RegisterService + Segment part 57 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB48 - 0000AB4B (0x4 bytes), align: 0 + Segment part 59. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB4C - 0000AB51 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: GATT_RegisterService + Segment part 59 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB52 - 0000AB64 (0x13 bytes), align: 0 + Segment part 61. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB65 - 0000ABAB (0x47 bytes), align: 0 + Segment part 62. Intra module refs: gattProcessFindByTypeValueReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessFindByTypeValueReq + 0000AB65 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABAC - 0000ABB1 (0x6 bytes), align: 0 + Segment part 64. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABB2 - 0000ABB8 (0x7 bytes), align: 0 + Segment part 65. Intra module refs: GATT_Indication + Segment part 64 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABB9 - 0000ABFD (0x45 bytes), align: 0 + Segment part 66. Intra module refs: gattProcessReadByTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadByTypeReq + 0000ABB9 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABFE - 0000AC02 (0x5 bytes), align: 0 + Segment part 68. Intra module refs: GATT_InitServer + gattFindServerInfo + gattGetServerStatus + gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + gattProcessReadReq + gattServiceLastHandle + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AC03 - 0000AC1A (0x18 bytes), align: 0 + Segment part 69. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AC1B - 0000AC42 (0x28 bytes), align: 0 + Segment part 70. Intra module refs: gattProcessReadReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadReq 0000AC1B + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AC43 - 0000ACBD (0x7b bytes), align: 0 + Segment part 72. Intra module refs: gattProcessReadMultiReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadMultiReq + 0000AC43 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACBE - 0000ACC5 (0x8 bytes), align: 0 + Segment part 74. Intra module refs: GATT_FindNextAttr + gattProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACC6 - 0000ACC7 (0x2 bytes), align: 0 + Segment part 75. Intra module refs: GATT_FindHandle + GATT_FindHandleUUID + GATT_ServiceChangedInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACC8 - 0000ACC9 (0x2 bytes), align: 0 + Segment part 76. Intra module refs: GATT_FindHandleUUID + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACCA - 0000ACCF (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GATT_FindHandle + Segment part 76 + gattProcessReadByGrpTypeReq + gattProcessReadMultiReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACD0 - 0000ACDE (0xf bytes), align: 0 + Segment part 78. Intra module refs: gattProcessReadMultiReq + gattProcessReadReq + gattProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACDF - 0000ACE1 (0x3 bytes), align: 0 + Segment part 79. Intra module refs: gattProcessFindInfoReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACE2 - 0000ACE6 (0x5 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 79 + gattProcessReadByGrpTypeReq + gattProcessReadMultiReq + gattServerHandleConnStatusCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACE7 - 0000AD83 (0x9d bytes), align: 0 + Segment part 81. Intra module refs: gattProcessReadByGrpTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadByGrpTypeReq + 0000ACE7 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD84 - 0000AD87 (0x4 bytes), align: 0 + Segment part 83. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD88 - 0000AD8D (0x6 bytes), align: 0 + Segment part 84. Intra module refs: GATT_FindNextAttr + GATT_ServiceChangedInd + Segment part 83 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD8E - 0000AD9D (0x10 bytes), align: 0 + Segment part 85. Intra module refs: GATT_RegisterService + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD9E - 0000AD9E (0x1 bytes), align: 0 + Segment part 86. Intra module refs: GATT_FindHandleUUID + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD9F - 0000ADA2 (0x4 bytes), align: 0 + Segment part 87. Intra module refs: GATT_FindNextAttr + Segment part 86 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + gattServerHandleTimerCB + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADA3 - 0000ADA8 (0x6 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 18 + Segment part 69 + Segment part 74 + Segment part 78 + Segment part 87 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADA9 - 0000ADD9 (0x31 bytes), align: 0 + Segment part 89. Intra module refs: gattProcessWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessWriteReq 0000ADA9 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADDA - 0000ADDC (0x3 bytes), align: 0 + Segment part 91. Intra module refs: gattProcessExecuteWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessExecuteWriteReq + 0000ADDA + is indirectly called + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADDD - 0000AE18 (0x3c bytes), align: 0 + Segment part 93. Intra module refs: gattGetServerStatus::?relay + LOCAL ADDRESS + ===== ======= + gattGetServerStatus 0000ADDD + calls direct + XSTACK = 0000000F ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE19 - 0000AE1E (0x6 bytes), align: 0 + Segment part 95. Intra module refs: GATT_FindHandleUUID + GATT_FindNextAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE1F - 0000AE24 (0x6 bytes), align: 0 + Segment part 96. Intra module refs: GATT_ServiceChangedInd + Segment part 95 + gattGetServerStatus + gattProcessReadMultiReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE25 - 0000AE5B (0x37 bytes), align: 0 + Segment part 97. Intra module refs: gattFindServerInfo::?relay + LOCAL ADDRESS + ===== ======= + gattFindServerInfo 0000AE25 + XSTACK = 0000002D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE5C - 0000AE66 (0xb bytes), align: 0 + Segment part 99. Intra module refs: GATT_InitServer + gattFindServerInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE67 - 0000AEB6 (0x50 bytes), align: 0 + Segment part 100. Intra module refs: gattServerHandleTimerCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerHandleTimerCB + 0000AE67 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEB7 - 0000AEBF (0x9 bytes), align: 0 + Segment part 102. Intra module refs: gattServerHandleConnStatusCB + gattServerHandleTimerCB + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEC0 - 0000AEC5 (0x6 bytes), align: 0 + Segment part 103. Intra module refs: gattServerHandleConnStatusCB + gattServerHandleTimerCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEC6 - 0000AECD (0x8 bytes), align: 0 + Segment part 104. Intra module refs: Segment part 103 + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AECE - 0000AF89 (0xbc bytes), align: 0 + Segment part 105. Intra module refs: gattServerHandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerHandleConnStatusCB + 0000AECE + calls direct, is indirectly called + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AF8A - 0000AF97 (0xe bytes), align: 0 + Segment part 107. Intra module refs: gattGetServerStatus + gattServerHandleConnStatusCB + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F4 - 000001F4 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: reqTaskId + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F5 - 000001F6 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 10 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000771 - 00000776 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_InitServer::?relay + 00000771 GATT_Init (gatt_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000777 - 0000077C (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterService::?relay + 00000777 GATTServApp_RegisterService (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000077D - 00000782 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterForReq::?relay + 0000077D GATTServApp_Init (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000783 - 00000788 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: gattProcessReadMultiReq + gattProcessReadReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyReadPermissions::?relay + 00000783 Segment part 87 (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000789 - 0000078E (0x6 bytes), align: 0 + Segment part 28. Intra module refs: gattProcessWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyWritePermissions::?relay + 00000789 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000078F - 00000794 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceChangedInd::?relay + 0000078F GATTServApp_SendServiceChangedInd (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000795 - 0000079A (0x6 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 84 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandleUUID::?relay + 00000795 GAPBondMgr_ProcessEvent (gapbondmgr) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000079B - 000007A0 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 78 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandle::?relay + 0000079B GATTServApp_ReadAttr (gattservapp) + Segment part 102 (gattservapp) + Segment part 149 (gattservapp) + gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007A1 - 000007A6 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindNextAttr::?relay + 000007A1 GAPBondMgr_ProcessEvent (gapbondmgr) + GATTServApp_ReadAttr (gattservapp) + Segment part 89 (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007A7 - 000007AC (0x6 bytes), align: 0 + Segment part 41. Intra module refs: gattServiceLastHandle + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceNumAttrs::?relay + 000007A7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007AD - 000007B2 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: GATT_ServiceChangedInd + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Indication::?relay + 000007AD GATTServApp_ProcessCharCfg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007B3 - 000007B8 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Notification::?relay + 000007B3 GATTServApp_ProcessCharCfg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007B9 - 000007BE (0x6 bytes), align: 0 + Segment part 48. Intra module refs: GATT_FindNextAttr + LOCAL ADDRESS + ===== ======= + gattServiceLastHandle::?relay + 000007B9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007BF - 000007C4 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: GATT_InitServer + LOCAL ADDRESS + ===== ======= + gattServerProcessMsgCB::?relay + 000007BF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007C5 - 000007CA (0x6 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessExchangeMTUReq::?relay + 000007C5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007CB - 000007D0 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessFindInfoReq::?relay + 000007CB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007D1 - 000007D6 (0x6 bytes), align: 0 + Segment part 63. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessFindByTypeValueReq::?relay + 000007D1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007D7 - 000007DC (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadByTypeReq::?relay + 000007D7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007DD - 000007E2 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadReq::?relay + 000007DD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007E3 - 000007E8 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadMultiReq::?relay + 000007E3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007E9 - 000007EE (0x6 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadByGrpTypeReq::?relay + 000007E9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007EF - 000007F4 (0x6 bytes), align: 0 + Segment part 90. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessWriteReq::?relay + 000007EF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007F5 - 000007FA (0x6 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessExecuteWriteReq::?relay + 000007F5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007FB - 00000800 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: GATT_Indication + GATT_Notification + LOCAL ADDRESS + ===== ======= + gattGetServerStatus::?relay + 000007FB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000801 - 00000806 (0x6 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 107 + gattServerHandleConnStatusCB + gattServerProcessMsgCB + LOCAL ADDRESS + ===== ======= + gattFindServerInfo::?relay + 00000801 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000807 - 0000080C (0x6 bytes), align: 0 + Segment part 101. Intra module refs: GATT_Indication + LOCAL ADDRESS + ===== ======= + gattServerHandleTimerCB::?relay + 00000807 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000080D - 00000812 (0x6 bytes), align: 0 + Segment part 106. Intra module refs: GATT_InitServer + LOCAL ADDRESS + ===== ======= + gattServerHandleConnStatusCB::?relay + 0000080D + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008DFE - 00008E2D (0x30 bytes), align: 0 + Segment part 110. Intra module refs: Segment part 12 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gatt_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000035B - 0000035B (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GATT_Init + GATT_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gattTaskID 0000035B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000035C - 0000035D (0x2 bytes), align: 0 + Segment part 7. Intra module refs: gattProcessRxData + gattRegisterServer + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000035E - 0000035F (0x2 bytes), align: 0 + Segment part 8. Intra module refs: gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DA4 - 00019DAA (0x7 bytes), align: 0 + Segment part 9. Intra module refs: gattRegisterServer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattRegisterServer 00019DA4 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DAB - 00019DB6 (0xc bytes), align: 0 + Segment part 11. Intra module refs: gattRegisterServer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DB7 - 00019DCA (0x14 bytes), align: 0 + Segment part 14. Intra module refs: GATT_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Init 00019DB7 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DCB - 00019DCF (0x5 bytes), align: 0 + Segment part 16. Intra module refs: GATT_Init + gattStopTimer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DD0 - 00019E15 (0x46 bytes), align: 0 + Segment part 17. Intra module refs: GATT_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ProcessEvent 00019DD0 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019E16 - 00019E1A (0x5 bytes), align: 0 + Segment part 19. Intra module refs: GATT_ProcessEvent + gattStartTimer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019E1B - 00019EE5 (0xcb bytes), align: 0 + Segment part 20. Intra module refs: gattProcessRxData::?relay + LOCAL ADDRESS + ===== ======= + gattProcessRxData 00019E1B + calls direct + XSTACK = 0000000C ( 00000015 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019EE6 - 00019EEF (0xa bytes), align: 0 + Segment part 22. Intra module refs: gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019EF0 - 00019EF5 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019EF6 - 00019F84 (0x8f bytes), align: 0 + Segment part 24. Intra module refs: gattNotifyEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattNotifyEvent 00019EF6 + calls direct + XSTACK = 00000002 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019F85 - 00019FCF (0x4b bytes), align: 0 + Segment part 26. Intra module refs: gattStartTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStartTimer 00019F85 + calls direct + XSTACK = 00000004 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019FD0 - 00019FF9 (0x2a bytes), align: 0 + Segment part 28. Intra module refs: gattStopTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStopTimer 00019FD0 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000813 - 00000818 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattRegisterServer::?relay + 00000813 GATT_InitServer (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000819 - 0000081E (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Init::?relay 00000819 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000081F - 00000824 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ProcessEvent::?relay + 0000081F tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000825 - 0000082A (0x6 bytes), align: 0 + Segment part 21. Intra module refs: GATT_ProcessEvent + LOCAL ADDRESS + ===== ======= + gattProcessRxData::?relay + 00000825 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000082B - 00000830 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattNotifyEvent::?relay + 0000082B Segment part 104 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000831 - 00000836 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStartTimer::?relay + 00000831 GATT_Indication (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000837 - 0000083C (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStopTimer::?relay 00000837 gattServerHandleConnStatusCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gattservapp + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000360 - 00000360 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GATTServApp_Init + GATTServApp_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_TaskID 00000360 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EEA - 00000EEA (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GATTServApp_RegisterForMsg + GATTServApp_SendCCCUpdatedEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + appTaskID 00000EEA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000361 - 00000364 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: GATTServApp_Init + Segment part 40 + gattServApp_FindPrepareWriteQ + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000365 - 00000365 (0x1 bytes), align: 0 + Segment part 10. Intra module refs: gattServApp_HandleConnStatusCB + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000366 - 00000367 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: GATTServApp_RegisterService + gattServApp_FindServiceCBs + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000368 - 00000368 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000369 - 0000037E (0x16 bytes), align: 0 + Segment part 13. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000037F - 00000397 (0x19 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 57 + Segment part 63 + Segment part 64 + Segment part 67 + Segment part 83 + Segment part 88 + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F8A - 00008F8C (0x3 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EEB - 00000EEB (0x1 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000398 - 0000039D (0x6 bytes), align: 0 + Segment part 18. Intra module refs: GATTServApp_Init + GATTServApp_SendServiceChangedInd + Segment part 20 + gattServApp_HandleConnStatusCB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EEC - 00000F0B (0x20 bytes), align: 0 + Segment part 19. Intra module refs: GATTServApp_AddService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EDC - 00008EE1 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: GATTServApp_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gattServiceCBs 00008EDC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002AF7 - 00002B02 (0xc bytes), align: 0 + Segment part 22. Intra module refs: GATTServApp_RegisterForMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterForMsg + 00002AF7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002B03 - 00002B3B (0x39 bytes), align: 0 + Segment part 24. Intra module refs: GATTServApp_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_Init 00002B03 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002B3C - 00002B80 (0x45 bytes), align: 0 + Segment part 26. Intra module refs: GATTServApp_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessEvent + 00002B3C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002B81 - 00002C30 (0xb0 bytes), align: 0 + Segment part 28. Intra module refs: GATTServApp_RegisterService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterService + 00002B81 + calls direct + XSTACK = 0000000E ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C31 - 00002C32 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: GATTServApp_RegisterService + Segment part 163 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C33 - 00002C37 (0x5 bytes), align: 0 + Segment part 31. Intra module refs: Segment part 142 + Segment part 30 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C38 - 00002CA1 (0x6a bytes), align: 0 + Segment part 38. Intra module refs: gattServApp_SetNumPrepareWrites::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_SetNumPrepareWrites + 00002C38 + calls direct + XSTACK = 00000009 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002CA2 - 00002CB7 (0x16 bytes), align: 0 + Segment part 40. Intra module refs: gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002CB8 - 00002CBD (0x6 bytes), align: 0 + Segment part 41. Intra module refs: GATTServApp_RegisterService + gattServApp_ProcessFindByTypeValueReq + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002CBE - 00002D22 (0x65 bytes), align: 0 + Segment part 42. Intra module refs: GATTServApp_FindAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_FindAttr 00002CBE + XSTACK = 00000033 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D23 - 00002D49 (0x27 bytes), align: 0 + Segment part 44. Intra module refs: GATTServApp_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_AddService + 00002D23 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D4A - 00002D4E (0x5 bytes), align: 0 + Segment part 46. Intra module refs: GATTServApp_AddService + GATTServApp_FindAttr + GATTServApp_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D4F - 00002D7A (0x2c bytes), align: 0 + Segment part 49. Intra module refs: gattServApp_FindServiceCBs::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindServiceCBs + 00002D4F + XSTACK = 0000001D ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D7B - 00002D81 (0x7 bytes), align: 0 + Segment part 51. Intra module refs: GATTServApp_RegisterForMsg + gattServApp_FindPrepareWriteQ + gattServApp_FindServiceCBs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D82 - 00002D87 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gattServApp_FindServiceCBs + gattServApp_HandleConnStatusCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D88 - 00002F7A (0x1f3 bytes), align: 0 + Segment part 53. Intra module refs: gattServApp_ProcessMsg::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessMsg + 00002D88 + calls direct + XSTACK = 0000000C ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F7B - 00002F84 (0xa bytes), align: 0 + Segment part 55. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F85 - 00002F8C (0x8 bytes), align: 0 + Segment part 56. Intra module refs: GATTServApp_RegisterService + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F8D - 00002F9B (0xf bytes), align: 0 + Segment part 57. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F9C - 00003177 (0x1dc bytes), align: 0 + Segment part 58. Intra module refs: gattServApp_ProcessFindByTypeValueReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessFindByTypeValueReq + 00002F9C + calls direct + XSTACK = 00000016 ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003178 - 00003321 (0x1aa bytes), align: 0 + Segment part 60. Intra module refs: gattServApp_ProcessReadByTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByTypeReq + 00003178 + calls direct + XSTACK = 00000016 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003322 - 00003329 (0x8 bytes), align: 0 + Segment part 62. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000332A - 00003330 (0x7 bytes), align: 0 + Segment part 63. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003331 - 00003334 (0x4 bytes), align: 0 + Segment part 64. Intra module refs: Segment part 63 + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003335 - 00003339 (0x5 bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000333A - 00003343 (0xa bytes), align: 0 + Segment part 66. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003344 - 00003346 (0x3 bytes), align: 0 + Segment part 67. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003347 - 0000334F (0x9 bytes), align: 0 + Segment part 68. Intra module refs: GATTServApp_ReadAttr + Segment part 67 + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003350 - 00003353 (0x4 bytes), align: 0 + Segment part 69. Intra module refs: gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003354 - 00003355 (0x2 bytes), align: 0 + Segment part 70. Intra module refs: GATTServApp_ProcessCCCWriteReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003356 - 00003359 (0x4 bytes), align: 0 + Segment part 71. Intra module refs: GATTServApp_ProcessCCCWriteReq + Segment part 70 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000335A - 00003362 (0x9 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + Segment part 89 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003363 - 0000346C (0x10a bytes), align: 0 + Segment part 73. Intra module refs: gattServApp_ProcessReadMultiReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadMultiReq + 00003363 + calls direct + XSTACK = 00000016 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000346D - 00003471 (0x5 bytes), align: 0 + Segment part 75. Intra module refs: GATTServApp_WriteAttr + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003472 - 00003479 (0x8 bytes), align: 0 + Segment part 76. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000347A - 00003482 (0x9 bytes), align: 0 + Segment part 77. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003483 - 0000348B (0x9 bytes), align: 0 + Segment part 78. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000348C - 00003499 (0xe bytes), align: 0 + Segment part 79. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000349A - 000036AC (0x213 bytes), align: 0 + Segment part 80. Intra module refs: gattServApp_ProcessReadByGrpTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByGrpTypeReq + 0000349A + calls direct + XSTACK = 00000016 ( 00000022 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036AD - 000036B6 (0xa bytes), align: 0 + Segment part 82. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036B7 - 000036BA (0x4 bytes), align: 0 + Segment part 83. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036BB - 000036C0 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: Segment part 83 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036C1 - 000036C4 (0x4 bytes), align: 0 + Segment part 85. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + Segment part 84 + gattServApp_FindAuthorizeAttrCB + gattServApp_FindServiceCBs + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036C5 - 000036CA (0x6 bytes), align: 0 + Segment part 86. Intra module refs: Segment part 150 + Segment part 182 + Segment part 41 + Segment part 57 + Segment part 85 + Segment part 87 + Segment part 95 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036CB - 000036D4 (0xa bytes), align: 0 + Segment part 87. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036D5 - 000036E6 (0x12 bytes), align: 0 + Segment part 88. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036E7 - 000036EF (0x9 bytes), align: 0 + Segment part 89. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036F0 - 000036F9 (0xa bytes), align: 0 + Segment part 90. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036FA - 000037C5 (0xcc bytes), align: 0 + Segment part 91. Intra module refs: gattServApp_ProcessWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessWriteReq + 000036FA + calls direct + XSTACK = 00000016 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037C6 - 000037CA (0x5 bytes), align: 0 + Segment part 93. Intra module refs: gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037CB - 000037D0 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037D1 - 000037D7 (0x7 bytes), align: 0 + Segment part 95. Intra module refs: GATTServApp_ReadAttr + Segment part 94 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037D8 - 000037E5 (0xe bytes), align: 0 + Segment part 96. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037E6 - 000038DD (0xf8 bytes), align: 0 + Segment part 97. Intra module refs: gattServApp_ProcessPrepareWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessPrepareWriteReq + 000037E6 + calls direct + XSTACK = 00000016 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038DE - 000038EB (0xe bytes), align: 0 + Segment part 99. Intra module refs: gattServApp_ProcessPrepareWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038EC - 00003902 (0x17 bytes), align: 0 + Segment part 100. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003903 - 00003918 (0x16 bytes), align: 0 + Segment part 101. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003919 - 00003921 (0x9 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 101 + Segment part 79 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003922 - 00003923 (0x2 bytes), align: 0 + Segment part 103. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003924 - 00003926 (0x3 bytes), align: 0 + Segment part 104. Intra module refs: Segment part 103 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003927 - 0000392B (0x5 bytes), align: 0 + Segment part 105. Intra module refs: GATTServApp_ProcessCCCWriteReq + Segment part 104 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000392C - 00003A12 (0xe7 bytes), align: 0 + Segment part 106. Intra module refs: gattServApp_ProcessExecuteWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessExecuteWriteReq + 0000392C + calls direct + XSTACK = 00000016 ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A13 - 00003A15 (0x3 bytes), align: 0 + Segment part 108. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A16 - 00003A1A (0x5 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A1B - 00003A1B (0x1 bytes), align: 0 + Segment part 110. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A1C - 00003A20 (0x5 bytes), align: 0 + Segment part 111. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + Segment part 110 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A21 - 00003A25 (0x5 bytes), align: 0 + Segment part 112. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + GATTServApp_RegisterService + Segment part 111 + Segment part 72 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A26 - 00003A29 (0x4 bytes), align: 0 + Segment part 113. Intra module refs: gattServApp_ProcessReadMultiReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A2A - 00003A32 (0x9 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + gattServApp_ProcessFindByTypeValueReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A33 - 00003A38 (0x6 bytes), align: 0 + Segment part 115. Intra module refs: GATTServApp_ProcessCharCfg + GATTServApp_RegisterService + Segment part 114 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessMsg + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A39 - 00003A55 (0x1d bytes), align: 0 + Segment part 116. Intra module refs: gattServApp_FindPrepareWriteQ::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindPrepareWriteQ + 00003A39 + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A56 - 00003A88 (0x33 bytes), align: 0 + Segment part 118. Intra module refs: gattServApp_FindCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindCharCfgItem + 00003A56 + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A89 - 00003A8D (0x5 bytes), align: 0 + Segment part 120. Intra module refs: GATTServApp_Init + GATTServApp_SendServiceChangedInd + gattServApp_FindCharCfgItem + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A8E - 00003AA7 (0x1a bytes), align: 0 + Segment part 121. Intra module refs: gattServApp_FindAuthorizeAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindAuthorizeAttrCB + 00003A8E + calls direct + XSTACK = 0000001D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003AA8 - 00003B07 (0x60 bytes), align: 0 + Segment part 123. Intra module refs: gattServApp_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_WriteAttrCB + 00003AA8 + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003B08 - 00003B0F (0x8 bytes), align: 0 + Segment part 125. Intra module refs: GATTServApp_FindAttr + GATTServApp_ReadAttr + GATTServApp_SendCCCUpdatedEvent + gattServApp_ProcessPrepareWriteReq + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003B10 - 00003F26 (0x417 bytes), align: 0 + Segment part 126. Intra module refs: GATTServApp_ReadAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadAttr 00003B10 + calls direct + XSTACK = 00000039 ( 00000023 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F27 - 00003F2D (0x7 bytes), align: 0 + Segment part 128. Intra module refs: GATTServApp_ReadAttr + Segment part 145 + Segment part 31 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F2E - 00003F30 (0x3 bytes), align: 0 + Segment part 129. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F31 - 00003F35 (0x5 bytes), align: 0 + Segment part 130. Intra module refs: GATTServApp_ReadAttr + Segment part 129 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F36 - 00003F3E (0x9 bytes), align: 0 + Segment part 131. Intra module refs: GATTServApp_ReadAttr + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F3F - 00003F46 (0x8 bytes), align: 0 + Segment part 132. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F47 - 00003F4A (0x4 bytes), align: 0 + Segment part 133. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F4B - 00003F4F (0x5 bytes), align: 0 + Segment part 134. Intra module refs: GATTServApp_FindAttr + GATTServApp_ReadAttr + GATTServApp_UpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F50 - 00003F55 (0x6 bytes), align: 0 + Segment part 135. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F56 - 00003F59 (0x4 bytes), align: 0 + Segment part 136. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F5A - 00003F5F (0x6 bytes), align: 0 + Segment part 137. Intra module refs: GATTServApp_ReadAttr + Segment part 136 + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F60 - 00003F6F (0x10 bytes), align: 0 + Segment part 138. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F70 - 00003F77 (0x8 bytes), align: 0 + Segment part 139. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + GATTServApp_WriteAttr + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F78 - 00003F79 (0x2 bytes), align: 0 + Segment part 140. Intra module refs: GATTServApp_ReadAttr + GATTServApp_SendCCCUpdatedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F7A - 00003F80 (0x7 bytes), align: 0 + Segment part 141. Intra module refs: GATTServApp_SendCCCUpdatedEvent + Segment part 140 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F81 - 00003F86 (0x6 bytes), align: 0 + Segment part 142. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F87 - 00003F8F (0x9 bytes), align: 0 + Segment part 143. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F90 - 00003F98 (0x9 bytes), align: 0 + Segment part 144. Intra module refs: Segment part 143 + Segment part 69 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F99 - 00003F9F (0x7 bytes), align: 0 + Segment part 145. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003FA0 - 00003FA9 (0xa bytes), align: 0 + Segment part 146. Intra module refs: Segment part 133 + Segment part 135 + Segment part 145 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003FAA - 0000402C (0x83 bytes), align: 0 + Segment part 147. Intra module refs: GATTServApp_WriteAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteAttr 00003FAA + calls direct + XSTACK = 0000001C ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000402D - 00004037 (0xb bytes), align: 0 + Segment part 149. Intra module refs: GATTServApp_ReadAttr + GATTServApp_WriteAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004038 - 0000403E (0x7 bytes), align: 0 + Segment part 150. Intra module refs: GATTServApp_ReadAttr + GATTServApp_WriteAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000403F - 0000404A (0xc bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + gattServApp_FindAuthorizeAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000404B - 0000409B (0x51 bytes), align: 0 + Segment part 156. Intra module refs: GATTServApp_UpdateCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_UpdateCharCfg + 0000404B + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000409C - 000040C2 (0x27 bytes), align: 0 + Segment part 158. Intra module refs: GATTServApp_SendServiceChangedInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendServiceChangedInd + 0000409C + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000040C3 - 000040FF (0x3d bytes), align: 0 + Segment part 160. Intra module refs: GATTServApp_InitCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_InitCharCfg + 000040C3 + calls direct + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004100 - 00004104 (0x5 bytes), align: 0 + Segment part 162. Intra module refs: GATTServApp_InitCharCfg + GATTServApp_ReadCharCfg + GATTServApp_UpdateCharCfg + gattServApp_FindAuthorizeAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004105 - 00004110 (0xc bytes), align: 0 + Segment part 163. Intra module refs: GATTServApp_InitCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004111 - 0000412E (0x1e bytes), align: 0 + Segment part 164. Intra module refs: GATTServApp_ReadCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadCharCfg + 00004111 + calls direct + XSTACK = 0000001D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000412F - 0000416F (0x41 bytes), align: 0 + Segment part 166. Intra module refs: GATTServApp_WriteCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteCharCfg + 0000412F + calls direct + XSTACK = 00000014 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004170 - 00004174 (0x5 bytes), align: 0 + Segment part 168. Intra module refs: GATTServApp_RegisterService + GATTServApp_SendCCCUpdatedEvent + GATTServApp_WriteCharCfg + gattServApp_HandleConnStatusCB + gattServApp_SetNumPrepareWrites + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004175 - 00004182 (0xe bytes), align: 0 + Segment part 169. Intra module refs: GATTServApp_WriteCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004183 - 0000424D (0xcb bytes), align: 0 + Segment part 170. Intra module refs: GATTServApp_ProcessCCCWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCCCWriteReq + 00004183 + calls direct + XSTACK = 00000014 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000424E - 00004251 (0x4 bytes), align: 0 + Segment part 172. Intra module refs: gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004252 - 00004255 (0x4 bytes), align: 0 + Segment part 173. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + Segment part 172 + gattServApp_ProcessMsg + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004256 - 0000425B (0x6 bytes), align: 0 + Segment part 174. Intra module refs: Segment part 114 + Segment part 134 + Segment part 173 + Segment part 52 + Segment part 55 + Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000425C - 000043B3 (0x158 bytes), align: 0 + Segment part 175. Intra module refs: GATTServApp_ProcessCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCharCfg + 0000425C + calls direct + XSTACK = 00000005 ( 00000039 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043B4 - 000043BB (0x8 bytes), align: 0 + Segment part 177. Intra module refs: GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043BC - 000043C5 (0xa bytes), align: 0 + Segment part 178. Intra module refs: GATTServApp_ProcessCharCfg + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043C6 - 000043D1 (0xc bytes), align: 0 + Segment part 179. Intra module refs: GATTServApp_ProcessCharCfg + gattServApp_ProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043D2 - 000043D3 (0x2 bytes), align: 0 + Segment part 180. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043D4 - 000043D9 (0x6 bytes), align: 0 + Segment part 181. Intra module refs: Segment part 180 + gattServApp_ProcessFindByTypeValueReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043DA - 000043E2 (0x9 bytes), align: 0 + Segment part 182. Intra module refs: GATTServApp_ProcessCharCfg + Segment part 181 + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043E3 - 0000445F (0x7d bytes), align: 0 + Segment part 183. Intra module refs: gattServApp_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_HandleConnStatusCB + 000043E3 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004460 - 0000446A (0xb bytes), align: 0 + Segment part 185. Intra module refs: gattServApp_HandleConnStatusCB + gattServApp_ProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000446B - 000044C6 (0x5c bytes), align: 0 + Segment part 186. Intra module refs: GATTServApp_SendCCCUpdatedEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendCCCUpdatedEvent + 0000446B + calls direct + XSTACK = 00000014 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000044C7 - 000044D1 (0xb bytes), align: 0 + Segment part 188. Intra module refs: GATTServApp_SendCCCUpdatedEvent + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F7 - 000001F7 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: appTaskID + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F8 - 000001F8 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 16 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F9 - 00000218 (0x20 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000083D - 00000842 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterForMsg::?relay + 0000083D GAPBondMgr_Register (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000843 - 00000848 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_Init::?relay + 00000843 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000849 - 0000084E (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessEvent::?relay + 00000849 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000084F - 00000854 (0x6 bytes), align: 0 + Segment part 29. Intra module refs: GATTServApp_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterService::?relay + 0000084F Actimetry_AddService (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + GGS_AddService (gapgattserver) + Gps_AddService (gpsservice) + Time_AddService (timeservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000855 - 0000085A (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GATTServApp_Init + LOCAL ADDRESS + ===== ======= + gattServApp_SetNumPrepareWrites::?relay + 00000855 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000085B - 00000860 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: GATTServApp_ProcessCharCfg + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_FindAttr::?relay + 0000085B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000861 - 00000866 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_AddService::?relay + 00000861 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000867 - 0000086C (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 151 + LOCAL ADDRESS + ===== ======= + gattServApp_FindServiceCBs::?relay + 00000867 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000086D - 00000872 (0x6 bytes), align: 0 + Segment part 54. Intra module refs: GATTServApp_ProcessEvent + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessMsg::?relay + 0000086D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000873 - 00000878 (0x6 bytes), align: 0 + Segment part 59. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessFindByTypeValueReq::?relay + 00000873 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000879 - 0000087E (0x6 bytes), align: 0 + Segment part 61. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByTypeReq::?relay + 00000879 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000087F - 00000884 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadMultiReq::?relay + 0000087F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000885 - 0000088A (0x6 bytes), align: 0 + Segment part 81. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByGrpTypeReq::?relay + 00000885 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000088B - 00000890 (0x6 bytes), align: 0 + Segment part 92. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessWriteReq::?relay + 0000088B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000891 - 00000896 (0x6 bytes), align: 0 + Segment part 98. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessPrepareWriteReq::?relay + 00000891 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000897 - 0000089C (0x6 bytes), align: 0 + Segment part 107. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessExecuteWriteReq::?relay + 00000897 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000089D - 000008A2 (0x6 bytes), align: 0 + Segment part 117. Intra module refs: Segment part 185 + Segment part 99 + LOCAL ADDRESS + ===== ======= + gattServApp_FindPrepareWriteQ::?relay + 0000089D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008A3 - 000008A8 (0x6 bytes), align: 0 + Segment part 119. Intra module refs: GATTServApp_InitCharCfg + GATTServApp_ReadCharCfg + Segment part 169 + LOCAL ADDRESS + ===== ======= + gattServApp_FindCharCfgItem::?relay + 000008A3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008A9 - 000008AE (0x6 bytes), align: 0 + Segment part 122. Intra module refs: Segment part 95 + LOCAL ADDRESS + ===== ======= + gattServApp_FindAuthorizeAttrCB::?relay + 000008A9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008AF - 000008B4 (0x6 bytes), align: 0 + Segment part 124. Intra module refs: gattServiceCBs + LOCAL ADDRESS + ===== ======= + gattServApp_WriteAttrCB::?relay + 000008AF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008B5 - 000008BA (0x6 bytes), align: 0 + Segment part 127. Intra module refs: Segment part 182 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadAttr::?relay + 000008B5 GAPBondMgr_ProcessEvent (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008BB - 000008C0 (0x6 bytes), align: 0 + Segment part 148. Intra module refs: GATTServApp_UpdateCharCfg + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteAttr::?relay + 000008BB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008C1 - 000008C6 (0x6 bytes), align: 0 + Segment part 157. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_UpdateCharCfg::?relay + 000008C1 GAPBondMgr_LinkEst (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008C7 - 000008CC (0x6 bytes), align: 0 + Segment part 159. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendServiceChangedInd::?relay + 000008C7 GAPBondMgr_LinkEst (gapbondmgr) + gapBondMgrSendServiceChange (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008CD - 000008D2 (0x6 bytes), align: 0 + Segment part 161. Intra module refs: GATTServApp_Init + gattServApp_HandleConnStatusCB + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_InitCharCfg::?relay + 000008CD Actimetry_HandleConnStatusCB (actimetryservice) + Batt_AddService (battservice) + Gps_AddService (gpsservice) + Time_AddService (timeservice) + gps_HandleConnStatusCB (gpsservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008D3 - 000008D8 (0x6 bytes), align: 0 + Segment part 165. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + GATTServApp_SendServiceChangedInd + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadCharCfg::?relay + 000008D3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008D9 - 000008DE (0x6 bytes), align: 0 + Segment part 167. Intra module refs: GATTServApp_ProcessCCCWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteCharCfg::?relay + 000008D9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008DF - 000008E4 (0x6 bytes), align: 0 + Segment part 171. Intra module refs: gattServApp_WriteAttrCB + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCCCWriteReq::?relay + 000008DF Actimetry_WriteAttrCB (actimetryservice) + battWriteAttrCB (battservice) + gps_WriteAttrCB (gpsservice) + timeWriteAttrCB (timeservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008E5 - 000008EA (0x6 bytes), align: 0 + Segment part 176. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCharCfg::?relay + 000008E5 Actimetry_SetParameter (actimetryservice) + Batt_SetParameter (battservice) + Gps_SetParameter (gpsservice) + Time_SetParameter (timeservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008EB - 000008F0 (0x6 bytes), align: 0 + Segment part 184. Intra module refs: GATTServApp_Init + LOCAL ADDRESS + ===== ======= + gattServApp_HandleConnStatusCB::?relay + 000008EB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008F1 - 000008F6 (0x6 bytes), align: 0 + Segment part 187. Intra module refs: GATTServApp_ProcessCCCWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendCCCUpdatedEvent::?relay + 000008F1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F8A - 00008F8C (0x3 bytes), align: 0 + Segment part 189. Intra module refs: Segment part 15 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EDC - 00008EE1 (0x6 bytes), align: 0 + Segment part 190. Intra module refs: gattServiceCBs + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000039E - 0000039E (0x1 bytes), align: 0 + Segment part 9. Intra module refs: HCI_SendDataPkt + ENTRY ADDRESS REF BY + ===== ======= ====== + hciPTMenabled 0000039E HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_Init (hci_tl) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000039F - 0000039F (0x1 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + ctrlToHostEnable 0000039F LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003A0 - 000003A1 (0x2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + numHostBufs 000003A0 LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003A2 - 000003A2 (0x1 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + hciCtrlCmdToken 000003A2 Segment part 35 (hci_event) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018000 - 00018009 (0xa bytes), align: 0 + Segment part 14. Intra module refs: HCI_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_bm_alloc 00018000 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001800A - 000180D4 (0xcb bytes), align: 0 + Segment part 19. Intra module refs: HCI_SendDataPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendDataPkt 0001800A + calls direct + XSTACK = 00000002 ( 00000011 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000180D5 - 000180E8 (0x14 bytes), align: 0 + Segment part 21. Intra module refs: HCI_DisconnectCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DisconnectCmd 000180D5 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000180E9 - 000180EF (0x7 bytes), align: 0 + Segment part 49. Intra module refs: HCI_LE_RandCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000180F0 - 00018115 (0x26 bytes), align: 0 + Segment part 50. Intra module refs: HCI_ReadBDADDRCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadBDADDRCmd 000180F0 + calls direct + XSTACK = 00000000 ( 00000007 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018116 - 0001814D (0x38 bytes), align: 0 + Segment part 52. Intra module refs: HCI_ReadRssiCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadRssiCmd 00018116 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001814E - 00018154 (0x7 bytes), align: 0 + Segment part 54. Intra module refs: HCI_ReadRssiCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018155 - 00018159 (0x5 bytes), align: 0 + Segment part 57. Intra module refs: HCI_LE_ClearWhiteListCmd + HCI_LE_SetRandomAddressCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001815A - 0001818A (0x31 bytes), align: 0 + Segment part 59. Intra module refs: HCI_LE_ReadBufSizeCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ReadBufSizeCmd 0001815A + calls direct + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001818B - 00018191 (0x7 bytes), align: 0 + Segment part 61. Intra module refs: HCI_LE_ReadBufSizeCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018192 - 000181BA (0x29 bytes), align: 0 + Segment part 64. Intra module refs: HCI_LE_SetRandomAddressCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetRandomAddressCmd + 00018192 + calls direct + XSTACK = 00000000 ( 00000001 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000181BB - 0001822B (0x71 bytes), align: 0 + Segment part 66. Intra module refs: HCI_LE_SetAdvParamCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvParamCmd 000181BB + calls direct + XSTACK = 00000006 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001822C - 00018233 (0x8 bytes), align: 0 + Segment part 68. Intra module refs: HCI_LE_SetAdvParamCmd + Segment part 126 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018234 - 00018248 (0x15 bytes), align: 0 + Segment part 69. Intra module refs: HCI_LE_SetAdvDataCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvDataCmd 00018234 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018249 - 0001825D (0x15 bytes), align: 0 + Segment part 71. Intra module refs: HCI_LE_SetScanRspDataCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetScanRspDataCmd + 00018249 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001825E - 00018272 (0x15 bytes), align: 0 + Segment part 73. Intra module refs: HCI_LE_SetAdvEnableCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvEnableCmd + 0001825E + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018273 - 00018279 (0x7 bytes), align: 0 + Segment part 75. Intra module refs: HCI_LE_AddWhiteListCmd + HCI_LE_ClearWhiteListCmd + HCI_LE_SetAdvDataCmd + HCI_LE_SetAdvEnableCmd + HCI_LE_SetAdvParamCmd + HCI_LE_SetScanRspDataCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001827A - 00018281 (0x8 bytes), align: 0 + Segment part 76. Intra module refs: HCI_LE_SetRandomAddressCmd + Segment part 75 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018282 - 00018287 (0x6 bytes), align: 0 + Segment part 81. Intra module refs: HCI_ReadBDADDRCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018288 - 00018294 (0xd bytes), align: 0 + Segment part 82. Intra module refs: HCI_ReadBDADDRCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018295 - 000182A8 (0x14 bytes), align: 0 + Segment part 85. Intra module refs: HCI_LE_ClearWhiteListCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ClearWhiteListCmd + 00018295 + calls direct + XSTACK = 00000000 ( 00000001 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182A9 - 000182BD (0x15 bytes), align: 0 + Segment part 87. Intra module refs: HCI_LE_AddWhiteListCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_AddWhiteListCmd + 000182A9 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182BE - 000182C1 (0x4 bytes), align: 0 + Segment part 93. Intra module refs: HCI_LE_ReadBufSizeCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182C2 - 000182C5 (0x4 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 54 + Segment part 93 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182C6 - 000182D1 (0xc bytes), align: 0 + Segment part 95. Intra module refs: Segment part 151 + Segment part 94 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182D2 - 000182D9 (0x8 bytes), align: 0 + Segment part 98. Intra module refs: LL_RandCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000182DA - 00018313 (0x3a bytes), align: 0 + Segment part 99. Intra module refs: HCI_LE_RandCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_RandCmd 000182DA + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018314 - 0001833F (0x2c bytes), align: 0 + Segment part 101. Intra module refs: HCI_LE_LtkReqReplyCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqReplyCmd 00018314 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018340 - 0001836D (0x2e bytes), align: 0 + Segment part 103. Intra module refs: HCI_LE_LtkReqNegReplyCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqNegReplyCmd + 00018340 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001836E - 00018370 (0x3 bytes), align: 0 + Segment part 115. Intra module refs: HCI_ReadRssiCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018371 - 00018377 (0x7 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018378 - 0001837A (0x3 bytes), align: 0 + Segment part 126. Intra module refs: Segment part 57 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001837B - 0001837D (0x3 bytes), align: 0 + Segment part 127. Intra module refs: HCI_ReadBDADDRCmd + Segment part 126 + Segment part 188 + Segment part 49 + Segment part 61 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001837E - 00018384 (0x7 bytes), align: 0 + Segment part 128. Intra module refs: HCI_bm_alloc + Segment part 127 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018385 - 00018386 (0x2 bytes), align: 0 + Segment part 131. Intra module refs: HCI_LE_AddWhiteListCmd + HCI_LE_SetAdvDataCmd + HCI_LE_SetAdvEnableCmd + HCI_LE_SetScanRspDataCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018387 - 00018389 (0x3 bytes), align: 0 + Segment part 132. Intra module refs: Segment part 131 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001838A - 0001838D (0x4 bytes), align: 0 + Segment part 133. Intra module refs: Segment part 132 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001838E - 00018390 (0x3 bytes), align: 0 + Segment part 134. Intra module refs: Segment part 116 + Segment part 133 + Segment part 153 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018391 - 00018395 (0x5 bytes), align: 0 + Segment part 135. Intra module refs: HCI_DisconnectCmd + Segment part 134 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018396 - 00018399 (0x4 bytes), align: 0 + Segment part 150. Intra module refs: HCI_LE_LtkReqNegReplyCmd + LL_EXT_ExtendRfRangeCback + LL_EXT_SetRxGainCback + LL_EXT_SetTxPowerCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001839A - 0001839F (0x6 bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + Segment part 156 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000183A0 - 000183A4 (0x5 bytes), align: 0 + Segment part 152. Intra module refs: HCI_LE_LtkReqNegReplyCmd + HCI_LE_LtkReqReplyCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000183A5 - 000183AB (0x7 bytes), align: 0 + Segment part 153. Intra module refs: Segment part 152 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000183AC - 000183B1 (0x6 bytes), align: 0 + Segment part 156. Intra module refs: HCI_LE_LtkReqReplyCmd + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000183B2 - 000183B6 (0x5 bytes), align: 0 + Segment part 188. Intra module refs: Segment part 199 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000183B7 - 000183FF (0x49 bytes), align: 0 + Segment part 195. Intra module refs: LL_RandCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RandCback 000183B7 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018400 - 00018421 (0x22 bytes), align: 0 + Segment part 197. Intra module refs: LL_EXT_SetRxGainCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetRxGainCback 00018400 + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018422 - 00018429 (0x8 bytes), align: 0 + Segment part 199. Intra module refs: LL_EXT_ExtendRfRangeCback + LL_EXT_SetRxGainCback + LL_EXT_SetTxPowerCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001842A - 0001844E (0x25 bytes), align: 0 + Segment part 200. Intra module refs: LL_EXT_SetTxPowerCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetTxPowerCback + 0001842A + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001844F - 00018476 (0x28 bytes), align: 0 + Segment part 204. Intra module refs: LL_EXT_ExtendRfRangeCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ExtendRfRangeCback + 0001844F + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008F7 - 000008FC (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_bm_alloc::?relay 000008F7 L2CAP_bm_alloc (l2cap_util) + LL_RxReqDataBufCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008FD - 00000902 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendDataPkt::?relay + 000008FD l2capEncapSendData (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000903 - 00000908 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DisconnectCmd::?relay + 00000903 GAP_TerminateLinkReq (gap_linkmgr) + disconnectNext (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000909 - 0000090E (0x6 bytes), align: 0 + Segment part 51. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadBDADDRCmd::?relay + 00000909 GAP_ParamsInit (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000090F - 00000914 (0x6 bytes), align: 0 + Segment part 53. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadRssiCmd::?relay + 0000090F GAPRole_ProcessEvent (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000915 - 0000091A (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ReadBufSizeCmd::?relay + 00000915 gapReadBD_ADDRStatus (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000091B - 00000920 (0x6 bytes), align: 0 + Segment part 65. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetRandomAddressCmd::?relay + 0000091B gapProcessNewAddr (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000921 - 00000926 (0x6 bytes), align: 0 + Segment part 67. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvParamCmd::?relay + 00000921 gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000927 - 0000092C (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvDataCmd::?relay + 00000927 GAP_UpdateAdvertisingData (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000092D - 00000932 (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetScanRspDataCmd::?relay + 0000092D GAP_UpdateAdvertisingData (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000933 - 00000938 (0x6 bytes), align: 0 + Segment part 74. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvEnableCmd::?relay + 00000933 GAP_EndDiscoverable (gap_peridevmgr) + gapSetAdvParamsStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000939 - 0000093E (0x6 bytes), align: 0 + Segment part 86. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ClearWhiteListCmd::?relay + 00000939 gapBondMgr_SyncWhiteList (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000093F - 00000944 (0x6 bytes), align: 0 + Segment part 88. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_AddWhiteListCmd::?relay + 0000093F gapBondMgr_SyncWhiteList (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000945 - 0000094A (0x6 bytes), align: 0 + Segment part 100. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_RandCmd::?relay + 00000945 smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000094B - 00000950 (0x6 bytes), align: 0 + Segment part 102. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqReplyCmd::?relay + 0000094B smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000951 - 00000956 (0x6 bytes), align: 0 + Segment part 104. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqNegReplyCmd::?relay + 00000951 smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000957 - 0000095C (0x6 bytes), align: 0 + Segment part 196. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RandCback::?relay 00000957 llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000095D - 00000962 (0x6 bytes), align: 0 + Segment part 198. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetRxGainCback::?relay + 0000095D Segment part 57 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000963 - 00000968 (0x6 bytes), align: 0 + Segment part 201. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetTxPowerCback::?relay + 00000963 Segment part 58 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000969 - 0000096E (0x6 bytes), align: 0 + Segment part 205. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ExtendRfRangeCback::?relay + 00000969 llProcessPostRfOps (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci_data + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003A3 - 000003C2 (0x20 bytes), align: 0 + Segment part 6. Intra module refs: HCI_TxDataBufferInsert + Segment part 20 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003C3 - 000003C3 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: HCI_TxDataBufferInsert + HCI_TxDataSend + LL_TxDataCompleteCback + Segment part 18 + hciTxDataBufferReset + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003C4 - 000003C4 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: HCI_TxDataBufferInsert + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018D01 - 00018DBF (0xbf bytes), align: 0 + Segment part 11. Intra module refs: HCI_TxDataBufferInsert::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataBufferInsert + 00018D01 + calls direct + XSTACK = 00000002 ( 0000000F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DC0 - 00018DCA (0xb bytes), align: 0 + Segment part 13. Intra module refs: HCI_TxDataBufferInsert + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DCB - 00018E90 (0xc6 bytes), align: 0 + Segment part 16. Intra module refs: HCI_TxDataSend::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataSend 00018DCB + calls direct + XSTACK = 0000000F ( 0000000D ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018E91 - 00018E9E (0xe bytes), align: 0 + Segment part 18. Intra module refs: HCI_TxDataSend + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018E9F - 00018EA2 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: HCI_TxDataSend + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EA3 - 00018EAD (0xb bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 24 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EAE - 00018EF6 (0x49 bytes), align: 0 + Segment part 21. Intra module refs: hciTxDataBufferReset::?relay + LOCAL ADDRESS + ===== ======= + hciTxDataBufferReset 00018EAE + calls direct + XSTACK = 0000000C ( 0000000B ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EF7 - 00018F02 (0xc bytes), align: 0 + Segment part 23. Intra module refs: HCI_TxDataBufferInsert + hciTxDataBufferReset + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F03 - 00018F18 (0x16 bytes), align: 0 + Segment part 24. Intra module refs: hciTxDataBufferReset + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F19 - 00018F23 (0xb bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F24 - 00018F60 (0x3d bytes), align: 0 + Segment part 26. Intra module refs: LL_RxReqDataBufCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxReqDataBufCback 00018F24 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F61 - 00018F65 (0x5 bytes), align: 0 + Segment part 28. Intra module refs: HCI_TxDataSend + LL_RxReqDataBufCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F66 - 0001906A (0x105 bytes), align: 0 + Segment part 29. Intra module refs: LL_RxDataCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxDataCompleteCback + 00018F66 + calls direct + XSTACK = 00000002 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001906B - 0001906E (0x4 bytes), align: 0 + Segment part 31. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001906F - 0001907C (0xe bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001907D - 00019081 (0x5 bytes), align: 0 + Segment part 33. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019082 - 0001908B (0xa bytes), align: 0 + Segment part 34. Intra module refs: LL_RxDataCompleteCback + Segment part 33 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001908C - 00019092 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019093 - 000190EC (0x5a bytes), align: 0 + Segment part 36. Intra module refs: LL_TxDataCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxDataCompleteCback + 00019093 + calls direct + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000096F - 00000974 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataBufferInsert::?relay + 0000096F HCI_SendDataPkt (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000975 - 0000097A (0x6 bytes), align: 0 + Segment part 17. Intra module refs: HCI_TxDataBufferInsert + LL_TxDataCompleteCback + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataSend::?relay + 00000975 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000097B - 00000980 (0x6 bytes), align: 0 + Segment part 22. Intra module refs: HCI_TxDataSend + LL_TxDataCompleteCback + LOCAL ADDRESS + ===== ======= + hciTxDataBufferReset::?relay + 0000097B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000981 - 00000986 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxReqDataBufCback::?relay + 00000981 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000987 - 0000098C (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxDataCompleteCback::?relay + 00000987 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000098D - 00000992 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxDataCompleteCback::?relay + 0000098D Segment part 265 (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci_event + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003C5 - 000003C5 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_EncLtkReqCback + hciInitEventMasks + ENTRY ADDRESS REF BY + ===== ======= ====== + bleEvtMask 000003C5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003C6 - 000003CD (0x8 bytes), align: 0 + Segment part 7. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_EncLtkReqCback + LL_ReadRemoteVersionInfoCback + hciInitEventMasks + ENTRY ADDRESS REF BY + ===== ======= ====== + pHciEvtMask 000003C6 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010000 - 00010021 (0x22 bytes), align: 0 + Segment part 8. Intra module refs: hciInitEventMasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + hciInitEventMasks 00010000 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010022 - 00010028 (0x7 bytes), align: 0 + Segment part 10. Intra module refs: hciInitEventMasks + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010029 - 0001003C (0x14 bytes), align: 0 + Segment part 11. Intra module refs: HCI_DataBufferOverflowEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DataBufferOverflowEvent + 00010029 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001003D - 00010041 (0x5 bytes), align: 0 + Segment part 13. Intra module refs: HCI_DataBufferOverflowEvent + HCI_VendorSpecifcCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010042 - 00010154 (0x113 bytes), align: 0 + Segment part 14. Intra module refs: HCI_NumOfCompletedPacketsEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_NumOfCompletedPacketsEvent + 00010042 + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010155 - 00010159 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: HCI_CommandCompleteEvent + HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001015A - 0001015E (0x5 bytes), align: 0 + Segment part 17. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001015F - 00010175 (0x17 bytes), align: 0 + Segment part 18. Intra module refs: HCI_NumOfCompletedPacketsEvent + Segment part 17 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010176 - 00010179 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001017A - 00010180 (0x7 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 21 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010181 - 00010186 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010187 - 00010264 (0xde bytes), align: 0 + Segment part 22. Intra module refs: HCI_CommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandCompleteEvent + 00010187 + calls direct + XSTACK = 00000003 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010265 - 00010283 (0x1f bytes), align: 0 + Segment part 24. Intra module refs: HCI_VendorSpecifcCommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_VendorSpecifcCommandCompleteEvent + 00010265 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010284 - 000102DE (0x5b bytes), align: 0 + Segment part 26. Intra module refs: HCI_CommandStatusEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandStatusEvent + 00010284 + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000102DF - 000102F4 (0x16 bytes), align: 0 + Segment part 30. Intra module refs: HCI_DataBufferOverflowEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000102F5 - 0001030C (0x18 bytes), align: 0 + Segment part 31. Intra module refs: HCI_DataBufferOverflowEvent + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001030D - 00010310 (0x4 bytes), align: 0 + Segment part 32. Intra module refs: LL_EncLtkReqCback + Segment part 30 + Segment part 31 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010311 - 0001034D (0x3d bytes), align: 0 + Segment part 33. Intra module refs: HCI_SendCommandStatusEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandStatusEvent + 00010311 + calls direct + XSTACK = 0000000B ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001034E - 00010353 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: HCI_CommandCompleteEvent + HCI_CommandStatusEvent + HCI_SendCommandCompleteEvent + HCI_SendCommandStatusEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010354 - 00010455 (0x102 bytes), align: 0 + Segment part 36. Intra module refs: HCI_SendCommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandCompleteEvent + 00010354 + calls direct + XSTACK = 00000014 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010456 - 0001045A (0x5 bytes), align: 0 + Segment part 38. Intra module refs: HCI_SendCommandCompleteEvent + LL_ConnParamUpdateCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001045B - 00010463 (0x9 bytes), align: 0 + Segment part 39. Intra module refs: HCI_SendCommandCompleteEvent + Segment part 20 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010464 - 00010467 (0x4 bytes), align: 0 + Segment part 40. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010468 - 0001046C (0x5 bytes), align: 0 + Segment part 41. Intra module refs: Segment part 40 + Segment part 43 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001046D - 00010470 (0x4 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 30 + Segment part 41 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010471 - 00010475 (0x5 bytes), align: 0 + Segment part 43. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010476 - 00010478 (0x3 bytes), align: 0 + Segment part 44. Intra module refs: HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010479 - 0001047E (0x6 bytes), align: 0 + Segment part 45. Intra module refs: LL_EncLtkReqCback + Segment part 44 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001047F - 0001047F (0x1 bytes), align: 0 + Segment part 46. Intra module refs: HCI_CommandCompleteEvent + LL_EncLtkReqCback + Segment part 45 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010480 - 00010485 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: LL_ConnectionCompleteCback + Segment part 46 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010486 - 0001048E (0x9 bytes), align: 0 + Segment part 48. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001048F - 00010492 (0x4 bytes), align: 0 + Segment part 49. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010493 - 0001049A (0x8 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + Segment part 51 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001049B - 000104A0 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000104A1 - 000104FD (0x5d bytes), align: 0 + Segment part 52. Intra module refs: HCI_SendControllerToHostEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendControllerToHostEvent + 000104A1 + calls direct + XSTACK = 0000000D ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000104FE - 00010501 (0x4 bytes), align: 0 + Segment part 54. Intra module refs: HCI_NumOfCompletedPacketsEvent + HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010502 - 00010507 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: Segment part 110 + Segment part 152 + Segment part 54 + Segment part 94 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010508 - 00010514 (0xd bytes), align: 0 + Segment part 56. Intra module refs: HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010515 - 00010520 (0xc bytes), align: 0 + Segment part 57. Intra module refs: HCI_CommandCompleteEvent + Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010521 - 00010524 (0x4 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010525 - 0001052D (0x9 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 50 + Segment part 58 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001052E - 00010532 (0x5 bytes), align: 0 + Segment part 62. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010533 - 00010537 (0x5 bytes), align: 0 + Segment part 66. Intra module refs: HCI_SendControllerToHostEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010538 - 00010538 (0x1 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 100 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010539 - 0001053F (0x7 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 42 + Segment part 69 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010540 - 00010727 (0x1e8 bytes), align: 0 + Segment part 72. Intra module refs: LL_ConnectionCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnectionCompleteCback + 00010540 + calls direct + XSTACK = 00000009 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010728 - 0001072B (0x4 bytes), align: 0 + Segment part 74. Intra module refs: HCI_SendCommandCompleteEvent + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001072C - 00010736 (0xb bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + Segment part 76 + Segment part 77 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010737 - 0001073B (0x5 bytes), align: 0 + Segment part 76. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001073C - 00010741 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010742 - 00010747 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010748 - 00010750 (0x9 bytes), align: 0 + Segment part 79. Intra module refs: LL_ConnectionCompleteCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010751 - 00010754 (0x4 bytes), align: 0 + Segment part 80. Intra module refs: LL_ConnectionCompleteCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010755 - 00010758 (0x4 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 138 + Segment part 80 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010759 - 00010767 (0xf bytes), align: 0 + Segment part 82. Intra module refs: Segment part 147 + Segment part 81 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010768 - 00010775 (0xe bytes), align: 0 + Segment part 83. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010776 - 00010779 (0x4 bytes), align: 0 + Segment part 84. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001077A - 00010782 (0x9 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + Segment part 88 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010783 - 00010786 (0x4 bytes), align: 0 + Segment part 86. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010787 - 0001078A (0x4 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001078B - 00010791 (0x7 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 87 + Segment part 91 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010792 - 00010797 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010798 - 0001079B (0x4 bytes), align: 0 + Segment part 90. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001079C - 000107A3 (0x8 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + Segment part 95 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107A4 - 000107AD (0xa bytes), align: 0 + Segment part 92. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107AE - 000107B1 (0x4 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 152 + Segment part 92 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107B2 - 000107B7 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 101 + Segment part 107 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107B8 - 000107BE (0x7 bytes), align: 0 + Segment part 95. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107BF - 0001082A (0x6c bytes), align: 0 + Segment part 96. Intra module refs: LL_DisconnectCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_DisconnectCback 000107BF + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001082B - 0001082F (0x5 bytes), align: 0 + Segment part 98. Intra module refs: LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010830 - 00010833 (0x4 bytes), align: 0 + Segment part 99. Intra module refs: LL_ConnectionCompleteCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010834 - 0001083A (0x7 bytes), align: 0 + Segment part 100. Intra module refs: Segment part 123 + Segment part 99 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001083B - 0001083E (0x4 bytes), align: 0 + Segment part 101. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001083F - 00010842 (0x4 bytes), align: 0 + Segment part 102. Intra module refs: LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010843 - 0001084F (0xd bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + Segment part 104 + Segment part 30 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010850 - 00010855 (0x6 bytes), align: 0 + Segment part 104. Intra module refs: LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010856 - 000108FF (0xaa bytes), align: 0 + Segment part 105. Intra module refs: LL_ConnParamUpdateCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnParamUpdateCback + 00010856 + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010900 - 00010905 (0x6 bytes), align: 0 + Segment part 107. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010906 - 00010909 (0x4 bytes), align: 0 + Segment part 108. Intra module refs: LL_ConnParamUpdateCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001090A - 00010910 (0x7 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010911 - 00010919 (0x9 bytes), align: 0 + Segment part 110. Intra module refs: Segment part 109 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001091A - 0001091E (0x5 bytes), align: 0 + Segment part 111. Intra module refs: LL_ConnParamUpdateCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001091F - 00010920 (0x2 bytes), align: 0 + Segment part 112. Intra module refs: HCI_CommandCompleteEvent + Segment part 111 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010921 - 00010921 (0x1 bytes), align: 0 + Segment part 113. Intra module refs: LL_ConnParamUpdateCback + Segment part 112 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010922 - 00010923 (0x2 bytes), align: 0 + Segment part 114. Intra module refs: LL_ConnectionCompleteCback + Segment part 113 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010924 - 00010929 (0x6 bytes), align: 0 + Segment part 115. Intra module refs: LL_EncChangeCback + Segment part 114 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001092A - 000109BC (0x93 bytes), align: 0 + Segment part 116. Intra module refs: LL_ReadRemoteVersionInfoCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRemoteVersionInfoCback + 0001092A + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109BD - 000109C2 (0x6 bytes), align: 0 + Segment part 118. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C3 - 000109C6 (0x4 bytes), align: 0 + Segment part 119. Intra module refs: Segment part 118 + Segment part 66 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C7 - 000109C7 (0x1 bytes), align: 0 + Segment part 120. Intra module refs: Segment part 119 + Segment part 126 + Segment part 59 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C8 - 000109CF (0x8 bytes), align: 0 + Segment part 121. Intra module refs: Segment part 120 + Segment part 20 + Segment part 70 + Segment part 88 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109D0 - 000109D7 (0x8 bytes), align: 0 + Segment part 122. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_EncLtkReqCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109D8 - 000109E1 (0xa bytes), align: 0 + Segment part 123. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109E2 - 000109E5 (0x4 bytes), align: 0 + Segment part 124. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109E6 - 000109E9 (0x4 bytes), align: 0 + Segment part 125. Intra module refs: Segment part 124 + Segment part 127 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109EA - 000109F3 (0xa bytes), align: 0 + Segment part 126. Intra module refs: Segment part 125 + Segment part 129 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109F4 - 000109F9 (0x6 bytes), align: 0 + Segment part 127. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109FA - 000109FD (0x4 bytes), align: 0 + Segment part 128. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109FE - 00010A05 (0x8 bytes), align: 0 + Segment part 129. Intra module refs: Segment part 128 + Segment part 130 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010A06 - 00010A0B (0x6 bytes), align: 0 + Segment part 130. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010A0C - 00010B4E (0x143 bytes), align: 0 + Segment part 131. Intra module refs: LL_EncLtkReqCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReqCback 00010A0C + calls direct + XSTACK = 00000002 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B4F - 00010B52 (0x4 bytes), align: 0 + Segment part 133. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B53 - 00010B57 (0x5 bytes), align: 0 + Segment part 134. Intra module refs: LL_EncLtkReqCback + Segment part 133 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B58 - 00010B64 (0xd bytes), align: 0 + Segment part 135. Intra module refs: HCI_SendControllerToHostEvent + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B65 - 00010B66 (0x2 bytes), align: 0 + Segment part 136. Intra module refs: LL_ConnParamUpdateCback + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B67 - 00010B6F (0x9 bytes), align: 0 + Segment part 137. Intra module refs: LL_ConnParamUpdateCback + LL_EncLtkReqCback + Segment part 136 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B70 - 00010B77 (0x8 bytes), align: 0 + Segment part 138. Intra module refs: HCI_SendControllerToHostEvent + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B78 - 00010BC3 (0x4c bytes), align: 0 + Segment part 139. Intra module refs: LL_EncChangeCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncChangeCback 00010B78 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC4 - 00010BC4 (0x1 bytes), align: 0 + Segment part 141. Intra module refs: HCI_NumOfCompletedPacketsEvent + HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC5 - 00010BC7 (0x3 bytes), align: 0 + Segment part 142. Intra module refs: HCI_SendControllerToHostEvent + LL_ReadRemoteVersionInfoCback + Segment part 141 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC8 - 00010BCD (0x6 bytes), align: 0 + Segment part 143. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_EncLtkReqCback + Segment part 142 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BCE - 00010BCF (0x2 bytes), align: 0 + Segment part 144. Intra module refs: HCI_DataBufferOverflowEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BD0 - 00010BD7 (0x8 bytes), align: 0 + Segment part 145. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_ReadRemoteVersionInfoCback + Segment part 144 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BD8 - 00010BE7 (0x10 bytes), align: 0 + Segment part 146. Intra module refs: LL_ConnParamUpdateCback + LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BE8 - 00010C03 (0x1c bytes), align: 0 + Segment part 147. Intra module refs: Segment part 146 + Segment part 31 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C04 - 00010C0A (0x7 bytes), align: 0 + Segment part 148. Intra module refs: Segment part 103 + Segment part 147 + Segment part 32 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C0B - 00010C52 (0x48 bytes), align: 0 + Segment part 149. Intra module refs: LL_EncKeyRefreshCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncKeyRefreshCback 00010C0B + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C53 - 00010C5D (0xb bytes), align: 0 + Segment part 151. Intra module refs: LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C5E - 00010C75 (0x18 bytes), align: 0 + Segment part 152. Intra module refs: LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C76 - 00010C81 (0xc bytes), align: 0 + Segment part 155. Intra module refs: HCI_SendCommandStatusEvent + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000993 - 00000998 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + hciInitEventMasks::?relay + 00000993 HCI_Init (hci_tl) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000999 - 0000099E (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DataBufferOverflowEvent::?relay + 00000999 HCI_TxDataBufferInsert (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000099F - 000009A4 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_NumOfCompletedPacketsEvent::?relay + 0000099F HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + LL_TxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009A5 - 000009AA (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandCompleteEvent::?relay + 000009A5 HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + LL_RandCback (hci) + Segment part 115 (hci) + Segment part 132 (hci) + Segment part 152 (hci) + Segment part 68 (hci) + Segment part 81 (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009AB - 000009B0 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_VendorSpecifcCommandCompleteEvent::?relay + 000009AB Segment part 199 (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009B1 - 000009B6 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandStatusEvent::?relay + 000009B1 HCI_DisconnectCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009B7 - 000009BC (0x6 bytes), align: 0 + Segment part 34. Intra module refs: HCI_CommandStatusEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandStatusEvent::?relay + 000009B7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009BD - 000009C2 (0x6 bytes), align: 0 + Segment part 37. Intra module refs: HCI_CommandCompleteEvent + HCI_VendorSpecifcCommandCompleteEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandCompleteEvent::?relay + 000009BD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009C3 - 000009C8 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: HCI_SendCommandStatusEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendControllerToHostEvent::?relay + 000009C3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009C9 - 000009CE (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnectionCompleteCback::?relay + 000009C9 LL_ProcessEvent (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009CF - 000009D4 (0x6 bytes), align: 0 + Segment part 97. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_DisconnectCback::?relay + 000009CF llConnTerminate (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009D5 - 000009DA (0x6 bytes), align: 0 + Segment part 106. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnParamUpdateCback::?relay + 000009D5 llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009DB - 000009E0 (0x6 bytes), align: 0 + Segment part 117. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRemoteVersionInfoCback::?relay + 000009DB llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009E1 - 000009E6 (0x6 bytes), align: 0 + Segment part 132. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReqCback::?relay + 000009E1 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009E7 - 000009EC (0x6 bytes), align: 0 + Segment part 140. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncChangeCback::?relay + 000009E7 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009ED - 000009F2 (0x6 bytes), align: 0 + Segment part 150. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncKeyRefreshCback::?relay + 000009ED llProcessSlaveControlProcedures (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_if + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A9A9 - 0001AA11 (0x69 bytes), align: 0 + Segment part 6. Intra module refs: L2CAP_RegisterApp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_RegisterApp 0001A9A9 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA12 - 0001AA65 (0x54 bytes), align: 0 + Segment part 8. Intra module refs: L2CAP_SendData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_SendData 0001AA12 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA66 - 0001AA87 (0x22 bytes), align: 0 + Segment part 10. Intra module refs: L2CAP_CmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_CmdReject 0001AA66 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA88 - 0001AA8C (0x5 bytes), align: 0 + Segment part 16. Intra module refs: L2CAP_ConnParamUpdateReq + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA8D - 0001AAB0 (0x24 bytes), align: 0 + Segment part 17. Intra module refs: L2CAP_ConnParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ConnParamUpdateReq + 0001AA8D + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAB1 - 0001AAB3 (0x3 bytes), align: 0 + Segment part 19. Intra module refs: L2CAP_CmdReject + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAB4 - 0001AAB8 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 16 + Segment part 19 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAB9 - 0001AABD (0x5 bytes), align: 0 + Segment part 21. Intra module refs: L2CAP_SendData + Segment part 20 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009F3 - 000009F8 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_RegisterApp::?relay + 000009F3 GAP_Init (gap_task) + GATT_Init (gatt_task) + SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009F9 - 000009FE (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_SendData::?relay + 000009F9 attSendMsg (att_util) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009FF - 00000A04 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_CmdReject::?relay + 000009FF gapProcessOSALMsg (gap_task) + l2capProcessReq (l2cap_task) + l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A05 - 00000A0A (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ConnParamUpdateReq::?relay + 00000A05 gapRole_startConnUpdate (peripheral) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003CE - 000003CE (0x1 bytes), align: 0 + Segment part 6. Intra module refs: L2CAP_Init + L2CAP_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capTaskID 000003CE l2capEncapSendData (l2cap_util) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003CF - 000003DA (0xc bytes), align: 0 + Segment part 7. Intra module refs: L2CAP_Init + l2capProcessReq + l2capProcessRxData + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFixedChannels 000003CF L2CAP_RegisterApp (l2cap_if) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003DB - 000003F2 (0x18 bytes), align: 0 + Segment part 8. Intra module refs: L2CAP_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capChannels 000003DB Segment part 108 (l2cap_util) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018477 - 000184E3 (0x6d bytes), align: 0 + Segment part 9. Intra module refs: L2CAP_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_Init 00018477 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000184E4 - 00018529 (0x46 bytes), align: 0 + Segment part 11. Intra module refs: L2CAP_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ProcessEvent 000184E4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001852A - 0001852E (0x5 bytes), align: 0 + Segment part 13. Intra module refs: L2CAP_ProcessEvent + l2capProcessSignal + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001852F - 00018623 (0xf5 bytes), align: 0 + Segment part 14. Intra module refs: l2capProcessRxData::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessRxData 0001852F + calls direct + XSTACK = 0000000C ( 0000000F ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018624 - 0001871F (0xfc bytes), align: 0 + Segment part 16. Intra module refs: l2capProcessSignal::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessSignal 00018624 + calls direct + XSTACK = 0000000F ( 00000018 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018720 - 00018809 (0xea bytes), align: 0 + Segment part 18. Intra module refs: l2capProcessRsp::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessRsp 00018720 + calls direct + XSTACK = 00000018 ( 0000001F ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001880A - 000188C4 (0xbb bytes), align: 0 + Segment part 20. Intra module refs: l2capProcessReq::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessReq 0001880A + calls direct + XSTACK = 00000018 ( 00000024 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000188C5 - 000188CB (0x7 bytes), align: 0 + Segment part 22. Intra module refs: l2capProcessReq + l2capProcessRxData + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A0B - 00000A10 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_Init::?relay 00000A0B osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A11 - 00000A16 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ProcessEvent::?relay + 00000A11 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A17 - 00000A1C (0x6 bytes), align: 0 + Segment part 15. Intra module refs: L2CAP_ProcessEvent + LOCAL ADDRESS + ===== ======= + l2capProcessRxData::?relay + 00000A17 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A1D - 00000A22 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: l2capProcessRxData + LOCAL ADDRESS + ===== ======= + l2capProcessSignal::?relay + 00000A1D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A23 - 00000A28 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: l2capProcessSignal + LOCAL ADDRESS + ===== ======= + l2capProcessRsp::?relay + 00000A23 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A29 - 00000A2E (0x6 bytes), align: 0 + Segment part 21. Intra module refs: l2capProcessSignal + LOCAL ADDRESS + ===== ======= + l2capProcessReq::?relay + 00000A29 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_util + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003F3 - 000003F3 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F8D - 00013FB4 (0x28 bytes), align: 0 + Segment part 7. Intra module refs: l2capParseSignalHdr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseSignalHdr 00013F8D + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FB5 - 00013FB5 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: l2capParsePacket + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FB6 - 00013FBD (0x8 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 9 + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FBE - 00013FBF (0x2 bytes), align: 0 + Segment part 11. Intra module refs: l2capParseCmdReject + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FC0 - 00013FC3 (0x4 bytes), align: 0 + Segment part 12. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 11 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FC4 - 00013FCE (0xb bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013FCF - 000140A3 (0xd5 bytes), align: 0 + Segment part 14. Intra module refs: l2capSendReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendReq 00013FCF + calls direct + XSTACK = 00000004 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000140A4 - 000140A8 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: l2capNotifySignal + l2capSendCmd + l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000140A9 - 00014179 (0xd1 bytes), align: 0 + Segment part 17. Intra module refs: l2capSendCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendCmd 000140A9 + calls direct + XSTACK = 00000016 ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001417A - 00014181 (0x8 bytes), align: 0 + Segment part 19. Intra module refs: l2capSendCmd + l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014182 - 0001425B (0xda bytes), align: 0 + Segment part 20. Intra module refs: l2capEncapSendData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capEncapSendData 00014182 + calls direct + XSTACK = 00000018 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001425C - 00014260 (0x5 bytes), align: 0 + Segment part 22. Intra module refs: l2capEncapSendData + l2capParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014261 - 00014264 (0x4 bytes), align: 0 + Segment part 23. Intra module refs: l2capEncapSendData + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014265 - 00014273 (0xf bytes), align: 0 + Segment part 24. Intra module refs: l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014274 - 0001427C (0x9 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001427D - 00014351 (0xd5 bytes), align: 0 + Segment part 26. Intra module refs: l2capParsePacket::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParsePacket 0001427D + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014352 - 00014353 (0x2 bytes), align: 0 + Segment part 28. Intra module refs: l2capParsePacket + l2capStopTimer + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014354 - 0001435B (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001435C - 000143B0 (0x55 bytes), align: 0 + Segment part 30. Intra module refs: L2CAP_BuildCmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_BuildCmdReject 0001435C + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000143B1 - 000143C3 (0x13 bytes), align: 0 + Segment part 32. Intra module refs: L2CAP_BuildCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000143C4 - 000143C7 (0x4 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 23 + Segment part 32 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000143C8 - 00014449 (0x82 bytes), align: 0 + Segment part 34. Intra module refs: l2capParseCmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseCmdReject 000143C8 + XSTACK = 00000002 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001444A - 00014454 (0xb bytes), align: 0 + Segment part 36. Intra module refs: l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014455 - 00014455 (0x1 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014456 - 0001445D (0x8 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 39 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001445E - 00014464 (0x7 bytes), align: 0 + Segment part 52. Intra module refs: l2capFreeChannel + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014465 - 0001446D (0x9 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 77 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001446E - 00014472 (0x5 bytes), align: 0 + Segment part 62. Intra module refs: L2CAP_bm_alloc + l2capFindLocalId + l2capHandleTimerCB + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014473 - 00014477 (0x5 bytes), align: 0 + Segment part 65. Intra module refs: l2capAllocChannel + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014478 - 0001447C (0x5 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001447D - 00014486 (0xa bytes), align: 0 + Segment part 68. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 67 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014487 - 0001448E (0x8 bytes), align: 0 + Segment part 70. Intra module refs: l2capNotifySignal + l2capSendCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001448F - 000144B1 (0x23 bytes), align: 0 + Segment part 71. Intra module refs: l2capBuildParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capBuildParamUpdateReq + 0001448F + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144B2 - 000144B5 (0x4 bytes), align: 0 + Segment part 73. Intra module refs: L2CAP_BuildCmdReject + l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144B6 - 000144C4 (0xf bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144C5 - 000144CB (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 33 + Segment part 58 + Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144CC - 000144D4 (0x9 bytes), align: 0 + Segment part 76. Intra module refs: l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144D5 - 000144E4 (0x10 bytes), align: 0 + Segment part 77. Intra module refs: L2CAP_BuildCmdReject + l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144E5 - 000144E8 (0x4 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 77 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144E9 - 000144F3 (0xb bytes), align: 0 + Segment part 79. Intra module refs: Segment part 74 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144F4 - 000144F4 (0x1 bytes), align: 0 + Segment part 80. Intra module refs: l2capParseSignalHdr + l2capStopTimer + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144F5 - 000144F9 (0x5 bytes), align: 0 + Segment part 81. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 80 + l2capBuildParamUpdateReq + l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000144FA - 00014531 (0x38 bytes), align: 0 + Segment part 82. Intra module refs: L2CAP_ParseParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ParseParamUpdateReq + 000144FA + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014532 - 00014537 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: L2CAP_ParseParamUpdateReq + l2capHandleTimerCB + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014538 - 00014549 (0x12 bytes), align: 0 + Segment part 85. Intra module refs: L2CAP_ParseParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001454A - 0001454D (0x4 bytes), align: 0 + Segment part 86. Intra module refs: L2CAP_ParseParamUpdateReq + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001454E - 00014560 (0x13 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014561 - 0001457C (0x1c bytes), align: 0 + Segment part 90. Intra module refs: l2capParseParamUpdateRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseParamUpdateRsp + 00014561 + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001457D - 00014585 (0x9 bytes), align: 0 + Segment part 92. Intra module refs: l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014586 - 0001458B (0x6 bytes), align: 0 + Segment part 93. Intra module refs: l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001458C - 000145FC (0x71 bytes), align: 0 + Segment part 94. Intra module refs: l2capNotifyData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifyData 0001458C + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000145FD - 00014681 (0x85 bytes), align: 0 + Segment part 96. Intra module refs: l2capNotifySignal::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifySignal 000145FD + calls direct + XSTACK = 0000000D ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014682 - 00014689 (0x8 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 99 + l2capNotifyData + l2capNotifySignal + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001468A - 0001468F (0x6 bytes), align: 0 + Segment part 99. Intra module refs: l2capNotifySignal + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014690 - 000146E8 (0x59 bytes), align: 0 + Segment part 100. Intra module refs: l2capAllocChannel::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capAllocChannel 00014690 + XSTACK = 00000012 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146E9 - 000146ED (0x5 bytes), align: 0 + Segment part 102. Intra module refs: l2capAllocChannel + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146EE - 000146F8 (0xb bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146F9 - 0001470D (0x15 bytes), align: 0 + Segment part 104. Intra module refs: l2capFreeChannel::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFreeChannel 000146F9 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001470E - 00014745 (0x38 bytes), align: 0 + Segment part 106. Intra module refs: l2capFindLocalId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFindLocalId 0001470E + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014746 - 00014755 (0x10 bytes), align: 0 + Segment part 108. Intra module refs: l2capAllocChannel + l2capFindLocalId + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014756 - 0001476E (0x19 bytes), align: 0 + Segment part 109. Intra module refs: l2capStopTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capStopTimer 00014756 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001476F - 000147D3 (0x65 bytes), align: 0 + Segment part 111. Intra module refs: l2capHandleTimerCB::?relay + LOCAL ADDRESS + ===== ======= + l2capHandleTimerCB 0001476F + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000147D4 - 000147D6 (0x3 bytes), align: 0 + Segment part 113. Intra module refs: l2capHandleRxError::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capHandleRxError 000147D4 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000147D7 - 000147FA (0x24 bytes), align: 0 + Segment part 115. Intra module refs: L2CAP_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_bm_alloc 000147D7 + calls direct + XSTACK = 00000018 ( 0000000A ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A2F - 00000A34 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseSignalHdr::?relay + 00000A2F l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A35 - 00000A3A (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendReq::?relay 00000A35 Segment part 16 (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A3B - 00000A40 (0x6 bytes), align: 0 + Segment part 18. Intra module refs: l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendCmd::?relay 00000A3B Segment part 19 (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A41 - 00000A46 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: l2capSendCmd + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capEncapSendData::?relay + 00000A41 L2CAP_SendData (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A47 - 00000A4C (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParsePacket::?relay + 00000A47 l2capProcessRxData (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A4D - 00000A52 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_BuildCmdReject::?relay + 00000A4D L2CAP_CmdReject (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A53 - 00000A58 (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseCmdReject::?relay + 00000A53 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A59 - 00000A5E (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capBuildParamUpdateReq::?relay + 00000A59 L2CAP_ConnParamUpdateReq (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A5F - 00000A64 (0x6 bytes), align: 0 + Segment part 83. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ParseParamUpdateReq::?relay + 00000A5F l2capProcessReq (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A65 - 00000A6A (0x6 bytes), align: 0 + Segment part 91. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseParamUpdateRsp::?relay + 00000A65 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A6B - 00000A70 (0x6 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifyData::?relay + 00000A6B l2capProcessRxData (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A71 - 00000A76 (0x6 bytes), align: 0 + Segment part 97. Intra module refs: l2capHandleTimerCB + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifySignal::?relay + 00000A71 l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A77 - 00000A7C (0x6 bytes), align: 0 + Segment part 101. Intra module refs: l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capAllocChannel::?relay + 00000A77 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A7D - 00000A82 (0x6 bytes), align: 0 + Segment part 105. Intra module refs: l2capHandleTimerCB + l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFreeChannel::?relay + 00000A7D l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A83 - 00000A88 (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFindLocalId::?relay + 00000A83 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A89 - 00000A8E (0x6 bytes), align: 0 + Segment part 110. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capStopTimer::?relay + 00000A89 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A8F - 00000A94 (0x6 bytes), align: 0 + Segment part 112. Intra module refs: l2capSendReq + LOCAL ADDRESS + ===== ======= + l2capHandleTimerCB::?relay + 00000A8F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A95 - 00000A9A (0x6 bytes), align: 0 + Segment part 114. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capHandleRxError::?relay + 00000A95 l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A9B - 00000AA0 (0x6 bytes), align: 0 + Segment part 116. Intra module refs: l2capSendCmd + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_bm_alloc::?relay + 00000A9B attSendMsg (att_util) + smSendSMMsg (smp) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : linkdb + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003F4 - 00000416 (0x23 bytes), align: 0 + Segment part 6. Intra module refs: linkDB_Find + linkDB_FindFirst + linkDB_Init + linkDB_NumActive + linkDB_PerformFunc + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000417 - 0000042E (0x18 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 37 + linkDB_Register + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007CF6 - 00007D1D (0x28 bytes), align: 0 + Segment part 8. Intra module refs: linkDB_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Init 00007CF6 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007D1E - 00007D5B (0x3e bytes), align: 0 + Segment part 10. Intra module refs: linkDB_Register::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Register 00007D1E + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007D5C - 00007E19 (0xbe bytes), align: 0 + Segment part 12. Intra module refs: linkDB_Add::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Add 00007D5C + calls direct + XSTACK = 00000004 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E1A - 00007E7B (0x62 bytes), align: 0 + Segment part 14. Intra module refs: linkDB_Remove::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Remove 00007E1A + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E7C - 00007E84 (0x9 bytes), align: 0 + Segment part 18. Intra module refs: linkDB_Remove + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E85 - 00007EA0 (0x1c bytes), align: 0 + Segment part 19. Intra module refs: linkDB_Find::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Find 00007E85 + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EA1 - 00007EC1 (0x21 bytes), align: 0 + Segment part 21. Intra module refs: linkDB_FindFirst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_FindFirst 00007EA1 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EC2 - 00007EC8 (0x7 bytes), align: 0 + Segment part 23. Intra module refs: linkDB_Find + linkDB_FindFirst + linkDB_Init + linkDB_NumActive + linkDB_PerformFunc + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EC9 - 00007EF3 (0x2b bytes), align: 0 + Segment part 24. Intra module refs: linkDB_State::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_State 00007EC9 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EF4 - 00007EF8 (0x5 bytes), align: 0 + Segment part 26. Intra module refs: linkDB_Remove + linkDB_State + reportStatusChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EF9 - 00007F07 (0xf bytes), align: 0 + Segment part 27. Intra module refs: linkDB_NumActive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_NumActive 00007EF9 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F08 - 00007F78 (0x71 bytes), align: 0 + Segment part 29. Intra module refs: linkDB_Authen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Authen 00007F08 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F79 - 00007F7C (0x4 bytes), align: 0 + Segment part 31. Intra module refs: linkDB_Add + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F7D - 00007F81 (0x5 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + linkDB_Authen + linkDB_Remove + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F82 - 00007FA7 (0x26 bytes), align: 0 + Segment part 33. Intra module refs: linkDB_PerformFunc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_PerformFunc 00007F82 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FA8 - 00007FDE (0x37 bytes), align: 0 + Segment part 35. Intra module refs: reportStatusChange::?relay + LOCAL ADDRESS + ===== ======= + reportStatusChange 00007FA8 + XSTACK = 00000014 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FDF - 00007FEF (0x11 bytes), align: 0 + Segment part 37. Intra module refs: linkDB_Init + reportStatusChange + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AA1 - 00000AA6 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Init::?relay 00000AA1 GAP_Init (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AA7 - 00000AAC (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Register::?relay + 00000AA7 Actimetry_AddService (actimetryservice) + GATTServApp_Init (gattservapp) + GATT_InitServer (gatt_server) + Gps_AddService (gpsservice) + SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AAD - 00000AB2 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Add::?relay 00000AAD gapProcessConnectionCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AB3 - 00000AB8 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Remove::?relay 00000AB3 gapProcessDisconnectCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AB9 - 00000ABE (0x6 bytes), align: 0 + Segment part 20. Intra module refs: linkDB_Add + linkDB_Authen + linkDB_Remove + linkDB_State + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Find::?relay 00000AB9 ?Subroutine13 (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAP_Bond (gap_linkmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 48 (gap_linkmgr) + Segment part 61 (gap_linkmgr) + Segment part 84 (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + sendAuthEvent (gap_linkmgr) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ABF - 00000AC4 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_FindFirst::?relay + 00000ABF disconnectNext (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AC5 - 00000ACA (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_State::?relay 00000AC5 Actimetry_HandleConnStatusCB (actimetryservice) + L2CAP_SendData (l2cap_if) + attSendMsg (att_util) + gattServApp_HandleConnStatusCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gps_HandleConnStatusCB (gpsservice) + l2capSendReq (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ACB - 00000AD0 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_NumActive::?relay + 00000ACB GAP_NumActiveConnections (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AD1 - 00000AD6 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Authen::?relay 00000AD1 GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_VerifyReadPermissions (gatt_server) + GATT_VerifyWritePermissions (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AD7 - 00000ADC (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_PerformFunc::?relay + 00000AD7 GAPBondMgr_ServiceChangeInd (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ADD - 00000AE2 (0x6 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 18 + linkDB_Add + LOCAL ADDRESS + ===== ======= + reportStatusChange::?relay + 00000ADD + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000AB - 000000AB (0x1 bytes), align: 0 + Segment part 4. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + P0IEN 000000AB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AC - 000000AC (0x1 bytes), align: 0 + Segment part 5. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + P2IEN 000000AC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AE - 000000AE (0x1 bytes), align: 0 + Segment part 6. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + PMUX 000000AE + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F2 - 000000F2 (0x1 bytes), align: 0 + Segment part 8. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + APCFG 000000F2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F3 - 000000F3 (0x1 bytes), align: 0 + Segment part 9. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + P0SEL 000000F3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F5 - 000000F5 (0x1 bytes), align: 0 + Segment part 11. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + P2SEL 000000F5 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FD - 000000FD (0x1 bytes), align: 0 + Segment part 12. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + P0DIR 000000FD + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D9 - 000000D9 (0x1 bytes), align: 0 + Segment part 16. ROOT. Intra module refs: llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncReq (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFD 000000D9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E1 - 000000E1 (0x1 bytes), align: 0 + Segment part 17. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + LL_Reset + LL_SetAdvControl + PHY_CommitRxFifo (phy) + PHY_DeallocateRxFifo (phy) + PHY_RetryRxFifo (phy) + PHY_RetryTxFifo (phy) + llAdvEvt_TaskAbort (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llReleaseAllConnId (ll_common) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llSetupAdv (ll_common) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncReq (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFST 000000E1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000042F - 00000434 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: LL_Init + LL_ReadBDADDR + LL_SetAdvParam + Segment part 229 + ENTRY ADDRESS REF BY + ===== ======= ====== + ownPublicAddr 0000042F + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000435 - 0000043A (0x6 bytes), align: 0 + Segment part 24. Intra module refs: LL_Init + LL_SetAdvParam + LL_SetRandomAddress + ENTRY ADDRESS REF BY + ===== ======= ====== + ownRandomAddr 00000435 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000043B - 00000440 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 229 + ENTRY ADDRESS REF BY + ===== ======= ====== + ownSavedPublicAddr 0000043B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000441 - 00000441 (0x1 bytes), align: 0 + Segment part 26. Intra module refs: LL_Init + LL_ProcessEvent + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TaskID 00000441 RF_NormalIsr (ll_isr) + Segment part 71 (ll_advEndCauses) + llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000442 - 00000442 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: LL_EncLtkNegReply + LL_EncLtkReply + LL_ProcessEvent + LL_Rand + LL_ReadRssi + LL_Reset + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + llState 00000442 LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + RF_NormalIsr (ll_isr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llFreeTask (ll_scheduler) + llRestoreConnState (ll_scheduler) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncRsp (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000443 - 00000443 (0x1 bytes), align: 0 + Segment part 28. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskEndCause 00000443 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000444 - 00000445 (0x2 bytes), align: 0 + Segment part 29. Intra module refs: LL_Rand + LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + postRfOperations 00000444 Segment part 57 (ll_common) + Segment part 58 (ll_common) + llProcessPostRfOps (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000446 - 00000446 (0x1 bytes), align: 0 + Segment part 30. Intra module refs: LL_ReadRssi + ENTRY ADDRESS REF BY + ===== ======= ====== + rssiCorrection 00000446 llSetRxGain (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000447 - 00000447 (0x1 bytes), align: 0 + Segment part 31. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + clkDivOnHalt 00000447 llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000448 - 00000448 (0x1 bytes), align: 0 + Segment part 32. Intra module refs: LL_ProcessEvent + LL_Reset + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + nvInUse 00000448 llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000449 - 00000454 (0xc bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + rfCounters 00000449 llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000455 - 0000045D (0x9 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + deviceFeatureSet 00000455 Segment part 25 (ll_slaveEndCauses) + llAllocConnId (ll_common) + llInitFeatureSet (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045E - 0000045E (0x1 bytes), align: 0 + Segment part 35. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + maxTxPwrForDTM 0000045E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045F - 00000463 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + verInfo 0000045F llSetupVersionIndReq (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000464 - 0000046B (0x8 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + dtmInfo 00000464 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000046C - 0000046D (0x2 bytes), align: 0 + Segment part 38. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + buildInfo 0000046C + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000046E - 00000575 (0x108 bytes), align: 0 + Segment part 39. Intra module refs: LL_ConnActive + LL_ProcessEvent + LL_ReadRssi + LL_TxData + Segment part 118 + Segment part 243 + ENTRY ADDRESS REF BY + ===== ======= ====== + llConns 0000046E Segment part 266 (ll_common) + Segment part 31 (ll_scheduler) + Segment part 32 (ll_scheduler) + Segment part 60 (ll_slaveEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llConnCleanup (ll_common) + llGetNextConn (ll_common) + llProcessPendingTxData (ll_common) + llReleaseAllConnId (ll_common) + llReleaseConnId (ll_common) + llRestoreConnState (ll_scheduler) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartSlaveSetup (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000576 - 0000057C (0x7 bytes), align: 0 + Segment part 40. Intra module refs: LL_ProcessEvent + LL_Reset + LL_SetAdvParam + Segment part 79 + ENTRY ADDRESS REF BY + ===== ======= ====== + peerInfo 00000576 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000057D - 00000581 (0x5 bytes), align: 0 + Segment part 41. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + chanMapUpdate 0000057D llAllocConnId (ll_common) + llSetNextDataChan (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000582 - 00000582 (0x1 bytes), align: 0 + Segment part 42. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + onePktPerEvt 00000582 llReleaseConnId (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000583 - 00000583 (0x1 bytes), align: 0 + Segment part 43. Intra module refs: LL_Reset + LL_TxData + ENTRY ADDRESS REF BY + ===== ======= ====== + fastTxRespTime 00000583 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000584 - 00000584 (0x1 bytes), align: 0 + Segment part 44. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + slOverride 00000584 llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000585 - 000005D9 (0x55 bytes), align: 0 + Segment part 45. Intra module refs: LL_Init + LL_Reset + LL_SetAdvControl + LL_SetAdvData + LL_SetAdvParam + LL_SetScanRspData + Segment part 164 + Segment part 165 + ENTRY ADDRESS REF BY + ===== ======= ====== + advInfo 00000585 Segment part 102 (ll_common) + Segment part 104 (ll_common) + Segment part 109 (ll_common) + Segment part 110 (ll_common) + Segment part 247 (ll_common) + Segment part 49 (ll_advEndCauses) + Segment part 50 (ll_advEndCauses) + Segment part 52 (ll_advEndCauses) + Segment part 53 (ll_advEndCauses) + Segment part 54 (ll_advEndCauses) + Segment part 56 (ll_advEndCauses) + Segment part 57 (ll_advEndCauses) + Segment part 59 (ll_advEndCauses) + Segment part 63 (ll_advEndCauses) + Segment part 64 (ll_advEndCauses) + Segment part 65 (ll_advEndCauses) + Segment part 68 (ll_advEndCauses) + Segment part 75 (ll_advEndCauses) + Segment part 82 (ll_common) + Segment part 84 (ll_common) + Segment part 88 (ll_common) + Segment part 90 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCheckWhiteListUsage (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupAdv (ll_common) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005DA - 000005DB (0x2 bytes), align: 0 + Segment part 46. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + dcdcData 000005DA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005DC - 000005DC (0x1 bytes), align: 0 + Segment part 47. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + extendRfRange 000005DC llExtendRfRange (ll_common) + llSetRxGain (ll_common) + llSetTxPower (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005DD - 000005DD (0x1 bytes), align: 0 + Segment part 48. Intra module refs: LL_CtrlToHostFlowControl + LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + rxFifoFlowCtrl 000005DD llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005DE - 000005DE (0x1 bytes), align: 0 + Segment part 49. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + haltDuringRf 000005DE llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F0C - 00000F19 (0xe bytes), align: 0 + Segment part 50. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskEndCauses 00000F0C llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F1A - 00000F25 (0xc bytes), align: 0 + Segment part 52. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskErrorEndCauses 00000F1A Segment part 118 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005DF - 000005DF (0x1 bytes), align: 0 + Segment part 55. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + trngCounter 000005DF RF_NormalIsr (ll_isr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +IDATA_Z + Relative segment, address: IDATA 00000029 - 0000002A (0x2 bytes), align: 0 + Segment part 56. ROOT. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + myPC 00000029 RF_NormalIsr (ll_isr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AF98 - 0000B12B (0x194 bytes), align: 0 + Segment part 68. Intra module refs: LL_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Init 0000AF98 + calls direct + XSTACK = 00000000 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B12C - 0000B12D (0x2 bytes), align: 0 + Segment part 70. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B12E - 0000B134 (0x7 bytes), align: 0 + Segment part 71. Intra module refs: LL_Reset + Segment part 70 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B135 - 0000B2F5 (0x1c1 bytes), align: 0 + Segment part 72. Intra module refs: LL_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ProcessEvent 0000B135 + calls direct + XSTACK = 00000000 ( 00000013 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2F6 - 0000B2F8 (0x3 bytes), align: 0 + Segment part 74. Intra module refs: LL_EncLtkNegReply + LL_EncLtkReply + LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2F9 - 0000B2FD (0x5 bytes), align: 0 + Segment part 75. Intra module refs: LL_EncLtkReply + LL_PseudoRand + LL_TxData + Segment part 74 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2FE - 0000B305 (0x8 bytes), align: 0 + Segment part 76. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B306 - 0000B308 (0x3 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 131 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B309 - 0000B30E (0x6 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 177 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B30F - 0000B31A (0xc bytes), align: 0 + Segment part 79. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B31B - 0000B3DB (0xc1 bytes), align: 0 + Segment part 80. Intra module refs: LL_Reset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Reset 0000B31B + calls direct + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B3DC - 0000B3E4 (0x9 bytes), align: 0 + Segment part 82. Intra module refs: LL_Reset + Segment part 71 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B3E5 - 0000B418 (0x34 bytes), align: 0 + Segment part 83. Intra module refs: LL_ReadBDADDR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadBDADDR 0000B3E5 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B419 - 0000B41D (0x5 bytes), align: 0 + Segment part 85. Intra module refs: LL_ReadBDADDR + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B41E - 0000B425 (0x8 bytes), align: 0 + Segment part 86. Intra module refs: LL_ReadBDADDR + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B426 - 0000B42B (0x6 bytes), align: 0 + Segment part 87. Intra module refs: LL_ReadBDADDR + Segment part 85 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B42C - 0000B461 (0x36 bytes), align: 0 + Segment part 88. Intra module refs: LL_SetRandomAddress::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetRandomAddress 0000B42C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B462 - 0000B468 (0x7 bytes), align: 0 + Segment part 90. Intra module refs: LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B469 - 0000B472 (0xa bytes), align: 0 + Segment part 91. Intra module refs: LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B473 - 0000B484 (0x12 bytes), align: 0 + Segment part 92. Intra module refs: LL_ClearWhiteList::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ClearWhiteList 0000B473 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B485 - 0000B4C4 (0x40 bytes), align: 0 + Segment part 94. Intra module refs: LL_AddWhiteListDevice::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_AddWhiteListDevice 0000B485 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B4C5 - 0000B4F3 (0x2f bytes), align: 0 + Segment part 102. Intra module refs: LL_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Encrypt 0000B4C5 + calls direct + XSTACK = 00000002 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B4F4 - 0000B53F (0x4c bytes), align: 0 + Segment part 104. Intra module refs: LL_Rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Rand 0000B4F4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B540 - 0000B577 (0x38 bytes), align: 0 + Segment part 106. Intra module refs: LL_PseudoRand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_PseudoRand 0000B540 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B578 - 0000B59A (0x23 bytes), align: 0 + Segment part 114. Intra module refs: LL_CtrlToHostFlowControl::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_CtrlToHostFlowControl + 0000B578 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B59B - 0000B5A5 (0xb bytes), align: 0 + Segment part 118. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B5A6 - 0000B5F6 (0x51 bytes), align: 0 + Segment part 127. Intra module refs: LL_ReadRssi::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRssi 0000B5A6 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B5F7 - 0000B66F (0x79 bytes), align: 0 + Segment part 129. Intra module refs: LL_Disconnect::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Disconnect 0000B5F7 + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B670 - 0000B675 (0x6 bytes), align: 0 + Segment part 131. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B676 - 0000B685 (0x10 bytes), align: 0 + Segment part 132. Intra module refs: LL_Disconnect + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B686 - 0000B956 (0x2d1 bytes), align: 0 + Segment part 133. Intra module refs: LL_TxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxData 0000B686 + calls direct + XSTACK = 00000001 ( 0000001E ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B957 - 0000B958 (0x2 bytes), align: 0 + Segment part 135. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B959 - 0000B95E (0x6 bytes), align: 0 + Segment part 136. Intra module refs: LL_SetAdvParam + LL_TxData + Segment part 135 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B95F - 0000B964 (0x6 bytes), align: 0 + Segment part 142. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B965 - 0000B969 (0x5 bytes), align: 0 + Segment part 146. Intra module refs: LL_AddWhiteListDevice + LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B96A - 0000B973 (0xa bytes), align: 0 + Segment part 149. Intra module refs: LL_Reset + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B974 - 0000BB1F (0x1ac bytes), align: 0 + Segment part 151. Intra module refs: LL_SetAdvParam::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvParam 0000B974 + calls direct + XSTACK = 00000006 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB20 - 0000BB24 (0x5 bytes), align: 0 + Segment part 153. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB25 - 0000BB2F (0xb bytes), align: 0 + Segment part 154. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB30 - 0000BB3A (0xb bytes), align: 0 + Segment part 155. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB3B - 0000BB3F (0x5 bytes), align: 0 + Segment part 156. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB40 - 0000BB47 (0x8 bytes), align: 0 + Segment part 157. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB48 - 0000BB4D (0x6 bytes), align: 0 + Segment part 158. Intra module refs: LL_SetAdvParam + Segment part 132 + Segment part 156 + Segment part 157 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB4E - 0000BB89 (0x3c bytes), align: 0 + Segment part 159. Intra module refs: LL_SetAdvData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvData 0000BB4E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB8A - 0000BCBF (0x136 bytes), align: 0 + Segment part 161. Intra module refs: LL_SetAdvControl::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvControl 0000BB8A + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCC0 - 0000BCC4 (0x5 bytes), align: 0 + Segment part 163. Intra module refs: LL_Init + LL_PseudoRand + LL_Rand + LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCC5 - 0000BCD1 (0xd bytes), align: 0 + Segment part 164. Intra module refs: LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCD2 - 0000BCDA (0x9 bytes), align: 0 + Segment part 165. Intra module refs: LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCDB - 0000BCE3 (0x9 bytes), align: 0 + Segment part 166. Intra module refs: LL_ProcessEvent + Segment part 165 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCE4 - 0000BD1C (0x39 bytes), align: 0 + Segment part 170. Intra module refs: LL_SetScanRspData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetScanRspData 0000BCE4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD1D - 0000BD21 (0x5 bytes), align: 0 + Segment part 172. Intra module refs: LL_EncLtkReply + LL_Encrypt + LL_ProcessEvent + LL_ReadRssi + LL_SetAdvData + LL_SetScanRspData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD22 - 0000BD2A (0x9 bytes), align: 0 + Segment part 173. Intra module refs: LL_SetAdvData + LL_SetScanRspData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD2B - 0000BD98 (0x6e bytes), align: 0 + Segment part 174. Intra module refs: LL_EncLtkReply::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReply 0000BD2B + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD99 - 0000BD9B (0x3 bytes), align: 0 + Segment part 176. Intra module refs: LL_Disconnect + LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD9C - 0000BD9F (0x4 bytes), align: 0 + Segment part 177. Intra module refs: LL_EncLtkReply + LL_TxData + Segment part 176 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDA0 - 0000BDE3 (0x44 bytes), align: 0 + Segment part 178. Intra module refs: LL_EncLtkNegReply::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkNegReply 0000BDA0 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDE4 - 0000BDE8 (0x5 bytes), align: 0 + Segment part 181. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + LL_EncLtkReply + LL_ReadRssi + LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDE9 - 0000BDED (0x5 bytes), align: 0 + Segment part 182. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDEE - 0000BE0E (0x21 bytes), align: 0 + Segment part 183. Intra module refs: LL_ConnActive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnActive 0000BDEE + XSTACK = 0000001A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE0F - 0000BE14 (0x6 bytes), align: 0 + Segment part 190. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE15 - 0000BE1A (0x6 bytes), align: 0 + Segment part 191. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE1B - 0000BE1D (0x3 bytes), align: 0 + Segment part 196. Intra module refs: LL_ReadBDADDR + LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE1E - 0000BE24 (0x7 bytes), align: 0 + Segment part 197. Intra module refs: LL_ClearWhiteList + LL_ConnActive + LL_CtrlToHostFlowControl + LL_Reset + Segment part 196 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE25 - 0000BE2E (0xa bytes), align: 0 + Segment part 204. Intra module refs: LL_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE2F - 0000BE5F (0x31 bytes), align: 0 + Segment part 229. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE60 - 0000BE63 (0x4 bytes), align: 0 + Segment part 242. Intra module refs: LL_EncLtkReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE64 - 0000BE6F (0xc bytes), align: 0 + Segment part 243. Intra module refs: Segment part 182 + Segment part 242 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE70 - 0000BE73 (0x4 bytes), align: 0 + Segment part 246. Intra module refs: LL_ReadRssi + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE74 - 0000BE85 (0x12 bytes), align: 0 + Segment part 247. Intra module refs: Segment part 243 + Segment part 246 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE86 - 0000BE89 (0x4 bytes), align: 0 + Segment part 252. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE8A - 0000BE95 (0xc bytes), align: 0 + Segment part 253. Intra module refs: Segment part 252 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000219 - 00000226 (0xe bytes), align: 0 + Segment part 51. Intra module refs: taskEndCauses + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000227 - 00000232 (0xc bytes), align: 0 + Segment part 53. Intra module refs: taskErrorEndCauses + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F52 - 00008F55 (0x4 bytes), align: 0 + Segment part 59. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_190 00008F52 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F46 - 00008F49 (0x4 bytes), align: 0 + Segment part 60. Intra module refs: LL_Reset + llSetupAdv (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_555555 00008F46 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F3A - 00008F3D (0x4 bytes), align: 0 + Segment part 62. Intra module refs: LL_TxData + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_6 00008F3A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F36 - 00008F39 (0x4 bytes), align: 0 + Segment part 63. Intra module refs: LL_SetAdvControl + LL_TxData + Segment part 98 (ll_timer2) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffff 00008F36 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AE3 - 00000AE8 (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Init::?relay 00000AE3 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AE9 - 00000AEE (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ProcessEvent::?relay + 00000AE9 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AEF - 00000AF4 (0x6 bytes), align: 0 + Segment part 81. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Reset::?relay 00000AEF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AF5 - 00000AFA (0x6 bytes), align: 0 + Segment part 84. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadBDADDR::?relay 00000AF5 HCI_ReadBDADDRCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AFB - 00000B00 (0x6 bytes), align: 0 + Segment part 89. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetRandomAddress::?relay + 00000AFB HCI_LE_SetRandomAddressCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B01 - 00000B06 (0x6 bytes), align: 0 + Segment part 93. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ClearWhiteList::?relay + 00000B01 HCI_LE_ClearWhiteListCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B07 - 00000B0C (0x6 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_AddWhiteListDevice::?relay + 00000B07 HCI_LE_AddWhiteListCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B0D - 00000B12 (0x6 bytes), align: 0 + Segment part 103. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Encrypt::?relay 00000B0D Segment part 82 (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B13 - 00000B18 (0x6 bytes), align: 0 + Segment part 105. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Rand::?relay 00000B13 HCI_LE_RandCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B19 - 00000B1E (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_PseudoRand::?relay 00000B19 Onboard_rand (OnBoard) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B1F - 00000B24 (0x6 bytes), align: 0 + Segment part 115. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_CtrlToHostFlowControl::?relay + 00000B1F LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B25 - 00000B2A (0x6 bytes), align: 0 + Segment part 128. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRssi::?relay 00000B25 HCI_ReadRssiCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B2B - 00000B30 (0x6 bytes), align: 0 + Segment part 130. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Disconnect::?relay 00000B2B HCI_DisconnectCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B31 - 00000B36 (0x6 bytes), align: 0 + Segment part 134. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxData::?relay 00000B31 HCI_TxDataSend (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B37 - 00000B3C (0x6 bytes), align: 0 + Segment part 152. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvParam::?relay + 00000B37 HCI_LE_SetAdvParamCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B3D - 00000B42 (0x6 bytes), align: 0 + Segment part 160. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvData::?relay 00000B3D HCI_LE_SetAdvDataCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B43 - 00000B48 (0x6 bytes), align: 0 + Segment part 162. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvControl::?relay + 00000B43 HCI_LE_SetAdvEnableCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B49 - 00000B4E (0x6 bytes), align: 0 + Segment part 171. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetScanRspData::?relay + 00000B49 HCI_LE_SetScanRspDataCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B4F - 00000B54 (0x6 bytes), align: 0 + Segment part 175. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReply::?relay + 00000B4F HCI_LE_LtkReqReplyCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B55 - 00000B5A (0x6 bytes), align: 0 + Segment part 179. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkNegReply::?relay + 00000B55 HCI_LE_LtkReqNegReplyCmd (hci) + LL_EncLtkReqCback (hci_event) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B5B - 00000B60 (0x6 bytes), align: 0 + Segment part 184. Intra module refs: Segment part 181 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnActive::?relay 00000B5B HCI_SendDataPkt (hci) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F52 - 00008F55 (0x4 bytes), align: 0 + Segment part 269. Intra module refs: __Constant_190 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F46 - 00008F49 (0x4 bytes), align: 0 + Segment part 270. Intra module refs: __Constant_555555 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F3A - 00008F3D (0x4 bytes), align: 0 + Segment part 272. Intra module refs: __Constant_6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F36 - 00008F39 (0x4 bytes), align: 0 + Segment part 273. Intra module refs: __Constant_ffffff + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_advEndCauses + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001368A - 0001369C (0x13 bytes), align: 0 + Segment part 16. Intra module refs: llDirectedAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDirectedAdvEvt_TaskEndOk + 0001368A + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001369D - 000136A6 (0xa bytes), align: 0 + Segment part 18. Intra module refs: llAdvEvt_TaskAbort + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000136A7 - 00013B7D (0x4d7 bytes), align: 0 + Segment part 19. Intra module refs: llAdvEvt_TaskConnect::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskConnect 000136A7 + calls direct + XSTACK = 00000000 ( 0000001C ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B7E - 00013B89 (0xc bytes), align: 0 + Segment part 21. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B8A - 00013B8B (0x2 bytes), align: 0 + Segment part 22. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B8C - 00013B8E (0x3 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B8F - 00013B95 (0x7 bytes), align: 0 + Segment part 24. Intra module refs: Segment part 23 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B96 - 00013B98 (0x3 bytes), align: 0 + Segment part 25. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B99 - 00013B9D (0x5 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B9E - 00013BAC (0xf bytes), align: 0 + Segment part 27. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BAD - 00013BB0 (0x4 bytes), align: 0 + Segment part 28. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BB1 - 00013BB8 (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BB9 - 00013BCB (0x13 bytes), align: 0 + Segment part 30. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BCC - 00013BD2 (0x7 bytes), align: 0 + Segment part 31. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BD3 - 00013BE0 (0xe bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BE1 - 00013BE8 (0x8 bytes), align: 0 + Segment part 33. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BE9 - 00013BF3 (0xb bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + Segment part 64 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BF4 - 00013BF9 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BFA - 00013C03 (0xa bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C04 - 00013C0A (0x7 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 36 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C0B - 00013C11 (0x7 bytes), align: 0 + Segment part 38. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C12 - 00013C18 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C19 - 00013C1E (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C1F - 00013C29 (0xb bytes), align: 0 + Segment part 41. Intra module refs: Segment part 40 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C2A - 00013C37 (0xe bytes), align: 0 + Segment part 42. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C38 - 00013C40 (0x9 bytes), align: 0 + Segment part 43. Intra module refs: Segment part 42 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C41 - 00013D3A (0xfa bytes), align: 0 + Segment part 44. Intra module refs: llUndirectedAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llUndirectedAdvEvt_TaskEndOk + 00013C41 + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013D3B - 00013D42 (0x8 bytes), align: 0 + Segment part 46. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013D43 - 00013DDF (0x9d bytes), align: 0 + Segment part 47. Intra module refs: llDiscoverableAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDiscoverableAdvEvt_TaskEndOk + 00013D43 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DE0 - 00013DED (0xe bytes), align: 0 + Segment part 49. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DEE - 00013DFB (0xe bytes), align: 0 + Segment part 50. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DFC - 00013E04 (0x9 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 49 + Segment part 50 + Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E05 - 00013E0D (0x9 bytes), align: 0 + Segment part 52. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E0E - 00013E18 (0xb bytes), align: 0 + Segment part 53. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E19 - 00013E2A (0x12 bytes), align: 0 + Segment part 54. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E2B - 00013E2F (0x5 bytes), align: 0 + Segment part 55. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E30 - 00013E41 (0x12 bytes), align: 0 + Segment part 56. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E42 - 00013E44 (0x3 bytes), align: 0 + Segment part 57. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E45 - 00013E55 (0x11 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 57 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E56 - 00013E58 (0x3 bytes), align: 0 + Segment part 59. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E59 - 00013E5B (0x3 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E5C - 00013E5F (0x4 bytes), align: 0 + Segment part 61. Intra module refs: Segment part 60 + llAdvEvt_TaskConnect + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E60 - 00013E6A (0xb bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + Segment part 65 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E6B - 00013E98 (0x2e bytes), align: 0 + Segment part 63. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E99 - 00013EAA (0x12 bytes), align: 0 + Segment part 64. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013EAB - 00013EBC (0x12 bytes), align: 0 + Segment part 65. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013EBD - 00013F41 (0x85 bytes), align: 0 + Segment part 66. Intra module refs: llNonConnAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llNonConnAdvEvt_TaskEndOk + 00013EBD + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F42 - 00013F56 (0x15 bytes), align: 0 + Segment part 68. Intra module refs: Segment part 55 + llNonConnAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F57 - 00013F5F (0x9 bytes), align: 0 + Segment part 69. Intra module refs: llAdvEvt_TaskAbort + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F60 - 00013F61 (0x2 bytes), align: 0 + Segment part 70. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F62 - 00013F64 (0x3 bytes), align: 0 + Segment part 71. Intra module refs: Segment part 70 + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F65 - 00013F6A (0x6 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F6B - 00013F7F (0x15 bytes), align: 0 + Segment part 73. Intra module refs: llAdvEvt_TaskAbort::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskAbort 00013F6B + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F80 - 00013F8C (0xd bytes), align: 0 + Segment part 75. Intra module refs: llAdvEvt_TaskAbort + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B61 - 00000B66 (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDirectedAdvEvt_TaskEndOk::?relay + 00000B61 llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B67 - 00000B6C (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskConnect::?relay + 00000B67 Segment part 93 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B6D - 00000B72 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + llUndirectedAdvEvt_TaskEndOk::?relay + 00000B6D llSetupUndirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B73 - 00000B78 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDiscoverableAdvEvt_TaskEndOk::?relay + 00000B73 llSetupScannableAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B79 - 00000B7E (0x6 bytes), align: 0 + Segment part 67. + ENTRY ADDRESS REF BY + ===== ======= ====== + llNonConnAdvEvt_TaskEndOk::?relay + 00000B79 Segment part 105 (ll_common) + Segment part 106 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B7F - 00000B84 (0x6 bytes), align: 0 + Segment part 74. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskAbort::?relay + 00000B7F Segment part 96 (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_common + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000088 - 00000088 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_TCON 00000088 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A9 - 000000A9 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + IP0 000000A9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AF - 000000AF (0x1 bytes), align: 0 + Segment part 8. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1STAT 000000AF + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000B9 - 000000B9 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + IP1 000000B9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000DA - 000000DA (0x1 bytes), align: 0 + Segment part 13. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CC0L 000000DA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000DB - 000000DB (0x1 bytes), align: 0 + Segment part 14. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CC0H 000000DB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E2 - 000000E2 (0x1 bytes), align: 0 + Segment part 15. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CNTL 000000E2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E3 - 000000E3 (0x1 bytes), align: 0 + Segment part 16. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CNTH 000000E3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E4 - 000000E4 (0x1 bytes), align: 0 + Segment part 17. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CTL 000000E4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E5 - 000000E5 (0x1 bytes), align: 0 + Segment part 18. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CCTL0 000000E5 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000044D2 - 0000451A (0x49 bytes), align: 0 + Segment part 42. Intra module refs: llRfInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRfInit 000044D2 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000451B - 00004547 (0x2d bytes), align: 0 + Segment part 44. Intra module refs: llSetFreqTune::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetFreqTune 0000451B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004548 - 0000457A (0x33 bytes), align: 0 + Segment part 46. Intra module refs: llClearSetInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearSetInts 00004548 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000457B - 00004587 (0xd bytes), align: 0 + Segment part 48. Intra module refs: llDisableRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableRfInts 0000457B + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004588 - 00004593 (0xc bytes), align: 0 + Segment part 50. Intra module refs: llClearRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearRfInts 00004588 + XSTACK = 00000009 ( 00000000 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004594 - 000045A5 (0x12 bytes), align: 0 + Segment part 52. Intra module refs: llEnableRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnableRfInts 00004594 + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000045A6 - 0000465E (0xb9 bytes), align: 0 + Segment part 54. Intra module refs: llProcessPostRfOps::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPostRfOps 000045A6 + calls direct + XSTACK = 00000000 ( 00000008 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000465F - 00004664 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004665 - 0000466F (0xb bytes), align: 0 + Segment part 57. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004670 - 0000467A (0xb bytes), align: 0 + Segment part 58. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000467B - 000046D8 (0x5e bytes), align: 0 + Segment part 59. Intra module refs: llSetRxGain::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetRxGain 0000467B + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000046D9 - 0000470D (0x35 bytes), align: 0 + Segment part 61. Intra module refs: llSetTxPower::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetTxPower 000046D9 + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000470E - 000048A9 (0x19c bytes), align: 0 + Segment part 65. Intra module refs: llFindTxPowerSettings::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindTxPowerSettings 0000470E + calls direct + XSTACK = 00000000 ( 00000020 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000048AA - 000048F6 (0x4d bytes), align: 0 + Segment part 67. Intra module refs: llExtendRfRange::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llExtendRfRange 000048AA + calls direct + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000048F7 - 00004910 (0x1a bytes), align: 0 + Segment part 71. Intra module refs: llCheckWhiteListUsage::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckWhiteListUsage 000048F7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004911 - 00004912 (0x2 bytes), align: 0 + Segment part 73. Intra module refs: llDisableRfInts + llStartAdvSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004913 - 00004913 (0x1 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + llEnableRfInts + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004914 - 0000491A (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 56 + Segment part 74 + llCheckWhiteListUsage + llExtendRfRange + llGetNextConn + llMemCopyDst + llMemCopySrc + llReleaseAllConnId + llReleaseConnId + llReplaceCtrlPkt + llRfInit + llSetFreqTune + llSetRxGain + llSetTxPower + llSetupAdv + llSetupStartEncReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000491B - 00004987 (0x6d bytes), align: 0 + Segment part 76. Intra module refs: llSetupAdv::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupAdv 0000491B + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004988 - 00004A0E (0x87 bytes), align: 0 + Segment part 78. Intra module refs: llSetupDirectedAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupDirectedAdvEvt 00004988 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A0F - 00004A0F (0x1 bytes), align: 0 + Segment part 80. Intra module refs: llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A10 - 00004A14 (0x5 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 80 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A15 - 00004A17 (0x3 bytes), align: 0 + Segment part 82. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A18 - 00004A1E (0x7 bytes), align: 0 + Segment part 83. Intra module refs: Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A1F - 00004A21 (0x3 bytes), align: 0 + Segment part 84. Intra module refs: llSetupDirectedAdvEvt + llStartAdvSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A22 - 00004A2C (0xb bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A2D - 00004A92 (0x66 bytes), align: 0 + Segment part 86. Intra module refs: llSetupUndirectedAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUndirectedAdvEvt + 00004A2D + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A93 - 00004A9C (0xa bytes), align: 0 + Segment part 88. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A9D - 00004AA2 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: Segment part 88 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AA3 - 00004AA8 (0x6 bytes), align: 0 + Segment part 90. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AA9 - 00004AAF (0x7 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + llSetupAdv + llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AB0 - 00004AB7 (0x8 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 201 + Segment part 91 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AB8 - 00004AC1 (0xa bytes), align: 0 + Segment part 93. Intra module refs: llSetupDirectedAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AC2 - 00004AC4 (0x3 bytes), align: 0 + Segment part 94. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AC5 - 00004ACE (0xa bytes), align: 0 + Segment part 95. Intra module refs: Segment part 94 + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004ACF - 00004AD7 (0x9 bytes), align: 0 + Segment part 96. Intra module refs: Segment part 95 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AD8 - 00004ADB (0x4 bytes), align: 0 + Segment part 97. Intra module refs: Segment part 94 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004ADC - 00004ADF (0x4 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 118 + Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AE0 - 00004AE8 (0x9 bytes), align: 0 + Segment part 99. Intra module refs: Segment part 116 + Segment part 98 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004AE9 - 00004B3B (0x53 bytes), align: 0 + Segment part 100. Intra module refs: llSetupNonConnectableAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNonConnectableAdvEvt + 00004AE9 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B3C - 00004B3E (0x3 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 110 + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B3F - 00004B46 (0x8 bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + Segment part 109 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B47 - 00004B51 (0xb bytes), align: 0 + Segment part 104. Intra module refs: llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B52 - 00004B5E (0xd bytes), align: 0 + Segment part 105. Intra module refs: llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B5F - 00004B67 (0x9 bytes), align: 0 + Segment part 106. Intra module refs: Segment part 105 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004B68 - 00004BD2 (0x6b bytes), align: 0 + Segment part 107. Intra module refs: llSetupScannableAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupScannableAdvEvt + 00004B68 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004BD3 - 00004BE0 (0xe bytes), align: 0 + Segment part 109. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004BE1 - 00004BEE (0xe bytes), align: 0 + Segment part 110. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004BEF - 00004BF8 (0xa bytes), align: 0 + Segment part 113. Intra module refs: llSetupScannableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004BF9 - 00004BFC (0x4 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + Segment part 93 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004BFD - 00004C09 (0xd bytes), align: 0 + Segment part 115. Intra module refs: Segment part 114 + Segment part 118 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C0A - 00004C0F (0x6 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C10 - 00004C13 (0x4 bytes), align: 0 + Segment part 117. Intra module refs: llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C14 - 00004C2B (0x18 bytes), align: 0 + Segment part 118. Intra module refs: Segment part 117 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C2C - 00004C3A (0xf bytes), align: 0 + Segment part 121. Intra module refs: llStartAdvSetup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartAdvSetup 00004C2C + is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C3B - 00004C88 (0x4e bytes), align: 0 + Segment part 123. Intra module refs: llStartSlaveSetup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartSlaveSetup 00004C3B + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C89 - 00004C8E (0x6 bytes), align: 0 + Segment part 132. Intra module refs: llSetupFeatureSetRsp + llSetupPauseEncRsp + llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C8F - 00004C92 (0x4 bytes), align: 0 + Segment part 133. Intra module refs: Segment part 132 + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C93 - 00004C99 (0x7 bytes), align: 0 + Segment part 134. Intra module refs: Segment part 133 + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004C9A - 00004CAB (0x12 bytes), align: 0 + Segment part 136. Intra module refs: Segment part 183 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004CAC - 00004CB1 (0x6 bytes), align: 0 + Segment part 140. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004CB2 - 00004CB4 (0x3 bytes), align: 0 + Segment part 142. Intra module refs: Segment part 140 + Segment part 148 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004CB5 - 00004CBB (0x7 bytes), align: 0 + Segment part 143. Intra module refs: Segment part 142 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004CBC - 00004D44 (0x89 bytes), align: 0 + Segment part 144. Intra module refs: llSetupEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupEncRsp 00004CBC + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D45 - 00004D4D (0x9 bytes), align: 0 + Segment part 146. Intra module refs: Segment part 147 + llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D4E - 00004D54 (0x7 bytes), align: 0 + Segment part 147. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D55 - 00004D5A (0x6 bytes), align: 0 + Segment part 148. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D5B - 00004D7F (0x25 bytes), align: 0 + Segment part 149. Intra module refs: llSetupStartEncReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncReq 00004D5B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D80 - 00004D82 (0x3 bytes), align: 0 + Segment part 151. Intra module refs: llSetupStartEncReq + llSetupStartEncRsp + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D83 - 00004D86 (0x4 bytes), align: 0 + Segment part 152. Intra module refs: Segment part 151 + llProcessPendingTxData + llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D87 - 00004D8C (0x6 bytes), align: 0 + Segment part 153. Intra module refs: Segment part 152 + Segment part 164 + Segment part 254 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D8D - 00004DDE (0x52 bytes), align: 0 + Segment part 154. Intra module refs: llSetupStartEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncRsp 00004D8D + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DDF - 00004DEE (0x10 bytes), align: 0 + Segment part 158. Intra module refs: llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DEF - 00004DF8 (0xa bytes), align: 0 + Segment part 159. Intra module refs: Segment part 158 + Segment part 89 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DF9 - 00004E02 (0xa bytes), align: 0 + Segment part 160. Intra module refs: llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E03 - 00004E05 (0x3 bytes), align: 0 + Segment part 161. Intra module refs: llSetupRejectInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E06 - 00004E0A (0x5 bytes), align: 0 + Segment part 162. Intra module refs: Segment part 161 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E0B - 00004E0D (0x3 bytes), align: 0 + Segment part 163. Intra module refs: Segment part 162 + llSetupEncRsp + llSetupPauseEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E0E - 00004E1C (0xf bytes), align: 0 + Segment part 164. Intra module refs: Segment part 163 + llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E1D - 00004E27 (0xb bytes), align: 0 + Segment part 165. Intra module refs: Segment part 164 + llSetupStartEncReq + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E28 - 00004E7D (0x56 bytes), align: 0 + Segment part 166. Intra module refs: llSetupPauseEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupPauseEncRsp 00004E28 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E7E - 00004E7F (0x2 bytes), align: 0 + Segment part 168. Intra module refs: llInitFeatureSet + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E80 - 00004E80 (0x1 bytes), align: 0 + Segment part 169. Intra module refs: Segment part 168 + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E81 - 00004E85 (0x5 bytes), align: 0 + Segment part 170. Intra module refs: Segment part 169 + llAllocConnId + llConnCleanup + llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + llDequeueCtrlPkt + llSetupEncRsp + llSetupPauseEncRsp + llSetupStartEncRsp + llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E86 - 00004EA0 (0x1b bytes), align: 0 + Segment part 171. Intra module refs: llSetupRejectInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupRejectInd 00004E86 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EA1 - 00004EA5 (0x5 bytes), align: 0 + Segment part 173. Intra module refs: llClearSetInts + llConnTerminate + llSetupRejectInd + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EA6 - 00004EA8 (0x3 bytes), align: 0 + Segment part 174. Intra module refs: llSetupRejectInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EA9 - 00004EAE (0x6 bytes), align: 0 + Segment part 175. Intra module refs: Segment part 174 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EAF - 00004EB3 (0x5 bytes), align: 0 + Segment part 178. Intra module refs: llEnqueueCtrlPkt + llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EB4 - 00004EBF (0xc bytes), align: 0 + Segment part 179. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004EC0 - 00004F1D (0x5e bytes), align: 0 + Segment part 180. Intra module refs: llSetupFeatureSetRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupFeatureSetRsp 00004EC0 + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F1E - 00004F34 (0x17 bytes), align: 0 + Segment part 182. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F35 - 00004F40 (0xc bytes), align: 0 + Segment part 183. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F41 - 00004FF9 (0xb9 bytes), align: 0 + Segment part 184. Intra module refs: llSetupVersionIndReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupVersionIndReq 00004F41 + calls direct + XSTACK = 00000000 ( 0000000F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FFA - 00004FFE (0x5 bytes), align: 0 + Segment part 186. Intra module refs: llProcessPendingTxData + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FFF - 00005009 (0xb bytes), align: 0 + Segment part 187. Intra module refs: llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000500A - 00005092 (0x89 bytes), align: 0 + Segment part 188. Intra module refs: llSetupTermInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupTermInd 0000500A + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005093 - 00005095 (0x3 bytes), align: 0 + Segment part 190. Intra module refs: llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005096 - 00005099 (0x4 bytes), align: 0 + Segment part 191. Intra module refs: Segment part 190 + llInitFeatureSet + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000509A - 000050A5 (0xc bytes), align: 0 + Segment part 192. Intra module refs: llSetupFeatureSetRsp + llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000050A6 - 000050AB (0x6 bytes), align: 0 + Segment part 193. Intra module refs: llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000050AC - 000050B2 (0x7 bytes), align: 0 + Segment part 194. Intra module refs: Segment part 193 + llEnqueueCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000050B3 - 0000511C (0x6a bytes), align: 0 + Segment part 195. Intra module refs: llSetupUnknownRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUnknownRsp 000050B3 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000511D - 0000511E (0x2 bytes), align: 0 + Segment part 197. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000511F - 00005120 (0x2 bytes), align: 0 + Segment part 198. Intra module refs: Segment part 197 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005121 - 00005124 (0x4 bytes), align: 0 + Segment part 199. Intra module refs: Segment part 198 + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005125 - 0000512A (0x6 bytes), align: 0 + Segment part 200. Intra module refs: Segment part 199 + llSetupPauseEncRsp + llSetupStartEncRsp + llSetupTermInd + llSetupUnknownRsp + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000512B - 0000512F (0x5 bytes), align: 0 + Segment part 201. Intra module refs: llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005130 - 00005139 (0xa bytes), align: 0 + Segment part 202. Intra module refs: llSetupTermInd + llSetupUnknownRsp + llSetupVersionIndReq + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000513A - 00005191 (0x58 bytes), align: 0 + Segment part 203. Intra module refs: llEnqueueCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnqueueCtrlPkt 0000513A + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005192 - 000051F2 (0x61 bytes), align: 0 + Segment part 205. Intra module refs: llDequeueCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDequeueCtrlPkt 00005192 + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000051F3 - 0000520A (0x18 bytes), align: 0 + Segment part 207. Intra module refs: llReplaceCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReplaceCtrlPkt 000051F3 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000520B - 00005215 (0xb bytes), align: 0 + Segment part 209. Intra module refs: llDequeueCtrlPkt + llReplaceCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005216 - 0000521B (0x6 bytes), align: 0 + Segment part 210. Intra module refs: Segment part 191 + Segment part 192 + Segment part 209 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000521C - 000052B0 (0x95 bytes), align: 0 + Segment part 211. Intra module refs: llProcessChanMap::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessChanMap 0000521C + XSTACK = 0000000B ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052B1 - 000052B5 (0x5 bytes), align: 0 + Segment part 213. Intra module refs: llProcessChanMap + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052B6 - 000052B8 (0x3 bytes), align: 0 + Segment part 214. Intra module refs: llEnqueueCtrlPkt + llReplaceCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052B9 - 000052BB (0x3 bytes), align: 0 + Segment part 215. Intra module refs: Segment part 214 + llDequeueCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052BC - 000052BF (0x4 bytes), align: 0 + Segment part 216. Intra module refs: Segment part 215 + llAdjustForMissedEvent + llAllocConnId + llDequeueCtrlPkt + llFindTxPowerSettings + llProcessChanMap + llSetupEncRsp + llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052C0 - 000052C9 (0xa bytes), align: 0 + Segment part 217. Intra module refs: llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052CA - 000052CC (0x3 bytes), align: 0 + Segment part 218. Intra module refs: Segment part 142 + Segment part 217 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052CD - 000052D1 (0x5 bytes), align: 0 + Segment part 219. Intra module refs: Segment part 151 + Segment part 159 + Segment part 164 + Segment part 165 + Segment part 210 + Segment part 216 + Segment part 218 + Segment part 226 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000023AC - 00002449 (0x9e bytes), align: 0 + Segment part 278. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextDataChan 000023AC llAdvEvt_TaskConnect (ll_advEndCauses) + XSTACK = 0000000B ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000244A - 0000244E (0x5 bytes), align: 0 + Segment part 279. Intra module refs: llGetNextDataChan + llSetNextDataChan + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000244F - 000024E3 (0x95 bytes), align: 0 + Segment part 280. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetNextDataChan 0000244F LL_TxData (ll) + llSetupNextSlaveEvent (ll_slaveEndCauses) + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000024E4 - 000024EC (0x9 bytes), align: 0 + Segment part 281. Intra module refs: llGetNextDataChan + llSetNextDataChan + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052D2 - 000053FF (0x12e bytes), align: 0 + Segment part 222. Intra module refs: llAllocConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocConnId 000052D2 + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005400 - 00005402 (0x3 bytes), align: 0 + Segment part 224. Intra module refs: llProcessPendingTxData + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005403 - 00005406 (0x4 bytes), align: 0 + Segment part 225. Intra module refs: Segment part 224 + llAllocConnId + llDequeueCtrlPkt + llEnqueueCtrlPkt + llReleaseConnId + llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005407 - 0000540B (0x5 bytes), align: 0 + Segment part 226. Intra module refs: Segment part 134 + Segment part 175 + Segment part 193 + Segment part 225 + Segment part 272 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000540C - 00005413 (0x8 bytes), align: 0 + Segment part 227. Intra module refs: llAllocConnId + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005414 - 0000541B (0x8 bytes), align: 0 + Segment part 228. Intra module refs: Segment part 227 + llAllocConnId + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000541C - 0000545E (0x43 bytes), align: 0 + Segment part 229. Intra module refs: llReleaseConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseConnId 0000541C + calls direct + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000545F - 0000547B (0x1d bytes), align: 0 + Segment part 231. Intra module refs: llReleaseAllConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseAllConnId 0000545F + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000547C - 0000549A (0x1f bytes), align: 0 + Segment part 233. Intra module refs: llGetNextConn::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextConn 0000547C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000549B - 000054CF (0x35 bytes), align: 0 + Segment part 235. Intra module refs: llConnCleanup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnCleanup 0000549B + calls direct + XSTACK = 00000009 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000054D0 - 000054D3 (0x4 bytes), align: 0 + Segment part 237. Intra module refs: llConnCleanup + llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000054D4 - 000054DD (0xa bytes), align: 0 + Segment part 238. Intra module refs: Segment part 183 + Segment part 237 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000054DE - 000054DF (0x2 bytes), align: 0 + Segment part 239. Intra module refs: llConnCleanup + llConvertCtrlProcTimeoutToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000054E0 - 000054E5 (0x6 bytes), align: 0 + Segment part 240. Intra module refs: Segment part 239 + llProcessPendingTxData + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000054E6 - 0000550A (0x25 bytes), align: 0 + Segment part 241. Intra module refs: llConnTerminate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnTerminate 000054E6 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000550B - 0000552A (0x20 bytes), align: 0 + Segment part 245. Intra module refs: llInitFeatureSet::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitFeatureSet 0000550B + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000552B - 0000552E (0x4 bytes), align: 0 + Segment part 247. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000552F - 00005533 (0x5 bytes), align: 0 + Segment part 248. Intra module refs: Segment part 247 + llAllocConnId + llFindTxPowerSettings + llInitFeatureSet + llSetupDirectedAdvEvt + llWriteTxData + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000024ED - 00002529 (0x3d bytes), align: 0 + Segment part 282. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llEventInRange 000024ED llSetupNextSlaveEvent (ll_slaveEndCauses) + XSTACK = 0000000D ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000252A - 00002531 (0x8 bytes), align: 0 + Segment part 283. + ENTRY ADDRESS REF BY + ===== ======= ====== + llEventDelta 0000252A llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005534 - 00005577 (0x44 bytes), align: 0 + Segment part 251. Intra module refs: llConvertLstoToEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertLstoToEvent 00005534 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005578 - 00005581 (0xa bytes), align: 0 + Segment part 253. Intra module refs: llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005582 - 00005594 (0x13 bytes), align: 0 + Segment part 254. Intra module refs: llConvertLstoToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005595 - 00005598 (0x4 bytes), align: 0 + Segment part 255. Intra module refs: llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005599 - 000055A2 (0xa bytes), align: 0 + Segment part 256. Intra module refs: Segment part 255 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055A3 - 000055E4 (0x42 bytes), align: 0 + Segment part 257. Intra module refs: llConvertCtrlProcTimeoutToEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertCtrlProcTimeoutToEvent + 000055A3 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055E5 - 000056D3 (0xef bytes), align: 0 + Segment part 259. Intra module refs: llAdjustForMissedEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustForMissedEvent + 000055E5 + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000056D4 - 000056E8 (0x15 bytes), align: 0 + Segment part 261. Intra module refs: llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000056E9 - 00005762 (0x7a bytes), align: 0 + Segment part 262. Intra module refs: llProcessPendingTxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPendingTxData + 000056E9 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005763 - 00005768 (0x6 bytes), align: 0 + Segment part 264. Intra module refs: llProcessPendingTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005769 - 00005770 (0x8 bytes), align: 0 + Segment part 265. Intra module refs: Segment part 264 + llConnCleanup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005771 - 00005782 (0x12 bytes), align: 0 + Segment part 266. Intra module refs: llProcessPendingTxData + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005783 - 0000583E (0xbc bytes), align: 0 + Segment part 267. Intra module refs: llWriteTxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llWriteTxData 00005783 + calls direct + XSTACK = 0000000E ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000583F - 00005840 (0x2 bytes), align: 0 + Segment part 270. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005841 - 00005845 (0x5 bytes), align: 0 + Segment part 271. Intra module refs: Segment part 270 + llAdjustForMissedEvent + llConvertLstoToEvent + llDequeueCtrlPkt + llProcessChanMap + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005846 - 0000584E (0x9 bytes), align: 0 + Segment part 272. Intra module refs: llAdjustForMissedEvent + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000584F - 00005867 (0x19 bytes), align: 0 + Segment part 273. Intra module refs: llMemCopySrc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopySrc 0000584F + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005868 - 0000587C (0x15 bytes), align: 0 + Segment part 275. Intra module refs: llMemCopyDst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopyDst 00005868 + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000587D - 00005899 (0x1d bytes), align: 0 + Segment part 277. Intra module refs: llMemCopyDst + llMemCopySrc + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B85 - 00000B8A (0x6 bytes), align: 0 + Segment part 43. + ENTRY ADDRESS REF BY + ===== ======= ====== + llRfInit::?relay 00000B85 LL_ENC_GenerateTrueRandNum (ll_enc) + Segment part 149 (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B8B - 00000B90 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetFreqTune::?relay 00000B8B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B91 - 00000B96 (0x6 bytes), align: 0 + Segment part 47. + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearSetInts::?relay + 00000B91 Segment part 149 (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B97 - 00000B9C (0x6 bytes), align: 0 + Segment part 49. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableRfInts::?relay + 00000B97 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B9D - 00000BA2 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearRfInts::?relay 00000B9D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BA3 - 00000BA8 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnableRfInts::?relay + 00000BA3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BA9 - 00000BAE (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPostRfOps::?relay + 00000BA9 RF_NormalIsr (ll_isr) + llScheduler (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BAF - 00000BB4 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 57 + llExtendRfRange + llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetRxGain::?relay 00000BAF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BB5 - 00000BBA (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 58 + llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetTxPower::?relay 00000BB5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BBB - 00000BC0 (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindTxPowerSettings::?relay + 00000BBB LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BC1 - 00000BC6 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: llProcessPostRfOps + ENTRY ADDRESS REF BY + ===== ======= ====== + llExtendRfRange::?relay + 00000BC1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BC7 - 00000BCC (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckWhiteListUsage::?relay + 00000BC7 LL_AddWhiteListDevice (ll) + LL_ClearWhiteList (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BCD - 00000BD2 (0x6 bytes), align: 0 + Segment part 77. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupAdv::?relay 00000BCD LL_SetAdvControl (ll) + Segment part 41 (ll_scheduler) + llScheduler (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BD3 - 00000BD8 (0x6 bytes), align: 0 + Segment part 79. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupDirectedAdvEvt::?relay + 00000BD3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BD9 - 00000BDE (0x6 bytes), align: 0 + Segment part 87. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUndirectedAdvEvt::?relay + 00000BD9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BDF - 00000BE4 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNonConnectableAdvEvt::?relay + 00000BDF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BE5 - 00000BEA (0x6 bytes), align: 0 + Segment part 108. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupScannableAdvEvt::?relay + 00000BE5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BEB - 00000BF0 (0x6 bytes), align: 0 + Segment part 122. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartAdvSetup::?relay + 00000BEB Segment part 65 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BF1 - 00000BF6 (0x6 bytes), align: 0 + Segment part 124. + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartSlaveSetup::?relay + 00000BF1 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BF7 - 00000BFC (0x6 bytes), align: 0 + Segment part 145. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupEncRsp::?relay 00000BF7 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BFD - 00000C02 (0x6 bytes), align: 0 + Segment part 150. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncReq::?relay + 00000BFD llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C03 - 00000C08 (0x6 bytes), align: 0 + Segment part 155. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncRsp::?relay + 00000C03 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C09 - 00000C0E (0x6 bytes), align: 0 + Segment part 167. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupPauseEncRsp::?relay + 00000C09 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C0F - 00000C14 (0x6 bytes), align: 0 + Segment part 172. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupRejectInd::?relay + 00000C0F llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C15 - 00000C1A (0x6 bytes), align: 0 + Segment part 181. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupFeatureSetRsp::?relay + 00000C15 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C1B - 00000C20 (0x6 bytes), align: 0 + Segment part 185. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupVersionIndReq::?relay + 00000C1B llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C21 - 00000C26 (0x6 bytes), align: 0 + Segment part 189. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupTermInd::?relay + 00000C21 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C27 - 00000C2C (0x6 bytes), align: 0 + Segment part 196. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUnknownRsp::?relay + 00000C27 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C2D - 00000C32 (0x6 bytes), align: 0 + Segment part 204. + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnqueueCtrlPkt::?relay + 00000C2D LL_Disconnect (ll) + LL_EncLtkNegReply (ll) + LL_EncLtkReply (ll) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C33 - 00000C38 (0x6 bytes), align: 0 + Segment part 206. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDequeueCtrlPkt::?relay + 00000C33 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C39 - 00000C3E (0x6 bytes), align: 0 + Segment part 208. + ENTRY ADDRESS REF BY + ===== ======= ====== + llReplaceCtrlPkt::?relay + 00000C39 LL_Disconnect (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C3F - 00000C44 (0x6 bytes), align: 0 + Segment part 212. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessChanMap::?relay + 00000C3F llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C45 - 00000C4A (0x6 bytes), align: 0 + Segment part 223. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocConnId::?relay 00000C45 llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C4B - 00000C50 (0x6 bytes), align: 0 + Segment part 230. Intra module refs: llConnCleanup + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseConnId::?relay + 00000C4B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C51 - 00000C56 (0x6 bytes), align: 0 + Segment part 232. + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseAllConnId::?relay + 00000C51 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C57 - 00000C5C (0x6 bytes), align: 0 + Segment part 234. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextConn::?relay 00000C57 Segment part 32 (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C5D - 00000C62 (0x6 bytes), align: 0 + Segment part 236. Intra module refs: llConnTerminate + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnCleanup::?relay 00000C5D llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C63 - 00000C68 (0x6 bytes), align: 0 + Segment part 242. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnTerminate::?relay + 00000C63 LL_ProcessEvent (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C69 - 00000C6E (0x6 bytes), align: 0 + Segment part 246. + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitFeatureSet::?relay + 00000C69 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C6F - 00000C74 (0x6 bytes), align: 0 + Segment part 252. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertLstoToEvent::?relay + 00000C6F llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C75 - 00000C7A (0x6 bytes), align: 0 + Segment part 258. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertCtrlProcTimeoutToEvent::?relay + 00000C75 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C7B - 00000C80 (0x6 bytes), align: 0 + Segment part 260. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustForMissedEvent::?relay + 00000C7B llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C81 - 00000C86 (0x6 bytes), align: 0 + Segment part 263. + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPendingTxData::?relay + 00000C81 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C87 - 00000C8C (0x6 bytes), align: 0 + Segment part 268. Intra module refs: llProcessPendingTxData + ENTRY ADDRESS REF BY + ===== ======= ====== + llWriteTxData::?relay 00000C87 LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C8D - 00000C92 (0x6 bytes), align: 0 + Segment part 274. + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopySrc::?relay 00000C8D Segment part 20 (ll_slaveEndCauses) + Segment part 22 (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C93 - 00000C98 (0x6 bytes), align: 0 + Segment part 276. Intra module refs: Segment part 182 + llSetupVersionIndReq + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopyDst::?relay 00000C93 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F32 - 00008F35 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: llFindTxPowerSettings + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EBB - 00008EC2 (0x8 bytes), align: 0 + Segment part 32. Intra module refs: llFindTxPowerSettings + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F2A - 00008F2D (0x4 bytes), align: 0 + Segment part 35. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_8e89bed6 00008F2A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F4A - 00008F4D (0x4 bytes), align: 0 + Segment part 37. Intra module refs: llScheduler (ll_scheduler) + llSetupDirectedAdvEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_800 00008F4A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F1E - 00008F21 (0x4 bytes), align: 0 + Segment part 41. Intra module refs: llAdjustForMissedEvent + llAdvEvt_TaskConnect (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_2 00008F1E + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F32 - 00008F35 (0x4 bytes), align: 0 + Segment part 284. Intra module refs: Segment part 31 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EBB - 00008EC2 (0x8 bytes), align: 0 + Segment part 285. Intra module refs: Segment part 32 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F2A - 00008F2D (0x4 bytes), align: 0 + Segment part 288. Intra module refs: __Constant_8e89bed6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F4A - 00008F4D (0x4 bytes), align: 0 + Segment part 290. Intra module refs: __Constant_800 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F1E - 00008F21 (0x4 bytes), align: 0 + Segment part 294. Intra module refs: __Constant_2 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_constData + + SEGMENTS IN THE MODULE + ====================== +CODE_C + Relative segment, address: CODE 000023A4 - 000023A7 (0x4 bytes), align: 2 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + savedTxPowerSetting 000023A4 llExtendRfRange (ll_common) + llFindTxPowerSettings (ll_common) + llSetTxPower (ll_common) + ------------------------------------------------------------------------- +CODE_C + Relative segment, address: CODE 000023A8 - 000023AB (0x4 bytes), align: 2 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ptmFreqTune 000023A8 llRfInit (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_enc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000D7 - 000000D7 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: LL_ENC_MoveData + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAREQ 000000D7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005E0 - 000005FF (0x20 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + dataPkt 000005E0 Segment part 132 (ll_common) + Segment part 133 (ll_common) + Segment part 158 (ll_common) + Segment part 160 (ll_common) + Segment part 182 (ll_common) + Segment part 193 (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000600 - 0000060B (0xc bytes), align: 0 + Segment part 15. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + ENTRY ADDRESS REF BY + ===== ======= ====== + cachedTRNGdata 00000600 LL_Init (ll) + llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E2E - 00008E4D (0x20 bytes), align: 0 + Segment part 16. Intra module refs: LL_ENC_Decrypt + LL_ENC_DecryptMsg + LL_ENC_Encrypt + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + LL_ENC_LoadEmptyIV + ENTRY ADDRESS REF BY + ===== ======= ====== + zeroBlock 00008E2E + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F632 - 0000F67F (0x4e bytes), align: 0 + Segment part 18. Intra module refs: LL_ENC_ReverseBytes::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_ReverseBytes 0000F632 + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F680 - 0000F684 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: LL_ENC_MoveData + LL_ENC_ReverseBytes + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F685 - 0000F690 (0xc bytes), align: 0 + Segment part 21. Intra module refs: LL_ENC_GeneratePseudoRandNum::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GeneratePseudoRandNum + 0000F685 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F691 - 0000F758 (0xc8 bytes), align: 0 + Segment part 23. Intra module refs: LL_ENC_GenerateTrueRandNum::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateTrueRandNum + 0000F691 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F759 - 0000F765 (0xd bytes), align: 0 + Segment part 25. Intra module refs: LL_ENC_GenerateTrueRandNum + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F766 - 0000F78C (0x27 bytes), align: 0 + Segment part 26. Intra module refs: LL_ENC_GenDeviceSKD::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceSKD 0000F766 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F78D - 0000F7B3 (0x27 bytes), align: 0 + Segment part 28. Intra module refs: LL_ENC_GenDeviceIV::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceIV 0000F78D + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7B4 - 0000F7BD (0xa bytes), align: 0 + Segment part 30. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7BE - 0000F7C0 (0x3 bytes), align: 0 + Segment part 31. Intra module refs: LL_ENC_LoadEmptyIV + LL_ENC_LoadKey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7C1 - 0000F7C7 (0x7 bytes), align: 0 + Segment part 32. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + LL_ENC_GenerateNonce + LL_ENC_GeneratePseudoRandNum + LL_ENC_InitAesDMA + LL_ENC_InitDMA0 + LL_ENC_SetupLoadDMA + Segment part 31 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7C8 - 0000F82C (0x65 bytes), align: 0 + Segment part 33. Intra module refs: LL_ENC_GenerateNonce::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateNonce 0000F7C8 + XSTACK = 00000022 ( 00000004 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F82D - 0000F833 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: LL_ENC_GenerateNonce + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F834 - 0000F84F (0x1c bytes), align: 0 + Segment part 36. Intra module refs: LL_ENC_AES128_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_AES128_Encrypt 0000F834 + calls direct + XSTACK = 00000002 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F850 - 0000F852 (0x3 bytes), align: 0 + Segment part 38. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F853 - 0000F857 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: LL_ENC_GenerateTrueRandNum + Segment part 38 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F858 - 0000F867 (0x10 bytes), align: 0 + Segment part 42. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F868 - 0000F8A0 (0x39 bytes), align: 0 + Segment part 43. Intra module refs: LL_ENC_InitAesDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitAesDMA 0000F868 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F8A1 - 0000F8B8 (0x18 bytes), align: 0 + Segment part 45. Intra module refs: LL_ENC_InitDMA0::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitDMA0 0000F8A1 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F8B9 - 0000F911 (0x59 bytes), align: 0 + Segment part 47. Intra module refs: LL_ENC_MoveData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_MoveData 0000F8B9 + calls direct + XSTACK = 00000034 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F912 - 0000F92A (0x19 bytes), align: 0 + Segment part 49. Intra module refs: LL_ENC_SetupLoadDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupLoadDMA 0000F912 + XSTACK = 00000032 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F92B - 0000F967 (0x3d bytes), align: 0 + Segment part 51. Intra module refs: LL_ENC_SetupCryptoDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupCryptoDMA 0000F92B + XSTACK = 00000033 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F968 - 0000F973 (0xc bytes), align: 0 + Segment part 53. Intra module refs: LL_ENC_SetupCryptoDMA + LL_ENC_SetupLoadDMA + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F974 - 0000F986 (0x13 bytes), align: 0 + Segment part 54. Intra module refs: LL_ENC_StartAES::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_StartAES 0000F974 + XSTACK = 00000032 ( 00000000 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F987 - 0000F9A0 (0x1a bytes), align: 0 + Segment part 56. Intra module refs: LL_ENC_LoadEmptyIV::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadEmptyIV 0000F987 + calls direct + XSTACK = 00000032 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F9A1 - 0000F9B6 (0x16 bytes), align: 0 + Segment part 58. Intra module refs: LL_ENC_LoadKey::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadKey 0000F9A1 + calls direct + XSTACK = 00000020 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F9B7 - 0000FAB7 (0x101 bytes), align: 0 + Segment part 60. Intra module refs: LL_ENC_EncryptMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_EncryptMsg 0000F9B7 + calls direct + XSTACK = 0000001A ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAB8 - 0000FAC1 (0xa bytes), align: 0 + Segment part 62. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAC2 - 0000FAC5 (0x4 bytes), align: 0 + Segment part 63. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAC6 - 0000FACB (0x6 bytes), align: 0 + Segment part 64. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + Segment part 63 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FACC - 0000FAD2 (0x7 bytes), align: 0 + Segment part 65. Intra module refs: LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAD3 - 0000FBAE (0xdc bytes), align: 0 + Segment part 66. Intra module refs: LL_ENC_DecryptMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_DecryptMsg 0000FAD3 + calls direct + XSTACK = 00000022 ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBAF - 0000FBB2 (0x4 bytes), align: 0 + Segment part 68. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBB3 - 0000FBBF (0xd bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + Segment part 71 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBC0 - 0000FBCB (0xc bytes), align: 0 + Segment part 70. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBCC - 0000FBD4 (0x9 bytes), align: 0 + Segment part 71. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBD5 - 0000FBE3 (0xf bytes), align: 0 + Segment part 72. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBE4 - 0000FCEA (0x107 bytes), align: 0 + Segment part 73. Intra module refs: LL_ENC_GenerateMIC::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateMIC 0000FBE4 + calls direct + XSTACK = 00000024 ( 00000034 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FCEB - 0000FCF4 (0xa bytes), align: 0 + Segment part 75. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FCF5 - 0000FCFA (0x6 bytes), align: 0 + Segment part 76. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FCFB - 0000FD09 (0xf bytes), align: 0 + Segment part 77. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD0A - 0000FD10 (0x7 bytes), align: 0 + Segment part 78. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD11 - 0000FD17 (0x7 bytes), align: 0 + Segment part 79. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD18 - 0000FD1E (0x7 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 78 + Segment part 79 + Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD1F - 0000FD28 (0xa bytes), align: 0 + Segment part 81. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD29 - 0000FD30 (0x8 bytes), align: 0 + Segment part 82. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD31 - 0000FE15 (0xe5 bytes), align: 0 + Segment part 83. Intra module refs: LL_ENC_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Encrypt 0000FD31 + calls direct + XSTACK = 00000002 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FE16 - 0000FFB2 (0x19d bytes), align: 0 + Segment part 85. Intra module refs: LL_ENC_Decrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Decrypt 0000FE16 + calls direct + XSTACK = 00000002 ( 00000024 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFB3 - 0000FFBF (0xd bytes), align: 0 + Segment part 87. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFC0 - 0000FFC9 (0xa bytes), align: 0 + Segment part 88. Intra module refs: LL_ENC_Decrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFCA - 0000FFD2 (0x9 bytes), align: 0 + Segment part 89. Intra module refs: LL_ENC_Decrypt + LL_ENC_GenerateTrueRandNum + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C99 - 00000C9E (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_ReverseBytes::?relay + 00000C99 Segment part 146 (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C9F - 00000CA4 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GeneratePseudoRandNum::?relay + 00000C9F LL_PseudoRand (ll) + Segment part 63 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CA5 - 00000CAA (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateTrueRandNum::?relay + 00000CA5 LL_Init (ll) + LL_Rand (ll) + llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CAB - 00000CB0 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceSKD::?relay + 00000CAB llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CB1 - 00000CB6 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceIV::?relay + 00000CB1 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CB7 - 00000CBC (0x6 bytes), align: 0 + Segment part 34. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateNonce::?relay + 00000CB7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CBD - 00000CC2 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_AES128_Encrypt::?relay + 00000CBD LL_Encrypt (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CC3 - 00000CC8 (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitAesDMA::?relay + 00000CC3 LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CC9 - 00000CCE (0x6 bytes), align: 0 + Segment part 46. Intra module refs: LL_ENC_MoveData + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitDMA0::?relay + 00000CC9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CCF - 00000CD4 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 64 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_MoveData::?relay + 00000CCF llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CD5 - 00000CDA (0x6 bytes), align: 0 + Segment part 50. Intra module refs: LL_ENC_GenerateMIC + LL_ENC_LoadEmptyIV + LL_ENC_LoadKey + Segment part 69 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupLoadDMA::?relay + 00000CD5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CDB - 00000CE0 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 76 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupCryptoDMA::?relay + 00000CDB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CE1 - 00000CE6 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + Segment part 31 + Segment part 38 + Segment part 69 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_StartAES::?relay + 00000CE1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CE7 - 00000CEC (0x6 bytes), align: 0 + Segment part 57. Intra module refs: LL_ENC_GenerateMIC + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadEmptyIV::?relay + 00000CE7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CED - 00000CF2 (0x6 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 42 + Segment part 87 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadKey::?relay + 00000CED + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CF3 - 00000CF8 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_EncryptMsg::?relay + 00000CF3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CF9 - 00000CFE (0x6 bytes), align: 0 + Segment part 67. Intra module refs: LL_ENC_Decrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_DecryptMsg::?relay + 00000CF9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CFF - 00000D04 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateMIC::?relay + 00000CFF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D05 - 00000D0A (0x6 bytes), align: 0 + Segment part 84. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Encrypt::?relay + 00000D05 Segment part 200 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D0B - 00000D10 (0x6 bytes), align: 0 + Segment part 86. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Decrypt::?relay + 00000D0B llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E2E - 00008E4D (0x20 bytes), align: 0 + Segment part 90. Intra module refs: zeroBlock + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_errorEndCauses + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FF4 - 00017FF6 (0x3 bytes), align: 0 + Segment part 6. Intra module refs: llUnexpectedEndCauseHandler::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llUnexpectedEndCauseHandler + 00017FF4 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D11 - 00000D16 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + llUnexpectedEndCauseHandler::?relay + 00000D11 Segment part 113 (ll_common) + Segment part 115 (ll_common) + Segment part 118 (ll_common) + Segment part 42 (ll_advEndCauses) + Segment part 43 (ll_advEndCauses) + Segment part 51 (ll) + Segment part 53 (ll) + Segment part 97 (ll_scheduler) + Segment part 98 (ll_scheduler) + Segment part 99 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + + ------------------------------------------------------------------------- + PROGRAM MODULE, NAME : ll_halt + + SEGMENTS IN THE MODULE + ====================== +NEAR_CODE + Relative segment, address: CODE 00002534 - 0000253A (0x7 bytes), align: 2 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + HaltMcuUsingPhyFlag 00002534 llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +DATA_Z + Relative segment, address: DATA 00000021 - 00000022 (0x2 bytes), align: 0 + Segment part 1. Intra module refs: HaltMcuUsingPhyFlag + ENTRY ADDRESS REF BY + ===== ======= ====== + phyState 00000021 LL_Reset (ll) + RF_NormalIsr (ll_isr) + llT2OVFC1_ISR (ll_isr) + clkState 00000022 llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + PROGRAM MODULE, NAME : ll_isr + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000009B - 0000009B (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: RF_NormalIsr + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + S1CON 0000009B + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009F - 0000009F (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + FMAP 0000009F + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A1 - 000000A1 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: T2_Isr + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llInitTimer2 (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + T2IRQF 000000A1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A7 - 000000A7 (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: T2_Isr + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llInitTimer2 (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + T2IRQM 000000A7 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A8 - 000000A8 (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalFlashRead (hal_flash) + LL_Init (ll) + LL_Reset (ll) + LL_SetAdvControl (ll) + LL_TxData (ll) + RF_NormalIsr + halDmaIsr (hal_dma) + halSleepTimerIsr (hal_sleep) + halUart1TxIsr (hal_uart) + llClearSetInts (ll_common) + llDequeueCtrlPkt (ll_common) + llDisableT2E1 (ll_timer2) + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llEnqueueCtrlPkt (ll_common) + llGetCurrentFineTime (ll_timer2) + llGetCurrentTime (ll_timer2) + llGetTimer2Capture (ll_timer2) + llReplaceCtrlPkt (ll_common) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartTimer2 (ll_timer2) + llStopTimer2 (ll_timer2) + llT2OVFC1_ISR + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ll_McuPrecisionCount (ll_timer2) + main (WIMU_Main) + osalTimerUpdate (OSAL_Timers) + osal_clear_event (OSAL) + osal_get_timeoutEx (OSAL_Timers) + osal_int_disable (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_mem_free (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_msg_enqueue (OSAL) + osal_msg_extract (OSAL) + osal_msg_push (OSAL) + osal_msg_receive (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IEN0 000000A8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BE - 000000BE (0x1 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: llT2OVFC1_ISR + main (WIMU_Main) + ENTRY ADDRESS REF BY + ===== ======= ====== + SLEEPCMD 000000BE + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C6 - 000000C6 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llSetFreqTune (ll_common) + llT2OVFC1_ISR + main (WIMU_Main) + ENTRY ADDRESS REF BY + ===== ======= ====== + CLKCONCMD 000000C6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000091 - 00000091 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: LL_SetAdvControl (ll) + RF_NormalIsr + llClearRfInts (ll_common) + llScheduleTask (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFIRQF1 00000091 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BF - 000000BF (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: RF_ErrorIsr + llAdvEvt_TaskAbort (ll_advEndCauses) + llClearRfInts (ll_common) + llSlaveEvt_TaskAbort (ll_slaveEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFERRF 000000BF + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E9 - 000000E9 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: RF_NormalIsr + llClearRfInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFIRQF0 000000E9 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000253B - 00002649 (0x10f bytes), align: 0 + Segment part 21. Intra module refs: RF_NormalIsr::??INTVEC 131 + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_NormalIsr 0000253B + interrupt function + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000264A - 000026BF (0x76 bytes), align: 0 + Segment part 22. Intra module refs: RF_ErrorIsr::??INTVEC 3 + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_ErrorIsr 0000264A + interrupt function + ISTACK = 00000000 ( 00000004 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000026C0 - 00002713 (0x54 bytes), align: 0 + Segment part 23. Intra module refs: T2_Isr::??INTVEC 83 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2_Isr 000026C0 + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002714 - 00002789 (0x76 bytes), align: 0 + Segment part 24. Intra module refs: T2_Isr + ENTRY ADDRESS REF BY + ===== ======= ====== + llT2OVFC1_ISR 00002714 + calls direct + XSTACK = 0000000E ( 00000008 ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000005 (0x6 bytes), align: 0 + Segment part 11. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_ErrorIsr::??INTVEC 3 + 00000003 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000055 (0x56 bytes), align: 0 + Segment part 12. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T2_Isr::??INTVEC 83 00000053 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000085 (0x86 bytes), align: 0 + Segment part 13. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_NormalIsr::??INTVEC 131 + 00000083 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F82 - 00008F85 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffff 00008F82 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F26 - 00008F29 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffff7fff 00008F26 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F82 - 00008F85 (0x4 bytes), align: 0 + Segment part 25. Intra module refs: __Constant_ffff + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F26 - 00008F29 (0x4 bytes), align: 0 + Segment part 26. Intra module refs: __Constant_ffff7fff + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_math + + SEGMENTS IN THE MODULE + ====================== +DATA_Z + Relative segment, address: DATA 00000023 - 00000028 (0x6 bytes), align: 0 + Segment part 0. Intra module refs: llDivide31By16To16 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000278C - 000027DC (0x51 bytes), align: 2 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDivide31By16To16 0000278C LL_TxData (ll) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_scheduler + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000060C - 00000640 (0x35 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 63 + llAllocTask + llFindNextSecTask + llFreeTask + llGetActiveTasks + llGetCurrentTask + llGetNumTasks + llGetTask + llScheduleTask + llScheduler + llSchedulerInit + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000641 - 000007CA (0x18a bytes), align: 0 + Segment part 9. Intra module refs: Segment part 99 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E94C - 0000E97F (0x34 bytes), align: 0 + Segment part 22. Intra module refs: llSchedulerInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSchedulerInit 0000E94C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E980 - 0000EC87 (0x308 bytes), align: 0 + Segment part 24. Intra module refs: llScheduler::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduler 0000E980 + calls direct + XSTACK = 00000000 ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EC88 - 0000EC8C (0x5 bytes), align: 0 + Segment part 26. Intra module refs: llFindStartType + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EC8D - 0000EC91 (0x5 bytes), align: 0 + Segment part 27. Intra module refs: llScheduleTask + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EC92 - 0000EC99 (0x8 bytes), align: 0 + Segment part 28. Intra module refs: Segment part 27 + llFindStartType + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EC9A - 0000ECA5 (0xc bytes), align: 0 + Segment part 29. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECA6 - 0000ECAE (0x9 bytes), align: 0 + Segment part 30. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECAF - 0000ECCB (0x1d bytes), align: 0 + Segment part 31. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECCC - 0000ECEA (0x1f bytes), align: 0 + Segment part 32. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECEB - 0000EE1A (0x130 bytes), align: 0 + Segment part 33. Intra module refs: llScheduleTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduleTask 0000ECEB + calls direct + XSTACK = 00000014 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE1B - 0000EE21 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: llAllocTask + llScheduleTask + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE22 - 0000EE28 (0x7 bytes), align: 0 + Segment part 36. Intra module refs: llFreeTask + llScheduleTask + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE29 - 0000EE34 (0xc bytes), align: 0 + Segment part 37. Intra module refs: llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE35 - 0000EEE5 (0xb1 bytes), align: 0 + Segment part 38. Intra module refs: llFindStartType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindStartType 0000EE35 + calls direct + XSTACK = 00000014 ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EEE6 - 0000EEEB (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llFindNextSecTask + llFindStartType + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EEEC - 0000EEEE (0x3 bytes), align: 0 + Segment part 41. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EEEF - 0000EEF2 (0x4 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 41 + llFindStartType + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EEF3 - 0000EEFE (0xc bytes), align: 0 + Segment part 43. Intra module refs: Segment part 30 + Segment part 42 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EEFF - 0000F06F (0x171 bytes), align: 0 + Segment part 44. Intra module refs: llFindNextSecTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindNextSecTask 0000EEFF + calls direct + XSTACK = 00000014 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F070 - 0000F07F (0x10 bytes), align: 0 + Segment part 46. Intra module refs: llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F080 - 0000F081 (0x2 bytes), align: 0 + Segment part 47. Intra module refs: llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F082 - 0000F088 (0x7 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F089 - 0000F14C (0xc4 bytes), align: 0 + Segment part 49. Intra module refs: llAllocTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocTask 0000F089 + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F14D - 0000F153 (0x7 bytes), align: 0 + Segment part 51. Intra module refs: llAllocTask + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F154 - 0000F156 (0x3 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 35 + Segment part 51 + Segment part 54 + llAllocTask + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F157 - 0000F15B (0x5 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 52 + Segment part 85 + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F15C - 0000F163 (0x8 bytes), align: 0 + Segment part 54. Intra module refs: llAllocTask + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F164 - 0000F19D (0x3a bytes), align: 0 + Segment part 55. Intra module refs: llFreeTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFreeTask 0000F164 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F19E - 0000F1B7 (0x1a bytes), align: 0 + Segment part 57. Intra module refs: llGetCurrentTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTask 0000F19E + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1B8 - 0000F1B9 (0x2 bytes), align: 0 + Segment part 59. Intra module refs: llGetActiveTasks + llGetNumTasks + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1BA - 0000F1C0 (0x7 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + llFreeTask + llGetCurrentTask + llGetTaskState + llRestoreRfRegs + llSaveRfRegs + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1C1 - 0000F1E8 (0x28 bytes), align: 0 + Segment part 61. Intra module refs: llGetTaskState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTaskState 0000F1C1 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1E9 - 0000F202 (0x1a bytes), align: 0 + Segment part 63. Intra module refs: llGetTaskState + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F203 - 0000F20B (0x9 bytes), align: 0 + Segment part 64. Intra module refs: llGetActiveTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetActiveTasks 0000F203 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F20C - 0000F255 (0x4a bytes), align: 0 + Segment part 66. Intra module refs: llGetTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTask 0000F20C + XSTACK = 00000012 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F256 - 0000F25F (0xa bytes), align: 0 + Segment part 68. Intra module refs: llGetNumTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNumTasks 0000F256 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F260 - 0000F306 (0xa7 bytes), align: 0 + Segment part 70. Intra module refs: llSave_txFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_txFIFO 0000F260 + calls direct + XSTACK = 0000000C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F307 - 0000F30B (0x5 bytes), align: 0 + Segment part 72. Intra module refs: llRestoreConnState + llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F30C - 0000F3BA (0xaf bytes), align: 0 + Segment part 73. Intra module refs: llSave_rxFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_rxFIFO 0000F30C + calls direct + XSTACK = 0000000C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3BB - 0000F3BE (0x4 bytes), align: 0 + Segment part 75. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3BF - 0000F3C9 (0xb bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3CA - 0000F3CE (0x5 bytes), align: 0 + Segment part 77. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3CF - 0000F3DF (0x11 bytes), align: 0 + Segment part 78. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3E0 - 0000F42A (0x4b bytes), align: 0 + Segment part 79. Intra module refs: llRestore_txFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_txFIFO 0000F3E0 + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F42B - 0000F433 (0x9 bytes), align: 0 + Segment part 81. Intra module refs: llRestore_rxFIFO + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F434 - 0000F47F (0x4c bytes), align: 0 + Segment part 82. Intra module refs: llRestore_rxFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_rxFIFO 0000F434 + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F480 - 0000F488 (0x9 bytes), align: 0 + Segment part 84. Intra module refs: llRestoreRfRegs + llRestore_rxFIFO + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F489 - 0000F495 (0xd bytes), align: 0 + Segment part 85. Intra module refs: llRestore_rxFIFO + llSave_rxFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F496 - 0000F4E8 (0x53 bytes), align: 0 + Segment part 86. Intra module refs: llSaveRfRegs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveRfRegs 0000F496 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F4E9 - 0000F517 (0x2f bytes), align: 0 + Segment part 88. Intra module refs: llRestoreRfRegs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreRfRegs 0000F4E9 + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F518 - 0000F556 (0x3f bytes), align: 0 + Segment part 90. Intra module refs: llSaveConnState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveConnState 0000F518 + calls direct + XSTACK = 00000014 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F557 - 0000F5E7 (0x91 bytes), align: 0 + Segment part 92. Intra module refs: llRestoreConnState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreConnState 0000F557 + calls direct + XSTACK = 00000014 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F5E8 - 0000F5F0 (0x9 bytes), align: 0 + Segment part 94. Intra module refs: llRestoreConnState + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F5F1 - 0000F5F6 (0x6 bytes), align: 0 + Segment part 95. Intra module refs: llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F5F7 - 0000F601 (0xb bytes), align: 0 + Segment part 96. Intra module refs: Segment part 95 + llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F602 - 0000F60F (0xe bytes), align: 0 + Segment part 97. Intra module refs: llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F610 - 0000F618 (0x9 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F619 - 0000F631 (0x19 bytes), align: 0 + Segment part 99. Intra module refs: llRestoreConnState + llSaveConnState + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F0A - 00008F0D (0x4 bytes), align: 0 + Segment part 12. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_fffffff1 00008F0A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F0E - 00008F11 (0x4 bytes), align: 0 + Segment part 18. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1a 00008F0E + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F12 - 00008F15 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffffe7 00008F12 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F16 - 00008F19 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_7 00008F16 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F1A - 00008F1D (0x4 bytes), align: 0 + Segment part 21. Intra module refs: llFindNextSecTask + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_fffffff6 00008F1A + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D17 - 00000D1C (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSchedulerInit::?relay + 00000D17 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D1D - 00000D22 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduler::?relay 00000D1D LL_SetAdvControl (ll) + Segment part 18 (ll_advEndCauses) + Segment part 46 (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llConnTerminate (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D23 - 00000D28 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduleTask::?relay + 00000D23 LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D29 - 00000D2E (0x6 bytes), align: 0 + Segment part 39. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindStartType::?relay + 00000D29 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D2F - 00000D34 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 29 + llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindNextSecTask::?relay + 00000D2F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D35 - 00000D3A (0x6 bytes), align: 0 + Segment part 50. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocTask::?relay 00000D35 LL_SetAdvControl (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D3B - 00000D40 (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + llFreeTask::?relay 00000D3B Segment part 164 (ll) + Segment part 75 (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llConnCleanup (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D41 - 00000D46 (0x6 bytes), align: 0 + Segment part 58. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTask::?relay + 00000D41 LL_Rand (ll) + LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D47 - 00000D4C (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 48 + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTaskState::?relay + 00000D47 Segment part 69 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D4D - 00000D52 (0x6 bytes), align: 0 + Segment part 65. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetActiveTasks::?relay + 00000D4D LL_SetAdvControl (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D53 - 00000D58 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 46 + llFindNextSecTask + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTask::?relay 00000D53 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D59 - 00000D5E (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNumTasks::?relay 00000D59 LL_SetAdvControl (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D5F - 00000D64 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_txFIFO::?relay 00000D5F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D65 - 00000D6A (0x6 bytes), align: 0 + Segment part 74. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_rxFIFO::?relay 00000D65 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D6B - 00000D70 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_txFIFO::?relay + 00000D6B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D71 - 00000D76 (0x6 bytes), align: 0 + Segment part 83. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_rxFIFO::?relay + 00000D71 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D77 - 00000D7C (0x6 bytes), align: 0 + Segment part 87. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveRfRegs::?relay 00000D77 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D7D - 00000D82 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreRfRegs::?relay + 00000D7D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D83 - 00000D88 (0x6 bytes), align: 0 + Segment part 91. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveConnState::?relay + 00000D83 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D89 - 00000D8E (0x6 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 31 + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreConnState::?relay + 00000D89 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F0A - 00008F0D (0x4 bytes), align: 0 + Segment part 102. Intra module refs: __Constant_fffffff1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F0E - 00008F11 (0x4 bytes), align: 0 + Segment part 108. Intra module refs: __Constant_1a + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F12 - 00008F15 (0x4 bytes), align: 0 + Segment part 109. Intra module refs: __Constant_ffffffe7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F16 - 00008F19 (0x4 bytes), align: 0 + Segment part 110. Intra module refs: __Constant_7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F1A - 00008F1D (0x4 bytes), align: 0 + Segment part 111. Intra module refs: __Constant_fffffff6 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_slaveEndCauses + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000589A - 0000601C (0x783 bytes), align: 0 + Segment part 17. Intra module refs: llSlaveEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskEndOk 0000589A + calls direct + XSTACK = 00000000 ( 0000001A ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000601D - 00006020 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006021 - 0000602D (0xd bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 23 + Segment part 24 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000602E - 00006032 (0x5 bytes), align: 0 + Segment part 21. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006033 - 0000603B (0x9 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 21 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000603C - 00006041 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006042 - 0000604C (0xb bytes), align: 0 + Segment part 24. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000604D - 0000605B (0xf bytes), align: 0 + Segment part 25. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000605C - 00006064 (0x9 bytes), align: 0 + Segment part 26. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006065 - 00006075 (0x11 bytes), align: 0 + Segment part 27. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006076 - 00006083 (0xe bytes), align: 0 + Segment part 28. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006084 - 0000608B (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + Segment part 86 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000608C - 00006098 (0xd bytes), align: 0 + Segment part 30. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006099 - 000060A4 (0xc bytes), align: 0 + Segment part 31. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060A5 - 000060B0 (0xc bytes), align: 0 + Segment part 32. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060B1 - 000060BA (0xa bytes), align: 0 + Segment part 33. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060BB - 000060CA (0x10 bytes), align: 0 + Segment part 34. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060CB - 000060D0 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060D1 - 000060DB (0xb bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060DC - 000060DF (0x4 bytes), align: 0 + Segment part 37. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060E0 - 000060EE (0xf bytes), align: 0 + Segment part 38. Intra module refs: Segment part 37 + llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060EF - 000060F3 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060F4 - 000060F9 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llSlaveEvt_TaskAbort::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskAbort 000060F4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000060FA - 000065CE (0x4d5 bytes), align: 0 + Segment part 42. Intra module refs: llSetupNextSlaveEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNextSlaveEvent 000060FA + calls direct + XSTACK = 00000018 ( 0000001E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065CF - 000065D1 (0x3 bytes), align: 0 + Segment part 44. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065D2 - 000065D6 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 44 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065D7 - 000065E3 (0xd bytes), align: 0 + Segment part 46. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065E4 - 000065E6 (0x3 bytes), align: 0 + Segment part 47. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065E7 - 000065E9 (0x3 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065EA - 000065ED (0x4 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065EE - 000065F0 (0x3 bytes), align: 0 + Segment part 50. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065F1 - 000065F4 (0x4 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065F5 - 000065F7 (0x3 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 31 + Segment part 51 + Segment part 54 + Segment part 85 + Segment part 90 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065F8 - 000065FD (0x6 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 25 + Segment part 32 + Segment part 52 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065FE - 00006607 (0xa bytes), align: 0 + Segment part 54. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006608 - 0000660D (0x6 bytes), align: 0 + Segment part 55. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000660E - 00006610 (0x3 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 30 + Segment part 55 + Segment part 61 + Segment part 65 + Segment part 91 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006611 - 00006615 (0x5 bytes), align: 0 + Segment part 57. Intra module refs: Segment part 27 + Segment part 49 + Segment part 56 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006616 - 0000661A (0x5 bytes), align: 0 + Segment part 58. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000661B - 00006624 (0xa bytes), align: 0 + Segment part 59. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006625 - 00006637 (0x13 bytes), align: 0 + Segment part 60. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006638 - 0000663A (0x3 bytes), align: 0 + Segment part 61. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000663B - 00006640 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006641 - 0000664B (0xb bytes), align: 0 + Segment part 63. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000664C - 00006654 (0x9 bytes), align: 0 + Segment part 64. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006655 - 00006657 (0x3 bytes), align: 0 + Segment part 65. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006658 - 0000665B (0x4 bytes), align: 0 + Segment part 66. Intra module refs: Segment part 65 + llCheckForLstoDuringSL + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000665C - 00006661 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 33 + Segment part 36 + Segment part 38 + Segment part 66 + Segment part 68 + Segment part 70 + Segment part 78 + Segment part 91 + Segment part 92 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006662 - 00006666 (0x5 bytes), align: 0 + Segment part 68. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006667 - 0000666C (0x6 bytes), align: 0 + Segment part 69. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000666D - 00006676 (0xa bytes), align: 0 + Segment part 70. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006677 - 0000667D (0x7 bytes), align: 0 + Segment part 71. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000667E - 0000668B (0xe bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000668C - 00006690 (0x5 bytes), align: 0 + Segment part 73. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006691 - 00006698 (0x8 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006699 - 0000669B (0x3 bytes), align: 0 + Segment part 75. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000669C - 0000669E (0x3 bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + llCheckForLstoDuringSL + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000669F - 000066A4 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000066A5 - 000066B4 (0x10 bytes), align: 0 + Segment part 78. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000066B5 - 00006A17 (0x363 bytes), align: 0 + Segment part 79. Intra module refs: llProcessSlaveControlProcedures::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessSlaveControlProcedures + 000066B5 + calls direct + XSTACK = 00000018 ( 0000001C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A18 - 00006A1B (0x4 bytes), align: 0 + Segment part 81. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A1C - 00006A25 (0xa bytes), align: 0 + Segment part 82. Intra module refs: Segment part 58 + Segment part 81 + Segment part 83 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A26 - 00006A2B (0x6 bytes), align: 0 + Segment part 83. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A2C - 00006A2E (0x3 bytes), align: 0 + Segment part 84. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A2F - 00006A34 (0x6 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A35 - 00006A39 (0x5 bytes), align: 0 + Segment part 86. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A3A - 00006A41 (0x8 bytes), align: 0 + Segment part 87. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A42 - 00006A48 (0x7 bytes), align: 0 + Segment part 88. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A49 - 00006A54 (0xc bytes), align: 0 + Segment part 89. Intra module refs: Segment part 30 + Segment part 88 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A55 - 00006A66 (0x12 bytes), align: 0 + Segment part 90. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A67 - 00006A7B (0x15 bytes), align: 0 + Segment part 91. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A7C - 00006A9A (0x1f bytes), align: 0 + Segment part 92. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A9B - 00006AE9 (0x4f bytes), align: 0 + Segment part 93. Intra module refs: llCheckForLstoDuringSL::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckForLstoDuringSL + 00006A9B + XSTACK = 00000018 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F86 - 00008F89 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: llSetupNextSlaveEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_50 00008F86 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D8F - 00000D94 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskEndOk::?relay + 00000D8F Segment part 40 (ll_advEndCauses) + Segment part 41 (ll_advEndCauses) + Segment part 95 (ll_scheduler) + Segment part 96 (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D95 - 00000D9A (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskAbort::?relay + 00000D95 llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D9B - 00000DA0 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: llSlaveEvt_TaskEndOk + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNextSlaveEvent::?relay + 00000D9B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DA1 - 00000DA6 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: llSlaveEvt_TaskEndOk + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessSlaveControlProcedures::?relay + 00000DA1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DA7 - 00000DAC (0x6 bytes), align: 0 + Segment part 94. Intra module refs: llSetupNextSlaveEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckForLstoDuringSL::?relay + 00000DA7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F86 - 00008F89 (0x4 bytes), align: 0 + Segment part 100. Intra module refs: __Constant_50 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_sleep + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000080 - 00000080 (0x1 bytes), align: 0 + Segment part 1. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P0 00000080 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A0 - 000000A0 (0x1 bytes), align: 0 + Segment part 4. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P2 000000A0 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F22 - 00008F25 (0x4 bytes), align: 0 + Segment part 16. Intra module refs: ll24BitTimeCompare (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_c801 00008F22 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F22 - 00008F25 (0x4 bytes), align: 0 + Segment part 27. Intra module refs: __Constant_c801 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_timer2 + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000094 - 00000094 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: llInitTimer2 + llStartTimer2 + llStopTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2CTRL 00000094 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009C - 0000009C (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: llDisableT2E1 + llDisableT2IntsEvts + llInitTimer2 + llSetT2C1Event1 + llSetT2OVFC1Event1 + llSetT2OVFC2Event2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2CSPCFG 0000009C + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A2 - 000000A2 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llGetCurrentFineTime + llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2M0 000000A2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A3 - 000000A3 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: llGetCurrentFineTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + ENTRY ADDRESS REF BY + ===== ======= ====== + T2M1 000000A3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A4 - 000000A4 (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF0 000000A4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A5 - 000000A5 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF1 000000A5 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A6 - 000000A6 (0x1 bytes), align: 0 + Segment part 11. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF2 000000A6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C3 - 000000C3 (0x1 bytes), align: 0 + Segment part 14. ROOT. Intra module refs: llGetCurrentFineTime + llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MSEL 000000C3 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000194BE - 00019533 (0x76 bytes), align: 0 + Segment part 24. Intra module refs: llInitTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitTimer2 000194BE + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019534 - 00019543 (0x10 bytes), align: 0 + Segment part 26. Intra module refs: llStopTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStopTimer2 00019534 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019544 - 00019549 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: llStartTimer2 + llStopTimer2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001954A - 0001955B (0x12 bytes), align: 0 + Segment part 29. Intra module refs: llStartTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartTimer2 0001954A + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001955C - 00019562 (0x7 bytes), align: 0 + Segment part 33. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019563 - 00019565 (0x3 bytes), align: 0 + Segment part 34. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019566 - 00019571 (0xc bytes), align: 0 + Segment part 35. Intra module refs: Segment part 34 + llSetT2Delta + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019572 - 00019581 (0x10 bytes), align: 0 + Segment part 38. Intra module refs: llGetCurrentFineTime + ll_McuPrecisionCount + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019582 - 00019586 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 33 + Segment part 38 + llSetT2Delta + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019587 - 000195A7 (0x21 bytes), align: 0 + Segment part 40. Intra module refs: llSetT2OVFC1Timeout::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Timeout 00019587 + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195A8 - 000195AF (0x8 bytes), align: 0 + Segment part 42. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195B0 - 000195B2 (0x3 bytes), align: 0 + Segment part 43. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195B3 - 000195BE (0xc bytes), align: 0 + Segment part 44. Intra module refs: Segment part 43 + llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195BF - 000195E1 (0x23 bytes), align: 0 + Segment part 47. Intra module refs: llSetT2C1Event1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2C1Event1 000195BF + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195E2 - 000195E8 (0x7 bytes), align: 0 + Segment part 49. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195E9 - 000195F9 (0x11 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195FA - 0001962F (0x36 bytes), align: 0 + Segment part 51. Intra module refs: llGetCurrentTime + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019630 - 00019631 (0x2 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 42 + Segment part 51 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019632 - 00019634 (0x3 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 39 + Segment part 52 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019635 - 0001963B (0x7 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + Segment part 77 + llInitTimer2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001963C - 00019664 (0x29 bytes), align: 0 + Segment part 55. Intra module refs: llSetT2OVFC1Event1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Event1 0001963C + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019665 - 0001966A (0x6 bytes), align: 0 + Segment part 57. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001966B - 00019676 (0xc bytes), align: 0 + Segment part 58. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019677 - 000196DB (0x65 bytes), align: 0 + Segment part 59. Intra module refs: llSetT2OVFC2Event2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC2Event2 00019677 + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000196DC - 000196DF (0x4 bytes), align: 0 + Segment part 61. Intra module refs: llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000196E0 - 000196F1 (0x12 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 58 + Segment part 61 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000196F2 - 0001972D (0x3c bytes), align: 0 + Segment part 63. Intra module refs: llSetT2Delta::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2Delta 000196F2 + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001972E - 00019736 (0x9 bytes), align: 0 + Segment part 65. Intra module refs: llDisableT2Ints::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2Ints 0001972E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019737 - 00019742 (0xc bytes), align: 0 + Segment part 67. Intra module refs: llDisableT2IntsEvts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2IntsEvts 00019737 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019743 - 00019752 (0x10 bytes), align: 0 + Segment part 69. Intra module refs: llDisableT2E1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2E1 00019743 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019753 - 00019755 (0x3 bytes), align: 0 + Segment part 71. Intra module refs: llDisableT2Ints + llDisableT2IntsEvts + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019756 - 00019757 (0x2 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llDisableT2E1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019758 - 0001975C (0x5 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 28 + Segment part 72 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001975D - 00019768 (0xc bytes), align: 0 + Segment part 74. Intra module refs: llGetTimer2Capture::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTimer2Capture 0001975D + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019769 - 00019774 (0xc bytes), align: 0 + Segment part 76. Intra module refs: llGetTimer2Capture + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019775 - 00019781 (0xd bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019782 - 00019797 (0x16 bytes), align: 0 + Segment part 78. Intra module refs: llGetCurrentTime::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTime 00019782 + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019798 - 000197C0 (0x29 bytes), align: 0 + Segment part 80. Intra module refs: llGetCurrentFineTime::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentFineTime 00019798 + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197C1 - 000197DB (0x1b bytes), align: 0 + Segment part 86. Intra module refs: Segment part 76 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000027DD - 00002834 (0x58 bytes), align: 0 + Segment part 93. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll24BitTimeCompare 000027DD Segment part 191 (ll) + Segment part 40 (ll_scheduler) + llAdjustForMissedEvent (ll_common) + XSTACK = 00000004 ( 0000000F ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002835 - 00002839 (0x5 bytes), align: 0 + Segment part 94. Intra module refs: ll24BitTimeCompare + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000283A - 000028A1 (0x68 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll24BitTimeDelta 0000283A Segment part 190 (ll) + llFindStartType (ll_scheduler) + llScheduleTask (ll_scheduler) + XSTACK = 00000004 ( 00000013 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000028A2 - 000028B7 (0x16 bytes), align: 0 + Segment part 98. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000028B8 - 000028FD (0x46 bytes), align: 0 + Segment part 99. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustTimeBackward 000028B8 Segment part 31 (ll_advEndCauses) + Segment part 71 (ll_slaveEndCauses) + XSTACK = 00000000 ( 0000000B ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000028FE - 0000290B (0xe bytes), align: 0 + Segment part 100. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000290C - 00002929 (0x1e bytes), align: 0 + Segment part 101. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197DC - 0001980B (0x30 bytes), align: 0 + Segment part 91. Intra module refs: ll_McuPrecisionCount::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ll_McuPrecisionCount 000197DC + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DAD - 00000DB2 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitTimer2::?relay 00000DAD LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DB3 - 00000DB8 (0x6 bytes), align: 0 + Segment part 27. Intra module refs: llInitTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + llStopTimer2::?relay 00000DB3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DB9 - 00000DBE (0x6 bytes), align: 0 + Segment part 30. Intra module refs: llInitTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartTimer2::?relay 00000DB9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DBF - 00000DC4 (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Timeout::?relay + 00000DBF llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DC5 - 00000DCA (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2C1Event1::?relay + 00000DC5 llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DCB - 00000DD0 (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Event1::?relay + 00000DCB llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DD1 - 00000DD6 (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC2Event2::?relay + 00000DD1 llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DD7 - 00000DDC (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2Delta::?relay 00000DD7 llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DDD - 00000DE2 (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2Ints::?relay + 00000DDD RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DE3 - 00000DE8 (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2IntsEvts::?relay + 00000DE3 LL_Reset (ll) + LL_SetAdvControl (ll) + RF_NormalIsr (ll_isr) + llDirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DE9 - 00000DEE (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2E1::?relay 00000DE9 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DEF - 00000DF4 (0x6 bytes), align: 0 + Segment part 75. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTimer2Capture::?relay + 00000DEF llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DF5 - 00000DFA (0x6 bytes), align: 0 + Segment part 79. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTime::?relay + 00000DF5 LL_SetAdvControl (ll) + Segment part 253 (ll) + Segment part 43 (ll_scheduler) + llAdjustForMissedEvent (ll_common) + llAllocTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DFB - 00000E00 (0x6 bytes), align: 0 + Segment part 81. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentFineTime::?relay + 00000DFB LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E01 - 00000E06 (0x6 bytes), align: 0 + Segment part 92. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll_McuPrecisionCount::?relay + 00000E01 osalTimeUpdate (OSAL_ClockBLE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_timerDrift + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E9D - 00008EAC (0x10 bytes), align: 0 + Segment part 6. Intra module refs: llCalcScaFactor + ENTRY ADDRESS REF BY + ===== ======= ====== + SCA 00008E9D + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EC4 - 00008EC9 (0x6 bytes), align: 2 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + OverheadJitter 00008EC4 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000292A - 0000297D (0x54 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCalcScaFactor 0000292A llAdvEvt_TaskConnect (ll_advEndCauses) + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000297E - 00002A3F (0xc2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCalcTimerDrift 0000297E llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + calls direct + XSTACK = 00000006 ( 00000011 ) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F2E - 00008F31 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: llCalcTimerDrift + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_271 00008F2E + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E9D - 00008EAC (0x10 bytes), align: 0 + Segment part 12. Intra module refs: SCA + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EC4 - 00008EC9 (0x6 bytes), align: 2 + Segment part 13. Intra module refs: OverheadJitter + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F2E - 00008F31 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: __Constant_271 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : phy + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007CB - 000007CB (0x1 bytes), align: 0 + Segment part 11. Intra module refs: PHY_AddWlEntry + PHY_ClearWhitelist + ENTRY ADDRESS REF BY + ===== ======= ====== + numWLEntries 000007CB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016ED2 - 00016EE4 (0x13 bytes), align: 0 + Segment part 12. Intra module refs: PHY_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Init 00016ED2 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EE5 - 00016EFE (0x1a bytes), align: 0 + Segment part 16. Intra module refs: PHY_Reset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Reset 00016EE5 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016EFF - 00016F27 (0x29 bytes), align: 0 + Segment part 18. Intra module refs: PHY_LoadNR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_LoadNR 00016EFF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F28 - 00016F5E (0x37 bytes), align: 0 + Segment part 20. Intra module refs: PHY_VerifyNR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_VerifyNR 00016F28 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F5F - 00016F6A (0xc bytes), align: 0 + Segment part 22. Intra module refs: PHY_LoadNR + PHY_VerifyNR + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F6B - 00016F99 (0x2f bytes), align: 0 + Segment part 23. Intra module refs: PHY_ClearAllRegsAndFifos::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearAllRegsAndFifos + 00016F6B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F9A - 00016F9E (0x5 bytes), align: 0 + Segment part 25. Intra module refs: PHY_ClearAllRegsAndFifos + PHY_LoadNR + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F9F - 00016FA9 (0xb bytes), align: 0 + Segment part 26. Intra module refs: PHY_VerifyNR + Segment part 25 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016FAA - 00016FE7 (0x3e bytes), align: 0 + Segment part 31. Intra module refs: PHY_SetOwnAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetOwnAddr 00016FAA + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016FE8 - 00017025 (0x3e bytes), align: 0 + Segment part 33. Intra module refs: PHY_SetPeerAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetPeerAddr 00016FE8 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017026 - 0001702E (0x9 bytes), align: 0 + Segment part 35. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001702F - 00017033 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017034 - 00017038 (0x5 bytes), align: 0 + Segment part 37. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017039 - 0001703E (0x6 bytes), align: 0 + Segment part 38. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001703F - 00017043 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 37 + Segment part 38 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017044 - 0001704C (0x9 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 36 + Segment part 39 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001704D - 0001705A (0xe bytes), align: 0 + Segment part 41. Intra module refs: PHY_SetCRCInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetCRCInit 0001704D + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001705B - 00017061 (0x7 bytes), align: 0 + Segment part 43. Intra module refs: PHY_SetCRCInit + PHY_SetSyncWord + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017062 - 0001706C (0xb bytes), align: 0 + Segment part 44. Intra module refs: PHY_GetAdvChans::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetAdvChans 00017062 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001706D - 00017079 (0xd bytes), align: 0 + Segment part 46. Intra module refs: PHY_SetAdvChans::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvChans 0001706D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A40 - 00002A48 (0x9 bytes), align: 0 + Segment part 236. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetDataChan 00002A40 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetNextDataChan (ll_common) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A49 - 00002A4D (0x5 bytes), align: 0 + Segment part 237. Intra module refs: PHY_SetDataChan + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001707A - 00017090 (0x17 bytes), align: 0 + Segment part 48. Intra module refs: PHY_SetEndConnection::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetEndConnection 0001707A + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017091 - 0001709E (0xe bytes), align: 0 + Segment part 50. Intra module refs: PHY_ConfigureMD::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureMD 00017091 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001709F - 000170A9 (0xb bytes), align: 0 + Segment part 58. Intra module refs: PHY_GetEndCause::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetEndCause 0001709F + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170AA - 000170B5 (0xc bytes), align: 0 + Segment part 62. Intra module refs: PHY_InitSeqStat::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_InitSeqStat 000170AA + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170B6 - 000170C8 (0x13 bytes), align: 0 + Segment part 68. Intra module refs: PHY_SetSyncWord::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetSyncWord 000170B6 + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170C9 - 000170D3 (0xb bytes), align: 0 + Segment part 70. Intra module refs: PHY_SetMaxNack::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetMaxNack 000170C9 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170D4 - 000170EC (0x19 bytes), align: 0 + Segment part 72. Intra module refs: PHY_ClearWhitelist::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearWhitelist 000170D4 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170ED - 000170ED (0x1 bytes), align: 0 + Segment part 78. Intra module refs: PHY_ClearBlacklistIndex + PHY_SetBlacklistIndex + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170EE - 000170F2 (0x5 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170F3 - 000170F6 (0x4 bytes), align: 0 + Segment part 84. Intra module refs: PHY_GetAdvChans + PHY_GetEndCause + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170F7 - 00017192 (0x9c bytes), align: 0 + Segment part 87. Intra module refs: PHY_AddWlEntry::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_AddWlEntry 000170F7 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017193 - 0001719F (0xd bytes), align: 0 + Segment part 92. Intra module refs: PHY_AddWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171A0 - 000171AF (0x10 bytes), align: 0 + Segment part 93. Intra module refs: PHY_SetAdvWlPolicy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvWlPolicy 000171A0 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171B0 - 000171C9 (0x1a bytes), align: 0 + Segment part 99. Intra module refs: PHY_SetBlacklistIndex::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetBlacklistIndex 000171B0 + XSTACK = 0000000C ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171CA - 000171E6 (0x1d bytes), align: 0 + Segment part 104. Intra module refs: PHY_ClearBlacklistIndex::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklistIndex + 000171CA + XSTACK = 0000000C ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171E7 - 000171F1 (0xb bytes), align: 0 + Segment part 106. Intra module refs: PHY_ClearBlacklist::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklist 000171E7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171F2 - 000171F7 (0x6 bytes), align: 0 + Segment part 115. Intra module refs: phyFindWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171F8 - 000171FC (0x5 bytes), align: 0 + Segment part 116. Intra module refs: PHY_ClearSavedWhiteList + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171FD - 00017202 (0x6 bytes), align: 0 + Segment part 117. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + Segment part 116 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017203 - 00017218 (0x16 bytes), align: 0 + Segment part 119. Intra module refs: PHY_ClearSavedWhiteList::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearSavedWhiteList + 00017203 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017219 - 0001721E (0x6 bytes), align: 0 + Segment part 121. Intra module refs: PHY_ClearSavedWhiteList + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001721F - 00017222 (0x4 bytes), align: 0 + Segment part 129. Intra module refs: PHY_AddWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017223 - 00017227 (0x5 bytes), align: 0 + Segment part 130. Intra module refs: Segment part 129 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017228 - 00017231 (0xa bytes), align: 0 + Segment part 132. Intra module refs: PHY_ConfigureFifoDataProcessing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureFifoDataProcessing + 00017228 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017232 - 00017245 (0x14 bytes), align: 0 + Segment part 134. Intra module refs: PHY_ConfigureAppendRfStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureAppendRfStatus + 00017232 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017246 - 0001724F (0xa bytes), align: 0 + Segment part 136. Intra module refs: PHY_SetFifoConfig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetFifoConfig 00017246 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017250 - 00017258 (0x9 bytes), align: 0 + Segment part 148. Intra module refs: PHY_SetSyncWord + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017259 - 0001725A (0x2 bytes), align: 0 + Segment part 150. Intra module refs: PHY_ClearAllRegsAndFifos + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001725B - 0001725B (0x1 bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001725C - 0001725C (0x1 bytes), align: 0 + Segment part 152. Intra module refs: Segment part 151 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001725D - 0001725D (0x1 bytes), align: 0 + Segment part 153. Intra module refs: PHY_ClearBlacklist + PHY_ConfigureAppendRfStatus + PHY_ConfigureFifoDataProcessing + PHY_ConfigureMD + PHY_InitSeqStat + PHY_SetAdvChans + PHY_SetAdvWlPolicy + PHY_SetEndConnection + PHY_SetFifoConfig + PHY_SetMaxNack + PHY_SetOwnAddr + PHY_SetPeerAddr + PHY_SetRfFreq + Segment part 121 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001725E - 00017264 (0x7 bytes), align: 0 + Segment part 154. Intra module refs: PHY_ClearWhitelist + PHY_ConfigWhitener + PHY_Init + PHY_LoadNR + PHY_Reset + PHY_VerifyNR + Segment part 153 + Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017265 - 000172C5 (0x61 bytes), align: 0 + Segment part 155. Intra module refs: PHY_ConfigWhitener::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigWhitener 00017265 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172C6 - 000172CB (0x6 bytes), align: 0 + Segment part 169. Intra module refs: PHY_RetryTxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryTxFifo 000172C6 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172CC - 000172D1 (0x6 bytes), align: 0 + Segment part 171. Intra module refs: PHY_RetryRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryRxFifo 000172CC + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172D2 - 000172D7 (0x6 bytes), align: 0 + Segment part 175. Intra module refs: PHY_CommitRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_CommitRxFifo 000172D2 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172D8 - 000172DD (0x6 bytes), align: 0 + Segment part 179. Intra module refs: PHY_DeallocateRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_DeallocateRxFifo 000172D8 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172DE - 000172E3 (0x6 bytes), align: 0 + Segment part 210. Intra module refs: Segment part 130 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172E4 - 00017316 (0x33 bytes), align: 0 + Segment part 216. Intra module refs: PHY_SetRfFreq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetRfFreq 000172E4 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017317 - 0001738E (0x78 bytes), align: 0 + Segment part 218. Intra module refs: phyFindWlEntry::?relay + LOCAL ADDRESS + ===== ======= + phyFindWlEntry 00017317 + XSTACK = 0000000C ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001738F - 00017393 (0x5 bytes), align: 0 + Segment part 220. Intra module refs: phyFindWlEntry + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E07 - 00000E0C (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Init::?relay 00000E07 LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E0D - 00000E12 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Reset::?relay 00000E0D llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E13 - 00000E18 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_LoadNR::?relay 00000E13 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E19 - 00000E1E (0x6 bytes), align: 0 + Segment part 21. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_VerifyNR::?relay 00000E19 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E1F - 00000E24 (0x6 bytes), align: 0 + Segment part 24. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearAllRegsAndFifos::?relay + 00000E1F LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E25 - 00000E2A (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetOwnAddr::?relay + 00000E25 llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E2B - 00000E30 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetPeerAddr::?relay + 00000E2B llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E31 - 00000E36 (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetCRCInit::?relay + 00000E31 LL_Reset (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E37 - 00000E3C (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetAdvChans::?relay + 00000E37 llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E3D - 00000E42 (0x6 bytes), align: 0 + Segment part 47. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvChans::?relay + 00000E3D Segment part 52 (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E43 - 00000E48 (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetEndConnection::?relay + 00000E43 RF_NormalIsr (ll_isr) + llReleaseConnId (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E49 - 00000E4E (0x6 bytes), align: 0 + Segment part 51. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureMD::?relay + 00000E49 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E4F - 00000E54 (0x6 bytes), align: 0 + Segment part 59. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetEndCause::?relay + 00000E4F RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E55 - 00000E5A (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_InitSeqStat::?relay + 00000E55 llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E5B - 00000E60 (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetSyncWord::?relay + 00000E5B llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E61 - 00000E66 (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetMaxNack::?relay + 00000E61 Segment part 162 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupFeatureSetRsp (ll_common) + llSetupTermInd (ll_common) + llSetupVersionIndReq (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E67 - 00000E6C (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearWhitelist::?relay + 00000E67 LL_ClearWhiteList (ll) + LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E6D - 00000E72 (0x6 bytes), align: 0 + Segment part 88. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_AddWlEntry::?relay + 00000E6D LL_AddWhiteListDevice (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E73 - 00000E78 (0x6 bytes), align: 0 + Segment part 94. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvWlPolicy::?relay + 00000E73 LL_SetAdvParam (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E79 - 00000E7E (0x6 bytes), align: 0 + Segment part 100. Intra module refs: PHY_AddWlEntry + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetBlacklistIndex::?relay + 00000E79 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E7F - 00000E84 (0x6 bytes), align: 0 + Segment part 105. Intra module refs: PHY_AddWlEntry + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklistIndex::?relay + 00000E7F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E85 - 00000E8A (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklist::?relay + 00000E85 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E8B - 00000E90 (0x6 bytes), align: 0 + Segment part 120. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearSavedWhiteList::?relay + 00000E8B LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E91 - 00000E96 (0x6 bytes), align: 0 + Segment part 133. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureFifoDataProcessing::?relay + 00000E91 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E97 - 00000E9C (0x6 bytes), align: 0 + Segment part 135. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureAppendRfStatus::?relay + 00000E97 LL_Reset (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E9D - 00000EA2 (0x6 bytes), align: 0 + Segment part 137. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetFifoConfig::?relay + 00000E9D LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EA3 - 00000EA8 (0x6 bytes), align: 0 + Segment part 156. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigWhitener::?relay + 00000EA3 llRfInit (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EA9 - 00000EAE (0x6 bytes), align: 0 + Segment part 170. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryTxFifo::?relay + 00000EA9 llSave_txFIFO (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EAF - 00000EB4 (0x6 bytes), align: 0 + Segment part 172. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryRxFifo::?relay + 00000EAF llSave_rxFIFO (ll_scheduler) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EB5 - 00000EBA (0x6 bytes), align: 0 + Segment part 176. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_CommitRxFifo::?relay + 00000EB5 llSave_rxFIFO (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EBB - 00000EC0 (0x6 bytes), align: 0 + Segment part 180. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_DeallocateRxFifo::?relay + 00000EBB llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EC1 - 00000EC6 (0x6 bytes), align: 0 + Segment part 217. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetRfFreq::?relay 00000EC1 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EC7 - 00000ECC (0x6 bytes), align: 0 + Segment part 219. Intra module refs: PHY_AddWlEntry + LOCAL ADDRESS + ===== ======= + phyFindWlEntry::?relay + 00000EC7 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : phy_image + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008000 - 00008DFD (0xdfe bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + NanoRiscImage 00008000 Segment part 22 (phy) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008000 - 00008DFD (0xdfe bytes), align: 0 + Segment part 7. Intra module refs: NanoRiscImage + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_mgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007CC - 000007CD (0x2 bytes), align: 0 + Segment part 6. Intra module refs: Segment part 31 + Segment part 40 + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E8D - 00008E9C (0x10 bytes), align: 0 + Segment part 7. Intra module refs: generate_subkey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBBD - 0000DBC1 (0x5 bytes), align: 0 + Segment part 11. Intra module refs: sm_xor + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBC2 - 0000DC43 (0x82 bytes), align: 0 + Segment part 13. Intra module refs: SM_CalcRandomAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_CalcRandomAddr 0000DBC2 + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DC44 - 0000DCE4 (0xa1 bytes), align: 0 + Segment part 15. Intra module refs: SM_ResolveRandomAddrs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResolveRandomAddrs 0000DC44 + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DCE5 - 0000DCE7 (0x3 bytes), align: 0 + Segment part 19. Intra module refs: SM_CalcRandomAddr + SM_ResolveRandomAddrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DCE8 - 0000DCEC (0x5 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + smGenerateRandBuf + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DCED - 0000DE2A (0x13e bytes), align: 0 + Segment part 21. Intra module refs: SM_GenerateAuthenSig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_GenerateAuthenSig 0000DCED + calls direct + XSTACK = 00000000 ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DE2B - 0000DE34 (0xa bytes), align: 0 + Segment part 23. Intra module refs: SM_GenerateAuthenSig + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DE35 - 0000E031 (0x1fd bytes), align: 0 + Segment part 24. Intra module refs: SM_VerifyAuthenSig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_VerifyAuthenSig 0000DE35 + calls direct + XSTACK = 00000003 ( 0000003F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E032 - 0000E042 (0x11 bytes), align: 0 + Segment part 26. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E043 - 0000E10A (0xc8 bytes), align: 0 + Segment part 27. Intra module refs: smProcessRandComplete::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessRandComplete 0000E043 + calls direct + XSTACK = 00000000 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E10B - 0000E116 (0xc bytes), align: 0 + Segment part 29. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E117 - 0000E11C (0x6 bytes), align: 0 + Segment part 30. Intra module refs: SM_VerifyAuthenSig + smProcessRandComplete + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E11D - 0000E122 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E123 - 0000E128 (0x6 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E129 - 0000E15D (0x35 bytes), align: 0 + Segment part 33. Intra module refs: smStartRspTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartRspTimer 0000E129 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E15E - 0000E16D (0x10 bytes), align: 0 + Segment part 35. Intra module refs: smStopRspTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStopRspTimer 0000E15E + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E16E - 0000E174 (0x7 bytes), align: 0 + Segment part 37. Intra module refs: smAuthReqToUint8 + smStopRspTimer + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E175 - 0000E17F (0xb bytes), align: 0 + Segment part 40. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E180 - 0000E1D1 (0x52 bytes), align: 0 + Segment part 43. Intra module refs: sm_ah::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_ah 0000E180 + calls direct + XSTACK = 00000014 ( 00000040 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1D2 - 0000E1D7 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 64 + sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1D8 - 0000E1E1 (0xa bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1E2 - 0000E204 (0x23 bytes), align: 0 + Segment part 47. Intra module refs: sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E205 - 0000E20B (0x7 bytes), align: 0 + Segment part 48. Intra module refs: sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E20C - 0000E21E (0x13 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E21F - 0000E223 (0x5 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E224 - 0000E228 (0x5 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smStartRspTimer + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E229 - 0000E3DE (0x1b6 bytes), align: 0 + Segment part 54. Intra module refs: sm_c1new::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1new 0000E229 + calls direct + XSTACK = 0000000B ( 0000006A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E3DF - 0000E3E6 (0x8 bytes), align: 0 + Segment part 56. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + sm_CMAC + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E3E7 - 0000E3EA (0x4 bytes), align: 0 + Segment part 57. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + sm_ah + sm_c1new + sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E3EB - 0000E3F0 (0x6 bytes), align: 0 + Segment part 58. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + Segment part 49 + Segment part 57 + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E3F1 - 0000E3F8 (0x8 bytes), align: 0 + Segment part 59. Intra module refs: SM_VerifyAuthenSig + sm_c1new + sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E3F9 - 0000E421 (0x29 bytes), align: 0 + Segment part 60. Intra module refs: sm_xor::?relay + LOCAL ADDRESS + ===== ======= + sm_xor 0000E3F9 + XSTACK = 00000068 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E422 - 0000E492 (0x71 bytes), align: 0 + Segment part 62. Intra module refs: sm_s1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_s1 0000E422 + calls direct + XSTACK = 00000004 ( 00000040 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E493 - 0000E499 (0x7 bytes), align: 0 + Segment part 64. Intra module refs: sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E49A - 0000E4CB (0x32 bytes), align: 0 + Segment part 65. Intra module refs: smGenerateRandBuf::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandBuf 0000E49A + calls direct + XSTACK = 0000000F ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4CC - 0000E4D8 (0xd bytes), align: 0 + Segment part 67. Intra module refs: smAuthReqToUint8::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smAuthReqToUint8 0000E4CC + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4D9 - 0000E51E (0x46 bytes), align: 0 + Segment part 69. Intra module refs: smUint8ToAuthReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smUint8ToAuthReq 0000E4D9 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E51F - 0000E523 (0x5 bytes), align: 0 + Segment part 71. Intra module refs: smEncrypt + smUint8ToAuthReq + xor_128 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E524 - 0000E547 (0x24 bytes), align: 0 + Segment part 72. Intra module refs: smEncrypt::?relay + LOCAL ADDRESS + ===== ======= + smEncrypt 0000E524 + calls direct + XSTACK = 00000068 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E548 - 0000E784 (0x23d bytes), align: 0 + Segment part 74. Intra module refs: sm_CMAC::?relay + LOCAL ADDRESS + ===== ======= + sm_CMAC 0000E548 + calls direct + XSTACK = 0000003D ( 0000002D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E785 - 0000E788 (0x4 bytes), align: 0 + Segment part 76. Intra module refs: SM_ResolveRandomAddrs + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E789 - 0000E78E (0x6 bytes), align: 0 + Segment part 77. Intra module refs: SM_CalcRandomAddr + Segment part 76 + smProcessRandComplete + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E78F - 0000E798 (0xa bytes), align: 0 + Segment part 78. Intra module refs: SM_VerifyAuthenSig + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E799 - 0000E873 (0xdb bytes), align: 0 + Segment part 79. Intra module refs: generate_subkey::?relay + LOCAL ADDRESS + ===== ======= + generate_subkey 0000E799 + calls direct + XSTACK = 0000002D ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E874 - 0000E87B (0x8 bytes), align: 0 + Segment part 81. Intra module refs: sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E87C - 0000E881 (0x6 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + generate_subkey + smEncrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E882 - 0000E889 (0x8 bytes), align: 0 + Segment part 83. Intra module refs: generate_subkey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E88A - 0000E88F (0x6 bytes), align: 0 + Segment part 84. Intra module refs: Segment part 83 + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E890 - 0000E8A2 (0x13 bytes), align: 0 + Segment part 85. Intra module refs: generate_subkey + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8A3 - 0000E8F0 (0x4e bytes), align: 0 + Segment part 86. Intra module refs: xor_128::?relay + LOCAL ADDRESS + ===== ======= + xor_128 0000E8A3 + XSTACK = 0000002D ( 0000000A ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8F1 - 0000E8F9 (0x9 bytes), align: 0 + Segment part 88. Intra module refs: smGenerateRandBuf + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8FA - 0000E8FE (0x5 bytes), align: 0 + Segment part 89. Intra module refs: SM_VerifyAuthenSig + Segment part 88 + sm_CMAC + xor_128 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8FF - 0000E94B (0x4d bytes), align: 0 + Segment part 90. Intra module refs: leftshift_onebit::?relay + LOCAL ADDRESS + ===== ======= + leftshift_onebit 0000E8FF + XSTACK = 00000012 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ECD - 00000ED2 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_CalcRandomAddr::?relay + 00000ECD GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ED3 - 00000ED8 (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResolveRandomAddrs::?relay + 00000ED3 GAP_ResolvePrivateAddr (gap_devmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ED9 - 00000EDE (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_GenerateAuthenSig::?relay + 00000ED9 attSendMsg (att_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EDF - 00000EE4 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_VerifyAuthenSig::?relay + 00000EDF ATT_ParsePacket (att_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EE5 - 00000EEA (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessRandComplete::?relay + 00000EE5 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EEB - 00000EF0 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartRspTimer::?relay + 00000EEB smProcessDataMsg (sm_pairing) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EF1 - 00000EF6 (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStopRspTimer::?relay + 00000EF1 smFreePairingParams (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EF7 - 00000EFC (0x6 bytes), align: 0 + Segment part 44. Intra module refs: SM_CalcRandomAddr + SM_ResolveRandomAddrs + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_ah::?relay 00000EF7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EFD - 00000F02 (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1new::?relay 00000EFD sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F03 - 00000F08 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: sm_c1new + LOCAL ADDRESS + ===== ======= + sm_xor::?relay 00000F03 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F09 - 00000F0E (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_s1::?relay 00000F09 smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F0F - 00000F14 (0x6 bytes), align: 0 + Segment part 66. Intra module refs: SM_CalcRandomAddr + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandBuf::?relay + 00000F0F SM_PasskeyUpdate (sm_pairing) + Segment part 28 (gap_configmgr) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F15 - 00000F1A (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + smAuthReqToUint8::?relay + 00000F15 smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F1B - 00000F20 (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + smUint8ToAuthReq::?relay + 00000F1B GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + smProcessPairingReq (sm_pairing) + smSetPairingReqRsp (sm_pairing) + smpParsePairingReq (smp) + smpParseSecurityReq (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F21 - 00000F26 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 46 + sm_c1new + LOCAL ADDRESS + ===== ======= + smEncrypt::?relay 00000F21 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F27 - 00000F2C (0x6 bytes), align: 0 + Segment part 75. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + LOCAL ADDRESS + ===== ======= + sm_CMAC::?relay 00000F27 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F2D - 00000F32 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: sm_CMAC + LOCAL ADDRESS + ===== ======= + generate_subkey::?relay + 00000F2D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F33 - 00000F38 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 84 + LOCAL ADDRESS + ===== ======= + xor_128::?relay 00000F33 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F39 - 00000F3E (0x6 bytes), align: 0 + Segment part 91. Intra module refs: generate_subkey + LOCAL ADDRESS + ===== ======= + leftshift_onebit::?relay + 00000F39 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E8D - 00008E9C (0x10 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 7 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_pairing + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007CE - 000007CF (0x2 bytes), align: 0 + Segment part 6. Intra module refs: SM_PasskeyUpdate + SM_StartPairing + Segment part 13 + Segment part 17 + Segment part 21 + Segment part 22 + Segment part 49 + Segment part 59 + Segment part 61 + Segment part 69 + Segment part 76 + Segment part 77 + Segment part 78 + Segment part 86 + smDetermineKeySize + smEndPairing + smFreePairingParams + smGenerateConfirm + smProcessEncryptChange + smSavePairInfo + ENTRY ADDRESS REF BY + ===== ======= ====== + pPairingParams 000007CE Segment part 17 (sm_rsppairing) + Segment part 18 (sm_rsppairing) + Segment part 20 (sm_rsppairing) + Segment part 26 (sm_rsppairing) + Segment part 36 (sm_rsppairing) + Segment part 41 (sm_rsppairing) + Segment part 43 (sm_rsppairing) + Segment part 44 (sm_rsppairing) + Segment part 50 (sm_rsppairing) + Segment part 58 (sm_rsppairing) + Segment part 61 (sm_rsppairing) + Segment part 65 (sm_rsppairing) + Segment part 69 (sm_rsppairing) + Segment part 73 (sm_rsppairing) + Segment part 76 (sm_rsppairing) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D0 - 000007D1 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smProcessPairingReq + smRegisterResponder + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnResponderCBs 000007D0 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D2 - 000007D3 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smStartEncryption + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E4E - 00008E66 (0x19 bytes), align: 0 + Segment part 9. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD3F - 0000CE27 (0xe9 bytes), align: 0 + Segment part 10. Intra module refs: SM_StartPairing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_StartPairing 0000CD3F + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE28 - 0000CE2B (0x4 bytes), align: 0 + Segment part 12. Intra module refs: SM_StartPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE2C - 0000CE32 (0x7 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + Segment part 15 + Segment part 43 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE33 - 0000CE3C (0xa bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + Segment part 62 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE3D - 0000CE42 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: SM_StartPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE43 - 0000CE44 (0x2 bytes), align: 0 + Segment part 16. Intra module refs: smEndPairing + smLinkCheck + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE45 - 0000CE47 (0x3 bytes), align: 0 + Segment part 17. Intra module refs: SM_PasskeyUpdate + SM_StartPairing + Segment part 16 + smFreePairingParams + smGeneratePairingReqRsp + smNextPairingState + smProcessEncryptChange + smSetPairingReqRsp + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE48 - 0000CE4F (0x8 bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smProcessPairingReq + smSetPairingReqRsp + smStartEncryption + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE50 - 0000CF1A (0xcb bytes), align: 0 + Segment part 19. Intra module refs: SM_PasskeyUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_PasskeyUpdate 0000CE50 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF1B - 0000CF28 (0xe bytes), align: 0 + Segment part 21. Intra module refs: SM_PasskeyUpdate + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF29 - 0000CF2E (0x6 bytes), align: 0 + Segment part 22. Intra module refs: SM_PasskeyUpdate + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF2F - 0000CF33 (0x5 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + smLinkCheck + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF34 - 0000CF3D (0xa bytes), align: 0 + Segment part 26. Intra module refs: smRegisterResponder::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smRegisterResponder 0000CF34 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF3E - 0000CF5A (0x1d bytes), align: 0 + Segment part 28. Intra module refs: smLinkCheck::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smLinkCheck 0000CF3E + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF5B - 0000CF5F (0x5 bytes), align: 0 + Segment part 30. Intra module refs: smEndPairing + smLinkCheck + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF60 - 0000CF6B (0xc bytes), align: 0 + Segment part 31. Intra module refs: smTimedOut::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smTimedOut 0000CF60 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF6C - 0000D107 (0x19c bytes), align: 0 + Segment part 33. Intra module refs: smProcessDataMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessDataMsg 0000CF6C + calls direct + XSTACK = 00000000 ( 0000001F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D108 - 0000D10A (0x3 bytes), align: 0 + Segment part 35. Intra module refs: smPairingSendIdentityAddrInfo + smProcessDataMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D10B - 0000D10F (0x5 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D110 - 0000D13C (0x2d bytes), align: 0 + Segment part 37. Intra module refs: smSendFailAndEnd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendFailAndEnd 0000D110 + calls direct + XSTACK = 0000001F ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D13D - 0000D252 (0x116 bytes), align: 0 + Segment part 39. Intra module refs: smProcessEncryptChange::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessEncryptChange + 0000D13D + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D253 - 0000D281 (0x2f bytes), align: 0 + Segment part 41. Intra module refs: smNextPairingState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smNextPairingState 0000D253 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D282 - 0000D288 (0x7 bytes), align: 0 + Segment part 43. Intra module refs: smNextPairingState + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D289 - 0000D29B (0x13 bytes), align: 0 + Segment part 44. Intra module refs: smNextPairingState + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D29C - 0000D2A0 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: smRegisterResponder + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2A1 - 0000D2A7 (0x7 bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + smDetermineKeySize + smFreePairingParams + smNextPairingState + smTimedOut + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2A8 - 0000D3EB (0x144 bytes), align: 0 + Segment part 47. Intra module refs: sm_c1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1 0000D2A8 + calls direct + XSTACK = 0000000C ( 0000003A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D3EC - 0000D3EE (0x3 bytes), align: 0 + Segment part 49. Intra module refs: smProcessEncryptChange + smSavePairInfo + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D3EF - 0000D3F6 (0x8 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D3F7 - 0000D4C2 (0xcc bytes), align: 0 + Segment part 51. Intra module refs: smProcessPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessPairingReq 0000D3F7 + calls direct + XSTACK = 00000000 ( 00000013 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D4C3 - 0000D4CB (0x9 bytes), align: 0 + Segment part 53. Intra module refs: smProcessDataMsg + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D4CC - 0000D522 (0x57 bytes), align: 0 + Segment part 54. Intra module refs: smStartEncryption::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartEncryption 0000D4CC + XSTACK = 00000004 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D523 - 0000D527 (0x5 bytes), align: 0 + Segment part 56. Intra module refs: SM_StartPairing + smStartEncryption + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D528 - 0000D578 (0x51 bytes), align: 0 + Segment part 57. Intra module refs: smGeneratePairingReqRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGeneratePairingReqRsp + 0000D528 + calls direct + XSTACK = 00000012 ( 00000013 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D579 - 0000D57B (0x3 bytes), align: 0 + Segment part 59. Intra module refs: smEndPairing + smGeneratePairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D57C - 0000D580 (0x5 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + smNextPairingState + smProcessDataMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D581 - 0000D58C (0xc bytes), align: 0 + Segment part 61. Intra module refs: Segment part 88 + smGeneratePairingReqRsp + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D58D - 0000D592 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 56 + Segment part 61 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D593 - 0000D5C7 (0x35 bytes), align: 0 + Segment part 63. Intra module refs: smGenerateConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateConfirm 0000D593 + calls direct + XSTACK = 0000000A ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5C8 - 0000D5F4 (0x2d bytes), align: 0 + Segment part 65. Intra module refs: smGenerateRandMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandMsg 0000D5C8 + calls direct + XSTACK = 00000000 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5F5 - 0000D5F8 (0x4 bytes), align: 0 + Segment part 67. Intra module refs: smGenerateConfirm + smGenerateRandMsg + smPairingSendIdentityAddrInfo + smPairingSendMasterID + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5F9 - 0000D5FE (0x6 bytes), align: 0 + Segment part 68. Intra module refs: SM_PasskeyUpdate + Segment part 67 + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5FF - 0000D60A (0xc bytes), align: 0 + Segment part 69. Intra module refs: SM_PasskeyUpdate + smGenerateRandMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D60B - 0000D886 (0x27c bytes), align: 0 + Segment part 70. Intra module refs: smSavePairInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSavePairInfo 0000D60B + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D887 - 0000D892 (0xc bytes), align: 0 + Segment part 72. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D893 - 0000D898 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 72 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D899 - 0000D8A4 (0xc bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8A5 - 0000D8AA (0x6 bytes), align: 0 + Segment part 75. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8AB - 0000D8B4 (0xa bytes), align: 0 + Segment part 76. Intra module refs: SM_StartPairing + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8B5 - 0000D8BE (0xa bytes), align: 0 + Segment part 77. Intra module refs: smSavePairInfo + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8BF - 0000D8C4 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: smDetermineKeySize + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8C5 - 0000D8CB (0x7 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8CC - 0000D8D4 (0x9 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 23 + Segment part 79 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8D5 - 0000D8DF (0xb bytes), align: 0 + Segment part 81. Intra module refs: smPairingSendEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendEncInfo 0000D8D5 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8E0 - 0000D8EC (0xd bytes), align: 0 + Segment part 83. Intra module refs: smPairingSendEncInfo + smPairingSendIdentityInfo + smPairingSendSingingInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8ED - 0000D947 (0x5b bytes), align: 0 + Segment part 84. Intra module refs: smPairingSendMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendMasterID 0000D8ED + calls direct + XSTACK = 00000002 ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D948 - 0000D94A (0x3 bytes), align: 0 + Segment part 86. Intra module refs: smDetermineKeySize + smFreePairingParams + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D94B - 0000D950 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + smDetermineKeySize + smPairingSendMasterID + smProcessDataMsg + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D951 - 0000D96B (0x1b bytes), align: 0 + Segment part 88. Intra module refs: smGenerateConfirm + smGenerateRandMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D96C - 0000D96E (0x3 bytes), align: 0 + Segment part 89. Intra module refs: Segment part 83 + Segment part 88 + smGeneratePairingReqRsp + smPairingSendMasterID + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D96F - 0000D973 (0x5 bytes), align: 0 + Segment part 90. Intra module refs: SM_PasskeyUpdate + Segment part 89 + smSendFailAndEnd + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D974 - 0000D977 (0x4 bytes), align: 0 + Segment part 91. Intra module refs: smPairingSendIdentityAddrInfo + smPairingSendMasterID + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D978 - 0000D97D (0x6 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 83 + Segment part 88 + Segment part 91 + smGeneratePairingReqRsp + smSendFailAndEnd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D97E - 0000D98B (0xe bytes), align: 0 + Segment part 93. Intra module refs: smPairingSendIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityInfo + 0000D97E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D98C - 0000D9D8 (0x4d bytes), align: 0 + Segment part 95. Intra module refs: smPairingSendIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityAddrInfo + 0000D98C + calls direct + XSTACK = 00000000 ( 00000015 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D9D9 - 0000D9E6 (0xe bytes), align: 0 + Segment part 97. Intra module refs: smPairingSendSingingInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendSingingInfo + 0000D9D9 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D9E7 - 0000DA48 (0x62 bytes), align: 0 + Segment part 99. Intra module refs: smFreePairingParams::?relay + LOCAL ADDRESS + ===== ======= + smFreePairingParams 0000D9E7 + calls direct + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DA49 - 0000DA52 (0xa bytes), align: 0 + Segment part 101. Intra module refs: smFreePairingParams + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DA53 - 0000DAB1 (0x5f bytes), align: 0 + Segment part 102. Intra module refs: smEndPairing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smEndPairing 0000DA53 + calls direct + XSTACK = 0000000C ( 00000011 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAB2 - 0000DAB5 (0x4 bytes), align: 0 + Segment part 104. Intra module refs: SM_StartPairing + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAB6 - 0000DAB9 (0x4 bytes), align: 0 + Segment part 105. Intra module refs: Segment part 104 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DABA - 0000DAC4 (0xb bytes), align: 0 + Segment part 106. Intra module refs: Segment part 105 + Segment part 108 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAC5 - 0000DAC8 (0x4 bytes), align: 0 + Segment part 107. Intra module refs: SM_PasskeyUpdate + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAC9 - 0000DACD (0x5 bytes), align: 0 + Segment part 108. Intra module refs: Segment part 101 + Segment part 107 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DACE - 0000DB24 (0x57 bytes), align: 0 + Segment part 109. Intra module refs: smDetermineKeySize::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smDetermineKeySize 0000DACE + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DB25 - 0000DBA7 (0x83 bytes), align: 0 + Segment part 111. Intra module refs: smSetPairingReqRsp::?relay + LOCAL ADDRESS + ===== ======= + smSetPairingReqRsp 0000DB25 + calls direct + XSTACK = 0000002F ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBA8 - 0000DBAA (0x3 bytes), align: 0 + Segment part 113. Intra module refs: smProcessEncryptChange + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBAB - 0000DBB0 (0x6 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + smSavePairInfo + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBB1 - 0000DBB2 (0x2 bytes), align: 0 + Segment part 115. Intra module refs: SM_StartPairing + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBB3 - 0000DBB6 (0x4 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + smProcessPairingReq + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBB7 - 0000DBBC (0x6 bytes), align: 0 + Segment part 117. Intra module refs: Segment part 116 + Segment part 44 + Segment part 50 + Segment part 60 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F3F - 00000F44 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_StartPairing::?relay + 00000F3F GAP_Authenticate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F45 - 00000F4A (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_PasskeyUpdate::?relay + 00000F45 GAP_PasscodeUpdate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F4B - 00000F50 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + smRegisterResponder::?relay + 00000F4B SM_ResponderInit (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F51 - 00000F56 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + smLinkCheck::?relay 00000F51 SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F57 - 00000F5C (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + smTimedOut::?relay 00000F57 SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F5D - 00000F62 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessDataMsg::?relay + 00000F5D smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F63 - 00000F68 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 53 + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendFailAndEnd::?relay + 00000F63 GAP_TerminateAuth (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F69 - 00000F6E (0x6 bytes), align: 0 + Segment part 40. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessEncryptChange::?relay + 00000F69 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F6F - 00000F74 (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + smNextPairingState::?relay + 00000F6F SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F75 - 00000F7A (0x6 bytes), align: 0 + Segment part 48. Intra module refs: SM_PasskeyUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1::?relay 00000F75 Segment part 54 (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F7B - 00000F80 (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessPairingReq::?relay + 00000F7B GAP_Authenticate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F81 - 00000F86 (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartEncryption::?relay + 00000F81 GAP_Bond (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F87 - 00000F8C (0x6 bytes), align: 0 + Segment part 58. Intra module refs: SM_StartPairing + ENTRY ADDRESS REF BY + ===== ======= ====== + smGeneratePairingReqRsp::?relay + 00000F87 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F8D - 00000F92 (0x6 bytes), align: 0 + Segment part 64. Intra module refs: SM_PasskeyUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateConfirm::?relay + 00000F8D smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F93 - 00000F98 (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandMsg::?relay + 00000F93 smpResponderProcessPairingRandom (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F99 - 00000F9E (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + smSavePairInfo::?relay + 00000F99 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F9F - 00000FA4 (0x6 bytes), align: 0 + Segment part 82. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendEncInfo::?relay + 00000F9F smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FA5 - 00000FAA (0x6 bytes), align: 0 + Segment part 85. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendMasterID::?relay + 00000FA5 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FAB - 00000FB0 (0x6 bytes), align: 0 + Segment part 94. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityInfo::?relay + 00000FAB smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FB1 - 00000FB6 (0x6 bytes), align: 0 + Segment part 96. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityAddrInfo::?relay + 00000FB1 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FB7 - 00000FBC (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendSingingInfo::?relay + 00000FB7 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FBD - 00000FC2 (0x6 bytes), align: 0 + Segment part 100. Intra module refs: SM_StartPairing + smEndPairing + smLinkCheck + LOCAL ADDRESS + ===== ======= + smFreePairingParams::?relay + 00000FBD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FC3 - 00000FC8 (0x6 bytes), align: 0 + Segment part 103. Intra module refs: smNextPairingState + smProcessEncryptChange + smSendFailAndEnd + smTimedOut + ENTRY ADDRESS REF BY + ===== ======= ====== + smEndPairing::?relay 00000FC3 smResponderProcessLTKReq (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FC9 - 00000FCE (0x6 bytes), align: 0 + Segment part 110. + ENTRY ADDRESS REF BY + ===== ======= ====== + smDetermineKeySize::?relay + 00000FC9 Segment part 15 (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FCF - 00000FD4 (0x6 bytes), align: 0 + Segment part 112. Intra module refs: smGeneratePairingReqRsp + sm_c1 + LOCAL ADDRESS + ===== ======= + smSetPairingReqRsp::?relay + 00000FCF + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E4E - 00008E66 (0x19 bytes), align: 0 + Segment part 118. Intra module refs: Segment part 9 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_rsppairing + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000F26 - 00000F2B (0x6 bytes), align: 0 + Segment part 6. Intra module refs: SM_ResponderInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000117E8 - 00011809 (0x22 bytes), align: 0 + Segment part 10. Intra module refs: SM_ResponderInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResponderInit 000117E8 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001180A - 000119D1 (0x1c8 bytes), align: 0 + Segment part 12. Intra module refs: smResponderProcessLTKReq::?relay + LOCAL ADDRESS + ===== ======= + smResponderProcessLTKReq + 0001180A + calls direct, is indirectly called + XSTACK = 00000002 ( 00000032 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119D2 - 000119D6 (0x5 bytes), align: 0 + Segment part 14. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119D7 - 000119E2 (0xc bytes), align: 0 + Segment part 15. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119E3 - 000119F4 (0x12 bytes), align: 0 + Segment part 16. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119F5 - 00011A02 (0xe bytes), align: 0 + Segment part 17. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A03 - 00011A05 (0x3 bytes), align: 0 + Segment part 18. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A06 - 00011A0A (0x5 bytes), align: 0 + Segment part 19. Intra module refs: Segment part 18 + smResponderSendNextKeyInfo + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A0B - 00011A10 (0x6 bytes), align: 0 + Segment part 20. Intra module refs: smResponderProcessLTKReq + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A11 - 00011A1A (0xa bytes), align: 0 + Segment part 21. Intra module refs: Segment part 20 + smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A1B - 00011CBC (0x2a2 bytes), align: 0 + Segment part 22. Intra module refs: smpResponderProcessIncoming::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessIncoming + 00011A1B + calls direct, is indirectly called + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CBD - 00011CC0 (0x4 bytes), align: 0 + Segment part 24. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CC1 - 00011CC6 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + Segment part 60 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CC7 - 00011CCC (0x6 bytes), align: 0 + Segment part 26. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CCD - 00011CD3 (0x7 bytes), align: 0 + Segment part 27. Intra module refs: Segment part 26 + smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CD4 - 00011CD9 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CDA - 00011DA7 (0xce bytes), align: 0 + Segment part 29. Intra module refs: smpResponderProcessPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpResponderProcessPairingReq + 00011CDA + calls direct + XSTACK = 0000000E ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DA8 - 00011DAC (0x5 bytes), align: 0 + Segment part 31. Intra module refs: smpResponderProcessMasterID + smpResponderProcessPairingRandom + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DAD - 00011DAF (0x3 bytes), align: 0 + Segment part 32. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB0 - 00011DB0 (0x1 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 32 + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB1 - 00011DB6 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + smResponderProcessLTKReq + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB7 - 00011DBA (0x4 bytes), align: 0 + Segment part 35. Intra module refs: smResponderProcessLTKReq + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DBB - 00011DC7 (0xd bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + Segment part 54 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DC8 - 00011DCB (0x4 bytes), align: 0 + Segment part 37. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DCC - 00011DCF (0x4 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 37 + Segment part 61 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DD0 - 00011DDA (0xb bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + Segment part 42 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DDB - 00011DDE (0x4 bytes), align: 0 + Segment part 40. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DDF - 00011DE8 (0xa bytes), align: 0 + Segment part 41. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DE9 - 00011DED (0x5 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 17 + Segment part 21 + Segment part 28 + Segment part 40 + Segment part 41 + Segment part 43 + Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DEE - 00011DF9 (0xc bytes), align: 0 + Segment part 43. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DFA - 00011DFF (0x6 bytes), align: 0 + Segment part 44. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E00 - 00011E03 (0x4 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 44 + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E04 - 00011E90 (0x8d bytes), align: 0 + Segment part 46. Intra module refs: smpResponderProcessPairingRandom::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessPairingRandom + 00011E04 + calls direct + XSTACK = 0000000E ( 0000001C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E91 - 00011E9C (0xc bytes), align: 0 + Segment part 48. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingRandom + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E9D - 00011E9D (0x1 bytes), align: 0 + Segment part 49. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E9E - 00011EA0 (0x3 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessPairingRandom + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EA1 - 00011EA4 (0x4 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EA5 - 00011EAB (0x7 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 51 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EAC - 00011EB2 (0x7 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 19 + Segment part 25 + Segment part 52 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EB3 - 00011EC1 (0xf bytes), align: 0 + Segment part 54. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingRandom + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EC2 - 00011F7A (0xb9 bytes), align: 0 + Segment part 55. Intra module refs: smpResponderProcessMasterID::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessMasterID + 00011EC2 + calls direct + XSTACK = 0000000E ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F7B - 00011F85 (0xb bytes), align: 0 + Segment part 57. Intra module refs: smResponderProcessLTKReq + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F86 - 00011F94 (0xf bytes), align: 0 + Segment part 58. Intra module refs: smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F95 - 00011F97 (0x3 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 58 + Segment part 61 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F98 - 00011F9E (0x7 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 45 + Segment part 59 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F9F - 00011FAD (0xf bytes), align: 0 + Segment part 61. Intra module refs: smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011FAE - 00012296 (0x2e9 bytes), align: 0 + Segment part 62. Intra module refs: smResponderSendNextKeyInfo::?relay + LOCAL ADDRESS + ===== ======= + smResponderSendNextKeyInfo + 00011FAE + calls direct, is indirectly called + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012297 - 00012298 (0x2 bytes), align: 0 + Segment part 64. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012299 - 000122A6 (0xe bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122A7 - 000122AC (0x6 bytes), align: 0 + Segment part 66. Intra module refs: smResponderProcessLTKReq + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122AD - 000122B2 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 66 + smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122B3 - 000122BC (0xa bytes), align: 0 + Segment part 68. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122BD - 000122BF (0x3 bytes), align: 0 + Segment part 69. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122C0 - 000122C5 (0x6 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 69 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122C6 - 000122D0 (0xb bytes), align: 0 + Segment part 71. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122D1 - 000122DB (0xb bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122DC - 000122E1 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122E2 - 000122EB (0xa bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122EC - 000122F3 (0x8 bytes), align: 0 + Segment part 75. Intra module refs: smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122F4 - 000122FF (0xc bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + smResponderSendNextKeyInfo + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012300 - 00012305 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + smResponderProcessLTKReq + smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000233 - 00000238 (0x6 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F3E - 00008F41 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: smResponderSendNextKeyInfo + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1f4 00008F3E + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FD5 - 00000FDA (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResponderInit::?relay + 00000FD5 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FDB - 00000FE0 (0x6 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smResponderProcessLTKReq::?relay + 00000FDB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FE1 - 00000FE6 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smpResponderProcessIncoming::?relay + 00000FE1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FE7 - 00000FEC (0x6 bytes), align: 0 + Segment part 30. Intra module refs: smpResponderProcessIncoming + ENTRY ADDRESS REF BY + ===== ======= ====== + smpResponderProcessPairingReq::?relay + 00000FE7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FED - 00000FF2 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: smpResponderProcessIncoming + LOCAL ADDRESS + ===== ======= + smpResponderProcessPairingRandom::?relay + 00000FED + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FF3 - 00000FF8 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: smpResponderProcessIncoming + LOCAL ADDRESS + ===== ======= + smpResponderProcessMasterID::?relay + 00000FF3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FF9 - 00000FFE (0x6 bytes), align: 0 + Segment part 63. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smResponderSendNextKeyInfo::?relay + 00000FF9 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F3E - 00008F41 (0x4 bytes), align: 0 + Segment part 79. Intra module refs: __Constant_1f4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007D4 - 000007D4 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: SM_Init + SM_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + smTaskID 000007D4 smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + smStopRspTimer (sm_mgr) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A1EB - 0001A20F (0x25 bytes), align: 0 + Segment part 7. Intra module refs: SM_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_Init 0001A1EB + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A210 - 0001A285 (0x76 bytes), align: 0 + Segment part 9. Intra module refs: SM_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ProcessEvent 0001A210 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A286 - 0001A398 (0x113 bytes), align: 0 + Segment part 11. Intra module refs: smProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + smProcessOSALMsg 0001A286 + calls direct + XSTACK = 0000000C ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A399 - 0001A3A3 (0xb bytes), align: 0 + Segment part 13. Intra module refs: smProcessOSALMsg + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FFF - 00001004 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_Init::?relay 00000FFF osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001005 - 0000100A (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ProcessEvent::?relay + 00001005 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000100B - 00001010 (0x6 bytes), align: 0 + Segment part 12. Intra module refs: SM_ProcessEvent + LOCAL ADDRESS + ===== ======= + smProcessOSALMsg::?relay + 0000100B + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : smp + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015031 - 00015039 (0x9 bytes), align: 0 + Segment part 6. Intra module refs: smpBuildPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReq 00015031 + calls direct, is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001503A - 00015042 (0x9 bytes), align: 0 + Segment part 8. Intra module refs: smpBuildPairingRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRsp 0001503A + calls direct, is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015043 - 00015101 (0xbf bytes), align: 0 + Segment part 10. Intra module refs: smpBuildPairingReqRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReqRsp 00015043 + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015102 - 00015102 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015103 - 00015103 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015104 - 00015107 (0x4 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015108 - 0001510D (0x6 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 14 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001510E - 00015113 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015114 - 0001511A (0x7 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 16 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001511B - 000152B6 (0x19c bytes), align: 0 + Segment part 18. Intra module refs: smpParsePairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingReq 0001511B + calls direct + XSTACK = 00000000 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152B7 - 000152C1 (0xb bytes), align: 0 + Segment part 20. Intra module refs: smpBuildPairingReqRsp + smpParsePairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152C2 - 000152CB (0xa bytes), align: 0 + Segment part 21. Intra module refs: smpParsePairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152CC - 000152FB (0x30 bytes), align: 0 + Segment part 22. Intra module refs: smpBuildPairingConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingConfirm + 000152CC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152FC - 00015326 (0x2b bytes), align: 0 + Segment part 24. Intra module refs: smpParsePairingConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingConfirm + 000152FC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015327 - 00015356 (0x30 bytes), align: 0 + Segment part 26. Intra module refs: smpBuildPairingRandom::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRandom 00015327 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015357 - 00015381 (0x2b bytes), align: 0 + Segment part 28. Intra module refs: smpParsePairingRandom::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingRandom 00015357 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015382 - 000153AB (0x2a bytes), align: 0 + Segment part 30. Intra module refs: smpBuildPairingFailed::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingFailed 00015382 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153AC - 000153AE (0x3 bytes), align: 0 + Segment part 32. Intra module refs: smpBuildPairingReq + smpBuildPairingRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153AF - 000153B5 (0x7 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 32 + smpBuildPairingFailed + smpParsePairingFailed + smpParseSecurityReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153B6 - 000153E1 (0x2c bytes), align: 0 + Segment part 34. Intra module refs: smpParsePairingFailed::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingFailed 000153B6 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153E2 - 00015411 (0x30 bytes), align: 0 + Segment part 36. Intra module refs: smpBuildEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildEncInfo 000153E2 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015412 - 0001541D (0xc bytes), align: 0 + Segment part 38. Intra module refs: smpBuildEncInfo + smpBuildIdentityInfo + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001541E - 00015424 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + smpBuildPairingReqRsp + smpBuildSecurityReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015425 - 0001544F (0x2b bytes), align: 0 + Segment part 40. Intra module refs: smpParseEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseEncInfo 00015425 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015450 - 00015496 (0x47 bytes), align: 0 + Segment part 42. Intra module refs: smpBuildMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildMasterID 00015450 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015497 - 000154E6 (0x50 bytes), align: 0 + Segment part 44. Intra module refs: smpParseMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseMasterID 00015497 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000154E7 - 000154EB (0x5 bytes), align: 0 + Segment part 46. Intra module refs: smpBuildEncInfo + smpBuildIdentityAddrInfo + smpBuildIdentityInfo + smpBuildMasterID + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + smpParseEncInfo + smpParseIdentityAddrInfo + smpParseIdentityInfo + smpParseMasterID + smpParsePairingConfirm + smpParsePairingRandom + smpParseSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000154EC - 0001551A (0x2f bytes), align: 0 + Segment part 47. Intra module refs: smpBuildIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityInfo 000154EC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001551B - 00015523 (0x9 bytes), align: 0 + Segment part 49. Intra module refs: smpParseEncInfo + smpParseIdentityInfo + smpParsePairingConfirm + smpParsePairingRandom + smpParseSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015524 - 00015526 (0x3 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smpBuildEncInfo + smpBuildIdentityInfo + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015527 - 00015527 (0x1 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smpParseMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015528 - 0001552D (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 51 + smpBuildIdentityAddrInfo + smpBuildMasterID + smpParseIdentityAddrInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001552E - 0001556E (0x41 bytes), align: 0 + Segment part 53. Intra module refs: smpBuildIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityAddrInfo + 0001552E + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001556F - 0001557C (0xe bytes), align: 0 + Segment part 55. Intra module refs: smpBuildIdentityAddrInfo + smpBuildMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001557D - 00015587 (0xb bytes), align: 0 + Segment part 56. Intra module refs: Segment part 55 + smpBuildMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015588 - 000155B2 (0x2b bytes), align: 0 + Segment part 57. Intra module refs: smpParseIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityInfo 00015588 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000155B3 - 00015601 (0x4f bytes), align: 0 + Segment part 59. Intra module refs: smpParseIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityAddrInfo + 000155B3 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015602 - 00015631 (0x30 bytes), align: 0 + Segment part 61. Intra module refs: smpBuildSigningInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSigningInfo 00015602 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015632 - 0001565C (0x2b bytes), align: 0 + Segment part 63. Intra module refs: smpParseSigningInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSigningInfo 00015632 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001565D - 0001568A (0x2e bytes), align: 0 + Segment part 65. Intra module refs: smpBuildSecurityReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSecurityReq 0001565D + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001568B - 000156AD (0x23 bytes), align: 0 + Segment part 67. Intra module refs: smpParseSecurityReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSecurityReq 0001568B + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000156AE - 0001574D (0xa0 bytes), align: 0 + Segment part 69. Intra module refs: smSendSMMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendSMMsg 000156AE + calls direct + XSTACK = 00000002 ( 00000013 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001011 - 00001016 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReq::?relay + 00001011 smGeneratePairingReqRsp (sm_pairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001017 - 0000101C (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRsp::?relay + 00001017 smGeneratePairingReqRsp (sm_pairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000101D - 00001022 (0x6 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 32 + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReqRsp::?relay + 0000101D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001023 - 00001028 (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingReq::?relay + 00001023 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001029 - 0000102E (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingConfirm::?relay + 00001029 smGenerateConfirm (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000102F - 00001034 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingConfirm::?relay + 0000102F smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001035 - 0000103A (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRandom::?relay + 00001035 smGenerateRandMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000103B - 00001040 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingRandom::?relay + 0000103B smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001041 - 00001046 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingFailed::?relay + 00001041 smSendFailAndEnd (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001047 - 0000104C (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingFailed::?relay + 00001047 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000104D - 00001052 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildEncInfo::?relay + 0000104D smPairingSendEncInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001053 - 00001058 (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseEncInfo::?relay + 00001053 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001059 - 0000105E (0x6 bytes), align: 0 + Segment part 43. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildMasterID::?relay + 00001059 smPairingSendMasterID (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000105F - 00001064 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseMasterID::?relay + 0000105F smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001065 - 0000106A (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityInfo::?relay + 00001065 smPairingSendIdentityInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000106B - 00001070 (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityAddrInfo::?relay + 0000106B smPairingSendIdentityAddrInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001071 - 00001076 (0x6 bytes), align: 0 + Segment part 58. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityInfo::?relay + 00001071 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001077 - 0000107C (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityAddrInfo::?relay + 00001077 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000107D - 00001082 (0x6 bytes), align: 0 + Segment part 62. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSigningInfo::?relay + 0000107D smPairingSendSingingInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001083 - 00001088 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSigningInfo::?relay + 00001083 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001089 - 0000108E (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSecurityReq::?relay + 00001089 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000108F - 00001094 (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSecurityReq::?relay + 0000108F smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001095 - 0000109A (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendSMMsg::?relay 00001095 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + Segment part 92 (sm_pairing) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + LIBRARY MODULE, NAME : hci_tl + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007D5 - 000007D5 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: HCI_Init + HCI_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + hciTaskID 000007D5 LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_DisconnectCback (hci_event) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + Segment part 142 (hci_event) + Segment part 30 (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D6 - 000007D6 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciTestTaskID 000007D6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D7 - 000007D7 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: HCI_GAPTaskRegister + HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciGapTaskID 000007D7 HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_DisconnectCback (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D8 - 000007D8 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: HCI_Init + HCI_L2CAPTaskRegister + ENTRY ADDRESS REF BY + ===== ======= ====== + hciL2capTaskID 000007D8 HCI_NumOfCompletedPacketsEvent (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007D9 - 000007D9 (0x1 bytes), align: 0 + Segment part 10. Intra module refs: HCI_Init + HCI_SMPTaskRegister + ENTRY ADDRESS REF BY + ===== ======= ====== + hciSmpTaskID 000007D9 HCI_CommandCompleteEvent (hci_event) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReqCback (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007DA - 000007DA (0x1 bytes), align: 0 + Segment part 11. Intra module refs: HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciExtTaskID 000007DA + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF94 - 0001AFBF (0x2c bytes), align: 0 + Segment part 13. Intra module refs: HCI_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_Init 0001AF94 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AFC0 - 0001AFEC (0x2d bytes), align: 0 + Segment part 15. Intra module refs: HCI_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ProcessEvent 0001AFC0 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AFED - 0001AFF6 (0xa bytes), align: 0 + Segment part 19. Intra module refs: HCI_GAPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_GAPTaskRegister 0001AFED + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AFF7 - 0001AFFE (0x8 bytes), align: 0 + Segment part 21. Intra module refs: HCI_L2CAPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_L2CAPTaskRegister 0001AFF7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AFFF - 0001B006 (0x8 bytes), align: 0 + Segment part 23. Intra module refs: HCI_GAPTaskRegister + HCI_L2CAPTaskRegister + HCI_SMPTaskRegister + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B007 - 0001B010 (0xa bytes), align: 0 + Segment part 24. Intra module refs: HCI_SMPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SMPTaskRegister 0001B007 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000109B - 000010A0 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_Init::?relay 0000109B osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010A1 - 000010A6 (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ProcessEvent::?relay + 000010A1 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010A7 - 000010AC (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_GAPTaskRegister::?relay + 000010A7 GAP_Init (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010AD - 000010B2 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_L2CAPTaskRegister::?relay + 000010AD L2CAP_Init (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010B3 - 000010B8 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SMPTaskRegister::?relay + 000010B3 SM_Init (sm_task) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL.r51 + PROGRAM MODULE, NAME : OSAL + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007DB - 000007DC (0x2 bytes), align: 0 + Segment part 11. Intra module refs: osal_init_system + osal_msg_enqueue_push + osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_qHead 000007DB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F2C - 00000F2C (0x1 bytes), align: 0 + Segment part 12. Intra module refs: osal_run_system + LOCAL ADDRESS + ===== ======= + activeTaskID 00000F2C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001642A - 00016433 (0xa bytes), align: 0 + Segment part 16. Intra module refs: osal_strlen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_strlen 0001642A + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016434 - 00016474 (0x41 bytes), align: 0 + Segment part 18. Intra module refs: osal_memcpy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcpy 00016434 + XSTACK = 00000010 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016475 - 000164BD (0x49 bytes), align: 0 + Segment part 20. Intra module refs: osal_revmemcpy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_revmemcpy 00016475 + XSTACK = 00000002 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000164BE - 000164EE (0x31 bytes), align: 0 + Segment part 22. Intra module refs: osal_memdup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memdup 000164BE + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000164EF - 000164F7 (0x9 bytes), align: 0 + Segment part 24. Intra module refs: osal_memdup + osal_msg_receive + LOCAL ADDRESS + ===== ======= + ?Subroutine2 000164EF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000164F8 - 00016548 (0x51 bytes), align: 0 + Segment part 25. Intra module refs: osal_memcmp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcmp 000164F8 + XSTACK = 00000002 ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016549 - 0001654D (0x5 bytes), align: 0 + Segment part 27. Intra module refs: osal_memcmp + osal_msg_extract + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00016549 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001654E - 0001656E (0x21 bytes), align: 0 + Segment part 28. Intra module refs: osal_memset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memset 0001654E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001656F - 00016577 (0x9 bytes), align: 0 + Segment part 45. Intra module refs: osal_rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_rand 0001656F + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016578 - 000165C4 (0x4d bytes), align: 0 + Segment part 47. Intra module refs: osal_msg_allocate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_allocate 00016578 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000165C5 - 000165CB (0x7 bytes), align: 0 + Segment part 49. Intra module refs: osal_memcpy + osal_msg_allocate + LOCAL ADDRESS + ===== ======= + ?Subroutine23 000165C5 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000165CC - 000165ED (0x22 bytes), align: 0 + Segment part 50. Intra module refs: osal_msg_deallocate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_deallocate 000165CC + calls direct + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000165EE - 000165F4 (0x7 bytes), align: 0 + Segment part 52. Intra module refs: osal_init_system + osal_msg_deallocate + osal_rand + osal_strlen + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000165EE + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000165F5 - 000165FE (0xa bytes), align: 0 + Segment part 53. Intra module refs: osal_msg_send::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_send 000165F5 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000165FF - 0001665F (0x61 bytes), align: 0 + Segment part 57. Intra module refs: osal_msg_enqueue_push::?relay + LOCAL ADDRESS + ===== ======= + osal_msg_enqueue_push 000165FF + calls direct + XSTACK = 00000009 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016660 - 0001666C (0xd bytes), align: 0 + Segment part 59. Intra module refs: osal_msg_deallocate + osal_msg_enqueue_push + LOCAL ADDRESS + ===== ======= + ?Subroutine21 00016660 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001666D - 000166F4 (0x88 bytes), align: 0 + Segment part 60. Intra module refs: osal_msg_receive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_receive 0001666D + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000166F5 - 000166FC (0x8 bytes), align: 0 + Segment part 62. Intra module refs: osal_memcmp + osal_msg_extract + osal_msg_receive + LOCAL ADDRESS + ===== ======= + ?Subroutine13 000166F5 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000166FD - 00016734 (0x38 bytes), align: 0 + Segment part 65. Intra module refs: osal_msg_enqueue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_enqueue 000166FD + XSTACK = 00000009 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016735 - 00016738 (0x4 bytes), align: 0 + Segment part 67. Intra module refs: osal_msg_enqueue + osal_msg_push + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00016735 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016739 - 00016744 (0xc bytes), align: 0 + Segment part 68. Intra module refs: osal_msg_enqueue + LOCAL ADDRESS + ===== ======= + ?Subroutine16 00016739 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016745 - 0001674A (0x6 bytes), align: 0 + Segment part 69. Intra module refs: ?Subroutine16 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001674B - 0001674D (0x3 bytes), align: 0 + Segment part 70. Intra module refs: osal_msg_send + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001674B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001674E - 00016752 (0x5 bytes), align: 0 + Segment part 71. Intra module refs: ?Subroutine1 + ?Subroutine6 + osal_clear_event + osal_memcpy + osal_msg_enqueue_push + osal_revmemcpy + osal_set_event + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016753 - 00016757 (0x5 bytes), align: 0 + Segment part 74. Intra module refs: osal_isbufset + osal_memset + osal_msg_allocate + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00016753 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016758 - 00016785 (0x2e bytes), align: 0 + Segment part 75. Intra module refs: osal_msg_push::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_push 00016758 + XSTACK = 00000009 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016786 - 000167F2 (0x6d bytes), align: 0 + Segment part 77. Intra module refs: osal_msg_extract::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_extract 00016786 + XSTACK = 00000010 ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167F3 - 000167F5 (0x3 bytes), align: 0 + Segment part 79. Intra module refs: osal_msg_enqueue_push + LOCAL ADDRESS + ===== ======= + ?Subroutine22 000167F3 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167F6 - 000167F8 (0x3 bytes), align: 0 + Segment part 80. Intra module refs: ?Subroutine22 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167F9 - 000167FD (0x5 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 80 + osal_msg_enqueue + osal_msg_extract + osal_msg_push + osal_msg_receive + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167FE - 00016801 (0x4 bytes), align: 0 + Segment part 82. Intra module refs: osal_msg_extract + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine17 000167FE + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016802 - 00016807 (0x6 bytes), align: 0 + Segment part 83. Intra module refs: ?Subroutine17 + Segment part 69 + LOCAL ADDRESS + ===== ======= + ?Subroutine27 00016802 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016808 - 0001680D (0x6 bytes), align: 0 + Segment part 84. Intra module refs: osal_msg_enqueue + osal_msg_extract + osal_msg_push + LOCAL ADDRESS + ===== ======= + ?Subroutine14 00016808 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001680E - 0001684C (0x3f bytes), align: 0 + Segment part 87. Intra module refs: osal_set_event::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_set_event 0001680E + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001684D - 00016881 (0x35 bytes), align: 0 + Segment part 89. Intra module refs: osal_clear_event::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_clear_event 0001684D + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016882 - 00016893 (0x12 bytes), align: 0 + Segment part 95. Intra module refs: osal_int_disable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_int_disable 00016882 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016894 - 000168B2 (0x1f bytes), align: 0 + Segment part 97. Intra module refs: osal_init_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_init_system 00016894 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168B3 - 000168BB (0x9 bytes), align: 0 + Segment part 99. Intra module refs: osal_start_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_system 000168B3 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168BC - 00016954 (0x99 bytes), align: 0 + Segment part 101. Intra module refs: osal_run_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_run_system 000168BC + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016955 - 0001695D (0x9 bytes), align: 0 + Segment part 103. Intra module refs: osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine20 00016955 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001695E - 00016971 (0x14 bytes), align: 0 + Segment part 104. Intra module refs: osal_clear_event + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine18 0001695E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016972 - 00016975 (0x4 bytes), align: 0 + Segment part 105. Intra module refs: osal_msg_enqueue + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00016972 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016976 - 0001697D (0x8 bytes), align: 0 + Segment part 106. Intra module refs: ?Subroutine8 + osal_msg_enqueue_push + osal_run_system + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001697E - 000169AB (0x2e bytes), align: 0 + Segment part 114. Intra module refs: osal_isbufset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_isbufset 0001697E + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000239 - 00000239 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: activeTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010B9 - 000010BE (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_strlen::?relay 000010B9 GATTServApp_ReadAttr (gattservapp) + Segment part 63 (gapgattserver) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010BF - 000010C4 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: osal_memdup + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcpy::?relay 000010BF ?Subroutine1 (gpsservice) + ?Subroutine2 (peripheral) + ?Subroutine4 (timeservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + DevInfo_SetParameter (devinfoservice) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_ReadAttr (gattservapp) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + Segment part 145 (att_util) + Segment part 22 (gap_linkmgr) + Segment part 29 (sm_mgr) + Segment part 34 (sm_rsppairing) + Segment part 37 (wimu) + Segment part 47 (hci_event) + Segment part 48 (sm_rsppairing) + Segment part 52 (smp) + Segment part 58 (gapgattserver) + Segment part 58 (gatt_server) + Segment part 68 (gattservapp) + Segment part 68 (sm_pairing) + Segment part 73 (gap_peridevmgr) + Segment part 75 (gap_configmgr) + Segment part 75 (gap_linkmgr) + Segment part 77 (sm_mgr) + Segment part 85 (gapbondmgr) + battReadAttrCB (battservice) + devInfo_ReadAttrCB (devinfoservice) + gattNotifyEvent (gatt_task) + gattServApp_ProcessPrepareWriteReq (gattservapp) + linkDB_Add (linkdb) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010C5 - 000010CA (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_revmemcpy::?relay + 000010C5 Segment part 58 (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010CB - 000010D0 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memdup::?relay 000010CB GAP_Bond (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010D1 - 000010D6 (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcmp::?relay 000010D1 ATT_CompareUUID (att_util) + GAPBondMgr_ResolveAddr (gapbondmgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 16 (sm_rsppairing) + gapBondMgrFindAddr (gapbondmgr) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + smpResponderProcessPairingRandom (sm_rsppairing) + verifyWordM (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010D7 - 000010DC (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memset::?relay 000010D7 ?Subroutine25 (gapbondmgr) + ?Subroutine6 (wimu) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_ParamsInit (gap_configmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_ReadAttr (gattservapp) + GGS_SetParameter (gapgattserver) + LL_ConnectionCompleteCback (hci_event) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 47 (sm_mgr) + Segment part 88 (gap_linkmgr) + WIMU_openUART (wimu) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gattNotifyEvent (gatt_task) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + generate_subkey (sm_mgr) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + linkDB_Remove (linkdb) + osalInitTasks (OSAL_WIMU) + sendEstLinkEvent (gap_linkmgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSetPairingReqRsp (sm_pairing) + sm_CMAC (sm_mgr) + sm_c1new (sm_mgr) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010DD - 000010E2 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_rand::?relay 000010DD smGenerateRandBuf (sm_mgr) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010E3 - 000010E8 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_allocate::?relay + 000010E3 GATTServApp_SendCCCUpdatedEvent (gattservapp) + HCI_CommandCompleteEvent (hci_event) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_SendCommandCompleteEvent (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + OnBoard_SendKeys (OnBoard) + Segment part 135 (hci_event) + Segment part 145 (hci_event) + Segment part 60 (gap_linkmgr) + Segment part 69 (gap_configmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + l2capEncapSendData (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + sendAuthEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010E9 - 000010EE (0x6 bytes), align: 0 + Segment part 51. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_deallocate::?relay + 000010E9 GAPBondMgr_ProcessEvent (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GATTServApp_ProcessEvent (gattservapp) + GATT_ProcessEvent (gatt_task) + HCI_ProcessEvent (hci_tl) + Hal_ProcessEvent (hal_drivers) + L2CAP_ProcessEvent (l2cap_task) + SM_ProcessEvent (sm_task) + WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010EF - 000010F4 (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_send::?relay 000010EF GAP_ProcessEvent (gap_task) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + HCI_CommandCompleteEvent (hci_event) + LL_RxDataCompleteCback (hci_data) + OnBoard_SendKeys (OnBoard) + SM_ProcessEvent (sm_task) + Segment part 143 (hci_event) + Segment part 30 (hci_event) + Segment part 87 (gap_peridevmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + l2capEncapSendData (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010F5 - 000010FA (0x6 bytes), align: 0 + Segment part 58. Intra module refs: ?Subroutine1 + LOCAL ADDRESS + ===== ======= + osal_msg_enqueue_push::?relay + 000010F5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010FB - 00001100 (0x6 bytes), align: 0 + Segment part 61. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_receive::?relay + 000010FB GAPBondMgr_ProcessEvent (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GATTServApp_ProcessEvent (gattservapp) + GATT_ProcessEvent (gatt_task) + HCI_ProcessEvent (hci_tl) + Hal_ProcessEvent (hal_drivers) + L2CAP_ProcessEvent (l2cap_task) + SM_ProcessEvent (sm_task) + WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001101 - 00001106 (0x6 bytes), align: 0 + Segment part 66. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_enqueue::?relay + 00001101 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001107 - 0000110C (0x6 bytes), align: 0 + Segment part 76. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_push::?relay 00001107 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000110D - 00001112 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_extract::?relay + 0000110D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001113 - 00001118 (0x6 bytes), align: 0 + Segment part 88. Intra module refs: osal_msg_enqueue_push + osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_set_event::?relay + 00001113 ?Subroutine17 (peripheral) + Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + LL_Init (ll) + RF_NormalIsr (ll_isr) + Segment part 72 (ll_advEndCauses) + WIMU_Init (wimu) + gapIncSignCounter (gap_configmgr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osalTimerUpdate (OSAL_Timers) + timeWriteAttrCB (timeservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001119 - 0000111E (0x6 bytes), align: 0 + Segment part 90. Intra module refs: osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_clear_event::?relay + 00001119 LL_SetAdvControl (ll) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000111F - 00001124 (0x6 bytes), align: 0 + Segment part 96. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_int_disable::?relay + 0000111F InitBoard (OnBoard) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001125 - 0000112A (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_init_system::?relay + 00001125 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000112B - 00001130 (0x6 bytes), align: 0 + Segment part 100. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_system::?relay + 0000112B main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001131 - 00001136 (0x6 bytes), align: 0 + Segment part 102. Intra module refs: osal_start_system + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_run_system::?relay + 00001131 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001137 - 0000113C (0x6 bytes), align: 0 + Segment part 115. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_isbufset::?relay 00001137 GAP_SecParamsInit (gap_configmgr) + Segment part 72 (gapbondmgr) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_ClockBLE.r51 + PROGRAM MODULE, NAME : OSAL_ClockBLE + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007DD - 000007DE (0x2 bytes), align: 0 + Segment part 6. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + previousLLTimerTick 000007DD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007DF - 000007E0 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + remUsTicks 000007DF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007E1 - 000007E2 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine4 + osalTimeUpdate + LOCAL ADDRESS + ===== ======= + timeMSec 000007E1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007E3 - 000007E6 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: osalTimeUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + OSAL_timeSeconds 000007E3 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ABC0 - 0001ACA9 (0xea bytes), align: 0 + Segment part 13. Intra module refs: osalTimeUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimeUpdate 0001ABC0 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACAA - 0001ACB6 (0xd bytes), align: 0 + Segment part 15. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine4 0001ACAA + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000113D - 00001142 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimeUpdate::?relay + 0000113D llScheduleTask (ll_scheduler) + osal_run_system (OSAL) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Memory.r51 + PROGRAM MODULE, NAME : OSAL_Memory + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_N) + Relative segment, address: XDATA 000011E2 - 00001DE1 (0xc00 bytes), align: 0 + Segment part 7. Intra module refs: osal_mem_alloc + osal_mem_init + LOCAL ADDRESS + ===== ======= + theHeap 000011E2 + ------------------------------------------------------------------------- + 1 (was XDATA_N) + Relative segment, address: XDATA 00001DE2 - 00001DE3 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: osal_mem_alloc + osal_mem_free + osal_mem_init + osal_mem_kick + LOCAL ADDRESS + ===== ======= + ff1 00001DE2 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007E7 - 000007E7 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: osal_mem_alloc + osal_mem_kick + LOCAL ADDRESS + ===== ======= + osalMemStat 000007E7 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019FFA - 0001A028 (0x2f bytes), align: 0 + Segment part 10. Intra module refs: osal_mem_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_init 00019FFA + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A029 - 0001A02F (0x7 bytes), align: 0 + Segment part 12. Intra module refs: osal_mem_free + osal_mem_init + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A029 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A030 - 0001A063 (0x34 bytes), align: 0 + Segment part 13. Intra module refs: osal_mem_kick::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_kick 0001A030 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A064 - 0001A1B0 (0x14d bytes), align: 0 + Segment part 15. Intra module refs: osal_mem_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_alloc 0001A064 + XSTACK = 0000000A ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A1B1 - 0001A1EA (0x3a bytes), align: 0 + Segment part 17. Intra module refs: osal_mem_free::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_free 0001A1B1 + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001143 - 00001148 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_init::?relay 00001143 osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001149 - 0000114E (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_kick::?relay 00001149 osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000114F - 00001154 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: osal_mem_kick + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_alloc::?relay + 0000114F GAP_Authenticate (gap_linkmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GATTServApp_RegisterService (gattservapp) + GATT_RegisterService (gatt_server) + LL_RxReqDataBufCback (hci_data) + SM_StartPairing (sm_pairing) + Segment part 102 (gap_linkmgr) + Segment part 26 (sm_mgr) + Segment part 65 (sm_rsppairing) + Segment part 75 (gap_peridevmgr) + Segment part 76 (gap_peridevmgr) + Segment part 85 (sm_mgr) + gattServApp_SetNumPrepareWrites (gattservapp) + osalAddTimer (OSAL_Timers) + osalInitTasks (OSAL_WIMU) + osal_bm_alloc (osal_bufmgr) + osal_memdup (OSAL) + osal_msg_allocate (OSAL) + smSavePairInfo (sm_pairing) + sm_CMAC (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001155 - 0000115A (0x6 bytes), align: 0 + Segment part 18. Intra module refs: osal_mem_kick + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_free::?relay 00001155 GAP_Bond (gap_linkmgr) + LL_RxDataCompleteCback (hci_data) + SM_GenerateAuthenSig (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 81 (gap_linkmgr) + Segment part 91 (gap_peridevmgr) + gapFreeAuthLink (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + gattServApp_SetNumPrepareWrites (gattservapp) + generate_subkey (sm_mgr) + linkDB_Remove (linkdb) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osalTimerUpdate (OSAL_Timers) + osal_bm_free (osal_bufmgr) + osal_msg_deallocate (OSAL) + smFreePairingParams (sm_pairing) + smProcessRandComplete (sm_mgr) + sm_CMAC (sm_mgr) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_PwrMgr.r51 + PROGRAM MODULE, NAME : OSAL_PwrMgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007E8 - 000007EE (0x7 bytes), align: 0 + Segment part 6. Intra module refs: osal_pwrmgr_device + osal_pwrmgr_init + osal_pwrmgr_task_state + ENTRY ADDRESS REF BY + ===== ======= ====== + pwrmgr_attribute 000007E8 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B011 - 0001B01E (0xe bytes), align: 0 + Segment part 7. Intra module refs: osal_pwrmgr_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_init 0001B011 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B01F - 0001B026 (0x8 bytes), align: 0 + Segment part 9. Intra module refs: osal_pwrmgr_device + osal_pwrmgr_init + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001B01F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B027 - 0001B030 (0xa bytes), align: 0 + Segment part 10. Intra module refs: osal_pwrmgr_device::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_device 0001B027 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B031 - 0001B07A (0x4a bytes), align: 0 + Segment part 12. Intra module refs: osal_pwrmgr_task_state::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_task_state + 0001B031 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000115B - 00001160 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_init::?relay + 0000115B osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001161 - 00001166 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_device::?relay + 00001161 LL_ProcessEvent (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001167 - 0000116C (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_task_state::?relay + 00001167 LL_Init (ll) + LL_ProcessEvent (ll) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Timers.r51 + PROGRAM MODULE, NAME : OSAL_Timers + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007EF - 000007F0 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: osalAddTimer + osalFindTimer + osalTimerUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + timerHead 000007EF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F1 - 000007F4 (0x4 bytes), align: 0 + Segment part 8. Intra module refs: osalTimerInit + osalTimerUpdate + LOCAL ADDRESS + ===== ======= + osal_systemClock 000007F1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000188CC - 000188DE (0x13 bytes), align: 0 + Segment part 10. Intra module refs: osalTimerInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerInit 000188CC + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000188DF - 000189A2 (0xc4 bytes), align: 0 + Segment part 12. Intra module refs: osalAddTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalAddTimer 000188DF + calls direct + XSTACK = 00000012 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000189A3 - 000189E1 (0x3f bytes), align: 0 + Segment part 14. Intra module refs: osalFindTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalFindTimer 000189A3 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000189E2 - 000189F7 (0x16 bytes), align: 0 + Segment part 16. Intra module refs: osalDeleteTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalDeleteTimer 000189E2 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000189F8 - 000189FE (0x7 bytes), align: 0 + Segment part 18. Intra module refs: osalDeleteTimer + osalFindTimer + osalTimerInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000189F8 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000189FF - 00018A32 (0x34 bytes), align: 0 + Segment part 19. Intra module refs: osal_start_timerEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_timerEx 000189FF + calls direct + XSTACK = 00000004 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018A33 - 00018A37 (0x5 bytes), align: 0 + Segment part 21. Intra module refs: osal_start_timerEx + osal_stop_timerEx + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00018A33 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018A38 - 00018A7F (0x48 bytes), align: 0 + Segment part 22. Intra module refs: osal_start_reload_timer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_reload_timer + 00018A38 + calls direct + XSTACK = 00000004 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018A80 - 00018A84 (0x5 bytes), align: 0 + Segment part 24. Intra module refs: osal_get_timeoutEx + osal_start_reload_timer + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00018A80 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018A85 - 00018AB6 (0x32 bytes), align: 0 + Segment part 25. Intra module refs: osal_stop_timerEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_stop_timerEx 00018A85 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018AB7 - 00018AED (0x37 bytes), align: 0 + Segment part 27. Intra module refs: osal_get_timeoutEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_get_timeoutEx 00018AB7 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018AEE - 00018CF2 (0x205 bytes), align: 0 + Segment part 31. Intra module refs: osalTimerUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerUpdate 00018AEE + calls direct + XSTACK = 00000000 ( 0000001D ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018CF3 - 00018CF8 (0x6 bytes), align: 0 + Segment part 33. Intra module refs: osalTimerUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00018CF3 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018CF9 - 00018D00 (0x8 bytes), align: 0 + Segment part 34. Intra module refs: ?Subroutine3 + osalAddTimer + osalTimerUpdate + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F42 - 00008F45 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: GAPRole_Init (peripheral) + _formatted_write (?largewr) + float_conversion (?largewr) + llAllocConnId (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + osalAddTimer + osalTimerInit + osalTimerUpdate + osal_get_timeoutEx + setXferPage (osal_snv) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_0 00008F42 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000116D - 00001172 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerInit::?relay 0000116D osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001173 - 00001178 (0x6 bytes), align: 0 + Segment part 13. Intra module refs: osal_start_reload_timer + osal_start_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalAddTimer::?relay 00001173 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001179 - 0000117E (0x6 bytes), align: 0 + Segment part 15. Intra module refs: osalAddTimer + osal_get_timeoutEx + osal_stop_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalFindTimer::?relay 00001179 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000117F - 00001184 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: osal_stop_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalDeleteTimer::?relay + 0000117F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001185 - 0000118A (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_timerEx::?relay + 00001185 LL_ProcessEvent (ll) + Segment part 99 (peripheral) + WIMU_ProcessEvent (wimu) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + llScheduleTask (ll_scheduler) + osal_CbTimerStart (osal_cbtimer) + smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000118B - 00001190 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_reload_timer::?relay + 0000118B GAP_MakeDiscoverable (gap_peridevmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001191 - 00001196 (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_stop_timerEx::?relay + 00001191 GAP_EndDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + LL_SetAdvControl (ll) + Segment part 55 (peripheral) + Segment part 58 (gap_peridevmgr) + llT2OVFC1_ISR (ll_isr) + osal_CbTimerStop (osal_cbtimer) + smStopRspTimer (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001197 - 0000119C (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_get_timeoutEx::?relay + 00001197 GAPRole_SetParameter (peripheral) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000119D - 000011A2 (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerUpdate::?relay + 0000119D osalTimeUpdate (OSAL_ClockBLE) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F42 - 00008F45 (0x4 bytes), align: 0 + Segment part 37. Intra module refs: __Constant_0 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_WIMU.r51 + PROGRAM MODULE, NAME : OSAL_WIMU + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E67 - 00008E7C (0x16 bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksArr 00008E67 osal_run_system (OSAL) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FEB - 00008FEB (0x1 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksCnt 00008FEB osal_clear_event (OSAL) + osal_msg_enqueue_push (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_run_system (OSAL) + osal_set_event (OSAL) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F5 - 000007F6 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: osalInitTasks + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksEvents 000007F5 ?Subroutine18 (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B07B - 0001B0D4 (0x5a bytes), align: 0 + Segment part 9. Intra module refs: osalInitTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalInitTasks 0001B07B + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011A3 - 000011A8 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalInitTasks::?relay 000011A3 osal_init_system (OSAL) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E67 - 00008E7C (0x16 bytes), align: 0 + Segment part 11. Intra module refs: tasksArr + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FEB - 00008FEB (0x1 bytes), align: 0 + Segment part 12. Intra module refs: tasksCnt + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OnBoard.r51 + PROGRAM MODULE, NAME : OnBoard + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007F7 - 000007F7 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: InitBoard + OnBoard_KeyCallback + ENTRY ADDRESS REF BY + ===== ======= ====== + OnboardKeyIntEnable 000007F7 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F2D - 00000F2D (0x1 bytes), align: 0 + Segment part 8. Intra module refs: OnBoard_SendKeys + LOCAL ADDRESS + ===== ======= + registeredKeysTaskID 00000F2D + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACB7 - 0001ACD4 (0x1e bytes), align: 0 + Segment part 10. Intra module refs: InitBoard::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + InitBoard 0001ACB7 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACD5 - 0001ACD9 (0x5 bytes), align: 0 + Segment part 12. Intra module refs: InitBoard + OnBoard_KeyCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001ACD5 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACDA - 0001AD01 (0x28 bytes), align: 0 + Segment part 13. Intra module refs: Onboard_rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Onboard_rand 0001ACDA + calls direct + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD02 - 0001AD08 (0x7 bytes), align: 0 + Segment part 15. Intra module refs: Onboard_rand + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001AD02 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD09 - 0001AD4A (0x42 bytes), align: 0 + Segment part 20. Intra module refs: OnBoard_SendKeys::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_SendKeys 0001AD09 + calls direct + XSTACK = 00000009 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD4B - 0001AD89 (0x3f bytes), align: 0 + Segment part 22. Intra module refs: OnBoard_KeyCallback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_KeyCallback 0001AD4B + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD8A - 0001AD93 (0xa bytes), align: 0 + Segment part 24. Intra module refs: InitBoard + OnBoard_KeyCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001AD8A + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023A - 0000023A (0x1 bytes), align: 0 + Segment part 9. Intra module refs: registeredKeysTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011A9 - 000011AE (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + InitBoard::?relay 000011A9 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011AF - 000011B4 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + Onboard_rand::?relay 000011AF osal_rand (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011B5 - 000011BA (0x6 bytes), align: 0 + Segment part 21. Intra module refs: OnBoard_KeyCallback + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_SendKeys::?relay + 000011B5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011BB - 000011C0 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: ?Subroutine2 + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_KeyCallback::?relay + 000011BB + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\WIMU_Main.r51 + PROGRAM MODULE, NAME : WIMU_Main + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000009D - 0000009D (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: main + ENTRY ADDRESS REF BY + ===== ======= ====== + SLEEPSTA 0000009D + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009E - 0000009E (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: llSetFreqTune (ll_common) + main + ENTRY ADDRESS REF BY + ===== ======= ====== + CLKCONSTA 0000009E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B12B - 0001B17D (0x53 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + main 0001B12B ?call_main (?cmain) + calls direct + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\actimetryservice.r51 + PROGRAM MODULE, NAME : actimetryservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE3 - 00008FE4 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: actimetryService + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryServUUID 00008FE3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDF - 00008FE0 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 36 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryImuUUID 00008FDF + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD7 - 00008FD8 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 36 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryQuaternionUUID + 00008FD7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD5 - 00008FD6 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 36 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryCfgUUID 00008FD5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD3 - 00008FD4 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 36 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryControlUUID 00008FD3 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F8 - 000007F9 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Actimetry_WriteAttrCB + LOCAL ADDRESS + ===== ======= + Actimetry_AppCBs 000007F8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F96 - 00008F98 (0x3 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryService 00008F96 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F2E - 00000F2E (0x1 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryImuProps 00000F2E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007FA - 0000080D (0x14 bytes), align: 0 + Segment part 15. Intra module refs: Actimetry_GetParameter + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryImu 000007FA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000080E - 00000819 (0xc bytes), align: 0 + Segment part 16. Intra module refs: Actimetry_HandleConnStatusCB + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryImuConfig 0000080E + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F2F - 00000F41 (0x13 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryImuUserDesp 00000F2F + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F42 - 00000F42 (0x1 bytes), align: 0 + Segment part 19. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionProps + 00000F42 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000081A - 00000829 (0x10 bytes), align: 0 + Segment part 21. Intra module refs: Actimetry_GetParameter + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryQuaternion 0000081A + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000082A - 00000835 (0xc bytes), align: 0 + Segment part 22. Intra module refs: Actimetry_HandleConnStatusCB + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionConfig + 0000082A + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F43 - 00000F5C (0x1a bytes), align: 0 + Segment part 23. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionUserDesp + 00000F43 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F5D - 00000F5D (0x1 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryCfgProps 00000F5D + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000836 - 0000083B (0x6 bytes), align: 0 + Segment part 27. Intra module refs: Actimetry_GetParameter + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryCfg 00000836 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000083C - 00000847 (0xc bytes), align: 0 + Segment part 28. Intra module refs: Actimetry_HandleConnStatusCB + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryCfgConfig 0000083C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F5E - 00000F6E (0x11 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryCfgUserDesp 00000F5E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000848 - 0000084A (0x3 bytes), align: 0 + Segment part 31. Intra module refs: Actimetry_GetParameter + Actimetry_SetParameter + Actimetry_WriteAttrCB + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryControl 00000848 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000084B - 00000856 (0xc bytes), align: 0 + Segment part 32. Intra module refs: Actimetry_HandleConnStatusCB + Actimetry_SetParameter + Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryControlConfig + 0000084B + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F6F - 00000F80 (0x12 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 36 + LOCAL ADDRESS + ===== ======= + actimetryControlUserDesp + 00000F6F + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F81 - 00001000 (0x80 bytes), align: 0 + Segment part 35. Intra module refs: Actimetry_AddService + Actimetry_SetParameter + LOCAL ADDRESS + ===== ======= + sensorActimetryAttrTbl + 00000F81 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EE8 - 00008EED (0x6 bytes), align: 0 + Segment part 37. Intra module refs: Actimetry_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryCBs 00008EE8 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E5A - 00015EA1 (0x48 bytes), align: 0 + Segment part 38. Intra module refs: Actimetry_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_AddService 00015E5A + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015EA2 - 0001601D (0x17c bytes), align: 0 + Segment part 42. Intra module refs: Actimetry_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_SetParameter + 00015EA2 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001601E - 000160D9 (0xbc bytes), align: 0 + Segment part 44. Intra module refs: Actimetry_GetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_GetParameter + 0001601E + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000160DA - 0001626D (0x194 bytes), align: 0 + Segment part 46. Intra module refs: Actimetry_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_ReadAttrCB 000160DA + calls direct, is indirectly called + XSTACK = 00000006 ( 00000018 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001626E - 000163CB (0x15e bytes), align: 0 + Segment part 48. Intra module refs: Actimetry_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_WriteAttrCB 0001626E + calls direct, is indirectly called + XSTACK = 00000004 ( 0000001C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000163CC - 00016429 (0x5e bytes), align: 0 + Segment part 50. Intra module refs: Actimetry_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_HandleConnStatusCB + 000163CC + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023B - 0000023B (0x1 bytes), align: 0 + Segment part 14. Intra module refs: actimetryImuProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023C - 0000024E (0x13 bytes), align: 0 + Segment part 18. Intra module refs: actimetryImuUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000024F - 0000024F (0x1 bytes), align: 0 + Segment part 20. Intra module refs: actimetryQuaternionProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000250 - 00000269 (0x1a bytes), align: 0 + Segment part 24. Intra module refs: actimetryQuaternionUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000026A - 0000026A (0x1 bytes), align: 0 + Segment part 26. Intra module refs: actimetryCfgProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000026B - 0000027B (0x11 bytes), align: 0 + Segment part 30. Intra module refs: actimetryCfgUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000027C - 0000028D (0x12 bytes), align: 0 + Segment part 34. Intra module refs: actimetryControlUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000028E - 0000030D (0x80 bytes), align: 0 + Segment part 36. Intra module refs: sensorActimetryAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011C1 - 000011C6 (0x6 bytes), align: 0 + Segment part 39. + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_AddService::?relay + 000011C1 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011C7 - 000011CC (0x6 bytes), align: 0 + Segment part 43. + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_SetParameter::?relay + 000011C7 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011CD - 000011D2 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_GetParameter::?relay + 000011CD WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011D3 - 000011D8 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: actimetryCBs + LOCAL ADDRESS + ===== ======= + Actimetry_ReadAttrCB::?relay + 000011D3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011D9 - 000011DE (0x6 bytes), align: 0 + Segment part 49. Intra module refs: actimetryCBs + LOCAL ADDRESS + ===== ======= + Actimetry_WriteAttrCB::?relay + 000011D9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011DF - 000011E4 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: Actimetry_AddService + LOCAL ADDRESS + ===== ======= + Actimetry_HandleConnStatusCB::?relay + 000011DF + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE3 - 00008FE4 (0x2 bytes), align: 0 + Segment part 52. Intra module refs: actimetryServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDF - 00008FE0 (0x2 bytes), align: 0 + Segment part 53. Intra module refs: actimetryImuUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD7 - 00008FD8 (0x2 bytes), align: 0 + Segment part 54. Intra module refs: actimetryQuaternionUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD5 - 00008FD6 (0x2 bytes), align: 0 + Segment part 55. Intra module refs: actimetryCfgUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD3 - 00008FD4 (0x2 bytes), align: 0 + Segment part 56. Intra module refs: actimetryControlUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F96 - 00008F98 (0x3 bytes), align: 0 + Segment part 57. Intra module refs: actimetryService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EE8 - 00008EED (0x6 bytes), align: 0 + Segment part 58. Intra module refs: actimetryCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\battservice.r51 + PROGRAM MODULE, NAME : battservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA9 - 00008FAA (0x2 bytes), align: 0 + Segment part 6. Intra module refs: battService + ENTRY ADDRESS REF BY + ===== ======= ====== + battServUUID 00008FA9 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA7 - 00008FA8 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 15 + ENTRY ADDRESS REF BY + ===== ======= ====== + battLevelUUID 00008FA7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F99 - 00008F9B (0x3 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + battService 00008F99 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001001 - 00001001 (0x1 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevelProps 00001001 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000857 - 00000857 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Batt_SetParameter + Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevel 00000857 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000858 - 00000863 (0xc bytes), align: 0 + Segment part 13. Intra module refs: Batt_AddService + Batt_SetParameter + Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevelClientCharCfg + 00000858 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001002 - 00001021 (0x20 bytes), align: 0 + Segment part 14. Intra module refs: Batt_AddService + Batt_SetParameter + LOCAL ADDRESS + ===== ======= + battAttrTbl 00001002 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008ED6 - 00008EDB (0x6 bytes), align: 0 + Segment part 16. Intra module refs: Batt_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + battCBs 00008ED6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6EF - 0001A71E (0x30 bytes), align: 0 + Segment part 17. Intra module refs: Batt_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_AddService 0001A6EF + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A71F - 0001A772 (0x54 bytes), align: 0 + Segment part 22. Intra module refs: Batt_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_SetParameter 0001A71F + calls direct + XSTACK = 00000000 ( 00000011 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A773 - 0001A777 (0x5 bytes), align: 0 + Segment part 24. Intra module refs: Batt_SetParameter + battReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001A773 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A778 - 0001A7EB (0x74 bytes), align: 0 + Segment part 27. Intra module refs: battReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + battReadAttrCB 0001A778 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A7EC - 0001A7F1 (0x6 bytes), align: 0 + Segment part 29. Intra module refs: ?Subroutine2 + battReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine3 0001A7EC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A7F2 - 0001A84C (0x5b bytes), align: 0 + Segment part 30. Intra module refs: battWriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + battWriteAttrCB 0001A7F2 + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A84D - 0001A85A (0xe bytes), align: 0 + Segment part 32. Intra module refs: battReadAttrCB + battWriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001A84D + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030E - 0000030E (0x1 bytes), align: 0 + Segment part 11. Intra module refs: battLevelProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030F - 0000032E (0x20 bytes), align: 0 + Segment part 15. Intra module refs: battAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011E5 - 000011EA (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_AddService::?relay + 000011E5 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011EB - 000011F0 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_SetParameter::?relay + 000011EB WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011F1 - 000011F6 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: battCBs + LOCAL ADDRESS + ===== ======= + battReadAttrCB::?relay + 000011F1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011F7 - 000011FC (0x6 bytes), align: 0 + Segment part 31. Intra module refs: battCBs + LOCAL ADDRESS + ===== ======= + battWriteAttrCB::?relay + 000011F7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA9 - 00008FAA (0x2 bytes), align: 0 + Segment part 35. Intra module refs: battServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA7 - 00008FA8 (0x2 bytes), align: 0 + Segment part 36. Intra module refs: battLevelUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F99 - 00008F9B (0x3 bytes), align: 0 + Segment part 37. Intra module refs: battService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008ED6 - 00008EDB (0x6 bytes), align: 0 + Segment part 38. Intra module refs: battCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\devinfoservice.r51 + PROGRAM MODULE, NAME : devinfoservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE9 - 00008FEA (0x2 bytes), align: 0 + Segment part 6. Intra module refs: devInfoService + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoServUUID 00008FE9 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA3 - 00008FA4 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSystemIdUUID 00008FA3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA1 - 00008FA2 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoModelNumberUUID + 00008FA1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F9F - 00008FA0 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSerialNumberUUID + 00008F9F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE7 - 00008FE8 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoFirmwareRevUUID + 00008FE7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDD - 00008FDE (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoHardwareRevUUID + 00008FDD + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD1 - 00008FD2 (0x2 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSoftwareRevUUID + 00008FD1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBB - 00008FBC (0x2 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoMfrNameUUID 00008FBB + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAB - 00008FAC (0x2 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfo11073CertUUID 00008FAB + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA5 - 00008FA6 (0x2 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoPnpIdUUID 00008FA5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F9C - 00008F9E (0x3 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoService 00008F9C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001022 - 00001022 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSystemIdProps 00001022 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000864 - 0000086B (0x8 bytes), align: 0 + Segment part 19. Intra module refs: DevInfo_SetParameter + Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoSystemId 00000864 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001023 - 00001023 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoModelNumberProps + 00001023 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EF4 - 00008EF9 (0x6 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoModelNumber 00008EF4 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001024 - 00001024 (0x1 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSerialNumberProps + 00001024 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000086C - 0000086D (0x2 bytes), align: 0 + Segment part 25. Intra module refs: DevInfo_SetParameter + Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoSerialNumber 0000086C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001025 - 00001025 (0x1 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoFirmwareRevProps + 00001025 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000086E - 0000088A (0x1d bytes), align: 0 + Segment part 28. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoFirmwareRev 0000086E + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001026 - 00001026 (0x1 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoHardwareRevProps + 00001026 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000088B - 0000088C (0x2 bytes), align: 0 + Segment part 31. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoHardwareRev 0000088B + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001027 - 00001027 (0x1 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSoftwareRevProps + 00001027 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000088D - 000008A9 (0x1d bytes), align: 0 + Segment part 34. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSoftwareRev 0000088D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001028 - 00001028 (0x1 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoMfrNameProps 00001028 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F00 - 00008F04 (0x5 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoMfrName 00008F00 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001029 - 00001029 (0x1 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfo11073CertProps 00001029 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EAD - 00008EBA (0xe bytes), align: 0 + Segment part 40. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfo11073Cert 00008EAD + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000102A - 0000102A (0x1 bytes), align: 0 + Segment part 41. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoPnpIdProps 0000102A + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000102B - 00001031 (0x7 bytes), align: 0 + Segment part 43. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoPnpId 0000102B + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001032 - 000010C9 (0x98 bytes), align: 0 + Segment part 45. Intra module refs: DevInfo_AddService + LOCAL ADDRESS + ===== ======= + devInfoAttrTbl 00001032 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008ED0 - 00008ED5 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: DevInfo_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoCBs 00008ED0 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001980C - 0001982B (0x20 bytes), align: 0 + Segment part 48. Intra module refs: DevInfo_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_AddService 0001980C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001982C - 00019830 (0x5 bytes), align: 0 + Segment part 50. Intra module refs: DevInfo_AddService + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001982C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019831 - 00019898 (0x68 bytes), align: 0 + Segment part 51. Intra module refs: DevInfo_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_SetParameter 00019831 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019899 - 00019B26 (0x28e bytes), align: 0 + Segment part 55. Intra module refs: devInfo_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + devInfo_ReadAttrCB 00019899 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B27 - 00019B2F (0x9 bytes), align: 0 + Segment part 57. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00019B27 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B30 - 00019B38 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00019B30 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B39 - 00019B44 (0xc bytes), align: 0 + Segment part 59. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00019B39 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000032F - 0000032F (0x1 bytes), align: 0 + Segment part 18. Intra module refs: devInfoSystemIdProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000330 - 00000330 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: devInfoModelNumberProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000331 - 00000331 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: devInfoSerialNumberProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000332 - 00000332 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: devInfoFirmwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000333 - 00000333 (0x1 bytes), align: 0 + Segment part 30. Intra module refs: devInfoHardwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000334 - 00000334 (0x1 bytes), align: 0 + Segment part 33. Intra module refs: devInfoSoftwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000335 - 00000335 (0x1 bytes), align: 0 + Segment part 36. Intra module refs: devInfoMfrNameProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000336 - 00000336 (0x1 bytes), align: 0 + Segment part 39. Intra module refs: devInfo11073CertProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000337 - 00000337 (0x1 bytes), align: 0 + Segment part 42. Intra module refs: devInfoPnpIdProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000338 - 0000033E (0x7 bytes), align: 0 + Segment part 44. Intra module refs: devInfoPnpId + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000033F - 000003D6 (0x98 bytes), align: 0 + Segment part 46. Intra module refs: devInfoAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011FD - 00001202 (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_AddService::?relay + 000011FD WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001203 - 00001208 (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_SetParameter::?relay + 00001203 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001209 - 0000120E (0x6 bytes), align: 0 + Segment part 56. Intra module refs: devInfoCBs + LOCAL ADDRESS + ===== ======= + devInfo_ReadAttrCB::?relay + 00001209 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE9 - 00008FEA (0x2 bytes), align: 0 + Segment part 60. Intra module refs: devInfoServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA3 - 00008FA4 (0x2 bytes), align: 0 + Segment part 61. Intra module refs: devInfoSystemIdUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA1 - 00008FA2 (0x2 bytes), align: 0 + Segment part 62. Intra module refs: devInfoModelNumberUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F9F - 00008FA0 (0x2 bytes), align: 0 + Segment part 63. Intra module refs: devInfoSerialNumberUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE7 - 00008FE8 (0x2 bytes), align: 0 + Segment part 64. Intra module refs: devInfoFirmwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDD - 00008FDE (0x2 bytes), align: 0 + Segment part 65. Intra module refs: devInfoHardwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD1 - 00008FD2 (0x2 bytes), align: 0 + Segment part 66. Intra module refs: devInfoSoftwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBB - 00008FBC (0x2 bytes), align: 0 + Segment part 67. Intra module refs: devInfoMfrNameUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAB - 00008FAC (0x2 bytes), align: 0 + Segment part 68. Intra module refs: devInfo11073CertUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA5 - 00008FA6 (0x2 bytes), align: 0 + Segment part 69. Intra module refs: devInfoPnpIdUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F9C - 00008F9E (0x3 bytes), align: 0 + Segment part 70. Intra module refs: devInfoService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EF4 - 00008EF9 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: devInfoModelNumber + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F00 - 00008F04 (0x5 bytes), align: 0 + Segment part 72. Intra module refs: devInfoMfrName + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EAD - 00008EBA (0xe bytes), align: 0 + Segment part 73. Intra module refs: devInfo11073Cert + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008ED0 - 00008ED5 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: devInfoCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gap.r51 + PROGRAM MODULE, NAME : gap + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0D5 - 0001B12A (0x56 bytes), align: 0 + Segment part 6. Intra module refs: GAP_DeviceInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_DeviceInit 0001B0D5 + calls direct + XSTACK = 00000004 ( 00000011 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000120F - 00001214 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_DeviceInit::?relay + 0000120F GAPRole_StartDevice (peripheral) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gapbondmgr.r51 + PROGRAM MODULE, NAME : gapbondmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000008AA - 000008AA (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAPBondMgr_Init + GAPBondMgr_LinkEst + GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_Register + gapBondMgrSendServiceChange + LOCAL ADDRESS + ===== ======= + gapBondMgr_TaskID 000008AA + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CA - 000010CA (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBond_PairingMode 000010CA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AB - 000008AB (0x1 bytes), align: 0 + Segment part 12. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_MITM 000008AB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AC - 000008AC (0x1 bytes), align: 0 + Segment part 13. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_IOCap 000008AC + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AD - 000008AD (0x1 bytes), align: 0 + Segment part 14. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_OOBDataFlag 000008AD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AE - 000008BD (0x10 bytes), align: 0 + Segment part 15. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_OOBData 000008AE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008BE - 000008BE (0x1 bytes), align: 0 + Segment part 16. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_Bonding 000008BE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008BF - 000008BF (0x1 bytes), align: 0 + Segment part 17. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBond_AutoFail 000008BF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CB - 000010CB (0x1 bytes), align: 0 + Segment part 18. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBond_AutoFailReason + 000010CB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CC - 000010CC (0x1 bytes), align: 0 + Segment part 20. Intra module refs: ?Subroutine15 + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_KeyDistList 000010CC + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008C0 - 000008C3 (0x4 bytes), align: 0 + Segment part 22. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBond_Passcode 000008C0 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CD - 000010CD (0x1 bytes), align: 0 + Segment part 23. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_KeySize 000010CD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008C4 - 000008C5 (0x2 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine7 + GAPBondMgr_Register + LOCAL ADDRESS + ===== ======= + pGapBondCB 000008C4 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008C6 - 00000951 (0x8c bytes), align: 0 + Segment part 26. Intra module refs: GAPBondMgr_ResolveAddr + gapBondMgrAddBond + gapBondMgrBondTotal + gapBondMgrFindAddr + gapBondMgrReadBonds + gapBondMgr_SyncWhiteList + LOCAL ADDRESS + ===== ======= + bonds 000008C6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000952 - 00000952 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + autoSyncWhiteList 00000952 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000953 - 00000953 (0x1 bytes), align: 0 + Segment part 28. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + eraseAllBonds 00000953 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000954 - 00000955 (0x2 bytes), align: 0 + Segment part 29. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + connectionHandle 00000954 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006AEA - 00006AEE (0x5 bytes), align: 0 + Segment part 37. Intra module refs: gapBondMgrChangeState + gapBondMgrGetPublicAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00006AEA + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006AEF - 00006AF3 (0x5 bytes), align: 0 + Segment part 38. Intra module refs: ?Subroutine0 + GAPBondMgr_ServiceChangeInd + gapBondMgrFindAddr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006AF4 - 00006C8D (0x19a bytes), align: 0 + Segment part 39. Intra module refs: GAPBondMgr_LinkEst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_LinkEst 00006AF4 + calls direct + XSTACK = 00000001 ( 00000046 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C8E - 00006C92 (0x5 bytes), align: 0 + Segment part 41. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00006C8E + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C93 - 00006D3D (0xab bytes), align: 0 + Segment part 42. Intra module refs: GAPBondMgr_ResolveAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ResolveAddr + 00006C93 + calls direct + XSTACK = 00000044 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006D3E - 00006DBD (0x80 bytes), align: 0 + Segment part 44. Intra module refs: GAPBondMgr_ServiceChangeInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ServiceChangeInd + 00006D3E + calls direct + XSTACK = 00000013 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006DBE - 00006E34 (0x77 bytes), align: 0 + Segment part 46. Intra module refs: GAPBondMgr_UpdateCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_UpdateCharCfg + 00006DBE + calls direct + XSTACK = 00000015 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006E35 - 00006E42 (0xe bytes), align: 0 + Segment part 48. Intra module refs: GAPBondMgr_ServiceChangeInd + GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00006E35 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006E43 - 00006E64 (0x22 bytes), align: 0 + Segment part 49. Intra module refs: GAPBondMgr_Register::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Register 00006E43 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006E65 - 00006E6B (0x7 bytes), align: 0 + Segment part 51. Intra module refs: GAPBondMgr_Register + gapBondMgrSendServiceChange + gapBondSetupPrivFlag + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00006E65 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006E6C - 00007200 (0x395 bytes), align: 0 + Segment part 54. Intra module refs: GAPBondMgr_ProcessGAPMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessGAPMsg + 00006E6C + calls direct + XSTACK = 00000013 ( 00000034 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007201 - 0000720F (0xf bytes), align: 0 + Segment part 56. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine13 00007201 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007210 - 00007217 (0x8 bytes), align: 0 + Segment part 57. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00007210 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007218 - 00007218 (0x1 bytes), align: 0 + Segment part 58. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00007218 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007219 - 0000721C (0x4 bytes), align: 0 + Segment part 59. Intra module refs: ?Subroutine10 + GAPBondMgr_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000721D - 00007222 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + Segment part 59 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007223 - 00007228 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: GAPBondMgr_ProcessGAPMsg + gapBondMgrChangeState + LOCAL ADDRESS + ===== ======= + ?Subroutine9 00007223 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007229 - 0000723B (0x13 bytes), align: 0 + Segment part 62. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00007229 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000723C - 0000723E (0x3 bytes), align: 0 + Segment part 63. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine7 0000723C + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000723F - 00007246 (0x8 bytes), align: 0 + Segment part 64. Intra module refs: ?Subroutine7 + GAPBondMgr_ProcessGAPMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007247 - 000072BD (0x77 bytes), align: 0 + Segment part 65. Intra module refs: gapBondMgrChangeState::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrChangeState 00007247 + calls direct + XSTACK = 0000000C ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000072BE - 000073C3 (0x106 bytes), align: 0 + Segment part 67. Intra module refs: gapBondMgrUpdateCharCfg::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrUpdateCharCfg + 000072BE + calls direct + XSTACK = 0000000E ( 00000028 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073C4 - 000073C5 (0x2 bytes), align: 0 + Segment part 69. Intra module refs: gapBondMgrChangeState + gapBondMgrResolvePrivateAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine20 000073C4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073C6 - 000073CB (0x6 bytes), align: 0 + Segment part 70. Intra module refs: ?Subroutine20 + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073CC - 000073CF (0x4 bytes), align: 0 + Segment part 71. Intra module refs: GAPBondMgr_LinkEst + Segment part 70 + gapBondMgrEraseBonding + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073D0 - 000073D4 (0x5 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + gapBondMgrAddBond + gapBondMgrBondTotal + gapBondMgr_SyncWhiteList + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073D5 - 00007407 (0x33 bytes), align: 0 + Segment part 73. Intra module refs: gapBondMgrFindCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrFindCharCfgItem + 000073D5 + XSTACK = 00000028 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007408 - 0000740E (0x7 bytes), align: 0 + Segment part 75. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrFindCharCfgItem + gapBondMgrInvertCharCfgItem + LOCAL ADDRESS + ===== ======= + ?Subroutine21 00007408 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000740F - 00007443 (0x35 bytes), align: 0 + Segment part 76. Intra module refs: gapBondMgrInvertCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrInvertCharCfgItem + 0000740F + XSTACK = 00000044 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007444 - 0000744F (0xc bytes), align: 0 + Segment part 78. Intra module refs: gapBondMgrInvertCharCfgItem + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine23 00007444 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007450 - 0000758F (0x140 bytes), align: 0 + Segment part 79. Intra module refs: gapBondMgrAddBond::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrAddBond 00007450 + calls direct + XSTACK = 00000034 ( 00000020 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007590 - 00007596 (0x7 bytes), align: 0 + Segment part 81. Intra module refs: gapBondMgrAddBond + LOCAL ADDRESS + ===== ======= + ?Subroutine22 00007590 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007597 - 000075E2 (0x4c bytes), align: 0 + Segment part 82. Intra module refs: gapBondMgrGetPublicAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrGetPublicAddr + 00007597 + calls direct + XSTACK = 00000010 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000075E3 - 000075E6 (0x4 bytes), align: 0 + Segment part 84. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine16 000075E3 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000075E7 - 000075EC (0x6 bytes), align: 0 + Segment part 85. Intra module refs: ?Subroutine16 + GAPBondMgr_ProcessGAPMsg + gapBondMgrAddBond + gapBondMgrAuthenticate + gapBondMgrGetPublicAddr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000075ED - 00007635 (0x49 bytes), align: 0 + Segment part 86. Intra module refs: gapBondMgrFindAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrFindAddr 000075ED + calls direct + XSTACK = 0000001E ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007636 - 00007691 (0x5c bytes), align: 0 + Segment part 88. Intra module refs: gapBondMgrResolvePrivateAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrResolvePrivateAddr + 00007636 + calls direct + XSTACK = 00000010 ( 00000019 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007692 - 0000769B (0xa bytes), align: 0 + Segment part 90. Intra module refs: gapBondMgrGetPublicAddr + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine18 00007692 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000769C - 0000769E (0x3 bytes), align: 0 + Segment part 91. Intra module refs: ?Subroutine18 + gapBondMgrReadBonds + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000769F - 0000769F (0x1 bytes), align: 0 + Segment part 92. Intra module refs: GAPBondMgr_LinkEst + Segment part 91 + gapBondMgrChangeState + gapBondMgrEraseBonding + gapBondMgrResolvePrivateAddr + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000076A0 - 000076A4 (0x5 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 92 + gapBondMgrBondReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000076A5 - 00007710 (0x6c bytes), align: 0 + Segment part 94. Intra module refs: gapBondMgrReadBonds::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrReadBonds 000076A5 + calls direct + XSTACK = 0000002A ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007711 - 0000773C (0x2c bytes), align: 0 + Segment part 96. Intra module refs: gapBondMgrBondTotal::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrBondTotal 00007711 + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000773D - 00007741 (0x5 bytes), align: 0 + Segment part 98. Intra module refs: GAPBondMgr_Init + gapBondMgrBondTotal + gapBondMgrEraseAllBondings + gapBondMgrFindCharCfgItem + gapBondMgrInvertCharCfgItem + gapBondMgrReadBonds + gapBondMgrResolvePrivateAddr + gapBondMgr_SyncWhiteList + LOCAL ADDRESS + ===== ======= + ?Subroutine4 0000773D + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007742 - 00007759 (0x18 bytes), align: 0 + Segment part 99. Intra module refs: gapBondMgrEraseAllBondings::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseAllBondings + 00007742 + calls direct + XSTACK = 0000002A ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000775A - 00007862 (0x109 bytes), align: 0 + Segment part 101. Intra module refs: gapBondMgrEraseBonding::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseBonding + 0000775A + calls direct + XSTACK = 00000009 ( 00000042 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007863 - 0000786A (0x8 bytes), align: 0 + Segment part 103. Intra module refs: gapBondMgrBondReq + gapBondMgrEraseBonding + LOCAL ADDRESS + ===== ======= + ?Subroutine5 00007863 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000786B - 00007872 (0x8 bytes), align: 0 + Segment part 104. Intra module refs: gapBondMgrEraseBonding + LOCAL ADDRESS + ===== ======= + ?Subroutine17 0000786B + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007873 - 00007882 (0x10 bytes), align: 0 + Segment part 105. Intra module refs: GAPBondMgr_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Init 00007873 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007883 - 00007A2C (0x1aa bytes), align: 0 + Segment part 107. Intra module refs: GAPBondMgr_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessEvent + 00007883 + calls direct + XSTACK = 00000000 ( 0000001B ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A2D - 00007A32 (0x6 bytes), align: 0 + Segment part 109. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine14 00007A2D + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A33 - 00007A38 (0x6 bytes), align: 0 + Segment part 110. Intra module refs: ?Subroutine14 + GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + gapBondMgrSendServiceChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A39 - 00007A4F (0x17 bytes), align: 0 + Segment part 113. Intra module refs: gapBondMgrSendServiceChange::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrSendServiceChange + 00007A39 + calls direct, is indirectly called + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A50 - 00007A81 (0x32 bytes), align: 0 + Segment part 115. Intra module refs: gapBondSetupPrivFlag::?relay + LOCAL ADDRESS + ===== ======= + gapBondSetupPrivFlag 00007A50 + calls direct + XSTACK = 0000001E ( 00000001 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A82 - 00007C0A (0x189 bytes), align: 0 + Segment part 117. Intra module refs: gapBondMgrAuthenticate::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrAuthenticate + 00007A82 + calls direct + XSTACK = 0000002A ( 00000028 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C0B - 00007C0D (0x3 bytes), align: 0 + Segment part 119. Intra module refs: GAPBondMgr_ProcessEvent + gapBondMgrAuthenticate + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00007C0B + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C0E - 00007C12 (0x5 bytes), align: 0 + Segment part 120. Intra module refs: ?Subroutine2 + GAPBondMgr_UpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C13 - 00007C19 (0x7 bytes), align: 0 + Segment part 121. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine24 00007C13 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C1A - 00007C23 (0xa bytes), align: 0 + Segment part 122. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine15 00007C1A + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C24 - 00007C9B (0x78 bytes), align: 0 + Segment part 123. Intra module refs: gapBondMgrBondReq::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrBondReq 00007C24 + calls direct + XSTACK = 00000045 ( 00000029 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007C9C - 00007CA3 (0x8 bytes), align: 0 + Segment part 125. Intra module refs: gapBondMgrAddBond + gapBondMgrBondReq + LOCAL ADDRESS + ===== ======= + ?Subroutine19 00007C9C + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007CA4 - 00007CB7 (0x14 bytes), align: 0 + Segment part 126. Intra module refs: ?Subroutine19 + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine25 00007CA4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007CB8 - 00007CF5 (0x3e bytes), align: 0 + Segment part 127. Intra module refs: gapBondMgr_SyncWhiteList::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgr_SyncWhiteList + 00007CB8 + calls direct + XSTACK = 0000001E ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003D7 - 000003D7 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: gapBond_PairingMode + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003D8 - 000003D8 (0x1 bytes), align: 0 + Segment part 19. Intra module refs: gapBond_AutoFailReason + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003D9 - 000003D9 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: gapBond_KeyDistList + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003DA - 000003DA (0x1 bytes), align: 0 + Segment part 24. Intra module refs: gapBond_KeySize + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001215 - 0000121A (0x6 bytes), align: 0 + Segment part 40. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_LinkEst::?relay + 00001215 gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000121B - 00001220 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: ?Subroutine12 + GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ResolveAddr::?relay + 0000121B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001221 - 00001226 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ServiceChangeInd::?relay + 00001221 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001227 - 0000122C (0x6 bytes), align: 0 + Segment part 47. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_UpdateCharCfg::?relay + 00001227 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000122D - 00001232 (0x6 bytes), align: 0 + Segment part 50. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Register::?relay + 0000122D WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001233 - 00001238 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessGAPMsg::?relay + 00001233 gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001239 - 0000123E (0x6 bytes), align: 0 + Segment part 66. Intra module refs: GAPBondMgr_ServiceChangeInd + LOCAL ADDRESS + ===== ======= + gapBondMgrChangeState::?relay + 00001239 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000123F - 00001244 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrUpdateCharCfg::?relay + 0000123F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001245 - 0000124A (0x6 bytes), align: 0 + Segment part 74. Intra module refs: gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrFindCharCfgItem::?relay + 00001245 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000124B - 00001250 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrInvertCharCfgItem::?relay + 0000124B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001251 - 00001256 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrAddBond::?relay + 00001251 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001257 - 0000125C (0x6 bytes), align: 0 + Segment part 83. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + gapBondMgrGetPublicAddr::?relay + 00001257 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000125D - 00001262 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: GAPBondMgr_ResolveAddr + gapBondMgrAddBond + LOCAL ADDRESS + ===== ======= + gapBondMgrFindAddr::?relay + 0000125D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001263 - 00001268 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + gapBondMgrResolvePrivateAddr::?relay + 00001263 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001269 - 0000126E (0x6 bytes), align: 0 + Segment part 95. Intra module refs: GAPBondMgr_Init + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrReadBonds::?relay + 00001269 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000126F - 00001274 (0x6 bytes), align: 0 + Segment part 97. Intra module refs: gapBondSetupPrivFlag + LOCAL ADDRESS + ===== ======= + gapBondMgrBondTotal::?relay + 0000126F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001275 - 0000127A (0x6 bytes), align: 0 + Segment part 100. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseAllBondings::?relay + 00001275 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000127B - 00001280 (0x6 bytes), align: 0 + Segment part 102. Intra module refs: gapBondMgrEraseAllBondings + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseBonding::?relay + 0000127B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001281 - 00001286 (0x6 bytes), align: 0 + Segment part 106. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Init::?relay + 00001281 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001287 - 0000128C (0x6 bytes), align: 0 + Segment part 108. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessEvent::?relay + 00001287 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000128D - 00001292 (0x6 bytes), align: 0 + Segment part 114. Intra module refs: GAPBondMgr_ServiceChangeInd + LOCAL ADDRESS + ===== ======= + gapBondMgrSendServiceChange::?relay + 0000128D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001293 - 00001298 (0x6 bytes), align: 0 + Segment part 116. Intra module refs: gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + gapBondSetupPrivFlag::?relay + 00001293 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001299 - 0000129E (0x6 bytes), align: 0 + Segment part 118. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrAuthenticate::?relay + 00001299 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000129F - 000012A4 (0x6 bytes), align: 0 + Segment part 124. Intra module refs: GAPBondMgr_LinkEst + LOCAL ADDRESS + ===== ======= + gapBondMgrBondReq::?relay + 0000129F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012A5 - 000012AA (0x6 bytes), align: 0 + Segment part 128. Intra module refs: gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + gapBondMgr_SyncWhiteList::?relay + 000012A5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EE2 - 00008EE7 (0x6 bytes), align: 0 + Segment part 6. Intra module refs: GAPBondMgr_LinkEst + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F6A - 00008F6D (0x4 bytes), align: 0 + Segment part 30. Intra module refs: GAP_PasscodeUpdate (gap_linkmgr) + llCalcScaFactor (ll_timerDrift) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_f4240 00008F6A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F62 - 00008F65 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: GAPBondMgr_ProcessGAPMsg + SM_VerifyAuthenSig (sm_mgr) + Segment part 64 (ll_advEndCauses) + Segment part 95 (ll_common) + WIMU_Init (wimu) + findOffset (osal_snv) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smpResponderProcessIncoming (sm_rsppairing) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffffff 00008F62 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EE2 - 00008EE7 (0x6 bytes), align: 0 + Segment part 129. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F6A - 00008F6D (0x4 bytes), align: 0 + Segment part 130. Intra module refs: __Constant_f4240 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F62 - 00008F65 (0x4 bytes), align: 0 + Segment part 131. Intra module refs: __Constant_ffffffff + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gatt_uuid.r51 + PROGRAM MODULE, NAME : gatt_uuid + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAD - 00008FAE (0x2 bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapServiceUUID 00008FAD Segment part 7 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAF - 00008FB0 (0x2 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattServiceUUID 00008FAF Segment part 15 (gattservapp) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB1 - 00008FB2 (0x2 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + primaryServiceUUID 00008FB1 Segment part 15 (battservice) + Segment part 15 (timeservice) + Segment part 20 (gattservapp) + Segment part 25 (gapgattserver) + Segment part 28 (gpsservice) + Segment part 36 (actimetryservice) + Segment part 38 (gatt_server) + Segment part 46 (devinfoservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB3 - 00008FB4 (0x2 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + secondaryServiceUUID 00008FB3 GATTServApp_ReadAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_RegisterService (gatt_server) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB5 - 00008FB6 (0x2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + characterUUID 00008FB5 GATT_FindNextAttr (gatt_server) + Segment part 15 (battservice) + Segment part 15 (timeservice) + Segment part 20 (gattservapp) + Segment part 25 (gapgattserver) + Segment part 28 (gpsservice) + Segment part 36 (actimetryservice) + Segment part 46 (devinfoservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB7 - 00008FB8 (0x2 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + charUserDescUUID 00008FB7 Segment part 36 (actimetryservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB9 - 00008FBA (0x2 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + clientCharCfgUUID 00008FB9 GAPBondMgr_ProcessEvent (gapbondmgr) + Segment part 15 (battservice) + Segment part 15 (timeservice) + Segment part 20 (gattservapp) + Segment part 28 (gpsservice) + Segment part 36 (actimetryservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE5 - 00008FE6 (0x2 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + deviceNameUUID 00008FE5 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBD - 00008FBE (0x2 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + appearanceUUID 00008FBD Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBF - 00008FC0 (0x2 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + periPrivacyFlagUUID 00008FBF Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC1 - 00008FC2 (0x2 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + reconnectAddrUUID 00008FC1 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC3 - 00008FC4 (0x2 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + periConnParamUUID 00008FC3 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC5 - 00008FC6 (0x2 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + serviceChangedUUID 00008FC5 GATT_ServiceChangedInd (gatt_server) + Segment part 20 (gattservapp) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAD - 00008FAE (0x2 bytes), align: 0 + Segment part 29. Intra module refs: gapServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAF - 00008FB0 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: gattServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB1 - 00008FB2 (0x2 bytes), align: 0 + Segment part 31. Intra module refs: primaryServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB3 - 00008FB4 (0x2 bytes), align: 0 + Segment part 32. Intra module refs: secondaryServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB5 - 00008FB6 (0x2 bytes), align: 0 + Segment part 34. Intra module refs: characterUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB7 - 00008FB8 (0x2 bytes), align: 0 + Segment part 36. Intra module refs: charUserDescUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB9 - 00008FBA (0x2 bytes), align: 0 + Segment part 37. Intra module refs: clientCharCfgUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE5 - 00008FE6 (0x2 bytes), align: 0 + Segment part 41. Intra module refs: deviceNameUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBD - 00008FBE (0x2 bytes), align: 0 + Segment part 42. Intra module refs: appearanceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBF - 00008FC0 (0x2 bytes), align: 0 + Segment part 43. Intra module refs: periPrivacyFlagUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC1 - 00008FC2 (0x2 bytes), align: 0 + Segment part 44. Intra module refs: reconnectAddrUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC3 - 00008FC4 (0x2 bytes), align: 0 + Segment part 45. Intra module refs: periConnParamUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC5 - 00008FC6 (0x2 bytes), align: 0 + Segment part 46. Intra module refs: serviceChangedUUID + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gpsservice.r51 + PROGRAM MODULE, NAME : gpsservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC7 - 00008FC8 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: gpsService + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsServUUID 00008FC7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC9 - 00008FCA (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsFeaturesUUID 00008FC9 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCB - 00008FCC (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsLocationAndSpeedUUID + 00008FCB + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCD - 00008FCE (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsDateTimeUUID 00008FCD + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCF - 00008FD0 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsPositionQualityUUID + 00008FCF + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F90 - 00008F92 (0x3 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsService 00008F90 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CE - 000010CE (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsFeaturesProps 000010CE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010CF - 000010D2 (0x4 bytes), align: 0 + Segment part 14. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsFeatures 000010CF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010D3 - 000010D3 (0x1 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeedProps + 000010D3 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000956 - 00000966 (0x11 bytes), align: 0 + Segment part 18. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeed 00000956 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000967 - 00000972 (0xc bytes), align: 0 + Segment part 19. Intra module refs: Gps_AddService + Gps_SetParameter + Segment part 28 + gps_HandleConnStatusCB + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeedClientCharCfg + 00000967 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010D4 - 000010D4 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsDateTimeProps 000010D4 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000973 - 00000979 (0x7 bytes), align: 0 + Segment part 22. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsDateTime 00000973 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000097A - 00000985 (0xc bytes), align: 0 + Segment part 23. Intra module refs: Gps_AddService + Gps_SetParameter + Segment part 28 + gps_HandleConnStatusCB + LOCAL ADDRESS + ===== ======= + gpsDateTimeClientCharCfg + 0000097A + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010D5 - 000010D5 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsPositionQualityProps + 000010D5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000986 - 00000995 (0x10 bytes), align: 0 + Segment part 26. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsPositionQuality 00000986 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000010D6 - 0000112D (0x58 bytes), align: 0 + Segment part 27. Intra module refs: Gps_AddService + Gps_SetParameter + LOCAL ADDRESS + ===== ======= + gpsAttrTbl 000010D6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EEE - 00008EF3 (0x6 bytes), align: 0 + Segment part 29. Intra module refs: Gps_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsCBs 00008EEE + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017CDE - 00017D26 (0x49 bytes), align: 0 + Segment part 30. Intra module refs: Gps_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_AddService 00017CDE + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017D27 - 00017D28 (0x2 bytes), align: 0 + Segment part 32. Intra module refs: Gps_AddService + Gps_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00017D27 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017D29 - 00017D2D (0x5 bytes), align: 0 + Segment part 33. Intra module refs: ?Subroutine0 + gps_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017D2E - 00017E0A (0xdd bytes), align: 0 + Segment part 34. Intra module refs: Gps_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_SetParameter 00017D2E + calls direct + XSTACK = 00000000 ( 00000011 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017E0B - 00017E10 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: Gps_SetParameter + gps_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00017E0B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017E11 - 00017ED5 (0xc5 bytes), align: 0 + Segment part 39. Intra module refs: gps_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gps_ReadAttrCB 00017E11 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017ED6 - 00017F35 (0x60 bytes), align: 0 + Segment part 41. Intra module refs: gps_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gps_WriteAttrCB 00017ED6 + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F36 - 00017F40 (0xb bytes), align: 0 + Segment part 43. Intra module refs: gps_ReadAttrCB + gps_WriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00017F36 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F41 - 00017F84 (0x44 bytes), align: 0 + Segment part 44. Intra module refs: gps_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gps_HandleConnStatusCB + 00017F41 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003DB - 000003DB (0x1 bytes), align: 0 + Segment part 13. Intra module refs: gpsFeaturesProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003DC - 000003DF (0x4 bytes), align: 0 + Segment part 15. Intra module refs: gpsFeatures + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003E0 - 000003E0 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: gpsLocationAndSpeedProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003E1 - 000003E1 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: gpsDateTimeProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003E2 - 000003E2 (0x1 bytes), align: 0 + Segment part 25. Intra module refs: gpsPositionQualityProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003E3 - 0000043A (0x58 bytes), align: 0 + Segment part 28. Intra module refs: gpsAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012AB - 000012B0 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_AddService::?relay + 000012AB WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012B1 - 000012B6 (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_SetParameter::?relay + 000012B1 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012B7 - 000012BC (0x6 bytes), align: 0 + Segment part 40. Intra module refs: gpsCBs + LOCAL ADDRESS + ===== ======= + gps_ReadAttrCB::?relay + 000012B7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012BD - 000012C2 (0x6 bytes), align: 0 + Segment part 42. Intra module refs: gpsCBs + LOCAL ADDRESS + ===== ======= + gps_WriteAttrCB::?relay + 000012BD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012C3 - 000012C8 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Gps_AddService + LOCAL ADDRESS + ===== ======= + gps_HandleConnStatusCB::?relay + 000012C3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC7 - 00008FC8 (0x2 bytes), align: 0 + Segment part 46. Intra module refs: gpsServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC9 - 00008FCA (0x2 bytes), align: 0 + Segment part 47. Intra module refs: gpsFeaturesUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCB - 00008FCC (0x2 bytes), align: 0 + Segment part 48. Intra module refs: gpsLocationAndSpeedUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCD - 00008FCE (0x2 bytes), align: 0 + Segment part 49. Intra module refs: gpsDateTimeUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCF - 00008FD0 (0x2 bytes), align: 0 + Segment part 50. Intra module refs: gpsPositionQualityUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F90 - 00008F92 (0x3 bytes), align: 0 + Segment part 51. Intra module refs: gpsService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EEE - 00008EF3 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gpsCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_adc.r51 + PROGRAM MODULE, NAME : hal_adc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B4 - 000000B4 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCON1 000000B4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000B6 - 000000B6 (0x1 bytes), align: 0 + Segment part 2. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCON3 000000B6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BA - 000000BA (0x1 bytes), align: 0 + Segment part 3. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCL 000000BA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BB - 000000BB (0x1 bytes), align: 0 + Segment part 4. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCH 000000BB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F2 - 000000F2 (0x1 bytes), align: 0 + Segment part 5. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCFG 000000F2 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000996 - 00000996 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: HalAdcInit + LOCAL ADDRESS + ===== ======= + adcRef 00000996 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B231 - 0001B239 (0x9 bytes), align: 0 + Segment part 12. Intra module refs: HalAdcInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcInit 0001B231 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B23A - 0001B241 (0x8 bytes), align: 0 + Segment part 14. Intra module refs: HalAdcInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001B23A + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012C9 - 000012CE (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcInit::?relay 000012C9 HalDriverInit (hal_drivers) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_aes.r51 + PROGRAM MODULE, NAME : hal_aes + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B3 - 000000B3 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: LL_ENC_DecryptMsg (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_LoadEmptyIV (ll_enc) + LL_ENC_LoadKey (ll_enc) + LL_ENC_StartAES (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + ENCCS 000000B3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D1 - 000000D1 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + halDmaIsr (hal_dma) + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAIRQ 000000D1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D6 - 000000D6 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAARM 000000D6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B17E - 0001B1B5 (0x38 bytes), align: 0 + Segment part 10. Intra module refs: aesDmaInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + aesDmaInit 0001B17E + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B1B6 - 0001B1BC (0x7 bytes), align: 0 + Segment part 16. Intra module refs: HalAesInit + aesDmaInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001B1B6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B1BD - 0001B1C6 (0xa bytes), align: 0 + Segment part 20. Intra module refs: HalAesInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAesInit 0001B1BD + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012CF - 000012D4 (0x6 bytes), align: 0 + Segment part 11. Intra module refs: HalAesInit + ENTRY ADDRESS REF BY + ===== ======= ====== + aesDmaInit::?relay 000012CF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012D5 - 000012DA (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAesInit::?relay 000012D5 HalDriverInit (hal_drivers) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_crc.r51 + PROGRAM MODULE, NAME : hal_crc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000BC - 000000BC (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + RNDL 000000BC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BD - 000000BD (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + RNDH 000000BD + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_dma.r51 + PROGRAM MODULE, NAME : hal_dma + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B8 - 000000B8 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalDmaInit + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IEN1 000000B8 + LOCAL ADDRESS + ===== ======= + IEN1 000000B8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C0 - 000000C0 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: halDmaIsr + halSleepTimerIsr (hal_sleep) + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IRCON 000000C0 + LOCAL ADDRESS + ===== ======= + IRCON 000000C0 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D2 - 000000D2 (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA1CFGL 000000D2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D3 - 000000D3 (0x1 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA1CFGH 000000D3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D4 - 000000D4 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA0CFGL 000000D4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D5 - 000000D5 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA0CFGH 000000D5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000997 - 0000099E (0x8 bytes), align: 0 + Segment part 15. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + dmaCh0 00000997 HalFlashWrite (hal_flash) + LL_ENC_InitDMA0 (ll_enc) + LL_ENC_MoveData (ll_enc) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000099F - 000009BE (0x20 bytes), align: 0 + Segment part 16. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + dmaCh1234 0000099F HalUARTInitDMA (hal_uart) + LL_ENC_InitAesDMA (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + Segment part 53 (ll_enc) + aesDmaInit (hal_aes) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B21E - 0001B230 (0x13 bytes), align: 0 + Segment part 17. Intra module refs: HalDmaInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDmaInit 0001B21E + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A4E - 00002A73 (0x26 bytes), align: 0 + Segment part 19. Intra module refs: halDmaIsr::??INTVEC 67 + ENTRY ADDRESS REF BY + ===== ======= ====== + halDmaIsr 00002A4E + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000045 (0x46 bytes), align: 0 + Segment part 9. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halDmaIsr::??INTVEC 67 + 00000043 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012DB - 000012E0 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDmaInit::?relay 000012DB HalDriverInit (hal_drivers) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_drivers.r51 + PROGRAM MODULE, NAME : hal_drivers + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000009BF - 000009BF (0x1 bytes), align: 0 + Segment part 6. Intra module refs: Hal_Init + Hal_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_TaskID 000009BF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F85 - 00017F8D (0x9 bytes), align: 0 + Segment part 7. Intra module refs: Hal_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_Init 00017F85 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F8E - 00017F94 (0x7 bytes), align: 0 + Segment part 9. Intra module refs: HalDriverInit + Hal_Init + Hal_ProcessPoll + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00017F8E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F95 - 00017FA6 (0x12 bytes), align: 0 + Segment part 10. Intra module refs: HalDriverInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDriverInit 00017F95 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FA7 - 00017FEA (0x44 bytes), align: 0 + Segment part 12. Intra module refs: Hal_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessEvent 00017FA7 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FEB - 00017FF3 (0x9 bytes), align: 0 + Segment part 14. Intra module refs: Hal_ProcessPoll::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessPoll 00017FEB + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012E1 - 000012E6 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_Init::?relay 000012E1 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012E7 - 000012EC (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDriverInit::?relay 000012E7 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012ED - 000012F2 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessEvent::?relay + 000012ED tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012F3 - 000012F8 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessPoll::?relay + 000012F3 osal_run_system (OSAL) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_flash.r51 + PROGRAM MODULE, NAME : hal_flash + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000C7 - 000000C7 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalFlashRead + __low_level_init (hal_startup) + ENTRY ADDRESS REF BY + ===== ======= ====== + MEMCTR 000000C7 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AABE - 0001AB42 (0x85 bytes), align: 0 + Segment part 10. Intra module refs: HalFlashRead::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashRead 0001AABE + XSTACK = 00000002 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB43 - 0001ABA6 (0x64 bytes), align: 0 + Segment part 12. Intra module refs: HalFlashWrite::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashWrite 0001AB43 + XSTACK = 00000002 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ABA7 - 0001ABBF (0x19 bytes), align: 0 + Segment part 14. Intra module refs: HalFlashErase::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashErase 0001ABA7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012F9 - 000012FE (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashRead::?relay 000012F9 LL_Init (ll) + Segment part 50 (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012FF - 00001304 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashWrite::?relay 000012FF llFindTxPowerSettings (ll_common) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001305 - 0000130A (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashErase::?relay 00001305 erasePage (osal_snv) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_key.r51 + PROGRAM MODULE, NAME : hal_key + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FF7 - 00017FF9 (0x3 bytes), align: 0 + Segment part 8. Intra module refs: HalKeyConfig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyConfig 00017FF7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000130B - 00001310 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyConfig::?relay 0000130B ?Subroutine2 (OnBoard) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_led.r51 + PROGRAM MODULE, NAME : hal_led + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000009C0 - 000009C0 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: HalLedSet + LOCAL ADDRESS + ===== ======= + HalLedState 000009C0 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FF0 - 00007FFF (0x10 bytes), align: 0 + Segment part 9. Intra module refs: HalLedSet::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalLedSet 00007FF0 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001311 - 00001316 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalLedSet::?relay 00001311 InitBoard (OnBoard) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_sleep.r51 + PROGRAM MODULE, NAME : hal_sleep + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000087 - 00000087 (0x1 bytes), align: 0 + Segment part 1. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + PCON 00000087 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000095 - 00000095 (0x1 bytes), align: 0 + Segment part 2. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST0 00000095 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000096 - 00000096 (0x1 bytes), align: 0 + Segment part 3. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST1 00000096 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000097 - 00000097 (0x1 bytes), align: 0 + Segment part 4. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST2 00000097 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009A - 0000009A (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalUARTOpenDMA (hal_uart) + HalUARTWriteDMA (hal_uart) + halUart1TxIsr (hal_uart) + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + IEN2 0000009A + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AD - 000000AD (0x1 bytes), align: 0 + Segment part 7. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + STLOAD 000000AD + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A74 - 00002A8C (0x19 bytes), align: 0 + Segment part 41. Intra module refs: halSleepTimerIsr::??INTVEC 43 + ENTRY ADDRESS REF BY + ===== ======= ====== + halSleepTimerIsr 00002A74 + interrupt function + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 0000002D (0x2e bytes), align: 0 + Segment part 11. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halSleepTimerIsr::??INTVEC 43 + 0000002B + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_startup.r51 + PROGRAM MODULE, NAME : hal_startup + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000086 - 00000090 (0xb bytes), align: 0 + Segment part 7. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + __low_level_init 00000086 __low_level_init_call (?cmain) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_timer.r51 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_uart.r51 + PROGRAM MODULE, NAME : hal_uart + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000008A - 0000008A (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + P1IFG 0000008A + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000008C - 0000008C (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + PICTL 0000008C + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000008D - 0000008D (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + P1IEN 0000008D + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000090 - 00000090 (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + llSetRxGain (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P1 00000090 + LOCAL ADDRESS + ===== ======= + P1 00000090 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E8 - 000000E8 (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: HalUARTOpenDMA + halUart1TxIsr + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IRCON2 000000E8 + LOCAL ADDRESS + ===== ======= + IRCON2 000000E8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F1 - 000000F1 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + PERCFG 000000F1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F4 - 000000F4 (0x1 bytes), align: 0 + Segment part 11. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + llExtendRfRange (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + P1SEL 000000F4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F8 - 000000F8 (0x1 bytes), align: 0 + Segment part 12. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_U1CSR 000000F8 + LOCAL ADDRESS + ===== ======= + U1CSR 000000F8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F9 - 000000F9 (0x1 bytes), align: 0 + Segment part 13. ROOT. Intra module refs: halUart1TxIsr + ENTRY ADDRESS REF BY + ===== ======= ====== + U1DBUF 000000F9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FA - 000000FA (0x1 bytes), align: 0 + Segment part 14. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + HalUARTRxAvailDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1BAUD 000000FA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FB - 000000FB (0x1 bytes), align: 0 + Segment part 15. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1UCR 000000FB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FC - 000000FC (0x1 bytes), align: 0 + Segment part 16. ROOT. Intra module refs: HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1GCR 000000FC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FE - 000000FE (0x1 bytes), align: 0 + Segment part 17. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + llExtendRfRange (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + P1DIR 000000FE + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FF - 000000FF (0x1 bytes), align: 0 + Segment part 18. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + P2DIR 000000FF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000009C1 - 00000C53 (0x293 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine3 + ?Subroutine4 + ?Subroutine5 + ?Subroutine7 + ?Subroutine8 + HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + HalUARTRxAvailDMA + HalUARTWriteDMA + halUart1TxIsr + LOCAL ADDRESS + ===== ======= + dmaCfg 000009C1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C54 - 00000C55 (0x2 bytes), align: 0 + Segment part 26. Intra module refs: HalUARTPollDMA + HalUARTRxAvailDMA + LOCAL ADDRESS + ===== ======= + uartRxBug 00000C54 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001783C - 000178C9 (0x8e bytes), align: 0 + Segment part 27. Intra module refs: HalUARTInitDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTInitDMA 0001783C + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000178CA - 000178CD (0x4 bytes), align: 0 + Segment part 29. Intra module refs: HalUARTReadDMA + HalUARTRxAvailDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000178CA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000178CE - 000178D2 (0x5 bytes), align: 0 + Segment part 30. Intra module refs: ?Subroutine0 + HalUARTInitDMA + HalUARTPollDMA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000178D3 - 00017977 (0xa5 bytes), align: 0 + Segment part 31. Intra module refs: HalUARTOpenDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTOpenDMA 000178D3 + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017978 - 0001797E (0x7 bytes), align: 0 + Segment part 33. Intra module refs: HalUARTInit + HalUARTOpenDMA + HalUARTPoll + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00017978 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001797F - 000179F1 (0x73 bytes), align: 0 + Segment part 34. Intra module refs: HalUARTReadDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTReadDMA 0001797F + calls direct + XSTACK = 00000009 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000179F2 - 000179F8 (0x7 bytes), align: 0 + Segment part 36. Intra module refs: HalUARTReadDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine5 000179F2 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000179F9 - 00017A08 (0x10 bytes), align: 0 + Segment part 37. Intra module refs: ?Subroutine3 + ?Subroutine5 + LOCAL ADDRESS + ===== ======= + ?Subroutine8 000179F9 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017A09 - 00017AA4 (0x9c bytes), align: 0 + Segment part 38. Intra module refs: HalUARTWriteDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTWriteDMA 00017A09 + XSTACK = 00000009 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017AA5 - 00017B59 (0xb5 bytes), align: 0 + Segment part 40. Intra module refs: HalUARTPollDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTPollDMA 00017AA5 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017B5A - 00017B5F (0x6 bytes), align: 0 + Segment part 42. Intra module refs: HalUARTOpenDMA + HalUARTPollDMA + HalUARTRxAvailDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00017B5A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017B60 - 00017B71 (0x12 bytes), align: 0 + Segment part 43. Intra module refs: HalUARTPollDMA + HalUARTReadDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00017B60 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017B72 - 00017B7B (0xa bytes), align: 0 + Segment part 44. Intra module refs: ?Subroutine4 + HalUARTPollDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine9 00017B72 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017B7C - 00017B8A (0xf bytes), align: 0 + Segment part 45. Intra module refs: HalUARTPollDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00017B7C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017B8B - 00017C55 (0xcb bytes), align: 0 + Segment part 46. Intra module refs: HalUARTRxAvailDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTRxAvailDMA 00017B8B + calls direct + XSTACK = 0000000A ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017C56 - 00017C6B (0x16 bytes), align: 0 + Segment part 48. Intra module refs: HalUARTPollDMA + HalUARTRxAvailDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine7 00017C56 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A8D - 00002AF6 (0x6a bytes), align: 0 + Segment part 70. Intra module refs: halUart1TxIsr::??INTVEC 115 + ENTRY ADDRESS REF BY + ===== ======= ====== + halUart1TxIsr 00002A8D + interrupt function + ISTACK = 00000000 ( 00000008 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017C6C - 00017C75 (0xa bytes), align: 0 + Segment part 51. Intra module refs: HalUARTInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTInit 00017C6C + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017C76 - 00017C88 (0x13 bytes), align: 0 + Segment part 53. Intra module refs: HalUARTOpen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTOpen 00017C76 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017C89 - 00017C9D (0x15 bytes), align: 0 + Segment part 55. Intra module refs: HalUARTRead::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTRead 00017C89 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017C9E - 00017CA2 (0x5 bytes), align: 0 + Segment part 57. Intra module refs: HalUARTOpen + HalUARTRead + HalUARTWrite + HalUARTWriteDMA + Hal_UART_RxBufLen + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00017C9E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017CA3 - 00017CB9 (0x17 bytes), align: 0 + Segment part 58. Intra module refs: HalUARTWrite::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTWrite 00017CA3 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017CBA - 00017CC3 (0xa bytes), align: 0 + Segment part 64. Intra module refs: HalUARTPoll::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTPoll 00017CBA + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017CC4 - 00017CDA (0x17 bytes), align: 0 + Segment part 66. Intra module refs: Hal_UART_RxBufLen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_UART_RxBufLen 00017CC4 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017CDB - 00017CDD (0x3 bytes), align: 0 + Segment part 68. Intra module refs: HalUARTIsrDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTIsrDMA 00017CDB + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000075 (0x76 bytes), align: 0 + Segment part 19. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halUart1TxIsr::??INTVEC 115 + 00000073 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001317 - 0000131C (0x6 bytes), align: 0 + Segment part 28. Intra module refs: HalUARTInit + LOCAL ADDRESS + ===== ======= + HalUARTInitDMA::?relay + 00001317 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000131D - 00001322 (0x6 bytes), align: 0 + Segment part 32. Intra module refs: HalUARTOpen + LOCAL ADDRESS + ===== ======= + HalUARTOpenDMA::?relay + 0000131D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001323 - 00001328 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: HalUARTRead + LOCAL ADDRESS + ===== ======= + HalUARTReadDMA::?relay + 00001323 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001329 - 0000132E (0x6 bytes), align: 0 + Segment part 39. Intra module refs: HalUARTWrite + LOCAL ADDRESS + ===== ======= + HalUARTWriteDMA::?relay + 00001329 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000132F - 00001334 (0x6 bytes), align: 0 + Segment part 41. Intra module refs: HalUARTPoll + LOCAL ADDRESS + ===== ======= + HalUARTPollDMA::?relay + 0000132F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001335 - 0000133A (0x6 bytes), align: 0 + Segment part 47. Intra module refs: HalUARTPollDMA + HalUARTReadDMA + Hal_UART_RxBufLen + LOCAL ADDRESS + ===== ======= + HalUARTRxAvailDMA::?relay + 00001335 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000133B - 00001340 (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTInit::?relay 0000133B HalDriverInit (hal_drivers) + WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001341 - 00001346 (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTOpen::?relay 00001341 WIMU_openUART (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001347 - 0000134C (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTRead::?relay 00001347 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000134D - 00001352 (0x6 bytes), align: 0 + Segment part 59. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTWrite::?relay 0000134D WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001353 - 00001358 (0x6 bytes), align: 0 + Segment part 65. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTPoll::?relay 00001353 Hal_ProcessPoll (hal_drivers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001359 - 0000135E (0x6 bytes), align: 0 + Segment part 67. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_UART_RxBufLen::?relay + 00001359 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000135F - 00001364 (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTIsrDMA::?relay 0000135F halDmaIsr (hal_dma) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\npi.r51 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_bufmgr.r51 + PROGRAM MODULE, NAME : osal_bufmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000C56 - 00000C57 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: ?Subroutine4 + bm_desc_from_payload + osal_bm_alloc + osal_bm_free + LOCAL ADDRESS + ===== ======= + bm_list_ptr 00000C56 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A557 - 0001A5A8 (0x52 bytes), align: 0 + Segment part 7. Intra module refs: osal_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_alloc 0001A557 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A5A9 - 0001A61B (0x73 bytes), align: 0 + Segment part 9. Intra module refs: osal_bm_free::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_free 0001A5A9 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A61C - 0001A66D (0x52 bytes), align: 0 + Segment part 11. Intra module refs: osal_bm_adjust_header::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_adjust_header 0001A61C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A66E - 0001A672 (0x5 bytes), align: 0 + Segment part 13. Intra module refs: osal_bm_adjust_header + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A66E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A673 - 0001A688 (0x16 bytes), align: 0 + Segment part 16. Intra module refs: osal_bm_adjust_header + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001A673 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A689 - 0001A6CD (0x45 bytes), align: 0 + Segment part 17. Intra module refs: bm_desc_from_payload::?relay + LOCAL ADDRESS + ===== ======= + bm_desc_from_payload 0001A689 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6CE - 0001A6D3 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: bm_desc_from_payload + osal_bm_free + LOCAL ADDRESS + ===== ======= + ?Subroutine3 0001A6CE + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6D4 - 0001A6E5 (0x12 bytes), align: 0 + Segment part 20. Intra module refs: bm_desc_from_payload + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001A6D4 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6E6 - 0001A6E8 (0x3 bytes), align: 0 + Segment part 21. Intra module refs: osal_bm_alloc + osal_bm_free + LOCAL ADDRESS + ===== ======= + ?Subroutine4 0001A6E6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6E9 - 0001A6EE (0x6 bytes), align: 0 + Segment part 22. Intra module refs: ?Subroutine1 + ?Subroutine4 + osal_bm_free + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001365 - 0000136A (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_alloc::?relay 00001365 HCI_bm_alloc (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000136B - 00001370 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_free::?relay 0000136B LL_RxDataCompleteCback (hci_data) + attSendMsg (att_util) + gattProcessRxData (gatt_task) + hciTxDataBufferReset (hci_data) + l2capProcessRxData (l2cap_task) + l2capSendCmd (l2cap_util) + smProcessOSALMsg (sm_task) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001371 - 00001376 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_adjust_header::?relay + 00001371 L2CAP_bm_alloc (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capParsePacket (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001377 - 0000137C (0x6 bytes), align: 0 + Segment part 18. Intra module refs: ?Subroutine2 + LOCAL ADDRESS + ===== ======= + bm_desc_from_payload::?relay + 00001377 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_cbtimer.r51 + PROGRAM MODULE, NAME : osal_cbtimer + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 0000112E - 0000112F (0x2 bytes), align: 0 + Segment part 6. Intra module refs: osal_CbTimerStart + osal_CbTimerStop + ENTRY ADDRESS REF BY + ===== ======= ====== + baseTaskID 0000112E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C58 - 00000C93 (0x3c bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine1 + osal_CbTimerStop + ENTRY ADDRESS REF BY + ===== ======= ====== + cbTimers 00000C58 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A85B - 0001A91F (0xc5 bytes), align: 0 + Segment part 13. Intra module refs: osal_CbTimerStart::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStart 0001A85B + calls direct + XSTACK = 00000004 ( 00000019 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A920 - 0001A92C (0xd bytes), align: 0 + Segment part 15. Intra module refs: osal_CbTimerStart + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001A920 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A92D - 0001A92E (0x2 bytes), align: 0 + Segment part 16. Intra module refs: osal_CbTimerStart + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A92D + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A92F - 0001A936 (0x8 bytes), align: 0 + Segment part 17. Intra module refs: ?Subroutine0 + osal_CbTimerStop + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A937 - 0001A9A8 (0x72 bytes), align: 0 + Segment part 20. Intra module refs: osal_CbTimerStop::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStop 0001A937 + calls direct + XSTACK = 00000000 ( 0000000B ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043B - 0000043C (0x2 bytes), align: 0 + Segment part 7. Intra module refs: baseTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000137D - 00001382 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStart::?relay + 0000137D gattStartTimer (gatt_task) + l2capSendReq (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001383 - 00001388 (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStop::?relay + 00001383 gattStopTimer (gatt_task) + l2capStopTimer (l2cap_util) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_snv.r51 + PROGRAM MODULE, NAME : osal_snv + + SEGMENTS IN THE MODULE + ====================== +BLENV_ADDRESS_SPACE + Relative segment, address: CODE 0001E800 - 0001F7FF (0x1000 bytes), align: 0 + Segment part 6. Intra module refs: activePg + ENTRY ADDRESS REF BY + ===== ======= ====== + _nvBuf 0001E800 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C94 - 00000C94 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: ?Subroutine11 + ?Subroutine12 + Segment part 48 + initNV + setActivePage + setXferPage + LOCAL ADDRESS + ===== ======= + activePg 00000C94 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C95 - 00000C96 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine12 + compactPage + findOffset + initNV + osal_snv_compact + osal_snv_write + LOCAL ADDRESS + ===== ======= + pgOff 00000C95 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C97 - 00000C97 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: compactPage + erasePage + initNV + osal_snv_write + setActivePage + verifyWordM + writeItem + writeWord + LOCAL ADDRESS + ===== ======= + failF 00000C97 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000147FB - 000148C6 (0xcc bytes), align: 0 + Segment part 14. Intra module refs: initNV::?relay + LOCAL ADDRESS + ===== ======= + initNV 000147FB + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148C7 - 00014907 (0x41 bytes), align: 0 + Segment part 16. Intra module refs: setActivePage::?relay + LOCAL ADDRESS + ===== ======= + setActivePage 000148C7 + calls direct + XSTACK = 0000001E ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014908 - 0001493A (0x33 bytes), align: 0 + Segment part 18. Intra module refs: setXferPage::?relay + LOCAL ADDRESS + ===== ======= + setXferPage 00014908 + calls direct + XSTACK = 00000011 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001493B - 00014941 (0x7 bytes), align: 0 + Segment part 20. Intra module refs: osal_snv_init + setXferPage + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001493B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014942 - 00014991 (0x50 bytes), align: 0 + Segment part 21. Intra module refs: erasePage::?relay + LOCAL ADDRESS + ===== ======= + erasePage 00014942 + calls direct + XSTACK = 0000001E ( 0000000F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014992 - 00014995 (0x4 bytes), align: 0 + Segment part 23. Intra module refs: cleanErasedPage + erasePage + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00014992 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014996 - 00014997 (0x2 bytes), align: 0 + Segment part 24. Intra module refs: findItem + findOffset + initNV + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00014996 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014998 - 0001499A (0x3 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine0 + ?Subroutine3 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001499B - 0001499F (0x5 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + osal_snv_read + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000149A0 - 000149E7 (0x48 bytes), align: 0 + Segment part 27. Intra module refs: cleanErasedPage::?relay + LOCAL ADDRESS + ===== ======= + cleanErasedPage 000149A0 + calls direct + XSTACK = 00000010 ( 0000000F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000149E8 - 000149F3 (0xc bytes), align: 0 + Segment part 29. Intra module refs: cleanErasedPage + erasePage + LOCAL ADDRESS + ===== ======= + ?Subroutine9 000149E8 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000149F4 - 00014A51 (0x5e bytes), align: 0 + Segment part 30. Intra module refs: findOffset::?relay + LOCAL ADDRESS + ===== ======= + findOffset 000149F4 + calls direct + XSTACK = 00000010 ( 00000012 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014A52 - 00014ADC (0x8b bytes), align: 0 + Segment part 32. Intra module refs: findItem::?relay + LOCAL ADDRESS + ===== ======= + findItem 00014A52 + calls direct + XSTACK = 0000001E ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014ADD - 00014AE7 (0xb bytes), align: 0 + Segment part 34. Intra module refs: compactPage + findItem + findOffset + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00014ADD + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014AE8 - 00014BD6 (0xef bytes), align: 0 + Segment part 35. Intra module refs: writeItem::?relay + LOCAL ADDRESS + ===== ======= + writeItem 00014AE8 + calls direct + XSTACK = 00000015 ( 0000001A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014BD7 - 00014BDA (0x4 bytes), align: 0 + Segment part 37. Intra module refs: writeItem + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00014BD7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014BDB - 00014BEF (0x15 bytes), align: 0 + Segment part 38. Intra module refs: ?Subroutine4 + writeItem + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014BF0 - 00014D70 (0x181 bytes), align: 0 + Segment part 39. Intra module refs: compactPage::?relay + LOCAL ADDRESS + ===== ======= + compactPage 00014BF0 + calls direct + XSTACK = 00000011 ( 00000020 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D71 - 00014D79 (0x9 bytes), align: 0 + Segment part 41. Intra module refs: compactPage + LOCAL ADDRESS + ===== ======= + ?Subroutine7 00014D71 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D7A - 00014DFC (0x83 bytes), align: 0 + Segment part 42. Intra module refs: verifyWordM::?relay + LOCAL ADDRESS + ===== ======= + verifyWordM 00014D7A + calls direct + XSTACK = 00000019 ( 00000016 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014DFD - 00014DFF (0x3 bytes), align: 0 + Segment part 44. Intra module refs: osal_snv_write + verifyWordM + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00014DFD + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E00 - 00014E04 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: ?Subroutine2 + osal_snv_compact + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E05 - 00014E0B (0x7 bytes), align: 0 + Segment part 46. Intra module refs: findOffset + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine5 00014E05 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E0C - 00014E0C (0x1 bytes), align: 0 + Segment part 47. Intra module refs: ?Subroutine5 + compactPage + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E0D - 00014E10 (0x4 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + osal_snv_read + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E11 - 00014E11 (0x1 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + initNV + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E12 - 00014E17 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + cleanErasedPage + compactPage + erasePage + findItem + verifyWordM + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E18 - 00014E7E (0x67 bytes), align: 0 + Segment part 51. Intra module refs: writeWord::?relay + LOCAL ADDRESS + ===== ======= + writeWord 00014E18 + calls direct + XSTACK = 0000001E ( 00000011 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E7F - 00014E91 (0x13 bytes), align: 0 + Segment part 53. Intra module refs: osal_snv_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_init 00014E7F + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E92 - 00014F7B (0xea bytes), align: 0 + Segment part 55. Intra module refs: osal_snv_write::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_write 00014E92 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F7C - 00014F85 (0xa bytes), align: 0 + Segment part 57. Intra module refs: compactPage + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00014F7C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F86 - 00014FB9 (0x34 bytes), align: 0 + Segment part 58. Intra module refs: osal_snv_read::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_read 00014F86 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014FBA - 00014FC0 (0x7 bytes), align: 0 + Segment part 60. Intra module refs: osal_snv_read + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00014FBA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014FC1 - 00014FCE (0xe bytes), align: 0 + Segment part 61. Intra module refs: ?Subroutine6 + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00014FC1 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014FCF - 00015024 (0x56 bytes), align: 0 + Segment part 62. Intra module refs: osal_snv_compact::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_compact 00014FCF + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015025 - 00015030 (0xc bytes), align: 0 + Segment part 64. Intra module refs: osal_snv_compact + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00015025 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F5A - 00008F5D (0x4 bytes), align: 0 + Segment part 10. Intra module refs: initNV + setActivePage + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_100000 00008F5A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F56 - 00008F59 (0x4 bytes), align: 0 + Segment part 13. Intra module refs: osal_snv_compact + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_64 00008F56 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001389 - 0000138E (0x6 bytes), align: 0 + Segment part 15. Intra module refs: osal_snv_init + LOCAL ADDRESS + ===== ======= + initNV::?relay 00001389 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000138F - 00001394 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: compactPage + initNV + LOCAL ADDRESS + ===== ======= + setActivePage::?relay 0000138F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001395 - 0000139A (0x6 bytes), align: 0 + Segment part 19. Intra module refs: ?Subroutine11 + LOCAL ADDRESS + ===== ======= + setXferPage::?relay 00001395 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000139B - 000013A0 (0x6 bytes), align: 0 + Segment part 22. Intra module refs: cleanErasedPage + compactPage + initNV + LOCAL ADDRESS + ===== ======= + erasePage::?relay 0000139B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013A1 - 000013A6 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: initNV + LOCAL ADDRESS + ===== ======= + cleanErasedPage::?relay + 000013A1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013A7 - 000013AC (0x6 bytes), align: 0 + Segment part 31. Intra module refs: initNV + LOCAL ADDRESS + ===== ======= + findOffset::?relay 000013A7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013AD - 000013B2 (0x6 bytes), align: 0 + Segment part 33. Intra module refs: ?Subroutine6 + compactPage + LOCAL ADDRESS + ===== ======= + findItem::?relay 000013AD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013B3 - 000013B8 (0x6 bytes), align: 0 + Segment part 36. Intra module refs: osal_snv_write + LOCAL ADDRESS + ===== ======= + writeItem::?relay 000013B3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013B9 - 000013BE (0x6 bytes), align: 0 + Segment part 40. Intra module refs: ?Subroutine11 + initNV + LOCAL ADDRESS + ===== ======= + compactPage::?relay 000013B9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013BF - 000013C4 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: writeItem + writeWord + LOCAL ADDRESS + ===== ======= + verifyWordM::?relay 000013BF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013C5 - 000013CA (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 38 + compactPage + setActivePage + setXferPage + writeItem + LOCAL ADDRESS + ===== ======= + writeWord::?relay 000013C5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013CB - 000013D0 (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_init::?relay 000013CB main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013D1 - 000013D6 (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_write::?relay + 000013D1 ?Subroutine17 (gapbondmgr) + ?Subroutine22 (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013D7 - 000013DC (0x6 bytes), align: 0 + Segment part 59. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_read::?relay 000013D7 GAPBondMgr_LinkEst (gapbondmgr) + GAPRole_Init (peripheral) + Segment part 93 (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013DD - 000013E2 (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_compact::?relay + 000013DD GAPBondMgr_ProcessGAPMsg (gapbondmgr) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F5A - 00008F5D (0x4 bytes), align: 0 + Segment part 65. Intra module refs: __Constant_100000 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F56 - 00008F59 (0x4 bytes), align: 0 + Segment part 68. Intra module refs: __Constant_64 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\peripheral.r51 + PROGRAM MODULE, NAME : peripheral + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000C98 - 00000C98 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: ?Subroutine17 + GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + GAPRole_StartDevice + GAPRole_TerminateConnection + Segment part 55 + Segment part 99 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_TaskID 00000C98 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C99 - 00000C99 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + GAPRole_StartDevice + GAPRole_TerminateConnection + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapRole_state 00000C99 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C9A - 00000C9A (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAPRole_Init + GAPRole_StartDevice + LOCAL ADDRESS + ===== ======= + gapRole_profileRole 00000C9A + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C9B - 00000CAA (0x10 bytes), align: 0 + Segment part 9. Intra module refs: GAPRole_Init + GAPRole_SetParameter + GAPRole_StartDevice + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_IRK 00000C9B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CAB - 00000CBA (0x10 bytes), align: 0 + Segment part 10. Intra module refs: GAPRole_Init + GAPRole_SetParameter + GAPRole_StartDevice + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_SRK 00000CAB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CBB - 00000CBE (0x4 bytes), align: 0 + Segment part 11. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + GAPRole_StartDevice + LOCAL ADDRESS + ===== ======= + gapRole_signCounter 00000CBB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CBF - 00000CC4 (0x6 bytes), align: 0 + Segment part 12. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_bdAddr 00000CBF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001130 - 00001130 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvEnabled 00001130 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001131 - 00001132 (0x2 bytes), align: 0 + Segment part 15. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertOffTime 00001131 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001133 - 00001133 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertDataLen 00001133 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001134 - 00001152 (0x1f bytes), align: 0 + Segment part 19. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertData 00001134 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CC5 - 00000CC5 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ScanRspDataLen + 00000CC5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CC6 - 00000CE4 (0x1f bytes), align: 0 + Segment part 22. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ScanRspData 00000CC6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CE5 - 00000CE5 (0x1 bytes), align: 0 + Segment part 23. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvEventType 00000CE5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CE6 - 00000CE6 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvDirectType 00000CE6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CE7 - 00000CEC (0x6 bytes), align: 0 + Segment part 25. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvDirectAddr 00000CE7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CED - 00000CED (0x1 bytes), align: 0 + Segment part 26. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvChanMap 00000CED + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CEE - 00000CEE (0x1 bytes), align: 0 + Segment part 27. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvFilterPolicy + 00000CEE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001153 - 00001154 (0x2 bytes), align: 0 + Segment part 28. Intra module refs: ?Subroutine13 + GAPRole_Init + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ConnectionHandle + 00001153 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CEF - 00000CF0 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_RSSIReadRate 00000CEF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CF1 - 00000CF6 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ConnectedDevAddr + 00000CF1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CF7 - 00000CF7 (0x1 bytes), align: 0 + Segment part 32. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ParamUpdateEnable + 00000CF7 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001155 - 00001156 (0x2 bytes), align: 0 + Segment part 33. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_MinConnInterval + 00001155 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001157 - 00001158 (0x2 bytes), align: 0 + Segment part 35. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_MaxConnInterval + 00001157 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CF8 - 00000CF9 (0x2 bytes), align: 0 + Segment part 37. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_SlaveLatency 00000CF8 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001159 - 0000115A (0x2 bytes), align: 0 + Segment part 38. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_TimeoutMultiplier + 00001159 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CFA - 00000CFB (0x2 bytes), align: 0 + Segment part 40. Intra module refs: ?Subroutine8 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnInterval 00000CFA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CFC - 00000CFD (0x2 bytes), align: 0 + Segment part 41. Intra module refs: ?Subroutine9 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnSlaveLatency + 00000CFC + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CFE - 00000CFF (0x2 bytes), align: 0 + Segment part 42. Intra module refs: ?Subroutine10 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnTimeout 00000CFE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D00 - 00000D00 (0x1 bytes), align: 0 + Segment part 43. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessOSALMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + paramUpdateNoSuccessOption + 00000D00 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D01 - 00000D02 (0x2 bytes), align: 0 + Segment part 44. Intra module refs: ?Subroutine5 + GAPRole_StartDevice + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + pGapRoles_AppCGs 00000D01 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D03 - 00000D04 (0x2 bytes), align: 0 + Segment part 45. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + pGapRoles_ParamUpdateCB + 00000D03 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C82 - 00010F82 (0x301 bytes), align: 0 + Segment part 47. Intra module refs: GAPRole_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SetParameter 00010C82 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F83 - 00010F84 (0x2 bytes), align: 0 + Segment part 49. Intra module refs: ?Subroutine20 + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine24 00010F83 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F85 - 00010F8A (0x6 bytes), align: 0 + Segment part 50. Intra module refs: ?Subroutine21 + ?Subroutine24 + GAPRole_SendUpdateParam + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F8B - 00010F96 (0xc bytes), align: 0 + Segment part 51. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine20 00010F8B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F97 - 00010FA3 (0xd bytes), align: 0 + Segment part 52. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00010F97 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FA4 - 00010FA8 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: GAPRole_SendUpdateParam + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00010FA4 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FA9 - 00010FAA (0x2 bytes), align: 0 + Segment part 54. Intra module refs: ?Subroutine6 + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FAB - 00010FB3 (0x9 bytes), align: 0 + Segment part 55. Intra module refs: Segment part 54 + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FB4 - 00010FB6 (0x3 bytes), align: 0 + Segment part 61. Intra module refs: GAPRole_ProcessEvent + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00010FB4 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FB7 - 00010FBB (0x5 bytes), align: 0 + Segment part 62. Intra module refs: ?Subroutine0 + GAPRole_SendUpdateParam + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FBC - 0001100B (0x50 bytes), align: 0 + Segment part 63. Intra module refs: GAPRole_StartDevice::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_StartDevice 00010FBC + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001100C - 00011012 (0x7 bytes), align: 0 + Segment part 67. Intra module refs: GAPRole_TerminateConnection + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001100C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011013 - 0001102F (0x1d bytes), align: 0 + Segment part 68. Intra module refs: GAPRole_TerminateConnection::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_TerminateConnection + 00011013 + calls direct + XSTACK = 00000016 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011030 - 000110AF (0x80 bytes), align: 0 + Segment part 70. Intra module refs: GAPRole_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_Init 00011030 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000110B0 - 0001121F (0x170 bytes), align: 0 + Segment part 72. Intra module refs: GAPRole_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_ProcessEvent 000110B0 + calls direct + XSTACK = 00000000 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011220 - 00011225 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine15 00011220 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011226 - 0001122B (0x6 bytes), align: 0 + Segment part 75. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00011226 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001122C - 000112FA (0xcf bytes), align: 0 + Segment part 76. Intra module refs: gapRole_ProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + gapRole_ProcessOSALMsg + 0001122C + calls direct + XSTACK = 00000016 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000112FB - 00011602 (0x308 bytes), align: 0 + Segment part 78. Intra module refs: gapRole_ProcessGAPMsg::?relay + LOCAL ADDRESS + ===== ======= + gapRole_ProcessGAPMsg 000112FB + calls direct + XSTACK = 0000000C ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011603 - 00011608 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine19 00011603 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011609 - 00011615 (0xd bytes), align: 0 + Segment part 81. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine17 00011609 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011616 - 00011618 (0x3 bytes), align: 0 + Segment part 82. Intra module refs: gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine14 00011616 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011619 - 0001161E (0x6 bytes), align: 0 + Segment part 83. Intra module refs: ?Subroutine14 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001161F - 00011621 (0x3 bytes), align: 0 + Segment part 84. Intra module refs: GAPRole_ProcessEvent + GAPRole_TerminateConnection + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine13 0001161F + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011622 - 00011627 (0x6 bytes), align: 0 + Segment part 85. Intra module refs: ?Subroutine13 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011628 - 00011633 (0xc bytes), align: 0 + Segment part 86. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00011628 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011634 - 0001163F (0xc bytes), align: 0 + Segment part 87. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine9 00011634 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011640 - 0001164B (0xc bytes), align: 0 + Segment part 88. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00011640 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001164C - 00011653 (0x8 bytes), align: 0 + Segment part 89. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine7 0001164C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011654 - 0001165E (0xb bytes), align: 0 + Segment part 90. Intra module refs: ?Subroutine7 + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine23 00011654 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001165F - 00011661 (0x3 bytes), align: 0 + Segment part 91. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine5 0001165F + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011662 - 00011667 (0x6 bytes), align: 0 + Segment part 92. Intra module refs: ?Subroutine5 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011668 - 00011734 (0xcd bytes), align: 0 + Segment part 93. Intra module refs: gapRole_startConnUpdate::?relay + LOCAL ADDRESS + ===== ======= + gapRole_startConnUpdate + 00011668 + calls direct + XSTACK = 00000016 ( 00000018 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011735 - 00011738 (0x4 bytes), align: 0 + Segment part 95. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00011735 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011739 - 0001173C (0x4 bytes), align: 0 + Segment part 96. Intra module refs: ?Subroutine11 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001173D - 00011742 (0x6 bytes), align: 0 + Segment part 97. Intra module refs: ?Subroutine10 + ?Subroutine8 + ?Subroutine9 + Segment part 92 + Segment part 96 + LOCAL ADDRESS + ===== ======= + ?Subroutine22 0001173D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011743 - 00011744 (0x2 bytes), align: 0 + Segment part 98. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00011743 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011745 - 00011751 (0xd bytes), align: 0 + Segment part 99. Intra module refs: ?Subroutine3 + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + gapRole_startConnUpdate + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011752 - 000117DE (0x8d bytes), align: 0 + Segment part 100. Intra module refs: GAPRole_SendUpdateParam::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SendUpdateParam + 00011752 + calls direct + XSTACK = 0000001A ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000117DF - 000117E7 (0x9 bytes), align: 0 + Segment part 102. Intra module refs: GAPRole_SendUpdateParam + LOCAL ADDRESS + ===== ======= + ?Subroutine21 000117DF + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043D - 0000043D (0x1 bytes), align: 0 + Segment part 14. Intra module refs: gapRole_AdvEnabled + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043E - 0000043F (0x2 bytes), align: 0 + Segment part 16. Intra module refs: gapRole_AdvertOffTime + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000440 - 00000440 (0x1 bytes), align: 0 + Segment part 18. Intra module refs: gapRole_AdvertDataLen + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000441 - 0000045F (0x1f bytes), align: 0 + Segment part 20. Intra module refs: gapRole_AdvertData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000460 - 00000461 (0x2 bytes), align: 0 + Segment part 29. Intra module refs: gapRole_ConnectionHandle + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000462 - 00000463 (0x2 bytes), align: 0 + Segment part 34. Intra module refs: gapRole_MinConnInterval + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000464 - 00000465 (0x2 bytes), align: 0 + Segment part 36. Intra module refs: gapRole_MaxConnInterval + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000466 - 00000467 (0x2 bytes), align: 0 + Segment part 39. Intra module refs: gapRole_TimeoutMultiplier + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013E3 - 000013E8 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SetParameter::?relay + 000013E3 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013E9 - 000013EE (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_StartDevice::?relay + 000013E9 WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013EF - 000013F4 (0x6 bytes), align: 0 + Segment part 69. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessOSALMsg + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_TerminateConnection::?relay + 000013EF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013F5 - 000013FA (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_Init::?relay 000013F5 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013FB - 00001400 (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_ProcessEvent::?relay + 000013FB tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001401 - 00001406 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAPRole_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapRole_ProcessOSALMsg::?relay + 00001401 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001407 - 0000140C (0x6 bytes), align: 0 + Segment part 79. Intra module refs: gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapRole_ProcessGAPMsg::?relay + 00001407 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000140D - 00001412 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: ?Subroutine6 + GAPRole_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapRole_startConnUpdate::?relay + 0000140D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001413 - 00001418 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: GAPRole_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SendUpdateParam::?relay + 00001413 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\st_util.r51 + PROGRAM MODULE, NAME : st_util + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B1C7 - 0001B1FF (0x39 bytes), align: 0 + Segment part 6. Intra module refs: utilExtractUuid16::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + utilExtractUuid16 0001B1C7 + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001419 - 0000141E (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + utilExtractUuid16::?relay + 00001419 Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + timeWriteAttrCB (timeservice) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\timeservice.r51 + PROGRAM MODULE, NAME : timeservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD9 - 00008FDA (0x2 bytes), align: 0 + Segment part 6. Intra module refs: timeService + ENTRY ADDRESS REF BY + ===== ======= ====== + timeServUUID 00008FD9 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDB - 00008FDC (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 15 + ENTRY ADDRESS REF BY + ===== ======= ====== + currentTimeUUID 00008FDB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D05 - 00000D06 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine2 + LOCAL ADDRESS + ===== ======= + Time_AppCBs 00000D05 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F8D - 00008F8F (0x3 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + timeService 00008F8D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000115B - 0000115B (0x1 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + currentTimeProps 0000115B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D07 - 00000D10 (0xa bytes), align: 0 + Segment part 12. Intra module refs: Segment part 15 + Time_GetParameter + Time_SetParameter + LOCAL ADDRESS + ===== ======= + currentTime 00000D07 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D11 - 00000D1C (0xc bytes), align: 0 + Segment part 13. Intra module refs: Segment part 15 + Time_AddService + Time_SetParameter + LOCAL ADDRESS + ===== ======= + currentTimeClientCharCfg + 00000D11 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000115C - 0000117B (0x20 bytes), align: 0 + Segment part 14. Intra module refs: Time_AddService + Time_SetParameter + LOCAL ADDRESS + ===== ======= + timeAttrTbl 0000115C + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EFA - 00008EFF (0x6 bytes), align: 0 + Segment part 16. Intra module refs: Time_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + timeCBs 00008EFA + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B45 - 00019B6F (0x2b bytes), align: 0 + Segment part 17. Intra module refs: Time_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_AddService 00019B45 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B70 - 00019B74 (0x5 bytes), align: 0 + Segment part 19. Intra module refs: Time_AddService + Time_GetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00019B70 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B75 - 00019B77 (0x3 bytes), align: 0 + Segment part 22. Intra module refs: timeWriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00019B75 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B78 - 00019B7E (0x7 bytes), align: 0 + Segment part 23. Intra module refs: ?Subroutine2 + timeReadAttrCB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B7F - 00019BDB (0x5d bytes), align: 0 + Segment part 24. Intra module refs: Time_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_SetParameter 00019B7F + calls direct + XSTACK = 00000000 ( 00000011 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BDC - 00019BE0 (0x5 bytes), align: 0 + Segment part 26. Intra module refs: Time_SetParameter + timeReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00019BDC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BE1 - 00019C07 (0x27 bytes), align: 0 + Segment part 27. Intra module refs: Time_GetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_GetParameter 00019BE1 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019C08 - 00019C80 (0x79 bytes), align: 0 + Segment part 29. Intra module refs: timeReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + timeReadAttrCB 00019C08 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019C81 - 00019C86 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: Time_GetParameter + Time_SetParameter + timeReadAttrCB + timeWriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00019C81 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019C87 - 00019D99 (0x113 bytes), align: 0 + Segment part 32. Intra module refs: timeWriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + timeWriteAttrCB 00019C87 + calls direct, is indirectly called + XSTACK = 00000004 ( 0000001A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019D9A - 00019DA3 (0xa bytes), align: 0 + Segment part 34. Intra module refs: timeReadAttrCB + timeWriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00019D9A + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000468 - 00000468 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: currentTimeProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000469 - 00000488 (0x20 bytes), align: 0 + Segment part 15. Intra module refs: timeAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000141F - 00001424 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_AddService::?relay + 0000141F WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001425 - 0000142A (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_SetParameter::?relay + 00001425 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000142B - 00001430 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + Time_GetParameter::?relay + 0000142B WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001431 - 00001436 (0x6 bytes), align: 0 + Segment part 30. Intra module refs: timeCBs + LOCAL ADDRESS + ===== ======= + timeReadAttrCB::?relay + 00001431 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001437 - 0000143C (0x6 bytes), align: 0 + Segment part 33. Intra module refs: timeCBs + LOCAL ADDRESS + ===== ======= + timeWriteAttrCB::?relay + 00001437 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD9 - 00008FDA (0x2 bytes), align: 0 + Segment part 37. Intra module refs: timeServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDB - 00008FDC (0x2 bytes), align: 0 + Segment part 38. Intra module refs: currentTimeUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F8D - 00008F8F (0x3 bytes), align: 0 + Segment part 39. Intra module refs: timeService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EFA - 00008EFF (0x6 bytes), align: 0 + Segment part 40. Intra module refs: timeCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu.r51 + PROGRAM MODULE, NAME : wimu + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000D1D - 00000D1D (0x1 bytes), align: 0 + Segment part 9. Intra module refs: WIMU_Init + WIMU_ProcessEvent + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_TaskID 00000D1D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000117C - 00001187 (0xc bytes), align: 0 + Segment part 10. Intra module refs: WIMU_Init + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + scanRspData 0000117C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001188 - 00001194 (0xd bytes), align: 0 + Segment part 12. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + advertData 00001188 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001195 - 00001199 (0x5 bytes), align: 0 + Segment part 14. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + attDeviceName 00001195 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000D1E - 00000E1D (0x100 bytes), align: 0 + Segment part 16. Intra module refs: ?Subroutine7 + WIMU_getEndOfFrame_Position + WIMU_openUART + WIMU_updateProfileSensors + ENTRY ADDRESS REF BY + ===== ======= ====== + rx_byte 00000D1E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E1E - 00000E1F (0x2 bytes), align: 0 + Segment part 17. Intra module refs: ?Subroutine7 + WIMU_getEndOfFrame_Position + WIMU_updateProfileSensors + ENTRY ADDRESS REF BY + ===== ======= ====== + rx_index 00000E1E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E20 - 00000E21 (0x2 bytes), align: 0 + Segment part 18. Intra module refs: WIMU_updateProfileSensors + ENTRY ADDRESS REF BY + ===== ======= ====== + rx_len 00000E20 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E22 - 00000E25 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: WIMU_ProcessEvent + LOCAL ADDRESS + ===== ======= + WIMU_PeripheralCBs 00000E22 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E26 - 00000E29 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: WIMU_ProcessEvent + LOCAL ADDRESS + ===== ======= + WIMU_BondMgrCBs 00000E26 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D44 - 00012DBC (0x79 bytes), align: 0 + Segment part 27. Intra module refs: WIMU_openUART::?relay + LOCAL ADDRESS + ===== ======= + WIMU_openUART 00012D44 + calls direct + XSTACK = 00000016 ( 0000001D ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012DBD - 00012DBF (0x3 bytes), align: 0 + Segment part 29. Intra module refs: WIMU_openUART + WIMU_requestDevInfo + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00012DBD + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012DC0 - 00012DC6 (0x7 bytes), align: 0 + Segment part 30. Intra module refs: ?Subroutine0 + WIMU_getEndOfFrame_Position + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012DC7 - 00012E20 (0x5a bytes), align: 0 + Segment part 31. Intra module refs: WIMU_requestDevInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_requestDevInfo 00012DC7 + calls direct + XSTACK = 00000017 ( 0000000A ) + ISTACK = 00000000 ( 00000004 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012E21 - 00012E8A (0x6a bytes), align: 0 + Segment part 33. Intra module refs: WIMU_setControlMode::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_setControlMode 00012E21 + calls direct + XSTACK = 00000017 ( 0000001A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012E8B - 00012E92 (0x8 bytes), align: 0 + Segment part 35. Intra module refs: WIMU_ProcessEvent + WIMU_setControlMode + WIMU_setCurrentTime + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00012E8B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012E93 - 00012E96 (0x4 bytes), align: 0 + Segment part 36. Intra module refs: WIMU_setControlMode + WIMU_setCurrentTime + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00012E93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012E97 - 00012E9C (0x6 bytes), align: 0 + Segment part 37. Intra module refs: ?Subroutine3 + WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012E9D - 00012F08 (0x6c bytes), align: 0 + Segment part 38. Intra module refs: WIMU_setCurrentTime::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_setCurrentTime 00012E9D + calls direct + XSTACK = 00000017 ( 00000028 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012F09 - 00012F11 (0x9 bytes), align: 0 + Segment part 40. Intra module refs: WIMU_setControlMode + WIMU_setCurrentTime + LOCAL ADDRESS + ===== ======= + ?Subroutine5 00012F09 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012F12 - 0001308A (0x179 bytes), align: 0 + Segment part 41. Intra module refs: WIMU_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_Init 00012F12 + calls direct + XSTACK = 00000000 ( 00000016 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001308B - 0001308F (0x5 bytes), align: 0 + Segment part 43. Intra module refs: WIMU_Init + WIMU_UARTCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001308B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013090 - 00013099 (0xa bytes), align: 0 + Segment part 44. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00013090 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001309A - 00013180 (0xe7 bytes), align: 0 + Segment part 45. Intra module refs: WIMU_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_ProcessEvent 0001309A + calls direct + XSTACK = 00000000 ( 0000001B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013181 - 00013192 (0x12 bytes), align: 0 + Segment part 47. Intra module refs: WIMU_UARTCallback::?relay + LOCAL ADDRESS + ===== ======= + WIMU_UARTCallback 00013181 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013193 - 00013526 (0x394 bytes), align: 0 + Segment part 49. Intra module refs: WIMU_updateProfileSensors::?relay + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors + 00013193 + calls direct + XSTACK = 00000009 ( 00000116 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013527 - 0001352F (0x9 bytes), align: 0 + Segment part 51. Intra module refs: WIMU_Init + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00013527 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013530 - 0001353C (0xd bytes), align: 0 + Segment part 52. Intra module refs: ?Subroutine6 + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine7 00013530 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E2A - 00000E2B (0x2 bytes), align: 0 + Segment part 21. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::numBytes + 00000E2A + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000E2C - 00000E2C (0x1 bytes), align: 0 + Segment part 22. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::msgCount + 00000E2C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001353D - 00013571 (0x35 bytes), align: 0 + Segment part 53. Intra module refs: WIMU_getEndOfFrame_Position::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_getEndOfFrame_Position + 0001353D + XSTACK = 00000112 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013572 - 000135F9 (0x88 bytes), align: 0 + Segment part 55. Intra module refs: COBS_StuffData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + COBS_StuffData 00013572 + XSTACK = 00000028 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000135FA - 00013689 (0x90 bytes), align: 0 + Segment part 57. Intra module refs: COBS_UnStuffData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + COBS_UnStuffData 000135FA + XSTACK = 00000116 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000489 - 00000494 (0xc bytes), align: 0 + Segment part 11. Intra module refs: scanRspData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000495 - 000004A1 (0xd bytes), align: 0 + Segment part 13. Intra module refs: advertData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004A2 - 000004A6 (0x5 bytes), align: 0 + Segment part 15. Intra module refs: attDeviceName + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000143D - 00001442 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + WIMU_openUART::?relay 0000143D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001443 - 00001448 (0x6 bytes), align: 0 + Segment part 32. Intra module refs: WIMU_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_requestDevInfo::?relay + 00001443 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001449 - 0000144E (0x6 bytes), align: 0 + Segment part 34. Intra module refs: WIMU_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_setControlMode::?relay + 00001449 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000144F - 00001454 (0x6 bytes), align: 0 + Segment part 39. Intra module refs: WIMU_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_setCurrentTime::?relay + 0000144F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001455 - 0000145A (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_Init::?relay 00001455 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000145B - 00001460 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_ProcessEvent::?relay + 0000145B tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001461 - 00001466 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: WIMU_openUART + LOCAL ADDRESS + ===== ======= + WIMU_UARTCallback::?relay + 00001461 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001467 - 0000146C (0x6 bytes), align: 0 + Segment part 50. Intra module refs: WIMU_UARTCallback + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::?relay + 00001467 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000146D - 00001472 (0x6 bytes), align: 0 + Segment part 54. Intra module refs: WIMU_updateProfileSensors + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_getEndOfFrame_Position::?relay + 0000146D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001473 - 00001478 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: WIMU_requestDevInfo + WIMU_setControlMode + WIMU_setCurrentTime + ENTRY ADDRESS REF BY + ===== ======= ====== + COBS_StuffData::?relay + 00001473 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001479 - 0000147E (0x6 bytes), align: 0 + Segment part 58. Intra module refs: WIMU_updateProfileSensors + ENTRY ADDRESS REF BY + ===== ======= ====== + COBS_UnStuffData::?relay + 00001479 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE1 - 00008FE2 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: WIMU_requestDevInfo + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F4E - 00008F51 (0x4 bytes), align: 0 + Segment part 7. Intra module refs: WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F05 - 00008F09 (0x5 bytes), align: 0 + Segment part 8. Intra module refs: WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F5E - 00008F61 (0x4 bytes), align: 0 + Segment part 23. Intra module refs: LL_SetAdvControl (ll) + Segment part 30 (ll_scheduler) + WIMU_requestDevInfo + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3 00008F5E + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F66 - 00008F69 (0x4 bytes), align: 0 + Segment part 24. Intra module refs: WIMU_ProcessEvent + WIMU_setControlMode + llScheduleTask (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_5 00008F66 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F7A - 00008F7D (0x4 bytes), align: 0 + Segment part 25. Intra module refs: WIMU_setCurrentTime + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_c 00008F7A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE1 - 00008FE2 (0x2 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F4E - 00008F51 (0x4 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F05 - 00008F09 (0x5 bytes), align: 0 + Segment part 61. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F5E - 00008F61 (0x4 bytes), align: 0 + Segment part 62. Intra module refs: __Constant_3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F66 - 00008F69 (0x4 bytes), align: 0 + Segment part 63. Intra module refs: __Constant_5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F7A - 00008F7D (0x4 bytes), align: 0 + Segment part 64. Intra module refs: __Constant_c + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu_util.r51 + ************************************************************************* + + FILE NAME : C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 + LIBRARY MODULE, NAME : ?cexit + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000091 - 00000095 (0x5 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + exit 00000091 ?call_main (?cmain) + ?C_EXIT 00000091 + ?ROM_MONITOR_NOPS 00000091 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?cmain + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000096, align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?cmain 00000096 Segment part 13 (CSTARTUP) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000096 - 0000009E (0x9 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + __low_level_init_call 00000096 __low_level_init (hal_startup) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 0000009F - 000000AC (0xe bytes), align: 0 + Segment part 5. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_DATA_Z 0000009F Segment part 1 (ll_halt) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000AD - 000000BA (0xe bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_IDATA_Z 000000AD myPC (ll) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000BB - 000000CA (0x10 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_XDATA_Z 000000BB Actimetry_AppCBs (actimetryservice) + GATTServApp_TaskID (gattservapp) + HalLedState (hal_led) + Hal_TaskID (hal_drivers) + LL_TaskID (ll) + OSAL_timeSeconds (OSAL_ClockBLE) + OnboardKeyIntEnable (OnBoard) + Segment part 10 (gap_peridevmgr) + Segment part 10 (gap_task) + Segment part 10 (gapgattserver) + Segment part 10 (gattservapp) + Segment part 11 (gap_peridevmgr) + Segment part 11 (gattservapp) + Segment part 12 (gap_configmgr) + Segment part 12 (gattservapp) + Segment part 13 (gapgattserver) + Segment part 13 (gattservapp) + Segment part 14 (gattservapp) + Segment part 15 (gap_configmgr) + Segment part 16 (gapgattserver) + Segment part 18 (gattservapp) + Segment part 19 (gapgattserver) + Segment part 6 (gapgattserver) + Segment part 6 (hci_data) + Segment part 6 (l2cap_util) + Segment part 6 (linkdb) + Segment part 6 (sm_mgr) + Segment part 7 (gatt_task) + Segment part 7 (hci_data) + Segment part 7 (linkdb) + Segment part 8 (gatt_task) + Segment part 8 (hci_data) + Segment part 8 (ll_scheduler) + Segment part 8 (sm_pairing) + Segment part 9 (gap_linkmgr) + Segment part 9 (gap_peridevmgr) + Segment part 9 (gatt_server) + Segment part 9 (gattservapp) + Segment part 9 (ll_scheduler) + Time_AppCBs (timeservice) + WIMU_BondMgrCBs (wimu) + WIMU_PeripheralCBs (wimu) + WIMU_TaskID (wimu) + WIMU_updateProfileSensors::msgCount (wimu) + WIMU_updateProfileSensors::numBytes (wimu) + actimetryCfg (actimetryservice) + actimetryCfgConfig (actimetryservice) + actimetryControl (actimetryservice) + actimetryControlConfig (actimetryservice) + actimetryImu (actimetryservice) + actimetryImuConfig (actimetryservice) + actimetryQuaternion (actimetryservice) + actimetryQuaternionConfig (actimetryservice) + activePg (osal_snv) + adcRef (hal_adc) + advInfo (ll) + autoSyncWhiteList (gapbondmgr) + battLevel (battservice) + battLevelClientCharCfg (battservice) + bleEvtMask (hci_event) + bm_list_ptr (osal_bufmgr) + bonds (gapbondmgr) + buildInfo (ll) + cachedTRNGdata (ll_enc) + cbTimers (osal_cbtimer) + chanMapUpdate (ll) + clkDivOnHalt (ll) + connectionHandle (gapbondmgr) + ctrlToHostEnable (hci) + currentTime (timeservice) + currentTimeClientCharCfg (timeservice) + dataPkt (ll_enc) + dcdcData (ll) + devInfoFirmwareRev (devinfoservice) + devInfoHardwareRev (devinfoservice) + devInfoSerialNumber (devinfoservice) + devInfoSoftwareRev (devinfoservice) + devInfoSystemId (devinfoservice) + deviceFeatureSet (ll) + dmaCfg (hal_uart) + dmaCh0 (hal_dma) + dmaCh1234 (hal_dma) + dtmInfo (ll) + eraseAllBonds (gapbondmgr) + extendRfRange (ll) + failF (osal_snv) + fastTxRespTime (ll) + gapAutoAdvPrivateAddrChange (gap_configmgr) + gapBondMgr_TaskID (gapbondmgr) + gapBond_AutoFail (gapbondmgr) + gapBond_Bonding (gapbondmgr) + gapBond_IOCap (gapbondmgr) + gapBond_MITM (gapbondmgr) + gapBond_OOBData (gapbondmgr) + gapBond_OOBDataFlag (gapbondmgr) + gapBond_Passcode (gapbondmgr) + gapDeviceAddrMode (gap_configmgr) + gapPrivateAddrChangeTimeout (gap_configmgr) + gapProfileRole (gap_configmgr) + gapRole_AdvChanMap (peripheral) + gapRole_AdvDirectAddr (peripheral) + gapRole_AdvDirectType (peripheral) + gapRole_AdvEventType (peripheral) + gapRole_AdvFilterPolicy (peripheral) + gapRole_ConnInterval (peripheral) + gapRole_ConnSlaveLatency (peripheral) + gapRole_ConnTimeout (peripheral) + gapRole_ConnectedDevAddr (peripheral) + gapRole_IRK (peripheral) + gapRole_ParamUpdateEnable (peripheral) + gapRole_RSSIReadRate (peripheral) + gapRole_SRK (peripheral) + gapRole_ScanRspData (peripheral) + gapRole_ScanRspDataLen (peripheral) + gapRole_SlaveLatency (peripheral) + gapRole_TaskID (peripheral) + gapRole_bdAddr (peripheral) + gapRole_profileRole (peripheral) + gapRole_signCounter (peripheral) + gapRole_state (peripheral) + gapTaskID (gap_task) + gattTaskID (gatt_task) + gpsDateTime (gpsservice) + gpsDateTimeClientCharCfg (gpsservice) + gpsLocationAndSpeed (gpsservice) + gpsLocationAndSpeedClientCharCfg (gpsservice) + gpsPositionQuality (gpsservice) + haltDuringRf (ll) + hciCtrlCmdToken (hci) + hciExtTaskID (hci_tl) + hciGapTaskID (hci_tl) + hciL2capTaskID (hci_tl) + hciPTMenabled (hci) + hciSmpTaskID (hci_tl) + hciTaskID (hci_tl) + hciTestTaskID (hci_tl) + l2capChannels (l2cap_task) + l2capFixedChannels (l2cap_task) + l2capTaskID (l2cap_task) + llConns (ll) + llState (ll) + maxTxPwrForDTM (ll) + numHostBufs (hci) + numWLEntries (phy) + nvInUse (ll) + onePktPerEvt (ll) + osalMemStat (OSAL_Memory) + osal_qHead (OSAL) + osal_systemClock (OSAL_Timers) + ownPublicAddr (ll) + ownRandomAddr (ll) + ownSavedPublicAddr (ll) + pAuthLink (gap_linkmgr) + pEstLink (gap_linkmgr) + pGapAdvertState (gap_devmgr) + pGapBondCB (gapbondmgr) + pGapRoles_AppCGs (peripheral) + pGapRoles_ParamUpdateCB (peripheral) + pHciEvtMask (hci_event) + pPairingParams (sm_pairing) + paramUpdateNoSuccessOption (peripheral) + peerInfo (ll) + pfnCentralConnCBs (gap_linkmgr) + pfnPeripheralCBs (gap_task) + pfnResponderCBs (sm_pairing) + pgOff (osal_snv) + postRfOperations (ll) + previousLLTimerTick (OSAL_ClockBLE) + pwrmgr_attribute (OSAL_PwrMgr) + remUsTicks (OSAL_ClockBLE) + rfCounters (ll) + rssiCorrection (ll) + rxFifoFlowCtrl (ll) + rx_byte (wimu) + rx_index (wimu) + rx_len (wimu) + serverInfoTbl (gatt_server) + slOverride (ll) + smTaskID (sm_task) + taskEndCause (ll) + tasksEvents (OSAL_WIMU) + timeMSec (OSAL_ClockBLE) + timerHead (OSAL_Timers) + trngCounter (ll) + uartRxBug (hal_uart) + verInfo (ll) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000CB - 000000F3 (0x29 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_XDATA_I 000000CB Segment part 10 (?largewr) + Segment part 10 (gatt_server) + Segment part 11 (gapgattserver) + Segment part 12 (gap_peridevmgr) + Segment part 13 (gap_configmgr) + Segment part 14 (gapgattserver) + Segment part 16 (gattservapp) + Segment part 17 (gapgattserver) + Segment part 19 (gattservapp) + Segment part 20 (gapgattserver) + Segment part 22 (gapgattserver) + Segment part 24 (gapgattserver) + Segment part 6 (?largewr) + Segment part 6 (gap_peridevmgr) + Segment part 6 (sm_rsppairing) + Segment part 8 (?largewr) + Segment part 8 (gapgattserver) + __Constant_10 (?largewr) + __Constant_2edbe700 (?largewr) + __Constant_3f800000 (?largewr) + __Constant_40a00000 (?largewr) + __Constant_41200000 (?largewr) + __Constant_501502f9 (?largewr) + __Constant_51ba43b7 (?largewr) + __Constant_7f800000 (?largewr) + __Constant_8 (?largewr) + actimetryCfgProps (actimetryservice) + actimetryCfgUserDesp (actimetryservice) + actimetryControlUserDesp (actimetryservice) + actimetryImuProps (actimetryservice) + actimetryImuUserDesp (actimetryservice) + actimetryQuaternionProps (actimetryservice) + actimetryQuaternionUserDesp (actimetryservice) + activeTaskID (OSAL) + advertData (wimu) + appTaskID (gattservapp) + attDeviceName (wimu) + baseTaskID (osal_cbtimer) + battAttrTbl (battservice) + battLevelProps (battservice) + currentTimeProps (timeservice) + devInfo11073CertProps (devinfoservice) + devInfoAttrTbl (devinfoservice) + devInfoFirmwareRevProps (devinfoservice) + devInfoHardwareRevProps (devinfoservice) + devInfoMfrNameProps (devinfoservice) + devInfoModelNumberProps (devinfoservice) + devInfoPnpId (devinfoservice) + devInfoPnpIdProps (devinfoservice) + devInfoSerialNumberProps (devinfoservice) + devInfoSoftwareRevProps (devinfoservice) + devInfoSystemIdProps (devinfoservice) + gapAppTaskID (gap_configmgr) + gapBond_AutoFailReason (gapbondmgr) + gapBond_KeyDistList (gapbondmgr) + gapBond_KeySize (gapbondmgr) + gapBond_PairingMode (gapbondmgr) + gapRole_AdvEnabled (peripheral) + gapRole_AdvertData (peripheral) + gapRole_AdvertDataLen (peripheral) + gapRole_AdvertOffTime (peripheral) + gapRole_ConnectionHandle (peripheral) + gapRole_MaxConnInterval (peripheral) + gapRole_MinConnInterval (peripheral) + gapRole_TimeoutMultiplier (peripheral) + gapUnwantedTaskID (gap_task) + gpsAttrTbl (gpsservice) + gpsDateTimeProps (gpsservice) + gpsFeatures (gpsservice) + gpsFeaturesProps (gpsservice) + gpsLocationAndSpeedProps (gpsservice) + gpsPositionQualityProps (gpsservice) + registeredKeysTaskID (OnBoard) + reqTaskId (gatt_server) + scanRspData (wimu) + sensorActimetryAttrTbl (actimetryservice) + taskEndCauses (ll) + taskErrorEndCauses (ll) + timeAttrTbl (timeservice) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000F4, align: 0 + Segment part 32. Intra module refs: __low_level_init_call + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000F4 - 00000109 (0x16 bytes), align: 0 + Segment part 33. Intra module refs: ?cmain + ENTRY ADDRESS REF BY + ===== ======= ====== + ?call_main 000000F4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : CSTARTUP + + SEGMENTS IN THE MODULE + ====================== +REGISTERS + Relative segment, address: DATA 00000000, align: 0 + Segment part 0. Intra module refs: Segment part 6 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?REGISTERS 00000000 + ------------------------------------------------------------------------- +ISTACK + Relative segment, address: IDATA 0000002B, align: 0 + Segment part 1. Intra module refs: Segment part 6 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ISTACK_START 0000002B + ------------------------------------------------------------------------- +XSTACK + Relative segment, address: XDATA 00000001, align: 0 + Segment part 3. Intra module refs: ?RESET_XSP + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTACK_START 00000001 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000002 (0x3 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 0000010A - 0000010F (0x6 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: Segment part 5 + ENTRY ADDRESS REF BY + ===== ======= ====== + __program_start 0000010A Absolute parts (?ABS_ENTRY_MOD) + ?RESET_SP 0000010D + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000110 - 00000115 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?RESET_XSP 00000110 ?XSP (VIRTUAL_REGISTERS) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000116 - 00000118 (0x3 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?RESET_CODE_BANK 00000116 Absolute parts (?BANKED_CODE_SUPPORT) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000119 - 0000011B (0x3 bytes), align: 0 + Segment part 13. Intra module refs: Absolute parts + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : VIRTUAL_REGISTERS + + SEGMENTS IN THE MODULE + ====================== +BREG + Relative segment, address: BIT 00000020.0 - 00000020.7 (0x8 bits), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?B0 00000020.0 Absolute parts (CSTARTUP) + ------------------------------------------------------------------------- +VREG + Relative segment, address: DATA 00000008, align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?V0 00000008 ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + ?SL_GE_X (?SL_GE_X) + ?Subroutine1 (osal_cbtimer) + ?Subroutine11 (gapbondmgr) + ?Subroutine13 (OSAL) + ?Subroutine13 (gapbondmgr) + ?Subroutine14 (gapbondmgr) + ?Subroutine16 (gapbondmgr) + ?Subroutine17 (gapbondmgr) + ?Subroutine2 (devinfoservice) + ?Subroutine2 (osal_bufmgr) + ?Subroutine22 (gapbondmgr) + ?Subroutine23 (peripheral) + ?Subroutine24 (gapbondmgr) + ?Subroutine3 (OSAL_Timers) + ?Subroutine3 (devinfoservice) + ?Subroutine5 (wimu) + ?Subroutine7 (peripheral) + ?UL_GE_X (?UL_GE_X) + ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + Batt_SetParameter (battservice) + COBS_StuffData (wimu) + COBS_UnStuffData (wimu) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_TerminateLinkReq (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_FindAttr (gattservapp) + GATTServApp_InitCharCfg (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ProcessEvent (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_SendServiceChangedInd (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_InitServer (gatt_server) + GATT_Notification (gatt_server) + GATT_ProcessEvent (gatt_task) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + HalUARTPollDMA (hal_uart) + HalUARTReadDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + L2CAP_Init (l2cap_task) + L2CAP_ProcessEvent (l2cap_task) + L2CAP_SendData (l2cap_if) + LL_AddWhiteListDevice (ll) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_Disconnect (ll) + LL_DisconnectCback (hci_event) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_ReverseBytes (ll_enc) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReply (ll) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_PseudoRand (ll) + LL_Rand (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_ReadRssi (ll) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + LL_SetAdvControl (ll) + LL_SetAdvParam (ll) + LL_TxData (ll) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + RF_NormalIsr (ll_isr) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ProcessEvent (sm_task) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 100 (gattservapp) + Segment part 101 (gattservapp) + Segment part 102 (gap_linkmgr) + Segment part 103 (gatt_server) + Segment part 104 (ll_common) + Segment part 105 (gap_linkmgr) + Segment part 107 (gap_linkmgr) + Segment part 107 (gatt_server) + Segment part 108 (gattservapp) + Segment part 108 (l2cap_util) + Segment part 109 (gattservapp) + Segment part 114 (gattservapp) + Segment part 114 (hci_event) + Segment part 115 (hci_event) + Segment part 122 (hci_event) + Segment part 125 (gattservapp) + Segment part 129 (gattservapp) + Segment part 13 (hci_data) + Segment part 130 (gattservapp) + Segment part 131 (gattservapp) + Segment part 132 (gattservapp) + Segment part 132 (ll) + Segment part 132 (ll_common) + Segment part 133 (hci_event) + Segment part 135 (hci_event) + Segment part 137 (hci_event) + Segment part 138 (gattservapp) + Segment part 139 (gattservapp) + Segment part 144 (gattservapp) + Segment part 146 (att_util) + Segment part 146 (gattservapp) + Segment part 149 (gattservapp) + Segment part 15 (sm_rsppairing) + Segment part 151 (hci_event) + Segment part 152 (att_util) + Segment part 152 (hci_event) + Segment part 158 (ll_common) + Segment part 16 (sm_rsppairing) + Segment part 160 (ll_common) + Segment part 168 (att_util) + Segment part 169 (gattservapp) + Segment part 173 (ll) + Segment part 178 (gattservapp) + Segment part 179 (ll_common) + Segment part 18 (gatt_server) + Segment part 18 (hci_data) + Segment part 18 (hci_event) + Segment part 181 (att_util) + Segment part 181 (gattservapp) + Segment part 182 (ll_common) + Segment part 185 (gattservapp) + Segment part 187 (ll_common) + Segment part 19 (l2cap_util) + Segment part 20 (hci_data) + Segment part 20 (ll_slaveEndCauses) + Segment part 20 (smp) + Segment part 204 (ll) + Segment part 21 (ll_advEndCauses) + Segment part 22 (gatt_task) + Segment part 22 (ll_advEndCauses) + Segment part 23 (ll_advEndCauses) + Segment part 23 (sm_mgr) + Segment part 238 (ll_common) + Segment part 24 (l2cap_util) + Segment part 24 (ll_slaveEndCauses) + Segment part 247 (ll_common) + Segment part 248 (ll_common) + Segment part 25 (l2cap_util) + Segment part 253 (ll) + Segment part 254 (ll_common) + Segment part 26 (ll_slaveEndCauses) + Segment part 26 (sm_mgr) + Segment part 264 (ll_common) + Segment part 27 (gap_linkmgr) + Segment part 28 (ll_scheduler) + Segment part 28 (ll_slaveEndCauses) + Segment part 29 (ll_advEndCauses) + Segment part 29 (ll_scheduler) + Segment part 29 (ll_slaveEndCauses) + Segment part 30 (ll_scheduler) + Segment part 31 (linkdb) + Segment part 31 (ll_scheduler) + Segment part 32 (ll_scheduler) + Segment part 32 (ll_slaveEndCauses) + Segment part 33 (ll_slaveEndCauses) + Segment part 34 (att_util) + Segment part 35 (ll_advEndCauses) + Segment part 35 (ll_slaveEndCauses) + Segment part 38 (ll_slaveEndCauses) + Segment part 38 (osal_snv) + Segment part 38 (smp) + Segment part 39 (hci_event) + Segment part 40 (gap_linkmgr) + Segment part 40 (gap_peridevmgr) + Segment part 41 (gap_linkmgr) + Segment part 42 (ll_enc) + Segment part 43 (ll_scheduler) + Segment part 44 (ll_slaveEndCauses) + Segment part 45 (ll_slaveEndCauses) + Segment part 46 (gap_peridevmgr) + Segment part 46 (ll_scheduler) + Segment part 46 (ll_slaveEndCauses) + Segment part 47 (sm_mgr) + Segment part 48 (hci_event) + Segment part 48 (sm_mgr) + Segment part 49 (ll_advEndCauses) + Segment part 49 (sm_mgr) + Segment part 50 (att_util) + Segment part 50 (gap_configmgr) + Segment part 50 (ll_advEndCauses) + Segment part 53 (gapgattserver) + Segment part 54 (ll_slaveEndCauses) + Segment part 56 (ll_advEndCauses) + Segment part 57 (gattservapp) + Segment part 58 (ll_advEndCauses) + Segment part 59 (ll_slaveEndCauses) + Segment part 59 (sm_mgr) + Segment part 60 (gap_linkmgr) + Segment part 61 (gapgattserver) + Segment part 61 (gatt_server) + Segment part 63 (gattservapp) + Segment part 63 (ll_advEndCauses) + Segment part 64 (att_util) + Segment part 64 (gatt_server) + Segment part 64 (sm_mgr) + Segment part 65 (gatt_server) + Segment part 65 (sm_rsppairing) + Segment part 66 (gattservapp) + Segment part 67 (att_util) + Segment part 68 (gap_linkmgr) + Segment part 69 (gap_configmgr) + Segment part 69 (gap_linkmgr) + Segment part 70 (gap_linkmgr) + Segment part 70 (l2cap_util) + Segment part 70 (ll_slaveEndCauses) + Segment part 71 (gap_linkmgr) + Segment part 71 (ll_enc) + Segment part 71 (sm_rsppairing) + Segment part 72 (sm_pairing) + Segment part 74 (gap_linkmgr) + Segment part 74 (sm_pairing) + Segment part 75 (ll_enc) + Segment part 75 (sm_rsppairing) + Segment part 76 (ll) + Segment part 77 (hci_event) + Segment part 78 (gattservapp) + Segment part 78 (hci_event) + Segment part 78 (ll_scheduler) + Segment part 78 (ll_slaveEndCauses) + Segment part 79 (gattservapp) + Segment part 81 (ll_enc) + Segment part 81 (sm_mgr) + Segment part 82 (gattservapp) + Segment part 83 (hci_event) + Segment part 83 (sm_mgr) + Segment part 83 (sm_pairing) + Segment part 84 (?largewr) + Segment part 84 (gap_linkmgr) + Segment part 84 (gattservapp) + Segment part 85 (gap_linkmgr) + Segment part 85 (gatt_server) + Segment part 85 (hci_event) + Segment part 85 (sm_mgr) + Segment part 87 (gattservapp) + Segment part 87 (ll_slaveEndCauses) + Segment part 88 (att_util) + Segment part 88 (gattservapp) + Segment part 88 (ll_common) + Segment part 88 (ll_enc) + Segment part 88 (sm_mgr) + Segment part 88 (sm_pairing) + Segment part 90 (gattservapp) + Segment part 90 (ll_slaveEndCauses) + Segment part 91 (ll_slaveEndCauses) + Segment part 94 (gap_linkmgr) + Segment part 95 (gatt_server) + Segment part 96 (gattservapp) + Segment part 97 (gap_peridevmgr) + Segment part 98 (ll_timer2) + Segment part 99 (gatt_server) + Segment part 99 (gattservapp) + Segment part 99 (ll_scheduler) + Time_AddService (timeservice) + Time_GetParameter (timeservice) + Time_SetParameter (timeservice) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + battWriteAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondMgr_SyncWhiteList (gapbondmgr) + gapFindADType (gap_devmgr) + gapIncSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessDisconnectCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattFindServerInfo (gatt_server) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessReadMultiReq (gatt_server) + gattProcessRxData (gatt_task) + gattProcessWriteReq (gatt_server) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_HandleConnStatusCB (gpsservice) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + halUart1TxIsr (hal_uart) + hciTxDataBufferReset (hci_data) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capAllocChannel (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capFindLocalId (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParsePacket (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Remove (linkdb) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llConnCleanup (ll_common) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llDequeueCtrlPkt (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llEnqueueCtrlPkt (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetNextDataChan (ll_common) + llInitFeatureSet (ll_common) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessChanMap (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSaveConnState (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetNextDataChan (ll_common) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_adjust_header (osal_bufmgr) + osal_bm_alloc (osal_bufmgr) + osal_get_timeoutEx (OSAL_Timers) + osal_isbufset (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_memcmp (OSAL) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_allocate (OSAL) + osal_msg_extract (OSAL) + osal_msg_receive (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_run_system (OSAL) + osal_snv_compact (osal_snv) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + phyFindWlEntry (phy) + reportStatusChange (linkdb) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smEncrypt (sm_mgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandBuf (sm_mgr) + smGenerateRandMsg (sm_pairing) + smPairingSendEncInfo (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendIdentityInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smPairingSendSingingInfo (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smSetPairingReqRsp (sm_pairing) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + smUint8ToAuthReq (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildIdentityAddrInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingReqRsp (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParsePairingReq (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + timeReadAttrCB (timeservice) + timeWriteAttrCB (timeservice) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + xor_128 (sm_mgr) + ------------------------------------------------------------------------- +XSP + Relative segment, address: DATA 00000018 - 00000019 (0x2 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSP 00000018 ?ADD_XSTACK_DISP0_16 (?ADD_XSTACK_DISP16) + ?ADD_XSTACK_DISP0_8 (?ADD_XSTACK_DISP8) + ?ALLOC_XSTACK8 (?ALLOC_XSTACK8) + ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?DEALLOC_XSTACK8 (?DEALLOC_XSTACK8) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + ?PUSH_XSTACK8_X (?PUSH_XSTACK8_X) + ?RESET_XSP (CSTARTUP) + ?Subroutine25 (gapbondmgr) + ?XSTACK_DISP0_8 (?XSTACK_DISP8) + ATT_CompareUUID (att_util) + ATT_ParseExecuteWriteReq (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + COBS_StuffData (wimu) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetRandomAddressCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HalUARTInitDMA (hal_uart) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_RandCback (hci) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 101 (gattservapp) + Segment part 108 (?largewr) + Segment part 110 (?largewr) + Segment part 114 (?largewr) + Segment part 155 (hci_event) + Segment part 35 (ll_timer2) + Segment part 38 (ll_timer2) + Segment part 38 (osal_snv) + Segment part 40 (?largewr) + Segment part 43 (?largewr) + Segment part 44 (ll_timer2) + Segment part 45 (sm_mgr) + Segment part 47 (sm_mgr) + Segment part 50 (?largewr) + Segment part 50 (ll_timer2) + Segment part 51 (ll_timer2) + Segment part 55 (?largewr) + Segment part 55 (gattservapp) + Segment part 56 (gattservapp) + Segment part 58 (?largewr) + Segment part 61 (gatt_server) + Segment part 62 (ll_timer2) + Segment part 70 (gapbondmgr) + Segment part 75 (hci) + Segment part 77 (ll_enc) + Segment part 78 (sm_mgr) + Segment part 81 (?largewr) + Segment part 82 (hci) + Segment part 89 (ll_enc) + Segment part 90 (gattservapp) + Segment part 93 (?largewr) + Segment part 94 (gattservapp) + Segment part 95 (hci) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_openUART (wimu) + WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapProcessOSALMsg (gap_task) + gapRole_startConnUpdate (peripheral) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + initNV (osal_snv) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + llDivide31By16To16 (ll_math) + llEventInRange (ll_common) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llProcessPostRfOps (ll_common) + llSetT2Delta (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ll_McuPrecisionCount (ll_timer2) + osalTimerUpdate (OSAL_Timers) + osal_snv_write (osal_snv) + setActivePage (osal_snv) + setXferPage (osal_snv) + smGeneratePairingReqRsp (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + sm_CMAC (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + timeWriteAttrCB (timeservice) + writeItem (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_CODE_SUPPORT + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 0000011C - 00000139 (0x1e bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BCALL_FF 0000011C ?call_main (?cmain) + ?BRET_FF 00000122 ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?Subroutine0 (OSAL) + ?Subroutine0 (OSAL_Memory) + ?Subroutine0 (OSAL_PwrMgr) + ?Subroutine0 (OSAL_Timers) + ?Subroutine0 (hal_adc) + ?Subroutine0 (hal_aes) + ?Subroutine0 (hal_drivers) + ?Subroutine1 (OnBoard) + ?Subroutine1 (hal_uart) + ?Subroutine1 (osal_snv) + ?Subroutine1 (peripheral) + ?Subroutine3 (gapbondmgr) + HalDmaInit (hal_dma) + HalFlashErase (hal_flash) + HalKeyConfig (hal_key) + HalLedSet (hal_led) + HalUARTIsrDMA (hal_uart) + L2CAP_RegisterApp (l2cap_if) + LL_ENC_StartAES (ll_enc) + LL_TxDataCompleteCback (hci_data) + PHY_CommitRxFifo (phy) + PHY_DeallocateRxFifo (phy) + PHY_RetryRxFifo (phy) + PHY_RetryTxFifo (phy) + SM_ResponderInit (sm_rsppairing) + Segment part 10 (gap_devmgr) + Segment part 10 (hci_event) + Segment part 11 (gatt_task) + Segment part 128 (hci) + Segment part 15 (gap_task) + Segment part 154 (phy) + Segment part 18 (ll_advEndCauses) + Segment part 197 (ll) + Segment part 23 (att_util) + Segment part 23 (gatt_server) + Segment part 23 (hci_tl) + Segment part 23 (linkdb) + Segment part 30 (wimu) + Segment part 31 (gap_peridevmgr) + Segment part 32 (ll_enc) + Segment part 33 (smp) + Segment part 37 (sm_mgr) + Segment part 42 (gap_configmgr) + Segment part 42 (gapgattserver) + Segment part 46 (sm_pairing) + Segment part 51 (gattservapp) + Segment part 52 (l2cap_util) + Segment part 54 (gatt_server) + Segment part 54 (ll_timer2) + Segment part 60 (ll_scheduler) + Segment part 73 (ll_timer2) + Segment part 75 (ll_common) + Segment part 78 (gap_linkmgr) + bm_desc_from_payload (osal_bufmgr) + gapValidADType (gap_devmgr) + l2capHandleRxError (l2cap_util) + llCheckForLstoDuringSL (ll_slaveEndCauses) + llClearRfInts (ll_common) + llSlaveEvt_TaskAbort (ll_slaveEndCauses) + llUnexpectedEndCauseHandler (ll_errorEndCauses) + main (WIMU_Main) + osalInitTasks (OSAL_WIMU) + osal_int_disable (OSAL) + put_c_in_string (?sprintf) + strlen (?strlen) + ?BDISPATCH_FF 00000125 ATT_BuildErrorRsp::?relay (att_util) + ATT_BuildExchangeMTURsp::?relay (att_util) + ATT_BuildFindByTypeValueRsp::?relay (att_util) + ATT_BuildFindInfoRsp::?relay (att_util) + ATT_BuildHandleValueInd::?relay (att_util) + ATT_BuildPrepareWriteRsp::?relay (att_util) + ATT_BuildReadBlobRsp::?relay (att_util) + ATT_BuildReadByGrpTypeRsp::?relay (att_util) + ATT_BuildReadByTypeRsp::?relay (att_util) + ATT_BuildReadMultiRsp::?relay (att_util) + ATT_BuildReadRsp::?relay (att_util) + ATT_CompareUUID::?relay (att_util) + ATT_ConvertUUIDto128::?relay (att_util) + ATT_ErrorRsp::?relay (att_server) + ATT_ExchangeMTURsp::?relay (att_server) + ATT_ExecuteWriteRsp::?relay (att_server) + ATT_FindByTypeValueRsp::?relay (att_server) + ATT_FindInfoRsp::?relay (att_server) + ATT_HandleValueInd::?relay (att_server) + ATT_HandleValueNoti::?relay (att_server) + ATT_ParseExchangeMTUReq::?relay (att_util) + ATT_ParseExecuteWriteReq::?relay (att_util) + ATT_ParseFindByTypeValueReq::?relay (att_util) + ATT_ParseFindInfoReq::?relay (att_util) + ATT_ParsePacket::?relay (att_util) + ATT_ParsePrepareWriteReq::?relay (att_util) + ATT_ParseReadBlobReq::?relay (att_util) + ATT_ParseReadByTypeReq::?relay (att_util) + ATT_ParseReadMultiReq::?relay (att_util) + ATT_ParseReadReq::?relay (att_util) + ATT_ParseWriteReq::?relay (att_util) + ATT_PrepareWriteRsp::?relay (att_server) + ATT_ReadBlobRsp::?relay (att_server) + ATT_ReadByGrpTypeRsp::?relay (att_server) + ATT_ReadByTypeRsp::?relay (att_server) + ATT_ReadMultiRsp::?relay (att_server) + ATT_ReadRsp::?relay (att_server) + ATT_WriteRsp::?relay (att_server) + Actimetry_AddService::?relay (actimetryservice) + Actimetry_GetParameter::?relay (actimetryservice) + Actimetry_HandleConnStatusCB::?relay (actimetryservice) + Actimetry_ReadAttrCB::?relay (actimetryservice) + Actimetry_SetParameter::?relay (actimetryservice) + Actimetry_WriteAttrCB::?relay (actimetryservice) + Batt_AddService::?relay (battservice) + Batt_SetParameter::?relay (battservice) + COBS_StuffData::?relay (wimu) + COBS_UnStuffData::?relay (wimu) + DevInfo_AddService::?relay (devinfoservice) + DevInfo_SetParameter::?relay (devinfoservice) + GAPBondMgr_Init::?relay (gapbondmgr) + GAPBondMgr_LinkEst::?relay (gapbondmgr) + GAPBondMgr_ProcessEvent::?relay (gapbondmgr) + GAPBondMgr_ProcessGAPMsg::?relay (gapbondmgr) + GAPBondMgr_Register::?relay (gapbondmgr) + GAPBondMgr_ResolveAddr::?relay (gapbondmgr) + GAPBondMgr_ServiceChangeInd::?relay (gapbondmgr) + GAPBondMgr_UpdateCharCfg::?relay (gapbondmgr) + GAPRole_Init::?relay (peripheral) + GAPRole_ProcessEvent::?relay (peripheral) + GAPRole_SendUpdateParam::?relay (peripheral) + GAPRole_SetParameter::?relay (peripheral) + GAPRole_StartDevice::?relay (peripheral) + GAPRole_TerminateConnection::?relay (peripheral) + GAP_Authenticate::?relay (gap_linkmgr) + GAP_Bond::?relay (gap_linkmgr) + GAP_DeviceInit::?relay (gap) + GAP_EndDiscoverable::?relay (gap_peridevmgr) + GAP_GetParamValue::?relay (gap_configmgr) + GAP_Init::?relay (gap_task) + GAP_MakeDiscoverable::?relay (gap_peridevmgr) + GAP_NumActiveConnections::?relay (gap_task) + GAP_ParamsInit::?relay (gap_configmgr) + GAP_PasscodeUpdate::?relay (gap_linkmgr) + GAP_PeriDevMgrInit::?relay (gap_peridevmgr) + GAP_ProcessEvent::?relay (gap_task) + GAP_RegisterForHCIMsgs::?relay (gap_task) + GAP_ResolvePrivateAddr::?relay (gap_devmgr) + GAP_SecParamsInit::?relay (gap_configmgr) + GAP_SendSlaveSecurityRequest::?relay (gap_perilinkmgr) + GAP_SetParamValue::?relay (gap_configmgr) + GAP_Signable::?relay (gap_linkmgr) + GAP_TerminateAuth::?relay (gap_linkmgr) + GAP_TerminateLinkReq::?relay (gap_linkmgr) + GAP_UpdateAdvertisingData::?relay (gap_peridevmgr) + GATTServApp_AddService::?relay (gattservapp) + GATTServApp_FindAttr::?relay (gattservapp) + GATTServApp_Init::?relay (gattservapp) + GATTServApp_InitCharCfg::?relay (gattservapp) + GATTServApp_ProcessCCCWriteReq::?relay (gattservapp) + GATTServApp_ProcessCharCfg::?relay (gattservapp) + GATTServApp_ProcessEvent::?relay (gattservapp) + GATTServApp_ReadAttr::?relay (gattservapp) + GATTServApp_ReadCharCfg::?relay (gattservapp) + GATTServApp_RegisterForMsg::?relay (gattservapp) + GATTServApp_RegisterService::?relay (gattservapp) + GATTServApp_SendCCCUpdatedEvent::?relay (gattservapp) + GATTServApp_SendServiceChangedInd::?relay (gattservapp) + GATTServApp_UpdateCharCfg::?relay (gattservapp) + GATTServApp_WriteAttr::?relay (gattservapp) + GATTServApp_WriteCharCfg::?relay (gattservapp) + GATT_FindHandle::?relay (gatt_server) + GATT_FindHandleUUID::?relay (gatt_server) + GATT_FindNextAttr::?relay (gatt_server) + GATT_Indication::?relay (gatt_server) + GATT_Init::?relay (gatt_task) + GATT_InitServer::?relay (gatt_server) + GATT_Notification::?relay (gatt_server) + GATT_ProcessEvent::?relay (gatt_task) + GATT_RegisterForReq::?relay (gatt_server) + GATT_RegisterService::?relay (gatt_server) + GATT_ServiceChangedInd::?relay (gatt_server) + GATT_ServiceNumAttrs::?relay (gatt_server) + GATT_VerifyReadPermissions::?relay (gatt_server) + GATT_VerifyWritePermissions::?relay (gatt_server) + GGS_AddService::?relay (gapgattserver) + GGS_SetParameter::?relay (gapgattserver) + Gps_AddService::?relay (gpsservice) + Gps_SetParameter::?relay (gpsservice) + HCI_CommandCompleteEvent::?relay (hci_event) + HCI_CommandStatusEvent::?relay (hci_event) + HCI_DataBufferOverflowEvent::?relay (hci_event) + HCI_DisconnectCmd::?relay (hci) + HCI_GAPTaskRegister::?relay (hci_tl) + HCI_Init::?relay (hci_tl) + HCI_L2CAPTaskRegister::?relay (hci_tl) + HCI_LE_AddWhiteListCmd::?relay (hci) + HCI_LE_ClearWhiteListCmd::?relay (hci) + HCI_LE_LtkReqNegReplyCmd::?relay (hci) + HCI_LE_LtkReqReplyCmd::?relay (hci) + HCI_LE_RandCmd::?relay (hci) + HCI_LE_ReadBufSizeCmd::?relay (hci) + HCI_LE_SetAdvDataCmd::?relay (hci) + HCI_LE_SetAdvEnableCmd::?relay (hci) + HCI_LE_SetAdvParamCmd::?relay (hci) + HCI_LE_SetRandomAddressCmd::?relay (hci) + HCI_LE_SetScanRspDataCmd::?relay (hci) + HCI_NumOfCompletedPacketsEvent::?relay (hci_event) + HCI_ProcessEvent::?relay (hci_tl) + HCI_ReadBDADDRCmd::?relay (hci) + HCI_ReadRssiCmd::?relay (hci) + HCI_SMPTaskRegister::?relay (hci_tl) + HCI_SendCommandCompleteEvent::?relay (hci_event) + HCI_SendCommandStatusEvent::?relay (hci_event) + HCI_SendControllerToHostEvent::?relay (hci_event) + HCI_SendDataPkt::?relay (hci) + HCI_TxDataBufferInsert::?relay (hci_data) + HCI_TxDataSend::?relay (hci_data) + HCI_VendorSpecifcCommandCompleteEvent::?relay (hci_event) + HCI_bm_alloc::?relay (hci) + HalAdcInit::?relay (hal_adc) + HalAesInit::?relay (hal_aes) + HalDmaInit::?relay (hal_dma) + HalDriverInit::?relay (hal_drivers) + HalFlashErase::?relay (hal_flash) + HalFlashRead::?relay (hal_flash) + HalFlashWrite::?relay (hal_flash) + HalKeyConfig::?relay (hal_key) + HalLedSet::?relay (hal_led) + HalUARTInit::?relay (hal_uart) + HalUARTInitDMA::?relay (hal_uart) + HalUARTIsrDMA::?relay (hal_uart) + HalUARTOpen::?relay (hal_uart) + HalUARTOpenDMA::?relay (hal_uart) + HalUARTPoll::?relay (hal_uart) + HalUARTPollDMA::?relay (hal_uart) + HalUARTRead::?relay (hal_uart) + HalUARTReadDMA::?relay (hal_uart) + HalUARTRxAvailDMA::?relay (hal_uart) + HalUARTWrite::?relay (hal_uart) + HalUARTWriteDMA::?relay (hal_uart) + Hal_Init::?relay (hal_drivers) + Hal_ProcessEvent::?relay (hal_drivers) + Hal_ProcessPoll::?relay (hal_drivers) + Hal_UART_RxBufLen::?relay (hal_uart) + InitBoard::?relay (OnBoard) + L2CAP_BuildCmdReject::?relay (l2cap_util) + L2CAP_CmdReject::?relay (l2cap_if) + L2CAP_ConnParamUpdateReq::?relay (l2cap_if) + L2CAP_Init::?relay (l2cap_task) + L2CAP_ParseParamUpdateReq::?relay (l2cap_util) + L2CAP_ProcessEvent::?relay (l2cap_task) + L2CAP_RegisterApp::?relay (l2cap_if) + L2CAP_SendData::?relay (l2cap_if) + L2CAP_bm_alloc::?relay (l2cap_util) + LL_AddWhiteListDevice::?relay (ll) + LL_ClearWhiteList::?relay (ll) + LL_ConnActive::?relay (ll) + LL_ConnParamUpdateCback::?relay (hci_event) + LL_ConnectionCompleteCback::?relay (hci_event) + LL_CtrlToHostFlowControl::?relay (ll) + LL_Disconnect::?relay (ll) + LL_DisconnectCback::?relay (hci_event) + LL_ENC_AES128_Encrypt::?relay (ll_enc) + LL_ENC_Decrypt::?relay (ll_enc) + LL_ENC_DecryptMsg::?relay (ll_enc) + LL_ENC_Encrypt::?relay (ll_enc) + LL_ENC_EncryptMsg::?relay (ll_enc) + LL_ENC_GenDeviceIV::?relay (ll_enc) + LL_ENC_GenDeviceSKD::?relay (ll_enc) + LL_ENC_GenerateMIC::?relay (ll_enc) + LL_ENC_GenerateNonce::?relay (ll_enc) + LL_ENC_GeneratePseudoRandNum::?relay (ll_enc) + LL_ENC_GenerateTrueRandNum::?relay (ll_enc) + LL_ENC_InitAesDMA::?relay (ll_enc) + LL_ENC_InitDMA0::?relay (ll_enc) + LL_ENC_LoadEmptyIV::?relay (ll_enc) + LL_ENC_LoadKey::?relay (ll_enc) + LL_ENC_MoveData::?relay (ll_enc) + LL_ENC_ReverseBytes::?relay (ll_enc) + LL_ENC_SetupCryptoDMA::?relay (ll_enc) + LL_ENC_SetupLoadDMA::?relay (ll_enc) + LL_ENC_StartAES::?relay (ll_enc) + LL_EXT_ExtendRfRangeCback::?relay (hci) + LL_EXT_SetRxGainCback::?relay (hci) + LL_EXT_SetTxPowerCback::?relay (hci) + LL_EncChangeCback::?relay (hci_event) + LL_EncKeyRefreshCback::?relay (hci_event) + LL_EncLtkNegReply::?relay (ll) + LL_EncLtkReply::?relay (ll) + LL_EncLtkReqCback::?relay (hci_event) + LL_Encrypt::?relay (ll) + LL_Init::?relay (ll) + LL_ProcessEvent::?relay (ll) + LL_PseudoRand::?relay (ll) + LL_Rand::?relay (ll) + LL_RandCback::?relay (hci) + LL_ReadBDADDR::?relay (ll) + LL_ReadRemoteVersionInfoCback::?relay (hci_event) + LL_ReadRssi::?relay (ll) + LL_Reset::?relay (ll) + LL_RxDataCompleteCback::?relay (hci_data) + LL_RxReqDataBufCback::?relay (hci_data) + LL_SetAdvControl::?relay (ll) + LL_SetAdvData::?relay (ll) + LL_SetAdvParam::?relay (ll) + LL_SetRandomAddress::?relay (ll) + LL_SetScanRspData::?relay (ll) + LL_TxData::?relay (ll) + LL_TxDataCompleteCback::?relay (hci_data) + OnBoard_KeyCallback::?relay (OnBoard) + OnBoard_SendKeys::?relay (OnBoard) + Onboard_rand::?relay (OnBoard) + PHY_AddWlEntry::?relay (phy) + PHY_ClearAllRegsAndFifos::?relay (phy) + PHY_ClearBlacklist::?relay (phy) + PHY_ClearBlacklistIndex::?relay (phy) + PHY_ClearSavedWhiteList::?relay (phy) + PHY_ClearWhitelist::?relay (phy) + PHY_CommitRxFifo::?relay (phy) + PHY_ConfigWhitener::?relay (phy) + PHY_ConfigureAppendRfStatus::?relay (phy) + PHY_ConfigureFifoDataProcessing::?relay (phy) + PHY_ConfigureMD::?relay (phy) + PHY_DeallocateRxFifo::?relay (phy) + PHY_GetAdvChans::?relay (phy) + PHY_GetEndCause::?relay (phy) + PHY_Init::?relay (phy) + PHY_InitSeqStat::?relay (phy) + PHY_LoadNR::?relay (phy) + PHY_Reset::?relay (phy) + PHY_RetryRxFifo::?relay (phy) + PHY_RetryTxFifo::?relay (phy) + PHY_SetAdvChans::?relay (phy) + PHY_SetAdvWlPolicy::?relay (phy) + PHY_SetBlacklistIndex::?relay (phy) + PHY_SetCRCInit::?relay (phy) + PHY_SetEndConnection::?relay (phy) + PHY_SetFifoConfig::?relay (phy) + PHY_SetMaxNack::?relay (phy) + PHY_SetOwnAddr::?relay (phy) + PHY_SetPeerAddr::?relay (phy) + PHY_SetRfFreq::?relay (phy) + PHY_SetSyncWord::?relay (phy) + PHY_VerifyNR::?relay (phy) + SM_CalcRandomAddr::?relay (sm_mgr) + SM_GenerateAuthenSig::?relay (sm_mgr) + SM_Init::?relay (sm_task) + SM_PasskeyUpdate::?relay (sm_pairing) + SM_ProcessEvent::?relay (sm_task) + SM_ResolveRandomAddrs::?relay (sm_mgr) + SM_ResponderInit::?relay (sm_rsppairing) + SM_StartPairing::?relay (sm_pairing) + SM_VerifyAuthenSig::?relay (sm_mgr) + Time_AddService::?relay (timeservice) + Time_GetParameter::?relay (timeservice) + Time_SetParameter::?relay (timeservice) + WIMU_Init::?relay (wimu) + WIMU_ProcessEvent::?relay (wimu) + WIMU_UARTCallback::?relay (wimu) + WIMU_getEndOfFrame_Position::?relay (wimu) + WIMU_openUART::?relay (wimu) + WIMU_requestDevInfo::?relay (wimu) + WIMU_setControlMode::?relay (wimu) + WIMU_setCurrentTime::?relay (wimu) + WIMU_updateProfileSensors::?relay (wimu) + _formatted_write::?relay (?largewr) + aesDmaInit::?relay (hal_aes) + attSendMsg::?relay (att_util) + battReadAttrCB::?relay (battservice) + battWriteAttrCB::?relay (battservice) + bm_desc_from_payload::?relay (osal_bufmgr) + cleanErasedPage::?relay (osal_snv) + compactPage::?relay (osal_snv) + devInfo_ReadAttrCB::?relay (devinfoservice) + disconnectNext::?relay (gap_linkmgr) + erasePage::?relay (osal_snv) + findItem::?relay (osal_snv) + findOffset::?relay (osal_snv) + float_conversion::?relay (?largewr) + gapAddAddrAdj::?relay (gap_configmgr) + gapBondMgrAddBond::?relay (gapbondmgr) + gapBondMgrAuthenticate::?relay (gapbondmgr) + gapBondMgrBondReq::?relay (gapbondmgr) + gapBondMgrBondTotal::?relay (gapbondmgr) + gapBondMgrChangeState::?relay (gapbondmgr) + gapBondMgrEraseAllBondings::?relay (gapbondmgr) + gapBondMgrEraseBonding::?relay (gapbondmgr) + gapBondMgrFindAddr::?relay (gapbondmgr) + gapBondMgrFindCharCfgItem::?relay (gapbondmgr) + gapBondMgrGetPublicAddr::?relay (gapbondmgr) + gapBondMgrInvertCharCfgItem::?relay (gapbondmgr) + gapBondMgrReadBonds::?relay (gapbondmgr) + gapBondMgrResolvePrivateAddr::?relay (gapbondmgr) + gapBondMgrSendServiceChange::?relay (gapbondmgr) + gapBondMgrUpdateCharCfg::?relay (gapbondmgr) + gapBondMgr_SyncWhiteList::?relay (gapbondmgr) + gapBondSetupPrivFlag::?relay (gapbondmgr) + gapDetermineAddrType::?relay (gap_configmgr) + gapFindADType::?relay (gap_devmgr) + gapFreeAdvertState::?relay (gap_peridevmgr) + gapFreeAuthLink::?relay (gap_linkmgr) + gapFreeEstLink::?relay (gap_linkmgr) + gapGetDevAddress::?relay (gap_configmgr) + gapGetDevAddressMode::?relay (gap_configmgr) + gapGetIRK::?relay (gap_configmgr) + gapGetSRK::?relay (gap_configmgr) + gapGetSignCounter::?relay (gap_configmgr) + gapIncSignCounter::?relay (gap_configmgr) + gapIsAdvertising::?relay (gap_devmgr) + gapPairingCompleteCB::?relay (gap_linkmgr) + gapPasskeyNeededCB::?relay (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt::?relay (gap_peridevmgr) + gapProcessAdvertisingEvt::?relay (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt::?relay (gap_linkmgr) + gapProcessConnectionCompleteEvt::?relay (gap_linkmgr) + gapProcessDisconnectCompleteEvt::?relay (gap_linkmgr) + gapProcessHCICmdCompleteEvt::?relay (gap_task) + gapProcessNewAddr::?relay (gap_configmgr) + gapProcessOSALMsg::?relay (gap_task) + gapProcessRandomAddrComplete::?relay (gap_configmgr) + gapReadBD_ADDRStatus::?relay (gap_configmgr) + gapReadBufSizeCmdStatus::?relay (gap_configmgr) + gapRegisterPeripheral::?relay (gap_task) + gapRole_ProcessGAPMsg::?relay (peripheral) + gapRole_ProcessOSALMsg::?relay (peripheral) + gapRole_startConnUpdate::?relay (peripheral) + gapSendBondCompleteEvent::?relay (gap_linkmgr) + gapSendDeviceInitDoneEvent::?relay (gap_configmgr) + gapSendLinkUpdateEvent::?relay (gap_linkmgr) + gapSendMakeDiscEvent::?relay (gap_peridevmgr) + gapSendPairingReqEvent::?relay (gap_linkmgr) + gapSetAdvParams::?relay (gap_peridevmgr) + gapSetAdvParamsStatus::?relay (gap_peridevmgr) + gapUpdateConnSignCounter::?relay (gap_configmgr) + gapValidADType::?relay (gap_devmgr) + gapWriteAdvDataStatus::?relay (gap_peridevmgr) + gapWriteAdvEnableStatus::?relay (gap_peridevmgr) + gattFindServerInfo::?relay (gatt_server) + gattGetServerStatus::?relay (gatt_server) + gattNotifyEvent::?relay (gatt_task) + gattProcessExchangeMTUReq::?relay (gatt_server) + gattProcessExecuteWriteReq::?relay (gatt_server) + gattProcessFindByTypeValueReq::?relay (gatt_server) + gattProcessFindInfoReq::?relay (gatt_server) + gattProcessReadByGrpTypeReq::?relay (gatt_server) + gattProcessReadByTypeReq::?relay (gatt_server) + gattProcessReadMultiReq::?relay (gatt_server) + gattProcessReadReq::?relay (gatt_server) + gattProcessRxData::?relay (gatt_task) + gattProcessWriteReq::?relay (gatt_server) + gattRegisterServer::?relay (gatt_task) + gattServApp_FindAuthorizeAttrCB::?relay (gattservapp) + gattServApp_FindCharCfgItem::?relay (gattservapp) + gattServApp_FindPrepareWriteQ::?relay (gattservapp) + gattServApp_FindServiceCBs::?relay (gattservapp) + gattServApp_HandleConnStatusCB::?relay (gattservapp) + gattServApp_ProcessExecuteWriteReq::?relay (gattservapp) + gattServApp_ProcessFindByTypeValueReq::?relay (gattservapp) + gattServApp_ProcessMsg::?relay (gattservapp) + gattServApp_ProcessPrepareWriteReq::?relay (gattservapp) + gattServApp_ProcessReadByGrpTypeReq::?relay (gattservapp) + gattServApp_ProcessReadByTypeReq::?relay (gattservapp) + gattServApp_ProcessReadMultiReq::?relay (gattservapp) + gattServApp_ProcessWriteReq::?relay (gattservapp) + gattServApp_SetNumPrepareWrites::?relay (gattservapp) + gattServApp_WriteAttrCB::?relay (gattservapp) + gattServerHandleConnStatusCB::?relay (gatt_server) + gattServerHandleTimerCB::?relay (gatt_server) + gattServerProcessMsgCB::?relay (gatt_server) + gattServiceLastHandle::?relay (gatt_server) + gattStartTimer::?relay (gatt_task) + gattStopTimer::?relay (gatt_task) + generate_subkey::?relay (sm_mgr) + ggs_ReadAttrCB::?relay (gapgattserver) + ggs_SetAttrWPermit::?relay (gapgattserver) + ggs_WriteAttrCB::?relay (gapgattserver) + gps_HandleConnStatusCB::?relay (gpsservice) + gps_ReadAttrCB::?relay (gpsservice) + gps_WriteAttrCB::?relay (gpsservice) + hciInitEventMasks::?relay (hci_event) + hciTxDataBufferReset::?relay (hci_data) + initNV::?relay (osal_snv) + isLimitedDiscoverableMode::?relay (gap_peridevmgr) + l2capAllocChannel::?relay (l2cap_util) + l2capBuildParamUpdateReq::?relay (l2cap_util) + l2capEncapSendData::?relay (l2cap_util) + l2capFindLocalId::?relay (l2cap_util) + l2capFreeChannel::?relay (l2cap_util) + l2capHandleRxError::?relay (l2cap_util) + l2capHandleTimerCB::?relay (l2cap_util) + l2capNotifyData::?relay (l2cap_util) + l2capNotifySignal::?relay (l2cap_util) + l2capParseCmdReject::?relay (l2cap_util) + l2capParsePacket::?relay (l2cap_util) + l2capParseParamUpdateRsp::?relay (l2cap_util) + l2capParseSignalHdr::?relay (l2cap_util) + l2capProcessReq::?relay (l2cap_task) + l2capProcessRsp::?relay (l2cap_task) + l2capProcessRxData::?relay (l2cap_task) + l2capProcessSignal::?relay (l2cap_task) + l2capSendCmd::?relay (l2cap_util) + l2capSendReq::?relay (l2cap_util) + l2capStopTimer::?relay (l2cap_util) + leftshift_onebit::?relay (sm_mgr) + linkDB_Add::?relay (linkdb) + linkDB_Authen::?relay (linkdb) + linkDB_Find::?relay (linkdb) + linkDB_FindFirst::?relay (linkdb) + linkDB_Init::?relay (linkdb) + linkDB_NumActive::?relay (linkdb) + linkDB_PerformFunc::?relay (linkdb) + linkDB_Register::?relay (linkdb) + linkDB_Remove::?relay (linkdb) + linkDB_State::?relay (linkdb) + llAdjustForMissedEvent::?relay (ll_common) + llAdvEvt_TaskAbort::?relay (ll_advEndCauses) + llAdvEvt_TaskConnect::?relay (ll_advEndCauses) + llAllocConnId::?relay (ll_common) + llAllocTask::?relay (ll_scheduler) + llCheckForLstoDuringSL::?relay (ll_slaveEndCauses) + llCheckWhiteListUsage::?relay (ll_common) + llClearRfInts::?relay (ll_common) + llClearSetInts::?relay (ll_common) + llConnCleanup::?relay (ll_common) + llConnTerminate::?relay (ll_common) + llConvertCtrlProcTimeoutToEvent::?relay (ll_common) + llConvertLstoToEvent::?relay (ll_common) + llDequeueCtrlPkt::?relay (ll_common) + llDirectedAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llDisableRfInts::?relay (ll_common) + llDisableT2E1::?relay (ll_timer2) + llDisableT2Ints::?relay (ll_timer2) + llDisableT2IntsEvts::?relay (ll_timer2) + llDiscoverableAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llEnableRfInts::?relay (ll_common) + llEnqueueCtrlPkt::?relay (ll_common) + llExtendRfRange::?relay (ll_common) + llFindNextSecTask::?relay (ll_scheduler) + llFindStartType::?relay (ll_scheduler) + llFindTxPowerSettings::?relay (ll_common) + llFreeTask::?relay (ll_scheduler) + llGetActiveTasks::?relay (ll_scheduler) + llGetCurrentFineTime::?relay (ll_timer2) + llGetCurrentTask::?relay (ll_scheduler) + llGetCurrentTime::?relay (ll_timer2) + llGetNextConn::?relay (ll_common) + llGetNumTasks::?relay (ll_scheduler) + llGetTask::?relay (ll_scheduler) + llGetTaskState::?relay (ll_scheduler) + llGetTimer2Capture::?relay (ll_timer2) + llInitFeatureSet::?relay (ll_common) + llInitTimer2::?relay (ll_timer2) + llMemCopyDst::?relay (ll_common) + llMemCopySrc::?relay (ll_common) + llNonConnAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llProcessChanMap::?relay (ll_common) + llProcessPendingTxData::?relay (ll_common) + llProcessPostRfOps::?relay (ll_common) + llProcessSlaveControlProcedures::?relay (ll_slaveEndCauses) + llReleaseAllConnId::?relay (ll_common) + llReleaseConnId::?relay (ll_common) + llReplaceCtrlPkt::?relay (ll_common) + llRestoreConnState::?relay (ll_scheduler) + llRestoreRfRegs::?relay (ll_scheduler) + llRestore_rxFIFO::?relay (ll_scheduler) + llRestore_txFIFO::?relay (ll_scheduler) + llRfInit::?relay (ll_common) + llSaveConnState::?relay (ll_scheduler) + llSaveRfRegs::?relay (ll_scheduler) + llSave_rxFIFO::?relay (ll_scheduler) + llSave_txFIFO::?relay (ll_scheduler) + llScheduleTask::?relay (ll_scheduler) + llScheduler::?relay (ll_scheduler) + llSchedulerInit::?relay (ll_scheduler) + llSetFreqTune::?relay (ll_common) + llSetRxGain::?relay (ll_common) + llSetT2C1Event1::?relay (ll_timer2) + llSetT2Delta::?relay (ll_timer2) + llSetT2OVFC1Event1::?relay (ll_timer2) + llSetT2OVFC1Timeout::?relay (ll_timer2) + llSetT2OVFC2Event2::?relay (ll_timer2) + llSetTxPower::?relay (ll_common) + llSetupAdv::?relay (ll_common) + llSetupDirectedAdvEvt::?relay (ll_common) + llSetupEncRsp::?relay (ll_common) + llSetupFeatureSetRsp::?relay (ll_common) + llSetupNextSlaveEvent::?relay (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt::?relay (ll_common) + llSetupPauseEncRsp::?relay (ll_common) + llSetupRejectInd::?relay (ll_common) + llSetupScannableAdvEvt::?relay (ll_common) + llSetupStartEncReq::?relay (ll_common) + llSetupStartEncRsp::?relay (ll_common) + llSetupTermInd::?relay (ll_common) + llSetupUndirectedAdvEvt::?relay (ll_common) + llSetupUnknownRsp::?relay (ll_common) + llSetupVersionIndReq::?relay (ll_common) + llSlaveEvt_TaskAbort::?relay (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk::?relay (ll_slaveEndCauses) + llStartAdvSetup::?relay (ll_common) + llStartSlaveSetup::?relay (ll_common) + llStartTimer2::?relay (ll_timer2) + llStopTimer2::?relay (ll_timer2) + llUndirectedAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llUnexpectedEndCauseHandler::?relay (ll_errorEndCauses) + llWriteTxData::?relay (ll_common) + ll_McuPrecisionCount::?relay (ll_timer2) + memset::?relay (?memset) + osalAddTimer::?relay (OSAL_Timers) + osalDeleteTimer::?relay (OSAL_Timers) + osalFindTimer::?relay (OSAL_Timers) + osalInitTasks::?relay (OSAL_WIMU) + osalTimeUpdate::?relay (OSAL_ClockBLE) + osalTimerInit::?relay (OSAL_Timers) + osalTimerUpdate::?relay (OSAL_Timers) + osal_CbTimerStart::?relay (osal_cbtimer) + osal_CbTimerStop::?relay (osal_cbtimer) + osal_bm_adjust_header::?relay (osal_bufmgr) + osal_bm_alloc::?relay (osal_bufmgr) + osal_bm_free::?relay (osal_bufmgr) + osal_clear_event::?relay (OSAL) + osal_get_timeoutEx::?relay (OSAL_Timers) + osal_init_system::?relay (OSAL) + osal_int_disable::?relay (OSAL) + osal_isbufset::?relay (OSAL) + osal_mem_alloc::?relay (OSAL_Memory) + osal_mem_free::?relay (OSAL_Memory) + osal_mem_init::?relay (OSAL_Memory) + osal_mem_kick::?relay (OSAL_Memory) + osal_memcmp::?relay (OSAL) + osal_memcpy::?relay (OSAL) + osal_memdup::?relay (OSAL) + osal_memset::?relay (OSAL) + osal_msg_allocate::?relay (OSAL) + osal_msg_deallocate::?relay (OSAL) + osal_msg_enqueue::?relay (OSAL) + osal_msg_enqueue_push::?relay (OSAL) + osal_msg_extract::?relay (OSAL) + osal_msg_push::?relay (OSAL) + osal_msg_receive::?relay (OSAL) + osal_msg_send::?relay (OSAL) + osal_pwrmgr_device::?relay (OSAL_PwrMgr) + osal_pwrmgr_init::?relay (OSAL_PwrMgr) + osal_pwrmgr_task_state::?relay (OSAL_PwrMgr) + osal_rand::?relay (OSAL) + osal_revmemcpy::?relay (OSAL) + osal_run_system::?relay (OSAL) + osal_set_event::?relay (OSAL) + osal_snv_compact::?relay (osal_snv) + osal_snv_init::?relay (osal_snv) + osal_snv_read::?relay (osal_snv) + osal_snv_write::?relay (osal_snv) + osal_start_reload_timer::?relay (OSAL_Timers) + osal_start_system::?relay (OSAL) + osal_start_timerEx::?relay (OSAL_Timers) + osal_stop_timerEx::?relay (OSAL_Timers) + osal_strlen::?relay (OSAL) + phyFindWlEntry::?relay (phy) + put_c_in_string::?relay (?sprintf) + reportStatusChange::?relay (linkdb) + sendAuthEvent::?relay (gap_linkmgr) + sendEstLinkEvent::?relay (gap_linkmgr) + sendTerminateEvent::?relay (gap_linkmgr) + setActivePage::?relay (osal_snv) + setXferPage::?relay (osal_snv) + smAuthReqToUint8::?relay (sm_mgr) + smDetermineKeySize::?relay (sm_pairing) + smEncrypt::?relay (sm_mgr) + smEndPairing::?relay (sm_pairing) + smFreePairingParams::?relay (sm_pairing) + smGenerateConfirm::?relay (sm_pairing) + smGeneratePairingReqRsp::?relay (sm_pairing) + smGenerateRandBuf::?relay (sm_mgr) + smGenerateRandMsg::?relay (sm_pairing) + smLinkCheck::?relay (sm_pairing) + smNextPairingState::?relay (sm_pairing) + smPairingSendEncInfo::?relay (sm_pairing) + smPairingSendIdentityAddrInfo::?relay (sm_pairing) + smPairingSendIdentityInfo::?relay (sm_pairing) + smPairingSendMasterID::?relay (sm_pairing) + smPairingSendSingingInfo::?relay (sm_pairing) + smProcessDataMsg::?relay (sm_pairing) + smProcessEncryptChange::?relay (sm_pairing) + smProcessOSALMsg::?relay (sm_task) + smProcessPairingReq::?relay (sm_pairing) + smProcessRandComplete::?relay (sm_mgr) + smRegisterResponder::?relay (sm_pairing) + smResponderProcessLTKReq::?relay (sm_rsppairing) + smResponderSendNextKeyInfo::?relay (sm_rsppairing) + smSavePairInfo::?relay (sm_pairing) + smSendFailAndEnd::?relay (sm_pairing) + smSendSMMsg::?relay (smp) + smSetPairingReqRsp::?relay (sm_pairing) + smStartEncryption::?relay (sm_pairing) + smStartRspTimer::?relay (sm_mgr) + smStopRspTimer::?relay (sm_mgr) + smTimedOut::?relay (sm_pairing) + smUint8ToAuthReq::?relay (sm_mgr) + sm_CMAC::?relay (sm_mgr) + sm_ah::?relay (sm_mgr) + sm_c1::?relay (sm_pairing) + sm_c1new::?relay (sm_mgr) + sm_s1::?relay (sm_mgr) + sm_xor::?relay (sm_mgr) + smpBuildEncInfo::?relay (smp) + smpBuildIdentityAddrInfo::?relay (smp) + smpBuildIdentityInfo::?relay (smp) + smpBuildMasterID::?relay (smp) + smpBuildPairingConfirm::?relay (smp) + smpBuildPairingFailed::?relay (smp) + smpBuildPairingRandom::?relay (smp) + smpBuildPairingReq::?relay (smp) + smpBuildPairingReqRsp::?relay (smp) + smpBuildPairingRsp::?relay (smp) + smpBuildSecurityReq::?relay (smp) + smpBuildSigningInfo::?relay (smp) + smpParseEncInfo::?relay (smp) + smpParseIdentityAddrInfo::?relay (smp) + smpParseIdentityInfo::?relay (smp) + smpParseMasterID::?relay (smp) + smpParsePairingConfirm::?relay (smp) + smpParsePairingFailed::?relay (smp) + smpParsePairingRandom::?relay (smp) + smpParsePairingReq::?relay (smp) + smpParseSecurityReq::?relay (smp) + smpParseSigningInfo::?relay (smp) + smpResponderProcessIncoming::?relay (sm_rsppairing) + smpResponderProcessMasterID::?relay (sm_rsppairing) + smpResponderProcessPairingRandom::?relay (sm_rsppairing) + smpResponderProcessPairingReq::?relay (sm_rsppairing) + sprintf::?relay (?sprintf) + strlen::?relay (?strlen) + timeReadAttrCB::?relay (timeservice) + timeWriteAttrCB::?relay (timeservice) + utilExtractUuid16::?relay (st_util) + verifyWordM::?relay (osal_snv) + writeItem::?relay (osal_snv) + writeWord::?relay (osal_snv) + xor_128::?relay (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_EQ_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014A3 - 000014B7 (0x15 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_EQ_X 000014A3 SM_VerifyAuthenSig (sm_mgr) + findOffset (osal_snv) + initNV (osal_snv) + llSetT2OVFC2Event2 (ll_timer2) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?SL_GE_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014B8 - 000014DD (0x26 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?SL_GE_X 000014B8 _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014DE - 000014ED (0x10 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GT 000014DE SM_VerifyAuthenSig (sm_mgr) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_snv_compact (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GT_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014EE - 000014FD (0x10 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GT_X 000014EE osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GE_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014FE - 0000151C (0x1f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GE_X 000014FE GAP_PasscodeUpdate (gap_linkmgr) + ll24BitTimeCompare (ll_timer2) + llFindStartType (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_TO_FLT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000151D - 0000151F (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_TO_FLT 0000151D float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001520 - 00001534 (0x15 bytes), align: 0 + Segment part 1. Intra module refs: ?L_TO_FLT + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_TO_FLT_REW 00001520 + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001535 - 00001537 (0x3 bytes), align: 0 + Segment part 2. Intra module refs: ?L_TO_FLT_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_TO_FLT_REW 00001535 + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001538 - 00001594 (0x5d bytes), align: 0 + Segment part 3. Intra module refs: ?L_TO_FLT_REW + ?UL_TO_FLT_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_TO_FLT 00001538 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TO_L + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001595 - 000015C8 (0x34 bytes), align: 0 + Segment part 5. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TO_L 00001595 float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000015C9 - 000015D4 (0xc bytes), align: 0 + Segment part 6. Intra module refs: ?FLT_TO_L + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000015D5 - 00001623 (0x4f bytes), align: 0 + Segment part 7. Intra module refs: ?FLT_TO_L + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_ZERO + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001624 - 0000162D (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_ZERO_REW 00001624 ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_ZERO_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000162E - 00001637 (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_ZERO_R1_REW 0000162E ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_INF + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001638 - 0000163A (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_REW 00001638 ?FLT_ADD (?FLT_ADD) + ?FLT_MUL (?FLT_MUL) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 0000163B - 0000164C (0x12 bytes), align: 0 + Segment part 1. Intra module refs: ?FLT_TEST_INF_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF 0000163B ?FLT_DIV (?FLT_DIV) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_INF_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000164D - 0000164F (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_R1_REW 0000164D ?FLT_ADD (?FLT_ADD) + ?FLT_MUL (?FLT_MUL) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001650 - 00001661 (0x12 bytes), align: 0 + Segment part 1. Intra module refs: ?FLT_TEST_INF_R1_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_R1 00001650 ?FLT_DIV (?FLT_DIV) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_NAN + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001662 - 00001670 (0xf bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_NAN 00001662 ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + ?FLT_SUB (?FLT_ADD) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_NAN_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001671 - 0000167F (0xf bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_NAN_R1 00001671 ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + ?FLT_SUB (?FLT_ADD) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_EQ + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001680 - 000016AB (0x2c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_EQ 00001680 float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_GE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000016AC - 000016FA (0x4f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_GE 000016AC float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_LT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000016FB - 00001746 (0x4c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_LT 000016FB _formatted_write (?largewr) + float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_MUL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001747 - 000018C6 (0x180 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_MUL 00001747 float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_ADD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000018C7 - 000018EB (0x25 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_SUB 000018C7 float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000018EC - 00001B02 (0x217 bytes), align: 0 + Segment part 3. Intra module refs: ?FLT_SUB + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_ADD 000018EC + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_DIV + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001B03 - 00001CE8 (0x1e6 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_DIV 00001B03 float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MUL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001CE9 - 00001CEB (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MUL 00001CE9 LL_TxData (ll) + gapWriteAdvEnableStatus (gap_peridevmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llScheduleTask (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_snv_compact (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001CEC - 00001D68 (0x7d bytes), align: 0 + Segment part 1. Intra module refs: ?L_MUL + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MUL_REW 00001CEC + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_DIV_MOD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001D69 - 00001DD8 (0x70 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_DIV_MOD 00001D69 _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_NEG + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DD9 - 00001DDB (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_NEG_REW 00001DD9 ?L_TO_FLT_REW (?L_TO_FLT) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001DDC - 00001DEC (0x11 bytes), align: 0 + Segment part 1. Intra module refs: ?L_NEG_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_NEG 00001DDC _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DED - 00001DF1 (0x5 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_SHR 00001DED GAP_PasscodeUpdate (gap_linkmgr) + LL_TxData (ll) + SM_GenerateAuthenSig (sm_mgr) + llCalcScaFactor (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001DF2 - 00001E05 (0x14 bytes), align: 0 + Segment part 2. Intra module refs: ?UL_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SHL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E06 - 00001E0B (0x6 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SHL 00001E06 SM_VerifyAuthenSig (sm_mgr) + osal_snv_compact (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001E0C - 00001E10 (0x5 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SHL_REW 00001E0C + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001E11 - 00001E24 (0x14 bytes), align: 0 + Segment part 2. Intra module refs: ?L_SHL + ?L_SHL_REW + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E25 - 00001E37 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD 00001E25 LL_TxData (ll) + SM_VerifyAuthenSig (sm_mgr) + ll24BitTimeDelta (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + smResponderSendNextKeyInfo (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E38 - 00001E4A (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD_X 00001E38 LL_SetAdvControl (ll) + LL_TxData (ll) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E4B - 00001E5D (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD_TO_X 00001E4B LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + gapIncSignCounter (gap_configmgr) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SUB + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E5E - 00001E71 (0x14 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SUB 00001E5E ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SUB_FROM_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E72 - 00001E85 (0x14 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SUB_FROM_X 00001E72 llAdjustTimeBackward (ll_timer2) + osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_AND_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E86 - 00001E98 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_AND_X 00001E86 LL_SetAdvControl (ll) + LL_TxData (ll) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_AND_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E99 - 00001EAB (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_AND_TO_X 00001E99 Segment part 98 (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MOV_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EAC - 00001EBA (0xf bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MOV_X 00001EAC COBS_StuffData (wimu) + COBS_UnStuffData (wimu) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_Init (ll) + RF_NormalIsr (ll_isr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 98 (ll_timer2) + _formatted_write (?largewr) + findOffset (osal_snv) + float_conversion (?largewr) + gapIncSignCounter (gap_configmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + initNV (osal_snv) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_get_timeoutEx (OSAL_Timers) + osal_snv_compact (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + smResponderSendNextKeyInfo (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MOV_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EBB - 00001EC9 (0xf bytes), align: 0 + Segment part 2. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MOV_TO_X 00001EBB LL_SetAdvControl (ll) + _formatted_write (?largewr) + gapUpdateConnSignCounter (gap_configmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_start_reload_timer (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XLOAD_R2345 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001ECA - 00001ED5 (0xc bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XLOAD_R2345 00001ECA GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Signable (gap_linkmgr) + LL_Reset (ll) + LL_TxData (ll) + Segment part 51 (ll_timer2) + WIMU_Init (wimu) + _formatted_write (?largewr) + gapGetSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llCalcScaFactor (ll_timerDrift) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetupAdv (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerInit (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + setActivePage (osal_snv) + setXferPage (osal_snv) + smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XSTORE_R2345 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001ED6 - 00001EE1 (0xc bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTORE_R2345 00001ED6 GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Signable (gap_linkmgr) + _formatted_write (?largewr) + gapPairingCompleteCB (gap_linkmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerInit (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + setActivePage (osal_snv) + setXferPage (osal_snv) + smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?MOVE_LONG8_XDATA_IDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EE2 - 00001EEE (0xd bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?MOVE_LONG8_XDATA_IDATA + 00001EE2 ?PUSH_XSTACK_I (?PUSH_XSTACK_I) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?MOVE_LONG8_XDATA_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EEF - 00001F0F (0x21 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?MOVE_LONG8_XDATA_XDATA + 00001EEF ?PUSH_XSTACK8_X (?PUSH_XSTACK8_X) + GAPBondMgr_LinkEst (gapbondmgr) + GGS_SetParameter (gapgattserver) + WIMU_requestDevInfo (wimu) + WIMU_updateProfileSensors (wimu) + gapSendPairingReqEvent (gap_linkmgr) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + llAdvEvt_TaskConnect (ll_advEndCauses) + llFindTxPowerSettings (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smProcessPairingReq (sm_pairing) + smSetPairingReqRsp (sm_pairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?S_DIV_MOD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001F10 - 00001F50 (0x41 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_DIV_MOD 00001F49 HCI_TxDataBufferInsert (hci_data) + float_conversion (?largewr) + hciTxDataBufferReset (hci_data) + osal_snv_write (osal_snv) + sm_CMAC (sm_mgr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F51 - 00001FA9 (0x59 bytes), align: 0 + Segment part 1. Intra module refs: ?S_DIV_MOD + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_DIV_MOD 00001F51 llCalcTimerDrift (ll_timerDrift) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llGetNextDataChan (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?SS_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FAA - 00001FAC (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?SS_SHR 00001FAA llProcessChanMap (ll_common) + phyFindWlEntry (phy) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001FAD - 00001FB9 (0xd bytes), align: 0 + Segment part 2. Intra module refs: ?SS_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FBA - 00001FBC (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SHR 00001FBA HalFlashWrite (hal_flash) + LL_Init (ll) + LL_ProcessEvent (ll) + RF_NormalIsr (ll_isr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001FBD - 00001FC8 (0xc bytes), align: 0 + Segment part 2. Intra module refs: ?US_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?S_SHL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FC9 - 00001FCB (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_SHL 00001FC9 ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + GATTServApp_FindAttr (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_InitServer (gatt_server) + GATT_RegisterService (gatt_server) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HalFlashRead (hal_flash) + L2CAP_Init (l2cap_task) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + gapBondMgrAuthenticate (gapbondmgr) + gattFindServerInfo (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + hciTxDataBufferReset (hci_data) + l2capAllocChannel (l2cap_util) + l2capFindLocalId (l2cap_util) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_snv_write (osal_snv) + phyFindWlEntry (phy) + smSavePairInfo (sm_pairing) + smUint8ToAuthReq (sm_mgr) + smpParsePairingReq (smp) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001FCC - 00001FCE (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_SHL_REW 00001FCC + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001FCF - 00001FDB (0xd bytes), align: 0 + Segment part 2. Intra module refs: ?S_SHL + ?S_SHL_REW + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?ALLOC_XSTACK8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FDC - 00001FF1 (0x16 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ALLOC_XSTACK8 00001FDC ATT_CompareUUID (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + COBS_StuffData (wimu) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_LE_AddWhiteListCmd (hci) + HCI_LE_ClearWhiteListCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetAdvDataCmd (hci) + HCI_LE_SetAdvEnableCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_LE_SetRandomAddressCmd (hci) + HCI_LE_SetScanRspDataCmd (hci) + HCI_ReadBDADDRCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HalUARTInitDMA (hal_uart) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_RandCback (hci) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_openUART (wimu) + WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapProcessOSALMsg (gap_task) + gapRole_startConnUpdate (peripheral) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llGetCurrentTime (ll_timer2) + llProcessPostRfOps (ll_common) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ll_McuPrecisionCount (ll_timer2) + osalTimerUpdate (OSAL_Timers) + osal_snv_write (osal_snv) + setActivePage (osal_snv) + setXferPage (osal_snv) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + timeWriteAttrCB (timeservice) + verifyWordM (osal_snv) + writeItem (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?DEALLOC_XSTACK8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FF2 - 0000200B (0x1a bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?DEALLOC_XSTACK8 00001FF2 ?Subroutine0 (gapbondmgr) + ?Subroutine0 (peripheral) + ?Subroutine0 (wimu) + ?Subroutine1 (wimu) + ?Subroutine2 (gapbondmgr) + ?Subroutine2 (osal_snv) + ?Subroutine5 (gapbondmgr) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ExchangeMTURsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + Batt_SetParameter (battservice) + COBS_StuffData (wimu) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 104 (gattservapp) + Segment part 127 (hci) + Segment part 134 (hci) + Segment part 177 (gattservapp) + Segment part 19 (sm_mgr) + Segment part 20 (l2cap_if) + Segment part 25 (osal_snv) + Segment part 35 (att_server) + Segment part 35 (sm_pairing) + Segment part 36 (?largewr) + Segment part 49 (sm_mgr) + Segment part 50 (sm_mgr) + Segment part 53 (ll_timer2) + Segment part 56 (ll_common) + Segment part 56 (sm_mgr) + Segment part 58 (att_util) + Segment part 62 (gattservapp) + Segment part 62 (ll_enc) + Segment part 67 (att_util) + Segment part 79 (gatt_server) + Segment part 81 (att_util) + Segment part 84 (att_util) + Segment part 88 (sm_pairing) + Segment part 89 (sm_pairing) + Segment part 98 (att_util) + Segment part 98 (hci) + Time_AddService (timeservice) + Time_GetParameter (timeservice) + Time_SetParameter (timeservice) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + battWriteAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capEncapSendData (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetNextDataChan (ll_common) + llSetT2OVFC2Event2 (ll_timer2) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_receive (OSAL) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + setActivePage (osal_snv) + setXferPage (osal_snv) + smEncrypt (sm_mgr) + smEndPairing (sm_pairing) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + timeReadAttrCB (timeservice) + timeWriteAttrCB (timeservice) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?ADD_XSTACK_DISP8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000200C - 00002026 (0x1b bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ADD_XSTACK_DISP0_8 0000200C ?PUSH_XSTACK_I (?PUSH_XSTACK_I) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?ADD_XSTACK_DISP16 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002027 - 00002044 (0x1e bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ADD_XSTACK_DISP0_16 00002027 WIMU_updateProfileSensors (wimu) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XSTACK_DISP8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002045 - 0000204E (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTACK_DISP0_8 00002045 ATT_CompareUUID (att_util) + ATT_ParseExchangeMTUReq (att_util) + ATT_ParseExecuteWriteReq (att_util) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParseFindInfoReq (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadBlobReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseReadReq (att_util) + ATT_ParseWriteReq (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + COBS_StuffData (wimu) + COBS_UnStuffData (wimu) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_SecParamsInit (gap_configmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GATTServApp_FindAttr (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_ReadBDADDRCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + L2CAP_ParseParamUpdateReq (l2cap_util) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_SetAdvParam (ll) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 49 (sm_mgr) + Segment part 51 (ll_timer2) + Segment part 88 (sm_pairing) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_openUART (wimu) + WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + battWriteAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapFindADType (gap_devmgr) + gapPairingCompleteCB (gap_linkmgr) + gapRole_startConnUpdate (peripheral) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gattNotifyEvent (gatt_task) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParseParamUpdateRsp (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + llWriteTxData (ll_common) + ll_McuPrecisionCount (ll_timer2) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_memcmp (OSAL) + osal_memcpy (OSAL) + osal_msg_extract (OSAL) + osal_revmemcpy (OSAL) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + timeReadAttrCB (timeservice) + timeWriteAttrCB (timeservice) + verifyWordM (osal_snv) + writeItem (osal_snv) + xor_128 (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?CALL_IND + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000204F - 00002050 (0x2 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?CALL_IND 0000204F Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GAP_TerminateLinkReq (gap_linkmgr) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_WriteAttr (gattservapp) + HalUARTPollDMA (hal_uart) + LL_ProcessEvent (ll) + _formatted_write (?largewr) + attSendMsg (att_util) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gattProcessRxData (gatt_task) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + ggs_WriteAttrCB (gapgattserver) + l2capSendCmd (l2cap_util) + linkDB_PerformFunc (linkdb) + llScheduleTask (ll_scheduler) + osal_run_system (OSAL) + reportStatusChange (linkdb) + smNextPairingState (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + timeWriteAttrCB (timeservice) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_ENTER_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002051 - 000020BC (0x6c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BANKED_ENTER_XDATA 00002051 ATT_BuildErrorRsp (att_util) + ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseExchangeMTUReq (att_util) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParseFindInfoReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadBlobReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseReadReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + Batt_SetParameter (battservice) + COBS_StuffData (wimu) + COBS_UnStuffData (wimu) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_Init (gapbondmgr) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_EndDiscoverable (gap_peridevmgr) + GAP_Init (gap_task) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ParamsInit (gap_configmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + GAP_SecParamsInit (gap_configmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_TerminateLinkReq (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_FindAttr (gattservapp) + GATTServApp_Init (gattservapp) + GATTServApp_InitCharCfg (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ProcessEvent (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_ReadCharCfg (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_SendServiceChangedInd (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Init (gatt_task) + GATT_InitServer (gatt_server) + GATT_Notification (gatt_server) + GATT_ProcessEvent (gatt_task) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GATT_VerifyReadPermissions (gatt_server) + GATT_VerifyWritePermissions (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_DataBufferOverflowEvent (hci_event) + HCI_DisconnectCmd (hci) + HCI_Init (hci_tl) + HCI_LE_AddWhiteListCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_SetAdvDataCmd (hci) + HCI_LE_SetAdvEnableCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_LE_SetScanRspDataCmd (hci) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_ProcessEvent (hci_tl) + HCI_ReadRssiCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + HalUARTOpen (hal_uart) + HalUARTPollDMA (hal_uart) + HalUARTRead (hal_uart) + HalUARTReadDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + HalUARTWrite (hal_uart) + HalUARTWriteDMA (hal_uart) + Hal_ProcessEvent (hal_drivers) + Hal_UART_RxBufLen (hal_uart) + InitBoard (OnBoard) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + L2CAP_Init (l2cap_task) + L2CAP_ParseParamUpdateReq (l2cap_util) + L2CAP_ProcessEvent (l2cap_task) + L2CAP_SendData (l2cap_if) + L2CAP_bm_alloc (l2cap_util) + LL_AddWhiteListDevice (ll) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_Disconnect (ll) + LL_DisconnectCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_ReverseBytes (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkNegReply (ll) + LL_EncLtkReply (ll) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_PseudoRand (ll) + LL_Rand (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_ReadRssi (ll) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + LL_SetAdvControl (ll) + LL_SetAdvData (ll) + LL_SetAdvParam (ll) + LL_SetScanRspData (ll) + LL_TxData (ll) + OnBoard_KeyCallback (OnBoard) + OnBoard_SendKeys (OnBoard) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + PHY_SetCRCInit (phy) + PHY_SetSyncWord (phy) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_Init (sm_task) + SM_PasskeyUpdate (sm_pairing) + SM_ProcessEvent (sm_task) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 67 (att_util) + Segment part 81 (att_util) + Segment part 84 (att_util) + Segment part 98 (att_util) + Time_AddService (timeservice) + Time_GetParameter (timeservice) + Time_SetParameter (timeservice) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_UARTCallback (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + battWriteAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + disconnectNext (gap_linkmgr) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrBondTotal (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseAllBondings (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrFindCharCfgItem (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrInvertCharCfgItem (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondMgr_SyncWhiteList (gapbondmgr) + gapFindADType (gap_devmgr) + gapIncSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessDisconnectCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapReadBufSizeCmdStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + gapSetAdvParamsStatus (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattFindServerInfo (gatt_server) + gattGetServerStatus (gatt_server) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessReadMultiReq (gatt_server) + gattProcessReadReq (gatt_server) + gattProcessRxData (gatt_task) + gattProcessWriteReq (gatt_server) + gattServApp_FindAuthorizeAttrCB (gattservapp) + gattServApp_FindCharCfgItem (gattservapp) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattServiceLastHandle (gatt_server) + gattStartTimer (gatt_task) + gattStopTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_HandleConnStatusCB (gpsservice) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + hciTxDataBufferReset (hci_data) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capAllocChannel (l2cap_util) + l2capBuildParamUpdateReq (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capFindLocalId (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParsePacket (l2cap_util) + l2capParseParamUpdateRsp (l2cap_util) + l2capParseSignalHdr (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + l2capStopTimer (l2cap_util) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Register (linkdb) + linkDB_Remove (linkdb) + linkDB_State (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llClearSetInts (ll_common) + llConnCleanup (ll_common) + llConnTerminate (ll_common) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llDequeueCtrlPkt (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llEnqueueCtrlPkt (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetTask (ll_scheduler) + llInitFeatureSet (ll_common) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessChanMap (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSaveConnState (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartSlaveSetup (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_adjust_header (osal_bufmgr) + osal_bm_alloc (osal_bufmgr) + osal_bm_free (osal_bufmgr) + osal_clear_event (OSAL) + osal_get_timeoutEx (OSAL_Timers) + osal_isbufset (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_memcmp (OSAL) + osal_memcpy (OSAL) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_allocate (OSAL) + osal_msg_enqueue (OSAL) + osal_msg_enqueue_push (OSAL) + osal_msg_extract (OSAL) + osal_msg_push (OSAL) + osal_msg_receive (OSAL) + osal_msg_send (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_revmemcpy (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + osal_snv_compact (osal_snv) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + phyFindWlEntry (phy) + reportStatusChange (linkdb) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + setActivePage (osal_snv) + smEncrypt (sm_mgr) + smEndPairing (sm_pairing) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandBuf (sm_mgr) + smGenerateRandMsg (sm_pairing) + smLinkCheck (sm_pairing) + smPairingSendEncInfo (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendIdentityInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smPairingSendSingingInfo (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smSetPairingReqRsp (sm_pairing) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + smUint8ToAuthReq (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + sm_xor (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParsePairingReq (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + timeReadAttrCB (timeservice) + timeWriteAttrCB (timeservice) + utilExtractUuid16 (st_util) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + xor_128 (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FUNC_ENTER_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000020BD - 00002122 (0x66 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FUNC_ENTER_XDATA 000020BD ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustTimeBackward (ll_timer2) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llGetNextDataChan (ll_common) + llSetNextDataChan (ll_common) + llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_LEAVE_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002123 - 00002168 (0x46 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BANKED_LEAVE_XDATA 00002123 ?Subroutine0 (OnBoard) + ?Subroutine0 (devinfoservice) + ?Subroutine0 (osal_bufmgr) + ?Subroutine0 (timeservice) + ?Subroutine1 (OSAL_Timers) + ?Subroutine1 (battservice) + ?Subroutine1 (gapbondmgr) + ?Subroutine1 (timeservice) + ?Subroutine1 (wimu) + ?Subroutine2 (OSAL) + ?Subroutine2 (OSAL_Timers) + ?Subroutine2 (hal_uart) + ?Subroutine2 (wimu) + ?Subroutine3 (OSAL) + ?Subroutine4 (OSAL) + ?Subroutine4 (gapbondmgr) + ?Subroutine5 (gapbondmgr) + Actimetry_AddService (actimetryservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + COBS_StuffData (wimu) + COBS_UnStuffData (wimu) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_DeviceInit (gap) + GAP_Init (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_RegisterService (gatt_server) + GGS_SetParameter (gapgattserver) + HCI_CommandStatusEvent (hci_event) + HCI_Init (hci_tl) + HCI_LE_SetAdvParamCmd (hci) + HCI_ProcessEvent (hci_tl) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + Hal_ProcessEvent (hal_drivers) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_Init (l2cap_task) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_TxData (ll) + OnBoard_SendKeys (OnBoard) + PHY_AddWlEntry (phy) + SM_Init (sm_task) + SM_ProcessEvent (sm_task) + SM_StartPairing (sm_pairing) + Segment part 105 (gattservapp) + Segment part 11 (sm_mgr) + Segment part 120 (gapbondmgr) + Segment part 120 (gattservapp) + Segment part 13 (hci_event) + Segment part 13 (l2cap_task) + Segment part 135 (hci) + Segment part 14 (sm_rsppairing) + Segment part 146 (ll) + Segment part 153 (ll) + Segment part 16 (gap_linkmgr) + Segment part 16 (gatt_task) + Segment part 16 (hci_event) + Segment part 16 (l2cap_util) + Segment part 162 (gattservapp) + Segment part 163 (ll) + Segment part 168 (gattservapp) + Segment part 170 (ll_common) + Segment part 172 (ll) + Segment part 173 (ll_common) + Segment part 175 (att_util) + Segment part 177 (gattservapp) + Segment part 178 (ll_common) + Segment part 186 (ll_common) + Segment part 19 (gatt_task) + Segment part 20 (gap_task) + Segment part 20 (ll_enc) + Segment part 20 (sm_mgr) + Segment part 21 (l2cap_if) + Segment part 213 (ll_common) + Segment part 22 (l2cap_util) + Segment part 220 (phy) + Segment part 25 (gap_configmgr) + Segment part 26 (att_util) + Segment part 26 (gatt_server) + Segment part 26 (linkdb) + Segment part 26 (ll_scheduler) + Segment part 26 (osal_snv) + Segment part 28 (hci_data) + Segment part 30 (hal_uart) + Segment part 30 (sm_pairing) + Segment part 31 (gatt_server) + Segment part 31 (sm_rsppairing) + Segment part 33 (gpsservice) + Segment part 34 (gap_configmgr) + Segment part 34 (gap_peridevmgr) + Segment part 35 (gap_linkmgr) + Segment part 36 (?largewr) + Segment part 36 (att_server) + Segment part 36 (sm_pairing) + Segment part 37 (gapgattserver) + Segment part 38 (gapbondmgr) + Segment part 38 (hci_event) + Segment part 39 (ll_enc) + Segment part 39 (ll_slaveEndCauses) + Segment part 43 (phy) + Segment part 45 (osal_snv) + Segment part 46 (gattservapp) + Segment part 46 (ll_advEndCauses) + Segment part 46 (smp) + Segment part 47 (gap_configmgr) + Segment part 47 (gap_linkmgr) + Segment part 47 (gapgattserver) + Segment part 51 (sm_mgr) + Segment part 53 (att_util) + Segment part 53 (gap_linkmgr) + Segment part 53 (gap_peridevmgr) + Segment part 56 (sm_mgr) + Segment part 59 (att_util) + Segment part 61 (gap_peridevmgr) + Segment part 62 (gattservapp) + Segment part 62 (hci_event) + Segment part 62 (l2cap_util) + Segment part 62 (ll_enc) + Segment part 62 (peripheral) + Segment part 65 (l2cap_util) + Segment part 66 (gap_linkmgr) + Segment part 68 (gatt_server) + Segment part 71 (OSAL) + Segment part 71 (sm_mgr) + Segment part 72 (ll_scheduler) + Segment part 79 (phy) + Segment part 80 (gatt_server) + Segment part 81 (l2cap_util) + Segment part 81 (ll_common) + Segment part 81 (ll_scheduler) + Segment part 86 (att_util) + Segment part 9 (att_util) + Segment part 90 (sm_pairing) + Segment part 93 (gattservapp) + Segment part 98 (hci) + Segment part 98 (hci_event) + WIMU_updateProfileSensors (wimu) + battWriteAttrCB (battservice) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + disconnectNext (gap_linkmgr) + gapBondMgrAddBond (gapbondmgr) + gapFindADType (gap_devmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessOSALMsg (gap_task) + gapRole_ProcessGAPMsg (peripheral) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + gattProcessRxData (gatt_task) + generate_subkey (sm_mgr) + gps_HandleConnStatusCB (gpsservice) + gps_WriteAttrCB (gpsservice) + hciTxDataBufferReset (hci_data) + l2capNotifyData (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Register (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocTask (ll_scheduler) + llFindNextSecTask (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetTask (ll_scheduler) + llSaveConnState (ll_scheduler) + llScheduleTask (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_alloc (osal_bufmgr) + osal_bm_free (osal_bufmgr) + osal_mem_alloc (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_pwrmgr_task_state (OSAL_PwrMgr) + setActivePage (osal_snv) + smProcessOSALMsg (sm_task) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + sm_c1 (sm_pairing) + smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpParsePairingReq (smp) + sprintf (?sprintf) + timeWriteAttrCB (timeservice) + utilExtractUuid16 (st_util) + writeItem (osal_snv) + writeWord (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FUNC_LEAVE_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002169 - 000021A8 (0x40 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FUNC_LEAVE_XDATA 00002169 Segment part 279 (ll_common) + Segment part 94 (ll_timer2) + Segment part 98 (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?INTERRUPT_ENTER_XSP + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000021A9 - 00002207 (0x5f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?INTERRUPT_ENTER_XSP 000021A9 RF_NormalIsr (ll_isr) + T2_Isr (ll_isr) + halDmaIsr (hal_dma) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?INTERRUPT_LEAVE_XSP + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002208 - 0000225F (0x58 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?INTERRUPT_LEAVE_XSP 00002208 RF_NormalIsr (ll_isr) + T2_Isr (ll_isr) + halDmaIsr (hal_dma) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?PUSH_XSTACK_I + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002260 - 00002263 (0x4 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_FOUR 00002260 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + LL_TxData (ll) + SM_VerifyAuthenSig (sm_mgr) + WIMU_updateProfileSensors (wimu) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapWriteAdvEnableStatus (gap_peridevmgr) + llAdjustForMissedEvent (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osal_CbTimerStart (osal_cbtimer) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002264 - 00002267 (0x4 bytes), align: 0 + Segment part 2. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_TWO 00002264 ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_GetParameter (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + Batt_SetParameter (battservice) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 48 (sm_mgr) + Segment part 67 (att_util) + Segment part 81 (att_util) + Segment part 83 (sm_pairing) + Segment part 84 (att_util) + Segment part 88 (sm_pairing) + Segment part 98 (att_util) + Time_AddService (timeservice) + Time_GetParameter (timeservice) + Time_SetParameter (timeservice) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + battReadAttrCB (battservice) + battWriteAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessNewAddr (gap_configmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capEncapSendData (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_receive (OSAL) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + smEncrypt (sm_mgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smStartEncryption (sm_pairing) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + timeReadAttrCB (timeservice) + timeWriteAttrCB (timeservice) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002268 - 00002269 (0x2 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_ONE 00002268 ATT_ParsePacket (att_util) + Actimetry_SetParameter (actimetryservice) + Batt_SetParameter (battservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATT_ServiceChangedInd (gatt_server) + Gps_SetParameter (gpsservice) + HCI_LE_SetAdvParamCmd (hci) + HCI_TxDataSend (hci_data) + L2CAP_ConnParamUpdateReq (l2cap_if) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ProcessEvent (ll) + LL_TxData (ll) + Time_SetParameter (timeservice) + _formatted_write (?largewr) + gapBondMgrBondReq (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSetAdvParams (gap_peridevmgr) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + llProcessPendingTxData (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + sm_c1 (sm_pairing) + smpResponderProcessIncoming (sm_rsppairing) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 0000226A - 00002276 (0xd bytes), align: 0 + Segment part 4. Intra module refs: ?PUSH_XSTACK_I_FOUR + ?PUSH_XSTACK_I_ONE + ?PUSH_XSTACK_I_TWO + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I 0000226A + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?PUSH_XSTACK8_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002277 - 0000227A (0x4 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X_FOUR 00002277 GAP_MakeDiscoverable (gap_peridevmgr) + LL_ProcessEvent (ll) + LL_TxData (ll) + WIMU_ProcessEvent (wimu) + WIMU_requestDevInfo (wimu) + WIMU_setControlMode (wimu) + WIMU_setCurrentTime (wimu) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 0000227B - 0000227E (0x4 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X_TWO 0000227B GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_Bond (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_RegisterService (gatt_server) + LL_ProcessEvent (ll) + LL_TxData (ll) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapRole_ProcessGAPMsg (peripheral) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + llAdvEvt_TaskConnect (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSetNextDataChan (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smEndPairing (sm_pairing) + smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 0000227F - 000022A7 (0x29 bytes), align: 0 + Segment part 5. Intra module refs: ?PUSH_XSTACK8_X_FOUR + ?PUSH_XSTACK8_X_TWO + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X 0000227F smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SWITCH_DENSE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000022A8 - 000022AE (0x7 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_DENSE 000022A8 GAPRole_SetParameter (peripheral) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000022AF - 000022EC (0x3e bytes), align: 0 + Segment part 2. Intra module refs: ?US_SWITCH_DENSE + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000022ED - 000022ED (0x1 bytes), align: 0 + Segment part 4. Intra module refs: ?US_SWITCH_DENSE + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SWITCH_SPARSE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000022EE - 000022F7 (0xa bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_SPARSE 000022EE Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + GATTServApp_ReadAttr (gattservapp) + devInfo_ReadAttrCB (devinfoservice) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + gps_ReadAttrCB (gpsservice) + timeWriteAttrCB (timeservice) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000022F8 - 00002338 (0x41 bytes), align: 0 + Segment part 2. Intra module refs: ?US_SWITCH_SPARSE + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_SPARSE_LEAVE + 0000232A ?US_JMP_IF_IN_RANGE (?US_JMP_IF_IN_RANGE) + ?US_JMP_IF_VALUE (?US_JMP_IF_VALUE) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002339 - 00002339 (0x1 bytes), align: 0 + Segment part 4. Intra module refs: ?US_SWITCH_SPARSE + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_JMP_IF_IN_RANGE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000233A - 00002378 (0x3f bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_JMP_IF_IN_RANGE 0000233A ?US_SWITCH_SPARSE_LEAVE (?US_SWITCH_SPARSE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_JMP_IF_VALUE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002379 - 000023A3 (0x2b bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_JMP_IF_VALUE 00002379 ?US_SWITCH_SPARSE_LEAVE (?US_SWITCH_SPARSE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?memset + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFD3 - 0000FFFF (0x2d bytes), align: 0 + Segment part 6. Intra module refs: memset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + memset 0000FFD3 + XSTACK = 00000002 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000147F - 00001484 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + memset::?relay 0000147F HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + osal_memset (OSAL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?sprintf + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AE6B - 0001AE94 (0x2a bytes), align: 0 + Segment part 6. Intra module refs: put_c_in_string::?relay + LOCAL ADDRESS + ===== ======= + put_c_in_string 0001AE6B + is indirectly called + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AE95 - 0001AF01 (0x6d bytes), align: 0 + Segment part 8. Intra module refs: sprintf::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sprintf 0001AE95 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF02 - 0001AF0A (0x9 bytes), align: 0 + Segment part 10. Intra module refs: put_c_in_string + sprintf + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001485 - 0000148A (0x6 bytes), align: 0 + Segment part 7. Intra module refs: sprintf + LOCAL ADDRESS + ===== ======= + put_c_in_string::?relay + 00001485 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000148B - 00001490 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + sprintf::?relay 0000148B WIMU_updateProfileSensors (wimu) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?strlen + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B200 - 0001B21D (0x1e bytes), align: 0 + Segment part 6. Intra module refs: strlen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + strlen 0001B200 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001491 - 00001496 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + strlen::?relay 00001491 osal_strlen (OSAL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?largewr + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00008FEC - 00009467 (0x47c bytes), align: 0 + Segment part 34. Intra module refs: float_conversion::?relay + LOCAL ADDRESS + ===== ======= + float_conversion 00008FEC + XSTACK = 00000066 ( 00000013 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009468 - 0000946F (0x8 bytes), align: 0 + Segment part 36. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009470 - 0000947C (0xd bytes), align: 0 + Segment part 37. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000947D - 00009482 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009483 - 00009489 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000948A - 00009497 (0xe bytes), align: 0 + Segment part 40. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009498 - 000094A3 (0xc bytes), align: 0 + Segment part 41. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094A4 - 000094AF (0xc bytes), align: 0 + Segment part 42. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094B0 - 000094B5 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094B6 - 000094C0 (0xb bytes), align: 0 + Segment part 44. Intra module refs: Segment part 43 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094C1 - 000094C3 (0x3 bytes), align: 0 + Segment part 45. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094C4 - 000094CA (0x7 bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094CB - 000094D4 (0xa bytes), align: 0 + Segment part 47. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094D5 - 000094D8 (0x4 bytes), align: 0 + Segment part 48. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094D9 - 000094D9 (0x1 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094DA - 000094DF (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094E0 - 000094E5 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094E6 - 000094E7 (0x2 bytes), align: 0 + Segment part 52. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094E8 - 000094EB (0x4 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 52 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094EC - 000094F2 (0x7 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094F3 - 000094F8 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094F9 - 000094FC (0x4 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 55 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094FD - 00009500 (0x4 bytes), align: 0 + Segment part 57. Intra module refs: Segment part 113 + Segment part 56 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009501 - 00009509 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 104 + Segment part 57 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000950A - 00009EB7 (0x9ae bytes), align: 0 + Segment part 59. Intra module refs: _formatted_write::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + _formatted_write 0000950A + calls direct + XSTACK = 00000004 ( 00000066 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EB8 - 00009EB9 (0x2 bytes), align: 0 + Segment part 61. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EBA - 00009EC1 (0x8 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EC2 - 00009ECA (0x9 bytes), align: 0 + Segment part 63. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009ECB - 00009ED8 (0xe bytes), align: 0 + Segment part 64. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009ED9 - 00009EDC (0x4 bytes), align: 0 + Segment part 65. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EDD - 00009EE1 (0x5 bytes), align: 0 + Segment part 66. Intra module refs: Segment part 65 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EE2 - 00009EEA (0x9 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 66 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EEB - 00009EEF (0x5 bytes), align: 0 + Segment part 68. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EF0 - 00009EF8 (0x9 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EF9 - 00009EFE (0x6 bytes), align: 0 + Segment part 70. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EFF - 00009F08 (0xa bytes), align: 0 + Segment part 71. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F09 - 00009F0C (0x4 bytes), align: 0 + Segment part 72. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F0D - 00009F11 (0x5 bytes), align: 0 + Segment part 73. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F12 - 00009F1A (0x9 bytes), align: 0 + Segment part 74. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F1B - 00009F21 (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F22 - 00009F27 (0x6 bytes), align: 0 + Segment part 76. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F28 - 00009F2B (0x4 bytes), align: 0 + Segment part 77. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F2C - 00009F2C (0x1 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 77 + Segment part 80 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F2D - 00009F34 (0x8 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + Segment part 96 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F35 - 00009F3B (0x7 bytes), align: 0 + Segment part 80. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F3C - 00009F41 (0x6 bytes), align: 0 + Segment part 81. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F42 - 00009F45 (0x4 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F46 - 00009F4A (0x5 bytes), align: 0 + Segment part 83. Intra module refs: Segment part 82 + Segment part 84 + Segment part 96 + Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F4B - 00009F50 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F51 - 00009F5A (0xa bytes), align: 0 + Segment part 85. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F5B - 00009F5D (0x3 bytes), align: 0 + Segment part 86. Intra module refs: Segment part 98 + Segment part 99 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F5E - 00009F63 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 40 + Segment part 72 + Segment part 73 + Segment part 85 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F64 - 00009F6C (0x9 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 83 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F6D - 00009F6D (0x1 bytes), align: 0 + Segment part 89. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F6E - 00009F75 (0x8 bytes), align: 0 + Segment part 90. Intra module refs: Segment part 89 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F76 - 00009F79 (0x4 bytes), align: 0 + Segment part 91. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F7A - 00009F82 (0x9 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 106 + Segment part 91 + Segment part 94 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F83 - 00009F88 (0x6 bytes), align: 0 + Segment part 93. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F89 - 00009F8D (0x5 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 93 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F8E - 00009F95 (0x8 bytes), align: 0 + Segment part 95. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F96 - 00009F9C (0x7 bytes), align: 0 + Segment part 96. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F9D - 00009FAA (0xe bytes), align: 0 + Segment part 97. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FAB - 00009FB4 (0xa bytes), align: 0 + Segment part 98. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FB5 - 00009FBA (0x6 bytes), align: 0 + Segment part 99. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FBB - 00009FC2 (0x8 bytes), align: 0 + Segment part 100. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FC3 - 00009FC8 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: Segment part 100 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FC9 - 00009FD4 (0xc bytes), align: 0 + Segment part 102. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FD5 - 00009FDC (0x8 bytes), align: 0 + Segment part 103. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FDD - 00009FE3 (0x7 bytes), align: 0 + Segment part 104. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FE4 - 00009FF0 (0xd bytes), align: 0 + Segment part 105. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FF1 - 00009FF3 (0x3 bytes), align: 0 + Segment part 106. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FF4 - 00009FFB (0x8 bytes), align: 0 + Segment part 107. Intra module refs: Segment part 106 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FFC - 0000A008 (0xd bytes), align: 0 + Segment part 108. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A009 - 0000A010 (0x8 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A011 - 0000A016 (0x6 bytes), align: 0 + Segment part 110. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A017 - 0000A019 (0x3 bytes), align: 0 + Segment part 111. Intra module refs: Segment part 110 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A01A - 0000A020 (0x7 bytes), align: 0 + Segment part 112. Intra module refs: Segment part 111 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A021 - 0000A02E (0xe bytes), align: 0 + Segment part 113. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A02F - 0000A03A (0xc bytes), align: 0 + Segment part 114. Intra module refs: Segment part 108 + Segment part 113 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004A7 - 000004B7 (0x11 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004B8 - 000004C6 (0xf bytes), align: 0 + Segment part 9. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004C7 - 000004CA (0x4 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 10 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004CB - 000004CE (0x4 bytes), align: 0 + Segment part 13. Intra module refs: __Constant_7f800000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004CF - 000004D2 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: __Constant_3f800000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004D3 - 000004D6 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: __Constant_501502f9 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004D7 - 000004DA (0x4 bytes), align: 0 + Segment part 21. Intra module refs: __Constant_51ba43b7 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004DB - 000004DE (0x4 bytes), align: 0 + Segment part 23. Intra module refs: __Constant_41200000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004DF - 000004E2 (0x4 bytes), align: 0 + Segment part 25. Intra module refs: __Constant_2edbe700 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004E3 - 000004E6 (0x4 bytes), align: 0 + Segment part 27. Intra module refs: __Constant_40a00000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004E7 - 000004EA (0x4 bytes), align: 0 + Segment part 29. Intra module refs: __Constant_10 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004EB - 000004EE (0x4 bytes), align: 0 + Segment part 31. Intra module refs: __Constant_8 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001497 - 0000149C (0x6 bytes), align: 0 + Segment part 35. Intra module refs: _formatted_write + LOCAL ADDRESS + ===== ======= + float_conversion::?relay + 00001497 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000149D - 000014A2 (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + _formatted_write::?relay + 0000149D sprintf (?sprintf) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000119A - 000011AA (0x11 bytes), align: 0 + Segment part 6. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011AB - 000011B9 (0xf bytes), align: 0 + Segment part 8. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011BA - 000011BD (0x4 bytes), align: 0 + Segment part 10. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011BE - 000011C1 (0x4 bytes), align: 0 + Segment part 12. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_7f800000 000011BE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011C2 - 000011C5 (0x4 bytes), align: 0 + Segment part 14. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3f800000 000011C2 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011C6 - 000011C9 (0x4 bytes), align: 0 + Segment part 18. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_501502f9 000011C6 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011CA - 000011CD (0x4 bytes), align: 0 + Segment part 20. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_51ba43b7 000011CA + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011CE - 000011D1 (0x4 bytes), align: 0 + Segment part 22. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_41200000 000011CE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011D2 - 000011D5 (0x4 bytes), align: 0 + Segment part 24. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_2edbe700 000011D2 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011D6 - 000011D9 (0x4 bytes), align: 0 + Segment part 26. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_40a00000 000011D6 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011DA - 000011DD (0x4 bytes), align: 0 + Segment part 28. Intra module refs: _formatted_write + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_10 000011DA + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 000011DE - 000011E1 (0x4 bytes), align: 0 + Segment part 30. Intra module refs: _formatted_write + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_8 000011DE + + + + + **************************************** + * * + * MODULE SUMMARY * + * * + **************************************** + +Module CODE DATA XDATA IDATA BIT CONST +------ ---- ---- ----- ----- --- ----- + (Rel) (Rel) (Abs) (Rel) (Rel) (Rel) (Rel) +?ADD_XSTACK_DISP16 30 +?ADD_XSTACK_DISP8 27 +?ALLOC_XSTACK8 22 +?BANKED_CODE_SUPPORT 30 +?BANKED_ENTER_XDATA 108 +?BANKED_LEAVE_XDATA 70 +?CALL_IND 2 +?DEALLOC_XSTACK8 26 +?FLT_ADD 572 +?FLT_DIV 486 +?FLT_EQ 44 +?FLT_GE 79 +?FLT_LT 76 +?FLT_MUL 384 +?FLT_TEST_INF 21 +?FLT_TEST_INF_R1 21 +?FLT_TEST_NAN 15 +?FLT_TEST_NAN_R1 15 +?FLT_TEST_ZERO 10 +?FLT_TEST_ZERO_R1 10 +?FLT_TO_L 143 +?FUNC_ENTER_XDATA 102 +?FUNC_LEAVE_XDATA 64 +?INTERRUPT_ENTER_XSP 95 +?INTERRUPT_LEAVE_XSP 88 +?L_ADD 19 +?L_ADD_TO_X 19 +?L_ADD_X 19 +?L_AND_TO_X 19 +?L_AND_X 19 +?L_EQ_X 21 +?L_MOV_TO_X 15 +?L_MOV_X 15 +?L_MUL 128 +?L_NEG 20 +?L_SHL 31 +?L_SUB 20 +?L_SUB_FROM_X 20 +?L_TO_FLT 120 +?MOVE_LONG8_XDATA_IDATA 13 +?MOVE_LONG8_XDATA_XDATA 33 +?PUSH_XSTACK8_X 49 +?PUSH_XSTACK_I 23 +?SL_GE_X 38 +?SS_SHR 16 +?S_DIV_MOD 154 +?S_SHL 19 +?UL_DIV_MOD 112 +?UL_GE_X 31 +?UL_GT 16 +?UL_GT_X 16 +?UL_SHR 25 +?US_JMP_IF_IN_RANGE 63 +?US_JMP_IF_VALUE 43 +?US_SHR 15 +?US_SWITCH_DENSE 70 +?US_SWITCH_SPARSE 76 +?XLOAD_R2345 12 +?XSTACK_DISP8 10 +?XSTORE_R2345 12 +?cexit 5 +?cmain 116 +?largewr 4 259 64 + + shared 8 +?memset 51 +?sprintf 172 +?strlen 36 +CSTARTUP 18 + + common 3 +OSAL 1 543 3 +OSAL_ClockBLE 253 10 +OSAL_Memory 521 3 075 +OSAL_PwrMgr 124 7 +OSAL_Timers 1 135 6 + + shared 4 +OSAL_WIMU 119 2 23 +OnBoard 246 2 +VIRTUAL_REGISTERS 2 8 +WIMU_Main 83 1 + + shared 1 +actimetryservice 1 754 306 19 +att_server 519 +att_util 2 788 16 +battservice 434 46 13 +devinfoservice 1 065 238 54 +gap 92 +gap_configmgr 1 385 104 + + shared 8 +gap_devmgr 239 2 +gap_linkmgr 3 877 7 + + shared 4 +gap_peridevmgr 1 893 13 4 +gap_perilinkmgr 143 +gap_task 1 020 6 +gapbondmgr 4 788 176 6 + + shared 8 +gapgattserver 1 458 134 9 +gatt_server 4 146 13 48 +gatt_task 640 5 +gatt_uuid 26 26 +gattservapp 6 848 96 9 +gpsservice 824 160 19 +hal_adc 23 4 1 + + shared 1 +hal_aes 85 + + shared 3 +hal_crc + + shared 2 +hal_dma 63 4 40 + + shared 70 2 + + common +hal_drivers 135 1 +hal_flash 276 + + shared 1 +hal_key 9 +hal_led 22 1 +hal_sleep 25 2 + + shared 46 4 + + common +hal_startup 11 +hal_uart 1 370 9 661 + + shared 118 5 + + common +hci 1 263 5 +hci_data 1 040 34 +hci_event 3 298 9 +hci_tl 155 6 +l2cap_if 301 +l2cap_task 1 145 37 +l2cap_util 2 272 1 +linkdb 828 59 +ll 4 006 7 459 2 4 + + shared 2 12 +ll_advEndCauses 2 343 +ll_common 5 754 10 16 + + shared 8 +ll_constData 8 +ll_enc 2 617 1 44 32 +ll_errorEndCauses 9 +ll_halt 7 2 +ll_isr 599 + + shared 134 10 8 + + common +ll_math 81 6 +ll_scheduler 3 442 447 20 +ll_slaveEndCauses 4 722 4 +ll_sleep 4 2 + + shared 4 +ll_timer2 1 269 8 +ll_timerDrift 304 26 +osal_bufmgr 432 2 +osal_cbtimer 348 62 +osal_snv 6 296 4 8 +peripheral 3 015 152 +phy 1 430 1 +phy_image 3 582 3 582 +sm_mgr 3 601 2 16 +sm_pairing 3 885 6 25 +sm_rsppairing 2 898 6 4 +sm_task 459 1 +smp 1 959 +st_util 63 +timeservice 683 57 13 +wimu 2 493 302 15 + + shared 8 +N/A (command line) 24 768 213 +N/A (alignment) 5 1 +---------- ------- -- -- ----- --- - ----- +Total: 115 126 34 79 7 651 215 8 4 076 + + common 134 + + + **************************************** + * * + * SEGMENTS IN ADDRESS ORDER * + * * + **************************************** + + +SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN +======= ===== ============= =========== ==== ==== ===== +INTVEC CODE 00000000 - 00000085 86 com 0 +CSTART CODE 00000086 - 00000139 B4 rel 0 +BDATA_ID CODE 0000013A dse 0 +DATA_ID CODE 0000013A dse 0 +IDATA_ID CODE 0000013A dse 0 +IXDATA_ID CODE 0000013A dse 0 +PDATA_ID CODE 0000013A dse 0 +BIT_ID CODE 0000013A dse 0 +XDATA_ID CODE 0000013A - 000004EE 3B5 rel 0 +BANK_RELAYS CODE 000004EF - 000014A2 FB4 rel 0 +RCODE CODE 000014A3 - 000023A3 F01 rel 0 +DIFUNCT CODE 000023A4 dse 0 +CODE_C CODE 000023A4 - 000023AB 8 rel 2 +CODE_N CODE 000023AC dse 0 +NEAR_CODE CODE 000023AC - 00002AF6 74B rel 2 + 1 CODE 00002AF7 - 00007FFF 5509 rel 0 + 1 + CODE 00008000 - 0000FFFF 8000 rel 2 + 2 CODE 00010000 - 00017FF9 7FFA rel 0 + 3 CODE 00018000 - 0001B241 3242 rel 0 +BLENV_ADDRESS_SPACE + CODE 0001E800 - 0001F7FF 1000 rel 0 +REGISTERS DATA 00000000 - 00000007 8 rel 0 +VREG DATA 00000008 - 00000017 10 rel 0 +PSP DATA 00000018 dse 0 +XSP DATA 00000018 - 00000019 2 rel 0 +DATA_I DATA 0000001A dse 0 +BREG BIT 00000020.0 - 00000020.7 8 rel 0 +DATA_Z DATA 00000021 - 00000028 8 rel 0 +SFR_AN DATA 00000080 - 00000080 1 rel 0 + DATA 00000087 - 00000088 2 + DATA 0000008A - 0000008A 1 + DATA 0000008C - 0000008D 2 + DATA 00000090 - 00000091 2 + DATA 00000094 - 00000097 4 + DATA 0000009A - 000000A9 10 + DATA 000000AB - 000000AF 5 + DATA 000000B3 - 000000B4 2 + DATA 000000B6 - 000000B6 1 + DATA 000000B8 - 000000C0 9 + DATA 000000C3 - 000000C3 1 + DATA 000000C6 - 000000C7 2 + DATA 000000D1 - 000000D7 7 + DATA 000000D9 - 000000DB 3 + DATA 000000E1 - 000000E5 5 + DATA 000000E8 - 000000E9 2 + DATA 000000F1 - 000000F2 2 + DATA 000000F2 - 000000F5 4 + DATA 000000F8 - 000000FF 8 +XSTACK XDATA 00000001 - 00000300 300 rel 0 +XDATA_Z XDATA 00000301 - 00000E2C B2C rel 0 +XDATA_I XDATA 00000E2D - 000011E1 3B5 rel 0 + 1 XDATA 000011E2 - 00001DE3 C02 rel 0 + 1 CONST 00008000 - 00008FEB FEC rel 2 +IDATA_I IDATA 00000029 dse 0 +IDATA_Z IDATA 00000029 - 0000002A 2 rel 0 +ISTACK IDATA 0000002B - 000000FF D5 rel 0 + + **************************************** + * * + * END OF CROSS REFERENCE * + * * + **************************************** + + 115 260 bytes of CODE memory + 34 bytes of DATA memory (+ 79 absolute ) + 7 651 bytes of XDATA memory + 215 bytes of IDATA memory + 8 bits of BIT memory + 4 076 bytes of CONST memory + +Errors: none +Warnings: none + diff --git "a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_MT-PC013_d\303\251c.-16-113830-2015_Conflict.map" "b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_MT-PC013_d\303\251c.-16-113830-2015_Conflict.map" new file mode 100644 index 0000000..6dac918 --- /dev/null +++ "b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_MT-PC013_d\303\251c.-16-113830-2015_Conflict.map" @@ -0,0 +1,30112 @@ +################################################################################ +# # +# IAR Universal Linker V5.0.2.5/W32 # +# # +# Link time = 16/Dec/2015 11:38:26 # +# Target CPU = x51 # +# List file = D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# List\WIMU.map # +# Output file 1 = D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Exe\WIMU.hex # +# Format: intel-extended # +# Output file 2 = D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Exe\WIMU.d51 # +# Format: debug # +# UBROF version 10.0.3 # +# Using library modules for C-SPY (-rt) # +# Command line = "-IC:\Program Files (x86)\IAR Systems\Embedded Wo # +# rkbench 6.0\8051\CONFIG\" # +# -D_NR_OF_BANKS=0x03 -D_CODEBANK_END=0xFFFF # +# -D_CODEBANK_START=0x8000 -D?CBANK_MASK=0xFF # +# -D?CBANK=0x9F # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\Libraries\CC2540DB\bin\CC2540_ # +# BLE_peri.lib # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\Libraries\Common\bin\CC254x_BL # +# E_HCI_TL_None.lib # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL_ClockBLE.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL_Memory.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL_PwrMgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL_Timers.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OSAL_WIMU.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\OnBoard.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\WIMU_Main.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\actimetryservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\battservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\devinfoservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\gap.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\gapbondmgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\gatt_uuid.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\gpsservice.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_adc.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_aes.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_crc.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_dma.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_drivers.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_flash.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_key.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_lcd.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_led.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_sleep.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_startup.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_timer.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\hal_uart.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\npi.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\osal_bufmgr.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\osal_cbtimer.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\osal_snv.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\peripheral.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\st_util.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\wimu.r51 # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Obj\wimu_util.r51 # +# -o # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# Exe\WIMU.d51 # +# -l # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\ # +# List\WIMU.map # +# -xmsn -f # +# D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects # +# \Wimu\Projects\ble\WIMU\CC2540DB\..\..\common\cc2 # +# 540\ti_51ew_cc2540f128b.xcl # +# (-D_IDATA0_START=0x00 -D_IDATA0_END=0xFF # +# -D_PDATA0_START=0x1E00 -D_PDATA0_END=0x1EFF # +# -D_IXDATA0_START=0x0001 -D_IXDATA0_END=0x1EFF # +# -D_XDATA0_START=_IXDATA0_START # +# -D_XDATA0_END=_IXDATA0_END # +# -D_NEAR_CODE_START=0x0000 # +# -D_FIRST_BANK_ADDR=0x10000 -D?REGISTER_BANK=0x0 # +# -D_REGISTER_BANK_START=0x0 -D?PBANK_NUMBER=0x1E # +# -D_BREG_START=0x00 -D?VB=0x20 -D?ESP=0x9B # +# -Z(BIT)BREG=_BREG_START -Z(BIT)BIT_N=0-7F # +# -Z(DATA)REGISTERS+8=_REGISTER_BANK_START # +# -Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F # +# -Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F # +# -Z(DATA)PSP,XSP=08-7F -Z(DATA)DOVERLAY=08-7F # +# -Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F # +# -U(IDATA)0-7F=(DATA)0-7F # +# -Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA0_END # +# -Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA0_END # +# -Z(IDATA)IOVERLAY=08-FF -Z(CODE)INTVEC=0 # +# -Z(CODE)CSTART=_NEAR_CODE_START-(_CODEBANK_START- # +# 1) # +# -Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_I # +# D,PDATA_ID,XDATA_ID=_NEAR_CODE_START-(_CODEBANK_S # +# TART-1) # +# -D_SLEEP_CODE_SPACE_START=(_CODEBANK_START-8) # +# -D_SLEEP_CODE_SPACE_END=(_CODEBANK_START-1) # +# -Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP # +# _CODE_SPACE_END # +# -Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_C,CODE_N,N # +# EAR_CODE=_NEAR_CODE_START-(_CODEBANK_START-1) # +# -P(CONST)XDATA_ROM_C=0x8000-0xFFFF # +# -P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF # +# -QXDATA_ROM_C=XDATA_ROM_C_FLASH # +# -P(CODE)BANKED_CODE=_NEAR_CODE_START-(_CODEBANK_S # +# TART-1),[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_COD # +# EBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 # +# -Z(CODE)CHECKSUM#(_CODEBANK_START-1) # +# -Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED # +# _STACK_START # +# -Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA0_START-_ # +# PDATA0_END # +# -Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA0_START-_ # +# XDATA0_END # +# -Z(XDATA)PDATA_Z,PDATA_I=_PDATA0_START-_PDATA0_EN # +# D # +# -P(XDATA)PDATA_N=_PDATA0_START-_PDATA0_END # +# -Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA0_START-_IXDATA # +# 0_END # +# -P(XDATA)IXDATA_N=_IXDATA0_START-_IXDATA0_END # +# -Z(XDATA)XDATA_Z,XDATA_I=_XDATA0_START-_XDATA0_EN # +# D # +# -P(XDATA)XDATA_N=_XDATA0_START-_XDATA0_END # +# -Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA0_STAR # +# T-_XDATA0_END # +# -cx51 -D_BLENV_ADDRESS_SPACE_START=0x3E800 # +# -D_BLENV_ADDRESS_SPACE_END=0x3F7FF # +# -Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_ # +# START-_BLENV_ADDRESS_SPACE_END # +# -M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_COD # +# EBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000 # +# =0x8000 # +# -ww69=i -D_BANK0_START=0x00000 # +# -D_BANK0_END=0x07FFF -D_BANK1_START=0x18000 # +# -D_BANK1_END=0x1FFFF -D_BANK2_START=0x28000 # +# -D_BANK2_END=0x2FFFF -D_BANK3_START=0x38000 # +# -D_BANK3_END=(_BLENV_ADDRESS_SPACE_START-1) # +# -P(CODE)BANK0=_BANK0_START-_BANK0_END # +# -P(CODE)BANK1=_BANK1_START-_BANK1_END # +# -P(CODE)BANK2=_BANK2_START-_BANK2_END # +# -P(CODE)BANK3=_BANK3_START-_BANK3_END # +# -D_FLASH_LOCK_BITS_START=0x3FFF0 # +# -D_FLASH_LOCK_BITS_END=0x3FFFF # +# -Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_F # +# LASH_LOCK_BITS_END # +# -U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLAS # +# H_LOCK_BITS_END) # +# -D_NR_OF_VIRTUAL_REGISTERS=10 -D?PBANK=0x93 # +# -e?BCALL_FF=?BCALL -e?BRET_FF=?BRET # +# -e?BDISPATCH_FF=?BDISPATCH # +# -e_medium_write=_formatted_write # +# -e_medium_read=_formatted_read -rt # +# -Ointel-extended=D:\Simon_Dev\WIMuGPS\Workspace\W # +# IMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB # +# \CC2540F128-WIMU\Exe\WIMU.hex # +# -s __program_start # +# "C:\Program Files (x86)\IAR Systems\Embedded Work # +# bench 6.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51" # +# -D_IDATA_STACK_SIZE=0xD4 # +# -D_EXTENDED_STACK_START=0x00 # +# -D_EXTENDED_STACK_SIZE=0x00 # +# -D_PDATA_STACK_SIZE=0x00 # +# -D_XDATA_STACK_SIZE=0x314 # +# -D_XDATA_HEAP_SIZE=0x57 -D_FAR_HEAP_SIZE=0xFFF # +# -D_HUGE_HEAP_SIZE=0xFFF # +# -D_FAR22_HEAP_SIZE=0xFFF # +# # +# Copyright (C) 1987-2010 IAR Systems AB. # +################################################################################ + + + + + + **************************************** + * * + * CROSS REFERENCE * + * * + **************************************** + + Program entry at : CODE 0000010A Relocatable, from module : CSTARTUP + + + + + **************************************** + * * + * RUNTIME MODEL * + * * + **************************************** + + __SystemLibrary = CLib + __calling_convention = xdata_reentrant + __code_model = banked + __core = plain + __data_model = large + __dptr_size = 16 + __extended_stack = disabled + __location_for_constants = data + __number_of_dptrs = 1 + __rt_version = 1 + + + + **************************************** + * * + * MODULE MAP * + * * + **************************************** + + + DEFINED ABSOLUTE ENTRIES + ************************************************************************* + + DEFINED ABSOLUTE ENTRIES + PROGRAM MODULE, NAME : ?ABS_ENTRY_MOD + +Absolute parts + ENTRY ADDRESS REF BY + ===== ======= ====== + _FAR22_HEAP_SIZE 00000FFF + _HUGE_HEAP_SIZE 00000FFF + _FAR_HEAP_SIZE 00000FFF + _XDATA_HEAP_SIZE 00000057 + _XDATA_STACK_SIZE 00000314 + _PDATA_STACK_SIZE 00000000 + _EXTENDED_STACK_SIZE 00000000 + _EXTENDED_STACK_START 00000000 + _IDATA_STACK_SIZE 000000D4 + ?PBANK 00000093 + _NR_OF_VIRTUAL_REGISTERS + 00000010 + _FLASH_LOCK_BITS_END 0001FFFF + _FLASH_LOCK_BITS_START + 0001FFF0 + _BANK3_END 0001E7FF + _BANK3_START 00018000 + _BANK2_END 00017FFF + _BANK2_START 00010000 + _BANK1_END 0000FFFF + _BANK1_START 00008000 + _BANK0_END 00007FFF + _BANK0_START 00000000 + _BLENV_ADDRESS_SPACE_END + 0001F7FF + _BLENV_ADDRESS_SPACE_START + 0001E800 + _SLEEP_CODE_SPACE_END 00007FFF + _SLEEP_CODE_SPACE_START + 00007FF8 + ?ESP 0000009B + ?VB 00000020 ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + _BREG_START 00000000 + ?PBANK_NUMBER 0000001E + _REGISTER_BANK_START 00000000 + ?REGISTER_BANK 00000000 Segment part 6 (CSTARTUP) + _FIRST_BANK_ADDR 00010000 + _NEAR_CODE_START 00000000 + _XDATA0_END 00001EFF + _XDATA0_START 00000001 + _IXDATA0_END 00001EFF + _IXDATA0_START 00000001 + _PDATA0_END 00001EFF + _PDATA0_START 00001E00 + _IDATA0_END 000000FF + _IDATA0_START 00000000 + ?CBANK 0000009F ?RESET_CODE_BANK (CSTARTUP) + Segment part 0 (?BANKED_CODE_SUPPORT) + ?CBANK_MASK 000000FF + _CODEBANK_START 00008000 + _CODEBANK_END 0000FFFF + _NR_OF_BANKS 00000003 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\Libraries\CC2540DB\bin\CC2540_BLE_peri.lib + LIBRARY MODULE, NAME : att_server + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3C2 - 0001A3D8 (0x17 bytes), align: 0 + Segment part 6. Intra module refs: ATT_ErrorRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ErrorRsp 0001A3C2 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3D9 - 0001A407 (0x2f bytes), align: 0 + Segment part 8. Intra module refs: ATT_ExchangeMTURsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExchangeMTURsp 0001A3D9 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A408 - 0001A440 (0x39 bytes), align: 0 + Segment part 10. Intra module refs: ATT_FindInfoRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindInfoRsp 0001A408 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A441 - 0001A468 (0x28 bytes), align: 0 + Segment part 12. Intra module refs: ATT_FindByTypeValueRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindByTypeValueRsp + 0001A441 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A469 - 0001A490 (0x28 bytes), align: 0 + Segment part 14. Intra module refs: ATT_ReadByTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByTypeRsp 0001A469 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A491 - 0001A496 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: ATT_ExchangeMTURsp + ATT_FindByTypeValueRsp + ATT_FindInfoRsp + ATT_ReadByGrpTypeRsp + ATT_ReadByTypeRsp + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A497 - 0001A4AD (0x17 bytes), align: 0 + Segment part 17. Intra module refs: ATT_ReadRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadRsp 0001A497 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4AE - 0001A4C4 (0x17 bytes), align: 0 + Segment part 19. Intra module refs: ATT_ReadBlobRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadBlobRsp 0001A4AE + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4C5 - 0001A4DA (0x16 bytes), align: 0 + Segment part 21. Intra module refs: ATT_ReadMultiRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadMultiRsp 0001A4C5 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A4DB - 0001A501 (0x27 bytes), align: 0 + Segment part 23. Intra module refs: ATT_ReadByGrpTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByGrpTypeRsp 0001A4DB + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A502 - 0001A514 (0x13 bytes), align: 0 + Segment part 25. Intra module refs: ATT_WriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_WriteRsp 0001A502 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A515 - 0001A52A (0x16 bytes), align: 0 + Segment part 27. Intra module refs: ATT_PrepareWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_PrepareWriteRsp 0001A515 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A52B - 0001A53D (0x13 bytes), align: 0 + Segment part 29. Intra module refs: ATT_ExecuteWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExecuteWriteRsp 0001A52B + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A53E - 0001A54D (0x10 bytes), align: 0 + Segment part 31. Intra module refs: ATT_HandleValueNoti::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueNoti 0001A53E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A54E - 0001A553 (0x6 bytes), align: 0 + Segment part 33. Intra module refs: ATT_HandleValueInd + ATT_HandleValueNoti + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A554 - 0001A557 (0x4 bytes), align: 0 + Segment part 34. Intra module refs: ATT_ExecuteWriteRsp + ATT_WriteRsp + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A558 - 0001A55D (0x6 bytes), align: 0 + Segment part 35. Intra module refs: ATT_ErrorRsp + ATT_PrepareWriteRsp + ATT_ReadBlobRsp + ATT_ReadMultiRsp + ATT_ReadRsp + Segment part 33 + Segment part 34 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A55E - 0001A562 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: ATT_ExchangeMTURsp + ATT_FindByTypeValueRsp + ATT_FindInfoRsp + ATT_ReadByGrpTypeRsp + ATT_ReadByTypeRsp + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A563 - 0001A574 (0x12 bytes), align: 0 + Segment part 37. Intra module refs: ATT_HandleValueInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueInd 0001A563 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004BF - 000004C4 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ErrorRsp::?relay 000004BF gattProcessRxData (gatt_task) + gattServApp_ProcessMsg (gattservapp) + gattServerProcessMsgCB (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004C5 - 000004CA (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExchangeMTURsp::?relay + 000004C5 gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004CB - 000004D0 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindInfoRsp::?relay + 000004CB gattProcessFindInfoReq (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004D1 - 000004D6 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_FindByTypeValueRsp::?relay + 000004D1 gattServApp_ProcessFindByTypeValueReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004D7 - 000004DC (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByTypeRsp::?relay + 000004D7 gattServApp_ProcessReadByTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004DD - 000004E2 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadRsp::?relay 000004DD gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004E3 - 000004E8 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadBlobRsp::?relay + 000004E3 gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004E9 - 000004EE (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadMultiRsp::?relay + 000004E9 gattServApp_ProcessReadMultiReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004EF - 000004F4 (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ReadByGrpTypeRsp::?relay + 000004EF gattServApp_ProcessReadByGrpTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004F5 - 000004FA (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_WriteRsp::?relay 000004F5 gattServApp_ProcessWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000004FB - 00000500 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_PrepareWriteRsp::?relay + 000004FB gattServApp_ProcessPrepareWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000501 - 00000506 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ExecuteWriteRsp::?relay + 00000501 gattServApp_ProcessExecuteWriteReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000507 - 0000050C (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueNoti::?relay + 00000507 GATT_Notification (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000050D - 00000512 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_HandleValueInd::?relay + 0000050D GATT_Indication (gatt_server) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : att_util + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E7F - 00008E8E (0x10 bytes), align: 0 + Segment part 6. Intra module refs: ATT_ConvertUUIDto128 + ENTRY ADDRESS REF BY + ===== ======= ====== + btBaseUUID 00008E7F + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012306 - 000123FF (0xfa bytes), align: 0 + Segment part 7. Intra module refs: ATT_ParsePacket::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePacket 00012306 + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012400 - 00012404 (0x5 bytes), align: 0 + Segment part 9. Intra module refs: ATT_ParseFindByTypeValueReq + ATT_ParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012405 - 0001242E (0x2a bytes), align: 0 + Segment part 10. Intra module refs: ATT_BuildErrorRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildErrorRsp 00012405 + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001242F - 00012439 (0xb bytes), align: 0 + Segment part 16. Intra module refs: ATT_BuildExchangeMTURsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001243A - 0001245A (0x21 bytes), align: 0 + Segment part 17. Intra module refs: ATT_ParseExchangeMTUReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExchangeMTUReq + 0001243A + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245B - 0001245C (0x2 bytes), align: 0 + Segment part 19. Intra module refs: ATT_BuildExchangeMTURsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildExchangeMTURsp + 0001245B + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245D - 0001245E (0x2 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 16 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001245F - 00012465 (0x7 bytes), align: 0 + Segment part 23. Intra module refs: ATT_ParseExecuteWriteReq + Segment part 22 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012466 - 0001246A (0x5 bytes), align: 0 + Segment part 26. Intra module refs: ATT_BuildErrorRsp + ATT_ParseExchangeMTUReq + ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001246B - 0001248B (0x21 bytes), align: 0 + Segment part 29. Intra module refs: ATT_ParseFindInfoReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindInfoReq 0001246B + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001248C - 0001253D (0xb2 bytes), align: 0 + Segment part 31. Intra module refs: ATT_BuildFindInfoRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindInfoRsp 0001248C + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001253E - 0001254B (0xe bytes), align: 0 + Segment part 33. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001254C - 00012567 (0x1c bytes), align: 0 + Segment part 34. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012568 - 00012568 (0x1 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 34 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012569 - 0001256C (0x4 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001256D - 00012574 (0x8 bytes), align: 0 + Segment part 37. Intra module refs: ATT_BuildFindByTypeValueRsp + Segment part 36 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012575 - 00012575 (0x1 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 34 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012576 - 0001257D (0x8 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001257E - 00012584 (0x7 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 34 + Segment part 39 + Segment part 47 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012585 - 0001258E (0xa bytes), align: 0 + Segment part 43. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001258F - 00012597 (0x9 bytes), align: 0 + Segment part 47. Intra module refs: ATT_BuildFindInfoRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012598 - 0001265C (0xc5 bytes), align: 0 + Segment part 48. Intra module refs: ATT_ParseFindByTypeValueReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindByTypeValueReq + 00012598 + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001265D - 00012664 (0x8 bytes), align: 0 + Segment part 50. Intra module refs: ATT_CompareUUID + ATT_ParseFindByTypeValueReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012665 - 000126BB (0x57 bytes), align: 0 + Segment part 51. Intra module refs: ATT_BuildFindByTypeValueRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindByTypeValueRsp + 00012665 + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126BC - 000126C0 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126C1 - 000126C8 (0x8 bytes), align: 0 + Segment part 54. Intra module refs: ATT_BuildErrorRsp + ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126C9 - 000126CD (0x5 bytes), align: 0 + Segment part 57. Intra module refs: ATT_ParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126CE - 000126D2 (0x5 bytes), align: 0 + Segment part 58. Intra module refs: ATT_CompareUUID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126D3 - 000126D7 (0x5 bytes), align: 0 + Segment part 59. Intra module refs: ATT_ConvertUUIDto128 + ATT_ParseWriteReq + Segment part 58 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000126D8 - 00012754 (0x7d bytes), align: 0 + Segment part 62. Intra module refs: ATT_ParseReadByTypeReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadByTypeReq + 000126D8 + calls direct + XSTACK = 00000004 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012755 - 0001275D (0x9 bytes), align: 0 + Segment part 64. Intra module refs: ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001275E, align: 0 + Segment part 65. Intra module refs: ATT_BuildReadByTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByTypeRsp + 0001275E + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001275E - 00012796 (0x39 bytes), align: 0 + Segment part 67. Intra module refs: ATT_BuildReadByGrpTypeRsp + ATT_BuildReadByTypeRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012797 - 00012798 (0x2 bytes), align: 0 + Segment part 68. Intra module refs: Segment part 67 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012799 - 000127A0 (0x8 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127A1 - 000127C2 (0x22 bytes), align: 0 + Segment part 74. Intra module refs: ATT_ParseReadReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadReq 000127A1 + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127C3 - 000127C9 (0x7 bytes), align: 0 + Segment part 76. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127CA - 000127D1 (0x8 bytes), align: 0 + Segment part 77. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D2 - 000127D7 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: ATT_ParseExchangeMTUReq + ATT_ParseReadReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D8, align: 0 + Segment part 79. Intra module refs: ATT_BuildReadRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadRsp 000127D8 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127D8 - 000127FE (0x27 bytes), align: 0 + Segment part 81. Intra module refs: ATT_BuildReadBlobRsp + ATT_BuildReadMultiRsp + ATT_BuildReadRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000127FF - 00012824 (0x26 bytes), align: 0 + Segment part 84. Intra module refs: ATT_BuildPrepareWriteRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012825 - 00012829 (0x5 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 67 + Segment part 84 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001282A - 0001282E (0x5 bytes), align: 0 + Segment part 86. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ATT_ParseReadMultiReq + Segment part 81 + Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001282F - 00012832 (0x4 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 84 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012833 - 00012840 (0xe bytes), align: 0 + Segment part 88. Intra module refs: Segment part 81 + Segment part 87 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012841 - 0001284E (0xe bytes), align: 0 + Segment part 89. Intra module refs: Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001284F - 0001285D (0xf bytes), align: 0 + Segment part 90. Intra module refs: Segment part 54 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001285E - 000128D8 (0x7b bytes), align: 0 + Segment part 91. Intra module refs: ATT_ParseWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseWriteReq 0001285E + calls direct + XSTACK = 00000004 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128D9 - 000128DB (0x3 bytes), align: 0 + Segment part 93. Intra module refs: ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128DC - 000128E0 (0x5 bytes), align: 0 + Segment part 94. Intra module refs: ATT_ConvertUUIDto128 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128E1 - 000128E6 (0x6 bytes), align: 0 + Segment part 95. Intra module refs: ATT_ParseExecuteWriteReq + ATT_ParsePacket + ATT_ParseReadByTypeReq + ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000128E7 - 0001290F (0x29 bytes), align: 0 + Segment part 98. Intra module refs: ATT_BuildHandleValueInd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012910 - 00012913 (0x4 bytes), align: 0 + Segment part 99. Intra module refs: Segment part 16 + Segment part 98 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012914 - 00012927 (0x14 bytes), align: 0 + Segment part 100. Intra module refs: Segment part 89 + Segment part 99 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012928 - 00012928 (0x1 bytes), align: 0 + Segment part 101. Intra module refs: Segment part 100 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012929 - 0001292F (0x7 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 100 + Segment part 101 + Segment part 159 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012930 - 00012951 (0x22 bytes), align: 0 + Segment part 107. Intra module refs: ATT_ParseReadBlobReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadBlobReq 00012930 + XSTACK = 00000004 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012952 - 00012958 (0x7 bytes), align: 0 + Segment part 109. Intra module refs: ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012959 - 0001297A (0x22 bytes), align: 0 + Segment part 110. Intra module refs: ATT_ParseFindInfoReq + ATT_ParseReadBlobReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001297B - 0001298D (0x13 bytes), align: 0 + Segment part 111. Intra module refs: Segment part 110 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001298E - 00012990 (0x3 bytes), align: 0 + Segment part 112. Intra module refs: ATT_BuildReadBlobRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadBlobRsp 0001298E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012991 - 000129A5 (0x15 bytes), align: 0 + Segment part 118. Intra module refs: ATT_BuildFindByTypeValueRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000129A6 - 00012A15 (0x70 bytes), align: 0 + Segment part 119. Intra module refs: ATT_ParseReadMultiReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadMultiReq 000129A6 + XSTACK = 00000004 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A16 - 00012A19 (0x4 bytes), align: 0 + Segment part 121. Intra module refs: ATT_ParseExecuteWriteReq + ATT_ParseReadMultiReq + ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A1A - 00012A1F (0x6 bytes), align: 0 + Segment part 122. Intra module refs: Segment part 109 + Segment part 121 + Segment part 178 + Segment part 57 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A20 - 00012A22 (0x3 bytes), align: 0 + Segment part 123. Intra module refs: ATT_BuildReadMultiRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadMultiRsp 00012A20 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A23 - 00012A25 (0x3 bytes), align: 0 + Segment part 128. Intra module refs: ATT_BuildReadByGrpTypeRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByGrpTypeRsp + 00012A23 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A26 - 00012A85 (0x60 bytes), align: 0 + Segment part 136. Intra module refs: ATT_ParsePrepareWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePrepareWriteReq + 00012A26 + calls direct + XSTACK = 00000004 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A86 - 00012A92 (0xd bytes), align: 0 + Segment part 138. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A93 - 00012A99 (0x7 bytes), align: 0 + Segment part 139. Intra module refs: ATT_ParseWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9A - 00012A9B (0x2 bytes), align: 0 + Segment part 140. Intra module refs: Segment part 139 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9C - 00012A9C (0x1 bytes), align: 0 + Segment part 141. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + Segment part 140 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012A9D - 00012AA2 (0x6 bytes), align: 0 + Segment part 142. Intra module refs: ATT_ParseFindByTypeValueReq + Segment part 141 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AA3 - 00012AAC (0xa bytes), align: 0 + Segment part 143. Intra module refs: ATT_ParseReadMultiReq + Segment part 139 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AAD - 00012AAD (0x1 bytes), align: 0 + Segment part 144. Intra module refs: Segment part 142 + Segment part 33 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AAE - 00012AB3 (0x6 bytes), align: 0 + Segment part 145. Intra module refs: Segment part 144 + Segment part 186 + Segment part 69 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AB4 - 00012AC4 (0x11 bytes), align: 0 + Segment part 146. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AC5 - 00012ACC (0x8 bytes), align: 0 + Segment part 147. Intra module refs: ATT_ParsePrepareWriteReq + ATT_ParseReadByTypeReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012ACD - 00012ACF (0x3 bytes), align: 0 + Segment part 148. Intra module refs: ATT_BuildPrepareWriteRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildPrepareWriteRsp + 00012ACD + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AD0 - 00012AD8 (0x9 bytes), align: 0 + Segment part 152. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AD9 - 00012ADC (0x4 bytes), align: 0 + Segment part 157. Intra module refs: ATT_BuildErrorRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012ADD - 00012AE0 (0x4 bytes), align: 0 + Segment part 158. Intra module refs: ATT_BuildErrorRsp + Segment part 157 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AE1 - 00012AE4 (0x4 bytes), align: 0 + Segment part 159. Intra module refs: Segment part 118 + Segment part 158 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012AE5 - 00012B14 (0x30 bytes), align: 0 + Segment part 160. Intra module refs: ATT_ParseExecuteWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExecuteWriteReq + 00012AE5 + XSTACK = 00000004 ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B15 - 00012B17 (0x3 bytes), align: 0 + Segment part 164. Intra module refs: ATT_BuildHandleValueInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildHandleValueInd + 00012B15 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B18 - 00012B24 (0xd bytes), align: 0 + Segment part 168. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B25 - 00012B29 (0x5 bytes), align: 0 + Segment part 169. Intra module refs: ATT_ParsePrepareWriteReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B2A - 00012B34 (0xb bytes), align: 0 + Segment part 170. Intra module refs: Segment part 169 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012B35 - 00012C1D (0xe9 bytes), align: 0 + Segment part 173. Intra module refs: attSendMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + attSendMsg 00012B35 + calls direct + XSTACK = 00000002 ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012C1E - 00012C22 (0x5 bytes), align: 0 + Segment part 175. Intra module refs: ATT_BuildFindInfoRsp + attSendMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012C23 - 00012CD1 (0xaf bytes), align: 0 + Segment part 176. Intra module refs: ATT_CompareUUID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_CompareUUID 00012C23 + calls direct + XSTACK = 00000004 ( 0000001E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012CD2 - 00012CD8 (0x7 bytes), align: 0 + Segment part 178. Intra module refs: ATT_CompareUUID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012CD9 - 00012D36 (0x5e bytes), align: 0 + Segment part 179. Intra module refs: ATT_ConvertUUIDto128::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ConvertUUIDto128 00012CD9 + calls direct + XSTACK = 0000001C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D37 - 00012D3F (0x9 bytes), align: 0 + Segment part 181. Intra module refs: ATT_ConvertUUIDto128 + ATT_ParseFindByTypeValueReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D40 - 00012D43 (0x4 bytes), align: 0 + Segment part 186. Intra module refs: ATT_ConvertUUIDto128 + Segment part 81 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000513 - 00000518 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePacket::?relay + 00000513 gattProcessRxData (gatt_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000519 - 0000051E (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildErrorRsp::?relay + 00000519 ATT_ErrorRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000051F - 00000524 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExchangeMTUReq::?relay + 0000051F Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000525 - 0000052A (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildExchangeMTURsp::?relay + 00000525 ATT_ExchangeMTURsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000052B - 00000530 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindInfoReq::?relay + 0000052B Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000531 - 00000536 (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindInfoRsp::?relay + 00000531 ATT_FindInfoRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000537 - 0000053C (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseFindByTypeValueReq::?relay + 00000537 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000053D - 00000542 (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildFindByTypeValueRsp::?relay + 0000053D ATT_FindByTypeValueRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000543 - 00000548 (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadByTypeReq::?relay + 00000543 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000549 - 0000054E (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByTypeRsp::?relay + 00000549 ATT_ReadByTypeRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000054F - 00000554 (0x6 bytes), align: 0 + Segment part 75. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadReq::?relay + 0000054F Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000555 - 0000055A (0x6 bytes), align: 0 + Segment part 80. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadRsp::?relay + 00000555 ATT_ReadRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000055B - 00000560 (0x6 bytes), align: 0 + Segment part 92. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseWriteReq::?relay + 0000055B Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000561 - 00000566 (0x6 bytes), align: 0 + Segment part 108. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadBlobReq::?relay + 00000561 Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000567 - 0000056C (0x6 bytes), align: 0 + Segment part 113. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadBlobRsp::?relay + 00000567 ATT_ReadBlobRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000056D - 00000572 (0x6 bytes), align: 0 + Segment part 120. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseReadMultiReq::?relay + 0000056D Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000573 - 00000578 (0x6 bytes), align: 0 + Segment part 124. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadMultiRsp::?relay + 00000573 ATT_ReadMultiRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000579 - 0000057E (0x6 bytes), align: 0 + Segment part 129. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildReadByGrpTypeRsp::?relay + 00000579 ATT_ReadByGrpTypeRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000057F - 00000584 (0x6 bytes), align: 0 + Segment part 137. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParsePrepareWriteReq::?relay + 0000057F Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000585 - 0000058A (0x6 bytes), align: 0 + Segment part 149. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildPrepareWriteRsp::?relay + 00000585 ATT_PrepareWriteRsp (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000058B - 00000590 (0x6 bytes), align: 0 + Segment part 161. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ParseExecuteWriteReq::?relay + 0000058B Segment part 12 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000591 - 00000596 (0x6 bytes), align: 0 + Segment part 165. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_BuildHandleValueInd::?relay + 00000591 Segment part 33 (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000597 - 0000059C (0x6 bytes), align: 0 + Segment part 174. + ENTRY ADDRESS REF BY + ===== ======= ====== + attSendMsg::?relay 00000597 Segment part 16 (att_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000059D - 000005A2 (0x6 bytes), align: 0 + Segment part 177. + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_CompareUUID::?relay + 0000059D GATTServApp_ReadAttr (gattservapp) + Segment part 39 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005A3 - 000005A8 (0x6 bytes), align: 0 + Segment part 180. Intra module refs: ATT_CompareUUID + ENTRY ADDRESS REF BY + ===== ======= ====== + ATT_ConvertUUIDto128::?relay + 000005A3 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E7F - 00008E8E (0x10 bytes), align: 0 + Segment part 192. Intra module refs: btBaseUUID + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_configmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000CC8 - 00000CC8 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_ParamsInit + gapIncSignCounter + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAppTaskID 00000CC8 gapProcessConnectionCompleteEvt (gap_linkmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000315 - 00000315 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAP_ParamsInit + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProfileRole 00000315 GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + SM_ResponderInit (sm_rsppairing) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessOSALMsg (gap_task) + smProcessDataMsg (sm_pairing) + smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000316 - 00000316 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: gapGetDevAddress + gapGetDevAddressMode + gapProcessNewAddr + gapProcessRandomAddrComplete + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDeviceAddrMode 00000316 GAP_MakeDiscoverable (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000317 - 00000318 (0x2 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPrivateAddrChangeTimeout + 00000317 GAP_EndDiscoverable (gap_peridevmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000319 - 00000319 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: gapProcessRandomAddrComplete + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAutoAdvPrivateAddrChange + 00000319 GAP_ProcessEvent (gap_task) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000031A - 00000329 (0x10 bytes), align: 0 + Segment part 12. Intra module refs: GAP_ParamsInit + GAP_SecParamsInit + Segment part 58 + gapGetDevAddress + gapGetIRK + gapGetSRK + gapReadBD_ADDRStatus + gapReadBufSizeCmdStatus + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000CC9 - 00000D14 (0x4c bytes), align: 0 + Segment part 13. Intra module refs: Segment part 22 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000032A - 0000032F (0x6 bytes), align: 0 + Segment part 15. Intra module refs: gapGetDevAddress + gapProcessNewAddr + gapProcessRandomAddrComplete + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017183 - 000171AA (0x28 bytes), align: 0 + Segment part 18. Intra module refs: GAP_SetParamValue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SetParamValue 00017183 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171AB - 000171C6 (0x1c bytes), align: 0 + Segment part 20. Intra module refs: GAP_GetParamValue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_GetParamValue 000171AB + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171C7 - 000171D8 (0x12 bytes), align: 0 + Segment part 22. Intra module refs: GAP_GetParamValue + GAP_SetParamValue + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000171D9 - 0001720A (0x32 bytes), align: 0 + Segment part 23. Intra module refs: GAP_ParamsInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ParamsInit 000171D9 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001720B - 0001720F (0x5 bytes), align: 0 + Segment part 25. Intra module refs: GAP_ParamsInit + GAP_SecParamsInit + gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017210 - 0001726A (0x5b bytes), align: 0 + Segment part 26. Intra module refs: GAP_SecParamsInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SecParamsInit 00017210 + calls direct + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001726B - 00017271 (0x7 bytes), align: 0 + Segment part 28. Intra module refs: GAP_SecParamsInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017272 - 00017277 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: GAP_GetParamValue + Segment part 28 + Segment part 41 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017278 - 000172BB (0x44 bytes), align: 0 + Segment part 32. Intra module refs: gapReadBD_ADDRStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBD_ADDRStatus 00017278 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172BC - 000172C0 (0x5 bytes), align: 0 + Segment part 34. Intra module refs: gapProcessNewAddr + gapReadBD_ADDRStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000172C1 - 0001730B (0x4b bytes), align: 0 + Segment part 35. Intra module refs: gapReadBufSizeCmdStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBufSizeCmdStatus + 000172C1 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001730C - 00017349 (0x3e bytes), align: 0 + Segment part 37. Intra module refs: gapProcessNewAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessNewAddr 0001730C + calls direct + XSTACK = 00000014 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001734A - 0001737C (0x33 bytes), align: 0 + Segment part 39. Intra module refs: gapAddAddrAdj::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAddAddrAdj 0001734A + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001737D - 0001737F (0x3 bytes), align: 0 + Segment part 41. Intra module refs: gapGetIRK + gapGetSRK + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017380 - 00017386 (0x7 bytes), align: 0 + Segment part 42. Intra module refs: GAP_GetParamValue + GAP_SetParamValue + Segment part 41 + gapAddAddrAdj + gapDetermineAddrType + gapGetDevAddress + gapGetDevAddressMode + gapGetSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017387 - 000173B4 (0x2e bytes), align: 0 + Segment part 43. Intra module refs: gapDetermineAddrType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDetermineAddrType 00017387 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000173B5 - 0001743D (0x89 bytes), align: 0 + Segment part 45. Intra module refs: gapProcessRandomAddrComplete::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessRandomAddrComplete + 000173B5 + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001743E - 00017442 (0x5 bytes), align: 0 + Segment part 47. Intra module refs: gapIncSignCounter + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017443 - 00017443 (0x1 bytes), align: 0 + Segment part 48. Intra module refs: gapProcessRandomAddrComplete + gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017444 - 00017449 (0x6 bytes), align: 0 + Segment part 49. Intra module refs: GAP_SecParamsInit + Segment part 48 + gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001744A - 00017453 (0xa bytes), align: 0 + Segment part 50. Intra module refs: gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017454 - 0001745B (0x8 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + gapUpdateConnSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001745C - 00017465 (0xa bytes), align: 0 + Segment part 52. Intra module refs: gapGetSRK::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSRK 0001745C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017466 - 00017472 (0xd bytes), align: 0 + Segment part 54. Intra module refs: gapGetSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSignCounter 00017466 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017473 - 00017499 (0x27 bytes), align: 0 + Segment part 56. Intra module refs: gapIncSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIncSignCounter 00017473 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001749A - 000174A5 (0xc bytes), align: 0 + Segment part 58. Intra module refs: gapGetSignCounter + gapIncSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000174A6 - 00017567 (0xc2 bytes), align: 0 + Segment part 59. Intra module refs: gapUpdateConnSignCounter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUpdateConnSignCounter + 000174A6 + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017568 - 00017573 (0xc bytes), align: 0 + Segment part 61. Intra module refs: gapGetDevAddressMode::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddressMode 00017568 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017574 - 0001758B (0x18 bytes), align: 0 + Segment part 63. Intra module refs: gapGetDevAddress::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddress 00017574 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001758C - 00017595 (0xa bytes), align: 0 + Segment part 65. Intra module refs: gapGetIRK::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetIRK 0001758C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017596 - 00017603 (0x6e bytes), align: 0 + Segment part 67. Intra module refs: gapSendDeviceInitDoneEvent::?relay + LOCAL ADDRESS + ===== ======= + gapSendDeviceInitDoneEvent + 00017596 + calls direct + XSTACK = 0000000A ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017604 - 00017613 (0x10 bytes), align: 0 + Segment part 69. Intra module refs: gapProcessRandomAddrComplete + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017614 - 00017617 (0x4 bytes), align: 0 + Segment part 72. Intra module refs: gapProcessRandomAddrComplete + gapUpdateConnSignCounter + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017618 - 00017618 (0x1 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 72 + gapSendDeviceInitDoneEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017619 - 0001761B (0x3 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001761C - 00017621 (0x6 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + gapProcessNewAddr + gapReadBD_ADDRStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017622 - 0001762A (0x9 bytes), align: 0 + Segment part 76. Intra module refs: gapReadBufSizeCmdStatus + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000013A - 0000013A (0x1 bytes), align: 0 + Segment part 7. Intra module refs: gapAppTaskID + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000013B - 00000186 (0x4c bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F7F - 00008F82 (0x4 bytes), align: 0 + Segment part 16. Intra module refs: GAP_MakeDiscoverable (gap_peridevmgr) + gapProcessRandomAddrComplete + gapWriteAdvEnableStatus (gap_peridevmgr) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ea60 00008F7F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F7B - 00008F7E (0x4 bytes), align: 0 + Segment part 17. Intra module refs: LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_TxData (ll) + gapIncSignCounter + llFindStartType (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1 00008F7B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005A9 - 000005AE (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SetParamValue::?relay + 000005A9 ?Subroutine3 (wimu) + GAPBondMgr_Register (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_SetParameter (peripheral) + WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005AF - 000005B4 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: gapUpdateConnSignCounter + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_GetParamValue::?relay + 000005AF GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + SM_StartPairing (sm_pairing) + Segment part 40 (gap_peridevmgr) + Segment part 46 (gap_peridevmgr) + Segment part 88 (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + smStartRspTimer (sm_mgr) + smpParsePairingReq (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005B5 - 000005BA (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ParamsInit::?relay + 000005B5 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005BB - 000005C0 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SecParamsInit::?relay + 000005BB GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005C1 - 000005C6 (0x6 bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBD_ADDRStatus::?relay + 000005C1 gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005C7 - 000005CC (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapReadBufSizeCmdStatus::?relay + 000005C7 gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005CD - 000005D2 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessNewAddr::?relay + 000005CD GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005D3 - 000005D8 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: gapProcessNewAddr + ENTRY ADDRESS REF BY + ===== ======= ====== + gapAddAddrAdj::?relay 000005D3 gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005D9 - 000005DE (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapDetermineAddrType::?relay + 000005D9 gapProcessConnectionCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005DF - 000005E4 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessRandomAddrComplete::?relay + 000005DF gapProcessHCICmdCompleteEvt (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005E5 - 000005EA (0x6 bytes), align: 0 + Segment part 53. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSRK::?relay 000005E5 SM_GenerateAuthenSig (sm_mgr) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005EB - 000005F0 (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetSignCounter::?relay + 000005EB SM_GenerateAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005F1 - 000005F6 (0x6 bytes), align: 0 + Segment part 57. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIncSignCounter::?relay + 000005F1 SM_GenerateAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005F7 - 000005FC (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUpdateConnSignCounter::?relay + 000005F7 SM_VerifyAuthenSig (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000005FD - 00000602 (0x6 bytes), align: 0 + Segment part 62. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddressMode::?relay + 000005FD smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000603 - 00000608 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetDevAddress::?relay + 00000603 smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000609 - 0000060E (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapGetIRK::?relay 00000609 GAP_ProcessEvent (gap_task) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000060F - 00000614 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: gapReadBD_ADDRStatus + gapReadBufSizeCmdStatus + LOCAL ADDRESS + ===== ======= + gapSendDeviceInitDoneEvent::?relay + 0000060F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F7F - 00008F82 (0x4 bytes), align: 0 + Segment part 77. Intra module refs: __Constant_ea60 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F7B - 00008F7E (0x4 bytes), align: 0 + Segment part 78. Intra module refs: __Constant_1 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_devmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000330 - 00000331 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: gapIsAdvertising + ENTRY ADDRESS REF BY + ===== ======= ====== + pGapAdvertState 00000330 GAP_MakeDiscoverable (gap_peridevmgr) + Segment part 41 (gap_peridevmgr) + Segment part 48 (gap_peridevmgr) + Segment part 87 (gap_peridevmgr) + Segment part 99 (gap_peridevmgr) + gapFreeAdvertState (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB3E - 0001AB44 (0x7 bytes), align: 0 + Segment part 8. Intra module refs: GAP_ResolvePrivateAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ResolvePrivateAddr + 0001AB3E + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB45 - 0001AB4B (0x7 bytes), align: 0 + Segment part 10. Intra module refs: GAP_ResolvePrivateAddr + gapIsAdvertising + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB4C - 0001AB63 (0x18 bytes), align: 0 + Segment part 11. Intra module refs: gapIsAdvertising::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIsAdvertising 0001AB4C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB64 - 0001AB7B (0x18 bytes), align: 0 + Segment part 15. Intra module refs: gapValidADType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapValidADType 0001AB64 + XSTACK = 00000012 ( 00000000 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB7C - 0001AC14 (0x99 bytes), align: 0 + Segment part 17. Intra module refs: gapFindADType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFindADType 0001AB7C + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000615 - 0000061A (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ResolvePrivateAddr::?relay + 00000615 gapBondMgrResolvePrivateAddr (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000061B - 00000620 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapIsAdvertising::?relay + 0000061B GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000621 - 00000626 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: gapFindADType + ENTRY ADDRESS REF BY + ===== ======= ====== + gapValidADType::?relay + 00000621 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000627 - 0000062C (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFindADType::?relay 00000627 isLimitedDiscoverableMode (gap_peridevmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_linkmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000332 - 00000333 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: gapFreeEstLink + gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + pEstLink 00000332 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000334 - 00000335 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: GAP_Authenticate + Segment part 102 + Segment part 108 + Segment part 111 + Segment part 25 + Segment part 49 + gapFreeAuthLink + gapPairingCompleteCB + sendAuthEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + pAuthLink 00000334 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000336 - 00000337 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: GAP_TerminateLinkReq + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnCentralConnCBs 00000336 gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000338 - 00000338 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: GAP_TerminateLinkReq + gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BEB9 - 0000BF3E (0x86 bytes), align: 0 + Segment part 14. Intra module refs: GAP_TerminateLinkReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateLinkReq 0000BEB9 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF3F - 0000BF43 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: GAP_TerminateAuth + GAP_TerminateLinkReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF44 - 0000BF48 (0x5 bytes), align: 0 + Segment part 17. Intra module refs: GAP_TerminateLinkReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF49 - 0000BF56 (0xe bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BF57 - 0000BFC5 (0x6f bytes), align: 0 + Segment part 19. Intra module refs: GAP_Signable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Signable 0000BF57 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFC6 - 0000BFC8 (0x3 bytes), align: 0 + Segment part 21. Intra module refs: GAP_Authenticate + GAP_Signable + gapPairingCompleteCB + gapPasskeyNeededCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFC9 - 0000BFCE (0x6 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 21 + gapPairingCompleteCB + sendAuthEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BFCF - 0000C0CB (0xfd bytes), align: 0 + Segment part 23. Intra module refs: GAP_Authenticate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Authenticate 0000BFCF + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0CC - 0000C0D1 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: GAP_Authenticate + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0D2 - 0000C0D7 (0x6 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0D8 - 0000C0DD (0x6 bytes), align: 0 + Segment part 27. Intra module refs: GAP_Authenticate + GAP_Bond + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0DE - 0000C0E3 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: Segment part 27 + gapProcessConnUpdateCompleteEvt + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C0E4 - 0000C11D (0x3a bytes), align: 0 + Segment part 29. Intra module refs: GAP_TerminateAuth::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateAuth 0000C0E4 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C11E - 0000C1C1 (0xa4 bytes), align: 0 + Segment part 33. Intra module refs: GAP_PasscodeUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PasscodeUpdate 0000C11E + calls direct + XSTACK = 00000016 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C1C2 - 0000C1C6 (0x5 bytes), align: 0 + Segment part 35. Intra module refs: GAP_Bond + GAP_PasscodeUpdate + gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C1C7 - 0000C29B (0xd5 bytes), align: 0 + Segment part 36. Intra module refs: GAP_Bond::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Bond 0000C1C7 + calls direct + XSTACK = 00000001 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C29C - 0000C3F0 (0x155 bytes), align: 0 + Segment part 38. Intra module refs: gapProcessConnectionCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnectionCompleteEvt + 0000C29C + calls direct + XSTACK = 00000000 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3F1 - 0000C3F4 (0x4 bytes), align: 0 + Segment part 40. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3F5 - 0000C3F9 (0x5 bytes), align: 0 + Segment part 41. Intra module refs: GAP_Bond + Segment part 40 + gapProcessConnectionCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C3FA - 0000C3FF (0x6 bytes), align: 0 + Segment part 42. Intra module refs: GAP_Bond + gapPairingCompleteCB + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C400 - 0000C456 (0x57 bytes), align: 0 + Segment part 43. Intra module refs: gapProcessConnUpdateCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnUpdateCompleteEvt + 0000C400 + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C457 - 0000C4C6 (0x70 bytes), align: 0 + Segment part 45. Intra module refs: gapProcessDisconnectCompleteEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessDisconnectCompleteEvt + 0000C457 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4C7 - 0000C4CB (0x5 bytes), align: 0 + Segment part 47. Intra module refs: GAP_Authenticate + GAP_Signable + gapProcessDisconnectCompleteEvt + sendTerminateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4CC - 0000C4D2 (0x7 bytes), align: 0 + Segment part 48. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4D3 - 0000C4D5 (0x3 bytes), align: 0 + Segment part 49. Intra module refs: GAP_Authenticate + gapFreeAuthLink + gapPairingCompleteCB + gapProcessDisconnectCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4D6 - 0000C4DD (0x8 bytes), align: 0 + Segment part 50. Intra module refs: GAP_TerminateLinkReq + Segment part 49 + gapFreeEstLink + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C4DE - 0000C5B4 (0xd7 bytes), align: 0 + Segment part 51. Intra module refs: sendEstLinkEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sendEstLinkEvent 0000C4DE + calls direct + XSTACK = 00000020 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5B5 - 0000C5B9 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: gapPairingCompleteCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5BA - 0000C5C4 (0xb bytes), align: 0 + Segment part 54. Intra module refs: GAP_Signable + gapPairingCompleteCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C5C5 - 0000C608 (0x44 bytes), align: 0 + Segment part 55. Intra module refs: sendTerminateEvent::?relay + LOCAL ADDRESS + ===== ======= + sendTerminateEvent 0000C5C5 + calls direct + XSTACK = 00000016 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C609 - 0000C611 (0x9 bytes), align: 0 + Segment part 57. Intra module refs: sendTerminateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C612 - 0000C683 (0x72 bytes), align: 0 + Segment part 58. Intra module refs: gapSendLinkUpdateEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendLinkUpdateEvent + 0000C612 + calls direct + XSTACK = 0000000D ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C684 - 0000C693 (0x10 bytes), align: 0 + Segment part 60. Intra module refs: gapSendLinkUpdateEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C694 - 0000C69F (0xc bytes), align: 0 + Segment part 61. Intra module refs: GAP_TerminateLinkReq + gapSendLinkUpdateEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C6A0 - 0000C6C3 (0x24 bytes), align: 0 + Segment part 62. Intra module refs: disconnectNext::?relay + LOCAL ADDRESS + ===== ======= + disconnectNext 0000C6A0 + calls direct + XSTACK = 00000016 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C6C4 - 0000C83C (0x179 bytes), align: 0 + Segment part 64. Intra module refs: sendAuthEvent::?relay + LOCAL ADDRESS + ===== ======= + sendAuthEvent 0000C6C4 + calls direct + XSTACK = 0000001A ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C83D - 0000C841 (0x5 bytes), align: 0 + Segment part 66. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C842 - 0000C846 (0x5 bytes), align: 0 + Segment part 67. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C847 - 0000C850 (0xa bytes), align: 0 + Segment part 68. Intra module refs: Segment part 67 + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C851 - 0000C856 (0x6 bytes), align: 0 + Segment part 69. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C857 - 0000C86C (0x16 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 69 + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C86D - 0000C872 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C873 - 0000C876 (0x4 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + disconnectNext + gapProcessConnUpdateCompleteEvt + gapProcessConnectionCompleteEvt + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C877 - 0000C87C (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 106 + Segment part 48 + Segment part 72 + Segment part 75 + Segment part 81 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C87D - 0000C884 (0x8 bytes), align: 0 + Segment part 74. Intra module refs: gapPairingCompleteCB + gapSendLinkUpdateEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C885 - 0000C898 (0x14 bytes), align: 0 + Segment part 75. Intra module refs: sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C899 - 0000C8D2 (0x3a bytes), align: 0 + Segment part 76. Intra module refs: gapFreeAuthLink::?relay + LOCAL ADDRESS + ===== ======= + gapFreeAuthLink 0000C899 + calls direct + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8D3 - 0000C8D9 (0x7 bytes), align: 0 + Segment part 78. Intra module refs: gapFreeAuthLink + gapFreeEstLink + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8DA - 0000C8F4 (0x1b bytes), align: 0 + Segment part 79. Intra module refs: gapFreeEstLink::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFreeEstLink 0000C8DA + calls direct + XSTACK = 00000016 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8F5 - 0000C8FB (0x7 bytes), align: 0 + Segment part 81. Intra module refs: gapFreeAuthLink + gapFreeEstLink + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C8FC - 0000C967 (0x6c bytes), align: 0 + Segment part 82. Intra module refs: gapSendBondCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendBondCompleteEvent + 0000C8FC + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C968 - 0000C972 (0xb bytes), align: 0 + Segment part 84. Intra module refs: GAP_Signable + gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C973 - 0000C97C (0xa bytes), align: 0 + Segment part 85. Intra module refs: gapSendBondCompleteEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000C97D - 0000CA22 (0xa6 bytes), align: 0 + Segment part 86. Intra module refs: gapSendPairingReqEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendPairingReqEvent + 0000C97D + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA23 - 0000CA31 (0xf bytes), align: 0 + Segment part 88. Intra module refs: gapSendPairingReqEvent + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA32 - 0000CA39 (0x8 bytes), align: 0 + Segment part 89. Intra module refs: gapPasskeyNeededCB + gapSendLinkUpdateEvent + gapSendPairingReqEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA3A - 0000CA3D (0x4 bytes), align: 0 + Segment part 90. Intra module refs: gapSendPairingReqEvent + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA3E - 0000CA41 (0x4 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + Segment part 93 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA42 - 0000CA4A (0x9 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 91 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA4B - 0000CA4F (0x5 bytes), align: 0 + Segment part 93. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA50 - 0000CA59 (0xa bytes), align: 0 + Segment part 94. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA5A - 0000CA5F (0x6 bytes), align: 0 + Segment part 95. Intra module refs: gapSendLinkUpdateEvent + gapSendPairingReqEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA60 - 0000CA66 (0x7 bytes), align: 0 + Segment part 96. Intra module refs: Segment part 94 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CA67 - 0000CB20 (0xba bytes), align: 0 + Segment part 97. Intra module refs: gapPasskeyNeededCB::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPasskeyNeededCB 0000CA67 + calls direct + XSTACK = 00000000 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CB21 - 0000CB2C (0xc bytes), align: 0 + Segment part 99. Intra module refs: gapPasskeyNeededCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CB2D - 0000CD01 (0x1d5 bytes), align: 0 + Segment part 100. Intra module refs: gapPairingCompleteCB::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPairingCompleteCB 0000CB2D + calls direct + XSTACK = 00000008 ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD02 - 0000CD0F (0xe bytes), align: 0 + Segment part 102. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD10 - 0000CD12 (0x3 bytes), align: 0 + Segment part 103. Intra module refs: gapPasskeyNeededCB + sendEstLinkEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD13 - 0000CD17 (0x5 bytes), align: 0 + Segment part 104. Intra module refs: GAP_Bond + GAP_Signable + Segment part 103 + gapPairingCompleteCB + gapProcessConnectionCompleteEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD18 - 0000CD1D (0x6 bytes), align: 0 + Segment part 105. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD1E - 0000CD23 (0x6 bytes), align: 0 + Segment part 106. Intra module refs: GAP_Bond + Segment part 105 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD24 - 0000CD35 (0x12 bytes), align: 0 + Segment part 107. Intra module refs: gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD36 - 0000CD3B (0x6 bytes), align: 0 + Segment part 108. Intra module refs: gapFreeAuthLink + gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD3C - 0000CD45 (0xa bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + gapFreeAuthLink + gapPairingCompleteCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD46 - 0000CD51 (0xc bytes), align: 0 + Segment part 110. Intra module refs: Segment part 109 + Segment part 112 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD52 - 0000CD57 (0x6 bytes), align: 0 + Segment part 111. Intra module refs: gapPairingCompleteCB + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD58 - 0000CD61 (0xa bytes), align: 0 + Segment part 112. Intra module refs: Segment part 111 + gapPairingCompleteCB + sendAuthEvent + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F77 - 00008F7A (0x4 bytes), align: 0 + Segment part 12. Intra module refs: _formatted_write (?largewr) + llScheduler (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_a 00008F77 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000062D - 00000632 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateLinkReq::?relay + 0000062D GAPRole_TerminateConnection (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000633 - 00000638 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Signable::?relay 00000633 GAPBondMgr_LinkEst (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000639 - 0000063E (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Authenticate::?relay + 00000639 gapBondMgrAuthenticate (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000063F - 00000644 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_TerminateAuth::?relay + 0000063F GAPBondMgr_ProcessGAPMsg (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000645 - 0000064A (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PasscodeUpdate::?relay + 00000645 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000064B - 00000650 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Bond::?relay 0000064B gapBondMgrBondReq (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000651 - 00000656 (0x6 bytes), align: 0 + Segment part 39. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnectionCompleteEvt::?relay + 00000651 gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000657 - 0000065C (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessConnUpdateCompleteEvt::?relay + 00000657 gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000065D - 00000662 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapProcessDisconnectCompleteEvt::?relay + 0000065D gapProcessOSALMsg (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000663 - 00000668 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + sendEstLinkEvent::?relay + 00000663 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000669 - 0000066E (0x6 bytes), align: 0 + Segment part 56. Intra module refs: gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + LOCAL ADDRESS + ===== ======= + sendTerminateEvent::?relay + 00000669 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000066F - 00000674 (0x6 bytes), align: 0 + Segment part 59. Intra module refs: gapProcessConnUpdateCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendLinkUpdateEvent::?relay + 0000066F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000675 - 0000067A (0x6 bytes), align: 0 + Segment part 63. Intra module refs: GAP_TerminateLinkReq + gapProcessConnectionCompleteEvt + gapProcessDisconnectCompleteEvt + LOCAL ADDRESS + ===== ======= + disconnectNext::?relay + 00000675 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000067B - 00000680 (0x6 bytes), align: 0 + Segment part 65. Intra module refs: gapPairingCompleteCB + LOCAL ADDRESS + ===== ======= + sendAuthEvent::?relay 0000067B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000681 - 00000686 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAP_Authenticate + gapProcessDisconnectCompleteEvt + sendAuthEvent + LOCAL ADDRESS + ===== ======= + gapFreeAuthLink::?relay + 00000681 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000687 - 0000068C (0x6 bytes), align: 0 + Segment part 80. Intra module refs: gapProcessConnectionCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapFreeEstLink::?relay + 00000687 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000068D - 00000692 (0x6 bytes), align: 0 + Segment part 83. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendBondCompleteEvent::?relay + 0000068D smProcessEncryptChange (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000693 - 00000698 (0x6 bytes), align: 0 + Segment part 87. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSendPairingReqEvent::?relay + 00000693 smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000699 - 0000069E (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPasskeyNeededCB::?relay + 00000699 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000069F - 000006A4 (0x6 bytes), align: 0 + Segment part 101. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapPairingCompleteCB::?relay + 0000069F smEndPairing (sm_pairing) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F77 - 00008F7A (0x4 bytes), align: 0 + Segment part 117. Intra module refs: __Constant_a + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_peridevmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000D15 - 00000D15 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_UpdateAdvertisingData + gapWriteAdvDataStatus + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000339 - 0000033A (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GAP_MakeDiscoverable + GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 35 + Segment part 76 + isLimitedDiscoverableMode + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000033B - 0000033C (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 75 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000033D - 0000033E (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 58 + gapProcessAdvertisingEvt + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D16 - 00000D1B (0x6 bytes), align: 0 + Segment part 12. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015663 - 00015734 (0xd2 bytes), align: 0 + Segment part 16. Intra module refs: GAP_MakeDiscoverable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_MakeDiscoverable 00015663 + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015735 - 000157DD (0xa9 bytes), align: 0 + Segment part 18. Intra module refs: GAP_UpdateAdvertisingData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_UpdateAdvertisingData + 00015735 + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000157DE - 00015819 (0x3c bytes), align: 0 + Segment part 20. Intra module refs: GAP_EndDiscoverable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_EndDiscoverable 000157DE + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001581A - 00015820 (0x7 bytes), align: 0 + Segment part 31. Intra module refs: gapFreeAdvertState + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015821 - 0001589A (0x7a bytes), align: 0 + Segment part 32. Intra module refs: GAP_PeriDevMgrInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PeriDevMgrInit 00015821 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001589B - 0001589F (0x5 bytes), align: 0 + Segment part 34. Intra module refs: GAP_EndDiscoverable + GAP_PeriDevMgrInit + gapSetAdvParamsStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000158A0 - 000158AD (0xe bytes), align: 0 + Segment part 35. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000158AE - 00015939 (0x8c bytes), align: 0 + Segment part 36. Intra module refs: gapPeriProcessHCICmdCompleteEvt::?relay + LOCAL ADDRESS + ===== ======= + gapPeriProcessHCICmdCompleteEvt + 000158AE + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001593A - 000159FF (0xc6 bytes), align: 0 + Segment part 38. Intra module refs: gapSetAdvParams::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParams 0001593A + calls direct, is indirectly called + XSTACK = 0000000C ( 00000014 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015A00 - 00015A0D (0xe bytes), align: 0 + Segment part 40. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015A0E - 00015A1A (0xd bytes), align: 0 + Segment part 41. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015A1B - 00015A49 (0x2f bytes), align: 0 + Segment part 42. Intra module refs: gapSetAdvParamsStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParamsStatus 00015A1B + calls direct + XSTACK = 0000000A ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015A4A - 00015B24 (0xdb bytes), align: 0 + Segment part 44. Intra module refs: gapWriteAdvEnableStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvEnableStatus + 00015A4A + calls direct + XSTACK = 0000000A ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B25 - 00015B33 (0xf bytes), align: 0 + Segment part 46. Intra module refs: gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B34 - 00015B34 (0x1 bytes), align: 0 + Segment part 47. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B35 - 00015B3A (0x6 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B3B - 00015B3F (0x5 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + gapSetAdvParams + gapSetAdvParamsStatus + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B40 - 00015B45 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: GAP_MakeDiscoverable + Segment part 41 + Segment part 49 + Segment part 96 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B46 - 00015B80 (0x3b bytes), align: 0 + Segment part 51. Intra module refs: gapWriteAdvDataStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvDataStatus 00015B46 + calls direct + XSTACK = 0000000A ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B81 - 00015B85 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: gapPeriProcessHCICmdCompleteEvt + gapWriteAdvDataStatus + isLimitedDiscoverableMode + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B86 - 00015B8D (0x8 bytes), align: 0 + Segment part 54. Intra module refs: gapSendMakeDiscEvent + gapWriteAdvDataStatus + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015B8E - 00015C2B (0x9e bytes), align: 0 + Segment part 55. Intra module refs: gapProcessAdvertisingEvt::?relay + LOCAL ADDRESS + ===== ======= + gapProcessAdvertisingEvt + 00015B8E + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C2C - 00015C33 (0x8 bytes), align: 0 + Segment part 57. Intra module refs: GAP_EndDiscoverable + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C34 - 00015C43 (0x10 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 57 + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C44 - 00015C48 (0x5 bytes), align: 0 + Segment part 61. Intra module refs: GAP_MakeDiscoverable + gapProcessAdvertisingEvt + gapSendMakeDiscEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C49 - 00015C51 (0x9 bytes), align: 0 + Segment part 64. Intra module refs: gapSetAdvParams + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C52 - 00015C57 (0x6 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 100 + gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C58 - 00015C60 (0x9 bytes), align: 0 + Segment part 73. Intra module refs: GAP_MakeDiscoverable + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C61 - 00015C70 (0x10 bytes), align: 0 + Segment part 75. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C71 - 00015C80 (0x10 bytes), align: 0 + Segment part 76. Intra module refs: GAP_PeriDevMgrInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C81 - 00015C84 (0x4 bytes), align: 0 + Segment part 81. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C85 - 00015C8F (0xb bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + Segment part 87 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015C90 - 00015CC8 (0x39 bytes), align: 0 + Segment part 85. Intra module refs: gapSendMakeDiscEvent::?relay + LOCAL ADDRESS + ===== ======= + gapSendMakeDiscEvent 00015C90 + calls direct + XSTACK = 00000014 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015CC9 - 00015CD3 (0xb bytes), align: 0 + Segment part 87. Intra module refs: gapSendMakeDiscEvent + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015CD4 - 00015CEC (0x19 bytes), align: 0 + Segment part 88. Intra module refs: gapFreeAdvertState::?relay + LOCAL ADDRESS + ===== ======= + gapFreeAdvertState 00015CD4 + calls direct + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015CED - 00015CF0 (0x4 bytes), align: 0 + Segment part 90. Intra module refs: GAP_PeriDevMgrInit + gapFreeAdvertState + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015CF1 - 00015CF9 (0x9 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 35 + Segment part 90 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015CFA - 00015D55 (0x5c bytes), align: 0 + Segment part 92. Intra module refs: isLimitedDiscoverableMode::?relay + LOCAL ADDRESS + ===== ======= + isLimitedDiscoverableMode + 00015CFA + calls direct + XSTACK = 00000014 ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D56 - 00015D57 (0x2 bytes), align: 0 + Segment part 94. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D58 - 00015D5A (0x3 bytes), align: 0 + Segment part 95. Intra module refs: Segment part 94 + isLimitedDiscoverableMode + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D5B - 00015D5F (0x5 bytes), align: 0 + Segment part 96. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + Segment part 95 + gapProcessAdvertisingEvt + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D60 - 00015D61 (0x2 bytes), align: 0 + Segment part 97. Intra module refs: GAP_MakeDiscoverable + gapSendMakeDiscEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D62 - 00015D65 (0x4 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 97 + gapWriteAdvEnableStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D66 - 00015D68 (0x3 bytes), align: 0 + Segment part 99. Intra module refs: GAP_EndDiscoverable + GAP_MakeDiscoverable + Segment part 98 + gapFreeAdvertState + gapProcessAdvertisingEvt + gapSetAdvParams + gapSetAdvParamsStatus + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D69 - 00015D6E (0x6 bytes), align: 0 + Segment part 100. Intra module refs: GAP_MakeDiscoverable + GAP_PeriDevMgrInit + GAP_UpdateAdvertisingData + Segment part 99 + gapProcessAdvertisingEvt + isLimitedDiscoverableMode + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000187 - 00000187 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000188 - 0000018D (0x6 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F6F - 00008F72 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: gapWriteAdvEnableStatus + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3e8 00008F6F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006A5 - 000006AA (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_MakeDiscoverable::?relay + 000006A5 GAPRole_ProcessEvent (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006AB - 000006B0 (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_UpdateAdvertisingData::?relay + 000006AB WIMU_updateProfileSensors (wimu) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006B1 - 000006B6 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: gapProcessAdvertisingEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_EndDiscoverable::?relay + 000006B1 GAPRole_SetParameter (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006B7 - 000006BC (0x6 bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_PeriDevMgrInit::?relay + 000006B7 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006BD - 000006C2 (0x6 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 13 + LOCAL ADDRESS + ===== ======= + gapPeriProcessHCICmdCompleteEvt::?relay + 000006BD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006C3 - 000006C8 (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GAP_MakeDiscoverable + Segment part 13 + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParams::?relay + 000006C3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006C9 - 000006CE (0x6 bytes), align: 0 + Segment part 43. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapSetAdvParamsStatus::?relay + 000006C9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006CF - 000006D4 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvEnableStatus::?relay + 000006CF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006D5 - 000006DA (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gapPeriProcessHCICmdCompleteEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + gapWriteAdvDataStatus::?relay + 000006D5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006DB - 000006E0 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 13 + LOCAL ADDRESS + ===== ======= + gapProcessAdvertisingEvt::?relay + 000006DB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006E1 - 000006E6 (0x6 bytes), align: 0 + Segment part 86. Intra module refs: gapSetAdvParamsStatus + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + gapSendMakeDiscEvent::?relay + 000006E1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006E7 - 000006EC (0x6 bytes), align: 0 + Segment part 89. Intra module refs: GAP_MakeDiscoverable + gapProcessAdvertisingEvt + gapSendMakeDiscEvent + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + gapFreeAdvertState::?relay + 000006E7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006ED - 000006F2 (0x6 bytes), align: 0 + Segment part 93. Intra module refs: gapSetAdvParams + gapWriteAdvEnableStatus + LOCAL ADDRESS + ===== ======= + isLimitedDiscoverableMode::?relay + 000006ED + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F6F - 00008F72 (0x4 bytes), align: 0 + Segment part 102. Intra module refs: __Constant_3e8 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_perilinkmgr + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ADFB - 0001AE83 (0x89 bytes), align: 0 + Segment part 6. Intra module refs: GAP_SendSlaveSecurityRequest::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SendSlaveSecurityRequest + 0001ADFB + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006F3 - 000006F8 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_SendSlaveSecurityRequest::?relay + 000006F3 GAPBondMgr_LinkEst (gapbondmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gap_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000033F - 0000033F (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GAP_Init + GAP_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gapTaskID 0000033F GAP_Authenticate (gap_linkmgr) + GAP_EndDiscoverable (gap_peridevmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + Segment part 58 (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D1C - 00000D1C (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAP_ProcessEvent + GAP_RegisterForHCIMsgs + ENTRY ADDRESS REF BY + ===== ======= ====== + gapUnwantedTaskID 00000D1C SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000340 - 00000341 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapRegisterPeripheral + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnPeripheralCBs 00000340 gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessRandomAddrComplete (gap_configmgr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000342 - 00000343 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018821 - 0001882A (0xa bytes), align: 0 + Segment part 11. Intra module refs: GAP_RegisterForHCIMsgs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_RegisterForHCIMsgs + 00018821 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001882B - 0001882E (0x4 bytes), align: 0 + Segment part 13. Intra module refs: gapRegisterPeripheral + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001882F - 0001882F (0x1 bytes), align: 0 + Segment part 14. Intra module refs: GAP_RegisterForHCIMsgs + Segment part 13 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018830 - 00018836 (0x7 bytes), align: 0 + Segment part 15. Intra module refs: GAP_NumActiveConnections + Segment part 14 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018837 - 0001885C (0x26 bytes), align: 0 + Segment part 16. Intra module refs: GAP_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Init 00018837 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001885D - 0001897F (0x123 bytes), align: 0 + Segment part 18. Intra module refs: GAP_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ProcessEvent 0001885D + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018980 - 00018984 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018985 - 0001898E (0xa bytes), align: 0 + Segment part 21. Intra module refs: GAP_NumActiveConnections::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_NumActiveConnections + 00018985 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001898F - 00018AD1 (0x143 bytes), align: 0 + Segment part 23. Intra module refs: gapProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + gapProcessOSALMsg 0001898F + calls direct + XSTACK = 00000012 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018AD2 - 00018AD6 (0x5 bytes), align: 0 + Segment part 25. Intra module refs: gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018AD7 - 00018ADE (0x8 bytes), align: 0 + Segment part 26. Intra module refs: GAP_ProcessEvent + Segment part 25 + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018ADF - 00018AE7 (0x9 bytes), align: 0 + Segment part 27. Intra module refs: GAP_ProcessEvent + gapProcessHCICmdCompleteEvt + gapProcessOSALMsg + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018AE8 - 00018BB7 (0xd0 bytes), align: 0 + Segment part 28. Intra module refs: gapProcessHCICmdCompleteEvt::?relay + LOCAL ADDRESS + ===== ======= + gapProcessHCICmdCompleteEvt + 00018AE8 + calls direct + XSTACK = 00000010 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BB8 - 00018BC8 (0x11 bytes), align: 0 + Segment part 30. Intra module refs: gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BC9 - 00018BCE (0x6 bytes), align: 0 + Segment part 31. Intra module refs: Segment part 25 + Segment part 27 + Segment part 30 + Segment part 32 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BCF - 00018BD5 (0x7 bytes), align: 0 + Segment part 32. Intra module refs: gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BD6 - 00018BDD (0x8 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 27 + Segment part 32 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BDE - 00018BE7 (0xa bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + gapProcessHCICmdCompleteEvt + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BE8 - 00018BF1 (0xa bytes), align: 0 + Segment part 37. Intra module refs: gapRegisterPeripheral::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gapRegisterPeripheral 00018BE8 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000018E - 0000018E (0x1 bytes), align: 0 + Segment part 8. Intra module refs: gapUnwantedTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006F9 - 000006FE (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_RegisterForHCIMsgs::?relay + 000006F9 GAPRole_Init (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000006FF - 00000704 (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_Init::?relay 000006FF osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000705 - 0000070A (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_ProcessEvent::?relay + 00000705 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000070B - 00000710 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_NumActiveConnections::?relay + 0000070B GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000711 - 00000716 (0x6 bytes), align: 0 + Segment part 24. Intra module refs: GAP_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapProcessOSALMsg::?relay + 00000711 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000717 - 0000071C (0x6 bytes), align: 0 + Segment part 29. Intra module refs: gapProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapProcessHCICmdCompleteEvt::?relay + 00000717 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000071D - 00000722 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapRegisterPeripheral::?relay + 0000071D GAP_PeriDevMgrInit (gap_peridevmgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gapgattserver + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000344 - 00000345 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: Segment part 64 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F8B - 00008F8D (0x3 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D1D - 00000D1D (0x1 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000346 - 0000035B (0x16 bytes), align: 0 + Segment part 10. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D1E - 00000D1E (0x1 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000035C - 0000035D (0x2 bytes), align: 0 + Segment part 13. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D1F - 00000D1F (0x1 bytes), align: 0 + Segment part 14. Intra module refs: GGS_SetParameter + Segment part 25 + ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000035E - 0000035E (0x1 bytes), align: 0 + Segment part 16. Intra module refs: GGS_SetParameter + Segment part 25 + ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D20 - 00000D20 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000035F - 00000364 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D21 - 00000D21 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D22 - 00000D29 (0x8 bytes), align: 0 + Segment part 22. Intra module refs: GGS_SetParameter + Segment part 25 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D2A - 00000D81 (0x58 bytes), align: 0 + Segment part 24. Intra module refs: GGS_AddService + GGS_SetParameter + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EE1 - 00008EE6 (0x6 bytes), align: 0 + Segment part 26. Intra module refs: GGS_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gapServiceCBs 00008EE1 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000162F1 - 00016425 (0x135 bytes), align: 0 + Segment part 27. Intra module refs: GGS_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_SetParameter 000162F1 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016426 - 0001644C (0x27 bytes), align: 0 + Segment part 35. Intra module refs: GGS_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_AddService 00016426 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001644D - 00016451 (0x5 bytes), align: 0 + Segment part 37. Intra module refs: GGS_AddService + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016452 - 00016458 (0x7 bytes), align: 0 + Segment part 42. Intra module refs: ggs_SetAttrWPermit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016459 - 000164A2 (0x4a bytes), align: 0 + Segment part 43. Intra module refs: ggs_SetAttrWPermit::?relay + LOCAL ADDRESS + ===== ======= + ggs_SetAttrWPermit 00016459 + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000164A3 - 0001661E (0x17c bytes), align: 0 + Segment part 45. Intra module refs: ggs_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + ggs_ReadAttrCB 000164A3 + calls direct, is indirectly called + XSTACK = 00000006 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001661F - 00016623 (0x5 bytes), align: 0 + Segment part 47. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016624 - 00016629 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001662A - 0001662D (0x4 bytes), align: 0 + Segment part 49. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001662E - 00016637 (0xa bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + Segment part 52 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016638 - 0001663D (0x6 bytes), align: 0 + Segment part 51. Intra module refs: GGS_SetParameter + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001663E - 00016643 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016644 - 00016649 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001664A - 00016652 (0x9 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016653 - 00016653 (0x1 bytes), align: 0 + Segment part 55. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016654 - 00016659 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: GGS_SetParameter + Segment part 55 + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001665A - 0001665A (0x1 bytes), align: 0 + Segment part 57. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001665B - 00016660 (0x6 bytes), align: 0 + Segment part 58. Intra module refs: GGS_SetParameter + Segment part 57 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016661 - 000167E3 (0x183 bytes), align: 0 + Segment part 59. Intra module refs: ggs_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + ggs_WriteAttrCB 00016661 + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167E4 - 000167E9 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167EA - 000167EE (0x5 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + Segment part 63 + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167EF - 000167F7 (0x9 bytes), align: 0 + Segment part 63. Intra module refs: ggs_ReadAttrCB + ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167F8 - 000167FB (0x4 bytes), align: 0 + Segment part 64. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000167FC - 00016803 (0x8 bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + ggs_ReadAttrCB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016804 - 00016816 (0x13 bytes), align: 0 + Segment part 66. Intra module refs: ggs_WriteAttrCB + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000018F - 0000018F (0x1 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000190 - 00000190 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 11 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000191 - 00000191 (0x1 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 14 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000192 - 00000192 (0x1 bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000193 - 00000193 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000194 - 0000019B (0x8 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000019C - 000001F3 (0x58 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000723 - 00000728 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_SetParameter::?relay + 00000723 WIMU_Init (wimu) + gapBondSetupPrivFlag (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000729 - 0000072E (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + GGS_AddService::?relay + 00000729 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000072F - 00000734 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: GGS_SetParameter + LOCAL ADDRESS + ===== ======= + ggs_SetAttrWPermit::?relay + 0000072F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000735 - 0000073A (0x6 bytes), align: 0 + Segment part 46. Intra module refs: gapServiceCBs + LOCAL ADDRESS + ===== ======= + ggs_ReadAttrCB::?relay + 00000735 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000073B - 00000740 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: gapServiceCBs + LOCAL ADDRESS + ===== ======= + ggs_WriteAttrCB::?relay + 0000073B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F8B - 00008F8D (0x3 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EE1 - 00008EE6 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: gapServiceCBs + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gatt_server + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000365 - 0000036C (0x8 bytes), align: 0 + Segment part 6. Intra module refs: GATT_InitServer + Segment part 99 + ENTRY ADDRESS REF BY + ===== ======= ====== + serverInfoTbl 00000365 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D82 - 00000D82 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GATT_RegisterForReq + gattServerProcessMsgCB + ENTRY ADDRESS REF BY + ===== ======= ====== + reqTaskId 00000D82 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000036D - 0000036E (0x2 bytes), align: 0 + Segment part 9. Intra module refs: GATT_FindHandle + GATT_FindHandleUUID + GATT_RegisterService + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D83 - 00000D84 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008DFE - 00008E2D (0x30 bytes), align: 0 + Segment part 12. Intra module refs: gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A034 - 0000A096 (0x63 bytes), align: 0 + Segment part 13. Intra module refs: GATT_InitServer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_InitServer 0000A034 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A097 - 0000A1C1 (0x12b bytes), align: 0 + Segment part 15. Intra module refs: GATT_RegisterService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterService 0000A097 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1C2 - 0000A1D0 (0xf bytes), align: 0 + Segment part 17. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1D1 - 0000A1DB (0xb bytes), align: 0 + Segment part 18. Intra module refs: GATT_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1DC - 0000A1E4 (0x9 bytes), align: 0 + Segment part 21. Intra module refs: GATT_RegisterForReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterForReq 0000A1DC + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1E5 - 0000A1EB (0x7 bytes), align: 0 + Segment part 23. Intra module refs: GATT_RegisterForReq + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A1EC - 0000A209 (0x1e bytes), align: 0 + Segment part 24. Intra module refs: GATT_VerifyReadPermissions::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyReadPermissions + 0000A1EC + calls direct + XSTACK = 00000010 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A20A - 0000A20E (0x5 bytes), align: 0 + Segment part 26. Intra module refs: GATT_VerifyReadPermissions + GATT_VerifyWritePermissions + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A20F - 0000A259 (0x4b bytes), align: 0 + Segment part 27. Intra module refs: GATT_VerifyWritePermissions::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyWritePermissions + 0000A20F + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A25A - 0000A2F9 (0xa0 bytes), align: 0 + Segment part 29. Intra module refs: GATT_ServiceChangedInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceChangedInd + 0000A25A + calls direct + XSTACK = 00000000 ( 00000029 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A2FA - 0000A2FE (0x5 bytes), align: 0 + Segment part 31. Intra module refs: GATT_ServiceChangedInd + gattProcessWriteReq + gattServerHandleTimerCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A2FF - 0000A3F4 (0xf6 bytes), align: 0 + Segment part 32. Intra module refs: GATT_FindHandleUUID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandleUUID 0000A2FF + calls direct + XSTACK = 0000002C ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A3F5 - 0000A4BE (0xca bytes), align: 0 + Segment part 34. Intra module refs: GATT_FindHandle::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandle 0000A3F5 + XSTACK = 00000010 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A4BF - 0000A628 (0x16a bytes), align: 0 + Segment part 36. Intra module refs: GATT_FindNextAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindNextAttr 0000A4BF + calls direct + XSTACK = 00000004 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A629 - 0000A630 (0x8 bytes), align: 0 + Segment part 38. Intra module refs: GATT_FindNextAttr + GATT_RegisterService + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A631 - 0000A636 (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GATT_FindHandleUUID + GATT_FindNextAttr + GATT_RegisterService + Segment part 38 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A637 - 0000A670 (0x3a bytes), align: 0 + Segment part 40. Intra module refs: GATT_ServiceNumAttrs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceNumAttrs 0000A637 + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A671 - 0000A678 (0x8 bytes), align: 0 + Segment part 42. Intra module refs: GATT_RegisterService + GATT_ServiceNumAttrs + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A679 - 0000A716 (0x9e bytes), align: 0 + Segment part 43. Intra module refs: GATT_Indication::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Indication 0000A679 + calls direct + XSTACK = 00000024 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A717 - 0000A763 (0x4d bytes), align: 0 + Segment part 45. Intra module refs: GATT_Notification::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Notification 0000A717 + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A764 - 0000A789 (0x26 bytes), align: 0 + Segment part 47. Intra module refs: gattServiceLastHandle::?relay + LOCAL ADDRESS + ===== ======= + gattServiceLastHandle 0000A764 + calls direct + XSTACK = 00000016 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A78A - 0000A96E (0x1e5 bytes), align: 0 + Segment part 49. Intra module refs: gattServerProcessMsgCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerProcessMsgCB + 0000A78A + calls direct, is indirectly called + XSTACK = 00000000 ( 00000031 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A96F - 0000A977 (0x9 bytes), align: 0 + Segment part 51. Intra module refs: GATT_FindHandleUUID + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A978, align: 0 + Segment part 52. Intra module refs: gattProcessExchangeMTUReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessExchangeMTUReq + 0000A978 + is indirectly called + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A978 - 0000A97C (0x5 bytes), align: 0 + Segment part 54. Intra module refs: gattProcessExchangeMTUReq + gattProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A97D - 0000AB31 (0x1b5 bytes), align: 0 + Segment part 55. Intra module refs: gattProcessFindInfoReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessFindInfoReq + 0000A97D + calls direct, is indirectly called + XSTACK = 00000000 ( 0000002C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB32 - 0000AB37 (0x6 bytes), align: 0 + Segment part 57. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB38 - 0000AB40 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: GATT_RegisterService + Segment part 57 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB41 - 0000AB44 (0x4 bytes), align: 0 + Segment part 59. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB45 - 0000AB4A (0x6 bytes), align: 0 + Segment part 60. Intra module refs: GATT_RegisterService + Segment part 59 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB4B - 0000AB5D (0x13 bytes), align: 0 + Segment part 61. Intra module refs: gattProcessFindInfoReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AB5E - 0000ABA4 (0x47 bytes), align: 0 + Segment part 62. Intra module refs: gattProcessFindByTypeValueReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessFindByTypeValueReq + 0000AB5E + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABA5 - 0000ABAA (0x6 bytes), align: 0 + Segment part 64. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABAB - 0000ABB1 (0x7 bytes), align: 0 + Segment part 65. Intra module refs: GATT_Indication + Segment part 64 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABB2 - 0000ABF6 (0x45 bytes), align: 0 + Segment part 66. Intra module refs: gattProcessReadByTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadByTypeReq + 0000ABB2 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABF7 - 0000ABFB (0x5 bytes), align: 0 + Segment part 68. Intra module refs: GATT_InitServer + gattFindServerInfo + gattGetServerStatus + gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + gattProcessReadReq + gattServiceLastHandle + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ABFC - 0000AC13 (0x18 bytes), align: 0 + Segment part 69. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AC14 - 0000AC3B (0x28 bytes), align: 0 + Segment part 70. Intra module refs: gattProcessReadReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadReq 0000AC14 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AC3C - 0000ACB6 (0x7b bytes), align: 0 + Segment part 72. Intra module refs: gattProcessReadMultiReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadMultiReq + 0000AC3C + calls direct, is indirectly called + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACB7 - 0000ACBE (0x8 bytes), align: 0 + Segment part 74. Intra module refs: GATT_FindNextAttr + gattProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACBF - 0000ACC0 (0x2 bytes), align: 0 + Segment part 75. Intra module refs: GATT_FindHandle + GATT_FindHandleUUID + GATT_ServiceChangedInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACC1 - 0000ACC2 (0x2 bytes), align: 0 + Segment part 76. Intra module refs: GATT_FindHandleUUID + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACC3 - 0000ACC8 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GATT_FindHandle + Segment part 76 + gattProcessReadByGrpTypeReq + gattProcessReadMultiReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACC9 - 0000ACD7 (0xf bytes), align: 0 + Segment part 78. Intra module refs: gattProcessReadMultiReq + gattProcessReadReq + gattProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACD8 - 0000ACDA (0x3 bytes), align: 0 + Segment part 79. Intra module refs: gattProcessFindInfoReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACDB - 0000ACDF (0x5 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 79 + gattProcessReadByGrpTypeReq + gattProcessReadMultiReq + gattServerHandleConnStatusCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ACE0 - 0000AD7C (0x9d bytes), align: 0 + Segment part 81. Intra module refs: gattProcessReadByGrpTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessReadByGrpTypeReq + 0000ACE0 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD7D - 0000AD80 (0x4 bytes), align: 0 + Segment part 83. Intra module refs: gattProcessFindByTypeValueReq + gattProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD81 - 0000AD86 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: GATT_FindNextAttr + GATT_ServiceChangedInd + Segment part 83 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD87 - 0000AD96 (0x10 bytes), align: 0 + Segment part 85. Intra module refs: GATT_RegisterService + gattProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD97 - 0000AD97 (0x1 bytes), align: 0 + Segment part 86. Intra module refs: GATT_FindHandleUUID + GATT_ServiceNumAttrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD98 - 0000AD9B (0x4 bytes), align: 0 + Segment part 87. Intra module refs: GATT_FindNextAttr + Segment part 86 + gattProcessFindInfoReq + gattProcessReadByGrpTypeReq + gattServerHandleTimerCB + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AD9C - 0000ADA1 (0x6 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 18 + Segment part 69 + Segment part 74 + Segment part 78 + Segment part 87 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADA2 - 0000ADD2 (0x31 bytes), align: 0 + Segment part 89. Intra module refs: gattProcessWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessWriteReq 0000ADA2 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADD3 - 0000ADD5 (0x3 bytes), align: 0 + Segment part 91. Intra module refs: gattProcessExecuteWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattProcessExecuteWriteReq + 0000ADD3 + is indirectly called + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ADD6 - 0000AE11 (0x3c bytes), align: 0 + Segment part 93. Intra module refs: gattGetServerStatus::?relay + LOCAL ADDRESS + ===== ======= + gattGetServerStatus 0000ADD6 + calls direct + XSTACK = 0000000F ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE12 - 0000AE17 (0x6 bytes), align: 0 + Segment part 95. Intra module refs: GATT_FindHandleUUID + GATT_FindNextAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE18 - 0000AE1D (0x6 bytes), align: 0 + Segment part 96. Intra module refs: GATT_ServiceChangedInd + Segment part 95 + gattGetServerStatus + gattProcessReadMultiReq + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE1E - 0000AE54 (0x37 bytes), align: 0 + Segment part 97. Intra module refs: gattFindServerInfo::?relay + LOCAL ADDRESS + ===== ======= + gattFindServerInfo 0000AE1E + XSTACK = 0000002D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE55 - 0000AE5F (0xb bytes), align: 0 + Segment part 99. Intra module refs: GATT_InitServer + gattFindServerInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AE60 - 0000AEAF (0x50 bytes), align: 0 + Segment part 100. Intra module refs: gattServerHandleTimerCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerHandleTimerCB + 0000AE60 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEB0 - 0000AEB8 (0x9 bytes), align: 0 + Segment part 102. Intra module refs: gattServerHandleConnStatusCB + gattServerHandleTimerCB + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEB9 - 0000AEBE (0x6 bytes), align: 0 + Segment part 103. Intra module refs: gattServerHandleConnStatusCB + gattServerHandleTimerCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEBF - 0000AEC6 (0x8 bytes), align: 0 + Segment part 104. Intra module refs: Segment part 103 + gattServerProcessMsgCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AEC7 - 0000AF82 (0xbc bytes), align: 0 + Segment part 105. Intra module refs: gattServerHandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gattServerHandleConnStatusCB + 0000AEC7 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AF83 - 0000AF90 (0xe bytes), align: 0 + Segment part 107. Intra module refs: gattGetServerStatus + gattServerHandleConnStatusCB + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F4 - 000001F4 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: reqTaskId + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F5 - 000001F6 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 10 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000741 - 00000746 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_InitServer::?relay + 00000741 GATT_Init (gatt_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000747 - 0000074C (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterService::?relay + 00000747 GATTServApp_RegisterService (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000074D - 00000752 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_RegisterForReq::?relay + 0000074D GATTServApp_Init (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000753 - 00000758 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: gattProcessReadMultiReq + gattProcessReadReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyReadPermissions::?relay + 00000753 Segment part 87 (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000759 - 0000075E (0x6 bytes), align: 0 + Segment part 28. Intra module refs: gattProcessWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_VerifyWritePermissions::?relay + 00000759 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000075F - 00000764 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceChangedInd::?relay + 0000075F GATTServApp_SendServiceChangedInd (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000765 - 0000076A (0x6 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 84 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandleUUID::?relay + 00000765 GAPBondMgr_ProcessEvent (gapbondmgr) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000076B - 00000770 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 78 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindHandle::?relay + 0000076B GATTServApp_ReadAttr (gattservapp) + Segment part 102 (gattservapp) + Segment part 149 (gattservapp) + gattServApp_ProcessMsg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000771 - 00000776 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_FindNextAttr::?relay + 00000771 GAPBondMgr_ProcessEvent (gapbondmgr) + GATTServApp_ReadAttr (gattservapp) + Segment part 89 (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000777 - 0000077C (0x6 bytes), align: 0 + Segment part 41. Intra module refs: gattServiceLastHandle + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ServiceNumAttrs::?relay + 00000777 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000077D - 00000782 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: GATT_ServiceChangedInd + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Indication::?relay + 0000077D GATTServApp_ProcessCharCfg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000783 - 00000788 (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Notification::?relay + 00000783 GATTServApp_ProcessCharCfg (gattservapp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000789 - 0000078E (0x6 bytes), align: 0 + Segment part 48. Intra module refs: GATT_FindNextAttr + LOCAL ADDRESS + ===== ======= + gattServiceLastHandle::?relay + 00000789 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000078F - 00000794 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: GATT_InitServer + LOCAL ADDRESS + ===== ======= + gattServerProcessMsgCB::?relay + 0000078F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000795 - 0000079A (0x6 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessExchangeMTUReq::?relay + 00000795 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000079B - 000007A0 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessFindInfoReq::?relay + 0000079B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007A1 - 000007A6 (0x6 bytes), align: 0 + Segment part 63. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessFindByTypeValueReq::?relay + 000007A1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007A7 - 000007AC (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadByTypeReq::?relay + 000007A7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007AD - 000007B2 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadReq::?relay + 000007AD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007B3 - 000007B8 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadMultiReq::?relay + 000007B3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007B9 - 000007BE (0x6 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessReadByGrpTypeReq::?relay + 000007B9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007BF - 000007C4 (0x6 bytes), align: 0 + Segment part 90. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessWriteReq::?relay + 000007BF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007C5 - 000007CA (0x6 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 12 + LOCAL ADDRESS + ===== ======= + gattProcessExecuteWriteReq::?relay + 000007C5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007CB - 000007D0 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: GATT_Indication + GATT_Notification + LOCAL ADDRESS + ===== ======= + gattGetServerStatus::?relay + 000007CB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007D1 - 000007D6 (0x6 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 107 + gattServerHandleConnStatusCB + gattServerProcessMsgCB + LOCAL ADDRESS + ===== ======= + gattFindServerInfo::?relay + 000007D1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007D7 - 000007DC (0x6 bytes), align: 0 + Segment part 101. Intra module refs: GATT_Indication + LOCAL ADDRESS + ===== ======= + gattServerHandleTimerCB::?relay + 000007D7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007DD - 000007E2 (0x6 bytes), align: 0 + Segment part 106. Intra module refs: GATT_InitServer + LOCAL ADDRESS + ===== ======= + gattServerHandleConnStatusCB::?relay + 000007DD + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008DFE - 00008E2D (0x30 bytes), align: 0 + Segment part 110. Intra module refs: Segment part 12 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gatt_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000036F - 0000036F (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GATT_Init + GATT_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + gattTaskID 0000036F + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000370 - 00000371 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: gattProcessRxData + gattRegisterServer + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000372 - 00000373 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B7B - 00019B81 (0x7 bytes), align: 0 + Segment part 9. Intra module refs: gattRegisterServer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattRegisterServer 00019B7B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B82 - 00019B8D (0xc bytes), align: 0 + Segment part 11. Intra module refs: gattRegisterServer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B8E - 00019BA1 (0x14 bytes), align: 0 + Segment part 14. Intra module refs: GATT_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Init 00019B8E + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BA2 - 00019BA6 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: GATT_Init + gattStopTimer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BA7 - 00019BEC (0x46 bytes), align: 0 + Segment part 17. Intra module refs: GATT_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ProcessEvent 00019BA7 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BED - 00019BF1 (0x5 bytes), align: 0 + Segment part 19. Intra module refs: GATT_ProcessEvent + gattStartTimer + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019BF2 - 00019CBC (0xcb bytes), align: 0 + Segment part 20. Intra module refs: gattProcessRxData::?relay + LOCAL ADDRESS + ===== ======= + gattProcessRxData 00019BF2 + calls direct + XSTACK = 0000000C ( 00000015 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019CBD - 00019CC6 (0xa bytes), align: 0 + Segment part 22. Intra module refs: gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019CC7 - 00019CCC (0x6 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + gattProcessRxData + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019CCD - 00019D5B (0x8f bytes), align: 0 + Segment part 24. Intra module refs: gattNotifyEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattNotifyEvent 00019CCD + calls direct + XSTACK = 00000002 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019D5C - 00019DA6 (0x4b bytes), align: 0 + Segment part 26. Intra module refs: gattStartTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStartTimer 00019D5C + calls direct + XSTACK = 00000004 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DA7 - 00019DD0 (0x2a bytes), align: 0 + Segment part 28. Intra module refs: gattStopTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStopTimer 00019DA7 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007E3 - 000007E8 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattRegisterServer::?relay + 000007E3 GATT_InitServer (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007E9 - 000007EE (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_Init::?relay 000007E9 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007EF - 000007F4 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATT_ProcessEvent::?relay + 000007EF tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007F5 - 000007FA (0x6 bytes), align: 0 + Segment part 21. Intra module refs: GATT_ProcessEvent + LOCAL ADDRESS + ===== ======= + gattProcessRxData::?relay + 000007F5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000007FB - 00000800 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattNotifyEvent::?relay + 000007FB Segment part 104 (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000801 - 00000806 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStartTimer::?relay + 00000801 GATT_Indication (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000807 - 0000080C (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattStopTimer::?relay 00000807 gattServerHandleConnStatusCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : gattservapp + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000374 - 00000374 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: GATTServApp_Init + GATTServApp_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_TaskID 00000374 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D85 - 00000D85 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GATTServApp_RegisterForMsg + GATTServApp_SendCCCUpdatedEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + appTaskID 00000D85 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000375 - 00000378 (0x4 bytes), align: 0 + Segment part 9. Intra module refs: GATTServApp_Init + Segment part 40 + gattServApp_FindPrepareWriteQ + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000379 - 00000379 (0x1 bytes), align: 0 + Segment part 10. Intra module refs: gattServApp_HandleConnStatusCB + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000037A - 0000037B (0x2 bytes), align: 0 + Segment part 11. Intra module refs: GATTServApp_RegisterService + gattServApp_FindServiceCBs + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000037C - 0000037C (0x1 bytes), align: 0 + Segment part 12. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000037D - 00000392 (0x16 bytes), align: 0 + Segment part 13. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000393 - 000003AB (0x19 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 57 + Segment part 63 + Segment part 64 + Segment part 67 + Segment part 83 + Segment part 88 + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F94 - 00008F96 (0x3 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D86 - 00000D86 (0x1 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 20 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003AC - 000003B1 (0x6 bytes), align: 0 + Segment part 18. Intra module refs: GATTServApp_Init + GATTServApp_SendServiceChangedInd + Segment part 20 + gattServApp_HandleConnStatusCB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000D87 - 00000DA6 (0x20 bytes), align: 0 + Segment part 19. Intra module refs: GATTServApp_AddService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EE7 - 00008EEC (0x6 bytes), align: 0 + Segment part 21. Intra module refs: GATTServApp_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gattServiceCBs 00008EE7 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002AD7 - 00002AE2 (0xc bytes), align: 0 + Segment part 22. Intra module refs: GATTServApp_RegisterForMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterForMsg + 00002AD7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002AE3 - 00002B1B (0x39 bytes), align: 0 + Segment part 24. Intra module refs: GATTServApp_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_Init 00002AE3 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002B1C - 00002B60 (0x45 bytes), align: 0 + Segment part 26. Intra module refs: GATTServApp_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessEvent + 00002B1C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002B61 - 00002C10 (0xb0 bytes), align: 0 + Segment part 28. Intra module refs: GATTServApp_RegisterService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterService + 00002B61 + calls direct + XSTACK = 0000000E ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C11 - 00002C12 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: GATTServApp_RegisterService + Segment part 163 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C13 - 00002C17 (0x5 bytes), align: 0 + Segment part 31. Intra module refs: Segment part 142 + Segment part 30 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C18 - 00002C81 (0x6a bytes), align: 0 + Segment part 38. Intra module refs: gattServApp_SetNumPrepareWrites::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_SetNumPrepareWrites + 00002C18 + calls direct + XSTACK = 00000009 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C82 - 00002C97 (0x16 bytes), align: 0 + Segment part 40. Intra module refs: gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C98 - 00002C9D (0x6 bytes), align: 0 + Segment part 41. Intra module refs: GATTServApp_RegisterService + gattServApp_ProcessFindByTypeValueReq + gattServApp_SetNumPrepareWrites + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002C9E - 00002D02 (0x65 bytes), align: 0 + Segment part 42. Intra module refs: GATTServApp_FindAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_FindAttr 00002C9E + XSTACK = 00000033 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D03 - 00002D29 (0x27 bytes), align: 0 + Segment part 44. Intra module refs: GATTServApp_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_AddService + 00002D03 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D2A - 00002D2E (0x5 bytes), align: 0 + Segment part 46. Intra module refs: GATTServApp_AddService + GATTServApp_FindAttr + GATTServApp_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D2F - 00002D5A (0x2c bytes), align: 0 + Segment part 49. Intra module refs: gattServApp_FindServiceCBs::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindServiceCBs + 00002D2F + XSTACK = 0000001D ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D5B - 00002D61 (0x7 bytes), align: 0 + Segment part 51. Intra module refs: GATTServApp_RegisterForMsg + gattServApp_FindPrepareWriteQ + gattServApp_FindServiceCBs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D62 - 00002D67 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gattServApp_FindServiceCBs + gattServApp_HandleConnStatusCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002D68 - 00002F5A (0x1f3 bytes), align: 0 + Segment part 53. Intra module refs: gattServApp_ProcessMsg::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessMsg + 00002D68 + calls direct + XSTACK = 0000000C ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F5B - 00002F64 (0xa bytes), align: 0 + Segment part 55. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F65 - 00002F6C (0x8 bytes), align: 0 + Segment part 56. Intra module refs: GATTServApp_RegisterService + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F6D - 00002F7B (0xf bytes), align: 0 + Segment part 57. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00002F7C - 00003157 (0x1dc bytes), align: 0 + Segment part 58. Intra module refs: gattServApp_ProcessFindByTypeValueReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessFindByTypeValueReq + 00002F7C + calls direct + XSTACK = 00000016 ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003158 - 00003301 (0x1aa bytes), align: 0 + Segment part 60. Intra module refs: gattServApp_ProcessReadByTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByTypeReq + 00003158 + calls direct + XSTACK = 00000016 ( 00000020 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003302 - 00003309 (0x8 bytes), align: 0 + Segment part 62. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000330A - 00003310 (0x7 bytes), align: 0 + Segment part 63. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003311 - 00003314 (0x4 bytes), align: 0 + Segment part 64. Intra module refs: Segment part 63 + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003315 - 00003319 (0x5 bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000331A - 00003323 (0xa bytes), align: 0 + Segment part 66. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003324 - 00003326 (0x3 bytes), align: 0 + Segment part 67. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003327 - 0000332F (0x9 bytes), align: 0 + Segment part 68. Intra module refs: GATTServApp_ReadAttr + Segment part 67 + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003330 - 00003333 (0x4 bytes), align: 0 + Segment part 69. Intra module refs: gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003334 - 00003335 (0x2 bytes), align: 0 + Segment part 70. Intra module refs: GATTServApp_ProcessCCCWriteReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003336 - 00003339 (0x4 bytes), align: 0 + Segment part 71. Intra module refs: GATTServApp_ProcessCCCWriteReq + Segment part 70 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000333A - 00003342 (0x9 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + Segment part 89 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003343 - 0000344C (0x10a bytes), align: 0 + Segment part 73. Intra module refs: gattServApp_ProcessReadMultiReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadMultiReq + 00003343 + calls direct + XSTACK = 00000016 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000344D - 00003451 (0x5 bytes), align: 0 + Segment part 75. Intra module refs: GATTServApp_WriteAttr + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003452 - 00003459 (0x8 bytes), align: 0 + Segment part 76. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000345A - 00003462 (0x9 bytes), align: 0 + Segment part 77. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003463 - 0000346B (0x9 bytes), align: 0 + Segment part 78. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000346C - 00003479 (0xe bytes), align: 0 + Segment part 79. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000347A - 0000368C (0x213 bytes), align: 0 + Segment part 80. Intra module refs: gattServApp_ProcessReadByGrpTypeReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByGrpTypeReq + 0000347A + calls direct + XSTACK = 00000016 ( 00000022 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000368D - 00003696 (0xa bytes), align: 0 + Segment part 82. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003697 - 0000369A (0x4 bytes), align: 0 + Segment part 83. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000369B - 000036A0 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: Segment part 83 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036A1 - 000036A4 (0x4 bytes), align: 0 + Segment part 85. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + Segment part 84 + gattServApp_FindAuthorizeAttrCB + gattServApp_FindServiceCBs + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036A5 - 000036AA (0x6 bytes), align: 0 + Segment part 86. Intra module refs: Segment part 150 + Segment part 182 + Segment part 41 + Segment part 57 + Segment part 85 + Segment part 87 + Segment part 95 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036AB - 000036B4 (0xa bytes), align: 0 + Segment part 87. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036B5 - 000036C6 (0x12 bytes), align: 0 + Segment part 88. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036C7 - 000036CF (0x9 bytes), align: 0 + Segment part 89. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036D0 - 000036D9 (0xa bytes), align: 0 + Segment part 90. Intra module refs: gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000036DA - 000037A5 (0xcc bytes), align: 0 + Segment part 91. Intra module refs: gattServApp_ProcessWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessWriteReq + 000036DA + calls direct + XSTACK = 00000016 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037A6 - 000037AA (0x5 bytes), align: 0 + Segment part 93. Intra module refs: gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037AB - 000037B0 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037B1 - 000037B7 (0x7 bytes), align: 0 + Segment part 95. Intra module refs: GATTServApp_ReadAttr + Segment part 94 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037B8 - 000037C5 (0xe bytes), align: 0 + Segment part 96. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000037C6 - 000038BD (0xf8 bytes), align: 0 + Segment part 97. Intra module refs: gattServApp_ProcessPrepareWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessPrepareWriteReq + 000037C6 + calls direct + XSTACK = 00000016 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038BE - 000038CB (0xe bytes), align: 0 + Segment part 99. Intra module refs: gattServApp_ProcessPrepareWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038CC - 000038E2 (0x17 bytes), align: 0 + Segment part 100. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038E3 - 000038F8 (0x16 bytes), align: 0 + Segment part 101. Intra module refs: gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000038F9 - 00003901 (0x9 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 101 + Segment part 79 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003902 - 00003903 (0x2 bytes), align: 0 + Segment part 103. Intra module refs: gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003904 - 00003906 (0x3 bytes), align: 0 + Segment part 104. Intra module refs: Segment part 103 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003907 - 0000390B (0x5 bytes), align: 0 + Segment part 105. Intra module refs: GATTServApp_ProcessCCCWriteReq + Segment part 104 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000390C - 000039F2 (0xe7 bytes), align: 0 + Segment part 106. Intra module refs: gattServApp_ProcessExecuteWriteReq::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessExecuteWriteReq + 0000390C + calls direct + XSTACK = 00000016 ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000039F3 - 000039F5 (0x3 bytes), align: 0 + Segment part 108. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000039F6 - 000039FA (0x5 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000039FB - 000039FB (0x1 bytes), align: 0 + Segment part 110. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000039FC - 00003A00 (0x5 bytes), align: 0 + Segment part 111. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + Segment part 110 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A01 - 00003A05 (0x5 bytes), align: 0 + Segment part 112. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + GATTServApp_RegisterService + Segment part 111 + Segment part 72 + Segment part 96 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A06 - 00003A09 (0x4 bytes), align: 0 + Segment part 113. Intra module refs: gattServApp_ProcessReadMultiReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A0A - 00003A12 (0x9 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + gattServApp_ProcessFindByTypeValueReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A13 - 00003A18 (0x6 bytes), align: 0 + Segment part 115. Intra module refs: GATTServApp_ProcessCharCfg + GATTServApp_RegisterService + Segment part 114 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessMsg + gattServApp_ProcessPrepareWriteReq + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A19 - 00003A35 (0x1d bytes), align: 0 + Segment part 116. Intra module refs: gattServApp_FindPrepareWriteQ::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindPrepareWriteQ + 00003A19 + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A36 - 00003A68 (0x33 bytes), align: 0 + Segment part 118. Intra module refs: gattServApp_FindCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindCharCfgItem + 00003A36 + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A69 - 00003A6D (0x5 bytes), align: 0 + Segment part 120. Intra module refs: GATTServApp_Init + GATTServApp_SendServiceChangedInd + gattServApp_FindCharCfgItem + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A6E - 00003A87 (0x1a bytes), align: 0 + Segment part 121. Intra module refs: gattServApp_FindAuthorizeAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_FindAuthorizeAttrCB + 00003A6E + calls direct + XSTACK = 0000001D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003A88 - 00003AE7 (0x60 bytes), align: 0 + Segment part 123. Intra module refs: gattServApp_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_WriteAttrCB + 00003A88 + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003AE8 - 00003AEF (0x8 bytes), align: 0 + Segment part 125. Intra module refs: GATTServApp_FindAttr + GATTServApp_ReadAttr + GATTServApp_SendCCCUpdatedEvent + gattServApp_ProcessPrepareWriteReq + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003AF0 - 00003F06 (0x417 bytes), align: 0 + Segment part 126. Intra module refs: GATTServApp_ReadAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadAttr 00003AF0 + calls direct + XSTACK = 00000039 ( 00000023 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F07 - 00003F0D (0x7 bytes), align: 0 + Segment part 128. Intra module refs: GATTServApp_ReadAttr + Segment part 145 + Segment part 31 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F0E - 00003F10 (0x3 bytes), align: 0 + Segment part 129. Intra module refs: gattServApp_ProcessMsg + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F11 - 00003F15 (0x5 bytes), align: 0 + Segment part 130. Intra module refs: GATTServApp_ReadAttr + Segment part 129 + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessFindByTypeValueReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F16 - 00003F1E (0x9 bytes), align: 0 + Segment part 131. Intra module refs: GATTServApp_ReadAttr + gattServApp_ProcessReadByGrpTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F1F - 00003F26 (0x8 bytes), align: 0 + Segment part 132. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F27 - 00003F2A (0x4 bytes), align: 0 + Segment part 133. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F2B - 00003F2F (0x5 bytes), align: 0 + Segment part 134. Intra module refs: GATTServApp_FindAttr + GATTServApp_ReadAttr + GATTServApp_UpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F30 - 00003F35 (0x6 bytes), align: 0 + Segment part 135. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F36 - 00003F39 (0x4 bytes), align: 0 + Segment part 136. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F3A - 00003F3F (0x6 bytes), align: 0 + Segment part 137. Intra module refs: GATTServApp_ReadAttr + Segment part 136 + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F40 - 00003F4F (0x10 bytes), align: 0 + Segment part 138. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F50 - 00003F57 (0x8 bytes), align: 0 + Segment part 139. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + GATTServApp_WriteAttr + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F58 - 00003F59 (0x2 bytes), align: 0 + Segment part 140. Intra module refs: GATTServApp_ReadAttr + GATTServApp_SendCCCUpdatedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F5A - 00003F60 (0x7 bytes), align: 0 + Segment part 141. Intra module refs: GATTServApp_SendCCCUpdatedEvent + Segment part 140 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F61 - 00003F66 (0x6 bytes), align: 0 + Segment part 142. Intra module refs: GATTServApp_ReadAttr + GATTServApp_RegisterService + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F67 - 00003F6F (0x9 bytes), align: 0 + Segment part 143. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F70 - 00003F78 (0x9 bytes), align: 0 + Segment part 144. Intra module refs: Segment part 143 + Segment part 69 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F79 - 00003F7F (0x7 bytes), align: 0 + Segment part 145. Intra module refs: GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F80 - 00003F89 (0xa bytes), align: 0 + Segment part 146. Intra module refs: Segment part 133 + Segment part 135 + Segment part 145 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00003F8A - 0000400C (0x83 bytes), align: 0 + Segment part 147. Intra module refs: GATTServApp_WriteAttr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteAttr 00003F8A + calls direct + XSTACK = 0000001C ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000400D - 00004017 (0xb bytes), align: 0 + Segment part 149. Intra module refs: GATTServApp_ReadAttr + GATTServApp_WriteAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004018 - 0000401E (0x7 bytes), align: 0 + Segment part 150. Intra module refs: GATTServApp_ReadAttr + GATTServApp_WriteAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000401F - 0000402A (0xc bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + gattServApp_FindAuthorizeAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000402B - 0000407B (0x51 bytes), align: 0 + Segment part 156. Intra module refs: GATTServApp_UpdateCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_UpdateCharCfg + 0000402B + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000407C - 000040A2 (0x27 bytes), align: 0 + Segment part 158. Intra module refs: GATTServApp_SendServiceChangedInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendServiceChangedInd + 0000407C + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000040A3 - 000040DF (0x3d bytes), align: 0 + Segment part 160. Intra module refs: GATTServApp_InitCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_InitCharCfg + 000040A3 + calls direct + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000040E0 - 000040E4 (0x5 bytes), align: 0 + Segment part 162. Intra module refs: GATTServApp_InitCharCfg + GATTServApp_ReadCharCfg + GATTServApp_UpdateCharCfg + gattServApp_FindAuthorizeAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000040E5 - 000040F0 (0xc bytes), align: 0 + Segment part 163. Intra module refs: GATTServApp_InitCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000040F1 - 0000410E (0x1e bytes), align: 0 + Segment part 164. Intra module refs: GATTServApp_ReadCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadCharCfg + 000040F1 + calls direct + XSTACK = 0000001D ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000410F - 0000414F (0x41 bytes), align: 0 + Segment part 166. Intra module refs: GATTServApp_WriteCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteCharCfg + 0000410F + calls direct + XSTACK = 00000014 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004150 - 00004154 (0x5 bytes), align: 0 + Segment part 168. Intra module refs: GATTServApp_RegisterService + GATTServApp_SendCCCUpdatedEvent + GATTServApp_WriteCharCfg + gattServApp_HandleConnStatusCB + gattServApp_SetNumPrepareWrites + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004155 - 00004162 (0xe bytes), align: 0 + Segment part 169. Intra module refs: GATTServApp_WriteCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004163 - 0000422D (0xcb bytes), align: 0 + Segment part 170. Intra module refs: GATTServApp_ProcessCCCWriteReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCCCWriteReq + 00004163 + calls direct + XSTACK = 00000014 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000422E - 00004231 (0x4 bytes), align: 0 + Segment part 172. Intra module refs: gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessPrepareWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004232 - 00004235 (0x4 bytes), align: 0 + Segment part 173. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + Segment part 172 + gattServApp_ProcessMsg + gattServApp_WriteAttrCB + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004236 - 0000423B (0x6 bytes), align: 0 + Segment part 174. Intra module refs: Segment part 114 + Segment part 134 + Segment part 173 + Segment part 52 + Segment part 55 + Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000423C - 00004393 (0x158 bytes), align: 0 + Segment part 175. Intra module refs: GATTServApp_ProcessCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCharCfg + 0000423C + calls direct + XSTACK = 00000005 ( 00000039 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004394 - 0000439B (0x8 bytes), align: 0 + Segment part 177. Intra module refs: GATTServApp_ProcessCharCfg + GATTServApp_ReadAttr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000439C - 000043A5 (0xa bytes), align: 0 + Segment part 178. Intra module refs: GATTServApp_ProcessCharCfg + gattServApp_ProcessReadByTypeReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043A6 - 000043B1 (0xc bytes), align: 0 + Segment part 179. Intra module refs: GATTServApp_ProcessCharCfg + gattServApp_ProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043B2 - 000043B3 (0x2 bytes), align: 0 + Segment part 180. Intra module refs: gattServApp_ProcessMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043B4 - 000043B9 (0x6 bytes), align: 0 + Segment part 181. Intra module refs: Segment part 180 + gattServApp_ProcessFindByTypeValueReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043BA - 000043C2 (0x9 bytes), align: 0 + Segment part 182. Intra module refs: GATTServApp_ProcessCharCfg + Segment part 181 + gattServApp_ProcessReadByGrpTypeReq + gattServApp_ProcessReadByTypeReq + gattServApp_ProcessReadMultiReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000043C3 - 0000443F (0x7d bytes), align: 0 + Segment part 183. Intra module refs: gattServApp_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gattServApp_HandleConnStatusCB + 000043C3 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004440 - 0000444A (0xb bytes), align: 0 + Segment part 185. Intra module refs: gattServApp_HandleConnStatusCB + gattServApp_ProcessExecuteWriteReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000444B - 000044A6 (0x5c bytes), align: 0 + Segment part 186. Intra module refs: GATTServApp_SendCCCUpdatedEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendCCCUpdatedEvent + 0000444B + calls direct + XSTACK = 00000014 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000044A7 - 000044B1 (0xb bytes), align: 0 + Segment part 188. Intra module refs: GATTServApp_SendCCCUpdatedEvent + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F7 - 000001F7 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: appTaskID + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F8 - 000001F8 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 16 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000001F9 - 00000218 (0x20 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000080D - 00000812 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterForMsg::?relay + 0000080D GAPBondMgr_Register (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000813 - 00000818 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_Init::?relay + 00000813 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000819 - 0000081E (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessEvent::?relay + 00000819 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000081F - 00000824 (0x6 bytes), align: 0 + Segment part 29. Intra module refs: GATTServApp_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_RegisterService::?relay + 0000081F Actimetry_AddService (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + GGS_AddService (gapgattserver) + Gps_AddService (gpsservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000825 - 0000082A (0x6 bytes), align: 0 + Segment part 39. Intra module refs: GATTServApp_Init + LOCAL ADDRESS + ===== ======= + gattServApp_SetNumPrepareWrites::?relay + 00000825 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000082B - 00000830 (0x6 bytes), align: 0 + Segment part 43. Intra module refs: GATTServApp_ProcessCharCfg + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_FindAttr::?relay + 0000082B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000831 - 00000836 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_AddService::?relay + 00000831 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000837 - 0000083C (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 151 + LOCAL ADDRESS + ===== ======= + gattServApp_FindServiceCBs::?relay + 00000837 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000083D - 00000842 (0x6 bytes), align: 0 + Segment part 54. Intra module refs: GATTServApp_ProcessEvent + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessMsg::?relay + 0000083D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000843 - 00000848 (0x6 bytes), align: 0 + Segment part 59. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessFindByTypeValueReq::?relay + 00000843 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000849 - 0000084E (0x6 bytes), align: 0 + Segment part 61. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByTypeReq::?relay + 00000849 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000084F - 00000854 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadMultiReq::?relay + 0000084F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000855 - 0000085A (0x6 bytes), align: 0 + Segment part 81. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessReadByGrpTypeReq::?relay + 00000855 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000085B - 00000860 (0x6 bytes), align: 0 + Segment part 92. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessWriteReq::?relay + 0000085B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000861 - 00000866 (0x6 bytes), align: 0 + Segment part 98. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessPrepareWriteReq::?relay + 00000861 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000867 - 0000086C (0x6 bytes), align: 0 + Segment part 107. Intra module refs: gattServApp_ProcessMsg + LOCAL ADDRESS + ===== ======= + gattServApp_ProcessExecuteWriteReq::?relay + 00000867 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000086D - 00000872 (0x6 bytes), align: 0 + Segment part 117. Intra module refs: Segment part 185 + Segment part 99 + LOCAL ADDRESS + ===== ======= + gattServApp_FindPrepareWriteQ::?relay + 0000086D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000873 - 00000878 (0x6 bytes), align: 0 + Segment part 119. Intra module refs: GATTServApp_InitCharCfg + GATTServApp_ReadCharCfg + Segment part 169 + LOCAL ADDRESS + ===== ======= + gattServApp_FindCharCfgItem::?relay + 00000873 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000879 - 0000087E (0x6 bytes), align: 0 + Segment part 122. Intra module refs: Segment part 95 + LOCAL ADDRESS + ===== ======= + gattServApp_FindAuthorizeAttrCB::?relay + 00000879 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000087F - 00000884 (0x6 bytes), align: 0 + Segment part 124. Intra module refs: gattServiceCBs + LOCAL ADDRESS + ===== ======= + gattServApp_WriteAttrCB::?relay + 0000087F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000885 - 0000088A (0x6 bytes), align: 0 + Segment part 127. Intra module refs: Segment part 182 + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadAttr::?relay + 00000885 GAPBondMgr_ProcessEvent (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000088B - 00000890 (0x6 bytes), align: 0 + Segment part 148. Intra module refs: GATTServApp_UpdateCharCfg + gattServApp_ProcessExecuteWriteReq + gattServApp_ProcessWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteAttr::?relay + 0000088B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000891 - 00000896 (0x6 bytes), align: 0 + Segment part 157. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_UpdateCharCfg::?relay + 00000891 GAPBondMgr_LinkEst (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000897 - 0000089C (0x6 bytes), align: 0 + Segment part 159. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendServiceChangedInd::?relay + 00000897 GAPBondMgr_LinkEst (gapbondmgr) + gapBondMgrSendServiceChange (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000089D - 000008A2 (0x6 bytes), align: 0 + Segment part 161. Intra module refs: GATTServApp_Init + gattServApp_HandleConnStatusCB + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_InitCharCfg::?relay + 0000089D Actimetry_HandleConnStatusCB (actimetryservice) + Batt_AddService (battservice) + Gps_AddService (gpsservice) + gps_HandleConnStatusCB (gpsservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008A3 - 000008A8 (0x6 bytes), align: 0 + Segment part 165. Intra module refs: GATTServApp_ProcessCCCWriteReq + GATTServApp_ReadAttr + GATTServApp_SendServiceChangedInd + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ReadCharCfg::?relay + 000008A3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008A9 - 000008AE (0x6 bytes), align: 0 + Segment part 167. Intra module refs: GATTServApp_ProcessCCCWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_WriteCharCfg::?relay + 000008A9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008AF - 000008B4 (0x6 bytes), align: 0 + Segment part 171. Intra module refs: gattServApp_WriteAttrCB + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCCCWriteReq::?relay + 000008AF Actimetry_WriteAttrCB (actimetryservice) + gps_WriteAttrCB (gpsservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008B5 - 000008BA (0x6 bytes), align: 0 + Segment part 176. + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_ProcessCharCfg::?relay + 000008B5 Actimetry_SetParameter (actimetryservice) + Gps_SetParameter (gpsservice) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008BB - 000008C0 (0x6 bytes), align: 0 + Segment part 184. Intra module refs: GATTServApp_Init + LOCAL ADDRESS + ===== ======= + gattServApp_HandleConnStatusCB::?relay + 000008BB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008C1 - 000008C6 (0x6 bytes), align: 0 + Segment part 187. Intra module refs: GATTServApp_ProcessCCCWriteReq + ENTRY ADDRESS REF BY + ===== ======= ====== + GATTServApp_SendCCCUpdatedEvent::?relay + 000008C1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F94 - 00008F96 (0x3 bytes), align: 0 + Segment part 189. Intra module refs: Segment part 15 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EE7 - 00008EEC (0x6 bytes), align: 0 + Segment part 190. Intra module refs: gattServiceCBs + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003B2 - 000003B2 (0x1 bytes), align: 0 + Segment part 9. Intra module refs: HCI_SendDataPkt + ENTRY ADDRESS REF BY + ===== ======= ====== + hciPTMenabled 000003B2 HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_Init (hci_tl) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003B3 - 000003B3 (0x1 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + ctrlToHostEnable 000003B3 LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003B4 - 000003B5 (0x2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + numHostBufs 000003B4 LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003B6 - 000003B6 (0x1 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + hciCtrlCmdToken 000003B6 Segment part 35 (hci_event) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CD9 - 00016CE2 (0xa bytes), align: 0 + Segment part 14. Intra module refs: HCI_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_bm_alloc 00016CD9 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CE3 - 00016DAD (0xcb bytes), align: 0 + Segment part 19. Intra module refs: HCI_SendDataPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendDataPkt 00016CE3 + calls direct + XSTACK = 00000002 ( 00000011 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016DAE - 00016DC1 (0x14 bytes), align: 0 + Segment part 21. Intra module refs: HCI_DisconnectCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DisconnectCmd 00016DAE + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016DC2 - 00016DC8 (0x7 bytes), align: 0 + Segment part 49. Intra module refs: HCI_LE_RandCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016DC9 - 00016DEE (0x26 bytes), align: 0 + Segment part 50. Intra module refs: HCI_ReadBDADDRCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadBDADDRCmd 00016DC9 + calls direct + XSTACK = 00000000 ( 00000007 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016DEF - 00016E26 (0x38 bytes), align: 0 + Segment part 52. Intra module refs: HCI_ReadRssiCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadRssiCmd 00016DEF + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E27 - 00016E2D (0x7 bytes), align: 0 + Segment part 54. Intra module refs: HCI_ReadRssiCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E2E - 00016E32 (0x5 bytes), align: 0 + Segment part 57. Intra module refs: HCI_LE_ClearWhiteListCmd + HCI_LE_SetRandomAddressCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E33 - 00016E63 (0x31 bytes), align: 0 + Segment part 59. Intra module refs: HCI_LE_ReadBufSizeCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ReadBufSizeCmd 00016E33 + calls direct + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E64 - 00016E6A (0x7 bytes), align: 0 + Segment part 61. Intra module refs: HCI_LE_ReadBufSizeCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E6B - 00016E93 (0x29 bytes), align: 0 + Segment part 64. Intra module refs: HCI_LE_SetRandomAddressCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetRandomAddressCmd + 00016E6B + calls direct + XSTACK = 00000000 ( 00000001 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016E94 - 00016F04 (0x71 bytes), align: 0 + Segment part 66. Intra module refs: HCI_LE_SetAdvParamCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvParamCmd 00016E94 + calls direct + XSTACK = 00000006 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F05 - 00016F0C (0x8 bytes), align: 0 + Segment part 68. Intra module refs: HCI_LE_SetAdvParamCmd + Segment part 126 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F0D - 00016F21 (0x15 bytes), align: 0 + Segment part 69. Intra module refs: HCI_LE_SetAdvDataCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvDataCmd 00016F0D + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F22 - 00016F36 (0x15 bytes), align: 0 + Segment part 71. Intra module refs: HCI_LE_SetScanRspDataCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetScanRspDataCmd + 00016F22 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F37 - 00016F4B (0x15 bytes), align: 0 + Segment part 73. Intra module refs: HCI_LE_SetAdvEnableCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvEnableCmd + 00016F37 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F4C - 00016F52 (0x7 bytes), align: 0 + Segment part 75. Intra module refs: HCI_LE_AddWhiteListCmd + HCI_LE_ClearWhiteListCmd + HCI_LE_SetAdvDataCmd + HCI_LE_SetAdvEnableCmd + HCI_LE_SetAdvParamCmd + HCI_LE_SetScanRspDataCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F53 - 00016F5A (0x8 bytes), align: 0 + Segment part 76. Intra module refs: HCI_LE_SetRandomAddressCmd + Segment part 75 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F5B - 00016F60 (0x6 bytes), align: 0 + Segment part 81. Intra module refs: HCI_ReadBDADDRCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F61 - 00016F6D (0xd bytes), align: 0 + Segment part 82. Intra module refs: HCI_ReadBDADDRCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F6E - 00016F81 (0x14 bytes), align: 0 + Segment part 85. Intra module refs: HCI_LE_ClearWhiteListCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ClearWhiteListCmd + 00016F6E + calls direct + XSTACK = 00000000 ( 00000001 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F82 - 00016F96 (0x15 bytes), align: 0 + Segment part 87. Intra module refs: HCI_LE_AddWhiteListCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_AddWhiteListCmd + 00016F82 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F97 - 00016F9A (0x4 bytes), align: 0 + Segment part 93. Intra module refs: HCI_LE_ReadBufSizeCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F9B - 00016F9E (0x4 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 54 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016F9F - 00016FAA (0xc bytes), align: 0 + Segment part 95. Intra module refs: Segment part 151 + Segment part 94 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016FAB - 00016FB2 (0x8 bytes), align: 0 + Segment part 98. Intra module refs: LL_RandCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016FB3 - 00016FEC (0x3a bytes), align: 0 + Segment part 99. Intra module refs: HCI_LE_RandCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_RandCmd 00016FB3 + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016FED - 00017018 (0x2c bytes), align: 0 + Segment part 101. Intra module refs: HCI_LE_LtkReqReplyCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqReplyCmd 00016FED + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017019 - 00017046 (0x2e bytes), align: 0 + Segment part 103. Intra module refs: HCI_LE_LtkReqNegReplyCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqNegReplyCmd + 00017019 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017047 - 00017049 (0x3 bytes), align: 0 + Segment part 115. Intra module refs: HCI_ReadRssiCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001704A - 00017050 (0x7 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017051 - 00017053 (0x3 bytes), align: 0 + Segment part 126. Intra module refs: Segment part 57 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017054 - 00017056 (0x3 bytes), align: 0 + Segment part 127. Intra module refs: HCI_ReadBDADDRCmd + Segment part 126 + Segment part 188 + Segment part 49 + Segment part 61 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017057 - 0001705D (0x7 bytes), align: 0 + Segment part 128. Intra module refs: HCI_bm_alloc + Segment part 127 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001705E - 0001705F (0x2 bytes), align: 0 + Segment part 131. Intra module refs: HCI_LE_AddWhiteListCmd + HCI_LE_SetAdvDataCmd + HCI_LE_SetAdvEnableCmd + HCI_LE_SetScanRspDataCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017060 - 00017062 (0x3 bytes), align: 0 + Segment part 132. Intra module refs: Segment part 131 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017063 - 00017066 (0x4 bytes), align: 0 + Segment part 133. Intra module refs: Segment part 132 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017067 - 00017069 (0x3 bytes), align: 0 + Segment part 134. Intra module refs: Segment part 116 + Segment part 133 + Segment part 153 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001706A - 0001706E (0x5 bytes), align: 0 + Segment part 135. Intra module refs: HCI_DisconnectCmd + Segment part 134 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001706F - 00017099 (0x2b bytes), align: 0 + Segment part 138. Intra module refs: HCI_EXT_ClkDivOnHaltCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_EXT_ClkDivOnHaltCmd + 0001706F + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001709A - 0001709A (0x1 bytes), align: 0 + Segment part 149. Intra module refs: HCI_EXT_ClkDivOnHaltCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001709B - 0001709E (0x4 bytes), align: 0 + Segment part 150. Intra module refs: HCI_LE_LtkReqNegReplyCmd + LL_EXT_ExtendRfRangeCback + LL_EXT_SetRxGainCback + LL_EXT_SetTxPowerCback + Segment part 149 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001709F - 000170A4 (0x6 bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + Segment part 156 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170A5 - 000170A9 (0x5 bytes), align: 0 + Segment part 152. Intra module refs: HCI_LE_LtkReqNegReplyCmd + HCI_LE_LtkReqReplyCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170AA - 000170B0 (0x7 bytes), align: 0 + Segment part 153. Intra module refs: Segment part 152 + Segment part 159 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170B1 - 000170B6 (0x6 bytes), align: 0 + Segment part 156. Intra module refs: HCI_LE_LtkReqReplyCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170B7 - 000170BD (0x7 bytes), align: 0 + Segment part 159. Intra module refs: HCI_EXT_ClkDivOnHaltCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170BE - 000170C2 (0x5 bytes), align: 0 + Segment part 188. Intra module refs: Segment part 199 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000170C3 - 0001710B (0x49 bytes), align: 0 + Segment part 195. Intra module refs: LL_RandCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RandCback 000170C3 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001710C - 0001712D (0x22 bytes), align: 0 + Segment part 197. Intra module refs: LL_EXT_SetRxGainCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetRxGainCback 0001710C + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001712E - 00017135 (0x8 bytes), align: 0 + Segment part 199. Intra module refs: LL_EXT_ExtendRfRangeCback + LL_EXT_SetRxGainCback + LL_EXT_SetTxPowerCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017136 - 0001715A (0x25 bytes), align: 0 + Segment part 200. Intra module refs: LL_EXT_SetTxPowerCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetTxPowerCback + 00017136 + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001715B - 00017182 (0x28 bytes), align: 0 + Segment part 204. Intra module refs: LL_EXT_ExtendRfRangeCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ExtendRfRangeCback + 0001715B + calls direct + XSTACK = 00000000 ( 00000003 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008C7 - 000008CC (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_bm_alloc::?relay 000008C7 L2CAP_bm_alloc (l2cap_util) + LL_RxReqDataBufCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008CD - 000008D2 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendDataPkt::?relay + 000008CD l2capEncapSendData (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008D3 - 000008D8 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DisconnectCmd::?relay + 000008D3 GAP_TerminateLinkReq (gap_linkmgr) + disconnectNext (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008D9 - 000008DE (0x6 bytes), align: 0 + Segment part 51. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadBDADDRCmd::?relay + 000008D9 GAP_ParamsInit (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008DF - 000008E4 (0x6 bytes), align: 0 + Segment part 53. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ReadRssiCmd::?relay + 000008DF GAPRole_ProcessEvent (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008E5 - 000008EA (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ReadBufSizeCmd::?relay + 000008E5 gapReadBD_ADDRStatus (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008EB - 000008F0 (0x6 bytes), align: 0 + Segment part 65. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetRandomAddressCmd::?relay + 000008EB gapProcessNewAddr (gap_configmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008F1 - 000008F6 (0x6 bytes), align: 0 + Segment part 67. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvParamCmd::?relay + 000008F1 gapSetAdvParams (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008F7 - 000008FC (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvDataCmd::?relay + 000008F7 GAP_UpdateAdvertisingData (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000008FD - 00000902 (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetScanRspDataCmd::?relay + 000008FD GAP_UpdateAdvertisingData (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000903 - 00000908 (0x6 bytes), align: 0 + Segment part 74. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_SetAdvEnableCmd::?relay + 00000903 GAP_EndDiscoverable (gap_peridevmgr) + gapSetAdvParamsStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000909 - 0000090E (0x6 bytes), align: 0 + Segment part 86. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_ClearWhiteListCmd::?relay + 00000909 gapBondMgr_SyncWhiteList (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000090F - 00000914 (0x6 bytes), align: 0 + Segment part 88. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_AddWhiteListCmd::?relay + 0000090F gapBondMgr_SyncWhiteList (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000915 - 0000091A (0x6 bytes), align: 0 + Segment part 100. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_RandCmd::?relay + 00000915 smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000091B - 00000920 (0x6 bytes), align: 0 + Segment part 102. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqReplyCmd::?relay + 0000091B smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000921 - 00000926 (0x6 bytes), align: 0 + Segment part 104. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_LE_LtkReqNegReplyCmd::?relay + 00000921 smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000927 - 0000092C (0x6 bytes), align: 0 + Segment part 139. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_EXT_ClkDivOnHaltCmd::?relay + 00000927 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000092D - 00000932 (0x6 bytes), align: 0 + Segment part 196. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RandCback::?relay 0000092D llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000933 - 00000938 (0x6 bytes), align: 0 + Segment part 198. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetRxGainCback::?relay + 00000933 Segment part 57 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000939 - 0000093E (0x6 bytes), align: 0 + Segment part 201. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_SetTxPowerCback::?relay + 00000939 Segment part 58 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000093F - 00000944 (0x6 bytes), align: 0 + Segment part 205. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ExtendRfRangeCback::?relay + 0000093F llProcessPostRfOps (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci_data + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003B7 - 000003D6 (0x20 bytes), align: 0 + Segment part 6. Intra module refs: HCI_TxDataBufferInsert + Segment part 20 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003D7 - 000003D7 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: HCI_TxDataBufferInsert + HCI_TxDataSend + LL_TxDataCompleteCback + Segment part 18 + hciTxDataBufferReset + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003D8 - 000003D8 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: HCI_TxDataBufferInsert + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018435 - 000184F3 (0xbf bytes), align: 0 + Segment part 11. Intra module refs: HCI_TxDataBufferInsert::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataBufferInsert + 00018435 + calls direct + XSTACK = 00000002 ( 0000000F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000184F4 - 000184FE (0xb bytes), align: 0 + Segment part 13. Intra module refs: HCI_TxDataBufferInsert + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000184FF - 000185C4 (0xc6 bytes), align: 0 + Segment part 16. Intra module refs: HCI_TxDataSend::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataSend 000184FF + calls direct + XSTACK = 0000000F ( 0000000D ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000185C5 - 000185D2 (0xe bytes), align: 0 + Segment part 18. Intra module refs: HCI_TxDataSend + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000185D3 - 000185D6 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: HCI_TxDataSend + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000185D7 - 000185E1 (0xb bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 24 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000185E2 - 0001862A (0x49 bytes), align: 0 + Segment part 21. Intra module refs: hciTxDataBufferReset::?relay + LOCAL ADDRESS + ===== ======= + hciTxDataBufferReset 000185E2 + calls direct + XSTACK = 0000000C ( 0000000B ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001862B - 00018636 (0xc bytes), align: 0 + Segment part 23. Intra module refs: HCI_TxDataBufferInsert + hciTxDataBufferReset + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018637 - 0001864C (0x16 bytes), align: 0 + Segment part 24. Intra module refs: hciTxDataBufferReset + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001864D - 00018657 (0xb bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018658 - 00018694 (0x3d bytes), align: 0 + Segment part 26. Intra module refs: LL_RxReqDataBufCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxReqDataBufCback 00018658 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018695 - 00018699 (0x5 bytes), align: 0 + Segment part 28. Intra module refs: HCI_TxDataSend + LL_RxReqDataBufCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001869A - 0001879E (0x105 bytes), align: 0 + Segment part 29. Intra module refs: LL_RxDataCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxDataCompleteCback + 0001869A + calls direct + XSTACK = 00000002 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001879F - 000187A2 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000187A3 - 000187B0 (0xe bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + Segment part 35 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000187B1 - 000187B5 (0x5 bytes), align: 0 + Segment part 33. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000187B6 - 000187BF (0xa bytes), align: 0 + Segment part 34. Intra module refs: LL_RxDataCompleteCback + Segment part 33 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000187C0 - 000187C6 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: LL_RxDataCompleteCback + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000187C7 - 00018820 (0x5a bytes), align: 0 + Segment part 36. Intra module refs: LL_TxDataCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxDataCompleteCback + 000187C7 + calls direct + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000945 - 0000094A (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataBufferInsert::?relay + 00000945 HCI_SendDataPkt (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000094B - 00000950 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: HCI_TxDataBufferInsert + LL_TxDataCompleteCback + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_TxDataSend::?relay + 0000094B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000951 - 00000956 (0x6 bytes), align: 0 + Segment part 22. Intra module refs: HCI_TxDataSend + LL_TxDataCompleteCback + LOCAL ADDRESS + ===== ======= + hciTxDataBufferReset::?relay + 00000951 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000957 - 0000095C (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxReqDataBufCback::?relay + 00000957 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000095D - 00000962 (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_RxDataCompleteCback::?relay + 0000095D llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000963 - 00000968 (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxDataCompleteCback::?relay + 00000963 Segment part 265 (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : hci_event + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003D9 - 000003D9 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_EncLtkReqCback + hciInitEventMasks + ENTRY ADDRESS REF BY + ===== ======= ====== + bleEvtMask 000003D9 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003DA - 000003E1 (0x8 bytes), align: 0 + Segment part 7. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_EncLtkReqCback + LL_ReadRemoteVersionInfoCback + hciInitEventMasks + ENTRY ADDRESS REF BY + ===== ======= ====== + pHciEvtMask 000003DA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010000 - 00010021 (0x22 bytes), align: 0 + Segment part 8. Intra module refs: hciInitEventMasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + hciInitEventMasks 00010000 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010022 - 00010028 (0x7 bytes), align: 0 + Segment part 10. Intra module refs: hciInitEventMasks + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010029 - 0001003C (0x14 bytes), align: 0 + Segment part 11. Intra module refs: HCI_DataBufferOverflowEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DataBufferOverflowEvent + 00010029 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001003D - 00010041 (0x5 bytes), align: 0 + Segment part 13. Intra module refs: HCI_DataBufferOverflowEvent + HCI_VendorSpecifcCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010042 - 00010154 (0x113 bytes), align: 0 + Segment part 14. Intra module refs: HCI_NumOfCompletedPacketsEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_NumOfCompletedPacketsEvent + 00010042 + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010155 - 00010159 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: HCI_CommandCompleteEvent + HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001015A - 0001015E (0x5 bytes), align: 0 + Segment part 17. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001015F - 00010175 (0x17 bytes), align: 0 + Segment part 18. Intra module refs: HCI_NumOfCompletedPacketsEvent + Segment part 17 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010176 - 00010179 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001017A - 00010180 (0x7 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 21 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010181 - 00010186 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: HCI_NumOfCompletedPacketsEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010187 - 00010264 (0xde bytes), align: 0 + Segment part 22. Intra module refs: HCI_CommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandCompleteEvent + 00010187 + calls direct + XSTACK = 00000003 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010265 - 00010283 (0x1f bytes), align: 0 + Segment part 24. Intra module refs: HCI_VendorSpecifcCommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_VendorSpecifcCommandCompleteEvent + 00010265 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010284 - 000102DE (0x5b bytes), align: 0 + Segment part 26. Intra module refs: HCI_CommandStatusEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandStatusEvent + 00010284 + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000102DF - 000102F4 (0x16 bytes), align: 0 + Segment part 30. Intra module refs: HCI_DataBufferOverflowEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000102F5 - 0001030C (0x18 bytes), align: 0 + Segment part 31. Intra module refs: HCI_DataBufferOverflowEvent + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001030D - 00010310 (0x4 bytes), align: 0 + Segment part 32. Intra module refs: LL_EncLtkReqCback + Segment part 30 + Segment part 31 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010311 - 0001034D (0x3d bytes), align: 0 + Segment part 33. Intra module refs: HCI_SendCommandStatusEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandStatusEvent + 00010311 + calls direct + XSTACK = 0000000B ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001034E - 00010353 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: HCI_CommandCompleteEvent + HCI_CommandStatusEvent + HCI_SendCommandCompleteEvent + HCI_SendCommandStatusEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010354 - 00010455 (0x102 bytes), align: 0 + Segment part 36. Intra module refs: HCI_SendCommandCompleteEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandCompleteEvent + 00010354 + calls direct + XSTACK = 00000014 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010456 - 0001045A (0x5 bytes), align: 0 + Segment part 38. Intra module refs: HCI_SendCommandCompleteEvent + LL_ConnParamUpdateCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001045B - 00010463 (0x9 bytes), align: 0 + Segment part 39. Intra module refs: HCI_SendCommandCompleteEvent + Segment part 20 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010464 - 00010467 (0x4 bytes), align: 0 + Segment part 40. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010468 - 0001046C (0x5 bytes), align: 0 + Segment part 41. Intra module refs: Segment part 40 + Segment part 43 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001046D - 00010470 (0x4 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 30 + Segment part 41 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010471 - 00010475 (0x5 bytes), align: 0 + Segment part 43. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010476 - 00010478 (0x3 bytes), align: 0 + Segment part 44. Intra module refs: HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010479 - 0001047E (0x6 bytes), align: 0 + Segment part 45. Intra module refs: LL_EncLtkReqCback + Segment part 44 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001047F - 0001047F (0x1 bytes), align: 0 + Segment part 46. Intra module refs: HCI_CommandCompleteEvent + LL_EncLtkReqCback + Segment part 45 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010480 - 00010485 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: LL_ConnectionCompleteCback + Segment part 46 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010486 - 0001048E (0x9 bytes), align: 0 + Segment part 48. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001048F - 00010492 (0x4 bytes), align: 0 + Segment part 49. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010493 - 0001049A (0x8 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + Segment part 51 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001049B - 000104A0 (0x6 bytes), align: 0 + Segment part 51. Intra module refs: HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000104A1 - 000104FD (0x5d bytes), align: 0 + Segment part 52. Intra module refs: HCI_SendControllerToHostEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendControllerToHostEvent + 000104A1 + calls direct + XSTACK = 0000000D ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000104FE - 00010501 (0x4 bytes), align: 0 + Segment part 54. Intra module refs: HCI_NumOfCompletedPacketsEvent + HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010502 - 00010507 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: Segment part 110 + Segment part 152 + Segment part 54 + Segment part 94 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010508 - 00010514 (0xd bytes), align: 0 + Segment part 56. Intra module refs: HCI_SendCommandCompleteEvent + HCI_SendControllerToHostEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010515 - 00010520 (0xc bytes), align: 0 + Segment part 57. Intra module refs: HCI_CommandCompleteEvent + Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010521 - 00010524 (0x4 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010525 - 0001052D (0x9 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 50 + Segment part 58 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001052E - 00010532 (0x5 bytes), align: 0 + Segment part 62. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010533 - 00010537 (0x5 bytes), align: 0 + Segment part 66. Intra module refs: HCI_SendControllerToHostEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010538 - 00010538 (0x1 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 100 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010539 - 0001053F (0x7 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 42 + Segment part 69 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010540 - 00010727 (0x1e8 bytes), align: 0 + Segment part 72. Intra module refs: LL_ConnectionCompleteCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnectionCompleteCback + 00010540 + calls direct + XSTACK = 00000009 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010728 - 0001072B (0x4 bytes), align: 0 + Segment part 74. Intra module refs: HCI_SendCommandCompleteEvent + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001072C - 00010736 (0xb bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + Segment part 76 + Segment part 77 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010737 - 0001073B (0x5 bytes), align: 0 + Segment part 76. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001073C - 00010741 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010742 - 00010747 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010748 - 00010750 (0x9 bytes), align: 0 + Segment part 79. Intra module refs: LL_ConnectionCompleteCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010751 - 00010754 (0x4 bytes), align: 0 + Segment part 80. Intra module refs: LL_ConnectionCompleteCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010755 - 00010758 (0x4 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 138 + Segment part 80 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010759 - 00010767 (0xf bytes), align: 0 + Segment part 82. Intra module refs: Segment part 147 + Segment part 81 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010768 - 00010775 (0xe bytes), align: 0 + Segment part 83. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010776 - 00010779 (0x4 bytes), align: 0 + Segment part 84. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001077A - 00010782 (0x9 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + Segment part 88 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010783 - 00010786 (0x4 bytes), align: 0 + Segment part 86. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010787 - 0001078A (0x4 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + Segment part 89 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001078B - 00010791 (0x7 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 87 + Segment part 91 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010792 - 00010797 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010798 - 0001079B (0x4 bytes), align: 0 + Segment part 90. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001079C - 000107A3 (0x8 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + Segment part 95 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107A4 - 000107AD (0xa bytes), align: 0 + Segment part 92. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107AE - 000107B1 (0x4 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 152 + Segment part 92 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107B2 - 000107B7 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 101 + Segment part 107 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107B8 - 000107BE (0x7 bytes), align: 0 + Segment part 95. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000107BF - 0001082A (0x6c bytes), align: 0 + Segment part 96. Intra module refs: LL_DisconnectCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_DisconnectCback 000107BF + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001082B - 0001082F (0x5 bytes), align: 0 + Segment part 98. Intra module refs: LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010830 - 00010833 (0x4 bytes), align: 0 + Segment part 99. Intra module refs: LL_ConnectionCompleteCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010834 - 0001083A (0x7 bytes), align: 0 + Segment part 100. Intra module refs: Segment part 123 + Segment part 99 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001083B - 0001083E (0x4 bytes), align: 0 + Segment part 101. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001083F - 00010842 (0x4 bytes), align: 0 + Segment part 102. Intra module refs: LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010843 - 0001084F (0xd bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + Segment part 104 + Segment part 30 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010850 - 00010855 (0x6 bytes), align: 0 + Segment part 104. Intra module refs: LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010856 - 000108FF (0xaa bytes), align: 0 + Segment part 105. Intra module refs: LL_ConnParamUpdateCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnParamUpdateCback + 00010856 + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010900 - 00010905 (0x6 bytes), align: 0 + Segment part 107. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010906 - 00010909 (0x4 bytes), align: 0 + Segment part 108. Intra module refs: LL_ConnParamUpdateCback + LL_DisconnectCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001090A - 00010910 (0x7 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010911 - 00010919 (0x9 bytes), align: 0 + Segment part 110. Intra module refs: Segment part 109 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001091A - 0001091E (0x5 bytes), align: 0 + Segment part 111. Intra module refs: LL_ConnParamUpdateCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001091F - 00010920 (0x2 bytes), align: 0 + Segment part 112. Intra module refs: HCI_CommandCompleteEvent + Segment part 111 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010921 - 00010921 (0x1 bytes), align: 0 + Segment part 113. Intra module refs: LL_ConnParamUpdateCback + Segment part 112 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010922 - 00010923 (0x2 bytes), align: 0 + Segment part 114. Intra module refs: LL_ConnectionCompleteCback + Segment part 113 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010924 - 00010929 (0x6 bytes), align: 0 + Segment part 115. Intra module refs: LL_EncChangeCback + Segment part 114 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001092A - 000109BC (0x93 bytes), align: 0 + Segment part 116. Intra module refs: LL_ReadRemoteVersionInfoCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRemoteVersionInfoCback + 0001092A + calls direct + XSTACK = 00000004 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109BD - 000109C2 (0x6 bytes), align: 0 + Segment part 118. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C3 - 000109C6 (0x4 bytes), align: 0 + Segment part 119. Intra module refs: Segment part 118 + Segment part 66 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C7 - 000109C7 (0x1 bytes), align: 0 + Segment part 120. Intra module refs: Segment part 119 + Segment part 126 + Segment part 59 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109C8 - 000109CF (0x8 bytes), align: 0 + Segment part 121. Intra module refs: Segment part 120 + Segment part 20 + Segment part 70 + Segment part 88 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109D0 - 000109D7 (0x8 bytes), align: 0 + Segment part 122. Intra module refs: LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_EncLtkReqCback + LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109D8 - 000109E1 (0xa bytes), align: 0 + Segment part 123. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109E2 - 000109E5 (0x4 bytes), align: 0 + Segment part 124. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109E6 - 000109E9 (0x4 bytes), align: 0 + Segment part 125. Intra module refs: Segment part 124 + Segment part 127 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109EA - 000109F3 (0xa bytes), align: 0 + Segment part 126. Intra module refs: Segment part 125 + Segment part 129 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109F4 - 000109F9 (0x6 bytes), align: 0 + Segment part 127. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109FA - 000109FD (0x4 bytes), align: 0 + Segment part 128. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000109FE - 00010A05 (0x8 bytes), align: 0 + Segment part 129. Intra module refs: Segment part 128 + Segment part 130 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010A06 - 00010A0B (0x6 bytes), align: 0 + Segment part 130. Intra module refs: LL_ReadRemoteVersionInfoCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010A0C - 00010B4E (0x143 bytes), align: 0 + Segment part 131. Intra module refs: LL_EncLtkReqCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReqCback 00010A0C + calls direct + XSTACK = 00000002 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B4F - 00010B52 (0x4 bytes), align: 0 + Segment part 133. Intra module refs: LL_ConnectionCompleteCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B53 - 00010B57 (0x5 bytes), align: 0 + Segment part 134. Intra module refs: LL_EncLtkReqCback + Segment part 133 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B58 - 00010B64 (0xd bytes), align: 0 + Segment part 135. Intra module refs: HCI_SendControllerToHostEvent + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B65 - 00010B66 (0x2 bytes), align: 0 + Segment part 136. Intra module refs: LL_ConnParamUpdateCback + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B67 - 00010B6F (0x9 bytes), align: 0 + Segment part 137. Intra module refs: LL_ConnParamUpdateCback + LL_EncLtkReqCback + Segment part 136 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B70 - 00010B77 (0x8 bytes), align: 0 + Segment part 138. Intra module refs: HCI_SendControllerToHostEvent + LL_EncLtkReqCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010B78 - 00010BC3 (0x4c bytes), align: 0 + Segment part 139. Intra module refs: LL_EncChangeCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncChangeCback 00010B78 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC4 - 00010BC4 (0x1 bytes), align: 0 + Segment part 141. Intra module refs: HCI_NumOfCompletedPacketsEvent + HCI_SendCommandCompleteEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC5 - 00010BC7 (0x3 bytes), align: 0 + Segment part 142. Intra module refs: HCI_SendControllerToHostEvent + LL_ReadRemoteVersionInfoCback + Segment part 141 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BC8 - 00010BCD (0x6 bytes), align: 0 + Segment part 143. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_ConnectionCompleteCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_EncLtkReqCback + Segment part 142 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BCE - 00010BCF (0x2 bytes), align: 0 + Segment part 144. Intra module refs: HCI_DataBufferOverflowEvent + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BD0 - 00010BD7 (0x8 bytes), align: 0 + Segment part 145. Intra module refs: HCI_CommandStatusEvent + LL_ConnParamUpdateCback + LL_DisconnectCback + LL_EncChangeCback + LL_EncKeyRefreshCback + LL_ReadRemoteVersionInfoCback + Segment part 144 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BD8 - 00010BE7 (0x10 bytes), align: 0 + Segment part 146. Intra module refs: LL_ConnParamUpdateCback + LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010BE8 - 00010C03 (0x1c bytes), align: 0 + Segment part 147. Intra module refs: Segment part 146 + Segment part 31 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C04 - 00010C0A (0x7 bytes), align: 0 + Segment part 148. Intra module refs: Segment part 103 + Segment part 147 + Segment part 32 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C0B - 00010C52 (0x48 bytes), align: 0 + Segment part 149. Intra module refs: LL_EncKeyRefreshCback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncKeyRefreshCback 00010C0B + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C53 - 00010C5D (0xb bytes), align: 0 + Segment part 151. Intra module refs: LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C5E - 00010C75 (0x18 bytes), align: 0 + Segment part 152. Intra module refs: LL_EncChangeCback + LL_EncKeyRefreshCback + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C76 - 00010C81 (0xc bytes), align: 0 + Segment part 155. Intra module refs: HCI_SendCommandStatusEvent + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000969 - 0000096E (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + hciInitEventMasks::?relay + 00000969 HCI_Init (hci_tl) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000096F - 00000974 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_DataBufferOverflowEvent::?relay + 0000096F HCI_TxDataBufferInsert (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000975 - 0000097A (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_NumOfCompletedPacketsEvent::?relay + 00000975 HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + LL_TxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000097B - 00000980 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandCompleteEvent::?relay + 0000097B HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + LL_RandCback (hci) + Segment part 115 (hci) + Segment part 132 (hci) + Segment part 152 (hci) + Segment part 68 (hci) + Segment part 81 (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000981 - 00000986 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_VendorSpecifcCommandCompleteEvent::?relay + 00000981 Segment part 159 (hci) + Segment part 199 (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000987 - 0000098C (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_CommandStatusEvent::?relay + 00000987 HCI_DisconnectCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000098D - 00000992 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: HCI_CommandStatusEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandStatusEvent::?relay + 0000098D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000993 - 00000998 (0x6 bytes), align: 0 + Segment part 37. Intra module refs: HCI_CommandCompleteEvent + HCI_VendorSpecifcCommandCompleteEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendCommandCompleteEvent::?relay + 00000993 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000999 - 0000099E (0x6 bytes), align: 0 + Segment part 53. Intra module refs: HCI_SendCommandStatusEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SendControllerToHostEvent::?relay + 00000999 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000099F - 000009A4 (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnectionCompleteCback::?relay + 0000099F LL_ProcessEvent (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009A5 - 000009AA (0x6 bytes), align: 0 + Segment part 97. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_DisconnectCback::?relay + 000009A5 llConnTerminate (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009AB - 000009B0 (0x6 bytes), align: 0 + Segment part 106. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnParamUpdateCback::?relay + 000009AB llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009B1 - 000009B6 (0x6 bytes), align: 0 + Segment part 117. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRemoteVersionInfoCback::?relay + 000009B1 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009B7 - 000009BC (0x6 bytes), align: 0 + Segment part 132. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReqCback::?relay + 000009B7 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009BD - 000009C2 (0x6 bytes), align: 0 + Segment part 140. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncChangeCback::?relay + 000009BD llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009C3 - 000009C8 (0x6 bytes), align: 0 + Segment part 150. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncKeyRefreshCback::?relay + 000009C3 llProcessSlaveControlProcedures (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_if + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007EAA - 00007F12 (0x69 bytes), align: 0 + Segment part 6. Intra module refs: L2CAP_RegisterApp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_RegisterApp 00007EAA + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F13 - 00007F66 (0x54 bytes), align: 0 + Segment part 8. Intra module refs: L2CAP_SendData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_SendData 00007F13 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F67 - 00007F88 (0x22 bytes), align: 0 + Segment part 10. Intra module refs: L2CAP_CmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_CmdReject 00007F67 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F89 - 00007F8D (0x5 bytes), align: 0 + Segment part 16. Intra module refs: L2CAP_ConnParamUpdateReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007F8E - 00007FB1 (0x24 bytes), align: 0 + Segment part 17. Intra module refs: L2CAP_ConnParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ConnParamUpdateReq + 00007F8E + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FB2 - 00007FB4 (0x3 bytes), align: 0 + Segment part 19. Intra module refs: L2CAP_CmdReject + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FB5 - 00007FB9 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 16 + Segment part 19 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FBA - 00007FBE (0x5 bytes), align: 0 + Segment part 21. Intra module refs: L2CAP_SendData + Segment part 20 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009C9 - 000009CE (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_RegisterApp::?relay + 000009C9 GAP_Init (gap_task) + GATT_Init (gatt_task) + SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009CF - 000009D4 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_SendData::?relay + 000009CF attSendMsg (att_util) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009D5 - 000009DA (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_CmdReject::?relay + 000009D5 gapProcessOSALMsg (gap_task) + l2capProcessReq (l2cap_task) + l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009DB - 000009E0 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ConnParamUpdateReq::?relay + 000009DB gapRole_startConnUpdate (peripheral) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000003E2 - 000003E2 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: L2CAP_Init + L2CAP_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capTaskID 000003E2 l2capEncapSendData (l2cap_util) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003E3 - 000003EE (0xc bytes), align: 0 + Segment part 7. Intra module refs: L2CAP_Init + l2capProcessReq + l2capProcessRxData + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFixedChannels 000003E3 L2CAP_RegisterApp (l2cap_if) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000003EF - 00000406 (0x18 bytes), align: 0 + Segment part 8. Intra module refs: L2CAP_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capChannels 000003EF Segment part 108 (l2cap_util) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001762B - 00017697 (0x6d bytes), align: 0 + Segment part 9. Intra module refs: L2CAP_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_Init 0001762B + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017698 - 000176DD (0x46 bytes), align: 0 + Segment part 11. Intra module refs: L2CAP_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ProcessEvent 00017698 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000176DE - 000176E2 (0x5 bytes), align: 0 + Segment part 13. Intra module refs: L2CAP_ProcessEvent + l2capProcessSignal + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000176E3 - 000177D7 (0xf5 bytes), align: 0 + Segment part 14. Intra module refs: l2capProcessRxData::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessRxData 000176E3 + calls direct + XSTACK = 0000000C ( 0000000F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000177D8 - 000178D3 (0xfc bytes), align: 0 + Segment part 16. Intra module refs: l2capProcessSignal::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessSignal 000177D8 + calls direct + XSTACK = 0000000F ( 00000018 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000178D4 - 000179BD (0xea bytes), align: 0 + Segment part 18. Intra module refs: l2capProcessRsp::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessRsp 000178D4 + calls direct + XSTACK = 00000018 ( 0000001F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000179BE - 00017A78 (0xbb bytes), align: 0 + Segment part 20. Intra module refs: l2capProcessReq::?relay + LOCAL ADDRESS + ===== ======= + l2capProcessReq 000179BE + calls direct + XSTACK = 00000018 ( 00000024 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017A79 - 00017A7F (0x7 bytes), align: 0 + Segment part 22. Intra module refs: l2capProcessReq + l2capProcessRxData + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009E1 - 000009E6 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_Init::?relay 000009E1 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009E7 - 000009EC (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ProcessEvent::?relay + 000009E7 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009ED - 000009F2 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: L2CAP_ProcessEvent + LOCAL ADDRESS + ===== ======= + l2capProcessRxData::?relay + 000009ED + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009F3 - 000009F8 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: l2capProcessRxData + LOCAL ADDRESS + ===== ======= + l2capProcessSignal::?relay + 000009F3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009F9 - 000009FE (0x6 bytes), align: 0 + Segment part 19. Intra module refs: l2capProcessSignal + LOCAL ADDRESS + ===== ======= + l2capProcessRsp::?relay + 000009F9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000009FF - 00000A04 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: l2capProcessSignal + LOCAL ADDRESS + ===== ======= + l2capProcessReq::?relay + 000009FF + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : l2cap_util + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000407 - 00000407 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013647 - 0001366E (0x28 bytes), align: 0 + Segment part 7. Intra module refs: l2capParseSignalHdr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseSignalHdr 00013647 + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001366F - 0001366F (0x1 bytes), align: 0 + Segment part 9. Intra module refs: l2capParsePacket + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013670 - 00013677 (0x8 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 9 + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013678 - 00013679 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: l2capParseCmdReject + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001367A - 0001367D (0x4 bytes), align: 0 + Segment part 12. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 11 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001367E - 00013688 (0xb bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013689 - 0001375D (0xd5 bytes), align: 0 + Segment part 14. Intra module refs: l2capSendReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendReq 00013689 + calls direct + XSTACK = 00000004 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001375E - 00013762 (0x5 bytes), align: 0 + Segment part 16. Intra module refs: l2capNotifySignal + l2capSendCmd + l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013763 - 00013833 (0xd1 bytes), align: 0 + Segment part 17. Intra module refs: l2capSendCmd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendCmd 00013763 + calls direct + XSTACK = 00000016 ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013834 - 0001383B (0x8 bytes), align: 0 + Segment part 19. Intra module refs: l2capSendCmd + l2capSendReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001383C - 00013915 (0xda bytes), align: 0 + Segment part 20. Intra module refs: l2capEncapSendData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capEncapSendData 0001383C + calls direct + XSTACK = 00000018 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013916 - 0001391A (0x5 bytes), align: 0 + Segment part 22. Intra module refs: l2capEncapSendData + l2capParsePacket + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001391B - 0001391E (0x4 bytes), align: 0 + Segment part 23. Intra module refs: l2capEncapSendData + l2capParseSignalHdr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001391F - 0001392D (0xf bytes), align: 0 + Segment part 24. Intra module refs: l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001392E - 00013936 (0x9 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013937 - 00013A0B (0xd5 bytes), align: 0 + Segment part 26. Intra module refs: l2capParsePacket::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParsePacket 00013937 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A0C - 00013A0D (0x2 bytes), align: 0 + Segment part 28. Intra module refs: l2capParsePacket + l2capStopTimer + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A0E - 00013A15 (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A16 - 00013A6A (0x55 bytes), align: 0 + Segment part 30. Intra module refs: L2CAP_BuildCmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_BuildCmdReject 00013A16 + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A6B - 00013A7D (0x13 bytes), align: 0 + Segment part 32. Intra module refs: L2CAP_BuildCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A7E - 00013A81 (0x4 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 23 + Segment part 32 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013A82 - 00013B03 (0x82 bytes), align: 0 + Segment part 34. Intra module refs: l2capParseCmdReject::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseCmdReject 00013A82 + XSTACK = 00000002 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B04 - 00013B0E (0xb bytes), align: 0 + Segment part 36. Intra module refs: l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B0F - 00013B0F (0x1 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B10 - 00013B17 (0x8 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 39 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B18 - 00013B1E (0x7 bytes), align: 0 + Segment part 52. Intra module refs: l2capFreeChannel + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B1F - 00013B27 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 77 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B28 - 00013B2C (0x5 bytes), align: 0 + Segment part 62. Intra module refs: L2CAP_bm_alloc + l2capFindLocalId + l2capHandleTimerCB + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B2D - 00013B31 (0x5 bytes), align: 0 + Segment part 65. Intra module refs: l2capAllocChannel + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B32 - 00013B36 (0x5 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 85 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B37 - 00013B40 (0xa bytes), align: 0 + Segment part 68. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 67 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B41 - 00013B48 (0x8 bytes), align: 0 + Segment part 70. Intra module refs: l2capNotifySignal + l2capSendCmd + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B49 - 00013B6B (0x23 bytes), align: 0 + Segment part 71. Intra module refs: l2capBuildParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capBuildParamUpdateReq + 00013B49 + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B6C - 00013B6F (0x4 bytes), align: 0 + Segment part 73. Intra module refs: L2CAP_BuildCmdReject + l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B70 - 00013B7E (0xf bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B7F - 00013B85 (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 33 + Segment part 58 + Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B86 - 00013B8E (0x9 bytes), align: 0 + Segment part 76. Intra module refs: l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B8F - 00013B9E (0x10 bytes), align: 0 + Segment part 77. Intra module refs: L2CAP_BuildCmdReject + l2capBuildParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013B9F - 00013BA2 (0x4 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 77 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BA3 - 00013BAD (0xb bytes), align: 0 + Segment part 79. Intra module refs: Segment part 74 + Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BAE - 00013BAE (0x1 bytes), align: 0 + Segment part 80. Intra module refs: l2capParseSignalHdr + l2capStopTimer + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BAF - 00013BB3 (0x5 bytes), align: 0 + Segment part 81. Intra module refs: L2CAP_ParseParamUpdateReq + Segment part 80 + l2capBuildParamUpdateReq + l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BB4 - 00013BEB (0x38 bytes), align: 0 + Segment part 82. Intra module refs: L2CAP_ParseParamUpdateReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ParseParamUpdateReq + 00013BB4 + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BEC - 00013BF1 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: L2CAP_ParseParamUpdateReq + l2capHandleTimerCB + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013BF2 - 00013C03 (0x12 bytes), align: 0 + Segment part 85. Intra module refs: L2CAP_ParseParamUpdateReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C04 - 00013C07 (0x4 bytes), align: 0 + Segment part 86. Intra module refs: L2CAP_ParseParamUpdateReq + l2capParseCmdReject + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C08 - 00013C1A (0x13 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + Segment part 93 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C1B - 00013C36 (0x1c bytes), align: 0 + Segment part 90. Intra module refs: l2capParseParamUpdateRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseParamUpdateRsp + 00013C1B + XSTACK = 00000002 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C37 - 00013C3F (0x9 bytes), align: 0 + Segment part 92. Intra module refs: l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C40 - 00013C45 (0x6 bytes), align: 0 + Segment part 93. Intra module refs: l2capParseParamUpdateRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013C46 - 00013CB6 (0x71 bytes), align: 0 + Segment part 94. Intra module refs: l2capNotifyData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifyData 00013C46 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013CB7 - 00013D3B (0x85 bytes), align: 0 + Segment part 96. Intra module refs: l2capNotifySignal::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifySignal 00013CB7 + calls direct + XSTACK = 0000000D ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013D3C - 00013D43 (0x8 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 99 + l2capNotifyData + l2capNotifySignal + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013D44 - 00013D49 (0x6 bytes), align: 0 + Segment part 99. Intra module refs: l2capNotifySignal + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013D4A - 00013DA2 (0x59 bytes), align: 0 + Segment part 100. Intra module refs: l2capAllocChannel::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capAllocChannel 00013D4A + XSTACK = 00000012 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DA3 - 00013DA7 (0x5 bytes), align: 0 + Segment part 102. Intra module refs: l2capAllocChannel + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DA8 - 00013DB2 (0xb bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + l2capEncapSendData + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DB3 - 00013DC7 (0x15 bytes), align: 0 + Segment part 104. Intra module refs: l2capFreeChannel::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFreeChannel 00013DB3 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013DC8 - 00013DFF (0x38 bytes), align: 0 + Segment part 106. Intra module refs: l2capFindLocalId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFindLocalId 00013DC8 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E00 - 00013E0F (0x10 bytes), align: 0 + Segment part 108. Intra module refs: l2capAllocChannel + l2capFindLocalId + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E10 - 00013E28 (0x19 bytes), align: 0 + Segment part 109. Intra module refs: l2capStopTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capStopTimer 00013E10 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E29 - 00013E8D (0x65 bytes), align: 0 + Segment part 111. Intra module refs: l2capHandleTimerCB::?relay + LOCAL ADDRESS + ===== ======= + l2capHandleTimerCB 00013E29 + calls direct, is indirectly called + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E8E - 00013E90 (0x3 bytes), align: 0 + Segment part 113. Intra module refs: l2capHandleRxError::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capHandleRxError 00013E8E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013E91 - 00013EB4 (0x24 bytes), align: 0 + Segment part 115. Intra module refs: L2CAP_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_bm_alloc 00013E91 + calls direct + XSTACK = 00000018 ( 0000000A ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A05 - 00000A0A (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseSignalHdr::?relay + 00000A05 l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A0B - 00000A10 (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendReq::?relay 00000A0B Segment part 16 (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A11 - 00000A16 (0x6 bytes), align: 0 + Segment part 18. Intra module refs: l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capSendCmd::?relay 00000A11 Segment part 19 (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A17 - 00000A1C (0x6 bytes), align: 0 + Segment part 21. Intra module refs: l2capSendCmd + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capEncapSendData::?relay + 00000A17 L2CAP_SendData (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A1D - 00000A22 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParsePacket::?relay + 00000A1D l2capProcessRxData (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A23 - 00000A28 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_BuildCmdReject::?relay + 00000A23 L2CAP_CmdReject (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A29 - 00000A2E (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseCmdReject::?relay + 00000A29 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A2F - 00000A34 (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capBuildParamUpdateReq::?relay + 00000A2F L2CAP_ConnParamUpdateReq (l2cap_if) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A35 - 00000A3A (0x6 bytes), align: 0 + Segment part 83. + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_ParseParamUpdateReq::?relay + 00000A35 l2capProcessReq (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A3B - 00000A40 (0x6 bytes), align: 0 + Segment part 91. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capParseParamUpdateRsp::?relay + 00000A3B l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A41 - 00000A46 (0x6 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifyData::?relay + 00000A41 l2capProcessRxData (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A47 - 00000A4C (0x6 bytes), align: 0 + Segment part 97. Intra module refs: l2capHandleTimerCB + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capNotifySignal::?relay + 00000A47 l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A4D - 00000A52 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capAllocChannel::?relay + 00000A4D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A53 - 00000A58 (0x6 bytes), align: 0 + Segment part 105. Intra module refs: l2capHandleTimerCB + l2capSendReq + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFreeChannel::?relay + 00000A53 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A59 - 00000A5E (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capFindLocalId::?relay + 00000A59 l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A5F - 00000A64 (0x6 bytes), align: 0 + Segment part 110. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capStopTimer::?relay + 00000A5F l2capProcessRsp (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A65 - 00000A6A (0x6 bytes), align: 0 + Segment part 112. Intra module refs: l2capSendReq + LOCAL ADDRESS + ===== ======= + l2capHandleTimerCB::?relay + 00000A65 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A6B - 00000A70 (0x6 bytes), align: 0 + Segment part 114. + ENTRY ADDRESS REF BY + ===== ======= ====== + l2capHandleRxError::?relay + 00000A6B l2capProcessSignal (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A71 - 00000A76 (0x6 bytes), align: 0 + Segment part 116. Intra module refs: l2capSendCmd + ENTRY ADDRESS REF BY + ===== ======= ====== + L2CAP_bm_alloc::?relay + 00000A71 attSendMsg (att_util) + smSendSMMsg (smp) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : linkdb + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000408 - 0000042A (0x23 bytes), align: 0 + Segment part 6. Intra module refs: linkDB_Find + linkDB_FindFirst + linkDB_Init + linkDB_NumActive + linkDB_PerformFunc + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000042B - 00000442 (0x18 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 37 + linkDB_Register + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195DA - 00019601 (0x28 bytes), align: 0 + Segment part 8. Intra module refs: linkDB_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Init 000195DA + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019602 - 0001963F (0x3e bytes), align: 0 + Segment part 10. Intra module refs: linkDB_Register::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Register 00019602 + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019640 - 000196FD (0xbe bytes), align: 0 + Segment part 12. Intra module refs: linkDB_Add::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Add 00019640 + calls direct + XSTACK = 00000004 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000196FE - 0001975F (0x62 bytes), align: 0 + Segment part 14. Intra module refs: linkDB_Remove::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Remove 000196FE + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019760 - 00019768 (0x9 bytes), align: 0 + Segment part 18. Intra module refs: linkDB_Remove + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019769 - 00019784 (0x1c bytes), align: 0 + Segment part 19. Intra module refs: linkDB_Find::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Find 00019769 + XSTACK = 00000014 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019785 - 000197A5 (0x21 bytes), align: 0 + Segment part 21. Intra module refs: linkDB_FindFirst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_FindFirst 00019785 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197A6 - 000197AC (0x7 bytes), align: 0 + Segment part 23. Intra module refs: linkDB_Find + linkDB_FindFirst + linkDB_Init + linkDB_NumActive + linkDB_PerformFunc + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197AD - 000197D7 (0x2b bytes), align: 0 + Segment part 24. Intra module refs: linkDB_State::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_State 000197AD + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197D8 - 000197DC (0x5 bytes), align: 0 + Segment part 26. Intra module refs: linkDB_Remove + linkDB_State + reportStatusChange + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197DD - 000197EB (0xf bytes), align: 0 + Segment part 27. Intra module refs: linkDB_NumActive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_NumActive 000197DD + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000197EC - 0001985C (0x71 bytes), align: 0 + Segment part 29. Intra module refs: linkDB_Authen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Authen 000197EC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001985D - 00019860 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: linkDB_Add + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019861 - 00019865 (0x5 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + linkDB_Authen + linkDB_Remove + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019866 - 0001988B (0x26 bytes), align: 0 + Segment part 33. Intra module refs: linkDB_PerformFunc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_PerformFunc 00019866 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001988C - 000198C2 (0x37 bytes), align: 0 + Segment part 35. Intra module refs: reportStatusChange::?relay + LOCAL ADDRESS + ===== ======= + reportStatusChange 0001988C + XSTACK = 00000014 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000198C3 - 000198D3 (0x11 bytes), align: 0 + Segment part 37. Intra module refs: linkDB_Init + reportStatusChange + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A77 - 00000A7C (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Init::?relay 00000A77 GAP_Init (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A7D - 00000A82 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Register::?relay + 00000A7D Actimetry_AddService (actimetryservice) + GATTServApp_Init (gattservapp) + GATT_InitServer (gatt_server) + Gps_AddService (gpsservice) + SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A83 - 00000A88 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Add::?relay 00000A83 gapProcessConnectionCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A89 - 00000A8E (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Remove::?relay 00000A89 gapProcessDisconnectCompleteEvt (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A8F - 00000A94 (0x6 bytes), align: 0 + Segment part 20. Intra module refs: linkDB_Add + linkDB_Authen + linkDB_Remove + linkDB_State + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Find::?relay 00000A8F ?Subroutine13 (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAP_Bond (gap_linkmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 48 (gap_linkmgr) + Segment part 61 (gap_linkmgr) + Segment part 84 (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + sendAuthEvent (gap_linkmgr) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A95 - 00000A9A (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_FindFirst::?relay + 00000A95 disconnectNext (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000A9B - 00000AA0 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_State::?relay 00000A9B Actimetry_HandleConnStatusCB (actimetryservice) + L2CAP_SendData (l2cap_if) + attSendMsg (att_util) + gattServApp_HandleConnStatusCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gps_HandleConnStatusCB (gpsservice) + l2capSendReq (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AA1 - 00000AA6 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_NumActive::?relay + 00000AA1 GAP_NumActiveConnections (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AA7 - 00000AAC (0x6 bytes), align: 0 + Segment part 30. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_Authen::?relay 00000AA7 GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_VerifyReadPermissions (gatt_server) + GATT_VerifyWritePermissions (gatt_server) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AAD - 00000AB2 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + linkDB_PerformFunc::?relay + 00000AAD GAPBondMgr_ServiceChangeInd (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AB3 - 00000AB8 (0x6 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 18 + linkDB_Add + LOCAL ADDRESS + ===== ======= + reportStatusChange::?relay + 00000AB3 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000AE - 000000AE (0x1 bytes), align: 0 + Segment part 6. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + PMUX 000000AE + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F2 - 000000F2 (0x1 bytes), align: 0 + Segment part 8. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + APCFG 000000F2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D9 - 000000D9 (0x1 bytes), align: 0 + Segment part 16. ROOT. Intra module refs: llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncReq (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFD 000000D9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E1 - 000000E1 (0x1 bytes), align: 0 + Segment part 17. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + LL_Reset + LL_SetAdvControl + PHY_CommitRxFifo (phy) + PHY_DeallocateRxFifo (phy) + PHY_RetryRxFifo (phy) + PHY_RetryTxFifo (phy) + llAdvEvt_TaskAbort (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llReleaseAllConnId (ll_common) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llSetupAdv (ll_common) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncReq (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFST 000000E1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000443 - 00000448 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: LL_Init + LL_ReadBDADDR + LL_SetAdvParam + Segment part 229 + ENTRY ADDRESS REF BY + ===== ======= ====== + ownPublicAddr 00000443 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000449 - 0000044E (0x6 bytes), align: 0 + Segment part 24. Intra module refs: LL_Init + LL_SetAdvParam + LL_SetRandomAddress + ENTRY ADDRESS REF BY + ===== ======= ====== + ownRandomAddr 00000449 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000044F - 00000454 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 229 + ENTRY ADDRESS REF BY + ===== ======= ====== + ownSavedPublicAddr 0000044F + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000455 - 00000455 (0x1 bytes), align: 0 + Segment part 26. Intra module refs: LL_Init + LL_ProcessEvent + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TaskID 00000455 RF_NormalIsr (ll_isr) + Segment part 71 (ll_advEndCauses) + llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000456 - 00000456 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: LL_EncLtkNegReply + LL_EncLtkReply + LL_ProcessEvent + LL_Rand + LL_ReadRssi + LL_Reset + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + llState 00000456 LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + RF_NormalIsr (ll_isr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llFreeTask (ll_scheduler) + llRestoreConnState (ll_scheduler) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncRsp (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000457 - 00000457 (0x1 bytes), align: 0 + Segment part 28. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskEndCause 00000457 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000458 - 00000459 (0x2 bytes), align: 0 + Segment part 29. Intra module refs: LL_Rand + LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + postRfOperations 00000458 Segment part 57 (ll_common) + Segment part 58 (ll_common) + llProcessPostRfOps (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045A - 0000045A (0x1 bytes), align: 0 + Segment part 30. Intra module refs: LL_ReadRssi + ENTRY ADDRESS REF BY + ===== ======= ====== + rssiCorrection 0000045A llSetRxGain (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045B - 0000045B (0x1 bytes), align: 0 + Segment part 31. Intra module refs: LL_EXT_ClkDivOnHalt + LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + clkDivOnHalt 0000045B llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045C - 0000045C (0x1 bytes), align: 0 + Segment part 32. Intra module refs: LL_ProcessEvent + LL_Reset + LL_SetAdvControl + ENTRY ADDRESS REF BY + ===== ======= ====== + nvInUse 0000045C llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000045D - 00000468 (0xc bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + rfCounters 0000045D llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000469 - 00000471 (0x9 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + deviceFeatureSet 00000469 Segment part 25 (ll_slaveEndCauses) + llAllocConnId (ll_common) + llInitFeatureSet (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000472 - 00000472 (0x1 bytes), align: 0 + Segment part 35. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + maxTxPwrForDTM 00000472 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000473 - 00000477 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + verInfo 00000473 llSetupVersionIndReq (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000478 - 0000047F (0x8 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + dtmInfo 00000478 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000480 - 00000481 (0x2 bytes), align: 0 + Segment part 38. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + buildInfo 00000480 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000482 - 00000589 (0x108 bytes), align: 0 + Segment part 39. Intra module refs: LL_ConnActive + LL_ProcessEvent + LL_ReadRssi + LL_TxData + Segment part 118 + Segment part 243 + ENTRY ADDRESS REF BY + ===== ======= ====== + llConns 00000482 Segment part 266 (ll_common) + Segment part 31 (ll_scheduler) + Segment part 32 (ll_scheduler) + Segment part 60 (ll_slaveEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llConnCleanup (ll_common) + llGetNextConn (ll_common) + llProcessPendingTxData (ll_common) + llReleaseAllConnId (ll_common) + llReleaseConnId (ll_common) + llRestoreConnState (ll_scheduler) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartSlaveSetup (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000058A - 00000590 (0x7 bytes), align: 0 + Segment part 40. Intra module refs: LL_ProcessEvent + LL_Reset + LL_SetAdvParam + Segment part 79 + ENTRY ADDRESS REF BY + ===== ======= ====== + peerInfo 0000058A llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000591 - 00000595 (0x5 bytes), align: 0 + Segment part 41. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + chanMapUpdate 00000591 llAllocConnId (ll_common) + llSetNextDataChan (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000596 - 00000596 (0x1 bytes), align: 0 + Segment part 42. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + onePktPerEvt 00000596 llReleaseConnId (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000597 - 00000597 (0x1 bytes), align: 0 + Segment part 43. Intra module refs: LL_Reset + LL_TxData + ENTRY ADDRESS REF BY + ===== ======= ====== + fastTxRespTime 00000597 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000598 - 00000598 (0x1 bytes), align: 0 + Segment part 44. Intra module refs: LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + slOverride 00000598 llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000599 - 000005ED (0x55 bytes), align: 0 + Segment part 45. Intra module refs: LL_Init + LL_Reset + LL_SetAdvControl + LL_SetAdvData + LL_SetAdvParam + LL_SetScanRspData + Segment part 164 + Segment part 165 + ENTRY ADDRESS REF BY + ===== ======= ====== + advInfo 00000599 Segment part 102 (ll_common) + Segment part 104 (ll_common) + Segment part 109 (ll_common) + Segment part 110 (ll_common) + Segment part 247 (ll_common) + Segment part 49 (ll_advEndCauses) + Segment part 50 (ll_advEndCauses) + Segment part 52 (ll_advEndCauses) + Segment part 53 (ll_advEndCauses) + Segment part 54 (ll_advEndCauses) + Segment part 56 (ll_advEndCauses) + Segment part 57 (ll_advEndCauses) + Segment part 59 (ll_advEndCauses) + Segment part 63 (ll_advEndCauses) + Segment part 64 (ll_advEndCauses) + Segment part 65 (ll_advEndCauses) + Segment part 68 (ll_advEndCauses) + Segment part 75 (ll_advEndCauses) + Segment part 82 (ll_common) + Segment part 84 (ll_common) + Segment part 88 (ll_common) + Segment part 90 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCheckWhiteListUsage (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupAdv (ll_common) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005EE - 000005EF (0x2 bytes), align: 0 + Segment part 46. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + dcdcData 000005EE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005F0 - 000005F0 (0x1 bytes), align: 0 + Segment part 47. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + extendRfRange 000005F0 llExtendRfRange (ll_common) + llSetRxGain (ll_common) + llSetTxPower (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005F1 - 000005F1 (0x1 bytes), align: 0 + Segment part 48. Intra module refs: LL_CtrlToHostFlowControl + LL_Reset + ENTRY ADDRESS REF BY + ===== ======= ====== + rxFifoFlowCtrl 000005F1 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005F2 - 000005F2 (0x1 bytes), align: 0 + Segment part 49. Intra module refs: LL_EXT_ClkDivOnHalt + LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + haltDuringRf 000005F2 llScheduleTask (ll_scheduler) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DA7 - 00000DB4 (0xe bytes), align: 0 + Segment part 50. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskEndCauses 00000DA7 llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DB5 - 00000DC0 (0xc bytes), align: 0 + Segment part 52. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + taskErrorEndCauses 00000DB5 Segment part 118 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005F3 - 000005F3 (0x1 bytes), align: 0 + Segment part 55. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + trngCounter 000005F3 RF_NormalIsr (ll_isr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +IDATA_Z + Relative segment, address: IDATA 00000029 - 0000002A (0x2 bytes), align: 0 + Segment part 56. ROOT. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + myPC 00000029 RF_NormalIsr (ll_isr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000AF91 - 0000B124 (0x194 bytes), align: 0 + Segment part 68. Intra module refs: LL_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Init 0000AF91 + calls direct + XSTACK = 00000000 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B125 - 0000B126 (0x2 bytes), align: 0 + Segment part 70. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B127 - 0000B12D (0x7 bytes), align: 0 + Segment part 71. Intra module refs: LL_Reset + Segment part 70 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B12E - 0000B2EE (0x1c1 bytes), align: 0 + Segment part 72. Intra module refs: LL_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ProcessEvent 0000B12E + calls direct + XSTACK = 00000000 ( 00000013 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2EF - 0000B2F1 (0x3 bytes), align: 0 + Segment part 74. Intra module refs: LL_EncLtkNegReply + LL_EncLtkReply + LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2F2 - 0000B2F6 (0x5 bytes), align: 0 + Segment part 75. Intra module refs: LL_EncLtkReply + LL_PseudoRand + LL_TxData + Segment part 74 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2F7 - 0000B2FE (0x8 bytes), align: 0 + Segment part 76. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B2FF - 0000B301 (0x3 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 131 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B302 - 0000B307 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 177 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B308 - 0000B313 (0xc bytes), align: 0 + Segment part 79. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B314 - 0000B3D4 (0xc1 bytes), align: 0 + Segment part 80. Intra module refs: LL_Reset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Reset 0000B314 + calls direct + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B3D5 - 0000B3DD (0x9 bytes), align: 0 + Segment part 82. Intra module refs: LL_Reset + Segment part 71 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B3DE - 0000B411 (0x34 bytes), align: 0 + Segment part 83. Intra module refs: LL_ReadBDADDR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadBDADDR 0000B3DE + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B412 - 0000B416 (0x5 bytes), align: 0 + Segment part 85. Intra module refs: LL_ReadBDADDR + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B417 - 0000B41E (0x8 bytes), align: 0 + Segment part 86. Intra module refs: LL_ReadBDADDR + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B41F - 0000B424 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: LL_ReadBDADDR + Segment part 85 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B425 - 0000B45A (0x36 bytes), align: 0 + Segment part 88. Intra module refs: LL_SetRandomAddress::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetRandomAddress 0000B425 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B45B - 0000B461 (0x7 bytes), align: 0 + Segment part 90. Intra module refs: LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B462 - 0000B46B (0xa bytes), align: 0 + Segment part 91. Intra module refs: LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B46C - 0000B47D (0x12 bytes), align: 0 + Segment part 92. Intra module refs: LL_ClearWhiteList::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ClearWhiteList 0000B46C + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B47E - 0000B4BD (0x40 bytes), align: 0 + Segment part 94. Intra module refs: LL_AddWhiteListDevice::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_AddWhiteListDevice 0000B47E + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B4BE - 0000B4EC (0x2f bytes), align: 0 + Segment part 102. Intra module refs: LL_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Encrypt 0000B4BE + calls direct + XSTACK = 00000002 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B4ED - 0000B538 (0x4c bytes), align: 0 + Segment part 104. Intra module refs: LL_Rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Rand 0000B4ED + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B539 - 0000B570 (0x38 bytes), align: 0 + Segment part 106. Intra module refs: LL_PseudoRand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_PseudoRand 0000B539 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B571 - 0000B593 (0x23 bytes), align: 0 + Segment part 114. Intra module refs: LL_CtrlToHostFlowControl::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_CtrlToHostFlowControl + 0000B571 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B594 - 0000B59E (0xb bytes), align: 0 + Segment part 118. Intra module refs: LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B59F - 0000B5EF (0x51 bytes), align: 0 + Segment part 127. Intra module refs: LL_ReadRssi::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRssi 0000B59F + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B5F0 - 0000B668 (0x79 bytes), align: 0 + Segment part 129. Intra module refs: LL_Disconnect::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Disconnect 0000B5F0 + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B669 - 0000B66E (0x6 bytes), align: 0 + Segment part 131. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B66F - 0000B67E (0x10 bytes), align: 0 + Segment part 132. Intra module refs: LL_Disconnect + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B67F - 0000B94F (0x2d1 bytes), align: 0 + Segment part 133. Intra module refs: LL_TxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxData 0000B67F + calls direct + XSTACK = 00000001 ( 0000001E ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B950 - 0000B951 (0x2 bytes), align: 0 + Segment part 135. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B952 - 0000B957 (0x6 bytes), align: 0 + Segment part 136. Intra module refs: LL_SetAdvParam + LL_TxData + Segment part 135 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B958 - 0000B95D (0x6 bytes), align: 0 + Segment part 142. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B95E - 0000B962 (0x5 bytes), align: 0 + Segment part 146. Intra module refs: LL_AddWhiteListDevice + LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B963 - 0000B96C (0xa bytes), align: 0 + Segment part 149. Intra module refs: LL_Reset + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000B96D - 0000BB18 (0x1ac bytes), align: 0 + Segment part 151. Intra module refs: LL_SetAdvParam::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvParam 0000B96D + calls direct + XSTACK = 00000006 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB19 - 0000BB1D (0x5 bytes), align: 0 + Segment part 153. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB1E - 0000BB28 (0xb bytes), align: 0 + Segment part 154. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB29 - 0000BB33 (0xb bytes), align: 0 + Segment part 155. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB34 - 0000BB38 (0x5 bytes), align: 0 + Segment part 156. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB39 - 0000BB40 (0x8 bytes), align: 0 + Segment part 157. Intra module refs: LL_SetAdvParam + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB41 - 0000BB46 (0x6 bytes), align: 0 + Segment part 158. Intra module refs: LL_SetAdvParam + Segment part 132 + Segment part 156 + Segment part 157 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB47 - 0000BB82 (0x3c bytes), align: 0 + Segment part 159. Intra module refs: LL_SetAdvData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvData 0000BB47 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BB83 - 0000BCB8 (0x136 bytes), align: 0 + Segment part 161. Intra module refs: LL_SetAdvControl::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvControl 0000BB83 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCB9 - 0000BCBD (0x5 bytes), align: 0 + Segment part 163. Intra module refs: LL_Init + LL_PseudoRand + LL_Rand + LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCBE - 0000BCCA (0xd bytes), align: 0 + Segment part 164. Intra module refs: LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCCB - 0000BCD3 (0x9 bytes), align: 0 + Segment part 165. Intra module refs: LL_SetAdvControl + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCD4 - 0000BCDC (0x9 bytes), align: 0 + Segment part 166. Intra module refs: LL_ProcessEvent + Segment part 165 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BCDD - 0000BD15 (0x39 bytes), align: 0 + Segment part 170. Intra module refs: LL_SetScanRspData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetScanRspData 0000BCDD + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD16 - 0000BD1A (0x5 bytes), align: 0 + Segment part 172. Intra module refs: LL_EncLtkReply + LL_Encrypt + LL_ProcessEvent + LL_ReadRssi + LL_SetAdvData + LL_SetScanRspData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD1B - 0000BD23 (0x9 bytes), align: 0 + Segment part 173. Intra module refs: LL_SetAdvData + LL_SetScanRspData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD24 - 0000BD91 (0x6e bytes), align: 0 + Segment part 174. Intra module refs: LL_EncLtkReply::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReply 0000BD24 + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD92 - 0000BD94 (0x3 bytes), align: 0 + Segment part 176. Intra module refs: LL_Disconnect + LL_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD95 - 0000BD98 (0x4 bytes), align: 0 + Segment part 177. Intra module refs: LL_EncLtkReply + LL_TxData + Segment part 176 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BD99 - 0000BDDC (0x44 bytes), align: 0 + Segment part 178. Intra module refs: LL_EncLtkNegReply::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkNegReply 0000BD99 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDDD - 0000BDE1 (0x5 bytes), align: 0 + Segment part 181. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + LL_EncLtkReply + LL_ReadRssi + LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDE2 - 0000BDE6 (0x5 bytes), align: 0 + Segment part 182. Intra module refs: LL_Disconnect + LL_EncLtkNegReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BDE7 - 0000BE07 (0x21 bytes), align: 0 + Segment part 183. Intra module refs: LL_ConnActive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnActive 0000BDE7 + XSTACK = 0000001A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE08 - 0000BE0D (0x6 bytes), align: 0 + Segment part 190. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE0E - 0000BE13 (0x6 bytes), align: 0 + Segment part 191. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE14 - 0000BE16 (0x3 bytes), align: 0 + Segment part 196. Intra module refs: LL_ReadBDADDR + LL_SetRandomAddress + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE17 - 0000BE1D (0x7 bytes), align: 0 + Segment part 197. Intra module refs: LL_ClearWhiteList + LL_ConnActive + LL_CtrlToHostFlowControl + LL_EXT_ClkDivOnHalt + LL_Reset + Segment part 196 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE1E - 0000BE47 (0x2a bytes), align: 0 + Segment part 198. Intra module refs: LL_EXT_ClkDivOnHalt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ClkDivOnHalt 0000BE1E + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE48 - 0000BE51 (0xa bytes), align: 0 + Segment part 204. Intra module refs: LL_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE52 - 0000BE82 (0x31 bytes), align: 0 + Segment part 229. Intra module refs: LL_Init + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE83 - 0000BE86 (0x4 bytes), align: 0 + Segment part 242. Intra module refs: LL_EncLtkReply + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE87 - 0000BE92 (0xc bytes), align: 0 + Segment part 243. Intra module refs: Segment part 182 + Segment part 242 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE93 - 0000BE96 (0x4 bytes), align: 0 + Segment part 246. Intra module refs: LL_ReadRssi + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BE97 - 0000BEA8 (0x12 bytes), align: 0 + Segment part 247. Intra module refs: Segment part 243 + Segment part 246 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BEA9 - 0000BEAC (0x4 bytes), align: 0 + Segment part 252. Intra module refs: LL_TxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000BEAD - 0000BEB8 (0xc bytes), align: 0 + Segment part 253. Intra module refs: Segment part 252 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000219 - 00000226 (0xe bytes), align: 0 + Segment part 51. Intra module refs: taskEndCauses + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000227 - 00000232 (0xc bytes), align: 0 + Segment part 53. Intra module refs: taskErrorEndCauses + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F5F - 00008F62 (0x4 bytes), align: 0 + Segment part 59. Intra module refs: LL_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_190 00008F5F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F4F - 00008F52 (0x4 bytes), align: 0 + Segment part 60. Intra module refs: LL_Reset + llSetupAdv (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_555555 00008F4F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F43 - 00008F46 (0x4 bytes), align: 0 + Segment part 62. Intra module refs: LL_TxData + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_6 00008F43 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F3F - 00008F42 (0x4 bytes), align: 0 + Segment part 63. Intra module refs: LL_SetAdvControl + LL_TxData + Segment part 98 (ll_timer2) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffff 00008F3F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F6B - 00008F6E (0x4 bytes), align: 0 + Segment part 65. Intra module refs: LL_SetAdvControl + Segment part 30 (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3 00008F6B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AB9 - 00000ABE (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Init::?relay 00000AB9 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ABF - 00000AC4 (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ProcessEvent::?relay + 00000ABF tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AC5 - 00000ACA (0x6 bytes), align: 0 + Segment part 81. Intra module refs: LL_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Reset::?relay 00000AC5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ACB - 00000AD0 (0x6 bytes), align: 0 + Segment part 84. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadBDADDR::?relay 00000ACB HCI_ReadBDADDRCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AD1 - 00000AD6 (0x6 bytes), align: 0 + Segment part 89. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetRandomAddress::?relay + 00000AD1 HCI_LE_SetRandomAddressCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AD7 - 00000ADC (0x6 bytes), align: 0 + Segment part 93. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ClearWhiteList::?relay + 00000AD7 HCI_LE_ClearWhiteListCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ADD - 00000AE2 (0x6 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_AddWhiteListDevice::?relay + 00000ADD HCI_LE_AddWhiteListCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AE3 - 00000AE8 (0x6 bytes), align: 0 + Segment part 103. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Encrypt::?relay 00000AE3 Segment part 82 (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AE9 - 00000AEE (0x6 bytes), align: 0 + Segment part 105. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Rand::?relay 00000AE9 HCI_LE_RandCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AEF - 00000AF4 (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_PseudoRand::?relay 00000AEF Onboard_rand (OnBoard) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AF5 - 00000AFA (0x6 bytes), align: 0 + Segment part 115. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_CtrlToHostFlowControl::?relay + 00000AF5 LL_RxDataCompleteCback (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000AFB - 00000B00 (0x6 bytes), align: 0 + Segment part 128. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ReadRssi::?relay 00000AFB HCI_ReadRssiCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B01 - 00000B06 (0x6 bytes), align: 0 + Segment part 130. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_Disconnect::?relay 00000B01 HCI_DisconnectCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B07 - 00000B0C (0x6 bytes), align: 0 + Segment part 134. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_TxData::?relay 00000B07 HCI_TxDataSend (hci_data) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B0D - 00000B12 (0x6 bytes), align: 0 + Segment part 152. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvParam::?relay + 00000B0D HCI_LE_SetAdvParamCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B13 - 00000B18 (0x6 bytes), align: 0 + Segment part 160. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvData::?relay 00000B13 HCI_LE_SetAdvDataCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B19 - 00000B1E (0x6 bytes), align: 0 + Segment part 162. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetAdvControl::?relay + 00000B19 HCI_LE_SetAdvEnableCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B1F - 00000B24 (0x6 bytes), align: 0 + Segment part 171. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_SetScanRspData::?relay + 00000B1F HCI_LE_SetScanRspDataCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B25 - 00000B2A (0x6 bytes), align: 0 + Segment part 175. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkReply::?relay + 00000B25 HCI_LE_LtkReqReplyCmd (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B2B - 00000B30 (0x6 bytes), align: 0 + Segment part 179. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EncLtkNegReply::?relay + 00000B2B HCI_LE_LtkReqNegReplyCmd (hci) + LL_EncLtkReqCback (hci_event) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B31 - 00000B36 (0x6 bytes), align: 0 + Segment part 184. Intra module refs: Segment part 181 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ConnActive::?relay 00000B31 HCI_SendDataPkt (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B37 - 00000B3C (0x6 bytes), align: 0 + Segment part 199. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_EXT_ClkDivOnHalt::?relay + 00000B37 HCI_EXT_ClkDivOnHaltCmd (hci) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F5F - 00008F62 (0x4 bytes), align: 0 + Segment part 269. Intra module refs: __Constant_190 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F4F - 00008F52 (0x4 bytes), align: 0 + Segment part 270. Intra module refs: __Constant_555555 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F43 - 00008F46 (0x4 bytes), align: 0 + Segment part 272. Intra module refs: __Constant_6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F3F - 00008F42 (0x4 bytes), align: 0 + Segment part 273. Intra module refs: __Constant_ffffff + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F6B - 00008F6E (0x4 bytes), align: 0 + Segment part 275. Intra module refs: __Constant_3 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_advEndCauses + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D44 - 00012D56 (0x13 bytes), align: 0 + Segment part 16. Intra module refs: llDirectedAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDirectedAdvEvt_TaskEndOk + 00012D44 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D57 - 00012D60 (0xa bytes), align: 0 + Segment part 18. Intra module refs: llAdvEvt_TaskAbort + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012D61 - 00013237 (0x4d7 bytes), align: 0 + Segment part 19. Intra module refs: llAdvEvt_TaskConnect::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskConnect 00012D61 + calls direct + XSTACK = 00000000 ( 0000001C ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013238 - 00013243 (0xc bytes), align: 0 + Segment part 21. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013244 - 00013245 (0x2 bytes), align: 0 + Segment part 22. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013246 - 00013248 (0x3 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013249 - 0001324F (0x7 bytes), align: 0 + Segment part 24. Intra module refs: Segment part 23 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013250 - 00013252 (0x3 bytes), align: 0 + Segment part 25. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013253 - 00013257 (0x5 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013258 - 00013266 (0xf bytes), align: 0 + Segment part 27. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013267 - 0001326A (0x4 bytes), align: 0 + Segment part 28. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001326B - 00013272 (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013273 - 00013285 (0x13 bytes), align: 0 + Segment part 30. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013286 - 0001328C (0x7 bytes), align: 0 + Segment part 31. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001328D - 0001329A (0xe bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001329B - 000132A2 (0x8 bytes), align: 0 + Segment part 33. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132A3 - 000132AD (0xb bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + Segment part 64 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132AE - 000132B3 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132B4 - 000132BD (0xa bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132BE - 000132C4 (0x7 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 36 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132C5 - 000132CB (0x7 bytes), align: 0 + Segment part 38. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132CC - 000132D2 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132D3 - 000132D8 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132D9 - 000132E3 (0xb bytes), align: 0 + Segment part 41. Intra module refs: Segment part 40 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132E4 - 000132F1 (0xe bytes), align: 0 + Segment part 42. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132F2 - 000132FA (0x9 bytes), align: 0 + Segment part 43. Intra module refs: Segment part 42 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000132FB - 000133F4 (0xfa bytes), align: 0 + Segment part 44. Intra module refs: llUndirectedAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llUndirectedAdvEvt_TaskEndOk + 000132FB + calls direct + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000133F5 - 000133FC (0x8 bytes), align: 0 + Segment part 46. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000133FD - 00013499 (0x9d bytes), align: 0 + Segment part 47. Intra module refs: llDiscoverableAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDiscoverableAdvEvt_TaskEndOk + 000133FD + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001349A - 000134A7 (0xe bytes), align: 0 + Segment part 49. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134A8 - 000134B5 (0xe bytes), align: 0 + Segment part 50. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134B6 - 000134BE (0x9 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 49 + Segment part 50 + Segment part 56 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134BF - 000134C7 (0x9 bytes), align: 0 + Segment part 52. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134C8 - 000134D2 (0xb bytes), align: 0 + Segment part 53. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134D3 - 000134E4 (0x12 bytes), align: 0 + Segment part 54. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134E5 - 000134E9 (0x5 bytes), align: 0 + Segment part 55. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134EA - 000134FB (0x12 bytes), align: 0 + Segment part 56. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134FC - 000134FE (0x3 bytes), align: 0 + Segment part 57. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000134FF - 0001350F (0x11 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 57 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013510 - 00013512 (0x3 bytes), align: 0 + Segment part 59. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013513 - 00013515 (0x3 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013516 - 00013519 (0x4 bytes), align: 0 + Segment part 61. Intra module refs: Segment part 60 + llAdvEvt_TaskConnect + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001351A - 00013524 (0xb bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + Segment part 65 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013525 - 00013552 (0x2e bytes), align: 0 + Segment part 63. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013553 - 00013564 (0x12 bytes), align: 0 + Segment part 64. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013565 - 00013576 (0x12 bytes), align: 0 + Segment part 65. Intra module refs: llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013577 - 000135FB (0x85 bytes), align: 0 + Segment part 66. Intra module refs: llNonConnAdvEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llNonConnAdvEvt_TaskEndOk + 00013577 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000135FC - 00013610 (0x15 bytes), align: 0 + Segment part 68. Intra module refs: Segment part 55 + llNonConnAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013611 - 00013619 (0x9 bytes), align: 0 + Segment part 69. Intra module refs: llAdvEvt_TaskAbort + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001361A - 0001361B (0x2 bytes), align: 0 + Segment part 70. Intra module refs: llAdvEvt_TaskConnect + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001361C - 0001361E (0x3 bytes), align: 0 + Segment part 71. Intra module refs: Segment part 70 + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001361F - 00013624 (0x6 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llDiscoverableAdvEvt_TaskEndOk + llNonConnAdvEvt_TaskEndOk + llUndirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013625 - 00013639 (0x15 bytes), align: 0 + Segment part 73. Intra module refs: llAdvEvt_TaskAbort::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskAbort 00013625 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001363A - 00013646 (0xd bytes), align: 0 + Segment part 75. Intra module refs: llAdvEvt_TaskAbort + llDirectedAdvEvt_TaskEndOk + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B3D - 00000B42 (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDirectedAdvEvt_TaskEndOk::?relay + 00000B3D llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B43 - 00000B48 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskConnect::?relay + 00000B43 Segment part 93 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B49 - 00000B4E (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + llUndirectedAdvEvt_TaskEndOk::?relay + 00000B49 llSetupUndirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B4F - 00000B54 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDiscoverableAdvEvt_TaskEndOk::?relay + 00000B4F llSetupScannableAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B55 - 00000B5A (0x6 bytes), align: 0 + Segment part 67. + ENTRY ADDRESS REF BY + ===== ======= ====== + llNonConnAdvEvt_TaskEndOk::?relay + 00000B55 Segment part 105 (ll_common) + Segment part 106 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B5B - 00000B60 (0x6 bytes), align: 0 + Segment part 74. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdvEvt_TaskAbort::?relay + 00000B5B Segment part 96 (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_common + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000088 - 00000088 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_TCON 00000088 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A9 - 000000A9 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + IP0 000000A9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AF - 000000AF (0x1 bytes), align: 0 + Segment part 8. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1STAT 000000AF + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000B9 - 000000B9 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + IP1 000000B9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000DA - 000000DA (0x1 bytes), align: 0 + Segment part 13. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CC0L 000000DA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000DB - 000000DB (0x1 bytes), align: 0 + Segment part 14. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CC0H 000000DB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E2 - 000000E2 (0x1 bytes), align: 0 + Segment part 15. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CNTL 000000E2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E3 - 000000E3 (0x1 bytes), align: 0 + Segment part 16. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CNTH 000000E3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E4 - 000000E4 (0x1 bytes), align: 0 + Segment part 17. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CTL 000000E4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E5 - 000000E5 (0x1 bytes), align: 0 + Segment part 18. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T1CCTL0 000000E5 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005892 - 000058DA (0x49 bytes), align: 0 + Segment part 42. Intra module refs: llRfInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRfInit 00005892 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000058DB - 00005907 (0x2d bytes), align: 0 + Segment part 44. Intra module refs: llSetFreqTune::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetFreqTune 000058DB + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005908 - 0000593A (0x33 bytes), align: 0 + Segment part 46. Intra module refs: llClearSetInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearSetInts 00005908 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000593B - 00005947 (0xd bytes), align: 0 + Segment part 48. Intra module refs: llDisableRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableRfInts 0000593B + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005948 - 00005953 (0xc bytes), align: 0 + Segment part 50. Intra module refs: llClearRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearRfInts 00005948 + XSTACK = 00000009 ( 00000000 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005954 - 00005965 (0x12 bytes), align: 0 + Segment part 52. Intra module refs: llEnableRfInts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnableRfInts 00005954 + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005966 - 00005A1E (0xb9 bytes), align: 0 + Segment part 54. Intra module refs: llProcessPostRfOps::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPostRfOps 00005966 + calls direct + XSTACK = 00000000 ( 00000008 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005A1F - 00005A24 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005A25 - 00005A2F (0xb bytes), align: 0 + Segment part 57. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005A30 - 00005A3A (0xb bytes), align: 0 + Segment part 58. Intra module refs: llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005A3B - 00005A98 (0x5e bytes), align: 0 + Segment part 59. Intra module refs: llSetRxGain::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetRxGain 00005A3B + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005A99 - 00005ACD (0x35 bytes), align: 0 + Segment part 61. Intra module refs: llSetTxPower::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetTxPower 00005A99 + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005ACE - 00005C69 (0x19c bytes), align: 0 + Segment part 65. Intra module refs: llFindTxPowerSettings::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindTxPowerSettings 00005ACE + calls direct + XSTACK = 00000000 ( 00000020 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005C6A - 00005CB6 (0x4d bytes), align: 0 + Segment part 67. Intra module refs: llExtendRfRange::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llExtendRfRange 00005C6A + calls direct + XSTACK = 00000008 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005CB7 - 00005CD0 (0x1a bytes), align: 0 + Segment part 71. Intra module refs: llCheckWhiteListUsage::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckWhiteListUsage 00005CB7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005CD1 - 00005CD2 (0x2 bytes), align: 0 + Segment part 73. Intra module refs: llDisableRfInts + llStartAdvSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005CD3 - 00005CD3 (0x1 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + llEnableRfInts + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005CD4 - 00005CDA (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 56 + Segment part 74 + llCheckWhiteListUsage + llExtendRfRange + llGetNextConn + llMemCopyDst + llMemCopySrc + llReleaseAllConnId + llReleaseConnId + llReplaceCtrlPkt + llRfInit + llSetFreqTune + llSetRxGain + llSetTxPower + llSetupAdv + llSetupStartEncReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005CDB - 00005D47 (0x6d bytes), align: 0 + Segment part 76. Intra module refs: llSetupAdv::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupAdv 00005CDB + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005D48 - 00005DCE (0x87 bytes), align: 0 + Segment part 78. Intra module refs: llSetupDirectedAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupDirectedAdvEvt 00005D48 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DCF - 00005DCF (0x1 bytes), align: 0 + Segment part 80. Intra module refs: llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DD0 - 00005DD4 (0x5 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 80 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DD5 - 00005DD7 (0x3 bytes), align: 0 + Segment part 82. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DD8 - 00005DDE (0x7 bytes), align: 0 + Segment part 83. Intra module refs: Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DDF - 00005DE1 (0x3 bytes), align: 0 + Segment part 84. Intra module refs: llSetupDirectedAdvEvt + llStartAdvSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DE2 - 00005DEC (0xb bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005DED - 00005E52 (0x66 bytes), align: 0 + Segment part 86. Intra module refs: llSetupUndirectedAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUndirectedAdvEvt + 00005DED + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E53 - 00005E5C (0xa bytes), align: 0 + Segment part 88. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E5D - 00005E62 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: Segment part 88 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E63 - 00005E68 (0x6 bytes), align: 0 + Segment part 90. Intra module refs: llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E69 - 00005E6F (0x7 bytes), align: 0 + Segment part 91. Intra module refs: Segment part 90 + llSetupAdv + llSetupDirectedAdvEvt + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E70 - 00005E77 (0x8 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 201 + Segment part 91 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E78 - 00005E81 (0xa bytes), align: 0 + Segment part 93. Intra module refs: llSetupDirectedAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E82 - 00005E84 (0x3 bytes), align: 0 + Segment part 94. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E85 - 00005E8E (0xa bytes), align: 0 + Segment part 95. Intra module refs: Segment part 94 + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E8F - 00005E97 (0x9 bytes), align: 0 + Segment part 96. Intra module refs: Segment part 95 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E98 - 00005E9B (0x4 bytes), align: 0 + Segment part 97. Intra module refs: Segment part 94 + llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005E9C - 00005E9F (0x4 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 118 + Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005EA0 - 00005EA8 (0x9 bytes), align: 0 + Segment part 99. Intra module refs: Segment part 116 + Segment part 98 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005EA9 - 00005EFB (0x53 bytes), align: 0 + Segment part 100. Intra module refs: llSetupNonConnectableAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNonConnectableAdvEvt + 00005EA9 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005EFC - 00005EFE (0x3 bytes), align: 0 + Segment part 102. Intra module refs: Segment part 110 + llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005EFF - 00005F06 (0x8 bytes), align: 0 + Segment part 103. Intra module refs: Segment part 102 + Segment part 109 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005F07 - 00005F11 (0xb bytes), align: 0 + Segment part 104. Intra module refs: llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005F12 - 00005F1E (0xd bytes), align: 0 + Segment part 105. Intra module refs: llSetupNonConnectableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005F1F - 00005F27 (0x9 bytes), align: 0 + Segment part 106. Intra module refs: Segment part 105 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005F28 - 00005F92 (0x6b bytes), align: 0 + Segment part 107. Intra module refs: llSetupScannableAdvEvt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupScannableAdvEvt + 00005F28 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005F93 - 00005FA0 (0xe bytes), align: 0 + Segment part 109. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FA1 - 00005FAE (0xe bytes), align: 0 + Segment part 110. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FAF - 00005FB8 (0xa bytes), align: 0 + Segment part 113. Intra module refs: llSetupScannableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FB9 - 00005FBC (0x4 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + Segment part 93 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FBD - 00005FC9 (0xd bytes), align: 0 + Segment part 115. Intra module refs: Segment part 114 + Segment part 118 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FCA - 00005FCF (0x6 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FD0 - 00005FD3 (0x4 bytes), align: 0 + Segment part 117. Intra module refs: llSetupDirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FD4 - 00005FEB (0x18 bytes), align: 0 + Segment part 118. Intra module refs: Segment part 117 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FEC - 00005FFA (0xf bytes), align: 0 + Segment part 121. Intra module refs: llStartAdvSetup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartAdvSetup 00005FEC + is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005FFB - 00006048 (0x4e bytes), align: 0 + Segment part 123. Intra module refs: llStartSlaveSetup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartSlaveSetup 00005FFB + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006049 - 0000604E (0x6 bytes), align: 0 + Segment part 132. Intra module refs: llSetupFeatureSetRsp + llSetupPauseEncRsp + llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000604F - 00006052 (0x4 bytes), align: 0 + Segment part 133. Intra module refs: Segment part 132 + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006053 - 00006059 (0x7 bytes), align: 0 + Segment part 134. Intra module refs: Segment part 133 + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000605A - 0000606B (0x12 bytes), align: 0 + Segment part 136. Intra module refs: Segment part 183 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000606C - 00006071 (0x6 bytes), align: 0 + Segment part 140. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006072 - 00006074 (0x3 bytes), align: 0 + Segment part 142. Intra module refs: Segment part 140 + Segment part 148 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006075 - 0000607B (0x7 bytes), align: 0 + Segment part 143. Intra module refs: Segment part 142 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000607C - 00006104 (0x89 bytes), align: 0 + Segment part 144. Intra module refs: llSetupEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupEncRsp 0000607C + calls direct + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006105 - 0000610D (0x9 bytes), align: 0 + Segment part 146. Intra module refs: Segment part 147 + llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000610E - 00006114 (0x7 bytes), align: 0 + Segment part 147. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006115 - 0000611A (0x6 bytes), align: 0 + Segment part 148. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000611B - 0000613F (0x25 bytes), align: 0 + Segment part 149. Intra module refs: llSetupStartEncReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncReq 0000611B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006140 - 00006142 (0x3 bytes), align: 0 + Segment part 151. Intra module refs: llSetupStartEncReq + llSetupStartEncRsp + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006143 - 00006146 (0x4 bytes), align: 0 + Segment part 152. Intra module refs: Segment part 151 + llProcessPendingTxData + llProcessPostRfOps + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006147 - 0000614C (0x6 bytes), align: 0 + Segment part 153. Intra module refs: Segment part 152 + Segment part 164 + Segment part 254 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000614D - 0000619E (0x52 bytes), align: 0 + Segment part 154. Intra module refs: llSetupStartEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncRsp 0000614D + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000619F - 000061AE (0x10 bytes), align: 0 + Segment part 158. Intra module refs: llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061AF - 000061B8 (0xa bytes), align: 0 + Segment part 159. Intra module refs: Segment part 158 + Segment part 89 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061B9 - 000061C2 (0xa bytes), align: 0 + Segment part 160. Intra module refs: llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061C3 - 000061C5 (0x3 bytes), align: 0 + Segment part 161. Intra module refs: llSetupRejectInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061C6 - 000061CA (0x5 bytes), align: 0 + Segment part 162. Intra module refs: Segment part 161 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061CB - 000061CD (0x3 bytes), align: 0 + Segment part 163. Intra module refs: Segment part 162 + llSetupEncRsp + llSetupPauseEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061CE - 000061DC (0xf bytes), align: 0 + Segment part 164. Intra module refs: Segment part 163 + llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061DD - 000061E7 (0xb bytes), align: 0 + Segment part 165. Intra module refs: Segment part 164 + llSetupStartEncReq + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000061E8 - 0000623D (0x56 bytes), align: 0 + Segment part 166. Intra module refs: llSetupPauseEncRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupPauseEncRsp 000061E8 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000623E - 0000623F (0x2 bytes), align: 0 + Segment part 168. Intra module refs: llInitFeatureSet + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006240 - 00006240 (0x1 bytes), align: 0 + Segment part 169. Intra module refs: Segment part 168 + llSetupNonConnectableAdvEvt + llSetupScannableAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006241 - 00006245 (0x5 bytes), align: 0 + Segment part 170. Intra module refs: Segment part 169 + llAllocConnId + llConnCleanup + llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + llDequeueCtrlPkt + llSetupEncRsp + llSetupPauseEncRsp + llSetupStartEncRsp + llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006246 - 00006260 (0x1b bytes), align: 0 + Segment part 171. Intra module refs: llSetupRejectInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupRejectInd 00006246 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006261 - 00006265 (0x5 bytes), align: 0 + Segment part 173. Intra module refs: llClearSetInts + llConnTerminate + llSetupRejectInd + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006266 - 00006268 (0x3 bytes), align: 0 + Segment part 174. Intra module refs: llSetupRejectInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006269 - 0000626E (0x6 bytes), align: 0 + Segment part 175. Intra module refs: Segment part 174 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000626F - 00006273 (0x5 bytes), align: 0 + Segment part 178. Intra module refs: llEnqueueCtrlPkt + llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006274 - 0000627F (0xc bytes), align: 0 + Segment part 179. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006280 - 000062DD (0x5e bytes), align: 0 + Segment part 180. Intra module refs: llSetupFeatureSetRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupFeatureSetRsp 00006280 + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000062DE - 000062F4 (0x17 bytes), align: 0 + Segment part 182. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000062F5 - 00006300 (0xc bytes), align: 0 + Segment part 183. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006301 - 000063B9 (0xb9 bytes), align: 0 + Segment part 184. Intra module refs: llSetupVersionIndReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupVersionIndReq 00006301 + calls direct + XSTACK = 00000000 ( 0000000F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000063BA - 000063BE (0x5 bytes), align: 0 + Segment part 186. Intra module refs: llProcessPendingTxData + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000063BF - 000063C9 (0xb bytes), align: 0 + Segment part 187. Intra module refs: llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000063CA - 00006452 (0x89 bytes), align: 0 + Segment part 188. Intra module refs: llSetupTermInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupTermInd 000063CA + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006453 - 00006455 (0x3 bytes), align: 0 + Segment part 190. Intra module refs: llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006456 - 00006459 (0x4 bytes), align: 0 + Segment part 191. Intra module refs: Segment part 190 + llInitFeatureSet + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000645A - 00006465 (0xc bytes), align: 0 + Segment part 192. Intra module refs: llSetupFeatureSetRsp + llSetupTermInd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006466 - 0000646B (0x6 bytes), align: 0 + Segment part 193. Intra module refs: llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000646C - 00006472 (0x7 bytes), align: 0 + Segment part 194. Intra module refs: Segment part 193 + llEnqueueCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006473 - 000064DC (0x6a bytes), align: 0 + Segment part 195. Intra module refs: llSetupUnknownRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUnknownRsp 00006473 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064DD - 000064DE (0x2 bytes), align: 0 + Segment part 197. Intra module refs: llSetupFeatureSetRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064DF - 000064E0 (0x2 bytes), align: 0 + Segment part 198. Intra module refs: Segment part 197 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064E1 - 000064E4 (0x4 bytes), align: 0 + Segment part 199. Intra module refs: Segment part 198 + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064E5 - 000064EA (0x6 bytes), align: 0 + Segment part 200. Intra module refs: Segment part 199 + llSetupPauseEncRsp + llSetupStartEncRsp + llSetupTermInd + llSetupUnknownRsp + llSetupVersionIndReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064EB - 000064EF (0x5 bytes), align: 0 + Segment part 201. Intra module refs: llSetupTermInd + llSetupUnknownRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064F0 - 000064F9 (0xa bytes), align: 0 + Segment part 202. Intra module refs: llSetupTermInd + llSetupUnknownRsp + llSetupVersionIndReq + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000064FA - 00006551 (0x58 bytes), align: 0 + Segment part 203. Intra module refs: llEnqueueCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnqueueCtrlPkt 000064FA + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006552 - 000065B2 (0x61 bytes), align: 0 + Segment part 205. Intra module refs: llDequeueCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDequeueCtrlPkt 00006552 + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065B3 - 000065CA (0x18 bytes), align: 0 + Segment part 207. Intra module refs: llReplaceCtrlPkt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReplaceCtrlPkt 000065B3 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065CB - 000065D5 (0xb bytes), align: 0 + Segment part 209. Intra module refs: llDequeueCtrlPkt + llReplaceCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065D6 - 000065DB (0x6 bytes), align: 0 + Segment part 210. Intra module refs: Segment part 191 + Segment part 192 + Segment part 209 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000065DC - 00006670 (0x95 bytes), align: 0 + Segment part 211. Intra module refs: llProcessChanMap::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessChanMap 000065DC + XSTACK = 0000000B ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006671 - 00006675 (0x5 bytes), align: 0 + Segment part 213. Intra module refs: llProcessChanMap + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006676 - 00006678 (0x3 bytes), align: 0 + Segment part 214. Intra module refs: llEnqueueCtrlPkt + llReplaceCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006679 - 0000667B (0x3 bytes), align: 0 + Segment part 215. Intra module refs: Segment part 214 + llDequeueCtrlPkt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000667C - 0000667F (0x4 bytes), align: 0 + Segment part 216. Intra module refs: Segment part 215 + llAdjustForMissedEvent + llAllocConnId + llDequeueCtrlPkt + llFindTxPowerSettings + llProcessChanMap + llSetupEncRsp + llSetupStartEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006680 - 00006689 (0xa bytes), align: 0 + Segment part 217. Intra module refs: llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000668A - 0000668C (0x3 bytes), align: 0 + Segment part 218. Intra module refs: Segment part 142 + Segment part 217 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000668D - 00006691 (0x5 bytes), align: 0 + Segment part 219. Intra module refs: Segment part 151 + Segment part 159 + Segment part 164 + Segment part 165 + Segment part 210 + Segment part 216 + Segment part 218 + Segment part 226 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002348 - 000023E5 (0x9e bytes), align: 0 + Segment part 278. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextDataChan 00002348 llAdvEvt_TaskConnect (ll_advEndCauses) + XSTACK = 0000000B ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000023E6 - 000023EA (0x5 bytes), align: 0 + Segment part 279. Intra module refs: llGetNextDataChan + llSetNextDataChan + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000023EB - 0000247F (0x95 bytes), align: 0 + Segment part 280. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetNextDataChan 000023EB LL_TxData (ll) + llSetupNextSlaveEvent (ll_slaveEndCauses) + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002480 - 00002488 (0x9 bytes), align: 0 + Segment part 281. Intra module refs: llGetNextDataChan + llSetNextDataChan + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006692 - 000067BF (0x12e bytes), align: 0 + Segment part 222. Intra module refs: llAllocConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocConnId 00006692 + XSTACK = 00000000 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067C0 - 000067C2 (0x3 bytes), align: 0 + Segment part 224. Intra module refs: llProcessPendingTxData + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067C3 - 000067C6 (0x4 bytes), align: 0 + Segment part 225. Intra module refs: Segment part 224 + llAllocConnId + llDequeueCtrlPkt + llEnqueueCtrlPkt + llReleaseConnId + llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067C7 - 000067CB (0x5 bytes), align: 0 + Segment part 226. Intra module refs: Segment part 134 + Segment part 175 + Segment part 193 + Segment part 225 + Segment part 272 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067CC - 000067D3 (0x8 bytes), align: 0 + Segment part 227. Intra module refs: llAllocConnId + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067D4 - 000067DB (0x8 bytes), align: 0 + Segment part 228. Intra module refs: Segment part 227 + llAllocConnId + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000067DC - 0000681E (0x43 bytes), align: 0 + Segment part 229. Intra module refs: llReleaseConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseConnId 000067DC + calls direct + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000681F - 0000683B (0x1d bytes), align: 0 + Segment part 231. Intra module refs: llReleaseAllConnId::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseAllConnId 0000681F + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000683C - 0000685A (0x1f bytes), align: 0 + Segment part 233. Intra module refs: llGetNextConn::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextConn 0000683C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000685B - 0000688F (0x35 bytes), align: 0 + Segment part 235. Intra module refs: llConnCleanup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnCleanup 0000685B + calls direct + XSTACK = 00000009 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006890 - 00006893 (0x4 bytes), align: 0 + Segment part 237. Intra module refs: llConnCleanup + llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006894 - 0000689D (0xa bytes), align: 0 + Segment part 238. Intra module refs: Segment part 183 + Segment part 237 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000689E - 0000689F (0x2 bytes), align: 0 + Segment part 239. Intra module refs: llConnCleanup + llConvertCtrlProcTimeoutToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068A0 - 000068A5 (0x6 bytes), align: 0 + Segment part 240. Intra module refs: Segment part 239 + llProcessPendingTxData + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068A6 - 000068CA (0x25 bytes), align: 0 + Segment part 241. Intra module refs: llConnTerminate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnTerminate 000068A6 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068CB - 000068EA (0x20 bytes), align: 0 + Segment part 245. Intra module refs: llInitFeatureSet::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitFeatureSet 000068CB + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068EB - 000068EE (0x4 bytes), align: 0 + Segment part 247. Intra module refs: llSetupScannableAdvEvt + llSetupUndirectedAdvEvt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068EF - 000068F3 (0x5 bytes), align: 0 + Segment part 248. Intra module refs: Segment part 247 + llAllocConnId + llFindTxPowerSettings + llInitFeatureSet + llSetupDirectedAdvEvt + llWriteTxData + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002489 - 000024C5 (0x3d bytes), align: 0 + Segment part 282. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llEventInRange 00002489 llSetupNextSlaveEvent (ll_slaveEndCauses) + XSTACK = 0000000D ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000024C6 - 000024CD (0x8 bytes), align: 0 + Segment part 283. + ENTRY ADDRESS REF BY + ===== ======= ====== + llEventDelta 000024C6 llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000068F4 - 00006937 (0x44 bytes), align: 0 + Segment part 251. Intra module refs: llConvertLstoToEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertLstoToEvent 000068F4 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006938 - 00006941 (0xa bytes), align: 0 + Segment part 253. Intra module refs: llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + llProcessChanMap + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006942 - 00006954 (0x13 bytes), align: 0 + Segment part 254. Intra module refs: llConvertLstoToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006955 - 00006958 (0x4 bytes), align: 0 + Segment part 255. Intra module refs: llConvertCtrlProcTimeoutToEvent + llConvertLstoToEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006959 - 00006962 (0xa bytes), align: 0 + Segment part 256. Intra module refs: Segment part 255 + llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006963 - 000069A4 (0x42 bytes), align: 0 + Segment part 257. Intra module refs: llConvertCtrlProcTimeoutToEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertCtrlProcTimeoutToEvent + 00006963 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000069A5 - 00006A93 (0xef bytes), align: 0 + Segment part 259. Intra module refs: llAdjustForMissedEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustForMissedEvent + 000069A5 + calls direct + XSTACK = 00000004 ( 00000014 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006A94 - 00006AA8 (0x15 bytes), align: 0 + Segment part 261. Intra module refs: llAdjustForMissedEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006AA9 - 00006B22 (0x7a bytes), align: 0 + Segment part 262. Intra module refs: llProcessPendingTxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPendingTxData + 00006AA9 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006B23 - 00006B28 (0x6 bytes), align: 0 + Segment part 264. Intra module refs: llProcessPendingTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006B29 - 00006B30 (0x8 bytes), align: 0 + Segment part 265. Intra module refs: Segment part 264 + llConnCleanup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006B31 - 00006B42 (0x12 bytes), align: 0 + Segment part 266. Intra module refs: llProcessPendingTxData + llStartSlaveSetup + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006B43 - 00006BFE (0xbc bytes), align: 0 + Segment part 267. Intra module refs: llWriteTxData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llWriteTxData 00006B43 + calls direct + XSTACK = 0000000E ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006BFF - 00006C00 (0x2 bytes), align: 0 + Segment part 270. Intra module refs: llSetupEncRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C01 - 00006C05 (0x5 bytes), align: 0 + Segment part 271. Intra module refs: Segment part 270 + llAdjustForMissedEvent + llConvertLstoToEvent + llDequeueCtrlPkt + llProcessChanMap + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C06 - 00006C0E (0x9 bytes), align: 0 + Segment part 272. Intra module refs: llAdjustForMissedEvent + llWriteTxData + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C0F - 00006C27 (0x19 bytes), align: 0 + Segment part 273. Intra module refs: llMemCopySrc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopySrc 00006C0F + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C28 - 00006C3C (0x15 bytes), align: 0 + Segment part 275. Intra module refs: llMemCopyDst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopyDst 00006C28 + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C3D - 00006C59 (0x1d bytes), align: 0 + Segment part 277. Intra module refs: llMemCopyDst + llMemCopySrc + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B61 - 00000B66 (0x6 bytes), align: 0 + Segment part 43. + ENTRY ADDRESS REF BY + ===== ======= ====== + llRfInit::?relay 00000B61 LL_ENC_GenerateTrueRandNum (ll_enc) + Segment part 149 (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B67 - 00000B6C (0x6 bytes), align: 0 + Segment part 45. Intra module refs: llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetFreqTune::?relay 00000B67 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B6D - 00000B72 (0x6 bytes), align: 0 + Segment part 47. + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearSetInts::?relay + 00000B6D Segment part 149 (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B73 - 00000B78 (0x6 bytes), align: 0 + Segment part 49. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableRfInts::?relay + 00000B73 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B79 - 00000B7E (0x6 bytes), align: 0 + Segment part 51. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llClearRfInts::?relay 00000B79 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B7F - 00000B84 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: llClearSetInts + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnableRfInts::?relay + 00000B7F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B85 - 00000B8A (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPostRfOps::?relay + 00000B85 RF_NormalIsr (ll_isr) + llScheduler (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B8B - 00000B90 (0x6 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 57 + llExtendRfRange + llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetRxGain::?relay 00000B8B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B91 - 00000B96 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 58 + llRfInit + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetTxPower::?relay 00000B91 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B97 - 00000B9C (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindTxPowerSettings::?relay + 00000B97 LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000B9D - 00000BA2 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: llProcessPostRfOps + ENTRY ADDRESS REF BY + ===== ======= ====== + llExtendRfRange::?relay + 00000B9D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BA3 - 00000BA8 (0x6 bytes), align: 0 + Segment part 72. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckWhiteListUsage::?relay + 00000BA3 LL_AddWhiteListDevice (ll) + LL_ClearWhiteList (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BA9 - 00000BAE (0x6 bytes), align: 0 + Segment part 77. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupAdv::?relay 00000BA9 LL_SetAdvControl (ll) + Segment part 41 (ll_scheduler) + llScheduler (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BAF - 00000BB4 (0x6 bytes), align: 0 + Segment part 79. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupDirectedAdvEvt::?relay + 00000BAF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BB5 - 00000BBA (0x6 bytes), align: 0 + Segment part 87. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUndirectedAdvEvt::?relay + 00000BB5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BBB - 00000BC0 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNonConnectableAdvEvt::?relay + 00000BBB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BC1 - 00000BC6 (0x6 bytes), align: 0 + Segment part 108. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupScannableAdvEvt::?relay + 00000BC1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BC7 - 00000BCC (0x6 bytes), align: 0 + Segment part 122. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartAdvSetup::?relay + 00000BC7 Segment part 65 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BCD - 00000BD2 (0x6 bytes), align: 0 + Segment part 124. + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartSlaveSetup::?relay + 00000BCD llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BD3 - 00000BD8 (0x6 bytes), align: 0 + Segment part 145. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupEncRsp::?relay 00000BD3 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BD9 - 00000BDE (0x6 bytes), align: 0 + Segment part 150. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncReq::?relay + 00000BD9 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BDF - 00000BE4 (0x6 bytes), align: 0 + Segment part 155. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupStartEncRsp::?relay + 00000BDF llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BE5 - 00000BEA (0x6 bytes), align: 0 + Segment part 167. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupPauseEncRsp::?relay + 00000BE5 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BEB - 00000BF0 (0x6 bytes), align: 0 + Segment part 172. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupRejectInd::?relay + 00000BEB llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BF1 - 00000BF6 (0x6 bytes), align: 0 + Segment part 181. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupFeatureSetRsp::?relay + 00000BF1 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BF7 - 00000BFC (0x6 bytes), align: 0 + Segment part 185. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupVersionIndReq::?relay + 00000BF7 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000BFD - 00000C02 (0x6 bytes), align: 0 + Segment part 189. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupTermInd::?relay + 00000BFD llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C03 - 00000C08 (0x6 bytes), align: 0 + Segment part 196. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupUnknownRsp::?relay + 00000C03 llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C09 - 00000C0E (0x6 bytes), align: 0 + Segment part 204. + ENTRY ADDRESS REF BY + ===== ======= ====== + llEnqueueCtrlPkt::?relay + 00000C09 LL_Disconnect (ll) + LL_EncLtkNegReply (ll) + LL_EncLtkReply (ll) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C0F - 00000C14 (0x6 bytes), align: 0 + Segment part 206. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDequeueCtrlPkt::?relay + 00000C0F llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C15 - 00000C1A (0x6 bytes), align: 0 + Segment part 208. + ENTRY ADDRESS REF BY + ===== ======= ====== + llReplaceCtrlPkt::?relay + 00000C15 LL_Disconnect (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C1B - 00000C20 (0x6 bytes), align: 0 + Segment part 212. Intra module refs: llSetNextDataChan + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessChanMap::?relay + 00000C1B llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C21 - 00000C26 (0x6 bytes), align: 0 + Segment part 223. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocConnId::?relay 00000C21 llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C27 - 00000C2C (0x6 bytes), align: 0 + Segment part 230. Intra module refs: llConnCleanup + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseConnId::?relay + 00000C27 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C2D - 00000C32 (0x6 bytes), align: 0 + Segment part 232. + ENTRY ADDRESS REF BY + ===== ======= ====== + llReleaseAllConnId::?relay + 00000C2D LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C33 - 00000C38 (0x6 bytes), align: 0 + Segment part 234. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNextConn::?relay 00000C33 Segment part 32 (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C39 - 00000C3E (0x6 bytes), align: 0 + Segment part 236. Intra module refs: llConnTerminate + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnCleanup::?relay 00000C39 llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C3F - 00000C44 (0x6 bytes), align: 0 + Segment part 242. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConnTerminate::?relay + 00000C3F LL_ProcessEvent (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C45 - 00000C4A (0x6 bytes), align: 0 + Segment part 246. + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitFeatureSet::?relay + 00000C45 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C4B - 00000C50 (0x6 bytes), align: 0 + Segment part 252. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertLstoToEvent::?relay + 00000C4B llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C51 - 00000C56 (0x6 bytes), align: 0 + Segment part 258. + ENTRY ADDRESS REF BY + ===== ======= ====== + llConvertCtrlProcTimeoutToEvent::?relay + 00000C51 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C57 - 00000C5C (0x6 bytes), align: 0 + Segment part 260. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustForMissedEvent::?relay + 00000C57 llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C5D - 00000C62 (0x6 bytes), align: 0 + Segment part 263. + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessPendingTxData::?relay + 00000C5D llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C63 - 00000C68 (0x6 bytes), align: 0 + Segment part 268. Intra module refs: llProcessPendingTxData + ENTRY ADDRESS REF BY + ===== ======= ====== + llWriteTxData::?relay 00000C63 LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C69 - 00000C6E (0x6 bytes), align: 0 + Segment part 274. + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopySrc::?relay 00000C69 Segment part 20 (ll_slaveEndCauses) + Segment part 22 (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C6F - 00000C74 (0x6 bytes), align: 0 + Segment part 276. Intra module refs: Segment part 182 + llSetupVersionIndReq + ENTRY ADDRESS REF BY + ===== ======= ====== + llMemCopyDst::?relay 00000C6F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F33 - 00008F36 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: llFindTxPowerSettings + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EC6 - 00008ECD (0x8 bytes), align: 0 + Segment part 32. Intra module refs: llFindTxPowerSettings + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F2F - 00008F32 (0x4 bytes), align: 0 + Segment part 35. Intra module refs: llSetupAdv + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_8e89bed6 00008F2F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F1F - 00008F22 (0x4 bytes), align: 0 + Segment part 37. Intra module refs: llScheduler (ll_scheduler) + llSetupDirectedAdvEvt + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_800 00008F1F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F83 - 00008F86 (0x4 bytes), align: 0 + Segment part 41. Intra module refs: llAdjustForMissedEvent + llAdvEvt_TaskConnect (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_2 00008F83 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F33 - 00008F36 (0x4 bytes), align: 0 + Segment part 284. Intra module refs: Segment part 31 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EC6 - 00008ECD (0x8 bytes), align: 0 + Segment part 285. Intra module refs: Segment part 32 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F2F - 00008F32 (0x4 bytes), align: 0 + Segment part 288. Intra module refs: __Constant_8e89bed6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F1F - 00008F22 (0x4 bytes), align: 0 + Segment part 290. Intra module refs: __Constant_800 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F83 - 00008F86 (0x4 bytes), align: 0 + Segment part 294. Intra module refs: __Constant_2 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_constData + + SEGMENTS IN THE MODULE + ====================== +CODE_C + Relative segment, address: CODE 00002340 - 00002343 (0x4 bytes), align: 2 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + savedTxPowerSetting 00002340 llExtendRfRange (ll_common) + llFindTxPowerSettings (ll_common) + llSetTxPower (ll_common) + ------------------------------------------------------------------------- +CODE_C + Relative segment, address: CODE 00002344 - 00002347 (0x4 bytes), align: 2 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ptmFreqTune 00002344 llRfInit (ll_common) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_enc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000D7 - 000000D7 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: LL_ENC_MoveData + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAREQ 000000D7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000005F4 - 00000613 (0x20 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + dataPkt 000005F4 Segment part 132 (ll_common) + Segment part 133 (ll_common) + Segment part 158 (ll_common) + Segment part 160 (ll_common) + Segment part 182 (ll_common) + Segment part 193 (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000614 - 0000061F (0xc bytes), align: 0 + Segment part 15. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + ENTRY ADDRESS REF BY + ===== ======= ====== + cachedTRNGdata 00000614 LL_Init (ll) + llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E2E - 00008E4D (0x20 bytes), align: 0 + Segment part 16. Intra module refs: LL_ENC_Decrypt + LL_ENC_DecryptMsg + LL_ENC_Encrypt + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + LL_ENC_LoadEmptyIV + ENTRY ADDRESS REF BY + ===== ======= ====== + zeroBlock 00008E2E + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F655 - 0000F6A2 (0x4e bytes), align: 0 + Segment part 18. Intra module refs: LL_ENC_ReverseBytes::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_ReverseBytes 0000F655 + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F6A3 - 0000F6A7 (0x5 bytes), align: 0 + Segment part 20. Intra module refs: LL_ENC_MoveData + LL_ENC_ReverseBytes + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F6A8 - 0000F6B3 (0xc bytes), align: 0 + Segment part 21. Intra module refs: LL_ENC_GeneratePseudoRandNum::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GeneratePseudoRandNum + 0000F6A8 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F6B4 - 0000F77B (0xc8 bytes), align: 0 + Segment part 23. Intra module refs: LL_ENC_GenerateTrueRandNum::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateTrueRandNum + 0000F6B4 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F77C - 0000F788 (0xd bytes), align: 0 + Segment part 25. Intra module refs: LL_ENC_GenerateTrueRandNum + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F789 - 0000F7AF (0x27 bytes), align: 0 + Segment part 26. Intra module refs: LL_ENC_GenDeviceSKD::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceSKD 0000F789 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7B0 - 0000F7D6 (0x27 bytes), align: 0 + Segment part 28. Intra module refs: LL_ENC_GenDeviceIV::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceIV 0000F7B0 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7D7 - 0000F7E0 (0xa bytes), align: 0 + Segment part 30. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7E1 - 0000F7E3 (0x3 bytes), align: 0 + Segment part 31. Intra module refs: LL_ENC_LoadEmptyIV + LL_ENC_LoadKey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7E4 - 0000F7EA (0x7 bytes), align: 0 + Segment part 32. Intra module refs: LL_ENC_GenDeviceIV + LL_ENC_GenDeviceSKD + LL_ENC_GenerateNonce + LL_ENC_GeneratePseudoRandNum + LL_ENC_InitAesDMA + LL_ENC_InitDMA0 + LL_ENC_SetupLoadDMA + Segment part 31 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F7EB - 0000F84F (0x65 bytes), align: 0 + Segment part 33. Intra module refs: LL_ENC_GenerateNonce::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateNonce 0000F7EB + XSTACK = 00000022 ( 00000004 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F850 - 0000F856 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: LL_ENC_GenerateNonce + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F857 - 0000F872 (0x1c bytes), align: 0 + Segment part 36. Intra module refs: LL_ENC_AES128_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_AES128_Encrypt 0000F857 + calls direct + XSTACK = 00000002 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F873 - 0000F875 (0x3 bytes), align: 0 + Segment part 38. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F876 - 0000F87A (0x5 bytes), align: 0 + Segment part 39. Intra module refs: LL_ENC_GenerateTrueRandNum + Segment part 38 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F87B - 0000F88A (0x10 bytes), align: 0 + Segment part 42. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F88B - 0000F8C3 (0x39 bytes), align: 0 + Segment part 43. Intra module refs: LL_ENC_InitAesDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitAesDMA 0000F88B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F8C4 - 0000F8DB (0x18 bytes), align: 0 + Segment part 45. Intra module refs: LL_ENC_InitDMA0::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitDMA0 0000F8C4 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F8DC - 0000F934 (0x59 bytes), align: 0 + Segment part 47. Intra module refs: LL_ENC_MoveData::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_MoveData 0000F8DC + calls direct + XSTACK = 00000034 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F935 - 0000F94D (0x19 bytes), align: 0 + Segment part 49. Intra module refs: LL_ENC_SetupLoadDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupLoadDMA 0000F935 + XSTACK = 00000032 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F94E - 0000F98A (0x3d bytes), align: 0 + Segment part 51. Intra module refs: LL_ENC_SetupCryptoDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupCryptoDMA 0000F94E + XSTACK = 00000033 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F98B - 0000F996 (0xc bytes), align: 0 + Segment part 53. Intra module refs: LL_ENC_SetupCryptoDMA + LL_ENC_SetupLoadDMA + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F997 - 0000F9A9 (0x13 bytes), align: 0 + Segment part 54. Intra module refs: LL_ENC_StartAES::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_StartAES 0000F997 + XSTACK = 00000032 ( 00000000 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F9AA - 0000F9C3 (0x1a bytes), align: 0 + Segment part 56. Intra module refs: LL_ENC_LoadEmptyIV::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadEmptyIV 0000F9AA + calls direct + XSTACK = 00000032 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F9C4 - 0000F9D9 (0x16 bytes), align: 0 + Segment part 58. Intra module refs: LL_ENC_LoadKey::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadKey 0000F9C4 + calls direct + XSTACK = 00000020 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F9DA - 0000FADA (0x101 bytes), align: 0 + Segment part 60. Intra module refs: LL_ENC_EncryptMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_EncryptMsg 0000F9DA + calls direct + XSTACK = 0000001A ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FADB - 0000FAE4 (0xa bytes), align: 0 + Segment part 62. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAE5 - 0000FAE8 (0x4 bytes), align: 0 + Segment part 63. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAE9 - 0000FAEE (0x6 bytes), align: 0 + Segment part 64. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + Segment part 63 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAEF - 0000FAF5 (0x7 bytes), align: 0 + Segment part 65. Intra module refs: LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FAF6 - 0000FBD1 (0xdc bytes), align: 0 + Segment part 66. Intra module refs: LL_ENC_DecryptMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_DecryptMsg 0000FAF6 + calls direct + XSTACK = 00000022 ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBD2 - 0000FBD5 (0x4 bytes), align: 0 + Segment part 68. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBD6 - 0000FBE2 (0xd bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + Segment part 71 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBE3 - 0000FBEE (0xc bytes), align: 0 + Segment part 70. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBEF - 0000FBF7 (0x9 bytes), align: 0 + Segment part 71. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FBF8 - 0000FC06 (0xf bytes), align: 0 + Segment part 72. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FC07 - 0000FD0D (0x107 bytes), align: 0 + Segment part 73. Intra module refs: LL_ENC_GenerateMIC::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateMIC 0000FC07 + calls direct + XSTACK = 00000024 ( 00000034 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD0E - 0000FD17 (0xa bytes), align: 0 + Segment part 75. Intra module refs: LL_ENC_AES128_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD18 - 0000FD1D (0x6 bytes), align: 0 + Segment part 76. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD1E - 0000FD2C (0xf bytes), align: 0 + Segment part 77. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD2D - 0000FD33 (0x7 bytes), align: 0 + Segment part 78. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD34 - 0000FD3A (0x7 bytes), align: 0 + Segment part 79. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD3B - 0000FD41 (0x7 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 78 + Segment part 79 + Segment part 82 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD42 - 0000FD4B (0xa bytes), align: 0 + Segment part 81. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD4C - 0000FD53 (0x8 bytes), align: 0 + Segment part 82. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_GenerateMIC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FD54 - 0000FE38 (0xe5 bytes), align: 0 + Segment part 83. Intra module refs: LL_ENC_Encrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Encrypt 0000FD54 + calls direct + XSTACK = 00000002 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FE39 - 0000FFD5 (0x19d bytes), align: 0 + Segment part 85. Intra module refs: LL_ENC_Decrypt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Decrypt 0000FE39 + calls direct + XSTACK = 00000002 ( 00000024 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFD6 - 0000FFE2 (0xd bytes), align: 0 + Segment part 87. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFE3 - 0000FFEC (0xa bytes), align: 0 + Segment part 88. Intra module refs: LL_ENC_Decrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000FFED - 0000FFF5 (0x9 bytes), align: 0 + Segment part 89. Intra module refs: LL_ENC_Decrypt + LL_ENC_GenerateTrueRandNum + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C75 - 00000C7A (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_ReverseBytes::?relay + 00000C75 Segment part 146 (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C7B - 00000C80 (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GeneratePseudoRandNum::?relay + 00000C7B LL_PseudoRand (ll) + Segment part 63 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C81 - 00000C86 (0x6 bytes), align: 0 + Segment part 24. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateTrueRandNum::?relay + 00000C81 LL_Init (ll) + LL_Rand (ll) + llProcessPostRfOps (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C87 - 00000C8C (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceSKD::?relay + 00000C87 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C8D - 00000C92 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenDeviceIV::?relay + 00000C8D llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C93 - 00000C98 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateNonce::?relay + 00000C93 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C99 - 00000C9E (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_AES128_Encrypt::?relay + 00000C99 LL_Encrypt (ll) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000C9F - 00000CA4 (0x6 bytes), align: 0 + Segment part 44. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitAesDMA::?relay + 00000C9F LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CA5 - 00000CAA (0x6 bytes), align: 0 + Segment part 46. Intra module refs: LL_ENC_MoveData + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_InitDMA0::?relay + 00000CA5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CAB - 00000CB0 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 64 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_MoveData::?relay + 00000CAB llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CB1 - 00000CB6 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: LL_ENC_GenerateMIC + LL_ENC_LoadEmptyIV + LL_ENC_LoadKey + Segment part 69 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupLoadDMA::?relay + 00000CB1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CB7 - 00000CBC (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 76 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_SetupCryptoDMA::?relay + 00000CB7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CBD - 00000CC2 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: LL_ENC_DecryptMsg + LL_ENC_EncryptMsg + LL_ENC_GenerateMIC + Segment part 31 + Segment part 38 + Segment part 69 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_StartAES::?relay + 00000CBD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CC3 - 00000CC8 (0x6 bytes), align: 0 + Segment part 57. Intra module refs: LL_ENC_GenerateMIC + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadEmptyIV::?relay + 00000CC3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CC9 - 00000CCE (0x6 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 42 + Segment part 87 + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_LoadKey::?relay + 00000CC9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CCF - 00000CD4 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_EncryptMsg::?relay + 00000CCF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CD5 - 00000CDA (0x6 bytes), align: 0 + Segment part 67. Intra module refs: LL_ENC_Decrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_DecryptMsg::?relay + 00000CD5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CDB - 00000CE0 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: LL_ENC_Decrypt + LL_ENC_Encrypt + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_GenerateMIC::?relay + 00000CDB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CE1 - 00000CE6 (0x6 bytes), align: 0 + Segment part 84. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Encrypt::?relay + 00000CE1 Segment part 200 (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CE7 - 00000CEC (0x6 bytes), align: 0 + Segment part 86. + ENTRY ADDRESS REF BY + ===== ======= ====== + LL_ENC_Decrypt::?relay + 00000CE7 llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E2E - 00008E4D (0x20 bytes), align: 0 + Segment part 90. Intra module refs: zeroBlock + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_errorEndCauses + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FF8 - 00007FFA (0x3 bytes), align: 0 + Segment part 6. Intra module refs: llUnexpectedEndCauseHandler::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llUnexpectedEndCauseHandler + 00007FF8 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CED - 00000CF2 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + llUnexpectedEndCauseHandler::?relay + 00000CED Segment part 113 (ll_common) + Segment part 115 (ll_common) + Segment part 118 (ll_common) + Segment part 42 (ll_advEndCauses) + Segment part 43 (ll_advEndCauses) + Segment part 51 (ll) + Segment part 53 (ll) + Segment part 97 (ll_scheduler) + Segment part 98 (ll_scheduler) + Segment part 99 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + + ------------------------------------------------------------------------- + PROGRAM MODULE, NAME : ll_halt + + SEGMENTS IN THE MODULE + ====================== +NEAR_CODE + Relative segment, address: CODE 000024D0 - 000024D6 (0x7 bytes), align: 2 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + HaltMcuUsingPhyFlag 000024D0 llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +DATA_Z + Relative segment, address: DATA 00000021 - 00000022 (0x2 bytes), align: 0 + Segment part 1. Intra module refs: HaltMcuUsingPhyFlag + ENTRY ADDRESS REF BY + ===== ======= ====== + phyState 00000021 LL_Reset (ll) + RF_NormalIsr (ll_isr) + llT2OVFC1_ISR (ll_isr) + clkState 00000022 llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + PROGRAM MODULE, NAME : ll_isr + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000009B - 0000009B (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: RF_NormalIsr + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + S1CON 0000009B + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009F - 0000009F (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + FMAP 0000009F + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A1 - 000000A1 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: T2_Isr + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llInitTimer2 (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + T2IRQF 000000A1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A7 - 000000A7 (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: T2_Isr + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llInitTimer2 (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + T2IRQM 000000A7 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A8 - 000000A8 (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalFlashRead (hal_flash) + LL_Init (ll) + LL_Reset (ll) + LL_SetAdvControl (ll) + LL_TxData (ll) + RF_NormalIsr + halDmaIsr (hal_dma) + halKeyPort0Isr (hal_key) + halKeyPort2Isr (hal_key) + halSleepTimerIsr (hal_sleep) + halUart1TxIsr (hal_uart) + llClearSetInts (ll_common) + llDequeueCtrlPkt (ll_common) + llDisableT2E1 (ll_timer2) + llDisableT2Ints (ll_timer2) + llDisableT2IntsEvts (ll_timer2) + llEnqueueCtrlPkt (ll_common) + llGetCurrentFineTime (ll_timer2) + llGetCurrentTime (ll_timer2) + llGetTimer2Capture (ll_timer2) + llReplaceCtrlPkt (ll_common) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartTimer2 (ll_timer2) + llStopTimer2 (ll_timer2) + llT2OVFC1_ISR + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ll_McuPrecisionCount (ll_timer2) + main (WIMU_Main) + osalTimerUpdate (OSAL_Timers) + osal_clear_event (OSAL) + osal_get_timeoutEx (OSAL_Timers) + osal_int_disable (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_mem_free (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_msg_enqueue (OSAL) + osal_msg_extract (OSAL) + osal_msg_push (OSAL) + osal_msg_receive (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IEN0 000000A8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BE - 000000BE (0x1 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: llT2OVFC1_ISR + main (WIMU_Main) + ENTRY ADDRESS REF BY + ===== ======= ====== + SLEEPCMD 000000BE + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C6 - 000000C6 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llSetFreqTune (ll_common) + llT2OVFC1_ISR + main (WIMU_Main) + ENTRY ADDRESS REF BY + ===== ======= ====== + CLKCONCMD 000000C6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000091 - 00000091 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: LL_SetAdvControl (ll) + RF_NormalIsr + llClearRfInts (ll_common) + llScheduleTask (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFIRQF1 00000091 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BF - 000000BF (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: RF_ErrorIsr + llAdvEvt_TaskAbort (ll_advEndCauses) + llClearRfInts (ll_common) + llSlaveEvt_TaskAbort (ll_slaveEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFERRF 000000BF + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E9 - 000000E9 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: RF_NormalIsr + llClearRfInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + RFIRQF0 000000E9 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000024D7 - 000025E5 (0x10f bytes), align: 0 + Segment part 21. Intra module refs: RF_NormalIsr::??INTVEC 131 + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_NormalIsr 000024D7 + interrupt function + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000025E6 - 0000265B (0x76 bytes), align: 0 + Segment part 22. Intra module refs: RF_ErrorIsr::??INTVEC 3 + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_ErrorIsr 000025E6 + interrupt function + ISTACK = 00000000 ( 00000004 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000265C - 000026AF (0x54 bytes), align: 0 + Segment part 23. Intra module refs: T2_Isr::??INTVEC 83 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2_Isr 0000265C + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000026B0 - 00002725 (0x76 bytes), align: 0 + Segment part 24. Intra module refs: T2_Isr + ENTRY ADDRESS REF BY + ===== ======= ====== + llT2OVFC1_ISR 000026B0 + calls direct + XSTACK = 0000000E ( 00000008 ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000005 (0x6 bytes), align: 0 + Segment part 11. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_ErrorIsr::??INTVEC 3 + 00000003 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000055 (0x56 bytes), align: 0 + Segment part 12. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + T2_Isr::??INTVEC 83 00000053 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000085 (0x86 bytes), align: 0 + Segment part 13. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + RF_NormalIsr::??INTVEC 131 + 00000083 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F3B - 00008F3E (0x4 bytes), align: 0 + Segment part 19. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffff 00008F3B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F0F - 00008F12 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: LL_Init (ll) + RF_NormalIsr + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffff7fff 00008F0F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F3B - 00008F3E (0x4 bytes), align: 0 + Segment part 25. Intra module refs: __Constant_ffff + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F0F - 00008F12 (0x4 bytes), align: 0 + Segment part 26. Intra module refs: __Constant_ffff7fff + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_math + + SEGMENTS IN THE MODULE + ====================== +DATA_Z + Relative segment, address: DATA 00000023 - 00000028 (0x6 bytes), align: 0 + Segment part 0. Intra module refs: llDivide31By16To16 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002728 - 00002778 (0x51 bytes), align: 2 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDivide31By16To16 00002728 LL_TxData (ll) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_scheduler + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000620 - 00000654 (0x35 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 63 + llAllocTask + llFindNextSecTask + llFreeTask + llGetActiveTasks + llGetCurrentTask + llGetNumTasks + llGetTask + llScheduleTask + llScheduler + llSchedulerInit + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000655 - 000007DE (0x18a bytes), align: 0 + Segment part 9. Intra module refs: Segment part 99 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E96F - 0000E9A2 (0x34 bytes), align: 0 + Segment part 22. Intra module refs: llSchedulerInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSchedulerInit 0000E96F + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E9A3 - 0000ECAA (0x308 bytes), align: 0 + Segment part 24. Intra module refs: llScheduler::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduler 0000E9A3 + calls direct + XSTACK = 00000000 ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECAB - 0000ECAF (0x5 bytes), align: 0 + Segment part 26. Intra module refs: llFindStartType + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECB0 - 0000ECB4 (0x5 bytes), align: 0 + Segment part 27. Intra module refs: llScheduleTask + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECB5 - 0000ECBC (0x8 bytes), align: 0 + Segment part 28. Intra module refs: Segment part 27 + llFindStartType + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECBD - 0000ECC8 (0xc bytes), align: 0 + Segment part 29. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECC9 - 0000ECD1 (0x9 bytes), align: 0 + Segment part 30. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECD2 - 0000ECEE (0x1d bytes), align: 0 + Segment part 31. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ECEF - 0000ED0D (0x1f bytes), align: 0 + Segment part 32. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000ED0E - 0000EE3D (0x130 bytes), align: 0 + Segment part 33. Intra module refs: llScheduleTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduleTask 0000ED0E + calls direct + XSTACK = 00000014 ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE3E - 0000EE44 (0x7 bytes), align: 0 + Segment part 35. Intra module refs: llAllocTask + llScheduleTask + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE45 - 0000EE4B (0x7 bytes), align: 0 + Segment part 36. Intra module refs: llFreeTask + llScheduleTask + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE4C - 0000EE57 (0xc bytes), align: 0 + Segment part 37. Intra module refs: llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EE58 - 0000EF08 (0xb1 bytes), align: 0 + Segment part 38. Intra module refs: llFindStartType::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindStartType 0000EE58 + calls direct + XSTACK = 00000014 ( 00000018 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EF09 - 0000EF0E (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llFindNextSecTask + llFindStartType + llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EF0F - 0000EF11 (0x3 bytes), align: 0 + Segment part 41. Intra module refs: llScheduler + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EF12 - 0000EF15 (0x4 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 41 + llFindStartType + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EF16 - 0000EF21 (0xc bytes), align: 0 + Segment part 43. Intra module refs: Segment part 30 + Segment part 42 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000EF22 - 0000F092 (0x171 bytes), align: 0 + Segment part 44. Intra module refs: llFindNextSecTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindNextSecTask 0000EF22 + calls direct + XSTACK = 00000014 ( 00000016 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F093 - 0000F0A2 (0x10 bytes), align: 0 + Segment part 46. Intra module refs: llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F0A3 - 0000F0A4 (0x2 bytes), align: 0 + Segment part 47. Intra module refs: llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F0A5 - 0000F0AB (0x7 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + llFindNextSecTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F0AC - 0000F16F (0xc4 bytes), align: 0 + Segment part 49. Intra module refs: llAllocTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocTask 0000F0AC + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F170 - 0000F176 (0x7 bytes), align: 0 + Segment part 51. Intra module refs: llAllocTask + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F177 - 0000F179 (0x3 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 35 + Segment part 51 + Segment part 54 + llAllocTask + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F17A - 0000F17E (0x5 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 52 + Segment part 85 + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F17F - 0000F186 (0x8 bytes), align: 0 + Segment part 54. Intra module refs: llAllocTask + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F187 - 0000F1C0 (0x3a bytes), align: 0 + Segment part 55. Intra module refs: llFreeTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llFreeTask 0000F187 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1C1 - 0000F1DA (0x1a bytes), align: 0 + Segment part 57. Intra module refs: llGetCurrentTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTask 0000F1C1 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1DB - 0000F1DC (0x2 bytes), align: 0 + Segment part 59. Intra module refs: llGetActiveTasks + llGetNumTasks + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1DD - 0000F1E3 (0x7 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + llFreeTask + llGetCurrentTask + llGetTaskState + llRestoreRfRegs + llSaveRfRegs + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F1E4 - 0000F20B (0x28 bytes), align: 0 + Segment part 61. Intra module refs: llGetTaskState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTaskState 0000F1E4 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F20C - 0000F225 (0x1a bytes), align: 0 + Segment part 63. Intra module refs: llGetTaskState + llSchedulerInit + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F226 - 0000F22E (0x9 bytes), align: 0 + Segment part 64. Intra module refs: llGetActiveTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetActiveTasks 0000F226 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F22F - 0000F278 (0x4a bytes), align: 0 + Segment part 66. Intra module refs: llGetTask::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTask 0000F22F + XSTACK = 00000012 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F279 - 0000F282 (0xa bytes), align: 0 + Segment part 68. Intra module refs: llGetNumTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNumTasks 0000F279 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F283 - 0000F329 (0xa7 bytes), align: 0 + Segment part 70. Intra module refs: llSave_txFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_txFIFO 0000F283 + calls direct + XSTACK = 0000000C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F32A - 0000F32E (0x5 bytes), align: 0 + Segment part 72. Intra module refs: llRestoreConnState + llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F32F - 0000F3DD (0xaf bytes), align: 0 + Segment part 73. Intra module refs: llSave_rxFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_rxFIFO 0000F32F + calls direct + XSTACK = 0000000C ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3DE - 0000F3E1 (0x4 bytes), align: 0 + Segment part 75. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3E2 - 0000F3EC (0xb bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3ED - 0000F3F1 (0x5 bytes), align: 0 + Segment part 77. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F3F2 - 0000F402 (0x11 bytes), align: 0 + Segment part 78. Intra module refs: llSave_rxFIFO + llSave_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F403 - 0000F44D (0x4b bytes), align: 0 + Segment part 79. Intra module refs: llRestore_txFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_txFIFO 0000F403 + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F44E - 0000F456 (0x9 bytes), align: 0 + Segment part 81. Intra module refs: llRestore_rxFIFO + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F457 - 0000F4A2 (0x4c bytes), align: 0 + Segment part 82. Intra module refs: llRestore_rxFIFO::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_rxFIFO 0000F457 + XSTACK = 0000000E ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F4A3 - 0000F4AB (0x9 bytes), align: 0 + Segment part 84. Intra module refs: llRestoreRfRegs + llRestore_rxFIFO + llRestore_txFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F4AC - 0000F4B8 (0xd bytes), align: 0 + Segment part 85. Intra module refs: llRestore_rxFIFO + llSave_rxFIFO + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F4B9 - 0000F50B (0x53 bytes), align: 0 + Segment part 86. Intra module refs: llSaveRfRegs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveRfRegs 0000F4B9 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F50C - 0000F53A (0x2f bytes), align: 0 + Segment part 88. Intra module refs: llRestoreRfRegs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreRfRegs 0000F50C + XSTACK = 0000000E ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F53B - 0000F579 (0x3f bytes), align: 0 + Segment part 90. Intra module refs: llSaveConnState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveConnState 0000F53B + calls direct + XSTACK = 00000014 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F57A - 0000F60A (0x91 bytes), align: 0 + Segment part 92. Intra module refs: llRestoreConnState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreConnState 0000F57A + calls direct + XSTACK = 00000014 ( 00000010 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F60B - 0000F613 (0x9 bytes), align: 0 + Segment part 94. Intra module refs: llRestoreConnState + llScheduleTask + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F614 - 0000F619 (0x6 bytes), align: 0 + Segment part 95. Intra module refs: llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F61A - 0000F624 (0xb bytes), align: 0 + Segment part 96. Intra module refs: Segment part 95 + llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F625 - 0000F632 (0xe bytes), align: 0 + Segment part 97. Intra module refs: llRestoreConnState + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F633 - 0000F63B (0x9 bytes), align: 0 + Segment part 98. Intra module refs: Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000F63C - 0000F654 (0x19 bytes), align: 0 + Segment part 99. Intra module refs: llRestoreConnState + llSaveConnState + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F13 - 00008F16 (0x4 bytes), align: 0 + Segment part 12. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_fffffff1 00008F13 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F17 - 00008F1A (0x4 bytes), align: 0 + Segment part 18. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1a 00008F17 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F1B - 00008F1E (0x4 bytes), align: 0 + Segment part 19. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffffe7 00008F1B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F87 - 00008F8A (0x4 bytes), align: 0 + Segment part 20. Intra module refs: llFindStartType + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_7 00008F87 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F23 - 00008F26 (0x4 bytes), align: 0 + Segment part 21. Intra module refs: llFindNextSecTask + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_fffffff6 00008F23 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CF3 - 00000CF8 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSchedulerInit::?relay + 00000CF3 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CF9 - 00000CFE (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduler::?relay 00000CF9 LL_SetAdvControl (ll) + Segment part 18 (ll_advEndCauses) + Segment part 46 (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llConnTerminate (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000CFF - 00000D04 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llScheduleTask::?relay + 00000CFF LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D05 - 00000D0A (0x6 bytes), align: 0 + Segment part 39. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindStartType::?relay + 00000D05 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D0B - 00000D10 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 29 + llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llFindNextSecTask::?relay + 00000D0B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D11 - 00000D16 (0x6 bytes), align: 0 + Segment part 50. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAllocTask::?relay 00000D11 LL_SetAdvControl (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D17 - 00000D1C (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + llFreeTask::?relay 00000D17 Segment part 164 (ll) + Segment part 75 (ll_advEndCauses) + llAdvEvt_TaskConnect (ll_advEndCauses) + llConnCleanup (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D1D - 00000D22 (0x6 bytes), align: 0 + Segment part 58. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTask::?relay + 00000D1D LL_Rand (ll) + LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D23 - 00000D28 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 48 + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTaskState::?relay + 00000D23 Segment part 69 (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D29 - 00000D2E (0x6 bytes), align: 0 + Segment part 65. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetActiveTasks::?relay + 00000D29 LL_SetAdvControl (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D2F - 00000D34 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 46 + llFindNextSecTask + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTask::?relay 00000D2F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D35 - 00000D3A (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetNumTasks::?relay 00000D35 LL_SetAdvControl (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D3B - 00000D40 (0x6 bytes), align: 0 + Segment part 71. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_txFIFO::?relay 00000D3B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D41 - 00000D46 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSave_rxFIFO::?relay 00000D41 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D47 - 00000D4C (0x6 bytes), align: 0 + Segment part 80. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_txFIFO::?relay + 00000D47 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D4D - 00000D52 (0x6 bytes), align: 0 + Segment part 83. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestore_rxFIFO::?relay + 00000D4D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D53 - 00000D58 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: llSaveConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveRfRegs::?relay 00000D53 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D59 - 00000D5E (0x6 bytes), align: 0 + Segment part 89. Intra module refs: llRestoreConnState + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreRfRegs::?relay + 00000D59 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D5F - 00000D64 (0x6 bytes), align: 0 + Segment part 91. Intra module refs: llScheduler + ENTRY ADDRESS REF BY + ===== ======= ====== + llSaveConnState::?relay + 00000D5F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D65 - 00000D6A (0x6 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 31 + ENTRY ADDRESS REF BY + ===== ======= ====== + llRestoreConnState::?relay + 00000D65 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F13 - 00008F16 (0x4 bytes), align: 0 + Segment part 102. Intra module refs: __Constant_fffffff1 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F17 - 00008F1A (0x4 bytes), align: 0 + Segment part 108. Intra module refs: __Constant_1a + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F1B - 00008F1E (0x4 bytes), align: 0 + Segment part 109. Intra module refs: __Constant_ffffffe7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F87 - 00008F8A (0x4 bytes), align: 0 + Segment part 110. Intra module refs: __Constant_7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F23 - 00008F26 (0x4 bytes), align: 0 + Segment part 111. Intra module refs: __Constant_fffffff6 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_slaveEndCauses + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00006C5A - 000073DC (0x783 bytes), align: 0 + Segment part 17. Intra module refs: llSlaveEvt_TaskEndOk::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskEndOk 00006C5A + calls direct + XSTACK = 00000000 ( 0000001A ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073DD - 000073E0 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073E1 - 000073ED (0xd bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + Segment part 23 + Segment part 24 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073EE - 000073F2 (0x5 bytes), align: 0 + Segment part 21. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073F3 - 000073FB (0x9 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 21 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000073FC - 00007401 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007402 - 0000740C (0xb bytes), align: 0 + Segment part 24. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000740D - 0000741B (0xf bytes), align: 0 + Segment part 25. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000741C - 00007424 (0x9 bytes), align: 0 + Segment part 26. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007425 - 00007435 (0x11 bytes), align: 0 + Segment part 27. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007436 - 00007443 (0xe bytes), align: 0 + Segment part 28. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007444 - 0000744B (0x8 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 28 + Segment part 86 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000744C - 00007458 (0xd bytes), align: 0 + Segment part 30. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007459 - 00007464 (0xc bytes), align: 0 + Segment part 31. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007465 - 00007470 (0xc bytes), align: 0 + Segment part 32. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007471 - 0000747A (0xa bytes), align: 0 + Segment part 33. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000747B - 0000748A (0x10 bytes), align: 0 + Segment part 34. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000748B - 00007490 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007491 - 0000749B (0xb bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000749C - 0000749F (0x4 bytes), align: 0 + Segment part 37. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000074A0 - 000074AE (0xf bytes), align: 0 + Segment part 38. Intra module refs: Segment part 37 + llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000074AF - 000074B3 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000074B4 - 000074B9 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: llSlaveEvt_TaskAbort::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskAbort 000074B4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000074BA - 0000798E (0x4d5 bytes), align: 0 + Segment part 42. Intra module refs: llSetupNextSlaveEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNextSlaveEvent 000074BA + calls direct + XSTACK = 00000018 ( 0000001E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000798F - 00007991 (0x3 bytes), align: 0 + Segment part 44. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007992 - 00007996 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 44 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007997 - 000079A3 (0xd bytes), align: 0 + Segment part 46. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079A4 - 000079A6 (0x3 bytes), align: 0 + Segment part 47. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079A7 - 000079A9 (0x3 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079AA - 000079AD (0x4 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079AE - 000079B0 (0x3 bytes), align: 0 + Segment part 50. Intra module refs: llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079B1 - 000079B4 (0x4 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079B5 - 000079B7 (0x3 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 31 + Segment part 51 + Segment part 54 + Segment part 85 + Segment part 90 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079B8 - 000079BD (0x6 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 25 + Segment part 32 + Segment part 52 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079BE - 000079C7 (0xa bytes), align: 0 + Segment part 54. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079C8 - 000079CD (0x6 bytes), align: 0 + Segment part 55. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079CE - 000079D0 (0x3 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 30 + Segment part 55 + Segment part 61 + Segment part 65 + Segment part 91 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079D1 - 000079D5 (0x5 bytes), align: 0 + Segment part 57. Intra module refs: Segment part 27 + Segment part 49 + Segment part 56 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079D6 - 000079DA (0x5 bytes), align: 0 + Segment part 58. Intra module refs: llProcessSlaveControlProcedures + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079DB - 000079E4 (0xa bytes), align: 0 + Segment part 59. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079E5 - 000079F7 (0x13 bytes), align: 0 + Segment part 60. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079F8 - 000079FA (0x3 bytes), align: 0 + Segment part 61. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000079FB - 00007A00 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A01 - 00007A0B (0xb bytes), align: 0 + Segment part 63. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A0C - 00007A14 (0x9 bytes), align: 0 + Segment part 64. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A15 - 00007A17 (0x3 bytes), align: 0 + Segment part 65. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A18 - 00007A1B (0x4 bytes), align: 0 + Segment part 66. Intra module refs: Segment part 65 + llCheckForLstoDuringSL + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A1C - 00007A21 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 33 + Segment part 36 + Segment part 38 + Segment part 66 + Segment part 68 + Segment part 70 + Segment part 78 + Segment part 91 + Segment part 92 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A22 - 00007A26 (0x5 bytes), align: 0 + Segment part 68. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A27 - 00007A2C (0x6 bytes), align: 0 + Segment part 69. Intra module refs: llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A2D - 00007A36 (0xa bytes), align: 0 + Segment part 70. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A37 - 00007A3D (0x7 bytes), align: 0 + Segment part 71. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A3E - 00007A4B (0xe bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A4C - 00007A50 (0x5 bytes), align: 0 + Segment part 73. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A51 - 00007A58 (0x8 bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A59 - 00007A5B (0x3 bytes), align: 0 + Segment part 75. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A5C - 00007A5E (0x3 bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + llCheckForLstoDuringSL + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A5F - 00007A64 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + llSetupNextSlaveEvent + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A65 - 00007A74 (0x10 bytes), align: 0 + Segment part 78. Intra module refs: llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007A75 - 00007DD7 (0x363 bytes), align: 0 + Segment part 79. Intra module refs: llProcessSlaveControlProcedures::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessSlaveControlProcedures + 00007A75 + calls direct + XSTACK = 00000018 ( 0000001C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DD8 - 00007DDB (0x4 bytes), align: 0 + Segment part 81. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DDC - 00007DE5 (0xa bytes), align: 0 + Segment part 82. Intra module refs: Segment part 58 + Segment part 81 + Segment part 83 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DE6 - 00007DEB (0x6 bytes), align: 0 + Segment part 83. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DEC - 00007DEE (0x3 bytes), align: 0 + Segment part 84. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DEF - 00007DF4 (0x6 bytes), align: 0 + Segment part 85. Intra module refs: Segment part 84 + llProcessSlaveControlProcedures + llSetupNextSlaveEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DF5 - 00007DF9 (0x5 bytes), align: 0 + Segment part 86. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007DFA - 00007E01 (0x8 bytes), align: 0 + Segment part 87. Intra module refs: llProcessSlaveControlProcedures + llSlaveEvt_TaskEndOk + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E02 - 00007E08 (0x7 bytes), align: 0 + Segment part 88. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E09 - 00007E14 (0xc bytes), align: 0 + Segment part 89. Intra module refs: Segment part 30 + Segment part 88 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E15 - 00007E26 (0x12 bytes), align: 0 + Segment part 90. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E27 - 00007E3B (0x15 bytes), align: 0 + Segment part 91. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E3C - 00007E5A (0x1f bytes), align: 0 + Segment part 92. Intra module refs: llProcessSlaveControlProcedures + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007E5B - 00007EA9 (0x4f bytes), align: 0 + Segment part 93. Intra module refs: llCheckForLstoDuringSL::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckForLstoDuringSL + 00007E5B + XSTACK = 00000018 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F27 - 00008F2A (0x4 bytes), align: 0 + Segment part 15. Intra module refs: llSetupNextSlaveEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_50 00008F27 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D6B - 00000D70 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskEndOk::?relay + 00000D6B Segment part 40 (ll_advEndCauses) + Segment part 41 (ll_advEndCauses) + Segment part 95 (ll_scheduler) + Segment part 96 (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D71 - 00000D76 (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSlaveEvt_TaskAbort::?relay + 00000D71 llAdvEvt_TaskConnect (ll_advEndCauses) + llRestoreConnState (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D77 - 00000D7C (0x6 bytes), align: 0 + Segment part 43. Intra module refs: llSlaveEvt_TaskEndOk + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetupNextSlaveEvent::?relay + 00000D77 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D7D - 00000D82 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: llSlaveEvt_TaskEndOk + ENTRY ADDRESS REF BY + ===== ======= ====== + llProcessSlaveControlProcedures::?relay + 00000D7D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D83 - 00000D88 (0x6 bytes), align: 0 + Segment part 94. Intra module refs: llSetupNextSlaveEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + llCheckForLstoDuringSL::?relay + 00000D83 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F27 - 00008F2A (0x4 bytes), align: 0 + Segment part 100. Intra module refs: __Constant_50 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_sleep + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F2B - 00008F2E (0x4 bytes), align: 0 + Segment part 16. Intra module refs: ll24BitTimeCompare (ll_timer2) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_c801 00008F2B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F2B - 00008F2E (0x4 bytes), align: 0 + Segment part 27. Intra module refs: __Constant_c801 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_timer2 + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000094 - 00000094 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: llInitTimer2 + llStartTimer2 + llStopTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2CTRL 00000094 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009C - 0000009C (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: llDisableT2E1 + llDisableT2IntsEvts + llInitTimer2 + llSetT2C1Event1 + llSetT2OVFC1Event1 + llSetT2OVFC2Event2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2CSPCFG 0000009C + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A2 - 000000A2 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: llGetCurrentFineTime + llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2M0 000000A2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A3 - 000000A3 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: llGetCurrentFineTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + ENTRY ADDRESS REF BY + ===== ======= ====== + T2M1 000000A3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A4 - 000000A4 (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF0 000000A4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A5 - 000000A5 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF1 000000A5 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A6 - 000000A6 (0x1 bytes), align: 0 + Segment part 11. ROOT. Intra module refs: llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MOVF2 000000A6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C3 - 000000C3 (0x1 bytes), align: 0 + Segment part 14. ROOT. Intra module refs: llGetCurrentFineTime + llGetCurrentTime + llGetTimer2Capture + llInitTimer2 + llSetT2C1Event1 + llSetT2Delta + llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ll_McuPrecisionCount + ENTRY ADDRESS REF BY + ===== ======= ====== + T2MSEL 000000C3 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F56 - 00018FCB (0x76 bytes), align: 0 + Segment part 24. Intra module refs: llInitTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitTimer2 00018F56 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FCC - 00018FDB (0x10 bytes), align: 0 + Segment part 26. Intra module refs: llStopTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStopTimer2 00018FCC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FDC - 00018FE1 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: llStartTimer2 + llStopTimer2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FE2 - 00018FF3 (0x12 bytes), align: 0 + Segment part 29. Intra module refs: llStartTimer2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartTimer2 00018FE2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FF4 - 00018FFA (0x7 bytes), align: 0 + Segment part 33. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FFB - 00018FFD (0x3 bytes), align: 0 + Segment part 34. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018FFE - 00019009 (0xc bytes), align: 0 + Segment part 35. Intra module refs: Segment part 34 + llSetT2Delta + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001900A - 00019019 (0x10 bytes), align: 0 + Segment part 38. Intra module refs: llGetCurrentFineTime + ll_McuPrecisionCount + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001901A - 0001901E (0x5 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 33 + Segment part 38 + llSetT2Delta + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001901F - 0001903F (0x21 bytes), align: 0 + Segment part 40. Intra module refs: llSetT2OVFC1Timeout::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Timeout 0001901F + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019040 - 00019047 (0x8 bytes), align: 0 + Segment part 42. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019048 - 0001904A (0x3 bytes), align: 0 + Segment part 43. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001904B - 00019056 (0xc bytes), align: 0 + Segment part 44. Intra module refs: Segment part 43 + llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019057 - 00019079 (0x23 bytes), align: 0 + Segment part 47. Intra module refs: llSetT2C1Event1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2C1Event1 00019057 + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001907A - 00019080 (0x7 bytes), align: 0 + Segment part 49. Intra module refs: llSetT2C1Event1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019081 - 00019091 (0x11 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019092 - 000190C7 (0x36 bytes), align: 0 + Segment part 51. Intra module refs: llGetCurrentTime + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190C8 - 000190C9 (0x2 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 42 + Segment part 51 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190CA - 000190CC (0x3 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 39 + Segment part 52 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190CD - 000190D3 (0x7 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + Segment part 77 + llInitTimer2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190D4 - 000190FC (0x29 bytes), align: 0 + Segment part 55. Intra module refs: llSetT2OVFC1Event1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Event1 000190D4 + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000190FD - 00019102 (0x6 bytes), align: 0 + Segment part 57. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019103 - 0001910E (0xc bytes), align: 0 + Segment part 58. Intra module refs: llSetT2OVFC1Event1 + llSetT2OVFC1Timeout + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001910F - 00019173 (0x65 bytes), align: 0 + Segment part 59. Intra module refs: llSetT2OVFC2Event2::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC2Event2 0001910F + XSTACK = 00000000 ( 00000010 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019174 - 00019177 (0x4 bytes), align: 0 + Segment part 61. Intra module refs: llSetT2OVFC2Event2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019178 - 00019189 (0x12 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 58 + Segment part 61 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001918A - 000191C5 (0x3c bytes), align: 0 + Segment part 63. Intra module refs: llSetT2Delta::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2Delta 0001918A + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191C6 - 000191CE (0x9 bytes), align: 0 + Segment part 65. Intra module refs: llDisableT2Ints::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2Ints 000191C6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191CF - 000191DA (0xc bytes), align: 0 + Segment part 67. Intra module refs: llDisableT2IntsEvts::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2IntsEvts 000191CF + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191DB - 000191EA (0x10 bytes), align: 0 + Segment part 69. Intra module refs: llDisableT2E1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2E1 000191DB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191EB - 000191ED (0x3 bytes), align: 0 + Segment part 71. Intra module refs: llDisableT2Ints + llDisableT2IntsEvts + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191EE - 000191EF (0x2 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + llDisableT2E1 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191F0 - 000191F4 (0x5 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 28 + Segment part 72 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000191F5 - 00019200 (0xc bytes), align: 0 + Segment part 74. Intra module refs: llGetTimer2Capture::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTimer2Capture 000191F5 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019201 - 0001920C (0xc bytes), align: 0 + Segment part 76. Intra module refs: llGetTimer2Capture + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001920D - 00019219 (0xd bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001921A - 0001922F (0x16 bytes), align: 0 + Segment part 78. Intra module refs: llGetCurrentTime::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTime 0001921A + XSTACK = 00000000 ( 00000004 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019230 - 00019258 (0x29 bytes), align: 0 + Segment part 80. Intra module refs: llGetCurrentFineTime::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentFineTime 00019230 + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019259 - 00019273 (0x1b bytes), align: 0 + Segment part 86. Intra module refs: Segment part 76 + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002779 - 000027D0 (0x58 bytes), align: 0 + Segment part 93. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll24BitTimeCompare 00002779 Segment part 191 (ll) + Segment part 40 (ll_scheduler) + llAdjustForMissedEvent (ll_common) + XSTACK = 00000004 ( 0000000F ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000027D1 - 000027D5 (0x5 bytes), align: 0 + Segment part 94. Intra module refs: ll24BitTimeCompare + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000027D6 - 0000283D (0x68 bytes), align: 0 + Segment part 95. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll24BitTimeDelta 000027D6 Segment part 190 (ll) + llFindStartType (ll_scheduler) + llScheduleTask (ll_scheduler) + XSTACK = 00000004 ( 00000013 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000283E - 00002853 (0x16 bytes), align: 0 + Segment part 98. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002854 - 00002899 (0x46 bytes), align: 0 + Segment part 99. + ENTRY ADDRESS REF BY + ===== ======= ====== + llAdjustTimeBackward 00002854 Segment part 31 (ll_advEndCauses) + Segment part 71 (ll_slaveEndCauses) + XSTACK = 00000000 ( 0000000B ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000289A - 000028A7 (0xe bytes), align: 0 + Segment part 100. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000028A8 - 000028C5 (0x1e bytes), align: 0 + Segment part 101. Intra module refs: llAdjustTimeBackward + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019274 - 000192A3 (0x30 bytes), align: 0 + Segment part 91. Intra module refs: ll_McuPrecisionCount::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + ll_McuPrecisionCount 00019274 + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D89 - 00000D8E (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + llInitTimer2::?relay 00000D89 LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D8F - 00000D94 (0x6 bytes), align: 0 + Segment part 27. Intra module refs: llInitTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + llStopTimer2::?relay 00000D8F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D95 - 00000D9A (0x6 bytes), align: 0 + Segment part 30. Intra module refs: llInitTimer2 + ENTRY ADDRESS REF BY + ===== ======= ====== + llStartTimer2::?relay 00000D95 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000D9B - 00000DA0 (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Timeout::?relay + 00000D9B llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DA1 - 00000DA6 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2C1Event1::?relay + 00000DA1 llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DA7 - 00000DAC (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC1Event1::?relay + 00000DA7 llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DAD - 00000DB2 (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2OVFC2Event2::?relay + 00000DAD llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DB3 - 00000DB8 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + llSetT2Delta::?relay 00000DB3 llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DB9 - 00000DBE (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2Ints::?relay + 00000DB9 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DBF - 00000DC4 (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2IntsEvts::?relay + 00000DBF LL_Reset (ll) + LL_SetAdvControl (ll) + RF_NormalIsr (ll_isr) + llDirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DC5 - 00000DCA (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + llDisableT2E1::?relay 00000DC5 RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DCB - 00000DD0 (0x6 bytes), align: 0 + Segment part 75. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetTimer2Capture::?relay + 00000DCB llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DD1 - 00000DD6 (0x6 bytes), align: 0 + Segment part 79. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentTime::?relay + 00000DD1 LL_SetAdvControl (ll) + Segment part 253 (ll) + Segment part 43 (ll_scheduler) + llAdjustForMissedEvent (ll_common) + llAllocTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DD7 - 00000DDC (0x6 bytes), align: 0 + Segment part 81. + ENTRY ADDRESS REF BY + ===== ======= ====== + llGetCurrentFineTime::?relay + 00000DD7 LL_TxData (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DDD - 00000DE2 (0x6 bytes), align: 0 + Segment part 92. + ENTRY ADDRESS REF BY + ===== ======= ====== + ll_McuPrecisionCount::?relay + 00000DDD osalTimeUpdate (OSAL_ClockBLE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ll_timerDrift + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E9F - 00008EAE (0x10 bytes), align: 0 + Segment part 6. Intra module refs: llCalcScaFactor + ENTRY ADDRESS REF BY + ===== ======= ====== + SCA 00008E9F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EC0 - 00008EC5 (0x6 bytes), align: 2 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + OverheadJitter 00008EC0 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000028C6 - 00002919 (0x54 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCalcScaFactor 000028C6 llAdvEvt_TaskConnect (ll_advEndCauses) + calls direct + XSTACK = 00000000 ( 0000000D ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 0000291A - 000029DB (0xc2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + llCalcTimerDrift 0000291A llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + calls direct + XSTACK = 00000006 ( 00000011 ) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F37 - 00008F3A (0x4 bytes), align: 0 + Segment part 9. Intra module refs: llCalcTimerDrift + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_271 00008F37 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E9F - 00008EAE (0x10 bytes), align: 0 + Segment part 12. Intra module refs: SCA + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EC0 - 00008EC5 (0x6 bytes), align: 2 + Segment part 13. Intra module refs: OverheadJitter + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F37 - 00008F3A (0x4 bytes), align: 0 + Segment part 15. Intra module refs: __Constant_271 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : phy + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007DF - 000007DF (0x1 bytes), align: 0 + Segment part 11. Intra module refs: PHY_AddWlEntry + PHY_ClearWhitelist + ENTRY ADDRESS REF BY + ===== ======= ====== + numWLEntries 000007DF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016817 - 00016829 (0x13 bytes), align: 0 + Segment part 12. Intra module refs: PHY_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Init 00016817 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001682A - 00016843 (0x1a bytes), align: 0 + Segment part 16. Intra module refs: PHY_Reset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Reset 0001682A + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016844 - 0001686C (0x29 bytes), align: 0 + Segment part 18. Intra module refs: PHY_LoadNR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_LoadNR 00016844 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001686D - 000168A3 (0x37 bytes), align: 0 + Segment part 20. Intra module refs: PHY_VerifyNR::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_VerifyNR 0001686D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168A4 - 000168AF (0xc bytes), align: 0 + Segment part 22. Intra module refs: PHY_LoadNR + PHY_VerifyNR + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168B0 - 000168DE (0x2f bytes), align: 0 + Segment part 23. Intra module refs: PHY_ClearAllRegsAndFifos::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearAllRegsAndFifos + 000168B0 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168DF - 000168E3 (0x5 bytes), align: 0 + Segment part 25. Intra module refs: PHY_ClearAllRegsAndFifos + PHY_LoadNR + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168E4 - 000168EE (0xb bytes), align: 0 + Segment part 26. Intra module refs: PHY_VerifyNR + Segment part 25 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000168EF - 0001692C (0x3e bytes), align: 0 + Segment part 31. Intra module refs: PHY_SetOwnAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetOwnAddr 000168EF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001692D - 0001696A (0x3e bytes), align: 0 + Segment part 33. Intra module refs: PHY_SetPeerAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetPeerAddr 0001692D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001696B - 00016973 (0x9 bytes), align: 0 + Segment part 35. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016974 - 00016978 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016979 - 0001697D (0x5 bytes), align: 0 + Segment part 37. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001697E - 00016983 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016984 - 00016988 (0x5 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 37 + Segment part 38 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016989 - 00016991 (0x9 bytes), align: 0 + Segment part 40. Intra module refs: Segment part 36 + Segment part 39 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016992 - 0001699F (0xe bytes), align: 0 + Segment part 41. Intra module refs: PHY_SetCRCInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetCRCInit 00016992 + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169A0 - 000169A6 (0x7 bytes), align: 0 + Segment part 43. Intra module refs: PHY_SetCRCInit + PHY_SetSyncWord + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169A7 - 000169B1 (0xb bytes), align: 0 + Segment part 44. Intra module refs: PHY_GetAdvChans::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetAdvChans 000169A7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169B2 - 000169BE (0xd bytes), align: 0 + Segment part 46. Intra module refs: PHY_SetAdvChans::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvChans 000169B2 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000029DC - 000029E4 (0x9 bytes), align: 0 + Segment part 236. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetDataChan 000029DC llAdvEvt_TaskConnect (ll_advEndCauses) + llSetNextDataChan (ll_common) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000029E5 - 000029E9 (0x5 bytes), align: 0 + Segment part 237. Intra module refs: PHY_SetDataChan + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169BF - 000169D5 (0x17 bytes), align: 0 + Segment part 48. Intra module refs: PHY_SetEndConnection::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetEndConnection 000169BF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169D6 - 000169E3 (0xe bytes), align: 0 + Segment part 50. Intra module refs: PHY_ConfigureMD::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureMD 000169D6 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169E4 - 000169EE (0xb bytes), align: 0 + Segment part 58. Intra module refs: PHY_GetEndCause::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetEndCause 000169E4 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169EF - 000169FA (0xc bytes), align: 0 + Segment part 62. Intra module refs: PHY_InitSeqStat::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_InitSeqStat 000169EF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000169FB - 00016A0D (0x13 bytes), align: 0 + Segment part 68. Intra module refs: PHY_SetSyncWord::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetSyncWord 000169FB + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A0E - 00016A18 (0xb bytes), align: 0 + Segment part 70. Intra module refs: PHY_SetMaxNack::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetMaxNack 00016A0E + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A19 - 00016A31 (0x19 bytes), align: 0 + Segment part 72. Intra module refs: PHY_ClearWhitelist::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearWhitelist 00016A19 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A32 - 00016A32 (0x1 bytes), align: 0 + Segment part 78. Intra module refs: PHY_ClearBlacklistIndex + PHY_SetBlacklistIndex + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A33 - 00016A37 (0x5 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A38 - 00016A3B (0x4 bytes), align: 0 + Segment part 84. Intra module refs: PHY_GetAdvChans + PHY_GetEndCause + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016A3C - 00016AD7 (0x9c bytes), align: 0 + Segment part 87. Intra module refs: PHY_AddWlEntry::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_AddWlEntry 00016A3C + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016AD8 - 00016AE4 (0xd bytes), align: 0 + Segment part 92. Intra module refs: PHY_AddWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016AE5 - 00016AF4 (0x10 bytes), align: 0 + Segment part 93. Intra module refs: PHY_SetAdvWlPolicy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvWlPolicy 00016AE5 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016AF5 - 00016B0E (0x1a bytes), align: 0 + Segment part 99. Intra module refs: PHY_SetBlacklistIndex::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetBlacklistIndex 00016AF5 + XSTACK = 0000000C ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B0F - 00016B2B (0x1d bytes), align: 0 + Segment part 104. Intra module refs: PHY_ClearBlacklistIndex::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklistIndex + 00016B0F + XSTACK = 0000000C ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B2C - 00016B36 (0xb bytes), align: 0 + Segment part 106. Intra module refs: PHY_ClearBlacklist::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklist 00016B2C + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B37 - 00016B3C (0x6 bytes), align: 0 + Segment part 115. Intra module refs: phyFindWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B3D - 00016B41 (0x5 bytes), align: 0 + Segment part 116. Intra module refs: PHY_ClearSavedWhiteList + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B42 - 00016B47 (0x6 bytes), align: 0 + Segment part 117. Intra module refs: PHY_SetOwnAddr + PHY_SetPeerAddr + Segment part 116 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B48 - 00016B5D (0x16 bytes), align: 0 + Segment part 119. Intra module refs: PHY_ClearSavedWhiteList::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearSavedWhiteList + 00016B48 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B5E - 00016B63 (0x6 bytes), align: 0 + Segment part 121. Intra module refs: PHY_ClearSavedWhiteList + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B64 - 00016B67 (0x4 bytes), align: 0 + Segment part 129. Intra module refs: PHY_AddWlEntry + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B68 - 00016B6C (0x5 bytes), align: 0 + Segment part 130. Intra module refs: Segment part 129 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B6D - 00016B76 (0xa bytes), align: 0 + Segment part 132. Intra module refs: PHY_ConfigureFifoDataProcessing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureFifoDataProcessing + 00016B6D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B77 - 00016B8A (0x14 bytes), align: 0 + Segment part 134. Intra module refs: PHY_ConfigureAppendRfStatus::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureAppendRfStatus + 00016B77 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B8B - 00016B94 (0xa bytes), align: 0 + Segment part 136. Intra module refs: PHY_SetFifoConfig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetFifoConfig 00016B8B + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B95 - 00016B9D (0x9 bytes), align: 0 + Segment part 148. Intra module refs: PHY_SetSyncWord + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016B9E - 00016B9F (0x2 bytes), align: 0 + Segment part 150. Intra module refs: PHY_ClearAllRegsAndFifos + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016BA0 - 00016BA0 (0x1 bytes), align: 0 + Segment part 151. Intra module refs: Segment part 150 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016BA1 - 00016BA1 (0x1 bytes), align: 0 + Segment part 152. Intra module refs: Segment part 151 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016BA2 - 00016BA2 (0x1 bytes), align: 0 + Segment part 153. Intra module refs: PHY_ClearBlacklist + PHY_ConfigureAppendRfStatus + PHY_ConfigureFifoDataProcessing + PHY_ConfigureMD + PHY_InitSeqStat + PHY_SetAdvChans + PHY_SetAdvWlPolicy + PHY_SetEndConnection + PHY_SetFifoConfig + PHY_SetMaxNack + PHY_SetOwnAddr + PHY_SetPeerAddr + PHY_SetRfFreq + Segment part 121 + Segment part 152 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016BA3 - 00016BA9 (0x7 bytes), align: 0 + Segment part 154. Intra module refs: PHY_ClearWhitelist + PHY_ConfigWhitener + PHY_Init + PHY_LoadNR + PHY_Reset + PHY_VerifyNR + Segment part 153 + Segment part 84 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016BAA - 00016C0A (0x61 bytes), align: 0 + Segment part 155. Intra module refs: PHY_ConfigWhitener::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigWhitener 00016BAA + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C0B - 00016C10 (0x6 bytes), align: 0 + Segment part 169. Intra module refs: PHY_RetryTxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryTxFifo 00016C0B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C11 - 00016C16 (0x6 bytes), align: 0 + Segment part 171. Intra module refs: PHY_RetryRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryRxFifo 00016C11 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C17 - 00016C1C (0x6 bytes), align: 0 + Segment part 175. Intra module refs: PHY_CommitRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_CommitRxFifo 00016C17 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C1D - 00016C22 (0x6 bytes), align: 0 + Segment part 179. Intra module refs: PHY_DeallocateRxFifo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_DeallocateRxFifo 00016C1D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C23 - 00016C28 (0x6 bytes), align: 0 + Segment part 210. Intra module refs: Segment part 130 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C29 - 00016C5B (0x33 bytes), align: 0 + Segment part 216. Intra module refs: PHY_SetRfFreq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetRfFreq 00016C29 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016C5C - 00016CD3 (0x78 bytes), align: 0 + Segment part 218. Intra module refs: phyFindWlEntry::?relay + LOCAL ADDRESS + ===== ======= + phyFindWlEntry 00016C5C + XSTACK = 0000000C ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016CD4 - 00016CD8 (0x5 bytes), align: 0 + Segment part 220. Intra module refs: phyFindWlEntry + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DE3 - 00000DE8 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Init::?relay 00000DE3 LL_Init (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DE9 - 00000DEE (0x6 bytes), align: 0 + Segment part 17. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_Reset::?relay 00000DE9 llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DEF - 00000DF4 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_LoadNR::?relay 00000DEF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DF5 - 00000DFA (0x6 bytes), align: 0 + Segment part 21. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_VerifyNR::?relay 00000DF5 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000DFB - 00000E00 (0x6 bytes), align: 0 + Segment part 24. Intra module refs: PHY_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearAllRegsAndFifos::?relay + 00000DFB LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E01 - 00000E06 (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetOwnAddr::?relay + 00000E01 llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E07 - 00000E0C (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetPeerAddr::?relay + 00000E07 llSetupDirectedAdvEvt (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E0D - 00000E12 (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetCRCInit::?relay + 00000E0D LL_Reset (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E13 - 00000E18 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetAdvChans::?relay + 00000E13 llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E19 - 00000E1E (0x6 bytes), align: 0 + Segment part 47. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvChans::?relay + 00000E19 Segment part 52 (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E1F - 00000E24 (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetEndConnection::?relay + 00000E1F RF_NormalIsr (ll_isr) + llReleaseConnId (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E25 - 00000E2A (0x6 bytes), align: 0 + Segment part 51. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureMD::?relay + 00000E25 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E2B - 00000E30 (0x6 bytes), align: 0 + Segment part 59. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_GetEndCause::?relay + 00000E2B RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E31 - 00000E36 (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_InitSeqStat::?relay + 00000E31 llAdvEvt_TaskConnect (ll_advEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E37 - 00000E3C (0x6 bytes), align: 0 + Segment part 69. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetSyncWord::?relay + 00000E37 llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E3D - 00000E42 (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetMaxNack::?relay + 00000E3D Segment part 162 (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupFeatureSetRsp (ll_common) + llSetupTermInd (ll_common) + llSetupVersionIndReq (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E43 - 00000E48 (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearWhitelist::?relay + 00000E43 LL_ClearWhiteList (ll) + LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E49 - 00000E4E (0x6 bytes), align: 0 + Segment part 88. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_AddWlEntry::?relay + 00000E49 LL_AddWhiteListDevice (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E4F - 00000E54 (0x6 bytes), align: 0 + Segment part 94. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetAdvWlPolicy::?relay + 00000E4F LL_SetAdvParam (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E55 - 00000E5A (0x6 bytes), align: 0 + Segment part 100. Intra module refs: PHY_AddWlEntry + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetBlacklistIndex::?relay + 00000E55 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E5B - 00000E60 (0x6 bytes), align: 0 + Segment part 105. Intra module refs: PHY_AddWlEntry + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklistIndex::?relay + 00000E5B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E61 - 00000E66 (0x6 bytes), align: 0 + Segment part 107. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearBlacklist::?relay + 00000E61 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E67 - 00000E6C (0x6 bytes), align: 0 + Segment part 120. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ClearSavedWhiteList::?relay + 00000E67 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E6D - 00000E72 (0x6 bytes), align: 0 + Segment part 133. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureFifoDataProcessing::?relay + 00000E6D LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E73 - 00000E78 (0x6 bytes), align: 0 + Segment part 135. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigureAppendRfStatus::?relay + 00000E73 LL_Reset (ll) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupAdv (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E79 - 00000E7E (0x6 bytes), align: 0 + Segment part 137. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetFifoConfig::?relay + 00000E79 LL_Reset (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E7F - 00000E84 (0x6 bytes), align: 0 + Segment part 156. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_ConfigWhitener::?relay + 00000E7F llRfInit (ll_common) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E85 - 00000E8A (0x6 bytes), align: 0 + Segment part 170. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryTxFifo::?relay + 00000E85 llSave_txFIFO (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E8B - 00000E90 (0x6 bytes), align: 0 + Segment part 172. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_RetryRxFifo::?relay + 00000E8B llSave_rxFIFO (ll_scheduler) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E91 - 00000E96 (0x6 bytes), align: 0 + Segment part 176. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_CommitRxFifo::?relay + 00000E91 llSave_rxFIFO (ll_scheduler) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E97 - 00000E9C (0x6 bytes), align: 0 + Segment part 180. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_DeallocateRxFifo::?relay + 00000E97 llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000E9D - 00000EA2 (0x6 bytes), align: 0 + Segment part 217. + ENTRY ADDRESS REF BY + ===== ======= ====== + PHY_SetRfFreq::?relay 00000E9D RF_NormalIsr (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EA3 - 00000EA8 (0x6 bytes), align: 0 + Segment part 219. Intra module refs: PHY_AddWlEntry + LOCAL ADDRESS + ===== ======= + phyFindWlEntry::?relay + 00000EA3 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : phy_image + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008000 - 00008DFD (0xdfe bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + NanoRiscImage 00008000 Segment part 22 (phy) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008000 - 00008DFD (0xdfe bytes), align: 0 + Segment part 7. Intra module refs: NanoRiscImage + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_mgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007E0 - 000007E1 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: Segment part 31 + Segment part 40 + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E8F - 00008E9E (0x10 bytes), align: 0 + Segment part 7. Intra module refs: generate_subkey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBE0 - 0000DBE4 (0x5 bytes), align: 0 + Segment part 11. Intra module refs: sm_xor + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBE5 - 0000DC66 (0x82 bytes), align: 0 + Segment part 13. Intra module refs: SM_CalcRandomAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_CalcRandomAddr 0000DBE5 + calls direct + XSTACK = 00000000 ( 00000011 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DC67 - 0000DD07 (0xa1 bytes), align: 0 + Segment part 15. Intra module refs: SM_ResolveRandomAddrs::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResolveRandomAddrs 0000DC67 + calls direct + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DD08 - 0000DD0A (0x3 bytes), align: 0 + Segment part 19. Intra module refs: SM_CalcRandomAddr + SM_ResolveRandomAddrs + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DD0B - 0000DD0F (0x5 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 19 + smGenerateRandBuf + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DD10 - 0000DE4D (0x13e bytes), align: 0 + Segment part 21. Intra module refs: SM_GenerateAuthenSig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_GenerateAuthenSig 0000DD10 + calls direct + XSTACK = 00000000 ( 00000032 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DE4E - 0000DE57 (0xa bytes), align: 0 + Segment part 23. Intra module refs: SM_GenerateAuthenSig + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DE58 - 0000E054 (0x1fd bytes), align: 0 + Segment part 24. Intra module refs: SM_VerifyAuthenSig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_VerifyAuthenSig 0000DE58 + calls direct + XSTACK = 00000003 ( 0000003F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E055 - 0000E065 (0x11 bytes), align: 0 + Segment part 26. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E066 - 0000E12D (0xc8 bytes), align: 0 + Segment part 27. Intra module refs: smProcessRandComplete::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessRandComplete 0000E066 + calls direct + XSTACK = 00000000 ( 0000000E ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E12E - 0000E139 (0xc bytes), align: 0 + Segment part 29. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E13A - 0000E13F (0x6 bytes), align: 0 + Segment part 30. Intra module refs: SM_VerifyAuthenSig + smProcessRandComplete + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E140 - 0000E145 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E146 - 0000E14B (0x6 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 31 + smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E14C - 0000E180 (0x35 bytes), align: 0 + Segment part 33. Intra module refs: smStartRspTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartRspTimer 0000E14C + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E181 - 0000E190 (0x10 bytes), align: 0 + Segment part 35. Intra module refs: smStopRspTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStopRspTimer 0000E181 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E191 - 0000E197 (0x7 bytes), align: 0 + Segment part 37. Intra module refs: smAuthReqToUint8 + smStopRspTimer + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E198 - 0000E1A2 (0xb bytes), align: 0 + Segment part 40. Intra module refs: smProcessRandComplete + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1A3 - 0000E1F4 (0x52 bytes), align: 0 + Segment part 43. Intra module refs: sm_ah::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_ah 0000E1A3 + calls direct + XSTACK = 00000014 ( 00000040 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1F5 - 0000E1FA (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 64 + sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E1FB - 0000E204 (0xa bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E205 - 0000E227 (0x23 bytes), align: 0 + Segment part 47. Intra module refs: sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E228 - 0000E22E (0x7 bytes), align: 0 + Segment part 48. Intra module refs: sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E22F - 0000E241 (0x13 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + sm_ah + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E242 - 0000E246 (0x5 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E247 - 0000E24B (0x5 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smStartRspTimer + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E24C - 0000E401 (0x1b6 bytes), align: 0 + Segment part 54. Intra module refs: sm_c1new::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1new 0000E24C + calls direct + XSTACK = 0000000B ( 0000006A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E402 - 0000E409 (0x8 bytes), align: 0 + Segment part 56. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + sm_CMAC + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E40A - 0000E40D (0x4 bytes), align: 0 + Segment part 57. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + sm_ah + sm_c1new + sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E40E - 0000E413 (0x6 bytes), align: 0 + Segment part 58. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + Segment part 49 + Segment part 57 + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E414 - 0000E41B (0x8 bytes), align: 0 + Segment part 59. Intra module refs: SM_VerifyAuthenSig + sm_c1new + sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E41C - 0000E444 (0x29 bytes), align: 0 + Segment part 60. Intra module refs: sm_xor::?relay + LOCAL ADDRESS + ===== ======= + sm_xor 0000E41C + XSTACK = 00000068 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E445 - 0000E4B5 (0x71 bytes), align: 0 + Segment part 62. Intra module refs: sm_s1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_s1 0000E445 + calls direct + XSTACK = 00000004 ( 00000040 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4B6 - 0000E4BC (0x7 bytes), align: 0 + Segment part 64. Intra module refs: sm_s1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4BD - 0000E4EE (0x32 bytes), align: 0 + Segment part 65. Intra module refs: smGenerateRandBuf::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandBuf 0000E4BD + calls direct + XSTACK = 0000000F ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4EF - 0000E4FB (0xd bytes), align: 0 + Segment part 67. Intra module refs: smAuthReqToUint8::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smAuthReqToUint8 0000E4EF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E4FC - 0000E541 (0x46 bytes), align: 0 + Segment part 69. Intra module refs: smUint8ToAuthReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smUint8ToAuthReq 0000E4FC + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E542 - 0000E546 (0x5 bytes), align: 0 + Segment part 71. Intra module refs: smEncrypt + smUint8ToAuthReq + xor_128 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E547 - 0000E56A (0x24 bytes), align: 0 + Segment part 72. Intra module refs: smEncrypt::?relay + LOCAL ADDRESS + ===== ======= + smEncrypt 0000E547 + calls direct + XSTACK = 00000068 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E56B - 0000E7A7 (0x23d bytes), align: 0 + Segment part 74. Intra module refs: sm_CMAC::?relay + LOCAL ADDRESS + ===== ======= + sm_CMAC 0000E56B + calls direct + XSTACK = 0000003D ( 0000002D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E7A8 - 0000E7AB (0x4 bytes), align: 0 + Segment part 76. Intra module refs: SM_ResolveRandomAddrs + sm_c1new + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E7AC - 0000E7B1 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: SM_CalcRandomAddr + Segment part 76 + smProcessRandComplete + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E7B2 - 0000E7BB (0xa bytes), align: 0 + Segment part 78. Intra module refs: SM_VerifyAuthenSig + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E7BC - 0000E896 (0xdb bytes), align: 0 + Segment part 79. Intra module refs: generate_subkey::?relay + LOCAL ADDRESS + ===== ======= + generate_subkey 0000E7BC + calls direct + XSTACK = 0000002D ( 00000014 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E897 - 0000E89E (0x8 bytes), align: 0 + Segment part 81. Intra module refs: sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E89F - 0000E8A4 (0x6 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + generate_subkey + smEncrypt + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8A5 - 0000E8AC (0x8 bytes), align: 0 + Segment part 83. Intra module refs: generate_subkey + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8AD - 0000E8B2 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: Segment part 83 + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8B3 - 0000E8C5 (0x13 bytes), align: 0 + Segment part 85. Intra module refs: generate_subkey + sm_CMAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E8C6 - 0000E913 (0x4e bytes), align: 0 + Segment part 86. Intra module refs: xor_128::?relay + LOCAL ADDRESS + ===== ======= + xor_128 0000E8C6 + XSTACK = 0000002D ( 0000000A ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E914 - 0000E91C (0x9 bytes), align: 0 + Segment part 88. Intra module refs: smGenerateRandBuf + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E91D - 0000E921 (0x5 bytes), align: 0 + Segment part 89. Intra module refs: SM_VerifyAuthenSig + Segment part 88 + sm_CMAC + xor_128 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000E922 - 0000E96E (0x4d bytes), align: 0 + Segment part 90. Intra module refs: leftshift_onebit::?relay + LOCAL ADDRESS + ===== ======= + leftshift_onebit 0000E922 + XSTACK = 00000012 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EA9 - 00000EAE (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_CalcRandomAddr::?relay + 00000EA9 GAP_ProcessEvent (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EAF - 00000EB4 (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResolveRandomAddrs::?relay + 00000EAF GAP_ResolvePrivateAddr (gap_devmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EB5 - 00000EBA (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_GenerateAuthenSig::?relay + 00000EB5 attSendMsg (att_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EBB - 00000EC0 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_VerifyAuthenSig::?relay + 00000EBB ATT_ParsePacket (att_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EC1 - 00000EC6 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessRandComplete::?relay + 00000EC1 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EC7 - 00000ECC (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartRspTimer::?relay + 00000EC7 smProcessDataMsg (sm_pairing) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ECD - 00000ED2 (0x6 bytes), align: 0 + Segment part 36. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStopRspTimer::?relay + 00000ECD smFreePairingParams (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ED3 - 00000ED8 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: SM_CalcRandomAddr + SM_ResolveRandomAddrs + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_ah::?relay 00000ED3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000ED9 - 00000EDE (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1new::?relay 00000ED9 sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EDF - 00000EE4 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: sm_c1new + LOCAL ADDRESS + ===== ======= + sm_xor::?relay 00000EDF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EE5 - 00000EEA (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_s1::?relay 00000EE5 smResponderProcessLTKReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EEB - 00000EF0 (0x6 bytes), align: 0 + Segment part 66. Intra module refs: SM_CalcRandomAddr + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandBuf::?relay + 00000EEB SM_PasskeyUpdate (sm_pairing) + Segment part 28 (gap_configmgr) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EF1 - 00000EF6 (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + smAuthReqToUint8::?relay + 00000EF1 smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EF7 - 00000EFC (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + smUint8ToAuthReq::?relay + 00000EF7 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + smProcessPairingReq (sm_pairing) + smSetPairingReqRsp (sm_pairing) + smpParsePairingReq (smp) + smpParseSecurityReq (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000EFD - 00000F02 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 46 + sm_c1new + LOCAL ADDRESS + ===== ======= + smEncrypt::?relay 00000EFD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F03 - 00000F08 (0x6 bytes), align: 0 + Segment part 75. Intra module refs: SM_GenerateAuthenSig + SM_VerifyAuthenSig + LOCAL ADDRESS + ===== ======= + sm_CMAC::?relay 00000F03 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F09 - 00000F0E (0x6 bytes), align: 0 + Segment part 80. Intra module refs: sm_CMAC + LOCAL ADDRESS + ===== ======= + generate_subkey::?relay + 00000F09 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F0F - 00000F14 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 84 + LOCAL ADDRESS + ===== ======= + xor_128::?relay 00000F0F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F15 - 00000F1A (0x6 bytes), align: 0 + Segment part 91. Intra module refs: generate_subkey + LOCAL ADDRESS + ===== ======= + leftshift_onebit::?relay + 00000F15 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E8F - 00008E9E (0x10 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 7 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_pairing + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007E2 - 000007E3 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: SM_PasskeyUpdate + SM_StartPairing + Segment part 13 + Segment part 17 + Segment part 21 + Segment part 22 + Segment part 49 + Segment part 59 + Segment part 61 + Segment part 69 + Segment part 76 + Segment part 77 + Segment part 78 + Segment part 86 + smDetermineKeySize + smEndPairing + smFreePairingParams + smGenerateConfirm + smProcessEncryptChange + smSavePairInfo + ENTRY ADDRESS REF BY + ===== ======= ====== + pPairingParams 000007E2 Segment part 17 (sm_rsppairing) + Segment part 18 (sm_rsppairing) + Segment part 20 (sm_rsppairing) + Segment part 26 (sm_rsppairing) + Segment part 36 (sm_rsppairing) + Segment part 41 (sm_rsppairing) + Segment part 43 (sm_rsppairing) + Segment part 44 (sm_rsppairing) + Segment part 50 (sm_rsppairing) + Segment part 58 (sm_rsppairing) + Segment part 61 (sm_rsppairing) + Segment part 65 (sm_rsppairing) + Segment part 69 (sm_rsppairing) + Segment part 73 (sm_rsppairing) + Segment part 76 (sm_rsppairing) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007E4 - 000007E5 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smProcessPairingReq + smRegisterResponder + ENTRY ADDRESS REF BY + ===== ======= ====== + pfnResponderCBs 000007E4 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007E6 - 000007E7 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smStartEncryption + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E4E - 00008E66 (0x19 bytes), align: 0 + Segment part 9. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CD62 - 0000CE4A (0xe9 bytes), align: 0 + Segment part 10. Intra module refs: SM_StartPairing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_StartPairing 0000CD62 + calls direct + XSTACK = 00000002 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE4B - 0000CE4E (0x4 bytes), align: 0 + Segment part 12. Intra module refs: SM_StartPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE4F - 0000CE55 (0x7 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + Segment part 15 + Segment part 43 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE56 - 0000CE5F (0xa bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + Segment part 62 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE60 - 0000CE65 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: SM_StartPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE66 - 0000CE67 (0x2 bytes), align: 0 + Segment part 16. Intra module refs: smEndPairing + smLinkCheck + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE68 - 0000CE6A (0x3 bytes), align: 0 + Segment part 17. Intra module refs: SM_PasskeyUpdate + SM_StartPairing + Segment part 16 + smFreePairingParams + smGeneratePairingReqRsp + smNextPairingState + smProcessEncryptChange + smSetPairingReqRsp + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE6B - 0000CE72 (0x8 bytes), align: 0 + Segment part 18. Intra module refs: Segment part 17 + smNextPairingState + smProcessDataMsg + smProcessEncryptChange + smProcessPairingReq + smSetPairingReqRsp + smStartEncryption + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CE73 - 0000CF3D (0xcb bytes), align: 0 + Segment part 19. Intra module refs: SM_PasskeyUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_PasskeyUpdate 0000CE73 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF3E - 0000CF4B (0xe bytes), align: 0 + Segment part 21. Intra module refs: SM_PasskeyUpdate + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF4C - 0000CF51 (0x6 bytes), align: 0 + Segment part 22. Intra module refs: SM_PasskeyUpdate + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF52 - 0000CF56 (0x5 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 22 + smLinkCheck + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF57 - 0000CF60 (0xa bytes), align: 0 + Segment part 26. Intra module refs: smRegisterResponder::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smRegisterResponder 0000CF57 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF61 - 0000CF7D (0x1d bytes), align: 0 + Segment part 28. Intra module refs: smLinkCheck::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smLinkCheck 0000CF61 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF7E - 0000CF82 (0x5 bytes), align: 0 + Segment part 30. Intra module refs: smEndPairing + smLinkCheck + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF83 - 0000CF8E (0xc bytes), align: 0 + Segment part 31. Intra module refs: smTimedOut::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smTimedOut 0000CF83 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000CF8F - 0000D12A (0x19c bytes), align: 0 + Segment part 33. Intra module refs: smProcessDataMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessDataMsg 0000CF8F + calls direct + XSTACK = 00000000 ( 0000001F ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D12B - 0000D12D (0x3 bytes), align: 0 + Segment part 35. Intra module refs: smPairingSendIdentityAddrInfo + smProcessDataMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D12E - 0000D132 (0x5 bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D133 - 0000D15F (0x2d bytes), align: 0 + Segment part 37. Intra module refs: smSendFailAndEnd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendFailAndEnd 0000D133 + calls direct + XSTACK = 0000001F ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D160 - 0000D275 (0x116 bytes), align: 0 + Segment part 39. Intra module refs: smProcessEncryptChange::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessEncryptChange + 0000D160 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D276 - 0000D2A4 (0x2f bytes), align: 0 + Segment part 41. Intra module refs: smNextPairingState::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smNextPairingState 0000D276 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2A5 - 0000D2AB (0x7 bytes), align: 0 + Segment part 43. Intra module refs: smNextPairingState + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2AC - 0000D2BE (0x13 bytes), align: 0 + Segment part 44. Intra module refs: smNextPairingState + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2BF - 0000D2C3 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: smRegisterResponder + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2C4 - 0000D2CA (0x7 bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + smDetermineKeySize + smFreePairingParams + smNextPairingState + smTimedOut + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D2CB - 0000D40E (0x144 bytes), align: 0 + Segment part 47. Intra module refs: sm_c1::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1 0000D2CB + calls direct + XSTACK = 0000000C ( 0000003A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D40F - 0000D411 (0x3 bytes), align: 0 + Segment part 49. Intra module refs: smProcessEncryptChange + smSavePairInfo + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D412 - 0000D419 (0x8 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D41A - 0000D4E5 (0xcc bytes), align: 0 + Segment part 51. Intra module refs: smProcessPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessPairingReq 0000D41A + calls direct + XSTACK = 00000000 ( 00000013 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D4E6 - 0000D4EE (0x9 bytes), align: 0 + Segment part 53. Intra module refs: smProcessDataMsg + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D4EF - 0000D545 (0x57 bytes), align: 0 + Segment part 54. Intra module refs: smStartEncryption::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartEncryption 0000D4EF + XSTACK = 00000004 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D546 - 0000D54A (0x5 bytes), align: 0 + Segment part 56. Intra module refs: SM_StartPairing + smStartEncryption + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D54B - 0000D59B (0x51 bytes), align: 0 + Segment part 57. Intra module refs: smGeneratePairingReqRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGeneratePairingReqRsp + 0000D54B + calls direct + XSTACK = 00000012 ( 00000013 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D59C - 0000D59E (0x3 bytes), align: 0 + Segment part 59. Intra module refs: smEndPairing + smGeneratePairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D59F - 0000D5A3 (0x5 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 59 + smNextPairingState + smProcessDataMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5A4 - 0000D5AF (0xc bytes), align: 0 + Segment part 61. Intra module refs: Segment part 88 + smGeneratePairingReqRsp + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5B0 - 0000D5B5 (0x6 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 56 + Segment part 61 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5B6 - 0000D5EA (0x35 bytes), align: 0 + Segment part 63. Intra module refs: smGenerateConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateConfirm 0000D5B6 + calls direct + XSTACK = 0000000A ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D5EB - 0000D617 (0x2d bytes), align: 0 + Segment part 65. Intra module refs: smGenerateRandMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandMsg 0000D5EB + calls direct + XSTACK = 00000000 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D618 - 0000D61B (0x4 bytes), align: 0 + Segment part 67. Intra module refs: smGenerateConfirm + smGenerateRandMsg + smPairingSendIdentityAddrInfo + smPairingSendMasterID + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D61C - 0000D621 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: SM_PasskeyUpdate + Segment part 67 + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D622 - 0000D62D (0xc bytes), align: 0 + Segment part 69. Intra module refs: SM_PasskeyUpdate + smGenerateRandMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D62E - 0000D8A9 (0x27c bytes), align: 0 + Segment part 70. Intra module refs: smSavePairInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSavePairInfo 0000D62E + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8AA - 0000D8B5 (0xc bytes), align: 0 + Segment part 72. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8B6 - 0000D8BB (0x6 bytes), align: 0 + Segment part 73. Intra module refs: Segment part 72 + Segment part 75 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8BC - 0000D8C7 (0xc bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8C8 - 0000D8CD (0x6 bytes), align: 0 + Segment part 75. Intra module refs: smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8CE - 0000D8D7 (0xa bytes), align: 0 + Segment part 76. Intra module refs: SM_StartPairing + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8D8 - 0000D8E1 (0xa bytes), align: 0 + Segment part 77. Intra module refs: smSavePairInfo + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8E2 - 0000D8E7 (0x6 bytes), align: 0 + Segment part 78. Intra module refs: smDetermineKeySize + smSavePairInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8E8 - 0000D8EE (0x7 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + smProcessEncryptChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8EF - 0000D8F7 (0x9 bytes), align: 0 + Segment part 80. Intra module refs: Segment part 23 + Segment part 79 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D8F8 - 0000D902 (0xb bytes), align: 0 + Segment part 81. Intra module refs: smPairingSendEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendEncInfo 0000D8F8 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D903 - 0000D90F (0xd bytes), align: 0 + Segment part 83. Intra module refs: smPairingSendEncInfo + smPairingSendIdentityInfo + smPairingSendSingingInfo + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D910 - 0000D96A (0x5b bytes), align: 0 + Segment part 84. Intra module refs: smPairingSendMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendMasterID 0000D910 + calls direct + XSTACK = 00000002 ( 0000001E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D96B - 0000D96D (0x3 bytes), align: 0 + Segment part 86. Intra module refs: smDetermineKeySize + smFreePairingParams + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D96E - 0000D973 (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 86 + smDetermineKeySize + smPairingSendMasterID + smProcessDataMsg + sm_c1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D974 - 0000D98E (0x1b bytes), align: 0 + Segment part 88. Intra module refs: smGenerateConfirm + smGenerateRandMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D98F - 0000D991 (0x3 bytes), align: 0 + Segment part 89. Intra module refs: Segment part 83 + Segment part 88 + smGeneratePairingReqRsp + smPairingSendMasterID + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D992 - 0000D996 (0x5 bytes), align: 0 + Segment part 90. Intra module refs: SM_PasskeyUpdate + Segment part 89 + smSendFailAndEnd + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D997 - 0000D99A (0x4 bytes), align: 0 + Segment part 91. Intra module refs: smPairingSendIdentityAddrInfo + smPairingSendMasterID + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D99B - 0000D9A0 (0x6 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 83 + Segment part 88 + Segment part 91 + smGeneratePairingReqRsp + smSendFailAndEnd + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D9A1 - 0000D9AE (0xe bytes), align: 0 + Segment part 93. Intra module refs: smPairingSendIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityInfo + 0000D9A1 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D9AF - 0000D9FB (0x4d bytes), align: 0 + Segment part 95. Intra module refs: smPairingSendIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityAddrInfo + 0000D9AF + calls direct + XSTACK = 00000000 ( 00000015 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000D9FC - 0000DA09 (0xe bytes), align: 0 + Segment part 97. Intra module refs: smPairingSendSingingInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendSingingInfo + 0000D9FC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DA0A - 0000DA6B (0x62 bytes), align: 0 + Segment part 99. Intra module refs: smFreePairingParams::?relay + LOCAL ADDRESS + ===== ======= + smFreePairingParams 0000DA0A + calls direct + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DA6C - 0000DA75 (0xa bytes), align: 0 + Segment part 101. Intra module refs: smFreePairingParams + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DA76 - 0000DAD4 (0x5f bytes), align: 0 + Segment part 102. Intra module refs: smEndPairing::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smEndPairing 0000DA76 + calls direct + XSTACK = 0000000C ( 00000011 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAD5 - 0000DAD8 (0x4 bytes), align: 0 + Segment part 104. Intra module refs: SM_StartPairing + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAD9 - 0000DADC (0x4 bytes), align: 0 + Segment part 105. Intra module refs: Segment part 104 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DADD - 0000DAE7 (0xb bytes), align: 0 + Segment part 106. Intra module refs: Segment part 105 + Segment part 108 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAE8 - 0000DAEB (0x4 bytes), align: 0 + Segment part 107. Intra module refs: SM_PasskeyUpdate + smEndPairing + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAEC - 0000DAF0 (0x5 bytes), align: 0 + Segment part 108. Intra module refs: Segment part 101 + Segment part 107 + Segment part 77 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DAF1 - 0000DB47 (0x57 bytes), align: 0 + Segment part 109. Intra module refs: smDetermineKeySize::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smDetermineKeySize 0000DAF1 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DB48 - 0000DBCA (0x83 bytes), align: 0 + Segment part 111. Intra module refs: smSetPairingReqRsp::?relay + LOCAL ADDRESS + ===== ======= + smSetPairingReqRsp 0000DB48 + calls direct + XSTACK = 0000002F ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBCB - 0000DBCD (0x3 bytes), align: 0 + Segment part 113. Intra module refs: smProcessEncryptChange + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBCE - 0000DBD3 (0x6 bytes), align: 0 + Segment part 114. Intra module refs: Segment part 113 + smSavePairInfo + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBD4 - 0000DBD5 (0x2 bytes), align: 0 + Segment part 115. Intra module refs: SM_StartPairing + smProcessPairingReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBD6 - 0000DBD9 (0x4 bytes), align: 0 + Segment part 116. Intra module refs: Segment part 115 + smProcessPairingReq + smSetPairingReqRsp + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000DBDA - 0000DBDF (0x6 bytes), align: 0 + Segment part 117. Intra module refs: Segment part 116 + Segment part 44 + Segment part 50 + Segment part 60 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F1B - 00000F20 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_StartPairing::?relay + 00000F1B GAP_Authenticate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F21 - 00000F26 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_PasskeyUpdate::?relay + 00000F21 GAP_PasscodeUpdate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F27 - 00000F2C (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + smRegisterResponder::?relay + 00000F27 SM_ResponderInit (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F2D - 00000F32 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + smLinkCheck::?relay 00000F2D SM_Init (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F33 - 00000F38 (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + smTimedOut::?relay 00000F33 SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F39 - 00000F3E (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessDataMsg::?relay + 00000F39 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F3F - 00000F44 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 53 + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendFailAndEnd::?relay + 00000F3F GAP_TerminateAuth (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F45 - 00000F4A (0x6 bytes), align: 0 + Segment part 40. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessEncryptChange::?relay + 00000F45 smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F4B - 00000F50 (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + smNextPairingState::?relay + 00000F4B SM_ProcessEvent (sm_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F51 - 00000F56 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: SM_PasskeyUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + sm_c1::?relay 00000F51 Segment part 54 (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F57 - 00000F5C (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + smProcessPairingReq::?relay + 00000F57 GAP_Authenticate (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F5D - 00000F62 (0x6 bytes), align: 0 + Segment part 55. + ENTRY ADDRESS REF BY + ===== ======= ====== + smStartEncryption::?relay + 00000F5D GAP_Bond (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F63 - 00000F68 (0x6 bytes), align: 0 + Segment part 58. Intra module refs: SM_StartPairing + ENTRY ADDRESS REF BY + ===== ======= ====== + smGeneratePairingReqRsp::?relay + 00000F63 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F69 - 00000F6E (0x6 bytes), align: 0 + Segment part 64. Intra module refs: SM_PasskeyUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateConfirm::?relay + 00000F69 smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F6F - 00000F74 (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + smGenerateRandMsg::?relay + 00000F6F smpResponderProcessPairingRandom (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F75 - 00000F7A (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + smSavePairInfo::?relay + 00000F75 smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F7B - 00000F80 (0x6 bytes), align: 0 + Segment part 82. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendEncInfo::?relay + 00000F7B smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F81 - 00000F86 (0x6 bytes), align: 0 + Segment part 85. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendMasterID::?relay + 00000F81 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F87 - 00000F8C (0x6 bytes), align: 0 + Segment part 94. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityInfo::?relay + 00000F87 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F8D - 00000F92 (0x6 bytes), align: 0 + Segment part 96. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendIdentityAddrInfo::?relay + 00000F8D smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F93 - 00000F98 (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + smPairingSendSingingInfo::?relay + 00000F93 smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F99 - 00000F9E (0x6 bytes), align: 0 + Segment part 100. Intra module refs: SM_StartPairing + smEndPairing + smLinkCheck + LOCAL ADDRESS + ===== ======= + smFreePairingParams::?relay + 00000F99 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000F9F - 00000FA4 (0x6 bytes), align: 0 + Segment part 103. Intra module refs: smNextPairingState + smProcessEncryptChange + smSendFailAndEnd + smTimedOut + ENTRY ADDRESS REF BY + ===== ======= ====== + smEndPairing::?relay 00000F9F smResponderProcessLTKReq (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FA5 - 00000FAA (0x6 bytes), align: 0 + Segment part 110. + ENTRY ADDRESS REF BY + ===== ======= ====== + smDetermineKeySize::?relay + 00000FA5 Segment part 15 (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smpResponderProcessIncoming (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FAB - 00000FB0 (0x6 bytes), align: 0 + Segment part 112. Intra module refs: smGeneratePairingReqRsp + sm_c1 + LOCAL ADDRESS + ===== ======= + smSetPairingReqRsp::?relay + 00000FAB + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E4E - 00008E66 (0x19 bytes), align: 0 + Segment part 118. Intra module refs: Segment part 9 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_rsppairing + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000DC1 - 00000DC6 (0x6 bytes), align: 0 + Segment part 6. Intra module refs: SM_ResponderInit + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000117E8 - 00011809 (0x22 bytes), align: 0 + Segment part 10. Intra module refs: SM_ResponderInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResponderInit 000117E8 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001180A - 000119D1 (0x1c8 bytes), align: 0 + Segment part 12. Intra module refs: smResponderProcessLTKReq::?relay + LOCAL ADDRESS + ===== ======= + smResponderProcessLTKReq + 0001180A + calls direct, is indirectly called + XSTACK = 00000002 ( 00000032 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119D2 - 000119D6 (0x5 bytes), align: 0 + Segment part 14. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119D7 - 000119E2 (0xc bytes), align: 0 + Segment part 15. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119E3 - 000119F4 (0x12 bytes), align: 0 + Segment part 16. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000119F5 - 00011A02 (0xe bytes), align: 0 + Segment part 17. Intra module refs: smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A03 - 00011A05 (0x3 bytes), align: 0 + Segment part 18. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A06 - 00011A0A (0x5 bytes), align: 0 + Segment part 19. Intra module refs: Segment part 18 + smResponderSendNextKeyInfo + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A0B - 00011A10 (0x6 bytes), align: 0 + Segment part 20. Intra module refs: smResponderProcessLTKReq + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A11 - 00011A1A (0xa bytes), align: 0 + Segment part 21. Intra module refs: Segment part 20 + smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011A1B - 00011CBC (0x2a2 bytes), align: 0 + Segment part 22. Intra module refs: smpResponderProcessIncoming::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessIncoming + 00011A1B + calls direct, is indirectly called + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CBD - 00011CC0 (0x4 bytes), align: 0 + Segment part 24. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CC1 - 00011CC6 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: Segment part 24 + Segment part 60 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CC7 - 00011CCC (0x6 bytes), align: 0 + Segment part 26. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CCD - 00011CD3 (0x7 bytes), align: 0 + Segment part 27. Intra module refs: Segment part 26 + smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CD4 - 00011CD9 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011CDA - 00011DA7 (0xce bytes), align: 0 + Segment part 29. Intra module refs: smpResponderProcessPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpResponderProcessPairingReq + 00011CDA + calls direct + XSTACK = 0000000E ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DA8 - 00011DAC (0x5 bytes), align: 0 + Segment part 31. Intra module refs: smpResponderProcessMasterID + smpResponderProcessPairingRandom + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DAD - 00011DAF (0x3 bytes), align: 0 + Segment part 32. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB0 - 00011DB0 (0x1 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 32 + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB1 - 00011DB6 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: Segment part 33 + smResponderProcessLTKReq + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DB7 - 00011DBA (0x4 bytes), align: 0 + Segment part 35. Intra module refs: smResponderProcessLTKReq + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DBB - 00011DC7 (0xd bytes), align: 0 + Segment part 36. Intra module refs: Segment part 35 + Segment part 54 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DC8 - 00011DCB (0x4 bytes), align: 0 + Segment part 37. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DCC - 00011DCF (0x4 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 37 + Segment part 61 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DD0 - 00011DDA (0xb bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + Segment part 42 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DDB - 00011DDE (0x4 bytes), align: 0 + Segment part 40. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DDF - 00011DE8 (0xa bytes), align: 0 + Segment part 41. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DE9 - 00011DED (0x5 bytes), align: 0 + Segment part 42. Intra module refs: Segment part 17 + Segment part 21 + Segment part 28 + Segment part 40 + Segment part 41 + Segment part 43 + Segment part 74 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DEE - 00011DF9 (0xc bytes), align: 0 + Segment part 43. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011DFA - 00011DFF (0x6 bytes), align: 0 + Segment part 44. Intra module refs: smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E00 - 00011E03 (0x4 bytes), align: 0 + Segment part 45. Intra module refs: Segment part 44 + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E04 - 00011E90 (0x8d bytes), align: 0 + Segment part 46. Intra module refs: smpResponderProcessPairingRandom::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessPairingRandom + 00011E04 + calls direct + XSTACK = 0000000E ( 0000001C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E91 - 00011E9C (0xc bytes), align: 0 + Segment part 48. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingRandom + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E9D - 00011E9D (0x1 bytes), align: 0 + Segment part 49. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011E9E - 00011EA0 (0x3 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessPairingRandom + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EA1 - 00011EA4 (0x4 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EA5 - 00011EAB (0x7 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 51 + Segment part 76 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EAC - 00011EB2 (0x7 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 19 + Segment part 25 + Segment part 52 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EB3 - 00011EC1 (0xf bytes), align: 0 + Segment part 54. Intra module refs: smpResponderProcessIncoming + smpResponderProcessPairingRandom + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011EC2 - 00011F7A (0xb9 bytes), align: 0 + Segment part 55. Intra module refs: smpResponderProcessMasterID::?relay + LOCAL ADDRESS + ===== ======= + smpResponderProcessMasterID + 00011EC2 + calls direct + XSTACK = 0000000E ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F7B - 00011F85 (0xb bytes), align: 0 + Segment part 57. Intra module refs: smResponderProcessLTKReq + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F86 - 00011F94 (0xf bytes), align: 0 + Segment part 58. Intra module refs: smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F95 - 00011F97 (0x3 bytes), align: 0 + Segment part 59. Intra module refs: Segment part 58 + Segment part 61 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F98 - 00011F9E (0x7 bytes), align: 0 + Segment part 60. Intra module refs: Segment part 45 + Segment part 59 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011F9F - 00011FAD (0xf bytes), align: 0 + Segment part 61. Intra module refs: smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011FAE - 00012296 (0x2e9 bytes), align: 0 + Segment part 62. Intra module refs: smResponderSendNextKeyInfo::?relay + LOCAL ADDRESS + ===== ======= + smResponderSendNextKeyInfo + 00011FAE + calls direct, is indirectly called + XSTACK = 00000000 ( 00000014 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012297 - 00012298 (0x2 bytes), align: 0 + Segment part 64. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012299 - 000122A6 (0xe bytes), align: 0 + Segment part 65. Intra module refs: Segment part 64 + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122A7 - 000122AC (0x6 bytes), align: 0 + Segment part 66. Intra module refs: smResponderProcessLTKReq + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122AD - 000122B2 (0x6 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 66 + smResponderProcessLTKReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122B3 - 000122BC (0xa bytes), align: 0 + Segment part 68. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122BD - 000122BF (0x3 bytes), align: 0 + Segment part 69. Intra module refs: smResponderProcessLTKReq + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122C0 - 000122C5 (0x6 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 69 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + smpResponderProcessMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122C6 - 000122D0 (0xb bytes), align: 0 + Segment part 71. Intra module refs: smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122D1 - 000122DB (0xb bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122DC - 000122E1 (0x6 bytes), align: 0 + Segment part 73. Intra module refs: smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122E2 - 000122EB (0xa bytes), align: 0 + Segment part 74. Intra module refs: Segment part 73 + smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122EC - 000122F3 (0x8 bytes), align: 0 + Segment part 75. Intra module refs: smResponderSendNextKeyInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000122F4 - 000122FF (0xc bytes), align: 0 + Segment part 76. Intra module refs: Segment part 75 + smResponderSendNextKeyInfo + smpResponderProcessPairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00012300 - 00012305 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: Segment part 76 + smResponderProcessLTKReq + smResponderSendNextKeyInfo + smpResponderProcessIncoming + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000233 - 00000238 (0x6 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F47 - 00008F4A (0x4 bytes), align: 0 + Segment part 9. Intra module refs: smResponderSendNextKeyInfo + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_1f4 00008F47 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FB1 - 00000FB6 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ResponderInit::?relay + 00000FB1 GAP_DeviceInit (gap) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FB7 - 00000FBC (0x6 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smResponderProcessLTKReq::?relay + 00000FB7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FBD - 00000FC2 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smpResponderProcessIncoming::?relay + 00000FBD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FC3 - 00000FC8 (0x6 bytes), align: 0 + Segment part 30. Intra module refs: smpResponderProcessIncoming + ENTRY ADDRESS REF BY + ===== ======= ====== + smpResponderProcessPairingReq::?relay + 00000FC3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FC9 - 00000FCE (0x6 bytes), align: 0 + Segment part 47. Intra module refs: smpResponderProcessIncoming + LOCAL ADDRESS + ===== ======= + smpResponderProcessPairingRandom::?relay + 00000FC9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FCF - 00000FD4 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: smpResponderProcessIncoming + LOCAL ADDRESS + ===== ======= + smpResponderProcessMasterID::?relay + 00000FCF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FD5 - 00000FDA (0x6 bytes), align: 0 + Segment part 63. Intra module refs: Segment part 7 + LOCAL ADDRESS + ===== ======= + smResponderSendNextKeyInfo::?relay + 00000FD5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F47 - 00008F4A (0x4 bytes), align: 0 + Segment part 79. Intra module refs: __Constant_1f4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : sm_task + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007E8 - 000007E8 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: SM_Init + SM_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + smTaskID 000007E8 smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + smStopRspTimer (sm_mgr) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A209 - 0001A22D (0x25 bytes), align: 0 + Segment part 7. Intra module refs: SM_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_Init 0001A209 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A22E - 0001A2A3 (0x76 bytes), align: 0 + Segment part 9. Intra module refs: SM_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ProcessEvent 0001A22E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A2A4 - 0001A3B6 (0x113 bytes), align: 0 + Segment part 11. Intra module refs: smProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + smProcessOSALMsg 0001A2A4 + calls direct + XSTACK = 0000000C ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A3B7 - 0001A3C1 (0xb bytes), align: 0 + Segment part 13. Intra module refs: smProcessOSALMsg + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FDB - 00000FE0 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_Init::?relay 00000FDB osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FE1 - 00000FE6 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + SM_ProcessEvent::?relay + 00000FE1 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FE7 - 00000FEC (0x6 bytes), align: 0 + Segment part 12. Intra module refs: SM_ProcessEvent + LOCAL ADDRESS + ===== ======= + smProcessOSALMsg::?relay + 00000FE7 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : smp + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F46 - 00014F4E (0x9 bytes), align: 0 + Segment part 6. Intra module refs: smpBuildPairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReq 00014F46 + calls direct, is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F4F - 00014F57 (0x9 bytes), align: 0 + Segment part 8. Intra module refs: smpBuildPairingRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRsp 00014F4F + calls direct, is indirectly called + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F58 - 00015016 (0xbf bytes), align: 0 + Segment part 10. Intra module refs: smpBuildPairingReqRsp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReqRsp 00014F58 + calls direct + XSTACK = 00000000 ( 0000000B ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015017 - 00015017 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015018 - 00015018 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 12 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015019 - 0001501C (0x4 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 13 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001501D - 00015022 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 14 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015023 - 00015028 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015029 - 0001502F (0x7 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 16 + smpBuildPairingReqRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015030 - 000151CB (0x19c bytes), align: 0 + Segment part 18. Intra module refs: smpParsePairingReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingReq 00015030 + calls direct + XSTACK = 00000000 ( 00000013 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000151CC - 000151D6 (0xb bytes), align: 0 + Segment part 20. Intra module refs: smpBuildPairingReqRsp + smpParsePairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000151D7 - 000151E0 (0xa bytes), align: 0 + Segment part 21. Intra module refs: smpParsePairingReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000151E1 - 00015210 (0x30 bytes), align: 0 + Segment part 22. Intra module refs: smpBuildPairingConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingConfirm + 000151E1 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015211 - 0001523B (0x2b bytes), align: 0 + Segment part 24. Intra module refs: smpParsePairingConfirm::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingConfirm + 00015211 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001523C - 0001526B (0x30 bytes), align: 0 + Segment part 26. Intra module refs: smpBuildPairingRandom::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRandom 0001523C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001526C - 00015296 (0x2b bytes), align: 0 + Segment part 28. Intra module refs: smpParsePairingRandom::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingRandom 0001526C + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015297 - 000152C0 (0x2a bytes), align: 0 + Segment part 30. Intra module refs: smpBuildPairingFailed::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingFailed 00015297 + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152C1 - 000152C3 (0x3 bytes), align: 0 + Segment part 32. Intra module refs: smpBuildPairingReq + smpBuildPairingRsp + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152C4 - 000152CA (0x7 bytes), align: 0 + Segment part 33. Intra module refs: Segment part 32 + smpBuildPairingFailed + smpParsePairingFailed + smpParseSecurityReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152CB - 000152F6 (0x2c bytes), align: 0 + Segment part 34. Intra module refs: smpParsePairingFailed::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingFailed 000152CB + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000152F7 - 00015326 (0x30 bytes), align: 0 + Segment part 36. Intra module refs: smpBuildEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildEncInfo 000152F7 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015327 - 00015332 (0xc bytes), align: 0 + Segment part 38. Intra module refs: smpBuildEncInfo + smpBuildIdentityInfo + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015333 - 00015339 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + smpBuildPairingReqRsp + smpBuildSecurityReq + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001533A - 00015364 (0x2b bytes), align: 0 + Segment part 40. Intra module refs: smpParseEncInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseEncInfo 0001533A + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015365 - 000153AB (0x47 bytes), align: 0 + Segment part 42. Intra module refs: smpBuildMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildMasterID 00015365 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153AC - 000153FB (0x50 bytes), align: 0 + Segment part 44. Intra module refs: smpParseMasterID::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseMasterID 000153AC + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000153FC - 00015400 (0x5 bytes), align: 0 + Segment part 46. Intra module refs: smpBuildEncInfo + smpBuildIdentityAddrInfo + smpBuildIdentityInfo + smpBuildMasterID + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + smpParseEncInfo + smpParseIdentityAddrInfo + smpParseIdentityInfo + smpParseMasterID + smpParsePairingConfirm + smpParsePairingRandom + smpParseSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015401 - 0001542F (0x2f bytes), align: 0 + Segment part 47. Intra module refs: smpBuildIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityInfo 00015401 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015430 - 00015438 (0x9 bytes), align: 0 + Segment part 49. Intra module refs: smpParseEncInfo + smpParseIdentityInfo + smpParsePairingConfirm + smpParsePairingRandom + smpParseSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015439 - 0001543B (0x3 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + smpBuildEncInfo + smpBuildIdentityInfo + smpBuildPairingConfirm + smpBuildPairingRandom + smpBuildSigningInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001543C - 0001543C (0x1 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + smpParseMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001543D - 00015442 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 51 + smpBuildIdentityAddrInfo + smpBuildMasterID + smpParseIdentityAddrInfo + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015443 - 00015483 (0x41 bytes), align: 0 + Segment part 53. Intra module refs: smpBuildIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityAddrInfo + 00015443 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015484 - 00015491 (0xe bytes), align: 0 + Segment part 55. Intra module refs: smpBuildIdentityAddrInfo + smpBuildMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015492 - 0001549C (0xb bytes), align: 0 + Segment part 56. Intra module refs: Segment part 55 + smpBuildMasterID + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001549D - 000154C7 (0x2b bytes), align: 0 + Segment part 57. Intra module refs: smpParseIdentityInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityInfo 0001549D + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000154C8 - 00015516 (0x4f bytes), align: 0 + Segment part 59. Intra module refs: smpParseIdentityAddrInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityAddrInfo + 000154C8 + calls direct + XSTACK = 00000000 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015517 - 00015546 (0x30 bytes), align: 0 + Segment part 61. Intra module refs: smpBuildSigningInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSigningInfo 00015517 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015547 - 00015571 (0x2b bytes), align: 0 + Segment part 63. Intra module refs: smpParseSigningInfo::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSigningInfo 00015547 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015572 - 0001559F (0x2e bytes), align: 0 + Segment part 65. Intra module refs: smpBuildSecurityReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSecurityReq 00015572 + calls direct + XSTACK = 00000000 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000155A0 - 000155C2 (0x23 bytes), align: 0 + Segment part 67. Intra module refs: smpParseSecurityReq::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSecurityReq 000155A0 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000155C3 - 00015662 (0xa0 bytes), align: 0 + Segment part 69. Intra module refs: smSendSMMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendSMMsg 000155C3 + calls direct + XSTACK = 00000002 ( 00000013 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FED - 00000FF2 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReq::?relay + 00000FED smGeneratePairingReqRsp (sm_pairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FF3 - 00000FF8 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRsp::?relay + 00000FF3 smGeneratePairingReqRsp (sm_pairing) + sm_c1 (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FF9 - 00000FFE (0x6 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 32 + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingReqRsp::?relay + 00000FF9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00000FFF - 00001004 (0x6 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingReq::?relay + 00000FFF smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001005 - 0000100A (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingConfirm::?relay + 00001005 smGenerateConfirm (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000100B - 00001010 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingConfirm::?relay + 0000100B smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001011 - 00001016 (0x6 bytes), align: 0 + Segment part 27. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingRandom::?relay + 00001011 smGenerateRandMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001017 - 0000101C (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingRandom::?relay + 00001017 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000101D - 00001022 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildPairingFailed::?relay + 0000101D smSendFailAndEnd (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001023 - 00001028 (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParsePairingFailed::?relay + 00001023 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001029 - 0000102E (0x6 bytes), align: 0 + Segment part 37. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildEncInfo::?relay + 00001029 smPairingSendEncInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000102F - 00001034 (0x6 bytes), align: 0 + Segment part 41. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseEncInfo::?relay + 0000102F smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001035 - 0000103A (0x6 bytes), align: 0 + Segment part 43. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildMasterID::?relay + 00001035 smPairingSendMasterID (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000103B - 00001040 (0x6 bytes), align: 0 + Segment part 45. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseMasterID::?relay + 0000103B smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001041 - 00001046 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityInfo::?relay + 00001041 smPairingSendIdentityInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001047 - 0000104C (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildIdentityAddrInfo::?relay + 00001047 smPairingSendIdentityAddrInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000104D - 00001052 (0x6 bytes), align: 0 + Segment part 58. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityInfo::?relay + 0000104D smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001053 - 00001058 (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseIdentityAddrInfo::?relay + 00001053 smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001059 - 0000105E (0x6 bytes), align: 0 + Segment part 62. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSigningInfo::?relay + 00001059 smPairingSendSingingInfo (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000105F - 00001064 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSigningInfo::?relay + 0000105F smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001065 - 0000106A (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpBuildSecurityReq::?relay + 00001065 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000106B - 00001070 (0x6 bytes), align: 0 + Segment part 68. + ENTRY ADDRESS REF BY + ===== ======= ====== + smpParseSecurityReq::?relay + 0000106B smProcessDataMsg (sm_pairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001071 - 00001076 (0x6 bytes), align: 0 + Segment part 70. + ENTRY ADDRESS REF BY + ===== ======= ====== + smSendSMMsg::?relay 00001071 GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + Segment part 92 (sm_pairing) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + LIBRARY MODULE, NAME : hci_tl + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007E9 - 000007E9 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: HCI_Init + HCI_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + hciTaskID 000007E9 LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_DisconnectCback (hci_event) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + Segment part 142 (hci_event) + Segment part 30 (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007EA - 000007EA (0x1 bytes), align: 0 + Segment part 7. Intra module refs: HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciTestTaskID 000007EA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007EB - 000007EB (0x1 bytes), align: 0 + Segment part 8. Intra module refs: HCI_GAPTaskRegister + HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciGapTaskID 000007EB HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_DisconnectCback (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007EC - 000007EC (0x1 bytes), align: 0 + Segment part 9. Intra module refs: HCI_Init + HCI_L2CAPTaskRegister + ENTRY ADDRESS REF BY + ===== ======= ====== + hciL2capTaskID 000007EC HCI_NumOfCompletedPacketsEvent (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007ED - 000007ED (0x1 bytes), align: 0 + Segment part 10. Intra module refs: HCI_Init + HCI_SMPTaskRegister + ENTRY ADDRESS REF BY + ===== ======= ====== + hciSmpTaskID 000007ED HCI_CommandCompleteEvent (hci_event) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReqCback (hci_event) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007EE - 000007EE (0x1 bytes), align: 0 + Segment part 11. Intra module refs: HCI_Init + ENTRY ADDRESS REF BY + ===== ======= ====== + hciExtTaskID 000007EE + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AE84 - 0001AEAF (0x2c bytes), align: 0 + Segment part 13. Intra module refs: HCI_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_Init 0001AE84 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AEB0 - 0001AEDC (0x2d bytes), align: 0 + Segment part 15. Intra module refs: HCI_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ProcessEvent 0001AEB0 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AEDD - 0001AEE6 (0xa bytes), align: 0 + Segment part 19. Intra module refs: HCI_GAPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_GAPTaskRegister 0001AEDD + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AEE7 - 0001AEEE (0x8 bytes), align: 0 + Segment part 21. Intra module refs: HCI_L2CAPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_L2CAPTaskRegister 0001AEE7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AEEF - 0001AEF6 (0x8 bytes), align: 0 + Segment part 23. Intra module refs: HCI_GAPTaskRegister + HCI_L2CAPTaskRegister + HCI_SMPTaskRegister + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AEF7 - 0001AF00 (0xa bytes), align: 0 + Segment part 24. Intra module refs: HCI_SMPTaskRegister::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SMPTaskRegister 0001AEF7 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001077 - 0000107C (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_Init::?relay 00001077 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000107D - 00001082 (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_ProcessEvent::?relay + 0000107D tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001083 - 00001088 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_GAPTaskRegister::?relay + 00001083 GAP_Init (gap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001089 - 0000108E (0x6 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_L2CAPTaskRegister::?relay + 00001089 L2CAP_Init (l2cap_task) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000108F - 00001094 (0x6 bytes), align: 0 + Segment part 25. + ENTRY ADDRESS REF BY + ===== ======= ====== + HCI_SMPTaskRegister::?relay + 0000108F SM_Init (sm_task) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL.r51 + PROGRAM MODULE, NAME : OSAL + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007EF - 000007F0 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: osal_init_system + osal_msg_enqueue_push + osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_qHead 000007EF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DC7 - 00000DC7 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: osal_run_system + LOCAL ADDRESS + ===== ======= + activeTaskID 00000DC7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D6F - 00015D78 (0xa bytes), align: 0 + Segment part 16. Intra module refs: osal_strlen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_strlen 00015D6F + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015D79 - 00015DB9 (0x41 bytes), align: 0 + Segment part 18. Intra module refs: osal_memcpy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcpy 00015D79 + XSTACK = 00000010 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015DBA - 00015E02 (0x49 bytes), align: 0 + Segment part 20. Intra module refs: osal_revmemcpy::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_revmemcpy 00015DBA + XSTACK = 00000002 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E03 - 00015E33 (0x31 bytes), align: 0 + Segment part 22. Intra module refs: osal_memdup::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memdup 00015E03 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E34 - 00015E3C (0x9 bytes), align: 0 + Segment part 24. Intra module refs: osal_memdup + osal_msg_receive + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00015E34 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E3D - 00015E8D (0x51 bytes), align: 0 + Segment part 25. Intra module refs: osal_memcmp::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcmp 00015E3D + XSTACK = 00000002 ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E8E - 00015E92 (0x5 bytes), align: 0 + Segment part 27. Intra module refs: osal_memcmp + osal_msg_extract + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00015E8E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015E93 - 00015EB3 (0x21 bytes), align: 0 + Segment part 28. Intra module refs: osal_memset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memset 00015E93 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015EB4 - 00015EBC (0x9 bytes), align: 0 + Segment part 45. Intra module refs: osal_rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_rand 00015EB4 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015EBD - 00015F09 (0x4d bytes), align: 0 + Segment part 47. Intra module refs: osal_msg_allocate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_allocate 00015EBD + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015F0A - 00015F10 (0x7 bytes), align: 0 + Segment part 49. Intra module refs: osal_memcpy + osal_msg_allocate + LOCAL ADDRESS + ===== ======= + ?Subroutine23 00015F0A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015F11 - 00015F32 (0x22 bytes), align: 0 + Segment part 50. Intra module refs: osal_msg_deallocate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_deallocate 00015F11 + calls direct + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015F33 - 00015F39 (0x7 bytes), align: 0 + Segment part 52. Intra module refs: osal_init_system + osal_msg_deallocate + osal_rand + osal_strlen + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00015F33 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015F3A - 00015F43 (0xa bytes), align: 0 + Segment part 53. Intra module refs: osal_msg_send::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_send 00015F3A + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015F44 - 00015FA4 (0x61 bytes), align: 0 + Segment part 57. Intra module refs: osal_msg_enqueue_push::?relay + LOCAL ADDRESS + ===== ======= + osal_msg_enqueue_push 00015F44 + calls direct + XSTACK = 00000009 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015FA5 - 00015FB1 (0xd bytes), align: 0 + Segment part 59. Intra module refs: osal_msg_deallocate + osal_msg_enqueue_push + LOCAL ADDRESS + ===== ======= + ?Subroutine21 00015FA5 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00015FB2 - 00016039 (0x88 bytes), align: 0 + Segment part 60. Intra module refs: osal_msg_receive::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_receive 00015FB2 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001603A - 00016041 (0x8 bytes), align: 0 + Segment part 62. Intra module refs: osal_memcmp + osal_msg_extract + osal_msg_receive + LOCAL ADDRESS + ===== ======= + ?Subroutine13 0001603A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016042 - 00016079 (0x38 bytes), align: 0 + Segment part 65. Intra module refs: osal_msg_enqueue::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_enqueue 00016042 + XSTACK = 00000009 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001607A - 0001607D (0x4 bytes), align: 0 + Segment part 67. Intra module refs: osal_msg_enqueue + osal_msg_push + LOCAL ADDRESS + ===== ======= + ?Subroutine6 0001607A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001607E - 00016089 (0xc bytes), align: 0 + Segment part 68. Intra module refs: osal_msg_enqueue + LOCAL ADDRESS + ===== ======= + ?Subroutine16 0001607E + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001608A - 0001608F (0x6 bytes), align: 0 + Segment part 69. Intra module refs: ?Subroutine16 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016090 - 00016092 (0x3 bytes), align: 0 + Segment part 70. Intra module refs: osal_msg_send + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00016090 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016093 - 00016097 (0x5 bytes), align: 0 + Segment part 71. Intra module refs: ?Subroutine1 + ?Subroutine6 + osal_clear_event + osal_memcpy + osal_msg_enqueue_push + osal_revmemcpy + osal_set_event + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016098 - 0001609C (0x5 bytes), align: 0 + Segment part 74. Intra module refs: osal_isbufset + osal_memset + osal_msg_allocate + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00016098 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001609D - 000160CA (0x2e bytes), align: 0 + Segment part 75. Intra module refs: osal_msg_push::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_push 0001609D + XSTACK = 00000009 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000160CB - 00016137 (0x6d bytes), align: 0 + Segment part 77. Intra module refs: osal_msg_extract::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_extract 000160CB + XSTACK = 00000010 ( 0000000B ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016138 - 0001613A (0x3 bytes), align: 0 + Segment part 79. Intra module refs: osal_msg_enqueue_push + LOCAL ADDRESS + ===== ======= + ?Subroutine22 00016138 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001613B - 0001613D (0x3 bytes), align: 0 + Segment part 80. Intra module refs: ?Subroutine22 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001613E - 00016142 (0x5 bytes), align: 0 + Segment part 81. Intra module refs: Segment part 80 + osal_msg_enqueue + osal_msg_extract + osal_msg_push + osal_msg_receive + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016143 - 00016146 (0x4 bytes), align: 0 + Segment part 82. Intra module refs: osal_msg_extract + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine17 00016143 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016147 - 0001614C (0x6 bytes), align: 0 + Segment part 83. Intra module refs: ?Subroutine17 + Segment part 69 + LOCAL ADDRESS + ===== ======= + ?Subroutine27 00016147 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001614D - 00016152 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: osal_msg_enqueue + osal_msg_extract + osal_msg_push + LOCAL ADDRESS + ===== ======= + ?Subroutine14 0001614D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016153 - 00016191 (0x3f bytes), align: 0 + Segment part 87. Intra module refs: osal_set_event::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_set_event 00016153 + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016192 - 000161C6 (0x35 bytes), align: 0 + Segment part 89. Intra module refs: osal_clear_event::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_clear_event 00016192 + XSTACK = 0000000E ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000161C7 - 000161D8 (0x12 bytes), align: 0 + Segment part 95. Intra module refs: osal_int_disable::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_int_disable 000161C7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000161D9 - 000161F7 (0x1f bytes), align: 0 + Segment part 97. Intra module refs: osal_init_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_init_system 000161D9 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000161F8 - 00016200 (0x9 bytes), align: 0 + Segment part 99. Intra module refs: osal_start_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_system 000161F8 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00016201 - 00016299 (0x99 bytes), align: 0 + Segment part 101. Intra module refs: osal_run_system::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_run_system 00016201 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001629A - 000162A2 (0x9 bytes), align: 0 + Segment part 103. Intra module refs: osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine20 0001629A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000162A3 - 000162B6 (0x14 bytes), align: 0 + Segment part 104. Intra module refs: osal_clear_event + osal_run_system + LOCAL ADDRESS + ===== ======= + ?Subroutine18 000162A3 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000162B7 - 000162BA (0x4 bytes), align: 0 + Segment part 105. Intra module refs: osal_msg_enqueue + LOCAL ADDRESS + ===== ======= + ?Subroutine8 000162B7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000162BB - 000162C2 (0x8 bytes), align: 0 + Segment part 106. Intra module refs: ?Subroutine8 + osal_msg_enqueue_push + osal_run_system + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000162C3 - 000162F0 (0x2e bytes), align: 0 + Segment part 114. Intra module refs: osal_isbufset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_isbufset 000162C3 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000239 - 00000239 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: activeTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001095 - 0000109A (0x6 bytes), align: 0 + Segment part 17. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_strlen::?relay 00001095 GATTServApp_ReadAttr (gattservapp) + Segment part 63 (gapgattserver) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000109B - 000010A0 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: osal_memdup + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcpy::?relay 0000109B ?Subroutine1 (gpsservice) + ?Subroutine13 (wimu) + ?Subroutine2 (peripheral) + ?Subroutine9 (wimu) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + DevInfo_SetParameter (devinfoservice) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_ReadAttr (gattservapp) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + Segment part 145 (att_util) + Segment part 22 (gap_linkmgr) + Segment part 29 (sm_mgr) + Segment part 34 (sm_rsppairing) + Segment part 47 (hci_event) + Segment part 48 (sm_rsppairing) + Segment part 52 (smp) + Segment part 58 (gapgattserver) + Segment part 58 (gatt_server) + Segment part 68 (gattservapp) + Segment part 68 (sm_pairing) + Segment part 73 (gap_peridevmgr) + Segment part 75 (gap_configmgr) + Segment part 75 (gap_linkmgr) + Segment part 77 (sm_mgr) + Segment part 85 (gapbondmgr) + battReadAttrCB (battservice) + devInfo_ReadAttrCB (devinfoservice) + gattNotifyEvent (gatt_task) + gattServApp_ProcessPrepareWriteReq (gattservapp) + linkDB_Add (linkdb) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010A1 - 000010A6 (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_revmemcpy::?relay + 000010A1 Segment part 58 (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010A7 - 000010AC (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memdup::?relay 000010A7 GAP_Bond (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010AD - 000010B2 (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memcmp::?relay 000010AD ATT_CompareUUID (att_util) + GAPBondMgr_ResolveAddr (gapbondmgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 16 (sm_rsppairing) + gapBondMgrFindAddr (gapbondmgr) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + smpResponderProcessPairingRandom (sm_rsppairing) + verifyWordM (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010B3 - 000010B8 (0x6 bytes), align: 0 + Segment part 29. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_memset::?relay 000010B3 ?Subroutine25 (gapbondmgr) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_ParamsInit (gap_configmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_ReadAttr (gattservapp) + GGS_SetParameter (gapgattserver) + LL_ConnectionCompleteCback (hci_event) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 47 (sm_mgr) + Segment part 88 (gap_linkmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gattNotifyEvent (gatt_task) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + generate_subkey (sm_mgr) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + linkDB_Remove (linkdb) + osalInitTasks (OSAL_WIMU) + osal_CbTimerInit (osal_cbtimer) + sendEstLinkEvent (gap_linkmgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSetPairingReqRsp (sm_pairing) + sm_CMAC (sm_mgr) + sm_c1new (sm_mgr) + smpResponderProcessPairingReq (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010B9 - 000010BE (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_rand::?relay 000010B9 smGenerateRandBuf (sm_mgr) + smResponderSendNextKeyInfo (sm_rsppairing) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010BF - 000010C4 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_allocate::?relay + 000010BF GATTServApp_SendCCCUpdatedEvent (gattservapp) + HCI_CommandCompleteEvent (hci_event) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_SendCommandCompleteEvent (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + OnBoard_SendKeys (OnBoard) + Segment part 135 (hci_event) + Segment part 145 (hci_event) + Segment part 60 (gap_linkmgr) + Segment part 69 (gap_configmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + l2capEncapSendData (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + sendAuthEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010C5 - 000010CA (0x6 bytes), align: 0 + Segment part 51. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_deallocate::?relay + 000010C5 GAPBondMgr_ProcessEvent (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GATTServApp_ProcessEvent (gattservapp) + GATT_ProcessEvent (gatt_task) + HCI_ProcessEvent (hci_tl) + Hal_ProcessEvent (hal_drivers) + L2CAP_ProcessEvent (l2cap_task) + SM_ProcessEvent (sm_task) + WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010CB - 000010D0 (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_send::?relay 000010CB GAP_ProcessEvent (gap_task) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + HCI_CommandCompleteEvent (hci_event) + LL_RxDataCompleteCback (hci_data) + OnBoard_SendKeys (OnBoard) + SM_ProcessEvent (sm_task) + Segment part 143 (hci_event) + Segment part 30 (hci_event) + Segment part 87 (gap_peridevmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + l2capEncapSendData (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smProcessRandComplete (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010D1 - 000010D6 (0x6 bytes), align: 0 + Segment part 58. Intra module refs: ?Subroutine1 + LOCAL ADDRESS + ===== ======= + osal_msg_enqueue_push::?relay + 000010D1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010D7 - 000010DC (0x6 bytes), align: 0 + Segment part 61. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_receive::?relay + 000010D7 GAPBondMgr_ProcessEvent (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GATTServApp_ProcessEvent (gattservapp) + GATT_ProcessEvent (gatt_task) + HCI_ProcessEvent (hci_tl) + Hal_ProcessEvent (hal_drivers) + L2CAP_ProcessEvent (l2cap_task) + SM_ProcessEvent (sm_task) + WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010DD - 000010E2 (0x6 bytes), align: 0 + Segment part 66. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_enqueue::?relay + 000010DD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010E3 - 000010E8 (0x6 bytes), align: 0 + Segment part 76. Intra module refs: osal_msg_enqueue_push + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_push::?relay 000010E3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010E9 - 000010EE (0x6 bytes), align: 0 + Segment part 78. Intra module refs: osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_msg_extract::?relay + 000010E9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010EF - 000010F4 (0x6 bytes), align: 0 + Segment part 88. Intra module refs: osal_msg_enqueue_push + osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_set_event::?relay + 000010EF ?Subroutine17 (peripheral) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + HalKeyConfig (hal_key) + LL_Init (ll) + RF_NormalIsr (ll_isr) + Segment part 72 (ll_advEndCauses) + WIMU_Init (wimu) + gapIncSignCounter (gap_configmgr) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osalTimerUpdate (OSAL_Timers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010F5 - 000010FA (0x6 bytes), align: 0 + Segment part 90. Intra module refs: osal_msg_receive + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_clear_event::?relay + 000010F5 LL_SetAdvControl (ll) + llT2OVFC1_ISR (ll_isr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000010FB - 00001100 (0x6 bytes), align: 0 + Segment part 96. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_int_disable::?relay + 000010FB InitBoard (OnBoard) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001101 - 00001106 (0x6 bytes), align: 0 + Segment part 98. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_init_system::?relay + 00001101 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001107 - 0000110C (0x6 bytes), align: 0 + Segment part 100. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_system::?relay + 00001107 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000110D - 00001112 (0x6 bytes), align: 0 + Segment part 102. Intra module refs: osal_start_system + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_run_system::?relay + 0000110D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001113 - 00001118 (0x6 bytes), align: 0 + Segment part 115. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_isbufset::?relay 00001113 GAP_SecParamsInit (gap_configmgr) + Segment part 72 (gapbondmgr) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_ClockBLE.r51 + PROGRAM MODULE, NAME : OSAL_ClockBLE + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007F1 - 000007F2 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + previousLLTimerTick 000007F1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F3 - 000007F4 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + remUsTicks 000007F3 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F5 - 000007F6 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine4 + osalTimeUpdate + LOCAL ADDRESS + ===== ======= + timeMSec 000007F5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007F7 - 000007FA (0x4 bytes), align: 0 + Segment part 9. Intra module refs: osalTimeUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + OSAL_timeSeconds 000007F7 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A887 - 0001A970 (0xea bytes), align: 0 + Segment part 13. Intra module refs: osalTimeUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimeUpdate 0001A887 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A971 - 0001A97D (0xd bytes), align: 0 + Segment part 15. Intra module refs: osalTimeUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine4 0001A971 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001119 - 0000111E (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimeUpdate::?relay + 00001119 llScheduleTask (ll_scheduler) + osal_run_system (OSAL) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Memory.r51 + PROGRAM MODULE, NAME : OSAL_Memory + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_N) + Relative segment, address: XDATA 0000104D - 00001434 (0x3e8 bytes), align: 0 + Segment part 7. Intra module refs: osal_mem_alloc + osal_mem_init + LOCAL ADDRESS + ===== ======= + theHeap 0000104D + ------------------------------------------------------------------------- + 1 (was XDATA_N) + Relative segment, address: XDATA 00001435 - 00001436 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: osal_mem_alloc + osal_mem_free + osal_mem_init + osal_mem_kick + LOCAL ADDRESS + ===== ======= + ff1 00001435 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000007FB - 000007FB (0x1 bytes), align: 0 + Segment part 9. Intra module refs: osal_mem_alloc + osal_mem_kick + LOCAL ADDRESS + ===== ======= + osalMemStat 000007FB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A018 - 0001A046 (0x2f bytes), align: 0 + Segment part 10. Intra module refs: osal_mem_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_init 0001A018 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A047 - 0001A04D (0x7 bytes), align: 0 + Segment part 12. Intra module refs: osal_mem_free + osal_mem_init + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A047 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A04E - 0001A081 (0x34 bytes), align: 0 + Segment part 13. Intra module refs: osal_mem_kick::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_kick 0001A04E + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A082 - 0001A1CE (0x14d bytes), align: 0 + Segment part 15. Intra module refs: osal_mem_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_alloc 0001A082 + XSTACK = 0000000A ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A1CF - 0001A208 (0x3a bytes), align: 0 + Segment part 17. Intra module refs: osal_mem_free::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_free 0001A1CF + XSTACK = 0000000A ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000111F - 00001124 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_init::?relay 0000111F osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001125 - 0000112A (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_kick::?relay 00001125 osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000112B - 00001130 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: osal_mem_kick + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_alloc::?relay + 0000112B GAP_Authenticate (gap_linkmgr) + GAP_MakeDiscoverable (gap_peridevmgr) + GATTServApp_RegisterService (gattservapp) + GATT_RegisterService (gatt_server) + LL_RxReqDataBufCback (hci_data) + SM_StartPairing (sm_pairing) + Segment part 102 (gap_linkmgr) + Segment part 26 (sm_mgr) + Segment part 65 (sm_rsppairing) + Segment part 75 (gap_peridevmgr) + Segment part 76 (gap_peridevmgr) + Segment part 85 (sm_mgr) + gattServApp_SetNumPrepareWrites (gattservapp) + osalAddTimer (OSAL_Timers) + osalInitTasks (OSAL_WIMU) + osal_bm_alloc (osal_bufmgr) + osal_memdup (OSAL) + osal_msg_allocate (OSAL) + smSavePairInfo (sm_pairing) + sm_CMAC (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001131 - 00001136 (0x6 bytes), align: 0 + Segment part 18. Intra module refs: osal_mem_kick + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_mem_free::?relay 00001131 GAP_Bond (gap_linkmgr) + LL_RxDataCompleteCback (hci_data) + SM_GenerateAuthenSig (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 81 (gap_linkmgr) + Segment part 91 (gap_peridevmgr) + gapFreeAuthLink (gap_linkmgr) + gapPairingCompleteCB (gap_linkmgr) + gattServApp_SetNumPrepareWrites (gattservapp) + generate_subkey (sm_mgr) + linkDB_Remove (linkdb) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osalTimerUpdate (OSAL_Timers) + osal_bm_free (osal_bufmgr) + osal_msg_deallocate (OSAL) + smFreePairingParams (sm_pairing) + smProcessRandComplete (sm_mgr) + sm_CMAC (sm_mgr) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_PwrMgr.r51 + PROGRAM MODULE, NAME : OSAL_PwrMgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000007FC - 00000802 (0x7 bytes), align: 0 + Segment part 6. Intra module refs: osal_pwrmgr_device + osal_pwrmgr_init + osal_pwrmgr_task_state + ENTRY ADDRESS REF BY + ===== ======= ====== + pwrmgr_attribute 000007FC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF01 - 0001AF0E (0xe bytes), align: 0 + Segment part 7. Intra module refs: osal_pwrmgr_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_init 0001AF01 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF0F - 0001AF16 (0x8 bytes), align: 0 + Segment part 9. Intra module refs: osal_pwrmgr_device + osal_pwrmgr_init + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001AF0F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF17 - 0001AF20 (0xa bytes), align: 0 + Segment part 10. Intra module refs: osal_pwrmgr_device::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_device 0001AF17 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF21 - 0001AF6A (0x4a bytes), align: 0 + Segment part 12. Intra module refs: osal_pwrmgr_task_state::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_task_state + 0001AF21 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001137 - 0000113C (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_init::?relay + 00001137 osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000113D - 00001142 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_device::?relay + 0000113D LL_ProcessEvent (ll) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001143 - 00001148 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_pwrmgr_task_state::?relay + 00001143 LL_Init (ll) + LL_ProcessEvent (ll) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Timers.r51 + PROGRAM MODULE, NAME : OSAL_Timers + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000803 - 00000804 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: osalAddTimer + osalFindTimer + osalTimerUpdate + ENTRY ADDRESS REF BY + ===== ======= ====== + timerHead 00000803 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000805 - 00000808 (0x4 bytes), align: 0 + Segment part 8. Intra module refs: osalTimerInit + osalTimerUpdate + LOCAL ADDRESS + ===== ======= + osal_systemClock 00000805 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018000 - 00018012 (0x13 bytes), align: 0 + Segment part 10. Intra module refs: osalTimerInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerInit 00018000 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018013 - 000180D6 (0xc4 bytes), align: 0 + Segment part 12. Intra module refs: osalAddTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalAddTimer 00018013 + calls direct + XSTACK = 00000012 ( 00000012 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000180D7 - 00018115 (0x3f bytes), align: 0 + Segment part 14. Intra module refs: osalFindTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalFindTimer 000180D7 + XSTACK = 00000012 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018116 - 0001812B (0x16 bytes), align: 0 + Segment part 16. Intra module refs: osalDeleteTimer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalDeleteTimer 00018116 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001812C - 00018132 (0x7 bytes), align: 0 + Segment part 18. Intra module refs: osalDeleteTimer + osalFindTimer + osalTimerInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001812C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018133 - 00018166 (0x34 bytes), align: 0 + Segment part 19. Intra module refs: osal_start_timerEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_timerEx 00018133 + calls direct + XSTACK = 00000004 ( 00000010 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018167 - 0001816B (0x5 bytes), align: 0 + Segment part 21. Intra module refs: osal_start_timerEx + osal_stop_timerEx + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00018167 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001816C - 000181B3 (0x48 bytes), align: 0 + Segment part 22. Intra module refs: osal_start_reload_timer::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_reload_timer + 0001816C + calls direct + XSTACK = 00000004 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000181B4 - 000181B8 (0x5 bytes), align: 0 + Segment part 24. Intra module refs: osal_get_timeoutEx + osal_start_reload_timer + LOCAL ADDRESS + ===== ======= + ?Subroutine2 000181B4 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000181B9 - 000181EA (0x32 bytes), align: 0 + Segment part 25. Intra module refs: osal_stop_timerEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_stop_timerEx 000181B9 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000181EB - 00018221 (0x37 bytes), align: 0 + Segment part 27. Intra module refs: osal_get_timeoutEx::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_get_timeoutEx 000181EB + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018222 - 00018426 (0x205 bytes), align: 0 + Segment part 31. Intra module refs: osalTimerUpdate::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerUpdate 00018222 + calls direct + XSTACK = 00000000 ( 0000001D ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018427 - 0001842C (0x6 bytes), align: 0 + Segment part 33. Intra module refs: osalTimerUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00018427 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001842D - 00018434 (0x8 bytes), align: 0 + Segment part 34. Intra module refs: ?Subroutine3 + osalAddTimer + osalTimerUpdate + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F4B - 00008F4E (0x4 bytes), align: 0 + Segment part 9. Intra module refs: GAPRole_Init (peripheral) + WIMU_Init (wimu) + _formatted_write (?largewr) + float_conversion (?largewr) + llAllocConnId (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + osalAddTimer + osalTimerInit + osalTimerUpdate + osal_get_timeoutEx + setXferPage (osal_snv) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_0 00008F4B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001149 - 0000114E (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerInit::?relay 00001149 osal_init_system (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000114F - 00001154 (0x6 bytes), align: 0 + Segment part 13. Intra module refs: osal_start_reload_timer + osal_start_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalAddTimer::?relay 0000114F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001155 - 0000115A (0x6 bytes), align: 0 + Segment part 15. Intra module refs: osalAddTimer + osal_get_timeoutEx + osal_stop_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalFindTimer::?relay 00001155 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000115B - 00001160 (0x6 bytes), align: 0 + Segment part 17. Intra module refs: osal_stop_timerEx + ENTRY ADDRESS REF BY + ===== ======= ====== + osalDeleteTimer::?relay + 0000115B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001161 - 00001166 (0x6 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_timerEx::?relay + 00001161 Hal_ProcessEvent (hal_drivers) + LL_ProcessEvent (ll) + Segment part 99 (peripheral) + WIMU_ProcessEvent (wimu) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + halProcessKeyInterrupt (hal_key) + llScheduleTask (ll_scheduler) + osal_CbTimerStart (osal_cbtimer) + smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001167 - 0000116C (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_start_reload_timer::?relay + 00001167 GAP_MakeDiscoverable (gap_peridevmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000116D - 00001172 (0x6 bytes), align: 0 + Segment part 26. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_stop_timerEx::?relay + 0000116D GAP_EndDiscoverable (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + HalKeyConfig (hal_key) + LL_SetAdvControl (ll) + Segment part 55 (peripheral) + Segment part 58 (gap_peridevmgr) + llT2OVFC1_ISR (ll_isr) + osal_CbTimerStop (osal_cbtimer) + smStopRspTimer (sm_mgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001173 - 00001178 (0x6 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_get_timeoutEx::?relay + 00001173 GAPRole_SetParameter (peripheral) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001179 - 0000117E (0x6 bytes), align: 0 + Segment part 32. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalTimerUpdate::?relay + 00001179 osalTimeUpdate (OSAL_ClockBLE) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F4B - 00008F4E (0x4 bytes), align: 0 + Segment part 37. Intra module refs: __Constant_0 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_WIMU.r51 + PROGRAM MODULE, NAME : OSAL_WIMU + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008E67 - 00008E7E (0x18 bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksArr 00008E67 osal_run_system (OSAL) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE4 - 00008FE4 (0x1 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksCnt 00008FE4 osal_clear_event (OSAL) + osal_msg_enqueue_push (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_run_system (OSAL) + osal_set_event (OSAL) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000809 - 0000080A (0x2 bytes), align: 0 + Segment part 8. Intra module refs: osalInitTasks + ENTRY ADDRESS REF BY + ===== ======= ====== + tasksEvents 00000809 ?Subroutine18 (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AF6B - 0001AFC9 (0x5f bytes), align: 0 + Segment part 9. Intra module refs: osalInitTasks::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osalInitTasks 0001AF6B + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000117F - 00001184 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + osalInitTasks::?relay 0000117F osal_init_system (OSAL) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008E67 - 00008E7E (0x18 bytes), align: 0 + Segment part 11. Intra module refs: tasksArr + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE4 - 00008FE4 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: tasksCnt + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OnBoard.r51 + PROGRAM MODULE, NAME : OnBoard + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000080B - 0000080B (0x1 bytes), align: 0 + Segment part 7. Intra module refs: InitBoard + OnBoard_KeyCallback + ENTRY ADDRESS REF BY + ===== ======= ====== + OnboardKeyIntEnable 0000080B + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DC8 - 00000DC8 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: OnBoard_SendKeys + LOCAL ADDRESS + ===== ======= + registeredKeysTaskID 00000DC8 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA61 - 0001AA7E (0x1e bytes), align: 0 + Segment part 10. Intra module refs: InitBoard::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + InitBoard 0001AA61 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA7F - 0001AA83 (0x5 bytes), align: 0 + Segment part 12. Intra module refs: InitBoard + OnBoard_KeyCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001AA7F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA84 - 0001AAAB (0x28 bytes), align: 0 + Segment part 13. Intra module refs: Onboard_rand::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Onboard_rand 0001AA84 + calls direct + XSTACK = 00000000 ( 00000002 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAAC - 0001AAB2 (0x7 bytes), align: 0 + Segment part 15. Intra module refs: Onboard_rand + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001AAAC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAB3 - 0001AAF4 (0x42 bytes), align: 0 + Segment part 20. Intra module refs: OnBoard_SendKeys::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_SendKeys 0001AAB3 + calls direct + XSTACK = 00000009 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AAF5 - 0001AB33 (0x3f bytes), align: 0 + Segment part 22. Intra module refs: OnBoard_KeyCallback::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_KeyCallback 0001AAF5 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AB34 - 0001AB3D (0xa bytes), align: 0 + Segment part 24. Intra module refs: InitBoard + OnBoard_KeyCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001AB34 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023A - 0000023A (0x1 bytes), align: 0 + Segment part 9. Intra module refs: registeredKeysTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001185 - 0000118A (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + InitBoard::?relay 00001185 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000118B - 00001190 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + Onboard_rand::?relay 0000118B osal_rand (OSAL) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001191 - 00001196 (0x6 bytes), align: 0 + Segment part 21. Intra module refs: OnBoard_KeyCallback + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_SendKeys::?relay + 00001191 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001197 - 0000119C (0x6 bytes), align: 0 + Segment part 23. Intra module refs: ?Subroutine2 + ENTRY ADDRESS REF BY + ===== ======= ====== + OnBoard_KeyCallback::?relay + 00001197 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\WIMU_Main.r51 + PROGRAM MODULE, NAME : WIMU_Main + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000009D - 0000009D (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: main + ENTRY ADDRESS REF BY + ===== ======= ====== + SLEEPSTA 0000009D + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009E - 0000009E (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: llSetFreqTune (ll_common) + main + ENTRY ADDRESS REF BY + ===== ======= ====== + CLKCONSTA 0000009E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B020 - 0001B072 (0x53 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + main 0001B020 ?call_main (?cmain) + calls direct + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\actimetryservice.r51 + PROGRAM MODULE, NAME : actimetryservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDA - 00008FDB (0x2 bytes), align: 0 + Segment part 6. Intra module refs: actimetryService + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryServUUID 00008FDA + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD8 - 00008FD9 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 31 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryImuUUID 00008FD8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD6 - 00008FD7 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 31 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryQuaternionUUID + 00008FD6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAE - 00008FAF (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 31 + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryCfgUUID 00008FAE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000080C - 0000080D (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Actimetry_WriteAttrCB + LOCAL ADDRESS + ===== ======= + Actimetry_AppCBs 0000080C + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F97 - 00008F99 (0x3 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryService 00008F97 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DC9 - 00000DC9 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryImuProps 00000DC9 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000080E - 00000821 (0x14 bytes), align: 0 + Segment part 14. Intra module refs: Actimetry_SetParameter + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryImu 0000080E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000822 - 00000827 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: Actimetry_HandleConnStatusCB + Actimetry_SetParameter + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryImuConfig 00000822 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DCA - 00000DDC (0x13 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryImuUserDesp 00000DCA + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DDD - 00000DDD (0x1 bytes), align: 0 + Segment part 18. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionProps + 00000DDD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000828 - 00000837 (0x10 bytes), align: 0 + Segment part 20. Intra module refs: Actimetry_SetParameter + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryQuaternion 00000828 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000838 - 0000083D (0x6 bytes), align: 0 + Segment part 21. Intra module refs: Actimetry_HandleConnStatusCB + Actimetry_SetParameter + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionConfig + 00000838 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DDE - 00000DF7 (0x1a bytes), align: 0 + Segment part 22. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryQuaternionUserDesp + 00000DDE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DF8 - 00000DF8 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryCfgProps 00000DF8 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000083E - 0000083E (0x1 bytes), align: 0 + Segment part 26. Intra module refs: Actimetry_SetParameter + Actimetry_WriteAttrCB + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryCfg 0000083E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000083F - 00000844 (0x6 bytes), align: 0 + Segment part 27. Intra module refs: Actimetry_HandleConnStatusCB + Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryCfgConfig 0000083F + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000DF9 - 00000E0A (0x12 bytes), align: 0 + Segment part 28. Intra module refs: Segment part 31 + LOCAL ADDRESS + ===== ======= + actimetryCfgUserDesp 00000DF9 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E0B - 00000E72 (0x68 bytes), align: 0 + Segment part 30. Intra module refs: Actimetry_AddService + Actimetry_SetParameter + LOCAL ADDRESS + ===== ======= + sensorActimetryAttrTbl + 00000E0B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008ED5 - 00008EDA (0x6 bytes), align: 0 + Segment part 32. Intra module refs: Actimetry_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + actimetryCBs 00008ED5 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017A80 - 00017AC7 (0x48 bytes), align: 0 + Segment part 33. Intra module refs: Actimetry_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_AddService 00017A80 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017AC8 - 00017BD0 (0x109 bytes), align: 0 + Segment part 37. Intra module refs: Actimetry_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_SetParameter + 00017AC8 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017BD1 - 00017D26 (0x156 bytes), align: 0 + Segment part 41. Intra module refs: Actimetry_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_ReadAttrCB 00017BD1 + calls direct, is indirectly called + XSTACK = 00000006 ( 00000018 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017D27 - 00017E72 (0x14c bytes), align: 0 + Segment part 43. Intra module refs: Actimetry_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_WriteAttrCB 00017D27 + calls direct, is indirectly called + XSTACK = 00000004 ( 0000001C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017E73 - 00017EC5 (0x53 bytes), align: 0 + Segment part 45. Intra module refs: Actimetry_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + Actimetry_HandleConnStatusCB + 00017E73 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023B - 0000023B (0x1 bytes), align: 0 + Segment part 13. Intra module refs: actimetryImuProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000023C - 0000024E (0x13 bytes), align: 0 + Segment part 17. Intra module refs: actimetryImuUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000024F - 0000024F (0x1 bytes), align: 0 + Segment part 19. Intra module refs: actimetryQuaternionProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000250 - 00000269 (0x1a bytes), align: 0 + Segment part 23. Intra module refs: actimetryQuaternionUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000026A - 0000026A (0x1 bytes), align: 0 + Segment part 25. Intra module refs: actimetryCfgProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000026B - 0000027C (0x12 bytes), align: 0 + Segment part 29. Intra module refs: actimetryCfgUserDesp + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000027D - 000002E4 (0x68 bytes), align: 0 + Segment part 31. Intra module refs: sensorActimetryAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000119D - 000011A2 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_AddService::?relay + 0000119D WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011A3 - 000011A8 (0x6 bytes), align: 0 + Segment part 38. + ENTRY ADDRESS REF BY + ===== ======= ====== + Actimetry_SetParameter::?relay + 000011A3 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011A9 - 000011AE (0x6 bytes), align: 0 + Segment part 42. Intra module refs: actimetryCBs + LOCAL ADDRESS + ===== ======= + Actimetry_ReadAttrCB::?relay + 000011A9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011AF - 000011B4 (0x6 bytes), align: 0 + Segment part 44. Intra module refs: actimetryCBs + LOCAL ADDRESS + ===== ======= + Actimetry_WriteAttrCB::?relay + 000011AF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011B5 - 000011BA (0x6 bytes), align: 0 + Segment part 46. Intra module refs: Actimetry_AddService + LOCAL ADDRESS + ===== ======= + Actimetry_HandleConnStatusCB::?relay + 000011B5 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDA - 00008FDB (0x2 bytes), align: 0 + Segment part 47. Intra module refs: actimetryServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD8 - 00008FD9 (0x2 bytes), align: 0 + Segment part 48. Intra module refs: actimetryImuUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD6 - 00008FD7 (0x2 bytes), align: 0 + Segment part 49. Intra module refs: actimetryQuaternionUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAE - 00008FAF (0x2 bytes), align: 0 + Segment part 50. Intra module refs: actimetryCfgUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F97 - 00008F99 (0x3 bytes), align: 0 + Segment part 51. Intra module refs: actimetryService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008ED5 - 00008EDA (0x6 bytes), align: 0 + Segment part 52. Intra module refs: actimetryCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\battservice.r51 + PROGRAM MODULE, NAME : battservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAA - 00008FAB (0x2 bytes), align: 0 + Segment part 6. Intra module refs: battService + ENTRY ADDRESS REF BY + ===== ======= ====== + battServUUID 00008FAA + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE2 - 00008FE3 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 15 + ENTRY ADDRESS REF BY + ===== ======= ====== + battLevelUUID 00008FE2 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F9A - 00008F9C (0x3 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + battService 00008F9A + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E73 - 00000E73 (0x1 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevelProps 00000E73 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000845 - 00000845 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Batt_SetParameter + Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevel 00000845 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000846 - 0000084B (0x6 bytes), align: 0 + Segment part 13. Intra module refs: Batt_AddService + Segment part 15 + LOCAL ADDRESS + ===== ======= + battLevelClientCharCfg + 00000846 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E74 - 00000E93 (0x20 bytes), align: 0 + Segment part 14. Intra module refs: Batt_AddService + LOCAL ADDRESS + ===== ======= + battAttrTbl 00000E74 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EDB - 00008EE0 (0x6 bytes), align: 0 + Segment part 16. Intra module refs: Batt_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + battCBs 00008EDB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A97E - 0001A9AD (0x30 bytes), align: 0 + Segment part 17. Intra module refs: Batt_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_AddService 0001A97E + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A9AE - 0001A9B4 (0x7 bytes), align: 0 + Segment part 21. Intra module refs: Batt_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A9AE + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A9B5 - 0001A9D5 (0x21 bytes), align: 0 + Segment part 22. Intra module refs: Batt_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_SetParameter 0001A9B5 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A9D6 - 0001AA55 (0x80 bytes), align: 0 + Segment part 26. Intra module refs: battReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + battReadAttrCB 0001A9D6 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA56 - 0001AA5B (0x6 bytes), align: 0 + Segment part 28. Intra module refs: battReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001AA56 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AA5C - 0001AA60 (0x5 bytes), align: 0 + Segment part 29. Intra module refs: battWriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + battWriteAttrCB 0001AA5C + is indirectly called + XSTACK = 00000004 ( 00000000 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000002E5 - 000002E5 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: battLevelProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000002E6 - 00000305 (0x20 bytes), align: 0 + Segment part 15. Intra module refs: battAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011BB - 000011C0 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_AddService::?relay + 000011BB WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011C1 - 000011C6 (0x6 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + Batt_SetParameter::?relay + 000011C1 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011C7 - 000011CC (0x6 bytes), align: 0 + Segment part 27. Intra module refs: battCBs + LOCAL ADDRESS + ===== ======= + battReadAttrCB::?relay + 000011C7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011CD - 000011D2 (0x6 bytes), align: 0 + Segment part 30. Intra module refs: battCBs + LOCAL ADDRESS + ===== ======= + battWriteAttrCB::?relay + 000011CD + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAA - 00008FAB (0x2 bytes), align: 0 + Segment part 33. Intra module refs: battServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE2 - 00008FE3 (0x2 bytes), align: 0 + Segment part 34. Intra module refs: battLevelUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F9A - 00008F9C (0x3 bytes), align: 0 + Segment part 35. Intra module refs: battService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EDB - 00008EE0 (0x6 bytes), align: 0 + Segment part 36. Intra module refs: battCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\devinfoservice.r51 + PROGRAM MODULE, NAME : devinfoservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA6 - 00008FA7 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: devInfoService + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoServUUID 00008FA6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA4 - 00008FA5 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSystemIdUUID 00008FA4 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA2 - 00008FA3 (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoModelNumberUUID + 00008FA2 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FE0 - 00008FE1 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSerialNumberUUID + 00008FE0 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDC - 00008FDD (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoFirmwareRevUUID + 00008FDC + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD4 - 00008FD5 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoHardwareRevUUID + 00008FD4 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB8 - 00008FB9 (0x2 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoSoftwareRevUUID + 00008FB8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FAC - 00008FAD (0x2 bytes), align: 0 + Segment part 13. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoMfrNameUUID 00008FAC + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA8 - 00008FA9 (0x2 bytes), align: 0 + Segment part 14. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfo11073CertUUID 00008FA8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FA0 - 00008FA1 (0x2 bytes), align: 0 + Segment part 15. Intra module refs: Segment part 46 + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoPnpIdUUID 00008FA0 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F9D - 00008F9F (0x3 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoService 00008F9D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E94 - 00000E94 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSystemIdProps 00000E94 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000084C - 00000853 (0x8 bytes), align: 0 + Segment part 19. Intra module refs: DevInfo_SetParameter + Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoSystemId 0000084C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E95 - 00000E95 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoModelNumberProps + 00000E95 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EF9 - 00008EFE (0x6 bytes), align: 0 + Segment part 22. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoModelNumber 00008EF9 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E96 - 00000E96 (0x1 bytes), align: 0 + Segment part 23. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSerialNumberProps + 00000E96 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000854 - 00000857 (0x4 bytes), align: 0 + Segment part 25. Intra module refs: DevInfo_SetParameter + Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoSerialNumber 00000854 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E97 - 00000E97 (0x1 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoFirmwareRevProps + 00000E97 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000858 - 00000874 (0x1d bytes), align: 0 + Segment part 28. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoFirmwareRev 00000858 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E98 - 00000E98 (0x1 bytes), align: 0 + Segment part 29. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoHardwareRevProps + 00000E98 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000875 - 00000876 (0x2 bytes), align: 0 + Segment part 31. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoHardwareRev 00000875 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E99 - 00000E99 (0x1 bytes), align: 0 + Segment part 32. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSoftwareRevProps + 00000E99 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000877 - 00000893 (0x1d bytes), align: 0 + Segment part 34. Intra module refs: DevInfo_SetParameter + Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoSoftwareRev 00000877 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E9A - 00000E9A (0x1 bytes), align: 0 + Segment part 35. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoMfrNameProps 00000E9A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F05 - 00008F09 (0x5 bytes), align: 0 + Segment part 37. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoMfrName 00008F05 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E9B - 00000E9B (0x1 bytes), align: 0 + Segment part 38. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfo11073CertProps 00000E9B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EAF - 00008EBC (0xe bytes), align: 0 + Segment part 40. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfo11073Cert 00008EAF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E9C - 00000E9C (0x1 bytes), align: 0 + Segment part 41. Intra module refs: Segment part 46 + LOCAL ADDRESS + ===== ======= + devInfoPnpIdProps 00000E9C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000E9D - 00000EA3 (0x7 bytes), align: 0 + Segment part 43. Intra module refs: Segment part 46 + devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + devInfoPnpId 00000E9D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000EA4 - 00000F3B (0x98 bytes), align: 0 + Segment part 45. Intra module refs: DevInfo_AddService + LOCAL ADDRESS + ===== ======= + devInfoAttrTbl 00000EA4 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EED - 00008EF2 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: DevInfo_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + devInfoCBs 00008EED + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000192A4 - 000192C3 (0x20 bytes), align: 0 + Segment part 48. Intra module refs: DevInfo_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_AddService 000192A4 + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000192C4 - 000192C8 (0x5 bytes), align: 0 + Segment part 50. Intra module refs: DevInfo_AddService + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000192C4 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000192C9 - 00019330 (0x68 bytes), align: 0 + Segment part 51. Intra module refs: DevInfo_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_SetParameter 000192C9 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019331 - 000195BB (0x28b bytes), align: 0 + Segment part 55. Intra module refs: devInfo_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + devInfo_ReadAttrCB 00019331 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195BC - 000195C4 (0x9 bytes), align: 0 + Segment part 57. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine3 000195BC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195C5 - 000195CD (0x9 bytes), align: 0 + Segment part 58. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 000195C5 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000195CE - 000195D9 (0xc bytes), align: 0 + Segment part 59. Intra module refs: devInfo_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 000195CE + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000306 - 00000306 (0x1 bytes), align: 0 + Segment part 18. Intra module refs: devInfoSystemIdProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000307 - 00000307 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: devInfoModelNumberProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000308 - 00000308 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: devInfoSerialNumberProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000309 - 00000309 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: devInfoFirmwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030A - 0000030A (0x1 bytes), align: 0 + Segment part 30. Intra module refs: devInfoHardwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030B - 0000030B (0x1 bytes), align: 0 + Segment part 33. Intra module refs: devInfoSoftwareRevProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030C - 0000030C (0x1 bytes), align: 0 + Segment part 36. Intra module refs: devInfoMfrNameProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030D - 0000030D (0x1 bytes), align: 0 + Segment part 39. Intra module refs: devInfo11073CertProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030E - 0000030E (0x1 bytes), align: 0 + Segment part 42. Intra module refs: devInfoPnpIdProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000030F - 00000315 (0x7 bytes), align: 0 + Segment part 44. Intra module refs: devInfoPnpId + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000316 - 000003AD (0x98 bytes), align: 0 + Segment part 46. Intra module refs: devInfoAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011D3 - 000011D8 (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_AddService::?relay + 000011D3 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011D9 - 000011DE (0x6 bytes), align: 0 + Segment part 52. + ENTRY ADDRESS REF BY + ===== ======= ====== + DevInfo_SetParameter::?relay + 000011D9 ?Subroutine15 (wimu) + WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011DF - 000011E4 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: devInfoCBs + LOCAL ADDRESS + ===== ======= + devInfo_ReadAttrCB::?relay + 000011DF + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA6 - 00008FA7 (0x2 bytes), align: 0 + Segment part 60. Intra module refs: devInfoServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA4 - 00008FA5 (0x2 bytes), align: 0 + Segment part 61. Intra module refs: devInfoSystemIdUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA2 - 00008FA3 (0x2 bytes), align: 0 + Segment part 62. Intra module refs: devInfoModelNumberUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FE0 - 00008FE1 (0x2 bytes), align: 0 + Segment part 63. Intra module refs: devInfoSerialNumberUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDC - 00008FDD (0x2 bytes), align: 0 + Segment part 64. Intra module refs: devInfoFirmwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD4 - 00008FD5 (0x2 bytes), align: 0 + Segment part 65. Intra module refs: devInfoHardwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB8 - 00008FB9 (0x2 bytes), align: 0 + Segment part 66. Intra module refs: devInfoSoftwareRevUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FAC - 00008FAD (0x2 bytes), align: 0 + Segment part 67. Intra module refs: devInfoMfrNameUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA8 - 00008FA9 (0x2 bytes), align: 0 + Segment part 68. Intra module refs: devInfo11073CertUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FA0 - 00008FA1 (0x2 bytes), align: 0 + Segment part 69. Intra module refs: devInfoPnpIdUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F9D - 00008F9F (0x3 bytes), align: 0 + Segment part 70. Intra module refs: devInfoService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EF9 - 00008EFE (0x6 bytes), align: 0 + Segment part 71. Intra module refs: devInfoModelNumber + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F05 - 00008F09 (0x5 bytes), align: 0 + Segment part 72. Intra module refs: devInfoMfrName + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EAF - 00008EBC (0xe bytes), align: 0 + Segment part 73. Intra module refs: devInfo11073Cert + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EED - 00008EF2 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: devInfoCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gap.r51 + PROGRAM MODULE, NAME : gap + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AFCA - 0001B01F (0x56 bytes), align: 0 + Segment part 6. Intra module refs: GAP_DeviceInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_DeviceInit 0001AFCA + calls direct + XSTACK = 00000004 ( 00000011 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011E5 - 000011EA (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAP_DeviceInit::?relay + 000011E5 GAPRole_StartDevice (peripheral) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gapbondmgr.r51 + PROGRAM MODULE, NAME : gapbondmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000894 - 00000894 (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAPBondMgr_Init + GAPBondMgr_LinkEst + GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_Register + gapBondMgrSendServiceChange + LOCAL ADDRESS + ===== ======= + gapBondMgr_TaskID 00000894 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F3C - 00000F3C (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBond_PairingMode 00000F3C + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F3D - 00000F3E (0x2 bytes), align: 0 + Segment part 10. Intra module refs: GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBond_InitiateWait 00000F3D + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000895 - 00000895 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_MITM 00000895 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000896 - 00000896 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_IOCap 00000896 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000897 - 00000897 (0x1 bytes), align: 0 + Segment part 14. Intra module refs: GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_OOBDataFlag 00000897 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000898 - 000008A7 (0x10 bytes), align: 0 + Segment part 15. Intra module refs: GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_OOBData 00000898 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008A8 - 000008A8 (0x1 bytes), align: 0 + Segment part 16. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_Bonding 000008A8 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008A9 - 000008A9 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBond_AutoFail 000008A9 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F3F - 00000F3F (0x1 bytes), align: 0 + Segment part 18. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBond_AutoFailReason + 00000F3F + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F40 - 00000F40 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: ?Subroutine15 + GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_KeyDistList 00000F40 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AA - 000008AD (0x4 bytes), align: 0 + Segment part 22. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBond_Passcode 000008AA + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F41 - 00000F41 (0x1 bytes), align: 0 + Segment part 23. Intra module refs: GAPBondMgr_SetParameter + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + gapBond_KeySize 00000F41 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008AE - 000008AF (0x2 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine7 + GAPBondMgr_Register + LOCAL ADDRESS + ===== ======= + pGapBondCB 000008AE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000008B0 - 0000093B (0x8c bytes), align: 0 + Segment part 26. Intra module refs: GAPBondMgr_ResolveAddr + gapBondMgrAddBond + gapBondMgrBondTotal + gapBondMgrFindAddr + gapBondMgrReadBonds + gapBondMgr_SyncWhiteList + LOCAL ADDRESS + ===== ======= + bonds 000008B0 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000093C - 0000093C (0x1 bytes), align: 0 + Segment part 27. Intra module refs: GAPBondMgr_SetParameter + gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + autoSyncWhiteList 0000093C + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000093D - 0000093D (0x1 bytes), align: 0 + Segment part 28. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + eraseAllBonds 0000093D + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000093E - 0000093F (0x2 bytes), align: 0 + Segment part 29. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + connectionHandle 0000093E + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000044B2 - 00004680 (0x1cf bytes), align: 0 + Segment part 32. Intra module refs: GAPBondMgr_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_SetParameter + 000044B2 + calls direct + XSTACK = 00000000 ( 0000000E ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004681 - 00004685 (0x5 bytes), align: 0 + Segment part 34. Intra module refs: GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00004681 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004686 - 0000468A (0x5 bytes), align: 0 + Segment part 37. Intra module refs: gapBondMgrChangeState + gapBondMgrGetPublicAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00004686 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000468B - 0000468F (0x5 bytes), align: 0 + Segment part 38. Intra module refs: ?Subroutine0 + ?Subroutine6 + GAPBondMgr_ServiceChangeInd + gapBondMgrFindAddr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004690 - 00004829 (0x19a bytes), align: 0 + Segment part 39. Intra module refs: GAPBondMgr_LinkEst::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_LinkEst 00004690 + calls direct + XSTACK = 00000001 ( 00000046 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000482A - 0000482E (0x5 bytes), align: 0 + Segment part 41. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0000482A + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000482F - 000048D9 (0xab bytes), align: 0 + Segment part 42. Intra module refs: GAPBondMgr_ResolveAddr::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ResolveAddr + 0000482F + calls direct + XSTACK = 00000044 ( 00000012 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000048DA - 00004959 (0x80 bytes), align: 0 + Segment part 44. Intra module refs: GAPBondMgr_ServiceChangeInd::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ServiceChangeInd + 000048DA + calls direct + XSTACK = 00000013 ( 0000000C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000495A - 000049D0 (0x77 bytes), align: 0 + Segment part 46. Intra module refs: GAPBondMgr_UpdateCharCfg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_UpdateCharCfg + 0000495A + calls direct + XSTACK = 00000015 ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000049D1 - 000049DE (0xe bytes), align: 0 + Segment part 48. Intra module refs: GAPBondMgr_ServiceChangeInd + GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine12 000049D1 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000049DF - 00004A00 (0x22 bytes), align: 0 + Segment part 49. Intra module refs: GAPBondMgr_Register::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Register 000049DF + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A01 - 00004A07 (0x7 bytes), align: 0 + Segment part 51. Intra module refs: GAPBondMgr_Register + gapBondMgrSendServiceChange + gapBondSetupPrivFlag + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00004A01 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004A08 - 00004D9C (0x395 bytes), align: 0 + Segment part 54. Intra module refs: GAPBondMgr_ProcessGAPMsg::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessGAPMsg + 00004A08 + calls direct + XSTACK = 00000013 ( 00000034 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004D9D - 00004DAB (0xf bytes), align: 0 + Segment part 56. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine13 00004D9D + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DAC - 00004DB3 (0x8 bytes), align: 0 + Segment part 57. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00004DAC + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DB4 - 00004DB4 (0x1 bytes), align: 0 + Segment part 58. Intra module refs: GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00004DB4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DB5 - 00004DB8 (0x4 bytes), align: 0 + Segment part 59. Intra module refs: ?Subroutine10 + GAPBondMgr_ProcessEvent + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DB9 - 00004DBE (0x6 bytes), align: 0 + Segment part 60. Intra module refs: GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + Segment part 59 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DBF - 00004DC4 (0x6 bytes), align: 0 + Segment part 61. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + gapBondMgrChangeState + LOCAL ADDRESS + ===== ======= + ?Subroutine9 00004DBF + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DC5 - 00004DD7 (0x13 bytes), align: 0 + Segment part 62. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00004DC5 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DD8 - 00004DDA (0x3 bytes), align: 0 + Segment part 63. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine7 00004DD8 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DDB - 00004DE2 (0x8 bytes), align: 0 + Segment part 64. Intra module refs: ?Subroutine7 + GAPBondMgr_ProcessGAPMsg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004DE3 - 00004E59 (0x77 bytes), align: 0 + Segment part 65. Intra module refs: gapBondMgrChangeState::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrChangeState 00004DE3 + calls direct + XSTACK = 0000000C ( 0000001A ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004E5A - 00004F5F (0x106 bytes), align: 0 + Segment part 67. Intra module refs: gapBondMgrUpdateCharCfg::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrUpdateCharCfg + 00004E5A + calls direct + XSTACK = 0000000E ( 00000028 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F60 - 00004F61 (0x2 bytes), align: 0 + Segment part 69. Intra module refs: gapBondMgrChangeState + gapBondMgrResolvePrivateAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine20 00004F60 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F62 - 00004F67 (0x6 bytes), align: 0 + Segment part 70. Intra module refs: ?Subroutine20 + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F68 - 00004F6B (0x4 bytes), align: 0 + Segment part 71. Intra module refs: GAPBondMgr_LinkEst + Segment part 70 + gapBondMgrEraseBonding + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F6C - 00004F70 (0x5 bytes), align: 0 + Segment part 72. Intra module refs: Segment part 71 + gapBondMgrAddBond + gapBondMgrBondTotal + gapBondMgr_SyncWhiteList + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004F71 - 00004FA3 (0x33 bytes), align: 0 + Segment part 73. Intra module refs: gapBondMgrFindCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrFindCharCfgItem + 00004F71 + XSTACK = 00000028 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FA4 - 00004FAA (0x7 bytes), align: 0 + Segment part 75. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrFindCharCfgItem + gapBondMgrInvertCharCfgItem + LOCAL ADDRESS + ===== ======= + ?Subroutine21 00004FA4 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FAB - 00004FDF (0x35 bytes), align: 0 + Segment part 76. Intra module refs: gapBondMgrInvertCharCfgItem::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrInvertCharCfgItem + 00004FAB + XSTACK = 00000044 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FE0 - 00004FEB (0xc bytes), align: 0 + Segment part 78. Intra module refs: gapBondMgrInvertCharCfgItem + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine23 00004FE0 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00004FEC - 0000512B (0x140 bytes), align: 0 + Segment part 79. Intra module refs: gapBondMgrAddBond::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrAddBond 00004FEC + calls direct + XSTACK = 00000034 ( 00000020 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000512C - 00005132 (0x7 bytes), align: 0 + Segment part 81. Intra module refs: gapBondMgrAddBond + LOCAL ADDRESS + ===== ======= + ?Subroutine22 0000512C + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005133 - 0000517E (0x4c bytes), align: 0 + Segment part 82. Intra module refs: gapBondMgrGetPublicAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrGetPublicAddr + 00005133 + calls direct + XSTACK = 00000010 ( 0000001C ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000517F - 00005182 (0x4 bytes), align: 0 + Segment part 84. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + ?Subroutine16 0000517F + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005183 - 00005188 (0x6 bytes), align: 0 + Segment part 85. Intra module refs: ?Subroutine16 + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + gapBondMgrAddBond + gapBondMgrAuthenticate + gapBondMgrGetPublicAddr + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005189 - 000051D1 (0x49 bytes), align: 0 + Segment part 86. Intra module refs: gapBondMgrFindAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrFindAddr 00005189 + calls direct + XSTACK = 0000001E ( 0000000E ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000051D2 - 0000522D (0x5c bytes), align: 0 + Segment part 88. Intra module refs: gapBondMgrResolvePrivateAddr::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrResolvePrivateAddr + 000051D2 + calls direct + XSTACK = 00000010 ( 00000019 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000522E - 00005237 (0xa bytes), align: 0 + Segment part 90. Intra module refs: gapBondMgrGetPublicAddr + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine18 0000522E + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005238 - 0000523A (0x3 bytes), align: 0 + Segment part 91. Intra module refs: ?Subroutine18 + gapBondMgrReadBonds + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000523B - 0000523B (0x1 bytes), align: 0 + Segment part 92. Intra module refs: GAPBondMgr_LinkEst + Segment part 91 + gapBondMgrChangeState + gapBondMgrEraseBonding + gapBondMgrResolvePrivateAddr + gapBondMgrUpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000523C - 00005240 (0x5 bytes), align: 0 + Segment part 93. Intra module refs: Segment part 92 + gapBondMgrBondReq + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005241 - 000052AC (0x6c bytes), align: 0 + Segment part 94. Intra module refs: gapBondMgrReadBonds::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrReadBonds 00005241 + calls direct + XSTACK = 0000002A ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052AD - 000052D8 (0x2c bytes), align: 0 + Segment part 96. Intra module refs: gapBondMgrBondTotal::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrBondTotal 000052AD + calls direct + XSTACK = 0000000C ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052D9 - 000052DD (0x5 bytes), align: 0 + Segment part 98. Intra module refs: GAPBondMgr_Init + gapBondMgrBondTotal + gapBondMgrEraseAllBondings + gapBondMgrFindCharCfgItem + gapBondMgrInvertCharCfgItem + gapBondMgrReadBonds + gapBondMgrResolvePrivateAddr + gapBondMgr_SyncWhiteList + LOCAL ADDRESS + ===== ======= + ?Subroutine4 000052D9 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052DE - 000052F5 (0x18 bytes), align: 0 + Segment part 99. Intra module refs: gapBondMgrEraseAllBondings::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseAllBondings + 000052DE + calls direct + XSTACK = 0000002A ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000052F6 - 000053FE (0x109 bytes), align: 0 + Segment part 101. Intra module refs: gapBondMgrEraseBonding::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseBonding + 000052F6 + calls direct + XSTACK = 00000009 ( 00000042 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000053FF - 00005406 (0x8 bytes), align: 0 + Segment part 103. Intra module refs: gapBondMgrBondReq + gapBondMgrEraseBonding + LOCAL ADDRESS + ===== ======= + ?Subroutine5 000053FF + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005407 - 0000540E (0x8 bytes), align: 0 + Segment part 104. Intra module refs: gapBondMgrEraseBonding + LOCAL ADDRESS + ===== ======= + ?Subroutine17 00005407 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000540F - 0000541E (0x10 bytes), align: 0 + Segment part 105. Intra module refs: GAPBondMgr_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Init 0000540F + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000541F - 000055C8 (0x1aa bytes), align: 0 + Segment part 107. Intra module refs: GAPBondMgr_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessEvent + 0000541F + calls direct + XSTACK = 00000000 ( 0000001B ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055C9 - 000055CE (0x6 bytes), align: 0 + Segment part 109. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine14 000055C9 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055CF - 000055D4 (0x6 bytes), align: 0 + Segment part 110. Intra module refs: ?Subroutine14 + GAPBondMgr_ProcessEvent + GAPBondMgr_ProcessGAPMsg + gapBondMgrSendServiceChange + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055D5 - 000055EB (0x17 bytes), align: 0 + Segment part 113. Intra module refs: gapBondMgrSendServiceChange::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrSendServiceChange + 000055D5 + calls direct, is indirectly called + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000055EC - 0000561D (0x32 bytes), align: 0 + Segment part 115. Intra module refs: gapBondSetupPrivFlag::?relay + LOCAL ADDRESS + ===== ======= + gapBondSetupPrivFlag 000055EC + calls direct + XSTACK = 0000001E ( 00000001 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000561E - 000057A6 (0x189 bytes), align: 0 + Segment part 117. Intra module refs: gapBondMgrAuthenticate::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrAuthenticate + 0000561E + calls direct + XSTACK = 0000002A ( 00000028 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000057A7 - 000057A9 (0x3 bytes), align: 0 + Segment part 119. Intra module refs: GAPBondMgr_ProcessEvent + gapBondMgrAuthenticate + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + ?Subroutine2 000057A7 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000057AA - 000057AE (0x5 bytes), align: 0 + Segment part 120. Intra module refs: ?Subroutine2 + GAPBondMgr_UpdateCharCfg + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000057AF - 000057B5 (0x7 bytes), align: 0 + Segment part 121. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine24 000057AF + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000057B6 - 000057BF (0xa bytes), align: 0 + Segment part 122. Intra module refs: gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine15 000057B6 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000057C0 - 00005837 (0x78 bytes), align: 0 + Segment part 123. Intra module refs: gapBondMgrBondReq::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgrBondReq 000057C0 + calls direct + XSTACK = 00000045 ( 00000029 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005838 - 0000583F (0x8 bytes), align: 0 + Segment part 125. Intra module refs: gapBondMgrAddBond + gapBondMgrBondReq + LOCAL ADDRESS + ===== ======= + ?Subroutine19 00005838 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005840 - 00005853 (0x14 bytes), align: 0 + Segment part 126. Intra module refs: ?Subroutine19 + gapBondMgrAuthenticate + LOCAL ADDRESS + ===== ======= + ?Subroutine25 00005840 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00005854 - 00005891 (0x3e bytes), align: 0 + Segment part 127. Intra module refs: gapBondMgr_SyncWhiteList::?relay + LOCAL ADDRESS + ===== ======= + gapBondMgr_SyncWhiteList + 00005854 + calls direct + XSTACK = 0000001E ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003AE - 000003AE (0x1 bytes), align: 0 + Segment part 9. Intra module refs: gapBond_PairingMode + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003AF - 000003B0 (0x2 bytes), align: 0 + Segment part 11. Intra module refs: gapBond_InitiateWait + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B1 - 000003B1 (0x1 bytes), align: 0 + Segment part 19. Intra module refs: gapBond_AutoFailReason + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B2 - 000003B2 (0x1 bytes), align: 0 + Segment part 21. Intra module refs: gapBond_KeyDistList + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B3 - 000003B3 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: gapBond_KeySize + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011EB - 000011F0 (0x6 bytes), align: 0 + Segment part 33. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_SetParameter::?relay + 000011EB WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011F1 - 000011F6 (0x6 bytes), align: 0 + Segment part 40. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_LinkEst::?relay + 000011F1 gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011F7 - 000011FC (0x6 bytes), align: 0 + Segment part 43. Intra module refs: ?Subroutine12 + GAPBondMgr_LinkEst + GAPBondMgr_ProcessGAPMsg + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ResolveAddr::?relay + 000011F7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000011FD - 00001202 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ServiceChangeInd::?relay + 000011FD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001203 - 00001208 (0x6 bytes), align: 0 + Segment part 47. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_UpdateCharCfg::?relay + 00001203 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001209 - 0000120E (0x6 bytes), align: 0 + Segment part 50. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Register::?relay + 00001209 WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000120F - 00001214 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: GAPBondMgr_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessGAPMsg::?relay + 0000120F gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001215 - 0000121A (0x6 bytes), align: 0 + Segment part 66. Intra module refs: GAPBondMgr_ServiceChangeInd + LOCAL ADDRESS + ===== ======= + gapBondMgrChangeState::?relay + 00001215 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000121B - 00001220 (0x6 bytes), align: 0 + Segment part 68. Intra module refs: GAPBondMgr_UpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrUpdateCharCfg::?relay + 0000121B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001221 - 00001226 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrFindCharCfgItem::?relay + 00001221 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001227 - 0000122C (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAPBondMgr_LinkEst + gapBondMgrUpdateCharCfg + LOCAL ADDRESS + ===== ======= + gapBondMgrInvertCharCfgItem::?relay + 00001227 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000122D - 00001232 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrAddBond::?relay + 0000122D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001233 - 00001238 (0x6 bytes), align: 0 + Segment part 83. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + gapBondMgrGetPublicAddr::?relay + 00001233 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001239 - 0000123E (0x6 bytes), align: 0 + Segment part 87. Intra module refs: GAPBondMgr_ResolveAddr + gapBondMgrAddBond + LOCAL ADDRESS + ===== ======= + gapBondMgrFindAddr::?relay + 00001239 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000123F - 00001244 (0x6 bytes), align: 0 + Segment part 89. Intra module refs: GAPBondMgr_ResolveAddr + LOCAL ADDRESS + ===== ======= + gapBondMgrResolvePrivateAddr::?relay + 0000123F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001245 - 0000124A (0x6 bytes), align: 0 + Segment part 95. Intra module refs: GAPBondMgr_Init + GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBondMgrReadBonds::?relay + 00001245 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000124B - 00001250 (0x6 bytes), align: 0 + Segment part 97. Intra module refs: gapBondSetupPrivFlag + LOCAL ADDRESS + ===== ======= + gapBondMgrBondTotal::?relay + 0000124B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001251 - 00001256 (0x6 bytes), align: 0 + Segment part 100. Intra module refs: GAPBondMgr_ProcessGAPMsg + GAPBondMgr_SetParameter + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseAllBondings::?relay + 00001251 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001257 - 0000125C (0x6 bytes), align: 0 + Segment part 102. Intra module refs: gapBondMgrEraseAllBondings + LOCAL ADDRESS + ===== ======= + gapBondMgrEraseBonding::?relay + 00001257 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000125D - 00001262 (0x6 bytes), align: 0 + Segment part 106. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_Init::?relay + 0000125D osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001263 - 00001268 (0x6 bytes), align: 0 + Segment part 108. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPBondMgr_ProcessEvent::?relay + 00001263 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001269 - 0000126E (0x6 bytes), align: 0 + Segment part 114. Intra module refs: GAPBondMgr_ServiceChangeInd + LOCAL ADDRESS + ===== ======= + gapBondMgrSendServiceChange::?relay + 00001269 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000126F - 00001274 (0x6 bytes), align: 0 + Segment part 116. Intra module refs: gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + gapBondSetupPrivFlag::?relay + 0000126F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001275 - 0000127A (0x6 bytes), align: 0 + Segment part 118. Intra module refs: GAPBondMgr_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapBondMgrAuthenticate::?relay + 00001275 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000127B - 00001280 (0x6 bytes), align: 0 + Segment part 124. Intra module refs: GAPBondMgr_LinkEst + LOCAL ADDRESS + ===== ======= + gapBondMgrBondReq::?relay + 0000127B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001281 - 00001286 (0x6 bytes), align: 0 + Segment part 128. Intra module refs: gapBondMgrAddBond + gapBondMgrReadBonds + LOCAL ADDRESS + ===== ======= + gapBondMgr_SyncWhiteList::?relay + 00001281 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EF3 - 00008EF8 (0x6 bytes), align: 0 + Segment part 6. Intra module refs: GAPBondMgr_LinkEst + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F67 - 00008F6A (0x4 bytes), align: 0 + Segment part 30. Intra module refs: GAPBondMgr_SetParameter + GAP_PasscodeUpdate (gap_linkmgr) + llCalcScaFactor (ll_timerDrift) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_f4240 00008F67 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F63 - 00008F66 (0x4 bytes), align: 0 + Segment part 31. Intra module refs: GAPBondMgr_ProcessGAPMsg + SM_VerifyAuthenSig (sm_mgr) + Segment part 64 (ll_advEndCauses) + Segment part 95 (ll_common) + WIMU_Init (wimu) + findOffset (osal_snv) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smpResponderProcessIncoming (sm_rsppairing) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_ffffffff 00008F63 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EF3 - 00008EF8 (0x6 bytes), align: 0 + Segment part 129. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F67 - 00008F6A (0x4 bytes), align: 0 + Segment part 130. Intra module refs: __Constant_f4240 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F63 - 00008F66 (0x4 bytes), align: 0 + Segment part 131. Intra module refs: __Constant_ffffffff + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gatt_uuid.r51 + PROGRAM MODULE, NAME : gatt_uuid + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB0 - 00008FB1 (0x2 bytes), align: 0 + Segment part 6. + ENTRY ADDRESS REF BY + ===== ======= ====== + gapServiceUUID 00008FB0 Segment part 7 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB2 - 00008FB3 (0x2 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + gattServiceUUID 00008FB2 Segment part 15 (gattservapp) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB4 - 00008FB5 (0x2 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + primaryServiceUUID 00008FB4 Segment part 15 (battservice) + Segment part 20 (gattservapp) + Segment part 25 (gapgattserver) + Segment part 28 (gpsservice) + Segment part 31 (actimetryservice) + Segment part 38 (gatt_server) + Segment part 46 (devinfoservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FB6 - 00008FB7 (0x2 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + secondaryServiceUUID 00008FB6 GATTServApp_ReadAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_RegisterService (gatt_server) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FDE - 00008FDF (0x2 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + characterUUID 00008FDE GATT_FindNextAttr (gatt_server) + Segment part 15 (battservice) + Segment part 20 (gattservapp) + Segment part 25 (gapgattserver) + Segment part 28 (gpsservice) + Segment part 31 (actimetryservice) + Segment part 46 (devinfoservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBA - 00008FBB (0x2 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + charUserDescUUID 00008FBA Segment part 31 (actimetryservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBC - 00008FBD (0x2 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + clientCharCfgUUID 00008FBC GAPBondMgr_ProcessEvent (gapbondmgr) + Segment part 15 (battservice) + Segment part 20 (gattservapp) + Segment part 28 (gpsservice) + Segment part 31 (actimetryservice) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FBE - 00008FBF (0x2 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + deviceNameUUID 00008FBE Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC0 - 00008FC1 (0x2 bytes), align: 0 + Segment part 19. + ENTRY ADDRESS REF BY + ===== ======= ====== + appearanceUUID 00008FC0 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC2 - 00008FC3 (0x2 bytes), align: 0 + Segment part 20. + ENTRY ADDRESS REF BY + ===== ======= ====== + periPrivacyFlagUUID 00008FC2 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC4 - 00008FC5 (0x2 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + reconnectAddrUUID 00008FC4 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC6 - 00008FC7 (0x2 bytes), align: 0 + Segment part 22. + ENTRY ADDRESS REF BY + ===== ======= ====== + periConnParamUUID 00008FC6 Segment part 25 (gapgattserver) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FC8 - 00008FC9 (0x2 bytes), align: 0 + Segment part 23. + ENTRY ADDRESS REF BY + ===== ======= ====== + serviceChangedUUID 00008FC8 GATT_ServiceChangedInd (gatt_server) + Segment part 20 (gattservapp) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB0 - 00008FB1 (0x2 bytes), align: 0 + Segment part 29. Intra module refs: gapServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB2 - 00008FB3 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: gattServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB4 - 00008FB5 (0x2 bytes), align: 0 + Segment part 31. Intra module refs: primaryServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FB6 - 00008FB7 (0x2 bytes), align: 0 + Segment part 32. Intra module refs: secondaryServiceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FDE - 00008FDF (0x2 bytes), align: 0 + Segment part 34. Intra module refs: characterUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBA - 00008FBB (0x2 bytes), align: 0 + Segment part 36. Intra module refs: charUserDescUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBC - 00008FBD (0x2 bytes), align: 0 + Segment part 37. Intra module refs: clientCharCfgUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FBE - 00008FBF (0x2 bytes), align: 0 + Segment part 41. Intra module refs: deviceNameUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC0 - 00008FC1 (0x2 bytes), align: 0 + Segment part 42. Intra module refs: appearanceUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC2 - 00008FC3 (0x2 bytes), align: 0 + Segment part 43. Intra module refs: periPrivacyFlagUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC4 - 00008FC5 (0x2 bytes), align: 0 + Segment part 44. Intra module refs: reconnectAddrUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC6 - 00008FC7 (0x2 bytes), align: 0 + Segment part 45. Intra module refs: periConnParamUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FC8 - 00008FC9 (0x2 bytes), align: 0 + Segment part 46. Intra module refs: serviceChangedUUID + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gpsservice.r51 + PROGRAM MODULE, NAME : gpsservice + + SEGMENTS IN THE MODULE + ====================== + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCA - 00008FCB (0x2 bytes), align: 0 + Segment part 6. Intra module refs: gpsService + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsServUUID 00008FCA + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCC - 00008FCD (0x2 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsFeaturesUUID 00008FCC + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FCE - 00008FCF (0x2 bytes), align: 0 + Segment part 8. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsLocationAndSpeedUUID + 00008FCE + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD0 - 00008FD1 (0x2 bytes), align: 0 + Segment part 9. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsDateTimeUUID 00008FD0 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008FD2 - 00008FD3 (0x2 bytes), align: 0 + Segment part 10. Intra module refs: Segment part 28 + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsPositionQualityUUID + 00008FD2 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F91 - 00008F93 (0x3 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsService 00008F91 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F42 - 00000F42 (0x1 bytes), align: 0 + Segment part 12. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsFeaturesProps 00000F42 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F43 - 00000F46 (0x4 bytes), align: 0 + Segment part 14. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsFeatures 00000F43 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F47 - 00000F47 (0x1 bytes), align: 0 + Segment part 16. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeedProps + 00000F47 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000940 - 00000950 (0x11 bytes), align: 0 + Segment part 18. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeed 00000940 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000951 - 00000956 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: Gps_AddService + Gps_SetParameter + Segment part 28 + gps_HandleConnStatusCB + LOCAL ADDRESS + ===== ======= + gpsLocationAndSpeedClientCharCfg + 00000951 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F48 - 00000F48 (0x1 bytes), align: 0 + Segment part 20. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsDateTimeProps 00000F48 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000957 - 0000095D (0x7 bytes), align: 0 + Segment part 22. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsDateTime 00000957 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000095E - 00000963 (0x6 bytes), align: 0 + Segment part 23. Intra module refs: Gps_AddService + Gps_SetParameter + Segment part 28 + gps_HandleConnStatusCB + LOCAL ADDRESS + ===== ======= + gpsDateTimeClientCharCfg + 0000095E + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F49 - 00000F49 (0x1 bytes), align: 0 + Segment part 24. Intra module refs: Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsPositionQualityProps + 00000F49 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000964 - 00000973 (0x10 bytes), align: 0 + Segment part 26. Intra module refs: Gps_SetParameter + Segment part 28 + LOCAL ADDRESS + ===== ======= + gpsPositionQuality 00000964 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000F4A - 00000FA1 (0x58 bytes), align: 0 + Segment part 27. Intra module refs: Gps_AddService + Gps_SetParameter + LOCAL ADDRESS + ===== ======= + gpsAttrTbl 00000F4A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008EFF - 00008F04 (0x6 bytes), align: 0 + Segment part 29. Intra module refs: Gps_AddService + ENTRY ADDRESS REF BY + ===== ======= ====== + gpsCBs 00008EFF + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 000198D4 - 0001991C (0x49 bytes), align: 0 + Segment part 30. Intra module refs: Gps_AddService::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_AddService 000198D4 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001991D - 0001991E (0x2 bytes), align: 0 + Segment part 32. Intra module refs: Gps_AddService + Gps_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001991D + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001991F - 00019923 (0x5 bytes), align: 0 + Segment part 33. Intra module refs: ?Subroutine0 + gps_ReadAttrCB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019924 - 00019A00 (0xdd bytes), align: 0 + Segment part 34. Intra module refs: Gps_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_SetParameter 00019924 + calls direct + XSTACK = 00000000 ( 00000011 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019A01 - 00019A06 (0x6 bytes), align: 0 + Segment part 38. Intra module refs: Gps_SetParameter + gps_ReadAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00019A01 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019A07 - 00019ACB (0xc5 bytes), align: 0 + Segment part 39. Intra module refs: gps_ReadAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gps_ReadAttrCB 00019A07 + calls direct, is indirectly called + XSTACK = 00000006 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019ACC - 00019B2B (0x60 bytes), align: 0 + Segment part 41. Intra module refs: gps_WriteAttrCB::?relay + LOCAL ADDRESS + ===== ======= + gps_WriteAttrCB 00019ACC + calls direct, is indirectly called + XSTACK = 00000004 ( 00000014 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B2C - 00019B36 (0xb bytes), align: 0 + Segment part 43. Intra module refs: gps_ReadAttrCB + gps_WriteAttrCB + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00019B2C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019B37 - 00019B7A (0x44 bytes), align: 0 + Segment part 44. Intra module refs: gps_HandleConnStatusCB::?relay + LOCAL ADDRESS + ===== ======= + gps_HandleConnStatusCB + 00019B37 + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B4 - 000003B4 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: gpsFeaturesProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B5 - 000003B8 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: gpsFeatures + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003B9 - 000003B9 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: gpsLocationAndSpeedProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003BA - 000003BA (0x1 bytes), align: 0 + Segment part 21. Intra module refs: gpsDateTimeProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003BB - 000003BB (0x1 bytes), align: 0 + Segment part 25. Intra module refs: gpsPositionQualityProps + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000003BC - 00000413 (0x58 bytes), align: 0 + Segment part 28. Intra module refs: gpsAttrTbl + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001287 - 0000128C (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_AddService::?relay + 00001287 WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000128D - 00001292 (0x6 bytes), align: 0 + Segment part 35. + ENTRY ADDRESS REF BY + ===== ======= ====== + Gps_SetParameter::?relay + 0000128D WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001293 - 00001298 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: gpsCBs + LOCAL ADDRESS + ===== ======= + gps_ReadAttrCB::?relay + 00001293 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001299 - 0000129E (0x6 bytes), align: 0 + Segment part 42. Intra module refs: gpsCBs + LOCAL ADDRESS + ===== ======= + gps_WriteAttrCB::?relay + 00001299 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000129F - 000012A4 (0x6 bytes), align: 0 + Segment part 45. Intra module refs: Gps_AddService + LOCAL ADDRESS + ===== ======= + gps_HandleConnStatusCB::?relay + 0000129F + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCA - 00008FCB (0x2 bytes), align: 0 + Segment part 46. Intra module refs: gpsServUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCC - 00008FCD (0x2 bytes), align: 0 + Segment part 47. Intra module refs: gpsFeaturesUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FCE - 00008FCF (0x2 bytes), align: 0 + Segment part 48. Intra module refs: gpsLocationAndSpeedUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD0 - 00008FD1 (0x2 bytes), align: 0 + Segment part 49. Intra module refs: gpsDateTimeUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008FD2 - 00008FD3 (0x2 bytes), align: 0 + Segment part 50. Intra module refs: gpsPositionQualityUUID + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F91 - 00008F93 (0x3 bytes), align: 0 + Segment part 51. Intra module refs: gpsService + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008EFF - 00008F04 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: gpsCBs + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_adc.r51 + PROGRAM MODULE, NAME : hal_adc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B4 - 000000B4 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: HalAdcRead + LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCON1 000000B4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000B6 - 000000B6 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalAdcRead + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCON3 000000B6 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BA - 000000BA (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalAdcRead + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCL 000000BA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BB - 000000BB (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: HalAdcRead + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCH 000000BB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F2 - 000000F2 (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalAdcRead + ENTRY ADDRESS REF BY + ===== ======= ====== + ADCCFG 000000F2 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000974 - 00000974 (0x1 bytes), align: 0 + Segment part 11. Intra module refs: HalAdcInit + HalAdcRead + LOCAL ADDRESS + ===== ======= + adcRef 00000974 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AC15 - 0001AC1D (0x9 bytes), align: 0 + Segment part 12. Intra module refs: HalAdcInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcInit 0001AC15 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AC1E - 0001AC25 (0x8 bytes), align: 0 + Segment part 14. Intra module refs: HalAdcInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001AC1E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AC26 - 0001ACC5 (0xa0 bytes), align: 0 + Segment part 15. Intra module refs: HalAdcRead::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcRead 0001AC26 + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012A5 - 000012AA (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcInit::?relay 000012A5 HalDriverInit (hal_drivers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012AB - 000012B0 (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAdcRead::?relay 000012AB halGetJoyKeyInput (hal_key) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_aes.r51 + PROGRAM MODULE, NAME : hal_aes + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B3 - 000000B3 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: LL_ENC_DecryptMsg (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_LoadEmptyIV (ll_enc) + LL_ENC_LoadKey (ll_enc) + LL_ENC_StartAES (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + ENCCS 000000B3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D1 - 000000D1 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + halDmaIsr (hal_dma) + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAIRQ 000000D1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D6 - 000000D6 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + DMAARM 000000D6 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B073 - 0001B0AA (0x38 bytes), align: 0 + Segment part 10. Intra module refs: aesDmaInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + aesDmaInit 0001B073 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0AB - 0001B0B1 (0x7 bytes), align: 0 + Segment part 16. Intra module refs: HalAesInit + aesDmaInit + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001B0AB + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0B2 - 0001B0BB (0xa bytes), align: 0 + Segment part 20. Intra module refs: HalAesInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAesInit 0001B0B2 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012B1 - 000012B6 (0x6 bytes), align: 0 + Segment part 11. Intra module refs: HalAesInit + ENTRY ADDRESS REF BY + ===== ======= ====== + aesDmaInit::?relay 000012B1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012B7 - 000012BC (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalAesInit::?relay 000012B7 HalDriverInit (hal_drivers) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_crc.r51 + PROGRAM MODULE, NAME : hal_crc + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000BC - 000000BC (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + RNDL 000000BC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000BD - 000000BD (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: LL_ENC_GenerateTrueRandNum (ll_enc) + ENTRY ADDRESS REF BY + ===== ======= ====== + RNDH 000000BD + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_dma.r51 + PROGRAM MODULE, NAME : hal_dma + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000B8 - 000000B8 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalDmaInit + HalKeyConfig (hal_key) + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IEN1 000000B8 + LOCAL ADDRESS + ===== ======= + IEN1 000000B8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000C0 - 000000C0 (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: halDmaIsr + halKeyPort0Isr (hal_key) + halSleepTimerIsr (hal_sleep) + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IRCON 000000C0 + LOCAL ADDRESS + ===== ======= + IRCON 000000C0 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D2 - 000000D2 (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA1CFGL 000000D2 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D3 - 000000D3 (0x1 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA1CFGH 000000D3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D4 - 000000D4 (0x1 bytes), align: 0 + Segment part 7. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA0CFGL 000000D4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000D5 - 000000D5 (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + DMA0CFGH 000000D5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000975 - 0000097C (0x8 bytes), align: 0 + Segment part 15. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + dmaCh0 00000975 HalFlashWrite (hal_flash) + LL_ENC_InitDMA0 (ll_enc) + LL_ENC_MoveData (ll_enc) + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000097D - 0000099C (0x20 bytes), align: 0 + Segment part 16. Intra module refs: HalDmaInit + ENTRY ADDRESS REF BY + ===== ======= ====== + dmaCh1234 0000097D HalUARTInitDMA (hal_uart) + LL_ENC_InitAesDMA (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_ENC_SetupLoadDMA (ll_enc) + Segment part 53 (ll_enc) + aesDmaInit (hal_aes) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0DA - 0001B0EC (0x13 bytes), align: 0 + Segment part 17. Intra module refs: HalDmaInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDmaInit 0001B0DA + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 000029EA - 00002A0F (0x26 bytes), align: 0 + Segment part 19. Intra module refs: halDmaIsr::??INTVEC 67 + ENTRY ADDRESS REF BY + ===== ======= ====== + halDmaIsr 000029EA + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000045 (0x46 bytes), align: 0 + Segment part 9. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halDmaIsr::??INTVEC 67 + 00000043 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012BD - 000012C2 (0x6 bytes), align: 0 + Segment part 18. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDmaInit::?relay 000012BD HalDriverInit (hal_drivers) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_drivers.r51 + PROGRAM MODULE, NAME : hal_drivers + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 0000099D - 0000099D (0x1 bytes), align: 0 + Segment part 6. Intra module refs: Hal_Init + Hal_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_TaskID 0000099D HalKeyConfig (hal_key) + halProcessKeyInterrupt (hal_key) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD66 - 0001AD6E (0x9 bytes), align: 0 + Segment part 8. Intra module refs: Hal_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_Init 0001AD66 + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD6F - 0001AD75 (0x7 bytes), align: 0 + Segment part 10. Intra module refs: HalDriverInit + Hal_Init + Hal_ProcessPoll + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001AD6F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD76 - 0001AD8A (0x15 bytes), align: 0 + Segment part 11. Intra module refs: HalDriverInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDriverInit 0001AD76 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD8B - 0001ADF0 (0x66 bytes), align: 0 + Segment part 13. Intra module refs: Hal_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessEvent 0001AD8B + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ADF1 - 0001ADFA (0xa bytes), align: 0 + Segment part 15. Intra module refs: Hal_ProcessPoll::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessPoll 0001ADF1 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F5B - 00008F5E (0x4 bytes), align: 0 + Segment part 7. Intra module refs: Hal_ProcessEvent + osal_snv_compact (osal_snv) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_64 00008F5B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012C3 - 000012C8 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_Init::?relay 000012C3 osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012C9 - 000012CE (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalDriverInit::?relay 000012C9 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012CF - 000012D4 (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessEvent::?relay + 000012CF tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012D5 - 000012DA (0x6 bytes), align: 0 + Segment part 16. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_ProcessPoll::?relay + 000012D5 osal_run_system (OSAL) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F5B - 00008F5E (0x4 bytes), align: 0 + Segment part 17. Intra module refs: __Constant_64 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_flash.r51 + PROGRAM MODULE, NAME : hal_flash + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 000000C7 - 000000C7 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalFlashRead + __low_level_init (hal_startup) + ENTRY ADDRESS REF BY + ===== ======= ====== + MEMCTR 000000C7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017EC6 - 00017F4A (0x85 bytes), align: 0 + Segment part 10. Intra module refs: HalFlashRead::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashRead 00017EC6 + XSTACK = 00000002 ( 0000000C ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017F4B - 00017FAE (0x64 bytes), align: 0 + Segment part 12. Intra module refs: HalFlashWrite::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashWrite 00017F4B + XSTACK = 00000002 ( 0000000A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FAF - 00017FC7 (0x19 bytes), align: 0 + Segment part 14. Intra module refs: HalFlashErase::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashErase 00017FAF + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012DB - 000012E0 (0x6 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashRead::?relay 000012DB LL_Init (ll) + Segment part 50 (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012E1 - 000012E6 (0x6 bytes), align: 0 + Segment part 13. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashWrite::?relay 000012E1 llFindTxPowerSettings (ll_common) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012E7 - 000012EC (0x6 bytes), align: 0 + Segment part 15. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalFlashErase::?relay 000012E7 erasePage (osal_snv) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_key.r51 + PROGRAM MODULE, NAME : hal_key + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000080 - 00000080 (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: HalKeyPoll + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P0 00000080 + LOCAL ADDRESS + ===== ======= + P0 00000080 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000089 - 00000089 (0x1 bytes), align: 0 + Segment part 2. ROOT. Intra module refs: HalKeyConfig + halKeyPort0Isr + halProcessKeyInterrupt + ENTRY ADDRESS REF BY + ===== ======= ====== + P0IFG 00000089 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000008B - 0000008B (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalKeyConfig + halKeyPort2Isr + halProcessKeyInterrupt + ENTRY ADDRESS REF BY + ===== ======= ====== + P2IFG 0000008B + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000008C - 0000008C (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: HalKeyConfig + HalUARTInitDMA (hal_uart) + ENTRY ADDRESS REF BY + ===== ======= ====== + PICTL 0000008C + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000009A - 0000009A (0x1 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: HalKeyConfig + HalUARTOpenDMA (hal_uart) + halUart1TxIsr (hal_uart) + llClearSetInts (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + IEN2 0000009A + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000A0 - 000000A0 (0x1 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: HalKeyPoll + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P2 000000A0 + LOCAL ADDRESS + ===== ======= + P2 000000A0 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AB - 000000AB (0x1 bytes), align: 0 + Segment part 8. ROOT. Intra module refs: HalKeyConfig + ENTRY ADDRESS REF BY + ===== ======= ====== + P0IEN 000000AB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AC - 000000AC (0x1 bytes), align: 0 + Segment part 9. ROOT. Intra module refs: HalKeyConfig + ENTRY ADDRESS REF BY + ===== ======= ====== + P2IEN 000000AC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000E8 - 000000E8 (0x1 bytes), align: 0 + Segment part 12. ROOT. Intra module refs: HalUARTOpenDMA (hal_uart) + halKeyPort2Isr + halUart1TxIsr (hal_uart) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_IRCON2 000000E8 + LOCAL ADDRESS + ===== ======= + IRCON2 000000E8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F3 - 000000F3 (0x1 bytes), align: 0 + Segment part 13. ROOT. Intra module refs: HalKeyInit + ENTRY ADDRESS REF BY + ===== ======= ====== + P0SEL 000000F3 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F5 - 000000F5 (0x1 bytes), align: 0 + Segment part 14. ROOT. Intra module refs: HalKeyInit + ENTRY ADDRESS REF BY + ===== ======= ====== + P2SEL 000000F5 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F7 - 000000F7 (0x1 bytes), align: 0 + Segment part 15. ROOT. Intra module refs: HalKeyInit + ENTRY ADDRESS REF BY + ===== ======= ====== + P2INP 000000F7 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FD - 000000FD (0x1 bytes), align: 0 + Segment part 16. ROOT. Intra module refs: HalKeyInit + ENTRY ADDRESS REF BY + ===== ======= ====== + P0DIR 000000FD + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FF - 000000FF (0x1 bytes), align: 0 + Segment part 17. ROOT. Intra module refs: HalKeyInit + HalUARTInitDMA (hal_uart) + ENTRY ADDRESS REF BY + ===== ======= ====== + P2DIR 000000FF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000099E - 0000099E (0x1 bytes), align: 0 + Segment part 25. Intra module refs: HalKeyInit + HalKeyPoll + LOCAL ADDRESS + ===== ======= + halKeySavedKeys 0000099E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 0000099F - 000009A0 (0x2 bytes), align: 0 + Segment part 26. Intra module refs: HalKeyConfig + HalKeyInit + HalKeyPoll + LOCAL ADDRESS + ===== ======= + pHalKeyProcessFunction + 0000099F + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000009A1 - 000009A1 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: HalKeyConfig + HalKeyInit + LOCAL ADDRESS + ===== ======= + HalKeyConfigured 000009A1 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000009A2 - 000009A2 (0x1 bytes), align: 0 + Segment part 28. Intra module refs: HalKeyConfig + HalKeyPoll + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_KeyIntEnable 000009A2 Hal_ProcessEvent (hal_drivers) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A70D - 0001A72E (0x22 bytes), align: 0 + Segment part 30. Intra module refs: HalKeyInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyInit 0001A70D + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A72F - 0001A735 (0x7 bytes), align: 0 + Segment part 32. Intra module refs: HalKeyInit + halProcessKeyInterrupt + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A72F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A736 - 0001A79B (0x66 bytes), align: 0 + Segment part 33. Intra module refs: HalKeyConfig::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyConfig 0001A736 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A79C - 0001A7A0 (0x5 bytes), align: 0 + Segment part 37. Intra module refs: HalKeyPoll + halGetJoyKeyInput + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001A79C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A7A1 - 0001A7F1 (0x51 bytes), align: 0 + Segment part 38. Intra module refs: HalKeyPoll::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyPoll 0001A7A1 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A7F2 - 0001A84C (0x5b bytes), align: 0 + Segment part 40. Intra module refs: halGetJoyKeyInput::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + halGetJoyKeyInput 0001A7F2 + calls direct + XSTACK = 00000009 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A84D - 0001A886 (0x3a bytes), align: 0 + Segment part 42. Intra module refs: halProcessKeyInterrupt::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + halProcessKeyInterrupt + 0001A84D + calls direct + XSTACK = 0000000E ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A10 - 00002A2B (0x1c bytes), align: 0 + Segment part 48. Intra module refs: halKeyPort0Isr::??INTVEC 107 + ENTRY ADDRESS REF BY + ===== ======= ====== + halKeyPort0Isr 00002A10 + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A2C - 00002A35 (0xa bytes), align: 0 + Segment part 49. Intra module refs: halKeyPort0Isr + halKeyPort2Isr + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00002A2C + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A36 - 00002A53 (0x1e bytes), align: 0 + Segment part 50. Intra module refs: halKeyPort2Isr::??INTVEC 51 + ENTRY ADDRESS REF BY + ===== ======= ====== + halKeyPort2Isr 00002A36 + interrupt function + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000035 (0x36 bytes), align: 0 + Segment part 18. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halKeyPort2Isr::??INTVEC 51 + 00000033 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 0000006D (0x6e bytes), align: 0 + Segment part 19. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halKeyPort0Isr::??INTVEC 107 + 0000006B + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F57 - 00008F5A (0x4 bytes), align: 0 + Segment part 29. Intra module refs: halProcessKeyInterrupt + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_19 00008F57 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012ED - 000012F2 (0x6 bytes), align: 0 + Segment part 31. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyInit::?relay 000012ED HalDriverInit (hal_drivers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012F3 - 000012F8 (0x6 bytes), align: 0 + Segment part 34. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyConfig::?relay 000012F3 ?Subroutine2 (OnBoard) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012F9 - 000012FE (0x6 bytes), align: 0 + Segment part 39. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalKeyPoll::?relay 000012F9 Hal_ProcessEvent (hal_drivers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000012FF - 00001304 (0x6 bytes), align: 0 + Segment part 41. Intra module refs: HalKeyPoll + ENTRY ADDRESS REF BY + ===== ======= ====== + halGetJoyKeyInput::?relay + 000012FF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001305 - 0000130A (0x6 bytes), align: 0 + Segment part 43. Intra module refs: halKeyPort0Isr + halKeyPort2Isr + ENTRY ADDRESS REF BY + ===== ======= ====== + halProcessKeyInterrupt::?relay + 00001305 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F57 - 00008F5A (0x4 bytes), align: 0 + Segment part 51. Intra module refs: __Constant_19 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_lcd.r51 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_led.r51 + PROGRAM MODULE, NAME : hal_led + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 000009A3 - 000009A3 (0x1 bytes), align: 0 + Segment part 6. Intra module refs: HalLedSet + LOCAL ADDRESS + ===== ======= + HalLedState 000009A3 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0ED - 0001B0FC (0x10 bytes), align: 0 + Segment part 9. Intra module refs: HalLedSet::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalLedSet 0001B0ED + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000130B - 00001310 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalLedSet::?relay 0000130B InitBoard (OnBoard) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_sleep.r51 + PROGRAM MODULE, NAME : hal_sleep + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 00000087 - 00000087 (0x1 bytes), align: 0 + Segment part 1. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + PCON 00000087 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000095 - 00000095 (0x1 bytes), align: 0 + Segment part 2. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST0 00000095 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000096 - 00000096 (0x1 bytes), align: 0 + Segment part 3. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST1 00000096 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000097 - 00000097 (0x1 bytes), align: 0 + Segment part 4. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + ST2 00000097 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000AD - 000000AD (0x1 bytes), align: 0 + Segment part 7. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + STLOAD 000000AD + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A54 - 00002A6C (0x19 bytes), align: 0 + Segment part 41. Intra module refs: halSleepTimerIsr::??INTVEC 43 + ENTRY ADDRESS REF BY + ===== ======= ====== + halSleepTimerIsr 00002A54 + interrupt function + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 0000002D (0x2e bytes), align: 0 + Segment part 11. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halSleepTimerIsr::??INTVEC 43 + 0000002B + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_startup.r51 + PROGRAM MODULE, NAME : hal_startup + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000086 - 00000090 (0xb bytes), align: 0 + Segment part 7. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + __low_level_init 00000086 __low_level_init_call (?cmain) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_timer.r51 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_uart.r51 + PROGRAM MODULE, NAME : hal_uart + + SEGMENTS IN THE MODULE + ====================== +SFR_AN + Relative segment, address: DATA 0000008A - 0000008A (0x1 bytes), align: 0 + Segment part 1. ROOT. Intra module refs: HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + P1IFG 0000008A + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 0000008D - 0000008D (0x1 bytes), align: 0 + Segment part 3. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + P1IEN 0000008D + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 00000090 - 00000090 (0x1 bytes), align: 0 + Segment part 4. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + llSetRxGain (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_P1 00000090 + LOCAL ADDRESS + ===== ======= + P1 00000090 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F1 - 000000F1 (0x1 bytes), align: 0 + Segment part 10. ROOT. Intra module refs: HalUARTInitDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + PERCFG 000000F1 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F4 - 000000F4 (0x1 bytes), align: 0 + Segment part 11. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + llExtendRfRange (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + P1SEL 000000F4 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F8 - 000000F8 (0x1 bytes), align: 0 + Segment part 12. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + _A_U1CSR 000000F8 + LOCAL ADDRESS + ===== ======= + U1CSR 000000F8 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000F9 - 000000F9 (0x1 bytes), align: 0 + Segment part 13. ROOT. Intra module refs: halUart1TxIsr + ENTRY ADDRESS REF BY + ===== ======= ====== + U1DBUF 000000F9 + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FA - 000000FA (0x1 bytes), align: 0 + Segment part 14. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + HalUARTRxAvailDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1BAUD 000000FA + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FB - 000000FB (0x1 bytes), align: 0 + Segment part 15. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1UCR 000000FB + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FC - 000000FC (0x1 bytes), align: 0 + Segment part 16. ROOT. Intra module refs: HalUARTOpenDMA + ENTRY ADDRESS REF BY + ===== ======= ====== + U1GCR 000000FC + ------------------------------------------------------------------------- +SFR_AN + Relative segment, address: DATA 000000FE - 000000FE (0x1 bytes), align: 0 + Segment part 17. ROOT. Intra module refs: HalUARTInitDMA + HalUARTOpenDMA + llExtendRfRange (ll_common) + ENTRY ADDRESS REF BY + ===== ======= ====== + P1DIR 000000FE + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 000009A4 - 00000B2A (0x187 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine4 + ?Subroutine5 + HalUARTInitDMA + HalUARTOpenDMA + HalUARTPollDMA + HalUARTReadDMA + HalUARTRxAvailDMA + Segment part 45 + halUart1TxIsr + LOCAL ADDRESS + ===== ======= + dmaCfg 000009A4 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B2B - 00000B2B (0x1 bytes), align: 0 + Segment part 26. Intra module refs: HalUARTPollDMA + HalUARTRxAvailDMA + LOCAL ADDRESS + ===== ======= + uartRxBug 00000B2B + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018BF2 - 00018C7C (0x8b bytes), align: 0 + Segment part 27. Intra module refs: HalUARTInitDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTInitDMA 00018BF2 + calls direct + XSTACK = 00000000 ( 0000000D ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018C7D - 00018C81 (0x5 bytes), align: 0 + Segment part 29. Intra module refs: HalUARTInitDMA + HalUARTPollDMA + HalUARTReadDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00018C7D + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018C82 - 00018D28 (0xa7 bytes), align: 0 + Segment part 30. Intra module refs: HalUARTOpenDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTOpenDMA 00018C82 + XSTACK = 00000009 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018D29 - 00018D2F (0x7 bytes), align: 0 + Segment part 32. Intra module refs: HalUARTInit + HalUARTOpenDMA + HalUARTPoll + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00018D29 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018D30 - 00018DA1 (0x72 bytes), align: 0 + Segment part 33. Intra module refs: HalUARTReadDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTReadDMA 00018D30 + calls direct + XSTACK = 00000009 ( 0000000A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DA2 - 00018DA4 (0x3 bytes), align: 0 + Segment part 35. Intra module refs: HalUARTPollDMA + HalUARTReadDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine5 00018DA2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DA5 - 00018DAB (0x7 bytes), align: 0 + Segment part 36. Intra module refs: ?Subroutine5 + HalUARTPollDMA + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DAC - 00018DB9 (0xe bytes), align: 0 + Segment part 37. Intra module refs: HalUARTReadDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00018DAC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018DBA - 00018E4A (0x91 bytes), align: 0 + Segment part 40. Intra module refs: HalUARTPollDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTPollDMA 00018DBA + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018E4B - 00018EE4 (0x9a bytes), align: 0 + Segment part 42. Intra module refs: HalUARTRxAvailDMA::?relay + LOCAL ADDRESS + ===== ======= + HalUARTRxAvailDMA 00018E4B + calls direct + XSTACK = 0000000A ( 0000000D ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EE5 - 00018EE5 (0x1 bytes), align: 0 + Segment part 44. Intra module refs: HalUARTPollDMA + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00018EE5 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EE6 - 00018EFA (0x15 bytes), align: 0 + Segment part 45. Intra module refs: ?Subroutine3 + HalUARTPollDMA + HalUARTRxAvailDMA + ------------------------------------------------------------------------- +NEAR_CODE + Relative segment, address: CODE 00002A6D - 00002AD6 (0x6a bytes), align: 0 + Segment part 67. Intra module refs: halUart1TxIsr::??INTVEC 115 + ENTRY ADDRESS REF BY + ===== ======= ====== + halUart1TxIsr 00002A6D + interrupt function + ISTACK = 00000000 ( 00000008 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018EFB - 00018F04 (0xa bytes), align: 0 + Segment part 48. Intra module refs: HalUARTInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTInit 00018EFB + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F05 - 00018F17 (0x13 bytes), align: 0 + Segment part 50. Intra module refs: HalUARTOpen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTOpen 00018F05 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F18 - 00018F2C (0x15 bytes), align: 0 + Segment part 52. Intra module refs: HalUARTRead::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTRead 00018F18 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F2D - 00018F31 (0x5 bytes), align: 0 + Segment part 54. Intra module refs: HalUARTOpen + HalUARTRead + Hal_UART_RxBufLen + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00018F2D + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F32 - 00018F3B (0xa bytes), align: 0 + Segment part 61. Intra module refs: HalUARTPoll::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTPoll 00018F32 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F3C - 00018F52 (0x17 bytes), align: 0 + Segment part 63. Intra module refs: Hal_UART_RxBufLen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_UART_RxBufLen 00018F3C + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00018F53 - 00018F55 (0x3 bytes), align: 0 + Segment part 65. Intra module refs: HalUARTIsrDMA::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTIsrDMA 00018F53 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000075 (0x76 bytes), align: 0 + Segment part 19. ROOT. + ENTRY ADDRESS REF BY + ===== ======= ====== + halUart1TxIsr::??INTVEC 115 + 00000073 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001311 - 00001316 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: HalUARTInit + LOCAL ADDRESS + ===== ======= + HalUARTInitDMA::?relay + 00001311 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001317 - 0000131C (0x6 bytes), align: 0 + Segment part 31. Intra module refs: HalUARTOpen + LOCAL ADDRESS + ===== ======= + HalUARTOpenDMA::?relay + 00001317 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000131D - 00001322 (0x6 bytes), align: 0 + Segment part 34. Intra module refs: HalUARTRead + LOCAL ADDRESS + ===== ======= + HalUARTReadDMA::?relay + 0000131D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001323 - 00001328 (0x6 bytes), align: 0 + Segment part 41. Intra module refs: HalUARTPoll + LOCAL ADDRESS + ===== ======= + HalUARTPollDMA::?relay + 00001323 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001329 - 0000132E (0x6 bytes), align: 0 + Segment part 43. Intra module refs: HalUARTPollDMA + HalUARTReadDMA + Hal_UART_RxBufLen + LOCAL ADDRESS + ===== ======= + HalUARTRxAvailDMA::?relay + 00001329 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000132F - 00001334 (0x6 bytes), align: 0 + Segment part 49. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTInit::?relay 0000132F HalDriverInit (hal_drivers) + WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001335 - 0000133A (0x6 bytes), align: 0 + Segment part 51. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTOpen::?relay 00001335 WIMU_openUART (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000133B - 00001340 (0x6 bytes), align: 0 + Segment part 53. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTRead::?relay 0000133B WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001341 - 00001346 (0x6 bytes), align: 0 + Segment part 62. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTPoll::?relay 00001341 Hal_ProcessPoll (hal_drivers) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001347 - 0000134C (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + Hal_UART_RxBufLen::?relay + 00001347 WIMU_updateProfileSensors (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000134D - 00001352 (0x6 bytes), align: 0 + Segment part 66. + ENTRY ADDRESS REF BY + ===== ======= ====== + HalUARTIsrDMA::?relay 0000134D halDmaIsr (hal_dma) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\npi.r51 + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_bufmgr.r51 + PROGRAM MODULE, NAME : osal_bufmgr + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000B2C - 00000B2D (0x2 bytes), align: 0 + Segment part 6. Intra module refs: ?Subroutine4 + bm_desc_from_payload + osal_bm_alloc + osal_bm_free + LOCAL ADDRESS + ===== ======= + bm_list_ptr 00000B2C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A575 - 0001A5C6 (0x52 bytes), align: 0 + Segment part 7. Intra module refs: osal_bm_alloc::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_alloc 0001A575 + calls direct + XSTACK = 00000000 ( 0000000A ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A5C7 - 0001A639 (0x73 bytes), align: 0 + Segment part 9. Intra module refs: osal_bm_free::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_free 0001A5C7 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A63A - 0001A68B (0x52 bytes), align: 0 + Segment part 11. Intra module refs: osal_bm_adjust_header::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_adjust_header 0001A63A + calls direct + XSTACK = 00000000 ( 0000000C ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A68C - 0001A690 (0x5 bytes), align: 0 + Segment part 13. Intra module refs: osal_bm_adjust_header + LOCAL ADDRESS + ===== ======= + ?Subroutine0 0001A68C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A691 - 0001A6A6 (0x16 bytes), align: 0 + Segment part 16. Intra module refs: osal_bm_adjust_header + LOCAL ADDRESS + ===== ======= + ?Subroutine2 0001A691 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6A7 - 0001A6EB (0x45 bytes), align: 0 + Segment part 17. Intra module refs: bm_desc_from_payload::?relay + LOCAL ADDRESS + ===== ======= + bm_desc_from_payload 0001A6A7 + XSTACK = 0000000C ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6EC - 0001A6F1 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: bm_desc_from_payload + osal_bm_free + LOCAL ADDRESS + ===== ======= + ?Subroutine3 0001A6EC + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A6F2 - 0001A703 (0x12 bytes), align: 0 + Segment part 20. Intra module refs: bm_desc_from_payload + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001A6F2 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A704 - 0001A706 (0x3 bytes), align: 0 + Segment part 21. Intra module refs: osal_bm_alloc + osal_bm_free + LOCAL ADDRESS + ===== ======= + ?Subroutine4 0001A704 + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001A707 - 0001A70C (0x6 bytes), align: 0 + Segment part 22. Intra module refs: ?Subroutine1 + ?Subroutine4 + osal_bm_free + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001353 - 00001358 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_alloc::?relay 00001353 HCI_bm_alloc (hci) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001359 - 0000135E (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_free::?relay 00001359 LL_RxDataCompleteCback (hci_data) + attSendMsg (att_util) + gattProcessRxData (gatt_task) + hciTxDataBufferReset (hci_data) + l2capProcessRxData (l2cap_task) + l2capSendCmd (l2cap_util) + smProcessOSALMsg (sm_task) + smSendSMMsg (smp) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000135F - 00001364 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_bm_adjust_header::?relay + 0000135F L2CAP_bm_alloc (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capParsePacket (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001365 - 0000136A (0x6 bytes), align: 0 + Segment part 18. Intra module refs: ?Subroutine2 + LOCAL ADDRESS + ===== ======= + bm_desc_from_payload::?relay + 00001365 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_cbtimer.r51 + PROGRAM MODULE, NAME : osal_cbtimer + + SEGMENTS IN THE MODULE + ====================== +XDATA_I + Relative segment, address: XDATA 00000FA2 - 00000FA3 (0x2 bytes), align: 0 + Segment part 6. Intra module refs: osal_CbTimerInit + osal_CbTimerProcessEvent + osal_CbTimerStart + osal_CbTimerStop + ENTRY ADDRESS REF BY + ===== ======= ====== + baseTaskID 00000FA2 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B2E - 00000B69 (0x3c bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine1 + osal_CbTimerInit + osal_CbTimerStop + ENTRY ADDRESS REF BY + ===== ======= ====== + cbTimers 00000B2E + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DD1 - 00019DFA (0x2a bytes), align: 0 + Segment part 9. Intra module refs: osal_CbTimerInit::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerInit 00019DD1 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019DFB - 00019EC9 (0xcf bytes), align: 0 + Segment part 11. Intra module refs: osal_CbTimerProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerProcessEvent + 00019DFB + XSTACK = 00000000 ( 0000000F ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019ECA - 00019F8E (0xc5 bytes), align: 0 + Segment part 13. Intra module refs: osal_CbTimerStart::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStart 00019ECA + calls direct + XSTACK = 00000004 ( 00000019 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019F8F - 00019F9B (0xd bytes), align: 0 + Segment part 15. Intra module refs: osal_CbTimerProcessEvent + osal_CbTimerStart + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00019F8F + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019F9C - 00019F9D (0x2 bytes), align: 0 + Segment part 16. Intra module refs: osal_CbTimerStart + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00019F9C + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019F9E - 00019FA5 (0x8 bytes), align: 0 + Segment part 17. Intra module refs: ?Subroutine0 + osal_CbTimerStop + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 00019FA6 - 0001A017 (0x72 bytes), align: 0 + Segment part 20. Intra module refs: osal_CbTimerStop::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStop 00019FA6 + calls direct + XSTACK = 00000000 ( 0000000B ) + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000414 - 00000415 (0x2 bytes), align: 0 + Segment part 7. Intra module refs: baseTaskID + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000136B - 00001370 (0x6 bytes), align: 0 + Segment part 10. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerInit::?relay + 0000136B osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001371 - 00001376 (0x6 bytes), align: 0 + Segment part 12. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerProcessEvent::?relay + 00001371 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001377 - 0000137C (0x6 bytes), align: 0 + Segment part 14. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStart::?relay + 00001377 gattStartTimer (gatt_task) + l2capSendReq (l2cap_util) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000137D - 00001382 (0x6 bytes), align: 0 + Segment part 21. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_CbTimerStop::?relay + 0000137D gattStopTimer (gatt_task) + l2capStopTimer (l2cap_util) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_snv.r51 + PROGRAM MODULE, NAME : osal_snv + + SEGMENTS IN THE MODULE + ====================== +BLENV_ADDRESS_SPACE + Relative segment, address: CODE 0001E800 - 0001F7FF (0x1000 bytes), align: 0 + Segment part 6. Intra module refs: activePg + ENTRY ADDRESS REF BY + ===== ======= ====== + _nvBuf 0001E800 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B6A - 00000B6A (0x1 bytes), align: 0 + Segment part 7. Intra module refs: ?Subroutine11 + ?Subroutine12 + Segment part 48 + initNV + setActivePage + setXferPage + LOCAL ADDRESS + ===== ======= + activePg 00000B6A + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B6B - 00000B6C (0x2 bytes), align: 0 + Segment part 8. Intra module refs: ?Subroutine12 + compactPage + findOffset + initNV + osal_snv_compact + osal_snv_write + LOCAL ADDRESS + ===== ======= + pgOff 00000B6B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B6D - 00000B6D (0x1 bytes), align: 0 + Segment part 9. Intra module refs: compactPage + erasePage + initNV + osal_snv_write + setActivePage + verifyWordM + writeItem + writeWord + LOCAL ADDRESS + ===== ======= + failF 00000B6D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014710 - 000147DB (0xcc bytes), align: 0 + Segment part 14. Intra module refs: initNV::?relay + LOCAL ADDRESS + ===== ======= + initNV 00014710 + calls direct + XSTACK = 00000000 ( 00000012 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000147DC - 0001481C (0x41 bytes), align: 0 + Segment part 16. Intra module refs: setActivePage::?relay + LOCAL ADDRESS + ===== ======= + setActivePage 000147DC + calls direct + XSTACK = 0000001E ( 0000000D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001481D - 0001484F (0x33 bytes), align: 0 + Segment part 18. Intra module refs: setXferPage::?relay + LOCAL ADDRESS + ===== ======= + setXferPage 0001481D + calls direct + XSTACK = 00000011 ( 00000004 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014850 - 00014856 (0x7 bytes), align: 0 + Segment part 20. Intra module refs: osal_snv_init + setXferPage + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00014850 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014857 - 000148A6 (0x50 bytes), align: 0 + Segment part 21. Intra module refs: erasePage::?relay + LOCAL ADDRESS + ===== ======= + erasePage 00014857 + calls direct + XSTACK = 0000001E ( 0000000F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148A7 - 000148AA (0x4 bytes), align: 0 + Segment part 23. Intra module refs: cleanErasedPage + erasePage + LOCAL ADDRESS + ===== ======= + ?Subroutine3 000148A7 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148AB - 000148AC (0x2 bytes), align: 0 + Segment part 24. Intra module refs: findItem + findOffset + initNV + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000148AB + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148AD - 000148AF (0x3 bytes), align: 0 + Segment part 25. Intra module refs: ?Subroutine0 + ?Subroutine3 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148B0 - 000148B4 (0x5 bytes), align: 0 + Segment part 26. Intra module refs: Segment part 25 + osal_snv_read + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148B5 - 000148FC (0x48 bytes), align: 0 + Segment part 27. Intra module refs: cleanErasedPage::?relay + LOCAL ADDRESS + ===== ======= + cleanErasedPage 000148B5 + calls direct + XSTACK = 00000010 ( 0000000F ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000148FD - 00014908 (0xc bytes), align: 0 + Segment part 29. Intra module refs: cleanErasedPage + erasePage + LOCAL ADDRESS + ===== ======= + ?Subroutine9 000148FD + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014909 - 00014966 (0x5e bytes), align: 0 + Segment part 30. Intra module refs: findOffset::?relay + LOCAL ADDRESS + ===== ======= + findOffset 00014909 + calls direct + XSTACK = 00000010 ( 00000012 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014967 - 000149F1 (0x8b bytes), align: 0 + Segment part 32. Intra module refs: findItem::?relay + LOCAL ADDRESS + ===== ======= + findItem 00014967 + calls direct + XSTACK = 0000001E ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000149F2 - 000149FC (0xb bytes), align: 0 + Segment part 34. Intra module refs: compactPage + findItem + findOffset + LOCAL ADDRESS + ===== ======= + ?Subroutine8 000149F2 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000149FD - 00014AEB (0xef bytes), align: 0 + Segment part 35. Intra module refs: writeItem::?relay + LOCAL ADDRESS + ===== ======= + writeItem 000149FD + calls direct + XSTACK = 00000015 ( 0000001A ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014AEC - 00014AEF (0x4 bytes), align: 0 + Segment part 37. Intra module refs: writeItem + LOCAL ADDRESS + ===== ======= + ?Subroutine4 00014AEC + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014AF0 - 00014B04 (0x15 bytes), align: 0 + Segment part 38. Intra module refs: ?Subroutine4 + writeItem + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014B05 - 00014C85 (0x181 bytes), align: 0 + Segment part 39. Intra module refs: compactPage::?relay + LOCAL ADDRESS + ===== ======= + compactPage 00014B05 + calls direct + XSTACK = 00000011 ( 00000020 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014C86 - 00014C8E (0x9 bytes), align: 0 + Segment part 41. Intra module refs: compactPage + LOCAL ADDRESS + ===== ======= + ?Subroutine7 00014C86 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014C8F - 00014D11 (0x83 bytes), align: 0 + Segment part 42. Intra module refs: verifyWordM::?relay + LOCAL ADDRESS + ===== ======= + verifyWordM 00014C8F + calls direct + XSTACK = 00000019 ( 00000016 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D12 - 00014D14 (0x3 bytes), align: 0 + Segment part 44. Intra module refs: osal_snv_write + verifyWordM + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00014D12 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D15 - 00014D19 (0x5 bytes), align: 0 + Segment part 45. Intra module refs: ?Subroutine2 + osal_snv_compact + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D1A - 00014D20 (0x7 bytes), align: 0 + Segment part 46. Intra module refs: findOffset + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine5 00014D1A + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D21 - 00014D21 (0x1 bytes), align: 0 + Segment part 47. Intra module refs: ?Subroutine5 + compactPage + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D22 - 00014D25 (0x4 bytes), align: 0 + Segment part 48. Intra module refs: Segment part 47 + osal_snv_read + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D26 - 00014D26 (0x1 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + initNV + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D27 - 00014D2C (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + cleanErasedPage + compactPage + erasePage + findItem + verifyWordM + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D2D - 00014D93 (0x67 bytes), align: 0 + Segment part 51. Intra module refs: writeWord::?relay + LOCAL ADDRESS + ===== ======= + writeWord 00014D2D + calls direct + XSTACK = 0000001E ( 00000011 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014D94 - 00014DA6 (0x13 bytes), align: 0 + Segment part 53. Intra module refs: osal_snv_init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_init 00014D94 + calls direct + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014DA7 - 00014E90 (0xea bytes), align: 0 + Segment part 55. Intra module refs: osal_snv_write::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_write 00014DA7 + calls direct + XSTACK = 00000000 ( 00000015 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E91 - 00014E9A (0xa bytes), align: 0 + Segment part 57. Intra module refs: compactPage + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00014E91 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014E9B - 00014ECE (0x34 bytes), align: 0 + Segment part 58. Intra module refs: osal_snv_read::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_read 00014E9B + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014ECF - 00014ED5 (0x7 bytes), align: 0 + Segment part 60. Intra module refs: osal_snv_read + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00014ECF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014ED6 - 00014EE3 (0xe bytes), align: 0 + Segment part 61. Intra module refs: ?Subroutine6 + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00014ED6 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014EE4 - 00014F39 (0x56 bytes), align: 0 + Segment part 62. Intra module refs: osal_snv_compact::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_compact 00014EE4 + calls direct + XSTACK = 00000000 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014F3A - 00014F45 (0xc bytes), align: 0 + Segment part 64. Intra module refs: osal_snv_compact + osal_snv_write + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00014F3A + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F53 - 00008F56 (0x4 bytes), align: 0 + Segment part 10. Intra module refs: initNV + setActivePage + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_100000 00008F53 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001383 - 00001388 (0x6 bytes), align: 0 + Segment part 15. Intra module refs: osal_snv_init + LOCAL ADDRESS + ===== ======= + initNV::?relay 00001383 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001389 - 0000138E (0x6 bytes), align: 0 + Segment part 17. Intra module refs: compactPage + initNV + LOCAL ADDRESS + ===== ======= + setActivePage::?relay 00001389 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000138F - 00001394 (0x6 bytes), align: 0 + Segment part 19. Intra module refs: ?Subroutine11 + LOCAL ADDRESS + ===== ======= + setXferPage::?relay 0000138F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001395 - 0000139A (0x6 bytes), align: 0 + Segment part 22. Intra module refs: cleanErasedPage + compactPage + initNV + LOCAL ADDRESS + ===== ======= + erasePage::?relay 00001395 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000139B - 000013A0 (0x6 bytes), align: 0 + Segment part 28. Intra module refs: initNV + LOCAL ADDRESS + ===== ======= + cleanErasedPage::?relay + 0000139B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013A1 - 000013A6 (0x6 bytes), align: 0 + Segment part 31. Intra module refs: initNV + LOCAL ADDRESS + ===== ======= + findOffset::?relay 000013A1 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013A7 - 000013AC (0x6 bytes), align: 0 + Segment part 33. Intra module refs: ?Subroutine6 + compactPage + LOCAL ADDRESS + ===== ======= + findItem::?relay 000013A7 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013AD - 000013B2 (0x6 bytes), align: 0 + Segment part 36. Intra module refs: osal_snv_write + LOCAL ADDRESS + ===== ======= + writeItem::?relay 000013AD + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013B3 - 000013B8 (0x6 bytes), align: 0 + Segment part 40. Intra module refs: ?Subroutine11 + initNV + LOCAL ADDRESS + ===== ======= + compactPage::?relay 000013B3 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013B9 - 000013BE (0x6 bytes), align: 0 + Segment part 43. Intra module refs: writeItem + writeWord + LOCAL ADDRESS + ===== ======= + verifyWordM::?relay 000013B9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013BF - 000013C4 (0x6 bytes), align: 0 + Segment part 52. Intra module refs: Segment part 38 + compactPage + setActivePage + setXferPage + writeItem + LOCAL ADDRESS + ===== ======= + writeWord::?relay 000013BF + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013C5 - 000013CA (0x6 bytes), align: 0 + Segment part 54. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_init::?relay 000013C5 main (WIMU_Main) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013CB - 000013D0 (0x6 bytes), align: 0 + Segment part 56. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_write::?relay + 000013CB ?Subroutine17 (gapbondmgr) + ?Subroutine22 (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013D1 - 000013D6 (0x6 bytes), align: 0 + Segment part 59. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_read::?relay 000013D1 GAPBondMgr_LinkEst (gapbondmgr) + GAPRole_Init (peripheral) + Segment part 93 (gapbondmgr) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013D7 - 000013DC (0x6 bytes), align: 0 + Segment part 63. + ENTRY ADDRESS REF BY + ===== ======= ====== + osal_snv_compact::?relay + 000013D7 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F53 - 00008F56 (0x4 bytes), align: 0 + Segment part 65. Intra module refs: __Constant_100000 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\peripheral.r51 + PROGRAM MODULE, NAME : peripheral + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000B6E - 00000B6E (0x1 bytes), align: 0 + Segment part 6. Intra module refs: ?Subroutine17 + GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + GAPRole_StartDevice + GAPRole_TerminateConnection + Segment part 55 + Segment part 99 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_TaskID 00000B6E + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B6F - 00000B6F (0x1 bytes), align: 0 + Segment part 7. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + GAPRole_StartDevice + GAPRole_TerminateConnection + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapRole_state 00000B6F + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B70 - 00000B70 (0x1 bytes), align: 0 + Segment part 8. Intra module refs: GAPRole_Init + GAPRole_StartDevice + LOCAL ADDRESS + ===== ======= + gapRole_profileRole 00000B70 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B71 - 00000B80 (0x10 bytes), align: 0 + Segment part 9. Intra module refs: GAPRole_Init + GAPRole_SetParameter + GAPRole_StartDevice + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_IRK 00000B71 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B81 - 00000B90 (0x10 bytes), align: 0 + Segment part 10. Intra module refs: GAPRole_Init + GAPRole_SetParameter + GAPRole_StartDevice + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_SRK 00000B81 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B91 - 00000B94 (0x4 bytes), align: 0 + Segment part 11. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + GAPRole_StartDevice + LOCAL ADDRESS + ===== ======= + gapRole_signCounter 00000B91 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B95 - 00000B9A (0x6 bytes), align: 0 + Segment part 12. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_bdAddr 00000B95 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FA4 - 00000FA4 (0x1 bytes), align: 0 + Segment part 13. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvEnabled 00000FA4 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FA5 - 00000FA6 (0x2 bytes), align: 0 + Segment part 15. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertOffTime 00000FA5 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FA7 - 00000FA7 (0x1 bytes), align: 0 + Segment part 17. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertDataLen 00000FA7 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FA8 - 00000FC6 (0x1f bytes), align: 0 + Segment part 19. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_AdvertData 00000FA8 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B9B - 00000B9B (0x1 bytes), align: 0 + Segment part 21. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ScanRspDataLen + 00000B9B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000B9C - 00000BBA (0x1f bytes), align: 0 + Segment part 22. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ScanRspData 00000B9C + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BBB - 00000BBB (0x1 bytes), align: 0 + Segment part 23. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvEventType 00000BBB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BBC - 00000BBC (0x1 bytes), align: 0 + Segment part 24. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvDirectType 00000BBC + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BBD - 00000BC2 (0x6 bytes), align: 0 + Segment part 25. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvDirectAddr 00000BBD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BC3 - 00000BC3 (0x1 bytes), align: 0 + Segment part 26. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvChanMap 00000BC3 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BC4 - 00000BC4 (0x1 bytes), align: 0 + Segment part 27. Intra module refs: GAPRole_Init + GAPRole_ProcessEvent + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + gapRole_AdvFilterPolicy + 00000BC4 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FC7 - 00000FC8 (0x2 bytes), align: 0 + Segment part 28. Intra module refs: ?Subroutine13 + GAPRole_Init + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ConnectionHandle + 00000FC7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BC5 - 00000BC6 (0x2 bytes), align: 0 + Segment part 30. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_RSSIReadRate 00000BC5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BC7 - 00000BCC (0x6 bytes), align: 0 + Segment part 31. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ConnectedDevAddr + 00000BC7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BCD - 00000BCD (0x1 bytes), align: 0 + Segment part 32. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + gapRole_ParamUpdateEnable + 00000BCD + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FC9 - 00000FCA (0x2 bytes), align: 0 + Segment part 33. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_MinConnInterval + 00000FC9 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FCB - 00000FCC (0x2 bytes), align: 0 + Segment part 35. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_MaxConnInterval + 00000FCB + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BCE - 00000BCF (0x2 bytes), align: 0 + Segment part 37. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_SlaveLatency 00000BCE + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FCD - 00000FCE (0x2 bytes), align: 0 + Segment part 38. Intra module refs: GAPRole_ProcessEvent + GAPRole_SendUpdateParam + GAPRole_SetParameter + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_TimeoutMultiplier + 00000FCD + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD0 - 00000BD1 (0x2 bytes), align: 0 + Segment part 40. Intra module refs: ?Subroutine8 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnInterval 00000BD0 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD2 - 00000BD3 (0x2 bytes), align: 0 + Segment part 41. Intra module refs: ?Subroutine9 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnSlaveLatency + 00000BD2 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD4 - 00000BD5 (0x2 bytes), align: 0 + Segment part 42. Intra module refs: ?Subroutine10 + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + gapRole_ConnTimeout 00000BD4 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD6 - 00000BD6 (0x1 bytes), align: 0 + Segment part 43. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessOSALMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + paramUpdateNoSuccessOption + 00000BD6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD7 - 00000BD8 (0x2 bytes), align: 0 + Segment part 44. Intra module refs: ?Subroutine5 + GAPRole_StartDevice + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + pGapRoles_AppCGs 00000BD7 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BD9 - 00000BDA (0x2 bytes), align: 0 + Segment part 45. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + pGapRoles_ParamUpdateCB + 00000BD9 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010C82 - 00010F82 (0x301 bytes), align: 0 + Segment part 47. Intra module refs: GAPRole_SetParameter::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SetParameter 00010C82 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F83 - 00010F84 (0x2 bytes), align: 0 + Segment part 49. Intra module refs: ?Subroutine20 + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine24 00010F83 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F85 - 00010F8A (0x6 bytes), align: 0 + Segment part 50. Intra module refs: ?Subroutine21 + ?Subroutine24 + GAPRole_SendUpdateParam + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F8B - 00010F96 (0xc bytes), align: 0 + Segment part 51. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine20 00010F8B + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010F97 - 00010FA3 (0xd bytes), align: 0 + Segment part 52. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00010F97 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FA4 - 00010FA8 (0x5 bytes), align: 0 + Segment part 53. Intra module refs: GAPRole_SendUpdateParam + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine6 00010FA4 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FA9 - 00010FAA (0x2 bytes), align: 0 + Segment part 54. Intra module refs: ?Subroutine6 + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FAB - 00010FB3 (0x9 bytes), align: 0 + Segment part 55. Intra module refs: Segment part 54 + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FB4 - 00010FB6 (0x3 bytes), align: 0 + Segment part 61. Intra module refs: GAPRole_ProcessEvent + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine0 00010FB4 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FB7 - 00010FBB (0x5 bytes), align: 0 + Segment part 62. Intra module refs: ?Subroutine0 + GAPRole_SendUpdateParam + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00010FBC - 0001100B (0x50 bytes), align: 0 + Segment part 63. Intra module refs: GAPRole_StartDevice::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_StartDevice 00010FBC + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001100C - 00011012 (0x7 bytes), align: 0 + Segment part 67. Intra module refs: GAPRole_TerminateConnection + LOCAL ADDRESS + ===== ======= + ?Subroutine1 0001100C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011013 - 0001102F (0x1d bytes), align: 0 + Segment part 68. Intra module refs: GAPRole_TerminateConnection::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_TerminateConnection + 00011013 + calls direct + XSTACK = 00000016 ( 00000000 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011030 - 000110AF (0x80 bytes), align: 0 + Segment part 70. Intra module refs: GAPRole_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_Init 00011030 + calls direct + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000110B0 - 0001121F (0x170 bytes), align: 0 + Segment part 72. Intra module refs: GAPRole_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_ProcessEvent 000110B0 + calls direct + XSTACK = 00000000 ( 0000001A ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011220 - 00011225 (0x6 bytes), align: 0 + Segment part 74. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine15 00011220 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011226 - 0001122B (0x6 bytes), align: 0 + Segment part 75. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00011226 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001122C - 000112FA (0xcf bytes), align: 0 + Segment part 76. Intra module refs: gapRole_ProcessOSALMsg::?relay + LOCAL ADDRESS + ===== ======= + gapRole_ProcessOSALMsg + 0001122C + calls direct + XSTACK = 00000016 ( 00000010 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000112FB - 00011602 (0x308 bytes), align: 0 + Segment part 78. Intra module refs: gapRole_ProcessGAPMsg::?relay + LOCAL ADDRESS + ===== ======= + gapRole_ProcessGAPMsg 000112FB + calls direct + XSTACK = 0000000C ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011603 - 00011608 (0x6 bytes), align: 0 + Segment part 80. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine19 00011603 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011609 - 00011615 (0xd bytes), align: 0 + Segment part 81. Intra module refs: GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine17 00011609 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011616 - 00011618 (0x3 bytes), align: 0 + Segment part 82. Intra module refs: gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine14 00011616 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011619 - 0001161E (0x6 bytes), align: 0 + Segment part 83. Intra module refs: ?Subroutine14 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001161F - 00011621 (0x3 bytes), align: 0 + Segment part 84. Intra module refs: GAPRole_ProcessEvent + GAPRole_TerminateConnection + gapRole_startConnUpdate + LOCAL ADDRESS + ===== ======= + ?Subroutine13 0001161F + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011622 - 00011627 (0x6 bytes), align: 0 + Segment part 85. Intra module refs: ?Subroutine13 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011628 - 00011633 (0xc bytes), align: 0 + Segment part 86. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine10 00011628 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011634 - 0001163F (0xc bytes), align: 0 + Segment part 87. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine9 00011634 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011640 - 0001164B (0xc bytes), align: 0 + Segment part 88. Intra module refs: gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine8 00011640 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001164C - 00011653 (0x8 bytes), align: 0 + Segment part 89. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine7 0001164C + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011654 - 0001165E (0xb bytes), align: 0 + Segment part 90. Intra module refs: ?Subroutine7 + GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine23 00011654 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001165F - 00011661 (0x3 bytes), align: 0 + Segment part 91. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine5 0001165F + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011662 - 00011667 (0x6 bytes), align: 0 + Segment part 92. Intra module refs: ?Subroutine5 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011668 - 00011734 (0xcd bytes), align: 0 + Segment part 93. Intra module refs: gapRole_startConnUpdate::?relay + LOCAL ADDRESS + ===== ======= + gapRole_startConnUpdate + 00011668 + calls direct + XSTACK = 00000016 ( 00000018 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011735 - 00011738 (0x4 bytes), align: 0 + Segment part 95. Intra module refs: GAPRole_SetParameter + LOCAL ADDRESS + ===== ======= + ?Subroutine11 00011735 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011739 - 0001173C (0x4 bytes), align: 0 + Segment part 96. Intra module refs: ?Subroutine11 + GAPRole_ProcessEvent + gapRole_ProcessGAPMsg + gapRole_startConnUpdate + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001173D - 00011742 (0x6 bytes), align: 0 + Segment part 97. Intra module refs: ?Subroutine10 + ?Subroutine8 + ?Subroutine9 + Segment part 92 + Segment part 96 + LOCAL ADDRESS + ===== ======= + ?Subroutine22 0001173D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011743 - 00011744 (0x2 bytes), align: 0 + Segment part 98. Intra module refs: GAPRole_ProcessEvent + GAPRole_SetParameter + gapRole_ProcessGAPMsg + LOCAL ADDRESS + ===== ======= + ?Subroutine3 00011743 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011745 - 00011751 (0xd bytes), align: 0 + Segment part 99. Intra module refs: ?Subroutine3 + gapRole_ProcessGAPMsg + gapRole_ProcessOSALMsg + gapRole_startConnUpdate + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00011752 - 000117DE (0x8d bytes), align: 0 + Segment part 100. Intra module refs: GAPRole_SendUpdateParam::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SendUpdateParam + 00011752 + calls direct + XSTACK = 0000001A ( 0000000C ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000117DF - 000117E7 (0x9 bytes), align: 0 + Segment part 102. Intra module refs: GAPRole_SendUpdateParam + LOCAL ADDRESS + ===== ======= + ?Subroutine21 000117DF + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000416 - 00000416 (0x1 bytes), align: 0 + Segment part 14. Intra module refs: gapRole_AdvEnabled + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000417 - 00000418 (0x2 bytes), align: 0 + Segment part 16. Intra module refs: gapRole_AdvertOffTime + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000419 - 00000419 (0x1 bytes), align: 0 + Segment part 18. Intra module refs: gapRole_AdvertDataLen + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000041A - 00000438 (0x1f bytes), align: 0 + Segment part 20. Intra module refs: gapRole_AdvertData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000439 - 0000043A (0x2 bytes), align: 0 + Segment part 29. Intra module refs: gapRole_ConnectionHandle + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043B - 0000043C (0x2 bytes), align: 0 + Segment part 34. Intra module refs: gapRole_MinConnInterval + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043D - 0000043E (0x2 bytes), align: 0 + Segment part 36. Intra module refs: gapRole_MaxConnInterval + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000043F - 00000440 (0x2 bytes), align: 0 + Segment part 39. Intra module refs: gapRole_TimeoutMultiplier + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013DD - 000013E2 (0x6 bytes), align: 0 + Segment part 48. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SetParameter::?relay + 000013DD WIMU_Init (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013E3 - 000013E8 (0x6 bytes), align: 0 + Segment part 64. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_StartDevice::?relay + 000013E3 WIMU_ProcessEvent (wimu) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013E9 - 000013EE (0x6 bytes), align: 0 + Segment part 69. Intra module refs: GAPRole_ProcessEvent + gapRole_ProcessOSALMsg + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_TerminateConnection::?relay + 000013E9 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013EF - 000013F4 (0x6 bytes), align: 0 + Segment part 71. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_Init::?relay 000013EF osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013F5 - 000013FA (0x6 bytes), align: 0 + Segment part 73. + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_ProcessEvent::?relay + 000013F5 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 000013FB - 00001400 (0x6 bytes), align: 0 + Segment part 77. Intra module refs: GAPRole_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapRole_ProcessOSALMsg::?relay + 000013FB + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001401 - 00001406 (0x6 bytes), align: 0 + Segment part 79. Intra module refs: gapRole_ProcessOSALMsg + LOCAL ADDRESS + ===== ======= + gapRole_ProcessGAPMsg::?relay + 00001401 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001407 - 0000140C (0x6 bytes), align: 0 + Segment part 94. Intra module refs: ?Subroutine6 + GAPRole_ProcessEvent + LOCAL ADDRESS + ===== ======= + gapRole_startConnUpdate::?relay + 00001407 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000140D - 00001412 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: GAPRole_ProcessEvent + ENTRY ADDRESS REF BY + ===== ======= ====== + GAPRole_SendUpdateParam::?relay + 0000140D + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\st_util.r51 + PROGRAM MODULE, NAME : st_util + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00007FBF - 00007FF7 (0x39 bytes), align: 0 + Segment part 6. Intra module refs: utilExtractUuid16::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + utilExtractUuid16 00007FBF + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001413 - 00001418 (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + utilExtractUuid16::?relay + 00001413 Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu.r51 + PROGRAM MODULE, NAME : wimu + + SEGMENTS IN THE MODULE + ====================== +XDATA_Z + Relative segment, address: XDATA 00000BDB - 00000BDB (0x1 bytes), align: 0 + Segment part 12. Intra module refs: WIMU_Init + WIMU_ProcessEvent + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_TaskID 00000BDB + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FCF - 00000FE3 (0x15 bytes), align: 0 + Segment part 13. Intra module refs: WIMU_Init + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + scanRspData 00000FCF + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FE4 - 00000FEE (0xb bytes), align: 0 + Segment part 15. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + advertData 00000FE4 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00000FEF - 00001003 (0x15 bytes), align: 0 + Segment part 17. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + attDeviceName 00000FEF + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BDC - 00000BDF (0x4 bytes), align: 0 + Segment part 19. Intra module refs: WIMU_ProcessEvent + LOCAL ADDRESS + ===== ======= + WIMU_PeripheralCBs 00000BDC + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BE0 - 00000BE3 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: WIMU_ProcessEvent + LOCAL ADDRESS + ===== ======= + WIMU_BondMgrCBs 00000BE0 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013EB5 - 00013F22 (0x6e bytes), align: 0 + Segment part 39. Intra module refs: WIMU_openUART::?relay + LOCAL ADDRESS + ===== ======= + WIMU_openUART 00013EB5 + calls direct + XSTACK = 0000001D ( 0000001D ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00013F23 - 000140F9 (0x1d7 bytes), align: 0 + Segment part 41. Intra module refs: WIMU_Init::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_Init 00013F23 + calls direct + XSTACK = 00000000 ( 0000001D ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000140FA - 000140FE (0x5 bytes), align: 0 + Segment part 43. Intra module refs: WIMU_Init + WIMU_UARTCallback + LOCAL ADDRESS + ===== ======= + ?Subroutine0 000140FA + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000140FF - 00014108 (0xa bytes), align: 0 + Segment part 44. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + ?Subroutine3 000140FF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014109 - 00014189 (0x81 bytes), align: 0 + Segment part 45. Intra module refs: WIMU_ProcessEvent::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_ProcessEvent 00014109 + calls direct + XSTACK = 00000000 ( 0000000E ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001418A - 0001419B (0x12 bytes), align: 0 + Segment part 47. Intra module refs: WIMU_UARTCallback::?relay + LOCAL ADDRESS + ===== ======= + WIMU_UARTCallback 0001418A + calls direct, is indirectly called + XSTACK = 00000000 ( 00000009 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001419C - 00014678 (0x4dd bytes), align: 0 + Segment part 49. Intra module refs: WIMU_updateProfileSensors::?relay + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors + 0001419C + calls direct + XSTACK = 00000009 ( 00000016 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014679 - 00014682 (0xa bytes), align: 0 + Segment part 51. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine15 00014679 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014683 - 0001468C (0xa bytes), align: 0 + Segment part 52. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine14 00014683 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 0001468D - 00014692 (0x6 bytes), align: 0 + Segment part 53. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine13 0001468D + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014693 - 00014696 (0x4 bytes), align: 0 + Segment part 54. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine12 00014693 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014697 - 0001469F (0x9 bytes), align: 0 + Segment part 55. Intra module refs: ?Subroutine10 + ?Subroutine11 + ?Subroutine12 + ?Subroutine4 + LOCAL ADDRESS + ===== ======= + ?Subroutine17 00014697 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146A0 - 000146A5 (0x6 bytes), align: 0 + Segment part 56. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine11 000146A0 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146A6 - 000146AB (0x6 bytes), align: 0 + Segment part 57. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine10 000146A6 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146AC - 000146BE (0x13 bytes), align: 0 + Segment part 58. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine9 000146AC + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146BF - 000146C7 (0x9 bytes), align: 0 + Segment part 59. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine8 000146BF + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146C8 - 000146D1 (0xa bytes), align: 0 + Segment part 60. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine7 000146C8 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146D2 - 000146DB (0xa bytes), align: 0 + Segment part 61. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine6 000146D2 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146DC - 000146E7 (0xc bytes), align: 0 + Segment part 62. Intra module refs: ?Subroutine5 + ?Subroutine6 + ?Subroutine7 + LOCAL ADDRESS + ===== ======= + ?Subroutine16 000146DC + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146E8 - 000146F1 (0xa bytes), align: 0 + Segment part 63. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine5 000146E8 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 000146F2 - 000146FF (0xe bytes), align: 0 + Segment part 64. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine4 000146F2 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014700 - 00014701 (0x2 bytes), align: 0 + Segment part 65. Intra module refs: WIMU_openUART + LOCAL ADDRESS + ===== ======= + ?Subroutine2 00014700 + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014702 - 00014706 (0x5 bytes), align: 0 + Segment part 66. Intra module refs: ?Subroutine2 + WIMU_Init + WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 2 (was BANKED_CODE) + Relative segment, address: CODE 00014707 - 0001470F (0x9 bytes), align: 0 + Segment part 67. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + ?Subroutine1 00014707 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BE4 - 00000BE5 (0x2 bytes), align: 0 + Segment part 21. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::test + 00000BE4 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BE6 - 00000BE9 (0x4 bytes), align: 0 + Segment part 22. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::serialNumber + 00000BE6 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000BEA - 00000C06 (0x1d bytes), align: 0 + Segment part 23. Intra module refs: ?Subroutine15 + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::firmSoftRevision + 00000BEA + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C07 - 00000C1A (0x14 bytes), align: 0 + Segment part 24. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::imuData + 00000C07 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C1B - 00000C2A (0x10 bytes), align: 0 + Segment part 25. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::quaternionData + 00000C1B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C2B - 00000C2B (0x1 bytes), align: 0 + Segment part 26. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::batteryData + 00000C2B + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C2C - 00000C3C (0x11 bytes), align: 0 + Segment part 27. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::locAndSpeed + 00000C2C + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C3D - 00000C4C (0x10 bytes), align: 0 + Segment part 28. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::posQuality + 00000C3D + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C4D - 00000C53 (0x7 bytes), align: 0 + Segment part 29. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::dateTime + 00000C4D + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C54 - 00000C54 (0x1 bytes), align: 0 + Segment part 30. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::numBytes + 00000C54 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001004 - 00001004 (0x1 bytes), align: 0 + Segment part 31. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::header + 00001004 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000C55 - 00000CC4 (0x70 bytes), align: 0 + Segment part 33. Intra module refs: ?Subroutine9 + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::rx_byte + 00000C55 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CC5 - 00000CC6 (0x2 bytes), align: 0 + Segment part 34. Intra module refs: ?Subroutine1 + WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::rx_len + 00000CC5 + ------------------------------------------------------------------------- +XDATA_Z + Relative segment, address: XDATA 00000CC7 - 00000CC7 (0x1 bytes), align: 0 + Segment part 35. Intra module refs: WIMU_updateProfileSensors + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::rx_index + 00000CC7 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000441 - 00000455 (0x15 bytes), align: 0 + Segment part 14. Intra module refs: scanRspData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000456 - 00000460 (0xb bytes), align: 0 + Segment part 16. Intra module refs: advertData + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000461 - 00000475 (0x15 bytes), align: 0 + Segment part 18. Intra module refs: attDeviceName + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000476 - 00000476 (0x1 bytes), align: 0 + Segment part 32. Intra module refs: WIMU_updateProfileSensors::header + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001419 - 0000141E (0x6 bytes), align: 0 + Segment part 40. Intra module refs: WIMU_Init + LOCAL ADDRESS + ===== ======= + WIMU_openUART::?relay 00001419 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000141F - 00001424 (0x6 bytes), align: 0 + Segment part 42. + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_Init::?relay 0000141F osalInitTasks (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001425 - 0000142A (0x6 bytes), align: 0 + Segment part 46. + ENTRY ADDRESS REF BY + ===== ======= ====== + WIMU_ProcessEvent::?relay + 00001425 tasksArr (OSAL_WIMU) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000142B - 00001430 (0x6 bytes), align: 0 + Segment part 48. Intra module refs: WIMU_openUART + LOCAL ADDRESS + ===== ======= + WIMU_UARTCallback::?relay + 0000142B + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001431 - 00001436 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: WIMU_UARTCallback + LOCAL ADDRESS + ===== ======= + WIMU_updateProfileSensors::?relay + 00001431 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008ECE - 00008ED4 (0x7 bytes), align: 0 + Segment part 6. Intra module refs: WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F0A - 00008F0E (0x5 bytes), align: 0 + Segment part 7. Intra module refs: WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F8E - 00008F90 (0x3 bytes), align: 0 + Segment part 8. Intra module refs: WIMU_updateProfileSensors + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C) + Relative segment, address: CONST 00008F73 - 00008F76 (0x4 bytes), align: 0 + Segment part 38. Intra module refs: WIMU_ProcessEvent + llScheduleTask (ll_scheduler) + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_5 00008F73 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008ECE - 00008ED4 (0x7 bytes), align: 0 + Segment part 68. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F0A - 00008F0E (0x5 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 7 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F8E - 00008F90 (0x3 bytes), align: 0 + Segment part 70. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- + 1 (was XDATA_ROM_C_FLASH) + Relative segment, address: CODE 00008F73 - 00008F76 (0x4 bytes), align: 0 + Segment part 73. Intra module refs: __Constant_5 + + ************************************************************************* + + FILE NAME : D:\Simon_Dev\WIMuGPS\Workspace\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu_util.r51 + ************************************************************************* + + FILE NAME : C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 + LIBRARY MODULE, NAME : ?cexit + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000091 - 00000095 (0x5 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + exit 00000091 ?call_main (?cmain) + ?C_EXIT 00000091 + ?ROM_MONITOR_NOPS 00000091 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?cmain + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 00000096, align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?cmain 00000096 Segment part 13 (CSTARTUP) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000096 - 0000009E (0x9 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + __low_level_init_call 00000096 __low_level_init (hal_startup) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 0000009F - 000000AC (0xe bytes), align: 0 + Segment part 5. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_DATA_Z 0000009F Segment part 1 (ll_halt) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000AD - 000000BA (0xe bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_IDATA_Z 000000AD myPC (ll) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000BB - 000000CA (0x10 bytes), align: 0 + Segment part 11. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_XDATA_Z 000000BB Actimetry_AppCBs (actimetryservice) + GATTServApp_TaskID (gattservapp) + HalKeyConfigured (hal_key) + HalLedState (hal_led) + Hal_KeyIntEnable (hal_key) + Hal_TaskID (hal_drivers) + LL_TaskID (ll) + OSAL_timeSeconds (OSAL_ClockBLE) + OnboardKeyIntEnable (OnBoard) + Segment part 10 (gap_peridevmgr) + Segment part 10 (gap_task) + Segment part 10 (gapgattserver) + Segment part 10 (gattservapp) + Segment part 11 (gap_peridevmgr) + Segment part 11 (gattservapp) + Segment part 12 (gap_configmgr) + Segment part 12 (gattservapp) + Segment part 13 (gapgattserver) + Segment part 13 (gattservapp) + Segment part 14 (gattservapp) + Segment part 15 (gap_configmgr) + Segment part 16 (gapgattserver) + Segment part 18 (gattservapp) + Segment part 19 (gapgattserver) + Segment part 6 (gapgattserver) + Segment part 6 (hci_data) + Segment part 6 (l2cap_util) + Segment part 6 (linkdb) + Segment part 6 (sm_mgr) + Segment part 7 (gatt_task) + Segment part 7 (hci_data) + Segment part 7 (linkdb) + Segment part 8 (gatt_task) + Segment part 8 (hci_data) + Segment part 8 (ll_scheduler) + Segment part 8 (sm_pairing) + Segment part 9 (gap_linkmgr) + Segment part 9 (gap_peridevmgr) + Segment part 9 (gatt_server) + Segment part 9 (gattservapp) + Segment part 9 (ll_scheduler) + WIMU_BondMgrCBs (wimu) + WIMU_PeripheralCBs (wimu) + WIMU_TaskID (wimu) + WIMU_updateProfileSensors::batteryData (wimu) + WIMU_updateProfileSensors::dateTime (wimu) + WIMU_updateProfileSensors::firmSoftRevision (wimu) + WIMU_updateProfileSensors::imuData (wimu) + WIMU_updateProfileSensors::locAndSpeed (wimu) + WIMU_updateProfileSensors::numBytes (wimu) + WIMU_updateProfileSensors::posQuality (wimu) + WIMU_updateProfileSensors::quaternionData (wimu) + WIMU_updateProfileSensors::rx_byte (wimu) + WIMU_updateProfileSensors::rx_index (wimu) + WIMU_updateProfileSensors::rx_len (wimu) + WIMU_updateProfileSensors::serialNumber (wimu) + WIMU_updateProfileSensors::test (wimu) + actimetryCfg (actimetryservice) + actimetryCfgConfig (actimetryservice) + actimetryImu (actimetryservice) + actimetryImuConfig (actimetryservice) + actimetryQuaternion (actimetryservice) + actimetryQuaternionConfig (actimetryservice) + activePg (osal_snv) + adcRef (hal_adc) + advInfo (ll) + autoSyncWhiteList (gapbondmgr) + battLevel (battservice) + battLevelClientCharCfg (battservice) + bleEvtMask (hci_event) + bm_list_ptr (osal_bufmgr) + bonds (gapbondmgr) + buildInfo (ll) + cachedTRNGdata (ll_enc) + cbTimers (osal_cbtimer) + chanMapUpdate (ll) + clkDivOnHalt (ll) + connectionHandle (gapbondmgr) + ctrlToHostEnable (hci) + dataPkt (ll_enc) + dcdcData (ll) + devInfoFirmwareRev (devinfoservice) + devInfoHardwareRev (devinfoservice) + devInfoSerialNumber (devinfoservice) + devInfoSoftwareRev (devinfoservice) + devInfoSystemId (devinfoservice) + deviceFeatureSet (ll) + dmaCfg (hal_uart) + dmaCh0 (hal_dma) + dmaCh1234 (hal_dma) + dtmInfo (ll) + eraseAllBonds (gapbondmgr) + extendRfRange (ll) + failF (osal_snv) + fastTxRespTime (ll) + gapAutoAdvPrivateAddrChange (gap_configmgr) + gapBondMgr_TaskID (gapbondmgr) + gapBond_AutoFail (gapbondmgr) + gapBond_Bonding (gapbondmgr) + gapBond_IOCap (gapbondmgr) + gapBond_MITM (gapbondmgr) + gapBond_OOBData (gapbondmgr) + gapBond_OOBDataFlag (gapbondmgr) + gapBond_Passcode (gapbondmgr) + gapDeviceAddrMode (gap_configmgr) + gapPrivateAddrChangeTimeout (gap_configmgr) + gapProfileRole (gap_configmgr) + gapRole_AdvChanMap (peripheral) + gapRole_AdvDirectAddr (peripheral) + gapRole_AdvDirectType (peripheral) + gapRole_AdvEventType (peripheral) + gapRole_AdvFilterPolicy (peripheral) + gapRole_ConnInterval (peripheral) + gapRole_ConnSlaveLatency (peripheral) + gapRole_ConnTimeout (peripheral) + gapRole_ConnectedDevAddr (peripheral) + gapRole_IRK (peripheral) + gapRole_ParamUpdateEnable (peripheral) + gapRole_RSSIReadRate (peripheral) + gapRole_SRK (peripheral) + gapRole_ScanRspData (peripheral) + gapRole_ScanRspDataLen (peripheral) + gapRole_SlaveLatency (peripheral) + gapRole_TaskID (peripheral) + gapRole_bdAddr (peripheral) + gapRole_profileRole (peripheral) + gapRole_signCounter (peripheral) + gapRole_state (peripheral) + gapTaskID (gap_task) + gattTaskID (gatt_task) + gpsDateTime (gpsservice) + gpsDateTimeClientCharCfg (gpsservice) + gpsLocationAndSpeed (gpsservice) + gpsLocationAndSpeedClientCharCfg (gpsservice) + gpsPositionQuality (gpsservice) + halKeySavedKeys (hal_key) + haltDuringRf (ll) + hciCtrlCmdToken (hci) + hciExtTaskID (hci_tl) + hciGapTaskID (hci_tl) + hciL2capTaskID (hci_tl) + hciPTMenabled (hci) + hciSmpTaskID (hci_tl) + hciTaskID (hci_tl) + hciTestTaskID (hci_tl) + l2capChannels (l2cap_task) + l2capFixedChannels (l2cap_task) + l2capTaskID (l2cap_task) + llConns (ll) + llState (ll) + maxTxPwrForDTM (ll) + numHostBufs (hci) + numWLEntries (phy) + nvInUse (ll) + onePktPerEvt (ll) + osalMemStat (OSAL_Memory) + osal_qHead (OSAL) + osal_systemClock (OSAL_Timers) + ownPublicAddr (ll) + ownRandomAddr (ll) + ownSavedPublicAddr (ll) + pAuthLink (gap_linkmgr) + pEstLink (gap_linkmgr) + pGapAdvertState (gap_devmgr) + pGapBondCB (gapbondmgr) + pGapRoles_AppCGs (peripheral) + pGapRoles_ParamUpdateCB (peripheral) + pHalKeyProcessFunction (hal_key) + pHciEvtMask (hci_event) + pPairingParams (sm_pairing) + paramUpdateNoSuccessOption (peripheral) + peerInfo (ll) + pfnCentralConnCBs (gap_linkmgr) + pfnPeripheralCBs (gap_task) + pfnResponderCBs (sm_pairing) + pgOff (osal_snv) + postRfOperations (ll) + previousLLTimerTick (OSAL_ClockBLE) + pwrmgr_attribute (OSAL_PwrMgr) + remUsTicks (OSAL_ClockBLE) + rfCounters (ll) + rssiCorrection (ll) + rxFifoFlowCtrl (ll) + serverInfoTbl (gatt_server) + slOverride (ll) + smTaskID (sm_task) + taskEndCause (ll) + tasksEvents (OSAL_WIMU) + timeMSec (OSAL_ClockBLE) + timerHead (OSAL_Timers) + trngCounter (ll) + uartRxBug (hal_uart) + verInfo (ll) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000CB - 000000F3 (0x29 bytes), align: 0 + Segment part 28. + ENTRY ADDRESS REF BY + ===== ======= ====== + __INIT_XDATA_I 000000CB Segment part 10 (?largewr) + Segment part 10 (gatt_server) + Segment part 11 (gapgattserver) + Segment part 12 (gap_peridevmgr) + Segment part 13 (gap_configmgr) + Segment part 14 (gapgattserver) + Segment part 16 (gattservapp) + Segment part 17 (gapgattserver) + Segment part 19 (gattservapp) + Segment part 20 (gapgattserver) + Segment part 22 (gapgattserver) + Segment part 24 (gapgattserver) + Segment part 6 (?largewr) + Segment part 6 (gap_peridevmgr) + Segment part 6 (sm_rsppairing) + Segment part 8 (?largewr) + Segment part 8 (gapgattserver) + WIMU_updateProfileSensors::header (wimu) + __Constant_10 (?largewr) + __Constant_2edbe700 (?largewr) + __Constant_3f800000 (?largewr) + __Constant_40a00000 (?largewr) + __Constant_41200000 (?largewr) + __Constant_501502f9 (?largewr) + __Constant_51ba43b7 (?largewr) + __Constant_7f800000 (?largewr) + __Constant_8 (?largewr) + actimetryCfgProps (actimetryservice) + actimetryCfgUserDesp (actimetryservice) + actimetryImuProps (actimetryservice) + actimetryImuUserDesp (actimetryservice) + actimetryQuaternionProps (actimetryservice) + actimetryQuaternionUserDesp (actimetryservice) + activeTaskID (OSAL) + advertData (wimu) + appTaskID (gattservapp) + attDeviceName (wimu) + baseTaskID (osal_cbtimer) + battAttrTbl (battservice) + battLevelProps (battservice) + devInfo11073CertProps (devinfoservice) + devInfoAttrTbl (devinfoservice) + devInfoFirmwareRevProps (devinfoservice) + devInfoHardwareRevProps (devinfoservice) + devInfoMfrNameProps (devinfoservice) + devInfoModelNumberProps (devinfoservice) + devInfoPnpId (devinfoservice) + devInfoPnpIdProps (devinfoservice) + devInfoSerialNumberProps (devinfoservice) + devInfoSoftwareRevProps (devinfoservice) + devInfoSystemIdProps (devinfoservice) + gapAppTaskID (gap_configmgr) + gapBond_AutoFailReason (gapbondmgr) + gapBond_InitiateWait (gapbondmgr) + gapBond_KeyDistList (gapbondmgr) + gapBond_KeySize (gapbondmgr) + gapBond_PairingMode (gapbondmgr) + gapRole_AdvEnabled (peripheral) + gapRole_AdvertData (peripheral) + gapRole_AdvertDataLen (peripheral) + gapRole_AdvertOffTime (peripheral) + gapRole_ConnectionHandle (peripheral) + gapRole_MaxConnInterval (peripheral) + gapRole_MinConnInterval (peripheral) + gapRole_TimeoutMultiplier (peripheral) + gapUnwantedTaskID (gap_task) + gpsAttrTbl (gpsservice) + gpsDateTimeProps (gpsservice) + gpsFeatures (gpsservice) + gpsFeaturesProps (gpsservice) + gpsLocationAndSpeedProps (gpsservice) + gpsPositionQualityProps (gpsservice) + registeredKeysTaskID (OnBoard) + reqTaskId (gatt_server) + scanRspData (wimu) + sensorActimetryAttrTbl (actimetryservice) + taskEndCauses (ll) + taskErrorEndCauses (ll) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000F4, align: 0 + Segment part 32. Intra module refs: __low_level_init_call + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 000000F4 - 00000109 (0x16 bytes), align: 0 + Segment part 33. Intra module refs: ?cmain + ENTRY ADDRESS REF BY + ===== ======= ====== + ?call_main 000000F4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : CSTARTUP + + SEGMENTS IN THE MODULE + ====================== +REGISTERS + Relative segment, address: DATA 00000000, align: 0 + Segment part 0. Intra module refs: Segment part 6 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?REGISTERS 00000000 + ------------------------------------------------------------------------- +ISTACK + Relative segment, address: IDATA 0000002C, align: 0 + Segment part 1. Intra module refs: Segment part 6 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ISTACK_START 0000002C + ------------------------------------------------------------------------- +XSTACK + Relative segment, address: XDATA 00000001, align: 0 + Segment part 3. Intra module refs: ?RESET_XSP + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTACK_START 00000001 + ------------------------------------------------------------------------- +INTVEC + Common segment, address: CODE 00000000 - 00000002 (0x3 bytes), align: 0 + Segment part 5. ROOT. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 0000010A - 0000010F (0x6 bytes), align: 0 + Segment part 6. ROOT. Intra module refs: Segment part 5 + ENTRY ADDRESS REF BY + ===== ======= ====== + __program_start 0000010A Absolute parts (?ABS_ENTRY_MOD) + ?RESET_SP 0000010D + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000110 - 00000115 (0x6 bytes), align: 0 + Segment part 8. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?RESET_XSP 00000110 ?XSP (VIRTUAL_REGISTERS) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000116 - 00000118 (0x3 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?RESET_CODE_BANK 00000116 Absolute parts (?BANKED_CODE_SUPPORT) + ------------------------------------------------------------------------- +CSTART + Relative segment, address: CODE 00000119 - 0000011B (0x3 bytes), align: 0 + Segment part 13. Intra module refs: Absolute parts + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : VIRTUAL_REGISTERS + + SEGMENTS IN THE MODULE + ====================== +BREG + Relative segment, address: BIT 00000020.0 - 00000020.7 (0x8 bits), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?B0 00000020.0 Absolute parts (CSTARTUP) + ------------------------------------------------------------------------- +VREG + Relative segment, address: DATA 00000008, align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?V0 00000008 ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + ?SL_GE_X (?SL_GE_X) + ?Subroutine1 (osal_cbtimer) + ?Subroutine11 (gapbondmgr) + ?Subroutine13 (OSAL) + ?Subroutine13 (gapbondmgr) + ?Subroutine14 (gapbondmgr) + ?Subroutine14 (wimu) + ?Subroutine16 (gapbondmgr) + ?Subroutine16 (wimu) + ?Subroutine17 (gapbondmgr) + ?Subroutine2 (devinfoservice) + ?Subroutine2 (osal_bufmgr) + ?Subroutine22 (gapbondmgr) + ?Subroutine23 (peripheral) + ?Subroutine24 (gapbondmgr) + ?Subroutine3 (OSAL_Timers) + ?Subroutine3 (devinfoservice) + ?Subroutine4 (wimu) + ?Subroutine5 (wimu) + ?Subroutine6 (wimu) + ?Subroutine7 (peripheral) + ?Subroutine7 (wimu) + ?Subroutine8 (wimu) + ?UL_GE_X (?UL_GE_X) + ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_TerminateLinkReq (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_FindAttr (gattservapp) + GATTServApp_InitCharCfg (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ProcessEvent (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_SendServiceChangedInd (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_InitServer (gatt_server) + GATT_Notification (gatt_server) + GATT_ProcessEvent (gatt_task) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalAdcRead (hal_adc) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + HalUARTInitDMA (hal_uart) + HalUARTPollDMA (hal_uart) + HalUARTReadDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + L2CAP_Init (l2cap_task) + L2CAP_ProcessEvent (l2cap_task) + L2CAP_SendData (l2cap_if) + LL_AddWhiteListDevice (ll) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_Disconnect (ll) + LL_DisconnectCback (hci_event) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_ReverseBytes (ll_enc) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkReply (ll) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_PseudoRand (ll) + LL_Rand (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_ReadRssi (ll) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + LL_SetAdvControl (ll) + LL_SetAdvParam (ll) + LL_TxData (ll) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + RF_NormalIsr (ll_isr) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ProcessEvent (sm_task) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 100 (gattservapp) + Segment part 101 (gattservapp) + Segment part 102 (gap_linkmgr) + Segment part 103 (gatt_server) + Segment part 104 (ll_common) + Segment part 105 (gap_linkmgr) + Segment part 107 (gap_linkmgr) + Segment part 107 (gatt_server) + Segment part 108 (gattservapp) + Segment part 108 (l2cap_util) + Segment part 109 (gattservapp) + Segment part 114 (gattservapp) + Segment part 114 (hci_event) + Segment part 115 (hci_event) + Segment part 122 (hci_event) + Segment part 125 (gattservapp) + Segment part 129 (gattservapp) + Segment part 13 (hci_data) + Segment part 130 (gattservapp) + Segment part 131 (gattservapp) + Segment part 132 (gattservapp) + Segment part 132 (ll) + Segment part 132 (ll_common) + Segment part 133 (hci_event) + Segment part 135 (hci_event) + Segment part 137 (hci_event) + Segment part 138 (gattservapp) + Segment part 139 (gattservapp) + Segment part 144 (gattservapp) + Segment part 146 (att_util) + Segment part 146 (gattservapp) + Segment part 149 (gattservapp) + Segment part 15 (sm_rsppairing) + Segment part 151 (hci_event) + Segment part 152 (att_util) + Segment part 152 (hci_event) + Segment part 158 (ll_common) + Segment part 16 (sm_rsppairing) + Segment part 160 (ll_common) + Segment part 168 (att_util) + Segment part 169 (gattservapp) + Segment part 173 (ll) + Segment part 178 (gattservapp) + Segment part 179 (ll_common) + Segment part 18 (gatt_server) + Segment part 18 (hci_data) + Segment part 18 (hci_event) + Segment part 181 (att_util) + Segment part 181 (gattservapp) + Segment part 182 (ll_common) + Segment part 185 (gattservapp) + Segment part 187 (ll_common) + Segment part 19 (l2cap_util) + Segment part 20 (hci_data) + Segment part 20 (ll_slaveEndCauses) + Segment part 20 (smp) + Segment part 204 (ll) + Segment part 21 (ll_advEndCauses) + Segment part 22 (gatt_task) + Segment part 22 (ll_advEndCauses) + Segment part 23 (ll_advEndCauses) + Segment part 23 (sm_mgr) + Segment part 238 (ll_common) + Segment part 24 (l2cap_util) + Segment part 24 (ll_slaveEndCauses) + Segment part 247 (ll_common) + Segment part 248 (ll_common) + Segment part 25 (l2cap_util) + Segment part 253 (ll) + Segment part 254 (ll_common) + Segment part 26 (ll_slaveEndCauses) + Segment part 26 (sm_mgr) + Segment part 264 (ll_common) + Segment part 27 (gap_linkmgr) + Segment part 28 (ll_scheduler) + Segment part 28 (ll_slaveEndCauses) + Segment part 29 (ll_advEndCauses) + Segment part 29 (ll_scheduler) + Segment part 29 (ll_slaveEndCauses) + Segment part 30 (ll_scheduler) + Segment part 31 (linkdb) + Segment part 31 (ll_scheduler) + Segment part 32 (ll_scheduler) + Segment part 32 (ll_slaveEndCauses) + Segment part 33 (ll_slaveEndCauses) + Segment part 34 (att_util) + Segment part 35 (ll_advEndCauses) + Segment part 35 (ll_slaveEndCauses) + Segment part 38 (ll_slaveEndCauses) + Segment part 38 (osal_snv) + Segment part 38 (smp) + Segment part 39 (hci_event) + Segment part 40 (gap_linkmgr) + Segment part 40 (gap_peridevmgr) + Segment part 41 (gap_linkmgr) + Segment part 42 (ll_enc) + Segment part 43 (ll_scheduler) + Segment part 44 (ll_slaveEndCauses) + Segment part 45 (ll_slaveEndCauses) + Segment part 46 (gap_peridevmgr) + Segment part 46 (ll_scheduler) + Segment part 46 (ll_slaveEndCauses) + Segment part 47 (sm_mgr) + Segment part 48 (hci_event) + Segment part 48 (sm_mgr) + Segment part 49 (ll_advEndCauses) + Segment part 49 (sm_mgr) + Segment part 50 (att_util) + Segment part 50 (gap_configmgr) + Segment part 50 (ll_advEndCauses) + Segment part 53 (gapgattserver) + Segment part 54 (ll_slaveEndCauses) + Segment part 56 (ll_advEndCauses) + Segment part 57 (gattservapp) + Segment part 58 (ll_advEndCauses) + Segment part 59 (ll_slaveEndCauses) + Segment part 59 (sm_mgr) + Segment part 60 (gap_linkmgr) + Segment part 61 (gapgattserver) + Segment part 61 (gatt_server) + Segment part 63 (gattservapp) + Segment part 63 (ll_advEndCauses) + Segment part 64 (att_util) + Segment part 64 (gatt_server) + Segment part 64 (sm_mgr) + Segment part 65 (gatt_server) + Segment part 65 (sm_rsppairing) + Segment part 66 (gattservapp) + Segment part 67 (att_util) + Segment part 68 (gap_linkmgr) + Segment part 69 (gap_configmgr) + Segment part 69 (gap_linkmgr) + Segment part 70 (gap_linkmgr) + Segment part 70 (l2cap_util) + Segment part 70 (ll_slaveEndCauses) + Segment part 71 (gap_linkmgr) + Segment part 71 (ll_enc) + Segment part 71 (sm_rsppairing) + Segment part 72 (sm_pairing) + Segment part 74 (gap_linkmgr) + Segment part 74 (sm_pairing) + Segment part 75 (ll_enc) + Segment part 75 (sm_rsppairing) + Segment part 76 (ll) + Segment part 77 (hci_event) + Segment part 78 (gattservapp) + Segment part 78 (hci_event) + Segment part 78 (ll_scheduler) + Segment part 78 (ll_slaveEndCauses) + Segment part 79 (gattservapp) + Segment part 81 (ll_enc) + Segment part 81 (sm_mgr) + Segment part 82 (gattservapp) + Segment part 83 (hci_event) + Segment part 83 (sm_mgr) + Segment part 83 (sm_pairing) + Segment part 84 (?largewr) + Segment part 84 (gap_linkmgr) + Segment part 84 (gattservapp) + Segment part 85 (gap_linkmgr) + Segment part 85 (gatt_server) + Segment part 85 (hci_event) + Segment part 85 (sm_mgr) + Segment part 87 (gattservapp) + Segment part 87 (ll_slaveEndCauses) + Segment part 88 (att_util) + Segment part 88 (gattservapp) + Segment part 88 (ll_common) + Segment part 88 (ll_enc) + Segment part 88 (sm_mgr) + Segment part 88 (sm_pairing) + Segment part 90 (gattservapp) + Segment part 90 (ll_slaveEndCauses) + Segment part 91 (ll_slaveEndCauses) + Segment part 94 (gap_linkmgr) + Segment part 95 (gatt_server) + Segment part 96 (gattservapp) + Segment part 97 (gap_peridevmgr) + Segment part 98 (ll_timer2) + Segment part 99 (gatt_server) + Segment part 99 (gattservapp) + Segment part 99 (ll_scheduler) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondMgr_SyncWhiteList (gapbondmgr) + gapFindADType (gap_devmgr) + gapIncSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessDisconnectCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattFindServerInfo (gatt_server) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessReadMultiReq (gatt_server) + gattProcessRxData (gatt_task) + gattProcessWriteReq (gatt_server) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_HandleConnStatusCB (gpsservice) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + halUart1TxIsr (hal_uart) + hciTxDataBufferReset (hci_data) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capAllocChannel (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capFindLocalId (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParsePacket (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Remove (linkdb) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llConnCleanup (ll_common) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llDequeueCtrlPkt (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llEnqueueCtrlPkt (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetNextDataChan (ll_common) + llInitFeatureSet (ll_common) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessChanMap (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSaveConnState (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetNextDataChan (ll_common) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerProcessEvent (osal_cbtimer) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_adjust_header (osal_bufmgr) + osal_bm_alloc (osal_bufmgr) + osal_get_timeoutEx (OSAL_Timers) + osal_isbufset (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_memcmp (OSAL) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_allocate (OSAL) + osal_msg_extract (OSAL) + osal_msg_receive (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_run_system (OSAL) + osal_snv_compact (osal_snv) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + phyFindWlEntry (phy) + reportStatusChange (linkdb) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + smEncrypt (sm_mgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandBuf (sm_mgr) + smGenerateRandMsg (sm_pairing) + smPairingSendEncInfo (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendIdentityInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smPairingSendSingingInfo (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smSetPairingReqRsp (sm_pairing) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + smUint8ToAuthReq (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildIdentityAddrInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingReqRsp (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParsePairingReq (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + xor_128 (sm_mgr) + ------------------------------------------------------------------------- +XSP + Relative segment, address: DATA 00000018 - 00000019 (0x2 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSP 00000018 ?ADD_XSTACK_DISP0_8 (?ADD_XSTACK_DISP8) + ?ALLOC_XSTACK8 (?ALLOC_XSTACK8) + ?BANKED_ENTER_XDATA (?BANKED_ENTER_XDATA) + ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?DEALLOC_XSTACK8 (?DEALLOC_XSTACK8) + ?FUNC_ENTER_XDATA (?FUNC_ENTER_XDATA) + ?FUNC_LEAVE_XDATA (?FUNC_LEAVE_XDATA) + ?INTERRUPT_ENTER_XSP (?INTERRUPT_ENTER_XSP) + ?INTERRUPT_LEAVE_XSP (?INTERRUPT_LEAVE_XSP) + ?PUSH_XSTACK8_X (?PUSH_XSTACK8_X) + ?RESET_XSP (CSTARTUP) + ?Subroutine25 (gapbondmgr) + ?XSTACK_DISP0_8 (?XSTACK_DISP8) + ATT_CompareUUID (att_util) + ATT_ParseExecuteWriteReq (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_EXT_ClkDivOnHaltCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetRandomAddressCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HalUARTInitDMA (hal_uart) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_RandCback (hci) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 101 (gattservapp) + Segment part 108 (?largewr) + Segment part 110 (?largewr) + Segment part 114 (?largewr) + Segment part 155 (hci_event) + Segment part 35 (ll_timer2) + Segment part 38 (ll_timer2) + Segment part 38 (osal_snv) + Segment part 40 (?largewr) + Segment part 43 (?largewr) + Segment part 44 (ll_timer2) + Segment part 45 (sm_mgr) + Segment part 47 (sm_mgr) + Segment part 50 (?largewr) + Segment part 50 (ll_timer2) + Segment part 51 (ll_timer2) + Segment part 55 (?largewr) + Segment part 55 (gattservapp) + Segment part 56 (gattservapp) + Segment part 58 (?largewr) + Segment part 61 (gatt_server) + Segment part 62 (ll_timer2) + Segment part 70 (gapbondmgr) + Segment part 75 (hci) + Segment part 77 (ll_enc) + Segment part 78 (sm_mgr) + Segment part 81 (?largewr) + Segment part 82 (hci) + Segment part 89 (ll_enc) + Segment part 90 (gattservapp) + Segment part 93 (?largewr) + Segment part 94 (gattservapp) + Segment part 95 (hci) + WIMU_Init (wimu) + WIMU_openUART (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapProcessOSALMsg (gap_task) + gapRole_startConnUpdate (peripheral) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + initNV (osal_snv) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + llDivide31By16To16 (ll_math) + llEventInRange (ll_common) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llProcessPostRfOps (ll_common) + llSetT2Delta (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ll_McuPrecisionCount (ll_timer2) + osalTimerUpdate (OSAL_Timers) + osal_snv_write (osal_snv) + setActivePage (osal_snv) + setXferPage (osal_snv) + smGeneratePairingReqRsp (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + sm_CMAC (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + writeItem (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_CODE_SUPPORT + + SEGMENTS IN THE MODULE + ====================== +CSTART + Relative segment, address: CODE 0000011C - 00000139 (0x1e bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BCALL_FF 0000011C ?call_main (?cmain) + ?BRET_FF 00000122 ?BANKED_LEAVE_XDATA (?BANKED_LEAVE_XDATA) + ?Subroutine0 (OSAL) + ?Subroutine0 (OSAL_Memory) + ?Subroutine0 (OSAL_PwrMgr) + ?Subroutine0 (OSAL_Timers) + ?Subroutine0 (battservice) + ?Subroutine0 (hal_adc) + ?Subroutine0 (hal_aes) + ?Subroutine0 (hal_drivers) + ?Subroutine0 (hal_key) + ?Subroutine1 (OnBoard) + ?Subroutine1 (hal_uart) + ?Subroutine1 (osal_snv) + ?Subroutine1 (peripheral) + ?Subroutine3 (gapbondmgr) + HalDmaInit (hal_dma) + HalFlashErase (hal_flash) + HalLedSet (hal_led) + HalUARTIsrDMA (hal_uart) + L2CAP_RegisterApp (l2cap_if) + LL_ENC_StartAES (ll_enc) + LL_TxDataCompleteCback (hci_data) + PHY_CommitRxFifo (phy) + PHY_DeallocateRxFifo (phy) + PHY_RetryRxFifo (phy) + PHY_RetryTxFifo (phy) + SM_ResponderInit (sm_rsppairing) + Segment part 10 (gap_devmgr) + Segment part 10 (hci_event) + Segment part 11 (gatt_task) + Segment part 128 (hci) + Segment part 15 (gap_task) + Segment part 154 (phy) + Segment part 18 (ll_advEndCauses) + Segment part 197 (ll) + Segment part 23 (att_util) + Segment part 23 (gatt_server) + Segment part 23 (hci_tl) + Segment part 23 (linkdb) + Segment part 31 (gap_peridevmgr) + Segment part 32 (ll_enc) + Segment part 33 (smp) + Segment part 37 (sm_mgr) + Segment part 42 (gap_configmgr) + Segment part 42 (gapgattserver) + Segment part 46 (sm_pairing) + Segment part 51 (gattservapp) + Segment part 52 (l2cap_util) + Segment part 54 (gatt_server) + Segment part 54 (ll_timer2) + Segment part 60 (ll_scheduler) + Segment part 73 (ll_timer2) + Segment part 75 (ll_common) + Segment part 78 (gap_linkmgr) + WIMU_openUART (wimu) + battWriteAttrCB (battservice) + bm_desc_from_payload (osal_bufmgr) + gapValidADType (gap_devmgr) + l2capHandleRxError (l2cap_util) + llCheckForLstoDuringSL (ll_slaveEndCauses) + llClearRfInts (ll_common) + llSlaveEvt_TaskAbort (ll_slaveEndCauses) + llUnexpectedEndCauseHandler (ll_errorEndCauses) + main (WIMU_Main) + osalInitTasks (OSAL_WIMU) + osal_int_disable (OSAL) + put_c_in_string (?sprintf) + strlen (?strlen) + ?BDISPATCH_FF 00000125 ATT_BuildErrorRsp::?relay (att_util) + ATT_BuildExchangeMTURsp::?relay (att_util) + ATT_BuildFindByTypeValueRsp::?relay (att_util) + ATT_BuildFindInfoRsp::?relay (att_util) + ATT_BuildHandleValueInd::?relay (att_util) + ATT_BuildPrepareWriteRsp::?relay (att_util) + ATT_BuildReadBlobRsp::?relay (att_util) + ATT_BuildReadByGrpTypeRsp::?relay (att_util) + ATT_BuildReadByTypeRsp::?relay (att_util) + ATT_BuildReadMultiRsp::?relay (att_util) + ATT_BuildReadRsp::?relay (att_util) + ATT_CompareUUID::?relay (att_util) + ATT_ConvertUUIDto128::?relay (att_util) + ATT_ErrorRsp::?relay (att_server) + ATT_ExchangeMTURsp::?relay (att_server) + ATT_ExecuteWriteRsp::?relay (att_server) + ATT_FindByTypeValueRsp::?relay (att_server) + ATT_FindInfoRsp::?relay (att_server) + ATT_HandleValueInd::?relay (att_server) + ATT_HandleValueNoti::?relay (att_server) + ATT_ParseExchangeMTUReq::?relay (att_util) + ATT_ParseExecuteWriteReq::?relay (att_util) + ATT_ParseFindByTypeValueReq::?relay (att_util) + ATT_ParseFindInfoReq::?relay (att_util) + ATT_ParsePacket::?relay (att_util) + ATT_ParsePrepareWriteReq::?relay (att_util) + ATT_ParseReadBlobReq::?relay (att_util) + ATT_ParseReadByTypeReq::?relay (att_util) + ATT_ParseReadMultiReq::?relay (att_util) + ATT_ParseReadReq::?relay (att_util) + ATT_ParseWriteReq::?relay (att_util) + ATT_PrepareWriteRsp::?relay (att_server) + ATT_ReadBlobRsp::?relay (att_server) + ATT_ReadByGrpTypeRsp::?relay (att_server) + ATT_ReadByTypeRsp::?relay (att_server) + ATT_ReadMultiRsp::?relay (att_server) + ATT_ReadRsp::?relay (att_server) + ATT_WriteRsp::?relay (att_server) + Actimetry_AddService::?relay (actimetryservice) + Actimetry_HandleConnStatusCB::?relay (actimetryservice) + Actimetry_ReadAttrCB::?relay (actimetryservice) + Actimetry_SetParameter::?relay (actimetryservice) + Actimetry_WriteAttrCB::?relay (actimetryservice) + Batt_AddService::?relay (battservice) + Batt_SetParameter::?relay (battservice) + DevInfo_AddService::?relay (devinfoservice) + DevInfo_SetParameter::?relay (devinfoservice) + GAPBondMgr_Init::?relay (gapbondmgr) + GAPBondMgr_LinkEst::?relay (gapbondmgr) + GAPBondMgr_ProcessEvent::?relay (gapbondmgr) + GAPBondMgr_ProcessGAPMsg::?relay (gapbondmgr) + GAPBondMgr_Register::?relay (gapbondmgr) + GAPBondMgr_ResolveAddr::?relay (gapbondmgr) + GAPBondMgr_ServiceChangeInd::?relay (gapbondmgr) + GAPBondMgr_SetParameter::?relay (gapbondmgr) + GAPBondMgr_UpdateCharCfg::?relay (gapbondmgr) + GAPRole_Init::?relay (peripheral) + GAPRole_ProcessEvent::?relay (peripheral) + GAPRole_SendUpdateParam::?relay (peripheral) + GAPRole_SetParameter::?relay (peripheral) + GAPRole_StartDevice::?relay (peripheral) + GAPRole_TerminateConnection::?relay (peripheral) + GAP_Authenticate::?relay (gap_linkmgr) + GAP_Bond::?relay (gap_linkmgr) + GAP_DeviceInit::?relay (gap) + GAP_EndDiscoverable::?relay (gap_peridevmgr) + GAP_GetParamValue::?relay (gap_configmgr) + GAP_Init::?relay (gap_task) + GAP_MakeDiscoverable::?relay (gap_peridevmgr) + GAP_NumActiveConnections::?relay (gap_task) + GAP_ParamsInit::?relay (gap_configmgr) + GAP_PasscodeUpdate::?relay (gap_linkmgr) + GAP_PeriDevMgrInit::?relay (gap_peridevmgr) + GAP_ProcessEvent::?relay (gap_task) + GAP_RegisterForHCIMsgs::?relay (gap_task) + GAP_ResolvePrivateAddr::?relay (gap_devmgr) + GAP_SecParamsInit::?relay (gap_configmgr) + GAP_SendSlaveSecurityRequest::?relay (gap_perilinkmgr) + GAP_SetParamValue::?relay (gap_configmgr) + GAP_Signable::?relay (gap_linkmgr) + GAP_TerminateAuth::?relay (gap_linkmgr) + GAP_TerminateLinkReq::?relay (gap_linkmgr) + GAP_UpdateAdvertisingData::?relay (gap_peridevmgr) + GATTServApp_AddService::?relay (gattservapp) + GATTServApp_FindAttr::?relay (gattservapp) + GATTServApp_Init::?relay (gattservapp) + GATTServApp_InitCharCfg::?relay (gattservapp) + GATTServApp_ProcessCCCWriteReq::?relay (gattservapp) + GATTServApp_ProcessCharCfg::?relay (gattservapp) + GATTServApp_ProcessEvent::?relay (gattservapp) + GATTServApp_ReadAttr::?relay (gattservapp) + GATTServApp_ReadCharCfg::?relay (gattservapp) + GATTServApp_RegisterForMsg::?relay (gattservapp) + GATTServApp_RegisterService::?relay (gattservapp) + GATTServApp_SendCCCUpdatedEvent::?relay (gattservapp) + GATTServApp_SendServiceChangedInd::?relay (gattservapp) + GATTServApp_UpdateCharCfg::?relay (gattservapp) + GATTServApp_WriteAttr::?relay (gattservapp) + GATTServApp_WriteCharCfg::?relay (gattservapp) + GATT_FindHandle::?relay (gatt_server) + GATT_FindHandleUUID::?relay (gatt_server) + GATT_FindNextAttr::?relay (gatt_server) + GATT_Indication::?relay (gatt_server) + GATT_Init::?relay (gatt_task) + GATT_InitServer::?relay (gatt_server) + GATT_Notification::?relay (gatt_server) + GATT_ProcessEvent::?relay (gatt_task) + GATT_RegisterForReq::?relay (gatt_server) + GATT_RegisterService::?relay (gatt_server) + GATT_ServiceChangedInd::?relay (gatt_server) + GATT_ServiceNumAttrs::?relay (gatt_server) + GATT_VerifyReadPermissions::?relay (gatt_server) + GATT_VerifyWritePermissions::?relay (gatt_server) + GGS_AddService::?relay (gapgattserver) + GGS_SetParameter::?relay (gapgattserver) + Gps_AddService::?relay (gpsservice) + Gps_SetParameter::?relay (gpsservice) + HCI_CommandCompleteEvent::?relay (hci_event) + HCI_CommandStatusEvent::?relay (hci_event) + HCI_DataBufferOverflowEvent::?relay (hci_event) + HCI_DisconnectCmd::?relay (hci) + HCI_EXT_ClkDivOnHaltCmd::?relay (hci) + HCI_GAPTaskRegister::?relay (hci_tl) + HCI_Init::?relay (hci_tl) + HCI_L2CAPTaskRegister::?relay (hci_tl) + HCI_LE_AddWhiteListCmd::?relay (hci) + HCI_LE_ClearWhiteListCmd::?relay (hci) + HCI_LE_LtkReqNegReplyCmd::?relay (hci) + HCI_LE_LtkReqReplyCmd::?relay (hci) + HCI_LE_RandCmd::?relay (hci) + HCI_LE_ReadBufSizeCmd::?relay (hci) + HCI_LE_SetAdvDataCmd::?relay (hci) + HCI_LE_SetAdvEnableCmd::?relay (hci) + HCI_LE_SetAdvParamCmd::?relay (hci) + HCI_LE_SetRandomAddressCmd::?relay (hci) + HCI_LE_SetScanRspDataCmd::?relay (hci) + HCI_NumOfCompletedPacketsEvent::?relay (hci_event) + HCI_ProcessEvent::?relay (hci_tl) + HCI_ReadBDADDRCmd::?relay (hci) + HCI_ReadRssiCmd::?relay (hci) + HCI_SMPTaskRegister::?relay (hci_tl) + HCI_SendCommandCompleteEvent::?relay (hci_event) + HCI_SendCommandStatusEvent::?relay (hci_event) + HCI_SendControllerToHostEvent::?relay (hci_event) + HCI_SendDataPkt::?relay (hci) + HCI_TxDataBufferInsert::?relay (hci_data) + HCI_TxDataSend::?relay (hci_data) + HCI_VendorSpecifcCommandCompleteEvent::?relay (hci_event) + HCI_bm_alloc::?relay (hci) + HalAdcInit::?relay (hal_adc) + HalAdcRead::?relay (hal_adc) + HalAesInit::?relay (hal_aes) + HalDmaInit::?relay (hal_dma) + HalDriverInit::?relay (hal_drivers) + HalFlashErase::?relay (hal_flash) + HalFlashRead::?relay (hal_flash) + HalFlashWrite::?relay (hal_flash) + HalKeyConfig::?relay (hal_key) + HalKeyInit::?relay (hal_key) + HalKeyPoll::?relay (hal_key) + HalLedSet::?relay (hal_led) + HalUARTInit::?relay (hal_uart) + HalUARTInitDMA::?relay (hal_uart) + HalUARTIsrDMA::?relay (hal_uart) + HalUARTOpen::?relay (hal_uart) + HalUARTOpenDMA::?relay (hal_uart) + HalUARTPoll::?relay (hal_uart) + HalUARTPollDMA::?relay (hal_uart) + HalUARTRead::?relay (hal_uart) + HalUARTReadDMA::?relay (hal_uart) + HalUARTRxAvailDMA::?relay (hal_uart) + Hal_Init::?relay (hal_drivers) + Hal_ProcessEvent::?relay (hal_drivers) + Hal_ProcessPoll::?relay (hal_drivers) + Hal_UART_RxBufLen::?relay (hal_uart) + InitBoard::?relay (OnBoard) + L2CAP_BuildCmdReject::?relay (l2cap_util) + L2CAP_CmdReject::?relay (l2cap_if) + L2CAP_ConnParamUpdateReq::?relay (l2cap_if) + L2CAP_Init::?relay (l2cap_task) + L2CAP_ParseParamUpdateReq::?relay (l2cap_util) + L2CAP_ProcessEvent::?relay (l2cap_task) + L2CAP_RegisterApp::?relay (l2cap_if) + L2CAP_SendData::?relay (l2cap_if) + L2CAP_bm_alloc::?relay (l2cap_util) + LL_AddWhiteListDevice::?relay (ll) + LL_ClearWhiteList::?relay (ll) + LL_ConnActive::?relay (ll) + LL_ConnParamUpdateCback::?relay (hci_event) + LL_ConnectionCompleteCback::?relay (hci_event) + LL_CtrlToHostFlowControl::?relay (ll) + LL_Disconnect::?relay (ll) + LL_DisconnectCback::?relay (hci_event) + LL_ENC_AES128_Encrypt::?relay (ll_enc) + LL_ENC_Decrypt::?relay (ll_enc) + LL_ENC_DecryptMsg::?relay (ll_enc) + LL_ENC_Encrypt::?relay (ll_enc) + LL_ENC_EncryptMsg::?relay (ll_enc) + LL_ENC_GenDeviceIV::?relay (ll_enc) + LL_ENC_GenDeviceSKD::?relay (ll_enc) + LL_ENC_GenerateMIC::?relay (ll_enc) + LL_ENC_GenerateNonce::?relay (ll_enc) + LL_ENC_GeneratePseudoRandNum::?relay (ll_enc) + LL_ENC_GenerateTrueRandNum::?relay (ll_enc) + LL_ENC_InitAesDMA::?relay (ll_enc) + LL_ENC_InitDMA0::?relay (ll_enc) + LL_ENC_LoadEmptyIV::?relay (ll_enc) + LL_ENC_LoadKey::?relay (ll_enc) + LL_ENC_MoveData::?relay (ll_enc) + LL_ENC_ReverseBytes::?relay (ll_enc) + LL_ENC_SetupCryptoDMA::?relay (ll_enc) + LL_ENC_SetupLoadDMA::?relay (ll_enc) + LL_ENC_StartAES::?relay (ll_enc) + LL_EXT_ClkDivOnHalt::?relay (ll) + LL_EXT_ExtendRfRangeCback::?relay (hci) + LL_EXT_SetRxGainCback::?relay (hci) + LL_EXT_SetTxPowerCback::?relay (hci) + LL_EncChangeCback::?relay (hci_event) + LL_EncKeyRefreshCback::?relay (hci_event) + LL_EncLtkNegReply::?relay (ll) + LL_EncLtkReply::?relay (ll) + LL_EncLtkReqCback::?relay (hci_event) + LL_Encrypt::?relay (ll) + LL_Init::?relay (ll) + LL_ProcessEvent::?relay (ll) + LL_PseudoRand::?relay (ll) + LL_Rand::?relay (ll) + LL_RandCback::?relay (hci) + LL_ReadBDADDR::?relay (ll) + LL_ReadRemoteVersionInfoCback::?relay (hci_event) + LL_ReadRssi::?relay (ll) + LL_Reset::?relay (ll) + LL_RxDataCompleteCback::?relay (hci_data) + LL_RxReqDataBufCback::?relay (hci_data) + LL_SetAdvControl::?relay (ll) + LL_SetAdvData::?relay (ll) + LL_SetAdvParam::?relay (ll) + LL_SetRandomAddress::?relay (ll) + LL_SetScanRspData::?relay (ll) + LL_TxData::?relay (ll) + LL_TxDataCompleteCback::?relay (hci_data) + OnBoard_KeyCallback::?relay (OnBoard) + OnBoard_SendKeys::?relay (OnBoard) + Onboard_rand::?relay (OnBoard) + PHY_AddWlEntry::?relay (phy) + PHY_ClearAllRegsAndFifos::?relay (phy) + PHY_ClearBlacklist::?relay (phy) + PHY_ClearBlacklistIndex::?relay (phy) + PHY_ClearSavedWhiteList::?relay (phy) + PHY_ClearWhitelist::?relay (phy) + PHY_CommitRxFifo::?relay (phy) + PHY_ConfigWhitener::?relay (phy) + PHY_ConfigureAppendRfStatus::?relay (phy) + PHY_ConfigureFifoDataProcessing::?relay (phy) + PHY_ConfigureMD::?relay (phy) + PHY_DeallocateRxFifo::?relay (phy) + PHY_GetAdvChans::?relay (phy) + PHY_GetEndCause::?relay (phy) + PHY_Init::?relay (phy) + PHY_InitSeqStat::?relay (phy) + PHY_LoadNR::?relay (phy) + PHY_Reset::?relay (phy) + PHY_RetryRxFifo::?relay (phy) + PHY_RetryTxFifo::?relay (phy) + PHY_SetAdvChans::?relay (phy) + PHY_SetAdvWlPolicy::?relay (phy) + PHY_SetBlacklistIndex::?relay (phy) + PHY_SetCRCInit::?relay (phy) + PHY_SetEndConnection::?relay (phy) + PHY_SetFifoConfig::?relay (phy) + PHY_SetMaxNack::?relay (phy) + PHY_SetOwnAddr::?relay (phy) + PHY_SetPeerAddr::?relay (phy) + PHY_SetRfFreq::?relay (phy) + PHY_SetSyncWord::?relay (phy) + PHY_VerifyNR::?relay (phy) + SM_CalcRandomAddr::?relay (sm_mgr) + SM_GenerateAuthenSig::?relay (sm_mgr) + SM_Init::?relay (sm_task) + SM_PasskeyUpdate::?relay (sm_pairing) + SM_ProcessEvent::?relay (sm_task) + SM_ResolveRandomAddrs::?relay (sm_mgr) + SM_ResponderInit::?relay (sm_rsppairing) + SM_StartPairing::?relay (sm_pairing) + SM_VerifyAuthenSig::?relay (sm_mgr) + WIMU_Init::?relay (wimu) + WIMU_ProcessEvent::?relay (wimu) + WIMU_UARTCallback::?relay (wimu) + WIMU_openUART::?relay (wimu) + WIMU_updateProfileSensors::?relay (wimu) + _formatted_write::?relay (?largewr) + aesDmaInit::?relay (hal_aes) + attSendMsg::?relay (att_util) + battReadAttrCB::?relay (battservice) + battWriteAttrCB::?relay (battservice) + bm_desc_from_payload::?relay (osal_bufmgr) + cleanErasedPage::?relay (osal_snv) + compactPage::?relay (osal_snv) + devInfo_ReadAttrCB::?relay (devinfoservice) + disconnectNext::?relay (gap_linkmgr) + erasePage::?relay (osal_snv) + findItem::?relay (osal_snv) + findOffset::?relay (osal_snv) + float_conversion::?relay (?largewr) + gapAddAddrAdj::?relay (gap_configmgr) + gapBondMgrAddBond::?relay (gapbondmgr) + gapBondMgrAuthenticate::?relay (gapbondmgr) + gapBondMgrBondReq::?relay (gapbondmgr) + gapBondMgrBondTotal::?relay (gapbondmgr) + gapBondMgrChangeState::?relay (gapbondmgr) + gapBondMgrEraseAllBondings::?relay (gapbondmgr) + gapBondMgrEraseBonding::?relay (gapbondmgr) + gapBondMgrFindAddr::?relay (gapbondmgr) + gapBondMgrFindCharCfgItem::?relay (gapbondmgr) + gapBondMgrGetPublicAddr::?relay (gapbondmgr) + gapBondMgrInvertCharCfgItem::?relay (gapbondmgr) + gapBondMgrReadBonds::?relay (gapbondmgr) + gapBondMgrResolvePrivateAddr::?relay (gapbondmgr) + gapBondMgrSendServiceChange::?relay (gapbondmgr) + gapBondMgrUpdateCharCfg::?relay (gapbondmgr) + gapBondMgr_SyncWhiteList::?relay (gapbondmgr) + gapBondSetupPrivFlag::?relay (gapbondmgr) + gapDetermineAddrType::?relay (gap_configmgr) + gapFindADType::?relay (gap_devmgr) + gapFreeAdvertState::?relay (gap_peridevmgr) + gapFreeAuthLink::?relay (gap_linkmgr) + gapFreeEstLink::?relay (gap_linkmgr) + gapGetDevAddress::?relay (gap_configmgr) + gapGetDevAddressMode::?relay (gap_configmgr) + gapGetIRK::?relay (gap_configmgr) + gapGetSRK::?relay (gap_configmgr) + gapGetSignCounter::?relay (gap_configmgr) + gapIncSignCounter::?relay (gap_configmgr) + gapIsAdvertising::?relay (gap_devmgr) + gapPairingCompleteCB::?relay (gap_linkmgr) + gapPasskeyNeededCB::?relay (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt::?relay (gap_peridevmgr) + gapProcessAdvertisingEvt::?relay (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt::?relay (gap_linkmgr) + gapProcessConnectionCompleteEvt::?relay (gap_linkmgr) + gapProcessDisconnectCompleteEvt::?relay (gap_linkmgr) + gapProcessHCICmdCompleteEvt::?relay (gap_task) + gapProcessNewAddr::?relay (gap_configmgr) + gapProcessOSALMsg::?relay (gap_task) + gapProcessRandomAddrComplete::?relay (gap_configmgr) + gapReadBD_ADDRStatus::?relay (gap_configmgr) + gapReadBufSizeCmdStatus::?relay (gap_configmgr) + gapRegisterPeripheral::?relay (gap_task) + gapRole_ProcessGAPMsg::?relay (peripheral) + gapRole_ProcessOSALMsg::?relay (peripheral) + gapRole_startConnUpdate::?relay (peripheral) + gapSendBondCompleteEvent::?relay (gap_linkmgr) + gapSendDeviceInitDoneEvent::?relay (gap_configmgr) + gapSendLinkUpdateEvent::?relay (gap_linkmgr) + gapSendMakeDiscEvent::?relay (gap_peridevmgr) + gapSendPairingReqEvent::?relay (gap_linkmgr) + gapSetAdvParams::?relay (gap_peridevmgr) + gapSetAdvParamsStatus::?relay (gap_peridevmgr) + gapUpdateConnSignCounter::?relay (gap_configmgr) + gapValidADType::?relay (gap_devmgr) + gapWriteAdvDataStatus::?relay (gap_peridevmgr) + gapWriteAdvEnableStatus::?relay (gap_peridevmgr) + gattFindServerInfo::?relay (gatt_server) + gattGetServerStatus::?relay (gatt_server) + gattNotifyEvent::?relay (gatt_task) + gattProcessExchangeMTUReq::?relay (gatt_server) + gattProcessExecuteWriteReq::?relay (gatt_server) + gattProcessFindByTypeValueReq::?relay (gatt_server) + gattProcessFindInfoReq::?relay (gatt_server) + gattProcessReadByGrpTypeReq::?relay (gatt_server) + gattProcessReadByTypeReq::?relay (gatt_server) + gattProcessReadMultiReq::?relay (gatt_server) + gattProcessReadReq::?relay (gatt_server) + gattProcessRxData::?relay (gatt_task) + gattProcessWriteReq::?relay (gatt_server) + gattRegisterServer::?relay (gatt_task) + gattServApp_FindAuthorizeAttrCB::?relay (gattservapp) + gattServApp_FindCharCfgItem::?relay (gattservapp) + gattServApp_FindPrepareWriteQ::?relay (gattservapp) + gattServApp_FindServiceCBs::?relay (gattservapp) + gattServApp_HandleConnStatusCB::?relay (gattservapp) + gattServApp_ProcessExecuteWriteReq::?relay (gattservapp) + gattServApp_ProcessFindByTypeValueReq::?relay (gattservapp) + gattServApp_ProcessMsg::?relay (gattservapp) + gattServApp_ProcessPrepareWriteReq::?relay (gattservapp) + gattServApp_ProcessReadByGrpTypeReq::?relay (gattservapp) + gattServApp_ProcessReadByTypeReq::?relay (gattservapp) + gattServApp_ProcessReadMultiReq::?relay (gattservapp) + gattServApp_ProcessWriteReq::?relay (gattservapp) + gattServApp_SetNumPrepareWrites::?relay (gattservapp) + gattServApp_WriteAttrCB::?relay (gattservapp) + gattServerHandleConnStatusCB::?relay (gatt_server) + gattServerHandleTimerCB::?relay (gatt_server) + gattServerProcessMsgCB::?relay (gatt_server) + gattServiceLastHandle::?relay (gatt_server) + gattStartTimer::?relay (gatt_task) + gattStopTimer::?relay (gatt_task) + generate_subkey::?relay (sm_mgr) + ggs_ReadAttrCB::?relay (gapgattserver) + ggs_SetAttrWPermit::?relay (gapgattserver) + ggs_WriteAttrCB::?relay (gapgattserver) + gps_HandleConnStatusCB::?relay (gpsservice) + gps_ReadAttrCB::?relay (gpsservice) + gps_WriteAttrCB::?relay (gpsservice) + halGetJoyKeyInput::?relay (hal_key) + halProcessKeyInterrupt::?relay (hal_key) + hciInitEventMasks::?relay (hci_event) + hciTxDataBufferReset::?relay (hci_data) + initNV::?relay (osal_snv) + isLimitedDiscoverableMode::?relay (gap_peridevmgr) + l2capAllocChannel::?relay (l2cap_util) + l2capBuildParamUpdateReq::?relay (l2cap_util) + l2capEncapSendData::?relay (l2cap_util) + l2capFindLocalId::?relay (l2cap_util) + l2capFreeChannel::?relay (l2cap_util) + l2capHandleRxError::?relay (l2cap_util) + l2capHandleTimerCB::?relay (l2cap_util) + l2capNotifyData::?relay (l2cap_util) + l2capNotifySignal::?relay (l2cap_util) + l2capParseCmdReject::?relay (l2cap_util) + l2capParsePacket::?relay (l2cap_util) + l2capParseParamUpdateRsp::?relay (l2cap_util) + l2capParseSignalHdr::?relay (l2cap_util) + l2capProcessReq::?relay (l2cap_task) + l2capProcessRsp::?relay (l2cap_task) + l2capProcessRxData::?relay (l2cap_task) + l2capProcessSignal::?relay (l2cap_task) + l2capSendCmd::?relay (l2cap_util) + l2capSendReq::?relay (l2cap_util) + l2capStopTimer::?relay (l2cap_util) + leftshift_onebit::?relay (sm_mgr) + linkDB_Add::?relay (linkdb) + linkDB_Authen::?relay (linkdb) + linkDB_Find::?relay (linkdb) + linkDB_FindFirst::?relay (linkdb) + linkDB_Init::?relay (linkdb) + linkDB_NumActive::?relay (linkdb) + linkDB_PerformFunc::?relay (linkdb) + linkDB_Register::?relay (linkdb) + linkDB_Remove::?relay (linkdb) + linkDB_State::?relay (linkdb) + llAdjustForMissedEvent::?relay (ll_common) + llAdvEvt_TaskAbort::?relay (ll_advEndCauses) + llAdvEvt_TaskConnect::?relay (ll_advEndCauses) + llAllocConnId::?relay (ll_common) + llAllocTask::?relay (ll_scheduler) + llCheckForLstoDuringSL::?relay (ll_slaveEndCauses) + llCheckWhiteListUsage::?relay (ll_common) + llClearRfInts::?relay (ll_common) + llClearSetInts::?relay (ll_common) + llConnCleanup::?relay (ll_common) + llConnTerminate::?relay (ll_common) + llConvertCtrlProcTimeoutToEvent::?relay (ll_common) + llConvertLstoToEvent::?relay (ll_common) + llDequeueCtrlPkt::?relay (ll_common) + llDirectedAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llDisableRfInts::?relay (ll_common) + llDisableT2E1::?relay (ll_timer2) + llDisableT2Ints::?relay (ll_timer2) + llDisableT2IntsEvts::?relay (ll_timer2) + llDiscoverableAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llEnableRfInts::?relay (ll_common) + llEnqueueCtrlPkt::?relay (ll_common) + llExtendRfRange::?relay (ll_common) + llFindNextSecTask::?relay (ll_scheduler) + llFindStartType::?relay (ll_scheduler) + llFindTxPowerSettings::?relay (ll_common) + llFreeTask::?relay (ll_scheduler) + llGetActiveTasks::?relay (ll_scheduler) + llGetCurrentFineTime::?relay (ll_timer2) + llGetCurrentTask::?relay (ll_scheduler) + llGetCurrentTime::?relay (ll_timer2) + llGetNextConn::?relay (ll_common) + llGetNumTasks::?relay (ll_scheduler) + llGetTask::?relay (ll_scheduler) + llGetTaskState::?relay (ll_scheduler) + llGetTimer2Capture::?relay (ll_timer2) + llInitFeatureSet::?relay (ll_common) + llInitTimer2::?relay (ll_timer2) + llMemCopyDst::?relay (ll_common) + llMemCopySrc::?relay (ll_common) + llNonConnAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llProcessChanMap::?relay (ll_common) + llProcessPendingTxData::?relay (ll_common) + llProcessPostRfOps::?relay (ll_common) + llProcessSlaveControlProcedures::?relay (ll_slaveEndCauses) + llReleaseAllConnId::?relay (ll_common) + llReleaseConnId::?relay (ll_common) + llReplaceCtrlPkt::?relay (ll_common) + llRestoreConnState::?relay (ll_scheduler) + llRestoreRfRegs::?relay (ll_scheduler) + llRestore_rxFIFO::?relay (ll_scheduler) + llRestore_txFIFO::?relay (ll_scheduler) + llRfInit::?relay (ll_common) + llSaveConnState::?relay (ll_scheduler) + llSaveRfRegs::?relay (ll_scheduler) + llSave_rxFIFO::?relay (ll_scheduler) + llSave_txFIFO::?relay (ll_scheduler) + llScheduleTask::?relay (ll_scheduler) + llScheduler::?relay (ll_scheduler) + llSchedulerInit::?relay (ll_scheduler) + llSetFreqTune::?relay (ll_common) + llSetRxGain::?relay (ll_common) + llSetT2C1Event1::?relay (ll_timer2) + llSetT2Delta::?relay (ll_timer2) + llSetT2OVFC1Event1::?relay (ll_timer2) + llSetT2OVFC1Timeout::?relay (ll_timer2) + llSetT2OVFC2Event2::?relay (ll_timer2) + llSetTxPower::?relay (ll_common) + llSetupAdv::?relay (ll_common) + llSetupDirectedAdvEvt::?relay (ll_common) + llSetupEncRsp::?relay (ll_common) + llSetupFeatureSetRsp::?relay (ll_common) + llSetupNextSlaveEvent::?relay (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt::?relay (ll_common) + llSetupPauseEncRsp::?relay (ll_common) + llSetupRejectInd::?relay (ll_common) + llSetupScannableAdvEvt::?relay (ll_common) + llSetupStartEncReq::?relay (ll_common) + llSetupStartEncRsp::?relay (ll_common) + llSetupTermInd::?relay (ll_common) + llSetupUndirectedAdvEvt::?relay (ll_common) + llSetupUnknownRsp::?relay (ll_common) + llSetupVersionIndReq::?relay (ll_common) + llSlaveEvt_TaskAbort::?relay (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk::?relay (ll_slaveEndCauses) + llStartAdvSetup::?relay (ll_common) + llStartSlaveSetup::?relay (ll_common) + llStartTimer2::?relay (ll_timer2) + llStopTimer2::?relay (ll_timer2) + llUndirectedAdvEvt_TaskEndOk::?relay (ll_advEndCauses) + llUnexpectedEndCauseHandler::?relay (ll_errorEndCauses) + llWriteTxData::?relay (ll_common) + ll_McuPrecisionCount::?relay (ll_timer2) + memset::?relay (?memset) + osalAddTimer::?relay (OSAL_Timers) + osalDeleteTimer::?relay (OSAL_Timers) + osalFindTimer::?relay (OSAL_Timers) + osalInitTasks::?relay (OSAL_WIMU) + osalTimeUpdate::?relay (OSAL_ClockBLE) + osalTimerInit::?relay (OSAL_Timers) + osalTimerUpdate::?relay (OSAL_Timers) + osal_CbTimerInit::?relay (osal_cbtimer) + osal_CbTimerProcessEvent::?relay (osal_cbtimer) + osal_CbTimerStart::?relay (osal_cbtimer) + osal_CbTimerStop::?relay (osal_cbtimer) + osal_bm_adjust_header::?relay (osal_bufmgr) + osal_bm_alloc::?relay (osal_bufmgr) + osal_bm_free::?relay (osal_bufmgr) + osal_clear_event::?relay (OSAL) + osal_get_timeoutEx::?relay (OSAL_Timers) + osal_init_system::?relay (OSAL) + osal_int_disable::?relay (OSAL) + osal_isbufset::?relay (OSAL) + osal_mem_alloc::?relay (OSAL_Memory) + osal_mem_free::?relay (OSAL_Memory) + osal_mem_init::?relay (OSAL_Memory) + osal_mem_kick::?relay (OSAL_Memory) + osal_memcmp::?relay (OSAL) + osal_memcpy::?relay (OSAL) + osal_memdup::?relay (OSAL) + osal_memset::?relay (OSAL) + osal_msg_allocate::?relay (OSAL) + osal_msg_deallocate::?relay (OSAL) + osal_msg_enqueue::?relay (OSAL) + osal_msg_enqueue_push::?relay (OSAL) + osal_msg_extract::?relay (OSAL) + osal_msg_push::?relay (OSAL) + osal_msg_receive::?relay (OSAL) + osal_msg_send::?relay (OSAL) + osal_pwrmgr_device::?relay (OSAL_PwrMgr) + osal_pwrmgr_init::?relay (OSAL_PwrMgr) + osal_pwrmgr_task_state::?relay (OSAL_PwrMgr) + osal_rand::?relay (OSAL) + osal_revmemcpy::?relay (OSAL) + osal_run_system::?relay (OSAL) + osal_set_event::?relay (OSAL) + osal_snv_compact::?relay (osal_snv) + osal_snv_init::?relay (osal_snv) + osal_snv_read::?relay (osal_snv) + osal_snv_write::?relay (osal_snv) + osal_start_reload_timer::?relay (OSAL_Timers) + osal_start_system::?relay (OSAL) + osal_start_timerEx::?relay (OSAL_Timers) + osal_stop_timerEx::?relay (OSAL_Timers) + osal_strlen::?relay (OSAL) + phyFindWlEntry::?relay (phy) + put_c_in_string::?relay (?sprintf) + reportStatusChange::?relay (linkdb) + sendAuthEvent::?relay (gap_linkmgr) + sendEstLinkEvent::?relay (gap_linkmgr) + sendTerminateEvent::?relay (gap_linkmgr) + setActivePage::?relay (osal_snv) + setXferPage::?relay (osal_snv) + smAuthReqToUint8::?relay (sm_mgr) + smDetermineKeySize::?relay (sm_pairing) + smEncrypt::?relay (sm_mgr) + smEndPairing::?relay (sm_pairing) + smFreePairingParams::?relay (sm_pairing) + smGenerateConfirm::?relay (sm_pairing) + smGeneratePairingReqRsp::?relay (sm_pairing) + smGenerateRandBuf::?relay (sm_mgr) + smGenerateRandMsg::?relay (sm_pairing) + smLinkCheck::?relay (sm_pairing) + smNextPairingState::?relay (sm_pairing) + smPairingSendEncInfo::?relay (sm_pairing) + smPairingSendIdentityAddrInfo::?relay (sm_pairing) + smPairingSendIdentityInfo::?relay (sm_pairing) + smPairingSendMasterID::?relay (sm_pairing) + smPairingSendSingingInfo::?relay (sm_pairing) + smProcessDataMsg::?relay (sm_pairing) + smProcessEncryptChange::?relay (sm_pairing) + smProcessOSALMsg::?relay (sm_task) + smProcessPairingReq::?relay (sm_pairing) + smProcessRandComplete::?relay (sm_mgr) + smRegisterResponder::?relay (sm_pairing) + smResponderProcessLTKReq::?relay (sm_rsppairing) + smResponderSendNextKeyInfo::?relay (sm_rsppairing) + smSavePairInfo::?relay (sm_pairing) + smSendFailAndEnd::?relay (sm_pairing) + smSendSMMsg::?relay (smp) + smSetPairingReqRsp::?relay (sm_pairing) + smStartEncryption::?relay (sm_pairing) + smStartRspTimer::?relay (sm_mgr) + smStopRspTimer::?relay (sm_mgr) + smTimedOut::?relay (sm_pairing) + smUint8ToAuthReq::?relay (sm_mgr) + sm_CMAC::?relay (sm_mgr) + sm_ah::?relay (sm_mgr) + sm_c1::?relay (sm_pairing) + sm_c1new::?relay (sm_mgr) + sm_s1::?relay (sm_mgr) + sm_xor::?relay (sm_mgr) + smpBuildEncInfo::?relay (smp) + smpBuildIdentityAddrInfo::?relay (smp) + smpBuildIdentityInfo::?relay (smp) + smpBuildMasterID::?relay (smp) + smpBuildPairingConfirm::?relay (smp) + smpBuildPairingFailed::?relay (smp) + smpBuildPairingRandom::?relay (smp) + smpBuildPairingReq::?relay (smp) + smpBuildPairingReqRsp::?relay (smp) + smpBuildPairingRsp::?relay (smp) + smpBuildSecurityReq::?relay (smp) + smpBuildSigningInfo::?relay (smp) + smpParseEncInfo::?relay (smp) + smpParseIdentityAddrInfo::?relay (smp) + smpParseIdentityInfo::?relay (smp) + smpParseMasterID::?relay (smp) + smpParsePairingConfirm::?relay (smp) + smpParsePairingFailed::?relay (smp) + smpParsePairingRandom::?relay (smp) + smpParsePairingReq::?relay (smp) + smpParseSecurityReq::?relay (smp) + smpParseSigningInfo::?relay (smp) + smpResponderProcessIncoming::?relay (sm_rsppairing) + smpResponderProcessMasterID::?relay (sm_rsppairing) + smpResponderProcessPairingRandom::?relay (sm_rsppairing) + smpResponderProcessPairingReq::?relay (sm_rsppairing) + sprintf::?relay (?sprintf) + strlen::?relay (?strlen) + utilExtractUuid16::?relay (st_util) + verifyWordM::?relay (osal_snv) + writeItem::?relay (osal_snv) + writeWord::?relay (osal_snv) + xor_128::?relay (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_EQ_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000145B - 0000146F (0x15 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_EQ_X 0000145B SM_VerifyAuthenSig (sm_mgr) + findOffset (osal_snv) + initNV (osal_snv) + llSetT2OVFC2Event2 (ll_timer2) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?SL_GE_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001470 - 00001495 (0x26 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?SL_GE_X 00001470 _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001496 - 000014A5 (0x10 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GT 00001496 SM_VerifyAuthenSig (sm_mgr) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_snv_compact (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GT_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014A6 - 000014B5 (0x10 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GT_X 000014A6 GAPBondMgr_SetParameter (gapbondmgr) + osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_GE_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014B6 - 000014D4 (0x1f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_GE_X 000014B6 GAP_PasscodeUpdate (gap_linkmgr) + ll24BitTimeCompare (ll_timer2) + llFindStartType (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_TO_FLT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000014D5 - 000014D7 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_TO_FLT 000014D5 float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000014D8 - 000014EC (0x15 bytes), align: 0 + Segment part 1. Intra module refs: ?L_TO_FLT + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_TO_FLT_REW 000014D8 + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000014ED - 000014EF (0x3 bytes), align: 0 + Segment part 2. Intra module refs: ?L_TO_FLT_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_TO_FLT_REW 000014ED + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000014F0 - 0000154C (0x5d bytes), align: 0 + Segment part 3. Intra module refs: ?L_TO_FLT_REW + ?UL_TO_FLT_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_TO_FLT 000014F0 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TO_L + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000154D - 00001580 (0x34 bytes), align: 0 + Segment part 5. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TO_L 0000154D float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001581 - 0000158C (0xc bytes), align: 0 + Segment part 6. Intra module refs: ?FLT_TO_L + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 0000158D - 000015DB (0x4f bytes), align: 0 + Segment part 7. Intra module refs: ?FLT_TO_L + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_ZERO + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000015DC - 000015E5 (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_ZERO_REW 000015DC ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_ZERO_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000015E6 - 000015EF (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_ZERO_R1_REW 000015E6 ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_INF + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000015F0 - 000015F2 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_REW 000015F0 ?FLT_ADD (?FLT_ADD) + ?FLT_MUL (?FLT_MUL) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000015F3 - 00001604 (0x12 bytes), align: 0 + Segment part 1. Intra module refs: ?FLT_TEST_INF_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF 000015F3 ?FLT_DIV (?FLT_DIV) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_INF_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001605 - 00001607 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_R1_REW 00001605 ?FLT_ADD (?FLT_ADD) + ?FLT_MUL (?FLT_MUL) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001608 - 00001619 (0x12 bytes), align: 0 + Segment part 1. Intra module refs: ?FLT_TEST_INF_R1_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_INF_R1 00001608 ?FLT_DIV (?FLT_DIV) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_NAN + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000161A - 00001628 (0xf bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_NAN 0000161A ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + ?FLT_SUB (?FLT_ADD) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_TEST_NAN_R1 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001629 - 00001637 (0xf bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_TEST_NAN_R1 00001629 ?FLT_ADD (?FLT_ADD) + ?FLT_DIV (?FLT_DIV) + ?FLT_EQ (?FLT_EQ) + ?FLT_GE (?FLT_GE) + ?FLT_LT (?FLT_LT) + ?FLT_MUL (?FLT_MUL) + ?FLT_SUB (?FLT_ADD) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_EQ + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001638 - 00001663 (0x2c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_EQ 00001638 float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_GE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001664 - 000016B2 (0x4f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_GE 00001664 float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_LT + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000016B3 - 000016FE (0x4c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_LT 000016B3 _formatted_write (?largewr) + float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_MUL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000016FF - 0000187E (0x180 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_MUL 000016FF float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_ADD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 0000187F - 000018A3 (0x25 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_SUB 0000187F float_conversion (?largewr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000018A4 - 00001ABA (0x217 bytes), align: 0 + Segment part 3. Intra module refs: ?FLT_SUB + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_ADD 000018A4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FLT_DIV + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001ABB - 00001CA0 (0x1e6 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FLT_DIV 00001ABB float_conversion (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MUL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001CA1 - 00001CA3 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MUL 00001CA1 LL_TxData (ll) + gapWriteAdvEnableStatus (gap_peridevmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llScheduleTask (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_snv_compact (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001CA4 - 00001D20 (0x7d bytes), align: 0 + Segment part 1. Intra module refs: ?L_MUL + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MUL_REW 00001CA4 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_DIV_MOD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001D21 - 00001D90 (0x70 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_DIV_MOD 00001D21 _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_NEG + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001D91 - 00001D93 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_NEG_REW 00001D91 ?L_TO_FLT_REW (?L_TO_FLT) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001D94 - 00001DA4 (0x11 bytes), align: 0 + Segment part 1. Intra module refs: ?L_NEG_REW + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_NEG 00001D94 _formatted_write (?largewr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?UL_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DA5 - 00001DA9 (0x5 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?UL_SHR 00001DA5 GAP_PasscodeUpdate (gap_linkmgr) + LL_TxData (ll) + SM_GenerateAuthenSig (sm_mgr) + llCalcScaFactor (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llScheduleTask (ll_scheduler) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001DAA - 00001DBD (0x14 bytes), align: 0 + Segment part 2. Intra module refs: ?UL_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SHL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DBE - 00001DC3 (0x6 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SHL 00001DBE SM_VerifyAuthenSig (sm_mgr) + WIMU_updateProfileSensors (wimu) + osal_snv_compact (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001DC4 - 00001DC8 (0x5 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SHL_REW 00001DC4 + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001DC9 - 00001DDC (0x14 bytes), align: 0 + Segment part 2. Intra module refs: ?L_SHL + ?L_SHL_REW + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DDD - 00001DEF (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD 00001DDD LL_TxData (ll) + SM_VerifyAuthenSig (sm_mgr) + WIMU_updateProfileSensors (wimu) + ll24BitTimeDelta (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + smResponderSendNextKeyInfo (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001DF0 - 00001E02 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD_X 00001DF0 LL_SetAdvControl (ll) + LL_TxData (ll) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_ADD_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E03 - 00001E15 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_ADD_TO_X 00001E03 LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + gapIncSignCounter (gap_configmgr) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SUB + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E16 - 00001E29 (0x14 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SUB 00001E16 ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_SUB_FROM_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E2A - 00001E3D (0x14 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_SUB_FROM_X 00001E2A llAdjustTimeBackward (ll_timer2) + osalTimerUpdate (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_AND_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E3E - 00001E50 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_AND_X 00001E3E LL_SetAdvControl (ll) + LL_TxData (ll) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_AND_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E51 - 00001E63 (0x13 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_AND_TO_X 00001E51 Segment part 98 (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MOV_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E64 - 00001E72 (0xf bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MOV_X 00001E64 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_Init (ll) + RF_NormalIsr (ll_isr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 98 (ll_timer2) + _formatted_write (?largewr) + findOffset (osal_snv) + float_conversion (?largewr) + gapIncSignCounter (gap_configmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + initNV (osal_snv) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llAdjustTimeBackward (ll_timer2) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_get_timeoutEx (OSAL_Timers) + osal_snv_compact (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + smResponderSendNextKeyInfo (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?L_MOV_TO_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E73 - 00001E81 (0xf bytes), align: 0 + Segment part 2. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?L_MOV_TO_X 00001E73 LL_SetAdvControl (ll) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + gapUpdateConnSignCounter (gap_configmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llScheduler (ll_scheduler) + llSetupDirectedAdvEvt (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_start_reload_timer (OSAL_Timers) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XLOAD_R2345 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E82 - 00001E8D (0xc bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XLOAD_R2345 00001E82 GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Signable (gap_linkmgr) + LL_Reset (ll) + LL_TxData (ll) + Segment part 51 (ll_timer2) + WIMU_Init (wimu) + _formatted_write (?largewr) + gapGetSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llCalcScaFactor (ll_timerDrift) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetupAdv (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerInit (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + setActivePage (osal_snv) + setXferPage (osal_snv) + smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XSTORE_R2345 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E8E - 00001E99 (0xc bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTORE_R2345 00001E8E GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAP_Signable (gap_linkmgr) + WIMU_Init (wimu) + _formatted_write (?largewr) + gapPairingCompleteCB (gap_linkmgr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalAddTimer (OSAL_Timers) + osalTimerInit (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + setActivePage (osal_snv) + setXferPage (osal_snv) + smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?MOVE_LONG8_XDATA_IDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001E9A - 00001EA6 (0xd bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?MOVE_LONG8_XDATA_IDATA + 00001E9A ?PUSH_XSTACK_I (?PUSH_XSTACK_I) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?MOVE_LONG8_XDATA_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EA7 - 00001EC7 (0x21 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?MOVE_LONG8_XDATA_XDATA + 00001EA7 ?PUSH_XSTACK8_X (?PUSH_XSTACK8_X) + GAPBondMgr_LinkEst (gapbondmgr) + GGS_SetParameter (gapgattserver) + gapSendPairingReqEvent (gap_linkmgr) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + llAdvEvt_TaskConnect (ll_advEndCauses) + llFindTxPowerSettings (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smProcessPairingReq (sm_pairing) + smSetPairingReqRsp (sm_pairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?S_DIV_MOD + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001EC8 - 00001F08 (0x41 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_DIV_MOD 00001F01 HCI_TxDataBufferInsert (hci_data) + float_conversion (?largewr) + hciTxDataBufferReset (hci_data) + osal_snv_write (osal_snv) + sm_CMAC (sm_mgr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F09 - 00001F61 (0x59 bytes), align: 0 + Segment part 1. Intra module refs: ?S_DIV_MOD + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_DIV_MOD 00001F09 WIMU_updateProfileSensors (wimu) + llCalcTimerDrift (ll_timerDrift) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llGetNextDataChan (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?SS_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001F62 - 00001F64 (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?SS_SHR 00001F62 HalAdcRead (hal_adc) + llProcessChanMap (ll_common) + phyFindWlEntry (phy) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F65 - 00001F71 (0xd bytes), align: 0 + Segment part 2. Intra module refs: ?SS_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SHR + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001F72 - 00001F74 (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SHR 00001F72 HalFlashWrite (hal_flash) + LL_Init (ll) + LL_ProcessEvent (ll) + RF_NormalIsr (ll_isr) + llAdvEvt_TaskConnect (ll_advEndCauses) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + osalTimeUpdate (OSAL_ClockBLE) + osal_CbTimerProcessEvent (osal_cbtimer) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F75 - 00001F80 (0xc bytes), align: 0 + Segment part 2. Intra module refs: ?US_SHR + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?S_SHL + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001F81 - 00001F83 (0x3 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_SHL 00001F81 ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + GATTServApp_FindAttr (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_InitServer (gatt_server) + GATT_RegisterService (gatt_server) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HalFlashRead (hal_flash) + L2CAP_Init (l2cap_task) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + gapBondMgrAuthenticate (gapbondmgr) + gattFindServerInfo (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + hciTxDataBufferReset (hci_data) + l2capAllocChannel (l2cap_util) + l2capFindLocalId (l2cap_util) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + osal_CbTimerProcessEvent (osal_cbtimer) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_snv_write (osal_snv) + phyFindWlEntry (phy) + smSavePairInfo (sm_pairing) + smUint8ToAuthReq (sm_mgr) + smpParsePairingReq (smp) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F84 - 00001F86 (0x3 bytes), align: 0 + Segment part 1. Intra module refs: Segment part 2 + ENTRY ADDRESS REF BY + ===== ======= ====== + ?S_SHL_REW 00001F84 + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00001F87 - 00001F93 (0xd bytes), align: 0 + Segment part 2. Intra module refs: ?S_SHL + ?S_SHL_REW + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?ALLOC_XSTACK8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001F94 - 00001FA9 (0x16 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ALLOC_XSTACK8 00001F94 ATT_CompareUUID (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_TerminateAuth (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_EXT_ClkDivOnHaltCmd (hci) + HCI_LE_AddWhiteListCmd (hci) + HCI_LE_ClearWhiteListCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetAdvDataCmd (hci) + HCI_LE_SetAdvEnableCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_LE_SetRandomAddressCmd (hci) + HCI_LE_SetScanRspDataCmd (hci) + HCI_ReadBDADDRCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HalUARTInitDMA (hal_uart) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_RandCback (hci) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + WIMU_Init (wimu) + WIMU_openUART (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapProcessOSALMsg (gap_task) + gapRole_startConnUpdate (peripheral) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llGetCurrentTime (ll_timer2) + llProcessPostRfOps (ll_common) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + ll_McuPrecisionCount (ll_timer2) + osalTimerUpdate (OSAL_Timers) + osal_snv_write (osal_snv) + setActivePage (osal_snv) + setXferPage (osal_snv) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + verifyWordM (osal_snv) + writeItem (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?DEALLOC_XSTACK8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FAA - 00001FC3 (0x1a bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?DEALLOC_XSTACK8 00001FAA ?Subroutine0 (gapbondmgr) + ?Subroutine0 (peripheral) + ?Subroutine2 (gapbondmgr) + ?Subroutine2 (osal_snv) + ?Subroutine5 (gapbondmgr) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ExchangeMTURsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_ProcessEvent (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + Hal_ProcessEvent (hal_drivers) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + Onboard_rand (OnBoard) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 104 (gattservapp) + Segment part 127 (hci) + Segment part 134 (hci) + Segment part 177 (gattservapp) + Segment part 19 (sm_mgr) + Segment part 20 (l2cap_if) + Segment part 25 (osal_snv) + Segment part 35 (att_server) + Segment part 35 (sm_pairing) + Segment part 36 (?largewr) + Segment part 49 (sm_mgr) + Segment part 50 (sm_mgr) + Segment part 53 (ll_timer2) + Segment part 56 (ll_common) + Segment part 56 (sm_mgr) + Segment part 58 (att_util) + Segment part 62 (gattservapp) + Segment part 62 (ll_enc) + Segment part 67 (att_util) + Segment part 79 (gatt_server) + Segment part 81 (att_util) + Segment part 84 (att_util) + Segment part 88 (sm_pairing) + Segment part 89 (sm_pairing) + Segment part 98 (att_util) + Segment part 98 (hci) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_openUART (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondSetupPrivFlag (gapbondmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + halProcessKeyInterrupt (hal_key) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capEncapSendData (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetNextDataChan (ll_common) + llSetT2OVFC2Event2 (ll_timer2) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_receive (OSAL) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + setActivePage (osal_snv) + setXferPage (osal_snv) + smEncrypt (sm_mgr) + smEndPairing (sm_pairing) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?ADD_XSTACK_DISP8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FC4 - 00001FDE (0x1b bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?ADD_XSTACK_DISP0_8 00001FC4 ?PUSH_XSTACK_I (?PUSH_XSTACK_I) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?XSTACK_DISP8 + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FDF - 00001FE8 (0xa bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?XSTACK_DISP0_8 00001FDF ATT_CompareUUID (att_util) + ATT_ParseExchangeMTUReq (att_util) + ATT_ParseExecuteWriteReq (att_util) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParseFindInfoReq (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadBlobReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseReadReq (att_util) + ATT_ParseWriteReq (att_util) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_SecParamsInit (gap_configmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GATTServApp_FindAttr (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_ServiceChangedInd (gatt_server) + HCI_EXT_ClkDivOnHaltCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_RandCmd (hci) + HCI_LE_ReadBufSizeCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_ReadBDADDRCmd (hci) + HCI_ReadRssiCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + L2CAP_ParseParamUpdateReq (l2cap_util) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateNonce (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EXT_ExtendRfRangeCback (hci) + LL_EXT_SetRxGainCback (hci) + LL_EXT_SetTxPowerCback (hci) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_SetAdvParam (ll) + LL_TxData (ll) + LL_TxDataCompleteCback (hci_data) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 49 (sm_mgr) + Segment part 51 (ll_timer2) + Segment part 88 (sm_pairing) + WIMU_Init (wimu) + WIMU_openUART (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapFindADType (gap_devmgr) + gapPairingCompleteCB (gap_linkmgr) + gapRole_startConnUpdate (peripheral) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapUpdateConnSignCounter (gap_configmgr) + gattNotifyEvent (gatt_task) + gattProcessFindInfoReq (gatt_server) + gattProcessRxData (gatt_task) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParseParamUpdateRsp (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustForMissedEvent (ll_common) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llGetCurrentFineTime (ll_timer2) + llSetT2C1Event1 (ll_timer2) + llSetT2Delta (ll_timer2) + llSetT2OVFC1Event1 (ll_timer2) + llSetT2OVFC1Timeout (ll_timer2) + llSetT2OVFC2Event2 (ll_timer2) + llWriteTxData (ll_common) + ll_McuPrecisionCount (ll_timer2) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerStart (osal_cbtimer) + osal_memcmp (OSAL) + osal_memcpy (OSAL) + osal_msg_extract (OSAL) + osal_revmemcpy (OSAL) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessPairingReq (sm_pairing) + smResponderProcessLTKReq (sm_rsppairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpResponderProcessPairingRandom (sm_rsppairing) + sprintf (?sprintf) + verifyWordM (osal_snv) + writeItem (osal_snv) + xor_128 (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?CALL_IND + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FE9 - 00001FEA (0x2 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?CALL_IND 00001FE9 Actimetry_WriteAttrCB (actimetryservice) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_ProcessEvent (gap_task) + GAP_TerminateLinkReq (gap_linkmgr) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_WriteAttr (gattservapp) + HalKeyPoll (hal_key) + HalUARTPollDMA (hal_uart) + LL_ProcessEvent (ll) + _formatted_write (?largewr) + attSendMsg (att_util) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gattProcessRxData (gatt_task) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + ggs_WriteAttrCB (gapgattserver) + l2capSendCmd (l2cap_util) + linkDB_PerformFunc (linkdb) + llScheduleTask (ll_scheduler) + osal_CbTimerProcessEvent (osal_cbtimer) + osal_run_system (OSAL) + reportStatusChange (linkdb) + smNextPairingState (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_ENTER_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00001FEB - 00002056 (0x6c bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BANKED_ENTER_XDATA 00001FEB ATT_BuildErrorRsp (att_util) + ATT_BuildFindByTypeValueRsp (att_util) + ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseExchangeMTUReq (att_util) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParseFindInfoReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadBlobReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseReadMultiReq (att_util) + ATT_ParseReadReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_Init (gapbondmgr) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_ServiceChangeInd (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPBondMgr_UpdateCharCfg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_ProcessEvent (peripheral) + GAPRole_SendUpdateParam (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_EndDiscoverable (gap_peridevmgr) + GAP_Init (gap_task) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_ParamsInit (gap_configmgr) + GAP_PasscodeUpdate (gap_linkmgr) + GAP_PeriDevMgrInit (gap_peridevmgr) + GAP_ProcessEvent (gap_task) + GAP_SecParamsInit (gap_configmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_TerminateAuth (gap_linkmgr) + GAP_TerminateLinkReq (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_FindAttr (gattservapp) + GATTServApp_Init (gattservapp) + GATTServApp_InitCharCfg (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ProcessEvent (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_ReadCharCfg (gattservapp) + GATTServApp_RegisterService (gattservapp) + GATTServApp_SendCCCUpdatedEvent (gattservapp) + GATTServApp_SendServiceChangedInd (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATTServApp_WriteCharCfg (gattservapp) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Init (gatt_task) + GATT_InitServer (gatt_server) + GATT_Notification (gatt_server) + GATT_ProcessEvent (gatt_task) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GATT_VerifyReadPermissions (gatt_server) + GATT_VerifyWritePermissions (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_CommandStatusEvent (hci_event) + HCI_DataBufferOverflowEvent (hci_event) + HCI_DisconnectCmd (hci) + HCI_EXT_ClkDivOnHaltCmd (hci) + HCI_Init (hci_tl) + HCI_LE_AddWhiteListCmd (hci) + HCI_LE_LtkReqNegReplyCmd (hci) + HCI_LE_LtkReqReplyCmd (hci) + HCI_LE_SetAdvDataCmd (hci) + HCI_LE_SetAdvEnableCmd (hci) + HCI_LE_SetAdvParamCmd (hci) + HCI_LE_SetScanRspDataCmd (hci) + HCI_NumOfCompletedPacketsEvent (hci_event) + HCI_ProcessEvent (hci_tl) + HCI_ReadRssiCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HCI_TxDataSend (hci_data) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalAdcRead (hal_adc) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + HalKeyConfig (hal_key) + HalKeyPoll (hal_key) + HalUARTInitDMA (hal_uart) + HalUARTOpen (hal_uart) + HalUARTPollDMA (hal_uart) + HalUARTRead (hal_uart) + HalUARTReadDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + Hal_ProcessEvent (hal_drivers) + Hal_UART_RxBufLen (hal_uart) + InitBoard (OnBoard) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + L2CAP_Init (l2cap_task) + L2CAP_ParseParamUpdateReq (l2cap_util) + L2CAP_ProcessEvent (l2cap_task) + L2CAP_SendData (l2cap_if) + L2CAP_bm_alloc (l2cap_util) + LL_AddWhiteListDevice (ll) + LL_ConnParamUpdateCback (hci_event) + LL_ConnectionCompleteCback (hci_event) + LL_Disconnect (ll) + LL_DisconnectCback (hci_event) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_GenerateTrueRandNum (ll_enc) + LL_ENC_MoveData (ll_enc) + LL_ENC_ReverseBytes (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EncChangeCback (hci_event) + LL_EncKeyRefreshCback (hci_event) + LL_EncLtkNegReply (ll) + LL_EncLtkReply (ll) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_PseudoRand (ll) + LL_Rand (ll) + LL_RandCback (hci) + LL_ReadRemoteVersionInfoCback (hci_event) + LL_ReadRssi (ll) + LL_RxDataCompleteCback (hci_data) + LL_RxReqDataBufCback (hci_data) + LL_SetAdvControl (ll) + LL_SetAdvData (ll) + LL_SetAdvParam (ll) + LL_SetScanRspData (ll) + LL_TxData (ll) + OnBoard_KeyCallback (OnBoard) + OnBoard_SendKeys (OnBoard) + PHY_AddWlEntry (phy) + PHY_ClearBlacklistIndex (phy) + PHY_SetBlacklistIndex (phy) + PHY_SetCRCInit (phy) + PHY_SetSyncWord (phy) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_Init (sm_task) + SM_PasskeyUpdate (sm_pairing) + SM_ProcessEvent (sm_task) + SM_ResolveRandomAddrs (sm_mgr) + SM_StartPairing (sm_pairing) + SM_VerifyAuthenSig (sm_mgr) + Segment part 67 (att_util) + Segment part 81 (att_util) + Segment part 84 (att_util) + Segment part 98 (att_util) + WIMU_Init (wimu) + WIMU_ProcessEvent (wimu) + WIMU_UARTCallback (wimu) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + attSendMsg (att_util) + battReadAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + disconnectNext (gap_linkmgr) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + float_conversion (?largewr) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrBondReq (gapbondmgr) + gapBondMgrBondTotal (gapbondmgr) + gapBondMgrChangeState (gapbondmgr) + gapBondMgrEraseAllBondings (gapbondmgr) + gapBondMgrEraseBonding (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrFindCharCfgItem (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapBondMgrInvertCharCfgItem (gapbondmgr) + gapBondMgrReadBonds (gapbondmgr) + gapBondMgrResolvePrivateAddr (gapbondmgr) + gapBondMgrUpdateCharCfg (gapbondmgr) + gapBondMgr_SyncWhiteList (gapbondmgr) + gapFindADType (gap_devmgr) + gapIncSignCounter (gap_configmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessDisconnectCompleteEvt (gap_linkmgr) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessNewAddr (gap_configmgr) + gapProcessOSALMsg (gap_task) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapReadBufSizeCmdStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapSendBondCompleteEvent (gap_linkmgr) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSendLinkUpdateEvent (gap_linkmgr) + gapSendMakeDiscEvent (gap_peridevmgr) + gapSendPairingReqEvent (gap_linkmgr) + gapSetAdvParams (gap_peridevmgr) + gapSetAdvParamsStatus (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvDataStatus (gap_peridevmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattFindServerInfo (gatt_server) + gattGetServerStatus (gatt_server) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattProcessReadMultiReq (gatt_server) + gattProcessReadReq (gatt_server) + gattProcessRxData (gatt_task) + gattProcessWriteReq (gatt_server) + gattServApp_FindAuthorizeAttrCB (gattservapp) + gattServApp_FindCharCfgItem (gattservapp) + gattServApp_HandleConnStatusCB (gattservapp) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_SetNumPrepareWrites (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattServiceLastHandle (gatt_server) + gattStartTimer (gatt_task) + gattStopTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_HandleConnStatusCB (gpsservice) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + halGetJoyKeyInput (hal_key) + hciTxDataBufferReset (hci_data) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capAllocChannel (l2cap_util) + l2capBuildParamUpdateReq (l2cap_util) + l2capEncapSendData (l2cap_util) + l2capFindLocalId (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capNotifyData (l2cap_util) + l2capNotifySignal (l2cap_util) + l2capParseCmdReject (l2cap_util) + l2capParsePacket (l2cap_util) + l2capParseParamUpdateRsp (l2cap_util) + l2capParseSignalHdr (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendCmd (l2cap_util) + l2capSendReq (l2cap_util) + l2capStopTimer (l2cap_util) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Register (linkdb) + linkDB_Remove (linkdb) + linkDB_State (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocConnId (ll_common) + llAllocTask (ll_scheduler) + llClearSetInts (ll_common) + llConnCleanup (ll_common) + llConnTerminate (ll_common) + llConvertCtrlProcTimeoutToEvent (ll_common) + llConvertLstoToEvent (ll_common) + llDequeueCtrlPkt (ll_common) + llDiscoverableAdvEvt_TaskEndOk (ll_advEndCauses) + llEnqueueCtrlPkt (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetTask (ll_scheduler) + llInitFeatureSet (ll_common) + llNonConnAdvEvt_TaskEndOk (ll_advEndCauses) + llProcessChanMap (ll_common) + llProcessPendingTxData (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llRestore_rxFIFO (ll_scheduler) + llRestore_txFIFO (ll_scheduler) + llSaveConnState (ll_scheduler) + llSave_rxFIFO (ll_scheduler) + llSave_txFIFO (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + llSetupDirectedAdvEvt (ll_common) + llSetupEncRsp (ll_common) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupNonConnectableAdvEvt (ll_common) + llSetupPauseEncRsp (ll_common) + llSetupRejectInd (ll_common) + llSetupScannableAdvEvt (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUndirectedAdvEvt (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llStartSlaveSetup (ll_common) + llUndirectedAdvEvt_TaskEndOk (ll_advEndCauses) + llWriteTxData (ll_common) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerInit (osal_cbtimer) + osal_CbTimerProcessEvent (osal_cbtimer) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_adjust_header (osal_bufmgr) + osal_bm_alloc (osal_bufmgr) + osal_bm_free (osal_bufmgr) + osal_clear_event (OSAL) + osal_get_timeoutEx (OSAL_Timers) + osal_isbufset (OSAL) + osal_mem_alloc (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_memcmp (OSAL) + osal_memcpy (OSAL) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_allocate (OSAL) + osal_msg_enqueue (OSAL) + osal_msg_enqueue_push (OSAL) + osal_msg_extract (OSAL) + osal_msg_push (OSAL) + osal_msg_receive (OSAL) + osal_msg_send (OSAL) + osal_pwrmgr_task_state (OSAL_PwrMgr) + osal_revmemcpy (OSAL) + osal_run_system (OSAL) + osal_set_event (OSAL) + osal_snv_compact (osal_snv) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + osal_stop_timerEx (OSAL_Timers) + phyFindWlEntry (phy) + reportStatusChange (linkdb) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + sendTerminateEvent (gap_linkmgr) + setActivePage (osal_snv) + smEncrypt (sm_mgr) + smEndPairing (sm_pairing) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandBuf (sm_mgr) + smGenerateRandMsg (sm_pairing) + smLinkCheck (sm_pairing) + smPairingSendEncInfo (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendIdentityInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smPairingSendSingingInfo (sm_pairing) + smProcessDataMsg (sm_pairing) + smProcessEncryptChange (sm_pairing) + smProcessOSALMsg (sm_task) + smProcessPairingReq (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smSendSMMsg (smp) + smSetPairingReqRsp (sm_pairing) + smStartEncryption (sm_pairing) + smStartRspTimer (sm_mgr) + smUint8ToAuthReq (sm_mgr) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + sm_xor (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParsePairingReq (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + utilExtractUuid16 (st_util) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + xor_128 (sm_mgr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FUNC_ENTER_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002057 - 000020BC (0x66 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FUNC_ENTER_XDATA 00002057 ll24BitTimeCompare (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llAdjustTimeBackward (ll_timer2) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llGetNextDataChan (ll_common) + llSetNextDataChan (ll_common) + llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?BANKED_LEAVE_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000020BD - 00002102 (0x46 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?BANKED_LEAVE_XDATA 000020BD ?Subroutine0 (OnBoard) + ?Subroutine0 (devinfoservice) + ?Subroutine0 (hal_uart) + ?Subroutine0 (osal_bufmgr) + ?Subroutine0 (wimu) + ?Subroutine1 (OSAL_Timers) + ?Subroutine1 (gapbondmgr) + ?Subroutine1 (hal_key) + ?Subroutine2 (OSAL) + ?Subroutine2 (OSAL_Timers) + ?Subroutine2 (hal_uart) + ?Subroutine3 (OSAL) + ?Subroutine4 (OSAL) + ?Subroutine4 (gapbondmgr) + ?Subroutine5 (gapbondmgr) + Actimetry_AddService (actimetryservice) + Actimetry_HandleConnStatusCB (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_Init (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_DeviceInit (gap) + GAP_Init (gap_task) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATT_FindHandle (gatt_server) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_Notification (gatt_server) + GATT_RegisterService (gatt_server) + GGS_SetParameter (gapgattserver) + HCI_CommandStatusEvent (hci_event) + HCI_Init (hci_tl) + HCI_LE_SetAdvParamCmd (hci) + HCI_ProcessEvent (hci_tl) + HCI_SendCommandStatusEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_TxDataBufferInsert (hci_data) + HalAdcRead (hal_adc) + HalFlashRead (hal_flash) + HalFlashWrite (hal_flash) + HalKeyConfig (hal_key) + HalUARTRxAvailDMA (hal_uart) + Hal_ProcessEvent (hal_drivers) + L2CAP_BuildCmdReject (l2cap_util) + L2CAP_Init (l2cap_task) + LL_ENC_Decrypt (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ENC_SetupCryptoDMA (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_RxDataCompleteCback (hci_data) + LL_TxData (ll) + OnBoard_SendKeys (OnBoard) + PHY_AddWlEntry (phy) + SM_Init (sm_task) + SM_ProcessEvent (sm_task) + SM_StartPairing (sm_pairing) + Segment part 105 (gattservapp) + Segment part 11 (sm_mgr) + Segment part 120 (gapbondmgr) + Segment part 120 (gattservapp) + Segment part 13 (hci_event) + Segment part 13 (l2cap_task) + Segment part 135 (hci) + Segment part 14 (sm_rsppairing) + Segment part 146 (ll) + Segment part 153 (ll) + Segment part 16 (gap_linkmgr) + Segment part 16 (gatt_task) + Segment part 16 (hci_event) + Segment part 16 (l2cap_util) + Segment part 162 (gattservapp) + Segment part 163 (ll) + Segment part 168 (gattservapp) + Segment part 170 (ll_common) + Segment part 172 (ll) + Segment part 173 (ll_common) + Segment part 175 (att_util) + Segment part 177 (gattservapp) + Segment part 178 (ll_common) + Segment part 186 (ll_common) + Segment part 19 (gatt_task) + Segment part 20 (gap_task) + Segment part 20 (ll_enc) + Segment part 20 (sm_mgr) + Segment part 21 (l2cap_if) + Segment part 213 (ll_common) + Segment part 22 (l2cap_util) + Segment part 220 (phy) + Segment part 25 (gap_configmgr) + Segment part 26 (att_util) + Segment part 26 (gatt_server) + Segment part 26 (linkdb) + Segment part 26 (ll_scheduler) + Segment part 26 (osal_snv) + Segment part 28 (hci_data) + Segment part 30 (sm_pairing) + Segment part 31 (gatt_server) + Segment part 31 (sm_rsppairing) + Segment part 33 (gpsservice) + Segment part 34 (gap_configmgr) + Segment part 34 (gap_peridevmgr) + Segment part 35 (gap_linkmgr) + Segment part 36 (?largewr) + Segment part 36 (att_server) + Segment part 36 (sm_pairing) + Segment part 37 (gapgattserver) + Segment part 38 (gapbondmgr) + Segment part 38 (hci_event) + Segment part 39 (ll_enc) + Segment part 39 (ll_slaveEndCauses) + Segment part 43 (phy) + Segment part 45 (osal_snv) + Segment part 46 (gattservapp) + Segment part 46 (ll_advEndCauses) + Segment part 46 (smp) + Segment part 47 (gap_configmgr) + Segment part 47 (gap_linkmgr) + Segment part 47 (gapgattserver) + Segment part 51 (sm_mgr) + Segment part 53 (att_util) + Segment part 53 (gap_linkmgr) + Segment part 53 (gap_peridevmgr) + Segment part 56 (sm_mgr) + Segment part 59 (att_util) + Segment part 61 (gap_peridevmgr) + Segment part 62 (gattservapp) + Segment part 62 (hci_event) + Segment part 62 (l2cap_util) + Segment part 62 (ll_enc) + Segment part 62 (peripheral) + Segment part 65 (l2cap_util) + Segment part 66 (gap_linkmgr) + Segment part 68 (gatt_server) + Segment part 71 (OSAL) + Segment part 71 (sm_mgr) + Segment part 72 (ll_scheduler) + Segment part 79 (phy) + Segment part 80 (gatt_server) + Segment part 81 (l2cap_util) + Segment part 81 (ll_common) + Segment part 81 (ll_scheduler) + Segment part 86 (att_util) + Segment part 9 (att_util) + Segment part 90 (sm_pairing) + Segment part 93 (gattservapp) + Segment part 98 (hci) + Segment part 98 (hci_event) + WIMU_ProcessEvent (wimu) + WIMU_updateProfileSensors (wimu) + battReadAttrCB (battservice) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + disconnectNext (gap_linkmgr) + gapBondMgrAddBond (gapbondmgr) + gapFindADType (gap_devmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessOSALMsg (gap_task) + gapRole_ProcessGAPMsg (peripheral) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + gattNotifyEvent (gatt_task) + gattProcessRxData (gatt_task) + generate_subkey (sm_mgr) + gps_HandleConnStatusCB (gpsservice) + gps_WriteAttrCB (gpsservice) + hciTxDataBufferReset (hci_data) + l2capNotifyData (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessRxData (l2cap_task) + leftshift_onebit (sm_mgr) + linkDB_Add (linkdb) + linkDB_Authen (linkdb) + linkDB_Register (linkdb) + llAdjustForMissedEvent (ll_common) + llAdvEvt_TaskConnect (ll_advEndCauses) + llAllocTask (ll_scheduler) + llFindNextSecTask (ll_scheduler) + llFindTxPowerSettings (ll_common) + llGetTask (ll_scheduler) + llSaveConnState (ll_scheduler) + llScheduleTask (ll_scheduler) + llSetT2OVFC2Event2 (ll_timer2) + memset (?memset) + osalAddTimer (OSAL_Timers) + osalTimeUpdate (OSAL_ClockBLE) + osalTimerUpdate (OSAL_Timers) + osal_CbTimerInit (osal_cbtimer) + osal_CbTimerProcessEvent (osal_cbtimer) + osal_CbTimerStart (osal_cbtimer) + osal_CbTimerStop (osal_cbtimer) + osal_bm_alloc (osal_bufmgr) + osal_bm_free (osal_bufmgr) + osal_mem_alloc (OSAL_Memory) + osal_mem_kick (OSAL_Memory) + osal_pwrmgr_task_state (OSAL_PwrMgr) + setActivePage (osal_snv) + smProcessOSALMsg (sm_task) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendSMMsg (smp) + smStartEncryption (sm_pairing) + sm_c1 (sm_pairing) + smpBuildPairingReqRsp (smp) + smpBuildSecurityReq (smp) + smpParsePairingReq (smp) + sprintf (?sprintf) + utilExtractUuid16 (st_util) + writeItem (osal_snv) + writeWord (osal_snv) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?FUNC_LEAVE_XDATA + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002103 - 00002142 (0x40 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?FUNC_LEAVE_XDATA 00002103 Segment part 279 (ll_common) + Segment part 94 (ll_timer2) + Segment part 98 (ll_timer2) + ll24BitTimeDelta (ll_timer2) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llT2OVFC1_ISR (ll_isr) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?INTERRUPT_ENTER_XSP + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002143 - 000021A1 (0x5f bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?INTERRUPT_ENTER_XSP 00002143 RF_NormalIsr (ll_isr) + T2_Isr (ll_isr) + halDmaIsr (hal_dma) + halKeyPort0Isr (hal_key) + halKeyPort2Isr (hal_key) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?INTERRUPT_LEAVE_XSP + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000021A2 - 000021F9 (0x58 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?INTERRUPT_LEAVE_XSP 000021A2 ?Subroutine2 (hal_key) + RF_NormalIsr (ll_isr) + T2_Isr (ll_isr) + halDmaIsr (hal_dma) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?PUSH_XSTACK_I + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000021FA - 000021FD (0x4 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_FOUR 000021FA GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + LL_TxData (ll) + SM_VerifyAuthenSig (sm_mgr) + gapProcessAdvertisingEvt (gap_peridevmgr) + gapRole_ProcessGAPMsg (peripheral) + gapRole_ProcessOSALMsg (peripheral) + gapRole_startConnUpdate (peripheral) + gapWriteAdvEnableStatus (gap_peridevmgr) + llAdjustForMissedEvent (ll_common) + llFindNextSecTask (ll_scheduler) + llFindStartType (ll_scheduler) + llScheduleTask (ll_scheduler) + llScheduler (ll_scheduler) + llSetupNextSlaveEvent (ll_slaveEndCauses) + osal_CbTimerStart (osal_cbtimer) + osal_start_reload_timer (OSAL_Timers) + osal_start_timerEx (OSAL_Timers) + smResponderSendNextKeyInfo (sm_rsppairing) + smStartRspTimer (sm_mgr) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000021FE - 00002201 (0x4 bytes), align: 0 + Segment part 2. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_TWO 000021FE ATT_BuildFindInfoRsp (att_util) + ATT_CompareUUID (att_util) + ATT_ConvertUUIDto128 (att_util) + ATT_ErrorRsp (att_server) + ATT_ExchangeMTURsp (att_server) + ATT_ExecuteWriteRsp (att_server) + ATT_FindByTypeValueRsp (att_server) + ATT_FindInfoRsp (att_server) + ATT_HandleValueInd (att_server) + ATT_HandleValueNoti (att_server) + ATT_ParseFindByTypeValueReq (att_util) + ATT_ParsePacket (att_util) + ATT_ParsePrepareWriteReq (att_util) + ATT_ParseReadByTypeReq (att_util) + ATT_ParseWriteReq (att_util) + ATT_PrepareWriteRsp (att_server) + ATT_ReadBlobRsp (att_server) + ATT_ReadByGrpTypeRsp (att_server) + ATT_ReadByTypeRsp (att_server) + ATT_ReadMultiRsp (att_server) + ATT_ReadRsp (att_server) + ATT_WriteRsp (att_server) + Actimetry_AddService (actimetryservice) + Actimetry_ReadAttrCB (actimetryservice) + Actimetry_SetParameter (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + Batt_AddService (battservice) + DevInfo_AddService (devinfoservice) + DevInfo_SetParameter (devinfoservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPBondMgr_ResolveAddr (gapbondmgr) + GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAPRole_SetParameter (peripheral) + GAPRole_StartDevice (peripheral) + GAP_Authenticate (gap_linkmgr) + GAP_Bond (gap_linkmgr) + GAP_DeviceInit (gap) + GAP_MakeDiscoverable (gap_peridevmgr) + GAP_SendSlaveSecurityRequest (gap_perilinkmgr) + GAP_Signable (gap_linkmgr) + GAP_UpdateAdvertisingData (gap_peridevmgr) + GATTServApp_AddService (gattservapp) + GATTServApp_ProcessCCCWriteReq (gattservapp) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATTServApp_UpdateCharCfg (gattservapp) + GATTServApp_WriteAttr (gattservapp) + GATT_FindHandleUUID (gatt_server) + GATT_FindNextAttr (gatt_server) + GATT_Indication (gatt_server) + GATT_RegisterService (gatt_server) + GATT_ServiceChangedInd (gatt_server) + GGS_AddService (gapgattserver) + GGS_SetParameter (gapgattserver) + Gps_AddService (gpsservice) + Gps_SetParameter (gpsservice) + HCI_CommandCompleteEvent (hci_event) + HCI_LE_SetAdvParamCmd (hci) + HCI_SendCommandCompleteEvent (hci_event) + HCI_SendControllerToHostEvent (hci_event) + HCI_SendDataPkt (hci) + HCI_VendorSpecifcCommandCompleteEvent (hci_event) + HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + L2CAP_CmdReject (l2cap_if) + L2CAP_ConnParamUpdateReq (l2cap_if) + LL_ConnectionCompleteCback (hci_event) + LL_ENC_Decrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_Encrypt (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_EncLtkReqCback (hci_event) + LL_Encrypt (ll) + LL_Init (ll) + LL_ProcessEvent (ll) + LL_RandCback (hci) + LL_SetAdvData (ll) + LL_SetScanRspData (ll) + SM_CalcRandomAddr (sm_mgr) + SM_GenerateAuthenSig (sm_mgr) + SM_PasskeyUpdate (sm_pairing) + SM_ResolveRandomAddrs (sm_mgr) + SM_VerifyAuthenSig (sm_mgr) + Segment part 48 (sm_mgr) + Segment part 67 (att_util) + Segment part 81 (att_util) + Segment part 83 (sm_pairing) + Segment part 84 (att_util) + Segment part 88 (sm_pairing) + Segment part 98 (att_util) + WIMU_updateProfileSensors (wimu) + _formatted_write (?largewr) + battReadAttrCB (battservice) + cleanErasedPage (osal_snv) + compactPage (osal_snv) + devInfo_ReadAttrCB (devinfoservice) + erasePage (osal_snv) + findItem (osal_snv) + findOffset (osal_snv) + gapBondMgrAddBond (gapbondmgr) + gapBondMgrAuthenticate (gapbondmgr) + gapBondMgrFindAddr (gapbondmgr) + gapBondMgrGetPublicAddr (gapbondmgr) + gapPairingCompleteCB (gap_linkmgr) + gapPasskeyNeededCB (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapProcessNewAddr (gap_configmgr) + gapProcessRandomAddrComplete (gap_configmgr) + gapReadBD_ADDRStatus (gap_configmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSendDeviceInitDoneEvent (gap_configmgr) + gapSetAdvParams (gap_peridevmgr) + gapUpdateConnSignCounter (gap_configmgr) + gattNotifyEvent (gatt_task) + gattProcessFindByTypeValueReq (gatt_server) + gattProcessFindInfoReq (gatt_server) + gattProcessReadByGrpTypeReq (gatt_server) + gattProcessReadByTypeReq (gatt_server) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessPrepareWriteReq (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServApp_ProcessWriteReq (gattservapp) + gattServApp_WriteAttrCB (gattservapp) + gattServerHandleConnStatusCB (gatt_server) + gattServerHandleTimerCB (gatt_server) + gattServerProcessMsgCB (gatt_server) + gattStartTimer (gatt_task) + generate_subkey (sm_mgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + gps_ReadAttrCB (gpsservice) + gps_WriteAttrCB (gpsservice) + initNV (osal_snv) + isLimitedDiscoverableMode (gap_peridevmgr) + l2capEncapSendData (l2cap_util) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + l2capProcessSignal (l2cap_task) + l2capSendReq (l2cap_util) + linkDB_Add (linkdb) + llAdvEvt_TaskConnect (ll_advEndCauses) + llCalcScaFactor (ll_timerDrift) + llCalcTimerDrift (ll_timerDrift) + llFindTxPowerSettings (ll_common) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llRestoreConnState (ll_scheduler) + llSaveConnState (ll_scheduler) + llSetupFeatureSetRsp (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + llSetupPauseEncRsp (ll_common) + llSetupStartEncRsp (ll_common) + llSetupTermInd (ll_common) + llSetupUnknownRsp (ll_common) + llSetupVersionIndReq (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + llWriteTxData (ll_common) + osal_memdup (OSAL) + osal_memset (OSAL) + osal_msg_receive (OSAL) + osal_snv_read (osal_snv) + osal_snv_write (osal_snv) + sendAuthEvent (gap_linkmgr) + sendEstLinkEvent (gap_linkmgr) + smEncrypt (sm_mgr) + smGenerateConfirm (sm_pairing) + smGeneratePairingReqRsp (sm_pairing) + smGenerateRandMsg (sm_pairing) + smPairingSendIdentityAddrInfo (sm_pairing) + smPairingSendMasterID (sm_pairing) + smProcessRandComplete (sm_mgr) + smResponderProcessLTKReq (sm_rsppairing) + smResponderSendNextKeyInfo (sm_rsppairing) + smSavePairInfo (sm_pairing) + smSendFailAndEnd (sm_pairing) + smStartEncryption (sm_pairing) + sm_CMAC (sm_mgr) + sm_ah (sm_mgr) + sm_c1 (sm_pairing) + sm_c1new (sm_mgr) + sm_s1 (sm_mgr) + smpBuildEncInfo (smp) + smpBuildIdentityAddrInfo (smp) + smpBuildIdentityInfo (smp) + smpBuildMasterID (smp) + smpBuildPairingConfirm (smp) + smpBuildPairingRandom (smp) + smpBuildSigningInfo (smp) + smpParseEncInfo (smp) + smpParseIdentityAddrInfo (smp) + smpParseIdentityInfo (smp) + smpParseMasterID (smp) + smpParsePairingConfirm (smp) + smpParsePairingRandom (smp) + smpParseSigningInfo (smp) + smpResponderProcessIncoming (sm_rsppairing) + smpResponderProcessMasterID (sm_rsppairing) + smpResponderProcessPairingRandom (sm_rsppairing) + smpResponderProcessPairingReq (sm_rsppairing) + sprintf (?sprintf) + verifyWordM (osal_snv) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002202 - 00002203 (0x2 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I_ONE 00002202 ATT_ParsePacket (att_util) + Actimetry_SetParameter (actimetryservice) + GAPBondMgr_LinkEst (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATT_ServiceChangedInd (gatt_server) + Gps_SetParameter (gpsservice) + HCI_LE_SetAdvParamCmd (hci) + HCI_TxDataSend (hci_data) + L2CAP_ConnParamUpdateReq (l2cap_if) + LL_ENC_AES128_Encrypt (ll_enc) + LL_ENC_DecryptMsg (ll_enc) + LL_ENC_EncryptMsg (ll_enc) + LL_ENC_GenerateMIC (ll_enc) + LL_ProcessEvent (ll) + LL_TxData (ll) + _formatted_write (?largewr) + gapBondMgrBondReq (gapbondmgr) + gapRole_ProcessGAPMsg (peripheral) + gapSetAdvParams (gap_peridevmgr) + l2capHandleTimerCB (l2cap_util) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + llProcessPendingTxData (ll_common) + llSlaveEvt_TaskEndOk (ll_slaveEndCauses) + sm_c1 (sm_pairing) + smpResponderProcessIncoming (sm_rsppairing) + writeItem (osal_snv) + writeWord (osal_snv) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002204 - 00002210 (0xd bytes), align: 0 + Segment part 4. Intra module refs: ?PUSH_XSTACK_I_FOUR + ?PUSH_XSTACK_I_ONE + ?PUSH_XSTACK_I_TWO + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK_I 00002204 + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?PUSH_XSTACK8_X + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002211 - 00002214 (0x4 bytes), align: 0 + Segment part 1. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X_FOUR 00002211 GAP_MakeDiscoverable (gap_peridevmgr) + Hal_ProcessEvent (hal_drivers) + LL_ProcessEvent (ll) + LL_TxData (ll) + WIMU_ProcessEvent (wimu) + gapProcessRandomAddrComplete (gap_configmgr) + gapWriteAdvEnableStatus (gap_peridevmgr) + halProcessKeyInterrupt (hal_key) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002215 - 00002218 (0x4 bytes), align: 0 + Segment part 3. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X_TWO 00002215 GAPBondMgr_ProcessEvent (gapbondmgr) + GAPBondMgr_ProcessGAPMsg (gapbondmgr) + GAPRole_ProcessEvent (peripheral) + GAP_Bond (gap_linkmgr) + GATTServApp_ProcessCharCfg (gattservapp) + GATTServApp_ReadAttr (gattservapp) + GATT_FindNextAttr (gatt_server) + GATT_RegisterService (gatt_server) + LL_ProcessEvent (ll) + LL_TxData (ll) + _formatted_write (?largewr) + gapProcessConnUpdateCompleteEvt (gap_linkmgr) + gapProcessConnectionCompleteEvt (gap_linkmgr) + gapRole_ProcessGAPMsg (peripheral) + gattServApp_ProcessExecuteWriteReq (gattservapp) + gattServApp_ProcessFindByTypeValueReq (gattservapp) + gattServApp_ProcessMsg (gattservapp) + gattServApp_ProcessReadByGrpTypeReq (gattservapp) + gattServApp_ProcessReadByTypeReq (gattservapp) + gattServApp_ProcessReadMultiReq (gattservapp) + gattServerProcessMsgCB (gatt_server) + l2capProcessReq (l2cap_task) + l2capProcessRsp (l2cap_task) + llAdvEvt_TaskConnect (ll_advEndCauses) + llProcessSlaveControlProcedures (ll_slaveEndCauses) + llSetNextDataChan (ll_common) + llSetupNextSlaveEvent (ll_slaveEndCauses) + smEndPairing (sm_pairing) + smProcessOSALMsg (sm_task) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002219 - 00002241 (0x29 bytes), align: 0 + Segment part 5. Intra module refs: ?PUSH_XSTACK8_X_FOUR + ?PUSH_XSTACK8_X_TWO + ENTRY ADDRESS REF BY + ===== ======= ====== + ?PUSH_XSTACK8_X 00002219 smpResponderProcessIncoming (sm_rsppairing) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SWITCH_DENSE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002242 - 00002248 (0x7 bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_DENSE 00002242 GAPBondMgr_SetParameter (gapbondmgr) + GAPRole_SetParameter (peripheral) + gapPeriProcessHCICmdCompleteEvt (gap_peridevmgr) + ggs_ReadAttrCB (gapgattserver) + ggs_WriteAttrCB (gapgattserver) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002249 - 00002286 (0x3e bytes), align: 0 + Segment part 2. Intra module refs: ?US_SWITCH_DENSE + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002287 - 00002287 (0x1 bytes), align: 0 + Segment part 4. Intra module refs: ?US_SWITCH_DENSE + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_SWITCH_SPARSE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002288 - 00002291 (0xa bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_SPARSE 00002288 Actimetry_ReadAttrCB (actimetryservice) + Actimetry_WriteAttrCB (actimetryservice) + GATTServApp_ReadAttr (gattservapp) + devInfo_ReadAttrCB (devinfoservice) + gapProcessHCICmdCompleteEvt (gap_task) + gapProcessOSALMsg (gap_task) + gps_ReadAttrCB (gpsservice) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 00002292 - 000022D2 (0x41 bytes), align: 0 + Segment part 2. Intra module refs: ?US_SWITCH_SPARSE + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_SWITCH_SPARSE_LEAVE + 000022C4 ?US_JMP_IF_IN_RANGE (?US_JMP_IF_IN_RANGE) + ?US_JMP_IF_VALUE (?US_JMP_IF_VALUE) + ------------------------------------------------------------------------- +RCODE + Relative segment, address: CODE 000022D3 - 000022D3 (0x1 bytes), align: 0 + Segment part 4. Intra module refs: ?US_SWITCH_SPARSE + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_JMP_IF_IN_RANGE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 000022D4 - 00002312 (0x3f bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_JMP_IF_IN_RANGE 000022D4 ?US_SWITCH_SPARSE_LEAVE (?US_SWITCH_SPARSE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?US_JMP_IF_VALUE + + SEGMENTS IN THE MODULE + ====================== +RCODE + Relative segment, address: CODE 00002313 - 0000233D (0x2b bytes), align: 0 + Segment part 0. + ENTRY ADDRESS REF BY + ===== ======= ====== + ?US_JMP_IF_VALUE 00002313 ?US_SWITCH_SPARSE_LEAVE (?US_SWITCH_SPARSE) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?memset + + SEGMENTS IN THE MODULE + ====================== + 2 (was BANKED_CODE) + Relative segment, address: CODE 00017FC8 - 00017FF4 (0x2d bytes), align: 0 + Segment part 6. Intra module refs: memset::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + memset 00017FC8 + XSTACK = 00000002 ( 00000009 ) + ISTACK = 00000000 ( 00000001 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001437 - 0000143C (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + memset::?relay 00001437 HalUARTInitDMA (hal_uart) + HalUARTRxAvailDMA (hal_uart) + osal_memset (OSAL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?sprintf + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACC6 - 0001ACEF (0x2a bytes), align: 0 + Segment part 6. Intra module refs: put_c_in_string::?relay + LOCAL ADDRESS + ===== ======= + put_c_in_string 0001ACC6 + is indirectly called + ISTACK = 00000000 ( 00000003 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001ACF0 - 0001AD5C (0x6d bytes), align: 0 + Segment part 8. Intra module refs: sprintf::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + sprintf 0001ACF0 + calls direct + XSTACK = 00000000 ( 00000012 ) + ------------------------------------------------------------------------- + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001AD5D - 0001AD65 (0x9 bytes), align: 0 + Segment part 10. Intra module refs: put_c_in_string + sprintf + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000143D - 00001442 (0x6 bytes), align: 0 + Segment part 7. Intra module refs: sprintf + LOCAL ADDRESS + ===== ======= + put_c_in_string::?relay + 0000143D + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001443 - 00001448 (0x6 bytes), align: 0 + Segment part 9. + ENTRY ADDRESS REF BY + ===== ======= ====== + sprintf::?relay 00001443 WIMU_updateProfileSensors (wimu) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?strlen + + SEGMENTS IN THE MODULE + ====================== + 3 (was BANKED_CODE) + Relative segment, address: CODE 0001B0BC - 0001B0D9 (0x1e bytes), align: 0 + Segment part 6. Intra module refs: strlen::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + strlen 0001B0BC + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001449 - 0000144E (0x6 bytes), align: 0 + Segment part 7. + ENTRY ADDRESS REF BY + ===== ======= ====== + strlen::?relay 00001449 osal_strlen (OSAL) + + ------------------------------------------------------------------------- + LIBRARY MODULE, NAME : ?largewr + + SEGMENTS IN THE MODULE + ====================== + 1 (was BANKED_CODE) + Relative segment, address: CODE 00008FE5 - 00009460 (0x47c bytes), align: 0 + Segment part 34. Intra module refs: float_conversion::?relay + LOCAL ADDRESS + ===== ======= + float_conversion 00008FE5 + XSTACK = 00000066 ( 00000013 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009461 - 00009468 (0x8 bytes), align: 0 + Segment part 36. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009469 - 00009475 (0xd bytes), align: 0 + Segment part 37. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009476 - 0000947B (0x6 bytes), align: 0 + Segment part 38. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000947C - 00009482 (0x7 bytes), align: 0 + Segment part 39. Intra module refs: Segment part 38 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009483 - 00009490 (0xe bytes), align: 0 + Segment part 40. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009491 - 0000949C (0xc bytes), align: 0 + Segment part 41. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000949D - 000094A8 (0xc bytes), align: 0 + Segment part 42. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094A9 - 000094AE (0x6 bytes), align: 0 + Segment part 43. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094AF - 000094B9 (0xb bytes), align: 0 + Segment part 44. Intra module refs: Segment part 43 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094BA - 000094BC (0x3 bytes), align: 0 + Segment part 45. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094BD - 000094C3 (0x7 bytes), align: 0 + Segment part 46. Intra module refs: Segment part 45 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094C4 - 000094CD (0xa bytes), align: 0 + Segment part 47. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094CE - 000094D1 (0x4 bytes), align: 0 + Segment part 48. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094D2 - 000094D2 (0x1 bytes), align: 0 + Segment part 49. Intra module refs: Segment part 48 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094D3 - 000094D8 (0x6 bytes), align: 0 + Segment part 50. Intra module refs: Segment part 49 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094D9 - 000094DE (0x6 bytes), align: 0 + Segment part 51. Intra module refs: Segment part 50 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094DF - 000094E0 (0x2 bytes), align: 0 + Segment part 52. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094E1 - 000094E4 (0x4 bytes), align: 0 + Segment part 53. Intra module refs: Segment part 52 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094E5 - 000094EB (0x7 bytes), align: 0 + Segment part 54. Intra module refs: Segment part 53 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094EC - 000094F1 (0x6 bytes), align: 0 + Segment part 55. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094F2 - 000094F5 (0x4 bytes), align: 0 + Segment part 56. Intra module refs: Segment part 55 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094F6 - 000094F9 (0x4 bytes), align: 0 + Segment part 57. Intra module refs: Segment part 113 + Segment part 56 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 000094FA - 00009502 (0x9 bytes), align: 0 + Segment part 58. Intra module refs: Segment part 104 + Segment part 57 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009503 - 00009EB0 (0x9ae bytes), align: 0 + Segment part 59. Intra module refs: _formatted_write::?relay + ENTRY ADDRESS REF BY + ===== ======= ====== + _formatted_write 00009503 + calls direct + XSTACK = 00000004 ( 00000066 ) + ISTACK = 00000000 ( 00000002 ) + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EB1 - 00009EB2 (0x2 bytes), align: 0 + Segment part 61. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EB3 - 00009EBA (0x8 bytes), align: 0 + Segment part 62. Intra module refs: Segment part 61 + _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EBB - 00009EC3 (0x9 bytes), align: 0 + Segment part 63. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EC4 - 00009ED1 (0xe bytes), align: 0 + Segment part 64. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009ED2 - 00009ED5 (0x4 bytes), align: 0 + Segment part 65. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009ED6 - 00009EDA (0x5 bytes), align: 0 + Segment part 66. Intra module refs: Segment part 65 + Segment part 76 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EDB - 00009EE3 (0x9 bytes), align: 0 + Segment part 67. Intra module refs: Segment part 66 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EE4 - 00009EE8 (0x5 bytes), align: 0 + Segment part 68. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EE9 - 00009EF1 (0x9 bytes), align: 0 + Segment part 69. Intra module refs: Segment part 68 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EF2 - 00009EF7 (0x6 bytes), align: 0 + Segment part 70. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009EF8 - 00009F01 (0xa bytes), align: 0 + Segment part 71. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F02 - 00009F05 (0x4 bytes), align: 0 + Segment part 72. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F06 - 00009F0A (0x5 bytes), align: 0 + Segment part 73. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F0B - 00009F13 (0x9 bytes), align: 0 + Segment part 74. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F14 - 00009F1A (0x7 bytes), align: 0 + Segment part 75. Intra module refs: Segment part 74 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F1B - 00009F20 (0x6 bytes), align: 0 + Segment part 76. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F21 - 00009F24 (0x4 bytes), align: 0 + Segment part 77. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F25 - 00009F25 (0x1 bytes), align: 0 + Segment part 78. Intra module refs: Segment part 77 + Segment part 80 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F26 - 00009F2D (0x8 bytes), align: 0 + Segment part 79. Intra module refs: Segment part 78 + Segment part 96 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F2E - 00009F34 (0x7 bytes), align: 0 + Segment part 80. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F35 - 00009F3A (0x6 bytes), align: 0 + Segment part 81. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F3B - 00009F3E (0x4 bytes), align: 0 + Segment part 82. Intra module refs: Segment part 81 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F3F - 00009F43 (0x5 bytes), align: 0 + Segment part 83. Intra module refs: Segment part 82 + Segment part 84 + Segment part 96 + Segment part 97 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F44 - 00009F49 (0x6 bytes), align: 0 + Segment part 84. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F4A - 00009F53 (0xa bytes), align: 0 + Segment part 85. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F54 - 00009F56 (0x3 bytes), align: 0 + Segment part 86. Intra module refs: Segment part 98 + Segment part 99 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F57 - 00009F5C (0x6 bytes), align: 0 + Segment part 87. Intra module refs: Segment part 40 + Segment part 72 + Segment part 73 + Segment part 85 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F5D - 00009F65 (0x9 bytes), align: 0 + Segment part 88. Intra module refs: Segment part 83 + Segment part 86 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F66 - 00009F66 (0x1 bytes), align: 0 + Segment part 89. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F67 - 00009F6E (0x8 bytes), align: 0 + Segment part 90. Intra module refs: Segment part 89 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F6F - 00009F72 (0x4 bytes), align: 0 + Segment part 91. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F73 - 00009F7B (0x9 bytes), align: 0 + Segment part 92. Intra module refs: Segment part 106 + Segment part 91 + Segment part 94 + Segment part 95 + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F7C - 00009F81 (0x6 bytes), align: 0 + Segment part 93. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F82 - 00009F86 (0x5 bytes), align: 0 + Segment part 94. Intra module refs: Segment part 93 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F87 - 00009F8E (0x8 bytes), align: 0 + Segment part 95. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F8F - 00009F95 (0x7 bytes), align: 0 + Segment part 96. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009F96 - 00009FA3 (0xe bytes), align: 0 + Segment part 97. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FA4 - 00009FAD (0xa bytes), align: 0 + Segment part 98. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FAE - 00009FB3 (0x6 bytes), align: 0 + Segment part 99. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FB4 - 00009FBB (0x8 bytes), align: 0 + Segment part 100. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FBC - 00009FC1 (0x6 bytes), align: 0 + Segment part 101. Intra module refs: Segment part 100 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FC2 - 00009FCD (0xc bytes), align: 0 + Segment part 102. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FCE - 00009FD5 (0x8 bytes), align: 0 + Segment part 103. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FD6 - 00009FDC (0x7 bytes), align: 0 + Segment part 104. Intra module refs: _formatted_write + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FDD - 00009FE9 (0xd bytes), align: 0 + Segment part 105. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FEA - 00009FEC (0x3 bytes), align: 0 + Segment part 106. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FED - 00009FF4 (0x8 bytes), align: 0 + Segment part 107. Intra module refs: Segment part 106 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 00009FF5 - 0000A001 (0xd bytes), align: 0 + Segment part 108. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A002 - 0000A009 (0x8 bytes), align: 0 + Segment part 109. Intra module refs: Segment part 108 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A00A - 0000A00F (0x6 bytes), align: 0 + Segment part 110. Intra module refs: float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A010 - 0000A012 (0x3 bytes), align: 0 + Segment part 111. Intra module refs: Segment part 110 + _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A013 - 0000A019 (0x7 bytes), align: 0 + Segment part 112. Intra module refs: Segment part 111 + float_conversion + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A01A - 0000A027 (0xe bytes), align: 0 + Segment part 113. Intra module refs: _formatted_write + ------------------------------------------------------------------------- + 1 (was BANKED_CODE) + Relative segment, address: CODE 0000A028 - 0000A033 (0xc bytes), align: 0 + Segment part 114. Intra module refs: Segment part 108 + Segment part 113 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000477 - 00000487 (0x11 bytes), align: 0 + Segment part 7. Intra module refs: Segment part 6 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000488 - 00000496 (0xf bytes), align: 0 + Segment part 9. Intra module refs: Segment part 8 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 00000497 - 0000049A (0x4 bytes), align: 0 + Segment part 11. Intra module refs: Segment part 10 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000049B - 0000049E (0x4 bytes), align: 0 + Segment part 13. Intra module refs: __Constant_7f800000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 0000049F - 000004A2 (0x4 bytes), align: 0 + Segment part 15. Intra module refs: __Constant_3f800000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004A3 - 000004A6 (0x4 bytes), align: 0 + Segment part 19. Intra module refs: __Constant_501502f9 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004A7 - 000004AA (0x4 bytes), align: 0 + Segment part 21. Intra module refs: __Constant_51ba43b7 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004AB - 000004AE (0x4 bytes), align: 0 + Segment part 23. Intra module refs: __Constant_41200000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004AF - 000004B2 (0x4 bytes), align: 0 + Segment part 25. Intra module refs: __Constant_2edbe700 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004B3 - 000004B6 (0x4 bytes), align: 0 + Segment part 27. Intra module refs: __Constant_40a00000 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004B7 - 000004BA (0x4 bytes), align: 0 + Segment part 29. Intra module refs: __Constant_10 + ------------------------------------------------------------------------- +XDATA_ID + Relative segment, address: CODE 000004BB - 000004BE (0x4 bytes), align: 0 + Segment part 31. Intra module refs: __Constant_8 + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 0000144F - 00001454 (0x6 bytes), align: 0 + Segment part 35. Intra module refs: _formatted_write + LOCAL ADDRESS + ===== ======= + float_conversion::?relay + 0000144F + ------------------------------------------------------------------------- +BANK_RELAYS + Relative segment, address: CODE 00001455 - 0000145A (0x6 bytes), align: 0 + Segment part 60. + ENTRY ADDRESS REF BY + ===== ======= ====== + _formatted_write::?relay + 00001455 sprintf (?sprintf) + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001005 - 00001015 (0x11 bytes), align: 0 + Segment part 6. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001016 - 00001024 (0xf bytes), align: 0 + Segment part 8. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001025 - 00001028 (0x4 bytes), align: 0 + Segment part 10. Intra module refs: _formatted_write + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001029 - 0000102C (0x4 bytes), align: 0 + Segment part 12. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_7f800000 00001029 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000102D - 00001030 (0x4 bytes), align: 0 + Segment part 14. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_3f800000 0000102D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001031 - 00001034 (0x4 bytes), align: 0 + Segment part 18. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_501502f9 00001031 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001035 - 00001038 (0x4 bytes), align: 0 + Segment part 20. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_51ba43b7 00001035 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001039 - 0000103C (0x4 bytes), align: 0 + Segment part 22. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_41200000 00001039 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 0000103D - 00001040 (0x4 bytes), align: 0 + Segment part 24. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_2edbe700 0000103D + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001041 - 00001044 (0x4 bytes), align: 0 + Segment part 26. Intra module refs: float_conversion + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_40a00000 00001041 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001045 - 00001048 (0x4 bytes), align: 0 + Segment part 28. Intra module refs: _formatted_write + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_10 00001045 + ------------------------------------------------------------------------- +XDATA_I + Relative segment, address: XDATA 00001049 - 0000104C (0x4 bytes), align: 0 + Segment part 30. Intra module refs: _formatted_write + ENTRY ADDRESS REF BY + ===== ======= ====== + __Constant_8 00001049 + + + + + **************************************** + * * + * MODULE SUMMARY * + * * + **************************************** + +Module CODE DATA XDATA IDATA BIT CONST +------ ---- ---- ----- ----- --- ----- + (Rel) (Rel) (Abs) (Rel) (Rel) (Rel) (Rel) +?ADD_XSTACK_DISP8 27 +?ALLOC_XSTACK8 22 +?BANKED_CODE_SUPPORT 30 +?BANKED_ENTER_XDATA 108 +?BANKED_LEAVE_XDATA 70 +?CALL_IND 2 +?DEALLOC_XSTACK8 26 +?FLT_ADD 572 +?FLT_DIV 486 +?FLT_EQ 44 +?FLT_GE 79 +?FLT_LT 76 +?FLT_MUL 384 +?FLT_TEST_INF 21 +?FLT_TEST_INF_R1 21 +?FLT_TEST_NAN 15 +?FLT_TEST_NAN_R1 15 +?FLT_TEST_ZERO 10 +?FLT_TEST_ZERO_R1 10 +?FLT_TO_L 143 +?FUNC_ENTER_XDATA 102 +?FUNC_LEAVE_XDATA 64 +?INTERRUPT_ENTER_XSP 95 +?INTERRUPT_LEAVE_XSP 88 +?L_ADD 19 +?L_ADD_TO_X 19 +?L_ADD_X 19 +?L_AND_TO_X 19 +?L_AND_X 19 +?L_EQ_X 21 +?L_MOV_TO_X 15 +?L_MOV_X 15 +?L_MUL 128 +?L_NEG 20 +?L_SHL 31 +?L_SUB 20 +?L_SUB_FROM_X 20 +?L_TO_FLT 120 +?MOVE_LONG8_XDATA_IDATA 13 +?MOVE_LONG8_XDATA_XDATA 33 +?PUSH_XSTACK8_X 49 +?PUSH_XSTACK_I 23 +?SL_GE_X 38 +?SS_SHR 16 +?S_DIV_MOD 154 +?S_SHL 19 +?UL_DIV_MOD 112 +?UL_GE_X 31 +?UL_GT 16 +?UL_GT_X 16 +?UL_SHR 25 +?US_JMP_IF_IN_RANGE 63 +?US_JMP_IF_VALUE 43 +?US_SHR 15 +?US_SWITCH_DENSE 70 +?US_SWITCH_SPARSE 76 +?XLOAD_R2345 12 +?XSTACK_DISP8 10 +?XSTORE_R2345 12 +?cexit 5 +?cmain 116 +?largewr 4 259 64 + + shared 8 +?memset 51 +?sprintf 172 +?strlen 36 +CSTARTUP 18 + + common 3 +OSAL 1 543 3 +OSAL_ClockBLE 253 10 +OSAL_Memory 521 1 003 +OSAL_PwrMgr 124 7 +OSAL_Timers 1 135 6 + + shared 4 +OSAL_WIMU 126 2 25 +OnBoard 246 2 +VIRTUAL_REGISTERS 2 8 +WIMU_Main 83 1 + + shared 1 +actimetryservice 1 311 227 17 +att_server 519 +att_util 2 788 16 +battservice 297 40 13 +devinfoservice 1 062 240 54 +gap 92 +gap_configmgr 1 385 104 + + shared 8 +gap_devmgr 239 2 +gap_linkmgr 3 877 7 + + shared 4 +gap_peridevmgr 1 893 13 4 +gap_perilinkmgr 143 +gap_task 1 020 6 +gapbondmgr 5 264 178 6 + + shared 8 +gapgattserver 1 458 134 9 +gatt_server 4 146 13 48 +gatt_task 640 5 +gatt_uuid 26 26 +gattservapp 6 848 96 9 +gpsservice 824 148 19 +hal_adc 189 4 1 + + shared 1 +hal_aes 85 + + shared 3 +hal_crc + + shared 2 +hal_dma 63 4 40 + + shared 70 2 + + common +hal_drivers 177 1 + + shared 4 +hal_flash 276 + + shared 1 +hal_key 480 3 5 + + shared 110 11 4 + + common +hal_led 22 1 +hal_sleep 25 2 + + shared 46 3 + + common +hal_startup 11 +hal_uart 1 040 7 392 + + shared 118 4 + + common +hci 1 320 5 +hci_data 1 040 34 +hci_event 3 298 9 +hci_tl 155 6 +l2cap_if 301 +l2cap_task 1 145 37 +l2cap_util 2 272 1 +linkdb 828 59 +ll 4 058 2 459 2 4 + + shared 2 16 +ll_advEndCauses 2 343 +ll_common 5 754 10 16 + + shared 8 +ll_constData 8 +ll_enc 2 617 1 44 32 +ll_errorEndCauses 9 +ll_halt 7 2 +ll_isr 599 + + shared 134 10 8 + + common +ll_math 81 6 +ll_scheduler 3 442 447 20 +ll_slaveEndCauses 4 722 4 +ll_sleep 4 + + shared 4 +ll_timer2 1 269 8 +ll_timerDrift 304 26 +osal_bufmgr 432 2 +osal_cbtimer 609 62 +osal_snv 6 292 4 4 +peripheral 3 015 152 +phy 1 430 1 +phy_image 3 582 3 582 +sm_mgr 3 601 2 16 +sm_pairing 3 885 6 25 +sm_rsppairing 2 898 6 4 +sm_task 459 1 +smp 1 959 +st_util 63 +wimu 2 242 291 15 + + shared 4 +N/A (command line) 24 788 212 +N/A (alignment) 7 3 +---------- ------- -- -- ----- --- - ----- +Total: 114 779 34 82 5 174 214 8 4 069 + + common 134 + + + **************************************** + * * + * SEGMENTS IN ADDRESS ORDER * + * * + **************************************** + + +SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN +======= ===== ============= =========== ==== ==== ===== +INTVEC CODE 00000000 - 00000085 86 com 0 +CSTART CODE 00000086 - 00000139 B4 rel 0 +BIT_ID CODE 0000013A dse 0 +DATA_ID CODE 0000013A dse 0 +BDATA_ID CODE 0000013A dse 0 +IXDATA_ID CODE 0000013A dse 0 +PDATA_ID CODE 0000013A dse 0 +IDATA_ID CODE 0000013A dse 0 +XDATA_ID CODE 0000013A - 000004BE 385 rel 0 +BANK_RELAYS CODE 000004BF - 0000145A F9C rel 0 +RCODE CODE 0000145B - 0000233D EE3 rel 0 +DIFUNCT CODE 0000233E dse 0 +CODE_C CODE 00002340 - 00002347 8 rel 2 +CODE_N CODE 00002348 dse 0 +NEAR_CODE CODE 00002348 - 00002AD6 78F rel 2 + 1 CODE 00002AD7 - 00007FFA 5524 rel 0 + 1 + CODE 00008000 - 0000FFF5 7FF6 rel 2 + 2 CODE 00010000 - 00017FF4 7FF5 rel 0 + 3 CODE 00018000 - 0001B0FC 30FD rel 0 +BLENV_ADDRESS_SPACE + CODE 0001E800 - 0001F7FF 1000 rel 0 +REGISTERS DATA 00000000 - 00000007 8 rel 0 +VREG DATA 00000008 - 00000017 10 rel 0 +PSP DATA 00000018 dse 0 +XSP DATA 00000018 - 00000019 2 rel 0 +DATA_I DATA 0000001A dse 0 +BREG BIT 00000020.0 - 00000020.7 8 rel 0 +DATA_Z DATA 00000021 - 00000028 8 rel 0 +SFR_AN DATA 00000080 - 00000080 1 rel 0 + DATA 00000087 - 0000008D 7 + DATA 00000090 - 00000091 2 + DATA 00000094 - 00000097 4 + DATA 0000009A - 000000A9 10 + DATA 000000AB - 000000AF 5 + DATA 000000B3 - 000000B4 2 + DATA 000000B6 - 000000B6 1 + DATA 000000B8 - 000000C0 9 + DATA 000000C3 - 000000C3 1 + DATA 000000C6 - 000000C7 2 + DATA 000000D1 - 000000D7 7 + DATA 000000D9 - 000000DB 3 + DATA 000000E1 - 000000E5 5 + DATA 000000E8 - 000000E9 2 + DATA 000000F1 - 000000F2 2 + DATA 000000F2 - 000000F5 4 + DATA 000000F7 - 000000FF 9 +XSTACK XDATA 00000001 - 00000314 314 rel 0 +XDATA_Z XDATA 00000315 - 00000CC7 9B3 rel 0 +XDATA_I XDATA 00000CC8 - 0000104C 385 rel 0 + 1 XDATA 0000104D - 00001436 3EA rel 0 + 1 CONST 00008000 - 00008FE4 FE5 rel 2 +IDATA_I IDATA 00000029 dse 0 +IDATA_Z IDATA 00000029 - 0000002A 2 rel 0 +ISTACK IDATA 0000002C - 000000FF D4 rel 0 + + **************************************** + * * + * END OF CROSS REFERENCE * + * * + **************************************** + + 114 913 bytes of CODE memory + 34 bytes of DATA memory (+ 82 absolute ) + 5 174 bytes of XDATA memory + 214 bytes of IDATA memory + 8 bits of BIT memory + 4 069 bytes of CONST memory + +Errors: none +Warnings: none + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_Main.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_Main.i new file mode 100644 index 0000000..2960201 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/WIMU_Main.i @@ -0,0 +1,3186 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +/************************************************************************************************** + Filename: WIMU_Main.c + + Description: This file contains the main and callback functions for + the WIMU sample application. + +**************************************************************************************************/ + +/************************************************************************************************** + * Includes + **************************************************************************************************/ +/* Hal Drivers */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 14 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 15 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" +/************************************************************************************************** + Filename: hal_timer.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + + + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ +/* Timer ID definitions */ + + + + + + +/* Operation Modes for timer */ + + + + +/* Timer1 channels */ + + + + + + +/* Channel definitions */ +#line 95 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 0 Channel compare mode definitions */ +#line 103 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 1-5 channel compare mode definitions */ + + + + + // compare, clear on 0. + + // on compare, set on 0 + + + + + +/* Timer 1 Capture mode */ + + + + + + +/* Channel mode definitions */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Error Code */ +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 16bit timer1 and timer3 */ +#line 150 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer0 and timer2 */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer2 */ +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +typedef void (*halTimerCBack_t) (uint8 timerId, uint8 channel, uint8 channelMode); + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/* + * Initialize Timer Service + */ +extern void HalTimerInit ( void ); + +/* + * Configure channel in different modes + */ +extern uint8 HalTimerConfig ( uint8 timerId, + uint8 opMode, + uint8 channel, + uint8 channelMode, + bool intEnable, + halTimerCBack_t cback ); + +/* + * Start a Timer + */ +extern uint8 HalTimerStart ( uint8 timerId, uint32 timePerTick ); + +/* + * Stop a Timer + */ +extern uint8 HalTimerStop ( uint8 timerId ); + + +/* + * This is used for polling, provide the tick increment + */ +extern void HalTimerTick ( void ); + +/* + * Enable and disable particular timer + */ +extern uint8 HalTimerInterruptEnable (uint8 timerId, uint8 channelMode, bool enable); + +/* + * Configures timer 1 to control 4 PWM outputs + */ +void HalTimer1Init (halTimerCBack_t cBack); + + +/* + * Set dutycycle on timer 1 PWM output channel + */ +void halTimer1SetChannelDuty (uint8 channel, uint16 promill); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 16 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 17 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 18 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" + +/* OSAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 21 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_PwrMgr.h" +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ + + + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 23 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_snv.h" +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + + + + + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +extern uint8 osal_snv_compact( uint8 threshold ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 24 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 25 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\WIMU_Main.c" + +/************************************************************************************************** + * FUNCTIONS + **************************************************************************************************/ + +/* This callback is triggered when a key is pressed */ +//void MSA_Main_KeyCallback(uint8 keys, uint8 state); + +/************************************************************************************************** + * @fn main + * + * @brief Start of application. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +int main(void) +{ + /* Initialize hardware */ + { { SLEEPCMD &= ~(1 << (2)); while (!(SLEEPSTA & (1 << (6)))); }; { CLKCONCMD = (CLKCONCMD & 0x80) | ((1 << 0) | (1 << 3) | (1 << (6))); while ( (CLKCONSTA & ~0x80) != ((1 << 0) | (1 << 3) | (1 << (6))) ); }; { CLKCONCMD = (CLKCONCMD & ~0x80) | 0x00; while ( (CLKCONSTA & 0x80) != 0x00 ); }; { CLKCONCMD = (CLKCONCMD & 0x80) | (0); while ( (CLKCONSTA & ~0x80) != (0) ); }; { SLEEPCMD |= (1 << (2)); }; do { ((unsigned char volatile __xdata *) 0)[0x6270] = 0x08; } while (46 == -1); }; + + // Initialize board I/O + InitBoard( 0 ); + + /* Initialze the HAL driver */ + HalDriverInit(); + + /* Initialize NV system */ + osal_snv_init(); + + /* Initialize LL */ + + /* Initialize the operating system */ + osal_init_system(); + + /* Enable interrupts */ + do { EA = 1; } while (63 == -1); + + // Final board initialization + InitBoard( 2 ); + + + + + + /* Start OSAL */ + osal_start_system(); // No Return from here + + return 0; +} + +/************************************************************************************************** + CALL-BACKS +**************************************************************************************************/ + + +/************************************************************************************************* +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/actimetryservice.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/actimetryservice.i new file mode 100644 index 0000000..3d9f949 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/actimetryservice.i @@ -0,0 +1,6333 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +/************************************************************************************************** + Filename: actimetryservice.c + + Description: Actimetry Service (based on Sensor Profile) + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 12 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 13 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 14 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 15 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 16 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.h" +/************************************************************************************************** + Filename: actimetryservice.h + + Description: Actimetry service definitions and prototypes. Based on + Gyroscope service from Sensors profile. + + The service consists of one characteristic which stores + the 20-byte value defined by specification. It allows + to send this data via notifications or read it directly. + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// If uncommented 128 bit UUIDs are used +//#define WIMU_LONG_UUIDS +/* + 128 bit Version 1 UUIDs generated on http://www.uuidgenerator.net/ + Macro as in Components\ble\include\bcomdef.h +*/ +#line 42 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.h" + +// Service UUIDs + + + + + + +// Profile Parameters + + + + + +// Actimetry control flags + + +// Sensor Profile Services bit fields + + +// Length of sensor data in bytes + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*actimetryChange_t)( uint8 paramID ); + +typedef struct +{ + actimetryChange_t pfnActimetryChange; // Called when characteristic value changes +} actimetryCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Actimetry_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Actimetry_AddService( uint32 services ); + +/* + * Actimetry_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Actimetry_RegisterAppCBs( actimetryCBs_t *appCallbacks ); + +/* + * Actimetry_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Actimetry_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 18 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\util\\WIMU\\wimu_util.h" + + + + + + + + +// WIMU sensor data packet size + + + + + + + + + + + + + + + + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags + + + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ + + + + +#line 19 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/********************************************************************* + * MACROS + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" + +// Using 16-bit UUID + + + + + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + + + +#line 20 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\ACTIMETRY\\actimetryservice.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// Actimetry Service UUID +const uint8 actimetryServUUID[2] = +{ + ((0x70ee) & 0xFF), (((0x70ee) >> 8) & 0xFF), +}; + +// Actimetry Characteristic value Imu UUID +const uint8 actimetryImuUUID[2] = +{ + ((0x7486) & 0xFF), (((0x7486) >> 8) & 0xFF), +}; + +// Actimetry Characteristic value Quaternion UUID +const uint8 actimetryQuaternionUUID[2] = +{ + ((0X759d) & 0xFF), (((0X759d) >> 8) & 0xFF), +}; + +// Actimetry Characteristic value Configuration UUID +const uint8 actimetryCfgUUID[2] = +{ + ((0x76ac) & 0xFF), (((0x76ac) >> 8) & 0xFF), +}; + +// Actimetry Characteristic value Control UUID, used to start/stop recordings +const uint8 actimetryControlUUID[2] = +{ + ((0x76ad) & 0xFF), (((0x76ad) >> 8) & 0xFF), +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static actimetryCBs_t *Actimetry_AppCBs = 0; + +/********************************************************************* + * Profile Attributes - variables + */ + + +// Actimetry Profile Service attribute +static const gattAttrType_t actimetryService = { 2, actimetryServUUID }; + +// Accelerometer Characteristic Properties +static uint8 actimetryImuProps = 0x02 | 0x10; + +static uint8 actimetryImu[sizeof(WIMU_actimetry_imu_packet_t)] = {0};//{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14};//{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Actimetry Characteristic Configuration +static gattCharCfg_t actimetryImuConfig[( 3 + 1 )]; + +// Actimetry Characteristic User Description +static uint8 actimetryImuUserDesp[19] = "Actimetry IMU Data\0"; + +// Accelerometer Characteristic Properties +static uint8 actimetryQuaternionProps = 0x02 | 0x10; + +static uint8 actimetryQuaternion[sizeof(WIMU_actimetry_quaternion_packet_t)] = { 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0}; + +// Actimetry Characteristic Configuration +static gattCharCfg_t actimetryQuaternionConfig[( 3 + 1 )]; + +// Actimetry Characteristic User Description +static uint8 actimetryQuaternionUserDesp[26] = "Actimetry Quaternion Data\0"; + +// Actimetry Characteristic Configuration Properties +static uint8 actimetryCfgProps = 0x02 | 0x08 | 0x10; + +// Actimetry Characteristic Configuration Value +static uint8 actimetryCfg[sizeof(IMU_Config_t)]; + +static gattCharCfg_t actimetryCfgConfig[( 3 + 1 )]; + +// Actimetry Characteristic Configuration User Description +static uint8 actimetryCfgUserDesp[17] = "Actimetry Config\0"; + + +// Actimetry Characteristic Configuration Value +static uint8 actimetryControl[sizeof(RemControl_t)]; + +static gattCharCfg_t actimetryControlConfig[( 3 + 1 )]; + + +// Actimetry Characteristic Configuration User Description +static uint8 actimetryControlUserDesp[18] = "Actimetry Control\0"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t sensorActimetryAttrTbl[] = +{ + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&actimetryService /* pValue */ + }, + + // Characteristic Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &actimetryImuProps + }, + + // Characteristic Value "Imu Data" + { + { 2, actimetryImuUUID }, + 0x01, + 0, + actimetryImu + }, + + // Characteristic configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)actimetryImuConfig + }, + + // Characteristic User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + actimetryImuUserDesp + }, + + // Characteristic Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &actimetryQuaternionProps + }, + // Characteristic Value "Quaternion Data" + { + { 2, actimetryQuaternionUUID }, + 0x01, + 0, + actimetryQuaternion + }, + + // Characteristic configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)actimetryQuaternionConfig + }, + + // Characteristic User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + actimetryQuaternionUserDesp + }, + // Characteristic 2 Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &actimetryCfgProps + }, + + // Characteristic Value "Configuration" + { + { 2, actimetryCfgUUID }, + 0x01/* | GATT_PERMIT_WRITE*/, + 0, + actimetryCfg + }, + // Characteristic configuration + { + { 2, clientCharCfgUUID }, + 0x01/* | GATT_PERMIT_WRITE*/, + 0, + (uint8 *)actimetryCfgConfig + }, + // Characteristic User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + actimetryCfgUserDesp + }, + + // Characteristic Value "Control" + { + { 2, actimetryControlUUID }, + 0x01 | 0x02, + 0, + actimetryControl + }, + // Characteristic configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)actimetryControlConfig + }, + // Characteristic User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + actimetryControlUserDesp + }, +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 Actimetry_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t Actimetry_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +static void Actimetry_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +const gattServiceCBs_t actimetryCBs = +{ + Actimetry_ReadAttrCB, // Read callback function pointer + Actimetry_WriteAttrCB, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Actimetry_AddService + * + * @brief Initializes the Sensor Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Actimetry_AddService( uint32 services ) +{ + uint8 status = 0x00; + + // Register with Link DB to receive link status change callback + (void) linkDB_Register( Actimetry_HandleConnStatusCB ); + + if (services & 0x00000020 ) + { + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( sensorActimetryAttrTbl, + ( sizeof( sensorActimetryAttrTbl ) / sizeof( gattAttribute_t ) ), + &actimetryCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn Actimetry_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ + +bStatus_t Actimetry_RegisterAppCBs( actimetryCBs_t *appCallbacks ) +{ + if ( Actimetry_AppCBs == 0 ) + { + if ( appCallbacks != 0 ) + { + Actimetry_AppCBs = appCallbacks; + } + + return ( 0x00 ); + } + + return ( 0x11 ); +} + +/********************************************************************* + * @fn Actimetry_SetParameter + * + * @brief Set a Sensor Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Actimetry_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 12: + if ( len == sizeof(WIMU_actimetry_imu_packet_t) ) + { + (void) osal_memcpy( actimetryImu, value, sizeof(WIMU_actimetry_imu_packet_t) ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryImuConfig, actimetryImu, 0, + sensorActimetryAttrTbl, ( sizeof( sensorActimetryAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + case 13: + if ( len == sizeof(WIMU_actimetry_quaternion_packet_t) ) + { + (void) osal_memcpy( actimetryQuaternion, value, sizeof(WIMU_actimetry_quaternion_packet_t) ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryQuaternionConfig, actimetryQuaternion, 0, + sensorActimetryAttrTbl, ( sizeof( sensorActimetryAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + case 14: + if(len == sizeof ( IMU_Config_t ) ) + { +// actimetryCfg = *((uint8*)value); + osal_memcpy( actimetryCfg, value, len ); + + } + else + { + ret = 0x18; + } + break; + + case 15: + if(len == sizeof ( RemControl_t ) ) + { + //actimetryControl = *((uint8*)value); + osal_memcpy( actimetryControl, value, len); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( actimetryControlConfig, actimetryControl, 0, + sensorActimetryAttrTbl, ( sizeof( sensorActimetryAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + + } + else + { + ret = 0x18; + } + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Actimetry_GetParameter + * + * @brief Get a Actimetry Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Actimetry_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + + switch ( param ) + { + case 12: + (void) osal_memcpy (value, actimetryImu, sizeof(WIMU_actimetry_imu_packet_t) ); + break; + + case 13: + (void) osal_memcpy (value, actimetryQuaternion, sizeof(WIMU_actimetry_quaternion_packet_t) ); + break; + + case 14: + //*((uint8*)value) = actimetryCfg; + (void) osal_memcpy (value, actimetryCfg, sizeof(IMU_Config_t) ); + break; + + case 15: + //*((uint8*)value) = actimetryControl; + osal_memcpy (value, actimetryControl, sizeof(RemControl_t) ); + break; + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Actimetry_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 Actimetry_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + uint16 uuid; + bStatus_t status = 0x00; + + // If attribute permissions require authorization to read, return error + if ( ( (pAttr->permissions) & 0x10 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( 0x0b ); + } + + if (utilExtractUuid16(pAttr,&uuid) == 0x01) { + // Invalid handle + *pLen = 0; + return 0x01; + } + + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + case 0x7486: + *pLen = sizeof(WIMU_actimetry_imu_packet_t); + (void) osal_memcpy( pValue, pAttr->pValue, sizeof(WIMU_actimetry_imu_packet_t) ); + break; + + case 0X759d: + *pLen = sizeof(WIMU_actimetry_quaternion_packet_t); + (void) osal_memcpy( pValue, pAttr->pValue, sizeof(WIMU_actimetry_quaternion_packet_t) ); + break; + + case 0x76ac: + *pLen = sizeof(IMU_Config_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(IMU_Config_t) ); + break; + + case 0x76ad: + //*pLen = 1; + //pValue[0] = *pAttr->pValue; + *pLen = sizeof(RemControl_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(RemControl_t) ); + break; + + default: + *pLen = 0; + status = 0x0a; + break; + } + + return ( status ); +} + +/********************************************************************* +* @fn Actimetry_WriteAttrCB +* +* @brief Validate attribute data prior to a write operation +* +* @param connHandle - connection message was received on +* @param pAttr - pointer to attribute +* @param pValue - pointer to data to be written +* @param len - length of data +* @param offset - offset of the first octet to be written +* @param complete - whether this is the last packet +* @param oper - whether to validate and/or write attribute value +* +* @return Success or Failure +*/ +static bStatus_t Actimetry_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = 0x00; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( ( (pAttr->permissions) & 0x20 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + if (utilExtractUuid16(pAttr,&uuid) == 0x01) { + // Invalid handle + return 0x01; + } + + switch ( uuid ) + { + case 0x7486: + //Should not get here + break; + + case 0X759d: + //Should not get here + break; + + case 0x76ac: + // Not done yet. + + //Validate the value + // Make sure it's not a blob oper + /*if ( offset == 0 ) + { + if ( len != 1 ) + { + status = ATT_ERR_INVALID_VALUE_SIZE; + } + } + else + { + status = ATT_ERR_ATTR_NOT_LONG; + } + + //Write the value + if ( status == SUCCESS ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &actimetryCfg ) + { + notifyApp = ACTIMETRY_CONF; + } + }*/ + break; + + case 0x76ad: + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != sizeof(RemControl_t) ) + { + status = 0x0d; + } + } + else + { + status = 0x0b; + } + + //Write the value + if ( status == 0x00 ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + *pCurValue = pValue[0]; + + osal_set_event(/*WIMU_TaskID*/10, 0x0008); + + if( pAttr->pValue == (uint8*)(&actimetryControl) ) + { + notifyApp = 15; + } + } + break; + + case 0x2902: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, 0x0001 ); + break; + + default: + // Should never get here! + status = 0x0a; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && Actimetry_AppCBs && Actimetry_AppCBs->pfnActimetryChange ) + { + Actimetry_AppCBs->pfnActimetryChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Actimetry_HandleConnStatusCB + * + * @brief Sensor Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void Actimetry_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != 0xFFFE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == 1 ) || + ( ( changeType == 2 ) && + ( !linkDB_State( (connHandle), 0x01 ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, actimetryImuConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryQuaternionConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryCfgConfig ); + GATTServApp_InitCharCfg( connHandle, actimetryControlConfig ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/battservice.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/battservice.i new file mode 100644 index 0000000..4727d33 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/battservice.i @@ -0,0 +1,7444 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +/************************************************************************************************** + Filename: battservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service. + + Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 43 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hid_uuid.h" +/************************************************************************************************** + Filename: hid_uuid.h + Revised: $Date: 2012-01-26 13:42:33 -0800 (Thu, 26 Jan 2012) $ + Revision: $Revision: 64 $ + + Description: This file contains UUIDs for the HID service. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/* HID service */ + + +/* HID characteristics */ +#line 63 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hid_uuid.h" + +/* HID information flags */ + + + +/* Control point commands */ + + + +/* HID protocol mode values */ + + + +/* Attribute value lengths */ + + + + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" +/************************************************************************************************** + Filename: hiddev.h + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the common HID Device profile. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// HID Device Parameters + + +// HID read/write operation + + + + + +// HID callback events + + + + + +/* HID Report type */ + + + + +// HID Keyboard/Keypad Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#line 189 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + + + + + +// HID Consumer Usage IDs (subset of the codes available in the USB HID Usage Tables spec) + + + + +#line 208 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +#line 232 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +/********************************************************************* + * TYPEDEFS + */ + +// HID report mapping table +typedef struct +{ + uint16 handle; // Handle of report characteristic + uint16 cccdHandle; // Handle of CCCD for report characteristic + uint8 id; // Report ID + uint8 type; // Report type + uint8 mode; // Protocol mode (report or boot) +} hidRptMap_t; + +// HID dev configuration structure +typedef struct +{ + uint32 idleTimeout; // Idle timeout in milliseconds + uint8 hidFlags; // HID feature flags + +} hidDevCfg_t; + +/********************************************************************* + * Global Variables + */ + +// These variables are defined in the service .c file that uses HID Dev + +// HID report map length +extern uint8 hidReportMapLen; + +// HID protocol mode +extern uint8 hidProtocolMode; + +/********************************************************************* + * Profile Callbacks + */ + +// HID Report callback +typedef uint8 (*hidDevReportCB_t)( uint8 id, uint8 type, uint16 uuid, + uint8 oper, uint8 *pLen, uint8 *pData ); + +// HID event callback +typedef void (*hidDevEvtCB_t)( uint8 evt ); + +// HID passcode callback +typedef void (*hidDevPasscodeCB_t)( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); + +typedef struct +{ + hidDevReportCB_t reportCB; + hidDevEvtCB_t evtCB; + hidDevPasscodeCB_t passcodeCB; +} hidDevCB_t; + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +extern void HidDev_Init( uint8 task_id ); + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pCBs - Callback function. + * + * @return None. + */ +extern void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ); + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +extern void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ); + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +extern void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8 *pData ); + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +extern void HidDev_Close( void ); + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_GetParameter( uint8 param, void *pValue ); + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +extern void HidDev_PasscodeRsp( uint8 status, uint32 passcode ); + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.h" +/************************************************************************************************** + Filename: battservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service definitions and + prototypes. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Battery Service UUIDs + + + +// Battery Service Get/Set Parameters + + +// Callback events + + + +/********************************************************************* + * TYPEDEFS + */ + +// Battery Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*batteryChange_t)( uint8 paramID ); + +typedef struct +{ + batteryChange_t pfnBatteryChange; // Called when characteristic value changes +} batteryCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Batt_AddService( void ); + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Batt_Register( batteryCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\util\\WIMU\\wimu_util.h" + + + + + + + + +// WIMU sensor data packet size + + + + + + + + + + + + + + + + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags + + + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/********************************************************************* + * MACROS + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" + +// Using 16-bit UUID + + + + + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Batt\\battservice.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// ADC voltage level + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Battery service +const uint8 battServUUID[2] = +{ + ((0x180F) & 0xFF), (((0x180F) >> 8) & 0xFF) +}; + +// Battery level characteristic +const uint8 battLevelUUID[2] = +{ + ((0x2A19) & 0xFF), (((0x2A19) >> 8) & 0xFF) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Application callback +//static battServiceCB_t battServiceCB; + +static batteryCBs_t *Battery_AppCBs = 0; + +// Measurement setup callback +//static battServiceSetupCB_t battServiceSetupCB = NULL; + +// Measurement teardown callback +//static battServiceTeardownCB_t battServiceTeardownCB = NULL; + +// Measurement calculation callback +//static battServiceCalcCB_t battServiceCalcCB = NULL; + +//static uint16 battMinLevel = BATT_ADC_LEVEL_2V; // For VDD/3 measurements +//static uint16 battMaxLevel = BATT_ADC_LEVEL_3V; // For VDD/3 measurements*/ + +// Critical battery level setting + +// ADC channel to be used for reading +//static uint8 battServiceAdcCh = HAL_ADC_CHANNEL_VDD; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Battery Service attribute +static const gattAttrType_t battService = { 2, battServUUID }; + +// Battery level characteristic +static uint8 battLevelProps = 0x02 | 0x10; +static uint8 battLevel = 0; +static gattCharCfg_t battLevelClientCharCfg[( 3 + 1 )]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t battAttrTbl[] = +{ + // Battery Service + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&battService /* pValue */ + }, + + // Battery Level Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &battLevelProps + }, + + // Battery Level Value + { + { 2, battLevelUUID }, + 0x01, + 0, + &battLevel + }, + + // Battery Level Client Characteristic Configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)battLevelClientCharCfg + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +//static void battNotifyCB( linkDBItem_t *pLinkItem ); +//static uint8 battMeasure( void ); +//static void battNotifyLevel( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Battery Service Callbacks +const gattServiceCBs_t battCBs = +{ + battReadAttrCB, // Read callback function pointer + battWriteAttrCB, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t Batt_AddService( void ) +{ + uint8 status = 0x00; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( 0xFFFF, battLevelClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( battAttrTbl, + ( sizeof( battAttrTbl ) / sizeof( gattAttribute_t ) ), + &battCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +bStatus_t Batt_Register( batteryCBs_t *appCallbacks ) +{ + if ( Battery_AppCBs == 0 ) + { + if ( appCallbacks != 0 ) + { + Battery_AppCBs = appCallbacks; + } + + return ( 0x00 ); + } + + return ( 0x11 ); +} +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + + switch ( param ) + { + case 0: + if ( len == sizeof(WIMU_battery_packet_t) ) + { + battLevel = *((uint8*)value); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( battLevelClientCharCfg, &battLevel, 0, + battAttrTbl, ( sizeof( battAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Batt_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + *((uint8*)value) = battLevel; + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn battReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ + +static uint8 battReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = 0x00; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( 0x0b ); + } + + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + + // Measure battery level if reading level + if ( uuid == 0x2A19 ) + { + *pLen = sizeof(WIMU_battery_packet_t); + (void) osal_memcpy( pValue, pAttr->pValue, sizeof(WIMU_battery_packet_t) ); + } + else + { + status = 0x0a; + } + + return ( status ); +} + +/********************************************************************* + * @fn battWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = 0x00; + + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + case 0x2902: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, 0x0001 ); + break; + + default: + status = 0x0a; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{/* + // Make sure this is not loopback connection + if ( connHandle != LOOPBACK_CONNHANDLE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == LINKDB_STATUS_UPDATE_REMOVED ) || + ( ( changeType == LINKDB_STATUS_UPDATE_STATEFLAGS ) && + ( !linkDB_Up( connHandle ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, battLevelClientCharCfg ); + } + }*/ +} + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/devinfoservice.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/devinfoservice.i new file mode 100644 index 0000000..88d65a2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/devinfoservice.i @@ -0,0 +1,6057 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +/************************************************************************************************** + Filename: devinfoservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.h" +/************************************************************************************************** + Filename: devinfoservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service definitions and + prototypes. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Device Information Service Parameters +#line 67 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.h" + +// Device Information Service UUIDs +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.h" + +// IEEE 11073 authoritative body values + + + + + +// System ID length + + + // PnP ID length + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * DevInfo_AddService- Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + */ + +extern bStatus_t DevInfo_AddService( void ); + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * DevInfo_GetParameter - Get a Device Information parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t DevInfo_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\DevInfo\\devinfoservice.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Device information service +const uint8 devInfoServUUID[2] = +{ + ((0x180A) & 0xFF), (((0x180A) >> 8) & 0xFF) +}; + +// System ID +const uint8 devInfoSystemIdUUID[2] = +{ + ((0x2A23) & 0xFF), (((0x2A23) >> 8) & 0xFF) +}; + +// Model Number String +const uint8 devInfoModelNumberUUID[2] = +{ + ((0x2A24) & 0xFF), (((0x2A24) >> 8) & 0xFF) +}; + +// Serial Number String +const uint8 devInfoSerialNumberUUID[2] = +{ + ((0x2A25) & 0xFF), (((0x2A25) >> 8) & 0xFF) +}; + +// Firmware Revision String +const uint8 devInfoFirmwareRevUUID[2] = +{ + ((0x2A26) & 0xFF), (((0x2A26) >> 8) & 0xFF) +}; + +// Hardware Revision String +const uint8 devInfoHardwareRevUUID[2] = +{ + ((0x2A27) & 0xFF), (((0x2A27) >> 8) & 0xFF) +}; + +// Software Revision String +const uint8 devInfoSoftwareRevUUID[2] = +{ + ((0x2A28) & 0xFF), (((0x2A28) >> 8) & 0xFF) +}; + +// Manufacturer Name String +const uint8 devInfoMfrNameUUID[2] = +{ + ((0x2A29) & 0xFF), (((0x2A29) >> 8) & 0xFF) +}; + +// IEEE 11073-20601 Regulatory Certification Data List +const uint8 devInfo11073CertUUID[2] = +{ + ((0x2A2A) & 0xFF), (((0x2A2A) >> 8) & 0xFF) +}; + +// PnP ID +const uint8 devInfoPnpIdUUID[2] = +{ + ((0x2A50) & 0xFF), (((0x2A50) >> 8) & 0xFF) +}; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Device Information Service attribute +static const gattAttrType_t devInfoService = { 2, devInfoServUUID }; + +// System ID characteristic +static uint8 devInfoSystemIdProps = 0x02; +static uint8 devInfoSystemId[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + +// Model Number String characteristic +static uint8 devInfoModelNumberProps = 0x02; +static const uint8 devInfoModelNumber[] = "WIMU3"; + +// Serial Number String characteristic +static uint8 devInfoSerialNumberProps = 0x02; +static uint8 devInfoSerialNumber[2] = {0, 0}; + +// Firmware Revision String characteristic +static uint8 devInfoFirmwareRevProps = 0x02; +static uint8 devInfoFirmwareRev[29] = {0}; + +// Hardware Revision String characteristic +static uint8 devInfoHardwareRevProps = 0x02; +static uint8 devInfoHardwareRev[2] = {0, 0}; + +// Software Revision String characteristic +static uint8 devInfoSoftwareRevProps = 0x02; +static uint8 devInfoSoftwareRev[29] = {0}; + +// Manufacturer Name String characteristic +static uint8 devInfoMfrNameProps = 0x02; +static const uint8 devInfoMfrName[] = "CDRV"; + +// IEEE 11073-20601 Regulatory Certification Data List characteristic +static uint8 devInfo11073CertProps = 0x02; +static const uint8 devInfo11073Cert[] = +{ + 254, // authoritative body type + 0x00, // authoritative body structure type + // authoritative body data follows below: + 'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l' +}; + +// System ID characteristic +static uint8 devInfoPnpIdProps = 0x02; +static uint8 devInfoPnpId[7] = +{ + 1, // Vendor ID source (1=Bluetooth SIG) + ((0x000D) & 0xFF), (((0x000D) >> 8) & 0xFF), // Vendor ID (Texas Instruments) + ((0x0000) & 0xFF), (((0x0000) >> 8) & 0xFF), // Product ID (vendor-specific) + ((0x0110) & 0xFF), (((0x0110) >> 8) & 0xFF) // Product version (JJ.M.N) +}; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t devInfoAttrTbl[] = +{ + // Device Information Service + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&devInfoService /* pValue */ + }, + + // System ID Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoSystemIdProps + }, + + // System ID Value + { + { 2, devInfoSystemIdUUID }, + 0x01, + 0, + (uint8 *) devInfoSystemId + }, + + // Model Number String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoModelNumberProps + }, + + // Model Number Value + { + { 2, devInfoModelNumberUUID }, + 0x01, + 0, + (uint8 *) devInfoModelNumber + }, + + // Serial Number String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoSerialNumberProps + }, + + // Serial Number Value + { + { 2, devInfoSerialNumberUUID }, + 0x01, + 0, + (uint8 *) devInfoSerialNumber + }, + + // Firmware Revision String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoFirmwareRevProps + }, + + // Firmware Revision Value + { + { 2, devInfoFirmwareRevUUID }, + 0x01, + 0, + (uint8 *) devInfoFirmwareRev + }, + + // Hardware Revision String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoHardwareRevProps + }, + + // Hardware Revision Value + { + { 2, devInfoHardwareRevUUID }, + 0x01, + 0, + (uint8 *) devInfoHardwareRev + }, + + // Software Revision String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoSoftwareRevProps + }, + + // Software Revision Value + { + { 2, devInfoSoftwareRevUUID }, + 0x01, + 0, + (uint8 *) devInfoSoftwareRev + }, + + // Manufacturer Name String Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoMfrNameProps + }, + + // Manufacturer Name Value + { + { 2, devInfoMfrNameUUID }, + 0x01, + 0, + (uint8 *) devInfoMfrName + }, + + // IEEE 11073-20601 Regulatory Certification Data List Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfo11073CertProps + }, + + // IEEE 11073-20601 Regulatory Certification Data List Value + { + { 2, devInfo11073CertUUID }, + 0x01, + 0, + (uint8 *) devInfo11073Cert + }, + + // PnP ID Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &devInfoPnpIdProps + }, + + // PnP ID Value + { + { 2, devInfoPnpIdUUID }, + 0x01, + 0, + (uint8 *) devInfoPnpId + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Device Info Service Callbacks +const gattServiceCBs_t devInfoCBs = +{ + devInfo_ReadAttrCB, // Read callback function pointer + 0, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn DevInfo_AddService + * + * @brief Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t DevInfo_AddService( void ) +{ + // Register GATT attribute list and CBs with GATT Server App + return GATTServApp_RegisterService( devInfoAttrTbl, + ( sizeof( devInfoAttrTbl ) / sizeof( gattAttribute_t ) ), + &devInfoCBs ); +} + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to write + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + + switch ( param ) + { + case 0: + osal_memcpy(devInfoSystemId, value, len); + break; + + case 2: + osal_memcpy(devInfoSerialNumber, value, len); + break; + + case 3: + osal_memcpy(devInfoFirmwareRev, value, len); + break; + + case 4: + osal_memcpy(&devInfoHardwareRev, value, len); + break; + + case 5: + osal_memcpy(devInfoSoftwareRev, value, len); + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn DevInfo_GetParameter + * + * @brief Get a Device Information parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + + switch ( param ) + { + case 0: + osal_memcpy(value, devInfoSystemId, sizeof(devInfoSystemId)); + break; + + case 1: + osal_memcpy(value, devInfoModelNumber, sizeof(devInfoModelNumber)); + break; + case 2: + osal_memcpy(value, devInfoSerialNumber, sizeof(devInfoSerialNumber)); + break; + + case 3: + osal_memcpy(value, devInfoFirmwareRev, sizeof(devInfoFirmwareRev)); + break; + + case 4: + osal_memcpy(value, &devInfoHardwareRev, sizeof(devInfoHardwareRev)); + break; + + case 5: + osal_memcpy(value, devInfoSoftwareRev, sizeof(devInfoSoftwareRev)); + break; + + case 6: + osal_memcpy(value, devInfoMfrName, sizeof(devInfoMfrName)); + break; + + case 7: + osal_memcpy(value, devInfo11073Cert, sizeof(devInfo11073Cert)); + break; + + case 8: + osal_memcpy(value, devInfoPnpId, sizeof(devInfoPnpId)); + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn devInfo_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 devInfo_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = 0x00; + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + + switch (uuid) + { + case 0x2A23: + // verify offset + if (offset >= sizeof(devInfoSystemId)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoSystemId) - offset))) ? (maxLen) : ((sizeof(devInfoSystemId) - offset))); + + // copy data + osal_memcpy(pValue, &devInfoSystemId[offset], *pLen); + } + break; + + case 0x2A24: + // verify offset + if (offset >= sizeof(devInfoModelNumber)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoModelNumber) - offset))) ? (maxLen) : ((sizeof(devInfoModelNumber) - offset))); + + // copy data + osal_memcpy(pValue, &devInfoModelNumber[offset], *pLen); + } + break; + + case 0x2A25: + // verify offset + if (offset >= sizeof(devInfoSerialNumber)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoSerialNumber) - offset))) ? (maxLen) : ((sizeof(devInfoSerialNumber) - offset))); + + // copy data + osal_memcpy(pValue, &devInfoSerialNumber[offset], *pLen); + } + break; + + case 0x2A26: + // verify offset + if (offset >= sizeof(devInfoFirmwareRev)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoFirmwareRev) - offset))) ? (maxLen) : ((sizeof(devInfoFirmwareRev) - offset))); + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case 0x2A27: + // verify offset + if (offset >= sizeof(devInfoHardwareRev)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoHardwareRev) - offset))) ? (maxLen) : ((sizeof(devInfoHardwareRev) - offset)));; + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case 0x2A28: + // verify offset + if (offset >= sizeof(devInfoSoftwareRev)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoSoftwareRev) - offset))) ? (maxLen) : ((sizeof(devInfoSoftwareRev) - offset))); + + // copy data + osal_memcpy(pValue, pAttr->pValue + offset, *pLen); + } + break; + + case 0x2A29: + // verify offset + if (offset >= sizeof(devInfoMfrName)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoMfrName) - offset))) ? (maxLen) : ((sizeof(devInfoMfrName) - offset))); + + // copy data + osal_memcpy(pValue, &devInfoMfrName[offset], *pLen); + } + break; + + case 0x2A2A: + // verify offset + if (offset >= sizeof(devInfo11073Cert)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfo11073Cert) - offset))) ? (maxLen) : ((sizeof(devInfo11073Cert) - offset))); + + // copy data + osal_memcpy(pValue, &devInfo11073Cert[offset], *pLen); + } + break; + + case 0x2A50: + // verify offset + if (offset >= sizeof(devInfoPnpId)) + { + status = 0x07; + } + else + { + // determine read length + *pLen = (((maxLen) < ((sizeof(devInfoPnpId) - offset))) ? (maxLen) : ((sizeof(devInfoPnpId) - offset))); + + // copy data + osal_memcpy(pValue, &devInfoPnpId[offset], *pLen); + } + break; + + default: + *pLen = 0; + status = 0x0a; + break; + } + + return ( status ); +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gap.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gap.i new file mode 100644 index 0000000..8044d1b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gap.i @@ -0,0 +1,2907 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" +/************************************************************************************************* + Filename: gap.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the GAP Configuration API. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 41 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 83 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 42 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * Called to setup the device. Call just once. + * + * Public function defined in gap.h. + */ +bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ) +{ + bStatus_t stat = 0x02; // Return status + + // Valid profile roles and supported combinations + switch ( profileRole ) + { + case 0x01: + + { + stat = 0x00; + } + + break; + + case 0x02: + + + + + + break; + + case 0x04: + + { + stat = 0x00; + } + + break; + + case 0x08: + + + + + + break; + + case (0x01 | 0x02): +#line 132 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" + break; + + case (0x04 | 0x02): +#line 141 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" + break; + + case (0x08 | 0x01): +#line 150 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" + break; + + // Invalid profile roles + default: + stat = 0x02; + break; + } + + if ( stat == 0x00 ) + { + // Setup the device configuration parameters + stat = GAP_ParamsInit( taskID, profileRole ); + if ( stat == 0x00 ) + { + + { + GAP_SecParamsInit( pIRK, pSRK, pSignCounter ); + } + + +#line 192 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gap.c" + + + { + // Initialize GAP Peripheral Device Manager + (void) GAP_PeriDevMgrInit(); + + + { + // Initialize SM Responder + (void) SM_ResponderInit(); + } + + } + + } + } + + return ( stat ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gapbondmgr.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gapbondmgr.i new file mode 100644 index 0000000..05c3b20 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gapbondmgr.i @@ -0,0 +1,14271 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +/************************************************************************************************** + Filename: gapbondmgr.c + Revised: $Date: 2011-02-24 15:46:53 -0800 (Thu, 24 Feb 2011) $ + Revision: $Revision: 10 $ + + Description: GAP peripheral profile manages bonded connections + + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_snv.h" +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + + + + + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +extern uint8 osal_snv_compact( uint8 threshold ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2013-05-14 12:23:59 -0700 (Tue, 14 May 2013) $ + Revision: $Revision: 34279 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2013-05-15 05:57:26 -0700 (Wed, 15 May 2013) $ + Revision: $Revision: 34287 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + +/******************************************************************************* + * MACROS + */ + +// check if connection parameter ranges for CI (min/max), SL, and LSTO are valid +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// check if the CI/SL/LSTO combination is valid +// based on: LSTO > (1 + Slave Latency) * (Connection Interval * 2) +// Note: The CI * 2 requirement based on ESR05 V1.0, Erratum 3904. +// Note: LSTO time is normalized to units of 1.25ms (i.e. 10ms = 8 * 1.25ms). + + + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// Internal + + + +// Encryption Key Request Reason Codes + + + + +// Disconnect Reason Codes +#line 161 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// Disconnect API Parameter +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#line 195 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// LL Advertiser Channels + + + + + +// LL Advertiser Events + + + + + +// LL Address Type + + + +// Advertiser White List Policy + + + + + +// Scanner White List Policy + + + +// Initiator White List Policy + + + +// Black List Control + + + +// Advertiser Commands + + + + +// LL Scan Commands + + + +// LL Scan Filtering + + + +// LL Scan Types + + + +// LL Tx Power Types + + + +// Data Fragmentation Flag + + + + +// Connection Complete Role + + + +// Encryption Related + + + +// Feature Set Related + +// + + + +// Receive Flow Control + + + +// Direct Test Mode + + +// +#line 287 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// Vendor Specific + + +// + + + + + + + + + + + + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + + +// +#line 348 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// + + + +// Packet Lengths +#line 365 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Event Parameters +*/ + +// Advertising Report Data +#line 377 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// Sleep Clock Accuracy (SCA) +#line 389 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Miscellaneous +*/ + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ 37 ]; + uint16 numCrcErr[ 37 ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + + +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); + + + + +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); + + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + + +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); + + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + + +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); + + + + +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); + + + + +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); + + + + +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); + + + + +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); + + + +#line 1215 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + +#line 1244 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); + + + + +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); + + + + +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); + + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + + +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); + + + + +/******************************************************************************* + * @fn LL_EXT_SetSlaveLatencyOverride API + * + * @brief This API is used to enable or disable the suspention of slave + * latency. This can be helpful when the Slave application knows + * it will soon receive something that needs to be handled without + * delay. + * + * input parameters + * + * @param control - LL_EXT_DISABLE_SL_OVERRIDE, + * LL_EXT_ENABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetSlaveLatencyOverride( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); + + + + +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + + +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn LL_EXT_BuildRevision Vendor Specific API + * + * @brief This API is used to to set a user revision number or read the + * build revision number. + * + * input parameters + * + * @param mode - LL_EXT_SET_USER_REVISION | + * LL_EXT_READ_BUILD_REVISION + * @param userRevNum - A 16 bit value the user can set as their own + * revision number + * + * output parameters + * + * @param buildRev - Pointer to returned build revision, if any. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_BuildRevision( uint8 mode, uint16 userRevNum, uint8 *buildRev ); + + +/* +** LL Callbacks to HCI +*/ + + +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); + + + + +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); + + + + +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); + + + + +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); + + + +#line 2416 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); + + + + +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); + + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + + +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); + + + + +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); + + + + +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); + + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + + + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags + + + + +// Receive Data Packet + + +// Disconnect Reasons +#line 158 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Tx Power Types + + + +// Host Flow Control + + + + + +// Device Address Type + + + +// Advertiser Events + + + + + +// Advertiser Channels + + + + + +// Advertiser White List Policy + + + + + +// Advertiser Commands + + + +// Scan Types + + + +// Scan White List Policy + + + +// Scan Filtering + + + +// Scan Commands + + + +// Initiator White List Policy + + + +// Encryption Related + + + +// Direct Test Mode + + +// +#line 231 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Vendor Specific + + +// + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + +// +#line 275 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +// + + +// + + +// + + + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[6]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[6]; // device address + uint8 dataLen; // length of report data + uint8 rspData[31]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[8]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_ValidConnTimeParams API + * + * @brief This API is used to check that the connection time parameter + * ranges are valid, and that the connection time parameter + * combination is valid. + * + * Note: Only connIntervalMax is used as part of the time parameter + * combination check. + * + * input parameters + * + * @param connIntervalMin - Minimum connection interval. + * @param connIntervalMax - Maximum connection interval. + * @param connLatency - Connection slave latency. + * @param connTimeout - Connection supervision timeout. + * + * output parameters + * + * @param None. + * + * @return TRUE: Connection time parameter check is valid. + * FALSE: Connection time parameter check is invalid. + */ +extern uint8 HCI_ValidConnTimeParams( uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + + +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + +/* +** HCI API +*/ + + +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); + + + + +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + + +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); + + + + +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); + + + + +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); + + + + +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); + + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); + + + +#line 1240 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + +#line 1266 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + + +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); + + + + +/******************************************************************************* + * @fn HCI_EXT_SetSlaveLatencyOverrideCmd API + * + * @brief This HCI Extension API is used to to enable or disable + * suspending slave latency. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_SL_OVERRIDE, + * HCI_EXT_DISABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSlaveLatencyOverrideCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); + + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + + +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn HCI_EXT_BuildRevisionCmd Vendor Specific API + * + * @brief This HCI Extension API is used set a user revision number or + * read the build revision number. + * + * input parameters + * + * @param mode - HCI_EXT_SET_USER_REVISION | HCI_EXT_READ_BUILD_REVISION + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS + */ +extern hciStatus_t HCI_EXT_BuildRevisionCmd( uint8 mode, uint16 userRevNum ); + + + + + + +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" +/************************************************************************************************** + Filename: gapgattserver.h + Revised: $Date: 2009-10-21 07:25:22 -0700 (Wed, 21 Oct 2009) $ + Revision: $Revision: 20946 $ + + Description: This file contains GAP GATT attribute definitions + and prototypes. + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + + +// Privacy Flag States + + + +// GAP GATT Server Parameters +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +// GAP Services bit fields + + +// Attribute ID used with application's callback when attribute value is changed OTA + + + +#line 88 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +/********************************************************************* + * TYPEDEFS + */ +// Callback to notify when attribute value is changed over the air. +typedef void (*ggsAttrValueChange_t)( uint8 attrId ); + +// GAP GATT Server callback structure +typedef struct +{ + ggsAttrValueChange_t pfnAttrValueChange; // When attribute value is changed OTA +} ggsAppCBs_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8 param, uint8 len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8 param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32 services ); + +/** + * @brief Delete function for the GAP GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GGS_DelService( uint32 services ); + +/** + * @brief Registers the application callback function. + * + * Note: Callback registration is needed only when the + * Device Name is made writable. The application + * will be notified when the Device Name is changed + * over the air. + * + * @param appCallbacks - pointer to application callbacks. + * + * @return none + */ +extern void GGS_RegisterAppCBs( ggsAppCBs_t *appCallbacks ); + +/** + * @brief Set a GGS Parameter value. Use this function to change + * the default GGS parameter values. + * + * @param value - new GGS param value + * + * @return void + */ +extern void GGS_SetParamValue( uint16 value ); + +/** + * @brief Get a GGS Parameter value. + * + * @param none + * + * @return GGS Parameter value + */ +extern uint16 GGS_GetParamValue( void ); + +/********************************************************************* + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Task event types + + +// Once NV usage reaches this percentage threshold, NV compaction gets triggered. + + +// Bonded State Flags + + + +/** + * GAP Bond Manager NV layout + * + * The NV definitions: + * BLE_NVID_GAP_BOND_START - starting NV ID + * GAP_BONDINGS_MAX - Maximum number of bonding allowed (10 is max for number of NV IDs allocated in bcomdef.h). + * + * A single bonding entry consists of 6 components (NV items): + * Bond Record - defined as gapBondRec_t and uses GAP_BOND_REC_ID_OFFSET for an NV ID + * local LTK Info - defined as gapBondLTK_t and uses GAP_BOND_LOCAL_LTK_OFFSET for an NV ID + * device LTK Info - defined as gapBondLTK_t and uses GAP_BOND_DEV_LTK_OFFSET for an NV ID + * device IRK - defined as "uint8 devIRK[KEYLEN]" and uses GAP_BOND_DEV_IRK_OFFSET for an NV ID + * device CSRK - defined as "uint8 devCSRK[KEYLEN]" and uses GAP_BOND_DEV_CSRK_OFFSET for an NV ID + * device Sign Counter - defined as a uint32 and uses GAP_BOND_DEV_SIGN_COUNTER_OFFSET for an NV ID + * + * When the device is initialized for the first time, all (GAP_BONDINGS_MAX) NV items are created and + * initialized to all 0xFF's. A bonding record of all 0xFF's indicates that the bonding record is empty + * and free to use. + * + * The calculation for each bonding records NV IDs: + * mainRecordNvID = ((bondIdx * GAP_BOND_REC_IDS) + BLE_NVID_GAP_BOND_START) + * localLTKNvID = (((bondIdx * GAP_BOND_REC_IDS) + GAP_BOND_LOCAL_LTK_OFFSET) + BLE_NVID_GAP_BOND_START) + * + */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + + + +// Macros to calculate the index/offset in to NV space +#line 115 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + +// Macros to calculate the GATT index/offset in to NV space + + +// Key Size Limits + + + +/********************************************************************* + * TYPEDEFS + */ + +// Structure of NV data for the connected device's encryption information +typedef struct +{ + uint8 LTK[16]; // Long Term Key (LTK) + uint16 div; //lint -e754 // LTK eDiv + uint8 rand[8]; // LTK random number + uint8 keySize; // LTK key size +} gapBondLTK_t; + +// Structure of NV data for the connected device's address information +typedef struct +{ + uint8 publicAddr[6]; // Master's address + uint8 reconnectAddr[6]; // Privacy Reconnection Address + uint16 stateFlags; // State flags: SM_AUTH_STATE_AUTHENTICATED & SM_AUTH_STATE_BONDING +} gapBondRec_t; + +// Structure of NV data for the connected device's characteristic configuration +typedef struct +{ + uint16 attrHandle; // attribute handle + uint8 value; // attribute value for this device +} gapBondCharCfg_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapBondMgr_TaskID; // Task ID for internal task/event processing + +// GAPBonding Parameters +static uint8 gapBond_PairingMode = 0x01; +static uint16 gapBond_InitiateWait = 1000; // Default to 1 second +static uint8 gapBond_MITM = 0; +static uint8 gapBond_IOCap = 0x00; +static uint8 gapBond_OOBDataFlag = 0; +static uint8 gapBond_OOBData[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8 gapBond_Bonding = 0; +static uint8 gapBond_AutoFail = 0; +static uint8 gapBond_AutoFailReason = 0x05; +static uint8 gapBond_KeyDistList = +( + 0x01 // sEncKey enabled, to send the encryption key + | 0x02 // sIdKey enabled, to send the IRK, and BD_ADDR + | 0x04 // sSign enabled, to send the CSRK + | 0x08 // mEncKey enabled, to get the master's encryption key + | 0x10 // mIdKey enabled, to get the master's IRK and BD_ADDR + | 0x20 // mSign enabled, to get the master's CSRK +); +static uint32 gapBond_Passcode = 0; +static uint8 gapBond_KeySize = 16; + + + + + +static const gapBondCBs_t *pGapBondCB = 0; + +// Local RAM shadowed bond records +static gapBondRec_t bonds[10] = {0}; + +static uint8 autoSyncWhiteList = 0; + +static uint8 eraseAllBonds = 0; + +// Connection handle saved for Synch Char Config +static uint16 connectionHandle; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ); +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ); +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ); +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ); +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ); +static uint8 gapBondMgrGetStateFlags( uint8 idx ); +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ); +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ); +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ); +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pAddr ); +static void gapBondMgrReadBonds( void ); +static uint8 gapBondMgrFindEmpty( void ); +static uint8 gapBondMgrBondTotal( void ); +static bStatus_t gapBondMgrEraseAllBondings( void ); +static bStatus_t gapBondMgrEraseBonding( uint8 idx ); +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ); +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ); +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ); +static void gapBondSetupPrivFlag( void ); +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ); +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ); +static void gapBondMgr_SyncWhiteList( void ); +static void gapBondMgr_SyncCharCfg( uint16 connHandle ); + + +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ); + + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = 0x00; // return value + + switch ( param ) + { + case 0x400: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x02) ) + { + gapBond_PairingMode = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x401: + if ( len == sizeof ( uint16 ) ) + { + gapBond_InitiateWait = *((uint16*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x402: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 1) ) + { + gapBond_MITM = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x403: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x04) ) + { + gapBond_IOCap = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x404: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 1) ) + { + gapBond_OOBDataFlag = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x405: + if ( len == 16 ) + { + (void) osal_memcpy( gapBond_OOBData, pValue, 16 ) ; + } + else + { + ret = 0x18; + } + break; + + case 0x406: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 1) ) + { + gapBond_Bonding = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x407: + if ( len == sizeof ( uint8 ) ) + { + gapBond_KeyDistList = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x408: + if ( (len == sizeof ( uint32 )) + && (*((uint32*)pValue) <= 999999) ) + { + gapBond_Passcode = *((uint32*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x409: + if ( len == 0 ) + { + // Make sure there's no active connection + if ( GAP_NumActiveConnections() == 0 ) + { + // Erase all bonding records + (void) gapBondMgrEraseAllBondings(); + + // See if NV needs a compaction + (void) osal_snv_compact( 80 ); + + // Make sure Bond RAM Shadow is up-to-date + gapBondMgrReadBonds(); + } + else + { + eraseAllBonds = 1; + } + } + else + { + ret = 0x18; + } + break; + + case 0x40A: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 1) ) + { + gapBond_AutoFail = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x40B: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x09) ) + { + gapBond_AutoFailReason = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x40C: + if ( (len == sizeof ( uint8 )) + && ((*((uint8*)pValue) >= 7) && (*((uint8*)pValue) <= 16)) ) + { + gapBond_KeySize = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x40D: + if ( len == sizeof( uint8 ) ) + { + uint8 oldVal = autoSyncWhiteList; + + autoSyncWhiteList = *((uint8 *)pValue); + + // only call if parameter changes from FALSE to TRUE + if ( ( oldVal == 0 ) && ( autoSyncWhiteList == 1 ) ) + { + // make sure bond is updated from NV + gapBondMgrReadBonds(); + } + } + else + { + ret = 0x18; + } + break; + +#line 454 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < 38) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = 0x02; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Bond Manager parameter. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = 0x00; // return value + + switch ( param ) + { + case 0x400: + *((uint8*)pValue) = gapBond_PairingMode; + break; + + case 0x401: + *((uint16*)pValue) = gapBond_InitiateWait; + break; + + case 0x402: + *((uint8*)pValue) = gapBond_MITM; + break; + + case 0x403: + *((uint8*)pValue) = gapBond_IOCap; + break; + + case 0x404: + *((uint8*)pValue) = gapBond_OOBDataFlag; + break; + + case 0x405: + (void) osal_memcpy( pValue, gapBond_OOBData, 16 ) ; + break; + + case 0x406: + *((uint8*)pValue) = gapBond_Bonding; + break; + + case 0x407: + *((uint8*)pValue) = gapBond_KeyDistList; + break; + + case 0x408: + *((uint32*)pValue) = gapBond_Passcode; + break; + + case 0x40A: + *((uint8*)pValue) = gapBond_AutoFail; + break; + + case 0x40B: + *((uint8*)pValue) = gapBond_AutoFailReason; + break; + + case 0x40C: + *((uint8*)pValue) = gapBond_KeySize; + break; + + case 0x40D: + *((uint8*)pValue) = autoSyncWhiteList; + break; + + case 0x40E: + *((uint8*)pValue) = gapBondMgrBondTotal(); + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < 38 ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = 0x02; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Notify the Bond Manager that a connection has been made. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ) +{ + uint8 idx; // NV Index + uint8 publicAddr[6] // Place to put the public address + = {0, 0, 0, 0, 0, 0}; + + idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr ); + if ( idx < 10 ) + { + uint8 stateFlags = gapBondMgrGetStateFlags( idx ); + smSigningInfo_t signingInfo; + gapBondCharCfg_t charCfg[4]; // Space to read a char cfg record from NV + + // On peripheral, load the key information for the bonding + // On central and initiaiting security, load key to initiate encyption + gapBondMgrBondReq( connHandle, idx, stateFlags, role, + ((gapBond_PairingMode == 0x02 ) ? 1 : 0) ); + + // Load the Signing Key + (void) osal_memset( &signingInfo, 0, sizeof ( smSigningInfo_t ) ); + if ( osal_snv_read( (((((((idx)) * 6) + (4))) + 0x20)), 16, signingInfo.srk ) == 0x00 ) + { + if ( osal_isbufset( signingInfo.srk, 0xFF, 16 ) == 0 ) + { + // Load the signing information for this connection + (void) osal_snv_read( (((((((idx)) * 6) + (5))) + 0x20)), sizeof ( uint32 ), &(signingInfo.signCounter) ); + (void) GAP_Signable( connHandle, + ((stateFlags & 0x0001) ? 1 : 0), + &signingInfo ); + } + } + + // Load the characteristic configuration + if ( osal_snv_read( ((idx) + 0x70), sizeof ( charCfg ), charCfg ) == 0x00 ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + + for ( uint8 i = 0; i < 4; i++ ) + { + gapBondCharCfg_t *pItem = &(charCfg[i]); + + // Apply the characteristic configuration for this connection + if ( pItem->attrHandle != 0x0000 ) + { + (void) GATTServApp_UpdateCharCfg( connHandle, pItem->attrHandle, + (uint16)(pItem->value) ); + } + } + } + + // Has there been a service change? + if ( stateFlags & 0x0002 ) + { + (void) GATTServApp_SendServiceChangedInd( connHandle, gapBondMgr_TaskID ); + } + } +#line 629 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + + + // If Peripheral and initiating, send a slave security request to + // initiate either pairing or encryption + if ( role == 0x04 && + gapBond_PairingMode == 0x02 ) + { + gapBondMgrSlaveSecurityReq( connHandle ); + } + + + return ( 0x00 ); +} + +/********************************************************************* + * @brief Resolve an address from bonding information. + * + * Public function defined in gapbondmgr.h. + */ +uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ) +{ + uint8 idx = 10; + + switch ( addrType ) + { + case 0x00: + case 0x01: + idx = gapBondMgrFindAddr( pDevAddr ); + if ( (idx < 10) && (pResolvedAddr) ) + { + (void) osal_memcpy( pResolvedAddr, pDevAddr, 6 ); + } + break; + + case 0x02: + // This could be a reconnection address + idx = gapBondMgrFindReconnectAddr( pDevAddr ); + if ( (idx < 10) && (pResolvedAddr) ) + { + (void) gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + case 0x03: + // Master's don't use Private Resolvable addresses but just in case + idx = gapBondMgrResolvePrivateAddr( pDevAddr ); + if ( (idx < 10) && (pResolvedAddr) ) + { + (void) gapBondMgrGetPublicAddr( idx, pResolvedAddr ); + } + break; + + default: + break; + } + + return ( idx ); +} + +/********************************************************************* + * @brief Set/clear the service change indication in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ) +{ + bStatus_t ret = 0x15; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Service Change indication + for ( idx = 0; idx < 10; idx++ ) + { + if ( gapBondMgrChangeState( idx, 0x0002, setParam ) ) + { + ret = 0x00; + } + } + + // If the service change indication is TRUE, tell the connected devices + if ( setParam ) + { + // Run connected database + linkDB_PerformFunc( gapBondMgrSendServiceChange ); + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx; // loop counter + idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, 0 ); + if ( idx < 10 ) + { + // Bond found, update it. + (void) gapBondMgrChangeState( idx, 0x0002, setParam ); + ret = 0x00; + } + + // If the service change indication is TRUE, tell the connected device + if ( setParam ) + { + gapBondMgrSendServiceChange( pLinkItem ); + } + } + else + { + ret = 0x14; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Update the Characteristic Configuration in a bond record. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ) +{ + bStatus_t ret = 0x15; // return value + + if ( connectionHandle == 0xFFFF ) + { + uint8 idx; // loop counter + + // Run through the bond database and update the Characteristic Configuration + for ( idx = 0; idx < 10; idx++ ) + { + if ( gapBondMgrUpdateCharCfg( idx, attrHandle, value ) ) + { + ret = 0x00; + } + } + } + else + { + // Find connection information + linkDBItem_t *pLinkItem = linkDB_Find( connectionHandle ); + if ( pLinkItem ) + { + uint8 idx = GAPBondMgr_ResolveAddr( pLinkItem->addrType, pLinkItem->addr, 0 ); + if ( idx < 10 ) + { + // Bond found, update it. + (void) gapBondMgrUpdateCharCfg( idx, attrHandle, value ); + ret = 0x00; + } + } + else + { + ret = 0x14; + } + } + + return ( ret ); +} + +/********************************************************************* + * @brief Register callback functions with the bond manager. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_Register( gapBondCBs_t *pCB ) +{ + pGapBondCB = pCB; + + // Take over the processing of Authentication messages + (void) GAP_SetParamValue( 37, gapBondMgr_TaskID ); + + // Register with GATT Server App for event messages + GATTServApp_RegisterForMsg( gapBondMgr_TaskID ); +} + +/********************************************************************* + * @brief Respond to a passcode request. + * + * Public function defined in gapbondmgr.h. + */ +bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ) +{ + bStatus_t ret = 0x00; + + if ( status == 0x00 ) + { + // Truncate the passcode + passcode = passcode % (999999 + 1); + + ret = GAP_PasscodeUpdate( passcode, connectionHandle ); + if ( ret != 0x00 ) + { + (void) GAP_TerminateAuth( connectionHandle, 0x01 ); + } + } + else + { + (void) GAP_TerminateAuth( connectionHandle, status ); + } + + return ret; +} + +/********************************************************************* + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * Public function defined in gapbondmgr.h. + */ +void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + switch ( pMsg->opcode ) + { + case 0x0B: + { + gapPasskeyNeededEvent_t *pPkt = (gapPasskeyNeededEvent_t *)pMsg; + + if ( pGapBondCB && pGapBondCB->passcodeCB ) + { + // Ask app for a passcode + pGapBondCB->passcodeCB( pPkt->deviceAddr, pPkt->connectionHandle, pPkt->uiInputs, pPkt->uiOutputs ); + } + else + { + // No app support, use the default passcode + if ( GAP_PasscodeUpdate( gapBond_Passcode, pPkt->connectionHandle ) != 0x00 ) + { + (void) GAP_TerminateAuth( pPkt->connectionHandle, 0x01 ); + } + } + } + break; + + case 0x0A: + { + gapAuthCompleteEvent_t *pPkt = (gapAuthCompleteEvent_t *)pMsg; + + // Should we save bonding information + if ( (pPkt->hdr.status == 0x00) && (pPkt->authState & 0x01) ) + { + gapBondRec_t bondRec; + + (void) osal_memset( &bondRec, 0, sizeof ( gapBondRec_t ) ) ; + + // Do we have a public address in the data? + if ( pPkt->pIdentityInfo ) + { + (void) osal_memcpy( bondRec.publicAddr, pPkt->pIdentityInfo->bd_addr, 6 ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + if ( pLinkItem ) + { + (void) osal_memcpy( bondRec.publicAddr, pLinkItem->addr, 6 ); + } + else + { + // We don't have an address, so ignore the message. + break; + } + } + + // Save off of the authentication state + bondRec.stateFlags |= (pPkt->authState & 0x04) ? 0x0001 : 0; + + (void) gapBondMgrAddBond( &bondRec, + (gapBondLTK_t *)pPkt->pSecurityInfo, + (gapBondLTK_t *)pPkt->pDevSecInfo, + ((uint8 *)((pPkt->pIdentityInfo) ? pPkt->pIdentityInfo->irk : 0 )), + ((uint8 *)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->srk : 0 )), + ((uint32)((pPkt->pSigningInfo) ? pPkt->pSigningInfo->signCounter : 0xFFFFFFFF )) ); + + // Notify our task to update NV with CCC values stored in GATT database + connectionHandle = pPkt->connectionHandle; + osal_set_event( gapBondMgr_TaskID, 0x0001 ); + } + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, 0x01, pPkt->hdr.status ); + } + } + break; + + case 0x0E: + // This message is received when the bonding is complete. If hdr.status is SUCCESS + // then call app state callback. If hdr.status is NOT SUCCESS, the connection will be + // dropped at the LL because of a MIC failure, so again nothing to do. + { + gapBondCompleteEvent_t *pPkt = (gapBondCompleteEvent_t *)pMsg; + +#line 963 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, 0x02, pMsg->hdr.status ); + } + } + break; + + case 0x09: + { + uint8 idx; + gapSignUpdateEvent_t *pPkt = (gapSignUpdateEvent_t *)pMsg; + + idx = GAPBondMgr_ResolveAddr( pPkt->addrType, pPkt->devAddr, 0 ); + if ( idx < 10 ) + { + // Save the sign counter + (void) osal_snv_write( (((((((idx)) * 6) + (5))) + 0x20)), sizeof ( uint32 ), &(pPkt->signCounter) ); + } + } + break; + + + case 0x0F: + { + gapPairingReqEvent_t *pPkt = (gapPairingReqEvent_t *)pMsg; + + if ( gapBond_AutoFail != 0 ) + { + // Auto Fail TEST MODE (DON'T USE THIS) - Sends pre-setup reason + (void) GAP_TerminateAuth( pPkt->connectionHandle, gapBond_AutoFailReason ); + } + else if ( gapBond_PairingMode == 0x00 ) + { + // No Pairing - Send error + (void) GAP_TerminateAuth( pPkt->connectionHandle, 0x05 ); + } + else + { + linkDBItem_t *pLinkItem = linkDB_Find( pPkt->connectionHandle ); + + // Requesting bonding? + if ( pPkt->pairReq.authReq & 0x01 ) + { + if ( pLinkItem ) + { + if ( (pLinkItem->addrType != 0x00) && (pPkt->pairReq.keyDist.mIdKey == 0) ) + { + uint8 publicAddr[6]; + + // Check if we already have the public address in NV + if ( GAPBondMgr_ResolveAddr(pLinkItem->addrType, pLinkItem->addr, publicAddr ) == 0 ) + { + // Can't bond to a non-public address if we don't know the public address + (void) GAP_TerminateAuth( pPkt->connectionHandle, 0x03 ); + break; + } + } + } + else + { + // Can't find the connection, ignore the message + break; + } + } + + // Send pairing response + gapBondMgrAuthenticate( pPkt->connectionHandle, pLinkItem->addrType, &(pPkt->pairReq) ); + + // Call app state callback + if ( pGapBondCB && pGapBondCB->pairStateCB ) + { + pGapBondCB->pairStateCB( pPkt->connectionHandle, 0x00, 0x00 ); + } + } + } + break; + + +#line 1075 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.c" + + case 0x06: + if ( GAP_NumActiveConnections() == 0 ) + { + // See if we're asked to erase all bonding records + if ( eraseAllBonds == 1 ) + { + (void) gapBondMgrEraseAllBondings(); + eraseAllBonds = 0; + } + + // See if NV needs a compaction + (void) osal_snv_compact( 80 ); + + // Make sure Bond RAM Shadow is up-to-date + gapBondMgrReadBonds(); + } + break; + + default: + break; + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @fn gapBondMgrChangeState + * + * @brief Change a state flag in the stateFlags field of the bond record. + * + * @param idx - Bond NV index + * @param state - state flage to set or clear + * @param set - TRUE to set the flag, FALSE to clear the flag + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrChangeState( uint8 idx, uint16 state, uint8 set ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( (osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ) == 0x00) + && (osal_isbufset( bondRec.publicAddr, 0xFF, 6 ) == 0) ) + { + // Update the state of the bonded device. + uint8 stateFlags = bondRec.stateFlags; + if ( set ) + { + stateFlags |= state; + } + else + { + stateFlags &= ~(state); + } + + if ( stateFlags != bondRec.stateFlags ) + { + bondRec.stateFlags = stateFlags; + (void) osal_snv_write( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ); + } + return ( 1 ); + } + return ( 0 ); +} + +/********************************************************************* + * @fn gapBondMgrUpdateCharCfg + * + * @brief Update the Characteristic Configuration of the bond record. + * + * @param idx - Bond NV index + * @param attrHandle - attribute handle (0 means all handles) + * @param value - characteristic configuration value + * + * @return TRUE if NV Record exists, FALSE if NV Record is empty + */ +static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value ) +{ + gapBondRec_t bondRec; // Space to read a Bond record from NV + + // Look for public address that is used (not all 0xFF's) + if ( ( osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ) == 0x00 ) + && ( osal_isbufset( bondRec.publicAddr, 0xFF, 6 ) == 0 ) ) + { + gapBondCharCfg_t charCfg[4]; // Space to read a char cfg record from NV + + if ( osal_snv_read( ((idx) + 0x70), sizeof ( charCfg ), charCfg ) == 0x00 ) + { + uint8 update = 0; + + gapBondMgrInvertCharCfgItem( charCfg ); + + if ( attrHandle == 0x0000 ) + { + if ( osal_isbufset( (uint8 *)charCfg, 0x00, sizeof ( charCfg ) ) == 0 ) + { + // Clear all characteristic configuration for this device + (void) osal_memset( (void *)charCfg, 0x00, sizeof ( charCfg ) ); + update = 1; + } + } + else + { + gapBondCharCfg_t *pItem = gapBondMgrFindCharCfgItem( attrHandle, charCfg ); + if ( pItem == 0 ) + { + // Must be a new item; ignore if the value is no operation (default) + if ( ( value == 0x0000 ) || + ( ( pItem = gapBondMgrFindCharCfgItem( 0x0000, charCfg ) ) == 0 ) ) + { + return ( 0 ); // No empty entry found + } + + pItem->attrHandle = attrHandle; + } + + if ( pItem->value != value ) + { + // Update characteristic configuration + pItem->value = (uint8)value; + if ( value == 0x0000 ) + { + // Erease the item + pItem->attrHandle = 0x0000; + } + + update = 1; + } + } + + // Update the characteristic configuration of the bonded device. + if ( update ) + { + gapBondMgrInvertCharCfgItem( charCfg ); + (void) osal_snv_write( ((idx) + 0x70), sizeof( charCfg ), charCfg ); + } + } + + return ( 1 ); + } + + return ( 0 ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Find the Characteristic Configuration for a given attribute. + * Uses the attribute handle to search the charactersitic + * configuration table of a bonded device. + * + * @param attrHandle - attribute handle. + * @param charCfgTbl - characteristic configuration table. + * + * @return pointer to the found item. NULL, otherwise. + */ +static gapBondCharCfg_t *gapBondMgrFindCharCfgItem( uint16 attrHandle, + gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < 4; i++ ) + { + if ( charCfgTbl[i].attrHandle == attrHandle ) + { + return ( &(charCfgTbl[i]) ); + } + } + + return ( (gapBondCharCfg_t *)0 ); +} + +/********************************************************************* + * @fn gapBondMgrFindCharCfgItem + * + * @brief Invert the Characteristic Configuration for a given client. + * + * @param charCfgTbl - characteristic configuration table. + * + * @return none. + */ +static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t *charCfgTbl ) +{ + for ( uint8 i = 0; i < 4; i++ ) + { + charCfgTbl[i].attrHandle = ~(charCfgTbl[i].attrHandle); + charCfgTbl[i].value = ~(charCfgTbl[i].value); + } +} + +/********************************************************************* + * @fn gapBondMgrAddBond + * + * @brief Save a bond from a GAP Auth Complete Event + * + * @param pBondRec - basic bond record + * @param pLocalLTK - LTK used by this device during pairing + * @param pDevLTK - LTK used by the connected device during pairing + * @param pIRK - IRK used by the connected device during pairing + * @param pSRK - SRK used by the connected device during pairing + * @param signCounter - Sign counter used by the connected device during pairing + * + * @return bond index + */ +static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec, + gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK, + uint8 *pIRK, uint8 *pSRK, uint32 signCounter ) +{ + uint8 idx; + + if ( pBondRec == 0 ) + { + return ( 10 ); + } + + // First see if we already have an existing bond for this device + idx = gapBondMgrFindAddr( pBondRec->publicAddr ); + if ( idx >= 10 ) + { + idx = gapBondMgrFindEmpty(); + } + + if ( idx < 10 ) + { + gapBondCharCfg_t charCfg[4]; + + // Save the main information + (void) osal_snv_write( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), pBondRec ); + + // If available, save the LTK information + if ( pLocalLTK ) + { + (void) osal_snv_write( (((((((idx)) * 6) + (1))) + 0x20)), sizeof ( gapBondLTK_t ), pLocalLTK ); + } + + // If availabe, save the connected device's LTK information + if ( pDevLTK ) + { + (void) osal_snv_write( (((((((idx)) * 6) + (2))) + 0x20)), sizeof ( gapBondLTK_t ), pDevLTK ); + } + + // If available, save the connected device's IRK + if ( pIRK ) + { + (void) osal_snv_write( (((((((idx)) * 6) + (3))) + 0x20)), 16, pIRK ); + } + + // If available, save the connected device's Signature information + if ( pSRK ) + { + (void) osal_snv_write( (((((((idx)) * 6) + (4))) + 0x20)), 16, pSRK ); + (void) osal_snv_write( (((((((idx)) * 6) + (5))) + 0x20)), sizeof ( uint32 ), &signCounter ); + } + + // Write out FF's over the charactersitic configuration entry, to overwrite + // any previous bond data that may have been stored + (void) osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + (void) osal_snv_write( ((idx) + 0x70), sizeof ( charCfg ), charCfg ); + + // Update Bond RAM Shadow just with the newly added bond entry + (void) osal_memcpy( &(bonds[idx]), pBondRec, sizeof ( gapBondRec_t ) ); + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); + } + + return ( idx ); +} + +/********************************************************************* + * @fn gapBondMgrGetStateFlags + * + * @brief Gets the state flags field of a bond record in NV + * + * @param idx + * + * @return stateFlags field + */ +static uint8 gapBondMgrGetStateFlags( uint8 idx ) +{ + gapBondRec_t bondRec; + + if ( osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ) == 0x00 ) + { + return ( bondRec.stateFlags ); + } + + return ( 0 ); +} + +/********************************************************************* + * @fn gapBondMgrGetPublicAddr + * + * @brief Copy the public Address from a bonding record + * + * @param idx - Bond record index + * @param pAddr - a place to put the public address from NV + * + * @return SUCCESS if successful. + * Otherwise failure. + */ +static bStatus_t gapBondMgrGetPublicAddr( uint8 idx, uint8 *pAddr ) +{ + bStatus_t stat; // return value + gapBondRec_t bondRec; // Work space for main bond record + + // Check parameters + if ( (idx >= 10) || (pAddr == 0) ) + { + return ( 0x02 ); + } + + stat = osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ); + + if ( stat == 0x00 ) + { + (void) osal_memcpy( pAddr, bondRec.publicAddr, 6 ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrFindReconnectAddr + * + * @brief Look through the bonding entries to find a + * reconnection address. + * + * @param pReconnectAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindReconnectAddr( uint8 *pReconnectAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < 10; idx++ ) + { + // compare reconnection address + if ( osal_memcmp( bonds[idx].reconnectAddr, pReconnectAddr, 6 ) ) + { + return ( idx ); // Found it + } + } + + return ( 10 ); +} + +/********************************************************************* + * @fn gapBondMgrFindAddr + * + * @brief Look through the bonding entries to find an address. + * + * @param pDevAddr - device address to look for + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindAddr( uint8 *pDevAddr ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < 10; idx++ ) + { + // Read in NV Main Bond Record and compare public address + if ( osal_memcmp( bonds[idx].publicAddr, pDevAddr, 6 ) ) + { + return ( idx ); // Found it + } + } + + return ( 10 ); +} + +/********************************************************************* + * @fn gapBondMgrResolvePrivateAddr + * + * @brief Look through the NV bonding entries to resolve a private + * address. + * + * @param pDevAddr - device address to look for + * + * @return index to found bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no entry found + */ +static uint8 gapBondMgrResolvePrivateAddr( uint8 *pDevAddr ) +{ + for ( uint8 idx = 0; idx < 10; idx++ ) + { + uint8 IRK[16]; + + // Read in NV IRK Record and compare resovable address + if ( osal_snv_read( (((((((idx)) * 6) + (3))) + 0x20)), 16, IRK ) == 0x00 ) + { + if ( ( osal_isbufset( IRK, 0xFF, 16 ) == 0 ) && + ( GAP_ResolvePrivateAddr( IRK, pDevAddr ) == 0x00 ) ) + { + return ( idx ); // Found it + } + } + } + + return ( 10 ); +} + +/********************************************************************* + * @fn gapBondMgrReadBonds + * + * @brief Read through NV and store them in RAM. + * + * @param none + * + * @return none + */ +static void gapBondMgrReadBonds( void ) +{ + for ( uint8 idx = 0; idx < 10; idx++ ) + { + // See if the entry exists in NV + if ( osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof( gapBondRec_t ), &(bonds[idx]) ) != 0x00 ) + { + // Can't read the entry, assume that it doesn't exist + (void) osal_memset( bonds[idx].publicAddr, 0xFF, 6 ); + (void) osal_memset( bonds[idx].reconnectAddr, 0xFF, 6 ); + bonds[idx].stateFlags = 0; + } + } + + if ( autoSyncWhiteList ) + { + gapBondMgr_SyncWhiteList(); + } + + // Update the GAP Privacy Flag Properties + gapBondSetupPrivFlag(); +} + +/********************************************************************* + * @fn gapBondMgrFindEmpty + * + * @brief Look through the bonding NV entries to find an empty. + * + * @param none + * + * @return index to empty bonding (0 - (GAP_BONDINGS_MAX-1), + * GAP_BONDINGS_MAX if no empty entries + */ +static uint8 gapBondMgrFindEmpty( void ) +{ + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < 10; idx++ ) + { + // Look for public address of all 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, 6 ) ) + { + return ( idx ); // Found one + } + } + + return ( 10 ); +} + +/********************************************************************* + * @fn gapBondMgrBondTotal + * + * @brief Look through the bonding NV entries calculate the number + * entries. + * + * @param none + * + * @return total number of bonds found + */ +static uint8 gapBondMgrBondTotal( void ) +{ + uint8 numBonds = 0; + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; idx < 10; idx++ ) + { + // Look for public address that are not 0xFF's + if ( osal_isbufset( bonds[idx].publicAddr, 0xFF, 6 ) == 0 ) + { + numBonds++; // Found one + } + } + + return ( numBonds ); +} + +/********************************************************************* + * @fn gapBondMgrEraseAllBondings + * + * @brief Write all 0xFF's to all of the bonding entries + * + * @param none + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseAllBondings( void ) +{ + bStatus_t stat = 0x00; // return value + + // Item doesn't exist, so create all the items + for ( uint8 idx = 0; (idx < 10) && (stat == 0x00); idx++ ) + { + // Erasing will write/create a bonding entry + stat = gapBondMgrEraseBonding( idx ); + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgrEraseBonding + * + * @brief Write all 0xFF's to the complete bonding record + * + * @param idx - bonding index + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +static bStatus_t gapBondMgrEraseBonding( uint8 idx ) +{ + bStatus_t ret; + gapBondRec_t bondRec; + + // First see if bonding record exists in NV, then write all 0xFF's to it + if ( ( osal_snv_read( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ) == 0x00 ) + && (osal_isbufset( bondRec.publicAddr, 0xFF, 6 ) == 0) ) + { + gapBondLTK_t ltk; + gapBondCharCfg_t charCfg[4]; + + (void) osal_memset( &bondRec, 0xFF, sizeof ( gapBondRec_t ) ); + (void) osal_memset( <k, 0xFF, sizeof ( gapBondLTK_t ) ); + + (void) osal_memset( charCfg, 0xFF, sizeof ( charCfg ) ); + + // Write out FF's over the entire bond entry. + ret = osal_snv_write( (((((((idx)) * 6) + (0))) + 0x20)), sizeof ( gapBondRec_t ), &bondRec ); + ret |= osal_snv_write( (((((((idx)) * 6) + (1))) + 0x20)), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( (((((((idx)) * 6) + (2))) + 0x20)), sizeof ( gapBondLTK_t ), <k ); + ret |= osal_snv_write( (((((((idx)) * 6) + (3))) + 0x20)), 16, ltk.LTK ); + ret |= osal_snv_write( (((((((idx)) * 6) + (4))) + 0x20)), 16, ltk.LTK ); + ret |= osal_snv_write( (((((((idx)) * 6) + (5))) + 0x20)), sizeof ( uint32 ), ltk.LTK ); + + // Write out FF's over the charactersitic configuration entry. + ret |= osal_snv_write( ((idx) + 0x70), sizeof ( charCfg ), charCfg ); + } + else + { + ret = 0x00; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in gapbondmgr.h. + */ +void GAPBondMgr_Init( uint8 task_id ) +{ + gapBondMgr_TaskID = task_id; // Save task ID + + // Setup Bond RAM Shadow + gapBondMgrReadBonds(); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in gapbondmgr.h. + */ +uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ) +{ + (void) task_id; // OSAL required parameter that isn't used in this function + + if ( events & 0x8000 ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapBondMgr_TaskID )) != 0 ) + { + gapBondMgr_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + (void) osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ 0x8000); + } + + if ( events & 0x0001 ) + { + // Update NV to have same CCC values as GATT database + gapBondMgr_SyncCharCfg( connectionHandle ); + + return (events ^ 0x0001); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapBondMgr_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapBondMgr_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case 0xD0: + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case 0xB0: + gapBondMgr_ProcessGATTMsg( (gattMsgEvent_t *)pMsg ); + break; + + case 0xB1: + gapBondMgr_ProcessGATTServMsg( (gattEventHdr_t *)pMsg ); + break; + + default: + break; + } +} + +/********************************************************************* + * @fn GAPBondMgr_CheckNVLen + * + * @brief This function will check the length of an NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ) +{ + uint8 stat = 0x01; + + // Convert to index + switch ( (id - 0x20) % 6 ) + { + case 0: + if ( len == sizeof ( gapBondRec_t ) ) + { + stat = 0x00; + } + break; + + case 1: + case 2: + if ( len == sizeof ( gapBondLTK_t ) ) + { + stat = 0x00; + } + break; + + case 3: + case 4: + if ( len == 16 ) + { + stat = 0x00; + } + break; + + case 5: + if ( len == sizeof ( uint32 ) ) + { + stat = 0x00; + } + break; + + default: + break; + } + + return ( stat ); +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTMsg + * + * @brief Process an incoming GATT message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTMsg( gattMsgEvent_t *pMsg ) +{ + // Process the GATT message + switch ( pMsg->method ) + { + case 0x1e: + // Clear Service Changed flag for this client + (void) GAPBondMgr_ServiceChangeInd( pMsg->connHandle, 0x00 ); + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgr_ProcessGATTServMsg + * + * @brief Process an incoming GATT Server App message. + * + * @param pMsg - pointer to received message + * + * @return none + */ +static void gapBondMgr_ProcessGATTServMsg( gattEventHdr_t *pMsg ) +{ + // Process the GATT Server App message + switch ( pMsg->method ) + { + case 0x00: + { + gattClientCharCfgUpdatedEvent_t *pEvent = (gattClientCharCfgUpdatedEvent_t *)pMsg; + + (void) GAPBondMgr_UpdateCharCfg( pEvent->connHandle, pEvent->attrHandle, pEvent->value ); + } + break; + + default: + // Unknown message + break; + } +} + +/********************************************************************* + * @fn gapBondMgrSendServiceChange + * + * @brief Tell the GATT that a service change is needed. + * + * @param pLinkItem - pointer to connection information + * + * @return none + */ +static void gapBondMgrSendServiceChange( linkDBItem_t *pLinkItem ) +{ + (void) GATTServApp_SendServiceChangedInd( pLinkItem->connectionHandle, + gapBondMgr_TaskID ); +} + +/********************************************************************* + * @fn gapBondSetupPrivFlag + * + * @brief Setup the GAP Privacy Flag properties. + * + * @param none + * + * @return none + */ +static void gapBondSetupPrivFlag( void ) +{ + uint8 privFlagProp; + + if ( gapBondMgrBondTotal() > 1 ) + { + privFlagProp = 0x02; + } + else + { + privFlagProp = 0x02 | 0x08; + } + + // Setup the + (void) GGS_SetParameter( 5, sizeof ( uint8 ), &privFlagProp ); +} + +/********************************************************************* + * @fn gapBondMgrAuthenticate + * + * @brief Initiate authentication + * + * @param connHandle - connection handle + * @param addrType - peer address type + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return none + */ +static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType, + gapPairingReq_t *pPairReq ) +{ + gapAuthParams_t params; + + (void) osal_memset( ¶ms, 0, sizeof ( gapAuthParams_t ) ); + + // Setup the pairing parameters + params.connectionHandle = connHandle; + params.secReqs.ioCaps = gapBond_IOCap; + params.secReqs.oobAvailable = gapBond_OOBDataFlag; + params.secReqs.maxEncKeySize = gapBond_KeySize; + + params.secReqs.keyDist.sEncKey = (gapBond_KeyDistList & 0x01) ? 1 : 0; + params.secReqs.keyDist.sIdKey = (gapBond_KeyDistList & 0x02) ? 1 : 0; + params.secReqs.keyDist.mEncKey = (gapBond_KeyDistList & 0x08) ? 1 : 0; + params.secReqs.keyDist.mIdKey = (gapBond_KeyDistList & 0x10) ? 1 : 0; + params.secReqs.keyDist.mSign = (gapBond_KeyDistList & 0x20) ? 1 : 0; + params.secReqs.keyDist.sSign = (gapBond_KeyDistList & 0x04) ? 1 : 0; + + // Is bond manager setup for OOB data? + if ( gapBond_OOBDataFlag ) + { + (void) osal_memcpy( params.secReqs.oob, gapBond_OOBData, 16 ); + } + + if ( gapBond_Bonding && addrType != 0x00 ) + { + // Force a slave ID key + params.secReqs.keyDist.sIdKey = 1; + } + + params.secReqs.authReq |= (gapBond_Bonding) ? 0x01 : 0; + params.secReqs.authReq |= (gapBond_MITM) ? 0x04 : 0; + + (void) GAP_Authenticate( ¶ms, pPairReq ); +} + + +/********************************************************************* + * @fn gapBondMgrSlaveSecurityReq + * + * @brief Send a slave security request + * + * @param connHandle - connection handle + * + * @return none + */ +static void gapBondMgrSlaveSecurityReq( uint16 connHandle ) +{ + uint8 authReq = 0; + + authReq |= (gapBond_Bonding) ? 0x01 : 0; + authReq |= (gapBond_MITM) ? 0x04 : 0; + + (void) GAP_SendSlaveSecurityRequest( connHandle, authReq ); +} + + +/********************************************************************* + * @fn gapBondMgrBondReq + * + * @brief Initiate a GAP bond request + * + * @param connHandle - connection handle + * @param idx - NV index of bond entry + * @param stateFlags - bond state flags + * @param role - master or slave role + * @param startEncryption - whether or not to start encryption + * + * @return none + */ +static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags, + uint8 role, uint8 startEncryption ) +{ + smSecurityInfo_t ltk; + osalSnvId_t nvId; + + if ( role == 0x08 ) + { + nvId = (((((((idx)) * 6) + (2))) + 0x20)); + } + else + { + nvId = (((((((idx)) * 6) + (1))) + 0x20)); + } + + // Initialize the NV structures + (void) osal_memset( <k, 0, sizeof ( smSecurityInfo_t ) ); + + if ( osal_snv_read( nvId, sizeof ( smSecurityInfo_t ), <k ) == 0x00 ) + { + if ( (ltk.keySize >= 7) && (ltk.keySize <= 16) ) + { + (void) GAP_Bond( connHandle, + ((stateFlags & 0x0001) ? 1 : 0), + <k, startEncryption ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncWhiteList + * + * @brief syncronize the White List with the bonds + * + * @param none + * + * @return none + */ +static void gapBondMgr_SyncWhiteList( void ) +{ + //erase the White List + (void) HCI_LE_ClearWhiteListCmd(); + + // Write bond addresses into the White List + for( uint8 i = 0; i < 10; i++) + { + // Make sure empty addresses are not added to the White List + if ( osal_isbufset( bonds[i].publicAddr, 0xFF, 6 ) == 0 ) + { + (void) HCI_LE_AddWhiteListCmd( 0, bonds[i].publicAddr ); + } + } +} + +/********************************************************************* + * @fn gapBondMgr_SyncCharCfg + * + * @brief Update the Bond Manager to have the same configurations as + * the GATT database. + * + * @param connHandle - the current connection handle to find client configurations for + * + * @return none + */ +static void gapBondMgr_SyncCharCfg( uint16 connHandle ) +{ + gattAttribute_t *pAttr; + uint16 service; + + // Only attributes with attribute handles between and including the Starting + // Handle parameter and the Ending Handle parameter that match the requested + // attribute type and the attribute value will be returned. + + // All attribute types are effectively compared as 128-bit UUIDs, + // even if a 16-bit UUID is provided in this request or defined + // for an attribute. + pAttr = GATT_FindHandleUUID( 0x0001, 0xFFFF, + clientCharCfgUUID, 2, &service ); + while ( ( pAttr != 0 ) ) + { + uint8 len; + uint8 attrVal[2]; + + // It is not possible to use this request on an attribute that has a value + // that is longer than 2. + if ( GATTServApp_ReadAttr( connHandle, pAttr, service, attrVal, + &len, 0, 2 ) == 0x00 ) + { + uint16 value = ((uint16)(((attrVal[0]) & 0x00FF) + (((attrVal[1]) & 0x00FF) << 8))); + + if ( value != 0x0000 ) + { + // NV must be updated to meet configuration of the database + (void) GAPBondMgr_UpdateCharCfg( connHandle, pAttr->handle, value ); + } + } + + // Try to find the next attribute + pAttr = GATT_FindNextAttr( pAttr, 0xFFFF, service, 0 ); + } // while +} + + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gatt_uuid.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gatt_uuid.i new file mode 100644 index 0000000..84b495f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gatt_uuid.i @@ -0,0 +1,4718 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\ble\\host\\gatt_uuid.c" +/************************************************************************************************** + Filename: gatt_uuid.c + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\ble\\host\\gatt_uuid.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\ble\\host\\gatt_uuid.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\ble\\host\\gatt_uuid.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\ble\\host\\gatt_uuid.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/** + * GATT Services + */ +// Generic Access Profile Service UUID +const uint8 gapServiceUUID[2] = +{ + ((0x1800) & 0xFF), (((0x1800) >> 8) & 0xFF) +}; + +// Generic Attribute Profile Service UUID +const uint8 gattServiceUUID[2] = +{ + ((0x1801) & 0xFF), (((0x1801) >> 8) & 0xFF) +}; + +/** + * GATT Declarations + */ +// Primary Service UUID +const uint8 primaryServiceUUID[2] = +{ + ((0x2800) & 0xFF), (((0x2800) >> 8) & 0xFF) +}; + +// Secondary Service UUID +const uint8 secondaryServiceUUID[2] = +{ + ((0x2801) & 0xFF), (((0x2801) >> 8) & 0xFF) +}; + +// Include UUID +const uint8 includeUUID[2] = +{ + ((0x2802) & 0xFF), (((0x2802) >> 8) & 0xFF) +}; + +// Characteristic UUID +const uint8 characterUUID[2] = +{ + ((0x2803) & 0xFF), (((0x2803) >> 8) & 0xFF) +}; + +/** + * GATT Descriptors + */ +// Characteristic Extended Properties UUID +const uint8 charExtPropsUUID[2] = +{ + ((0x2900) & 0xFF), (((0x2900) >> 8) & 0xFF) +}; + +// Characteristic User Description UUID +const uint8 charUserDescUUID[2] = +{ + ((0x2901) & 0xFF), (((0x2901) >> 8) & 0xFF) +}; + +// Client Characteristic Configuration UUID +const uint8 clientCharCfgUUID[2] = +{ + ((0x2902) & 0xFF), (((0x2902) >> 8) & 0xFF) +}; + +// Server Characteristic Configuration UUID +const uint8 servCharCfgUUID[2] = +{ + ((0x2903) & 0xFF), (((0x2903) >> 8) & 0xFF) +}; + +// Characteristic Format UUID +const uint8 charFormatUUID[2] = +{ + ((0x2904) & 0xFF), (((0x2904) >> 8) & 0xFF) +}; + +// Characteristic Aggregate Format UUID +const uint8 charAggFormatUUID[2] = +{ + ((0x2905) & 0xFF), (((0x2905) >> 8) & 0xFF) +}; + +/** + * GATT Characteristics + */ +// Device Name UUID +const uint8 deviceNameUUID[2] = +{ + ((0x2A00) & 0xFF), (((0x2A00) >> 8) & 0xFF) +}; + +// Appearance UUID +const uint8 appearanceUUID[2] = +{ + ((0x2A01) & 0xFF), (((0x2A01) >> 8) & 0xFF) +}; + +// Peripheral Privacy Flag UUID +const uint8 periPrivacyFlagUUID[2] = +{ + ((0x2A02) & 0xFF), (((0x2A02) >> 8) & 0xFF) +}; + +// Reconnection Address UUID +const uint8 reconnectAddrUUID[2] = +{ + ((0x2A03) & 0xFF), (((0x2A03) >> 8) & 0xFF) +}; + +// Peripheral Preferred Connection Parameters UUID +const uint8 periConnParamUUID[2] = +{ + ((0x2A04) & 0xFF), (((0x2A04) >> 8) & 0xFF) +}; + +// Service Changed UUID +const uint8 serviceChangedUUID[2] = +{ + ((0x2A05) & 0xFF), (((0x2A05) >> 8) & 0xFF) +}; + +// Valid Range UUID +const uint8 validRangeUUID[2] = +{ + ((0x2906) & 0xFF), (((0x2906) >> 8) & 0xFF) +}; + +// External Report Reference Descriptor +const uint8 extReportRefUUID[2] = +{ + ((0x2907) & 0xFF), (((0x2907) >> 8) & 0xFF) +}; + +// Report Reference characteristic descriptor +const uint8 reportRefUUID[2] = +{ + ((0x2908) & 0xFF), (((0x2908) >> 8) & 0xFF) +}; + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn GATT_FindUUIDRec + * + * @brief Find the UUID record for a given UUID. + * + * @param pUUID - UUID to look for. + * @param len - length of UUID. + * + * @return Pointer to UUID record. NULL, otherwise. + */ +const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ) +{ + const uint8 *pRec = 0; + + if ( len == 2 ) + { + // 16-bit UUID + uint16 uuid = ((uint16)(((pUUID[0]) & 0x00FF) + (((pUUID[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + /*** GATT Services ***/ + + case 0x1800: + pRec = gapServiceUUID; + break; + + case 0x1801: + pRec = gattServiceUUID; + break; + + /*** GATT Declarations ***/ + + case 0x2800: + pRec = primaryServiceUUID; + break; + + case 0x2801: + pRec = secondaryServiceUUID; + break; + + case 0x2802: + pRec = includeUUID; + break; + + case 0x2803: + pRec = characterUUID; + break; + + /*** GATT Descriptors ***/ + + case 0x2900: + pRec = charExtPropsUUID; + break; + + case 0x2901: + pRec = charUserDescUUID; + break; + + case 0x2902: + pRec = clientCharCfgUUID; + break; + + case 0x2903: + pRec = servCharCfgUUID; + break; + + case 0x2904: + pRec = charFormatUUID; + break; + + case 0x2905: + pRec = charAggFormatUUID; + break; + + case 0x2906: + pRec = validRangeUUID; + break; + + case 0x2907: + pRec = extReportRefUUID; + break; + + case 0x2908: + pRec = reportRefUUID; + break; + + /*** GATT Characteristics ***/ + + case 0x2A00: + pRec = deviceNameUUID; + break; + + case 0x2A01: + pRec = appearanceUUID; + break; + + case 0x2A03: + pRec = reconnectAddrUUID; + break; + + case 0x2A02: + pRec = periPrivacyFlagUUID; + break; + + case 0x2A04: + pRec = periConnParamUUID; + break; + + case 0x2A05: + pRec = serviceChangedUUID; + break; + + /*** GATT Units ***/ + + default: + break; + } + } + else if ( len == 16 ) + { + // 128-bit UUID + } + + return ( pRec ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gpsservice.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gpsservice.i new file mode 100644 index 0000000..1cecc01 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/gpsservice.i @@ -0,0 +1,7927 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +/************************************************************************************************** + Filename: gpsprofile.c + Creation: Date: 2015-07-23 + + Description: Gps profile (based on simpleGATT Profile) + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 13 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 14 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 15 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 16 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 17 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 18 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 19 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 20 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.h" +/************************************************************************************************** + Filename: gpsprofile.h + Creation: Date: 2015-07-23 + + Description: Gps profile (based on simpleGATT Profile) + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\util\\WIMU\\wimu_util.h" + + + + + + + + +// WIMU sensor data packet size + + + + + + + + + + + + + + + + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags + + + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.h" + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters + + + + + +// Simple Profile Service UUID + + + + + + + +// Simple Keys Profile Services bit fields + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Gps_AddService- Initializes the Gps Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Gps_AddService( uint32 services ); + +/* + * Gps_SetParameter - Set a Gps Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Gps_GetParameter - Get a Gps Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\GPS\\gpsservice.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Simple GATT Profile Service UUID: 0xFFF0 +const uint8 gpsServUUID[2] = +{ + ((0x1819) & 0xFF), (((0x1819) >> 8) & 0xFF) +}; + +// GPS_FEATURES_UUID +const uint8 gpsFeaturesUUID[2] = +{ + ((0x2A6A) & 0xFF), (((0x2A6A) >> 8) & 0xFF) +}; + +// GPS_LOCATION_AND_SPEED_UUID +const uint8 gpsLocationAndSpeedUUID[2] = +{ + ((0x2A67) & 0xFF), (((0x2A67) >> 8) & 0xFF) +}; + +// GPS_DATE_TIME_UUID +const uint8 gpsDateTimeUUID[2] = +{ + ((0x2A08) & 0xFF), (((0x2A08) >> 8) & 0xFF) +}; + +// GPS_POSITION_QUALITY_UUID +const uint8 gpsPositionQualityUUID[2] = +{ + ((0x2A69) & 0xFF), (((0x2A69) >> 8) & 0xFF) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +/********************************************************************* + * Profile Attributes - variables + */ + +// Gps Service attribute +static const gattAttrType_t gpsService = { 2, gpsServUUID }; + +// gpsFeatures Properties +static uint8 gpsFeaturesProps = 0x02; + +// gpsFeatures Value +static uint8 gpsFeatures[4] = {0x00, 0x00, 0x60, 0x5D}; + +// gpsLocationAndSpeed Properties +static uint8 gpsLocationAndSpeedProps = 0x10; + +// gpsLocationAndSpeed Value +static uint8 gpsLocationAndSpeed[17] = {0x00, 0x00, // flags + 0x00, 0x00, // speed + 0x00, 0x00, 0x00, 0x00, // latitude + 0x00, 0x00, 0x00, 0x00, // longitude + 0x00, 0x00, 0x00, // elevation + 0x00, 0x00}; // heading + +static gattCharCfg_t gpsLocationAndSpeedClientCharCfg[( 3 + 1 )]; + +// gpsDateTime Properties +static uint8 gpsDateTimeProps = 0x02 | 0x10; + +// gpsDateTime Value +static uint8 gpsDateTime[7] = { 0x00, 0x00, // year + 0x00, // month + 0x00, // day + 0x00, // hours + 0x00, // minutes + 0x00}; // seconds + +static gattCharCfg_t gpsDateTimeClientCharCfg[( 3 + 1 )]; + +// gpsPositionQuality Properties +static uint8 gpsPositionQualityProps = 0x02;// | GATT_PROP_NOTIFY; notifications are excluded + +// gpsPositionQuality Value +static uint8 gpsPositionQuality[16] = {0x00, 0x00, // flags + 0x00, // nb of Beacons in Solution + 0x00, // nb of Beacons in View + 0x00, 0x00, // Time to First Fix + 0x00, 0x00, 0x00, 0x00, // EHPE + 0x00, 0x00, 0x00, 0x00, // EVPE + 0x00, // HDOP + 0x00}; // VDOP + +//static gattCharCfg_t gpsPositionQualityClientCharCfg[GATT_MAX_NUM_CONN]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t gpsAttrTbl[11] = +{ + // Simple Profile Service + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&gpsService /* pValue */ + }, + + // gpsFeatures Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &gpsFeaturesProps + }, + + // gpsFeatures Value + { + { 2, gpsFeaturesUUID }, + 0x01, + 0, + gpsFeatures + }, + + // gpsLocationAndSpeed Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &gpsLocationAndSpeedProps + }, + + // gpsLocationAndSpeed Value + { + { 2, gpsLocationAndSpeedUUID }, + 0x01, + 0, + gpsLocationAndSpeed + }, + + // gpsLocationAndSpeed Client Characteristic Configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)gpsLocationAndSpeedClientCharCfg + }, + + // gpsDateTime Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &gpsDateTimeProps + }, + + // gpsDateTime Value + { + { 2, gpsDateTimeUUID }, + 0x01, + 0, + gpsDateTime + }, + + // gpsDateTime Client Characteristic Configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)gpsDateTimeClientCharCfg + }, + + // gpsPositionQuality Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &gpsPositionQualityProps + }, + + // gpsPositionQuality Value + { + { 2, gpsPositionQualityUUID }, + 0x01, + 0, + gpsPositionQuality + }/*, // Notifications are excluded + + // gpsPositionQuality Client Characteristic Configuration + { + { ATT_BT_UUID_SIZE, clientCharCfgUUID }, + GATT_PERMIT_READ | GATT_PERMIT_WRITE, + 0, + (uint8 *)gpsPositionQualityClientCharCfg + }*/ +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 gps_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t gps_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void gps_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Gps Profile Service Callbacks +const gattServiceCBs_t gpsCBs = +{ + gps_ReadAttrCB, // Read callback function pointer + gps_WriteAttrCB, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Gps_AddService + * + * @brief Initializes the Gps Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t Gps_AddService( uint32 services ) +{ + uint8 status = 0x00; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( 0xFFFF, gpsLocationAndSpeedClientCharCfg ); + + // Notifications are excluded + //GATTServApp_InitCharCfg( INVALID_CONNHANDLE, gpsPositionQualityClientCharCfg ); + GATTServApp_InitCharCfg( 0xFFFF, gpsDateTimeClientCharCfg ); + + // Register with Link DB to receive link status change callback + (void) linkDB_Register( gps_HandleConnStatusCB ); + + if ( services & 0x00000001 ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( gpsAttrTbl, + ( sizeof( gpsAttrTbl ) / sizeof( gattAttribute_t ) ), + &gpsCBs ); + } + + return ( status ); +} + +/********************************************************************* + * @fn Gps_SetParameter + * + * @brief Set a Gps Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gps_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + if ( len == sizeof(gpsFeatures) ) + { + (void) osal_memcpy( gpsFeatures, value, sizeof(gpsFeatures) ); + } + else + { + ret = 0x18; + } + break; + + case 1: + if ( len == sizeof(locationAndSpeed_t) ) + { + (void) osal_memcpy( gpsLocationAndSpeed, value, sizeof(locationAndSpeed_t) ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gpsLocationAndSpeedClientCharCfg, gpsLocationAndSpeed, 0, + gpsAttrTbl, ( sizeof( gpsAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + case 3: + if ( len == sizeof(date_time_t) ) + { + (void) osal_memcpy( gpsDateTime, value, sizeof(date_time_t) ); + + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( gpsDateTimeClientCharCfg, gpsDateTime, 0, + gpsAttrTbl, ( sizeof( gpsAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + case 2: + if ( len == sizeof(positionQuality_t) ) + { + (void) osal_memcpy( gpsPositionQuality, value, sizeof(positionQuality_t) ); + + // See if Notification has been enabled + // Notifications are excluded (https://developer.bluetooth.org) +/* GATTServApp_ProcessCharCfg( gpsPositionQualityClientCharCfg, gpsPositionQuality, FALSE, + gpsAttrTbl, GATT_NUM_ATTRS( gpsAttrTbl ), + INVALID_TASK_ID );*/ + } + else + { + ret = 0x18; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Gps_GetParameter + * + * @brief Get a Gps Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Gps_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + osal_memcpy (value, gpsFeatures, sizeof(gpsFeatures) ); + break; + + case 1: + osal_memcpy (value, gpsLocationAndSpeed, sizeof(locationAndSpeed_t) ); + break; + + case 3: + osal_memcpy (value, gpsDateTime, sizeof(date_time_t) ); + break; + + case 2: + osal_memcpy (value, gpsPositionQuality, sizeof(positionQuality_t) ); + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn gps_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 gps_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = 0x00; + + // If attribute permissions require authorization to read, return error + if ( ( (pAttr->permissions) & 0x10 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + if ( pAttr->type.len == 2 ) + { + // 16-bit UUID + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + case 0x2A6A: + *pLen = 4; + osal_memcpy( pValue, pAttr->pValue, 4 ); + break; + + case 0x2A67: + *pLen = sizeof(locationAndSpeed_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(locationAndSpeed_t) ); + break; + + case 0x2A08: + *pLen = sizeof(date_time_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(date_time_t) ); + break; + + case 0x2A69: + *pLen = sizeof(positionQuality_t); + osal_memcpy( pValue, pAttr->pValue, sizeof(positionQuality_t) ); + break; + + default: + // Should never get here! + *pLen = 0; + status = 0x0a; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = 0x01; + } + + return ( status ); +} + +/********************************************************************* + * @fn gps_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t gps_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = 0x00; + + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + case 0x2902: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, 0x0001 ); + break; + + default: + status = 0x0a; + break; + } + + return ( status ); +} + +/********************************************************************* + * @fn gps_HandleConnStatusCB + * + * @brief Gps Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void gps_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != 0xFFFE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == 1 ) || + ( ( changeType == 2 ) && + ( !linkDB_State( (connHandle), 0x01 ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, gpsLocationAndSpeedClientCharCfg ); + //GATTServApp_InitCharCfg( connHandle, gpsPositionQualityClientCharCfg ); + GATTServApp_InitCharCfg( connHandle, gpsDateTimeClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_adc.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_adc.i new file mode 100644 index 0000000..4a4f300 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_adc.i @@ -0,0 +1,1420 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_adc.c" +/************************************************************************************************** + Filename: hal_adc.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the HAL ADC. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_adc.c" + + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + + + + + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_adc.c" + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + + +static uint8 adcRef; + + +/************************************************************************************************** + * @fn HalAdcInit + * + * @brief Initialize ADC Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalAdcInit (void) +{ + + adcRef = 0x80; + +} + +/************************************************************************************************** + * @fn HalAdcRead + * + * @brief Read the ADC based on given channel and resolution + * + * @param channel - channel where ADC will be read + * @param resolution - the resolution of the value + * + * @return 16 bit value of the ADC in offset binary format. + * + * Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale. + * Note2: This function assumes that ADCCON3 contains the voltage reference. + **************************************************************************************************/ +uint16 HalAdcRead (uint8 channel, uint8 resolution) +{ + int16 reading = 0; + + + uint8 i, resbits; + uint8 adcChannel = 1; + + /* + * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled. The code + * does NOT disable the pin at the end of this function. I think it is better to leave the pin + * enabled because the results will be more accurate. Because of the inherent capacitance on the + * pin, it takes time for the voltage on the pin to charge up to its steady-state level. If + * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage + * than actuality because the pin did not have time to fully charge. + */ + if (channel < 8) + { + for (i=0; i < channel; i++) + { + adcChannel <<= 1; + } + } + + /* Enable channel */ + ADCCFG |= adcChannel; + + /* Convert resolution to decimation rate */ + switch (resolution) + { + case 0x01: + resbits = 0x00; + break; + case 0x02: + resbits = 0x10; + break; + case 0x03: + resbits = 0x20; + break; + case 0x04: + default: + resbits = 0x30; + break; + } + + /* writing to this register starts the extra conversion */ + ADCCON3 = channel | resbits | adcRef; + + /* Wait for the conversion to be done */ + while (!(ADCCON1 & 0x80)); + + /* Disable channel after done conversion */ + ADCCFG &= (adcChannel ^ 0xFF); + + /* Read the result */ + reading = (int16) (ADCL); + reading |= (int16) (ADCH << 8); + + /* Treat small negative as 0 */ + if (reading < 0) + reading = 0; + + switch (resolution) + { + case 0x01: + reading >>= 8; + break; + case 0x02: + reading >>= 6; + break; + case 0x03: + reading >>= 4; + break; + case 0x04: + default: + reading >>= 2; + break; + } + + + + + + + return ((uint16)reading); +} + +/************************************************************************************************** + * @fn HalAdcSetReference + * + * @brief Sets the reference voltage for the ADC and initializes the service + * + * @param reference - the reference voltage to be used by the ADC + * + * @return none + * + **************************************************************************************************/ +void HalAdcSetReference ( uint8 reference ) +{ + + adcRef = reference; + +} + +/********************************************************************* + * @fn HalAdcCheckVdd + * + * @brief Check for minimum Vdd specified. + * + * @param vdd - The board-specific Vdd reading to check for. + * + * @return TRUE if the Vdd measured is greater than the 'vdd' minimum parameter; + * FALSE if not. + * + *********************************************************************/ +bool HalAdcCheckVdd(uint8 vdd) +{ + ADCCON3 = 0x0F; + while (!(ADCCON1 & 0x80)); + return (ADCH > vdd); +} + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_aes.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_aes.i new file mode 100644 index 0000000..38d4567 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_aes.i @@ -0,0 +1,2586 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +/************************************************************************************************** + Filename: hal_aes.c + Revised: $Date: 2009-10-29 16:57:32 -0700 (Thu, 29 Oct 2009) $ + Revision: $Revision: 21020 $ + + Description: Support for Hardware AES encryption. + + Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 43 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.h" +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ + + + + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status + + + + +// Macro for setting the mode of the AES operation + + + + + +// AES Modes +#line 93 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.h" + +// Macro for issuing AES command + + + + + +// AES Commands + + + + + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. + + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ + + + +/* AES registers */ + + + +#line 125 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.h" + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macro for quickly setting the source address of a DMA structure. + + + + + + +// Macro for quickly setting the destination address of a DMA structure. + + + + + + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count + +// Transfer the first byte + the number of bytes indicated by the first byte + +// Transfer the number of bytes indicated by the first byte (starting with the first byte) + +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte + +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes + + + + + + + + + + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' + + + +// Bit fields of the 'ctrlA' + + + + +// Bit fields of the 'ctrlB' + + + + + + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + + + + + + + + + +/****************************************************************************** +******************************************************************************/ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" + +/****************************************************************************** + * MACROS + */ + +/****************************************************************************** + * CONSTANTS + */ + +/****************************************************************************** + * TYPEDEFS + */ + +/****************************************************************************** + * LOCAL VARIABLES + */ + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +void (*pSspAesEncrypt)( uint8 *, uint8 * ) = (void*)0; + +/****************************************************************************** + * FUNCTION PROTOTYPES + */ +void aesDmaInit( void ); + + +/****************************************************************************** + * @fn aesDmaInit + * + * @brief Initilize DMA for AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void aesDmaInit( void ) +{ + halDMADesc_t *ch; + + /* Fill in DMA channel 1 descriptor and define it as input */ + ch = (dmaCh1234+((1)-1)); + do { ch->dstAddrH = (uint8)((uint16)(0x70B1) >> 8); ch->dstAddrL = (uint8)((uint16)(0x70B1) & 0xFF); } while (91 == -1); /* Input of the AES module */ + do { ch->xferLenV &= ~0xE0; ch->xferLenV |= (0x00 << 5); } while (92 == -1); /* Using the length field */ + do { ch->ctrlA &= ~0x80; ch->ctrlA |= (0x00 << 7); } while (93 == -1); /* One byte is transferred each time */ + do { ch->ctrlA &= ~0x60; ch->ctrlA |= (0x00 << 5); } while (94 == -1); /* A single byte is transferred each time */ + do { ch->ctrlA &= ~0x1F; ch->ctrlA |= 29; } while (95 == -1); /* Setting the AES module to generate the DMA trigger */ + do { ch->ctrlB &= ~0xC0; ch->ctrlB |= (0x01 << 6); } while (96 == -1); /* The address for data fetch is incremented by 1 byte */ + do { ch->ctrlB &= ~0x30; ch->ctrlB |= (0x00 << 4); } while (97 == -1); /* The destination address is constant */ + do { ch->ctrlB &= ~0x08; ch->ctrlB |= (0x00 << 3); } while (98 == -1); /* The DMA complete interrupt flag is not set at completion */ + do { ch->ctrlB &= ~0x04; ch->ctrlB |= (0x00 << 2); } while (99 == -1); /* Transferring all 8 bits in each byte */ + do { ch->ctrlB &= ~0x03; ch->ctrlB |= 0x02; } while (100 == -1); /* DMA has priority */ + + /* Fill in DMA channel 2 descriptor and define it as output */ + ch = (dmaCh1234+((2)-1)); + do { ch->srcAddrH = (uint8)((uint16)(0x70B2) >> 8); ch->srcAddrL = (uint8)((uint16)(0x70B2) & 0xFF); } while (104 == -1); /* Start address of the segment */ + do { ch->xferLenV &= ~0xE0; ch->xferLenV |= (0x00 << 5); } while (105 == -1); /* Using the length field */ + do { ch->ctrlA &= ~0x80; ch->ctrlA |= (0x00 << 7); } while (106 == -1); /* One byte is transferred each time */ + do { ch->ctrlA &= ~0x60; ch->ctrlA |= (0x00 << 5); } while (107 == -1); /* A single byte is transferred each time */ + do { ch->ctrlA &= ~0x1F; ch->ctrlA |= 30; } while (108 == -1); /* Setting the AES module to generate the DMA trigger */ + do { ch->ctrlB &= ~0xC0; ch->ctrlB |= (0x00 << 6); } while (109 == -1); /* The address for data fetch is constant */ + do { ch->ctrlB &= ~0x30; ch->ctrlB |= (0x01 << 4); } while (110 == -1); /* The destination address is incremented by 1 byte */ + do { ch->ctrlB &= ~0x08; ch->ctrlB |= (0x00 << 3); } while (111 == -1); /* The DMA complete interrupt flag is not set at completion */ + do { ch->ctrlB &= ~0x04; ch->ctrlB |= (0x00 << 2); } while (112 == -1); /* Transferring all 8 bits in each byte */ + do { ch->ctrlB &= ~0x03; ch->ctrlB |= 0x02; } while (113 == -1); /* DMA has priority */ +} + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" + +/****************************************************************************** + * @fn AesLoadIV + * + * @brief Writes IV into the CC2540 + * + * input parameters + * + * @param IV - Pointer to IV. + * + * @return None + */ +void AesLoadIV( uint8 *IV ) +{ + + halDMADesc_t *ch = (dmaCh1234+((1)-1)); + + /* Modify descriptors for channel 1 */ + do { ch->srcAddrH = (uint8)((uint16)(IV) >> 8); ch->srcAddrL = (uint8)((uint16)(IV) & 0xFF); } while (234 == -1); + do { ch->xferLenL = (uint8)(uint16)(16); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)(16) >> 8); } while (235 == -1); + + /* Arm DMA channel 1 */ + DMAIRQ &= ~( 1 << (1) ); + DMAARM = (0x01 << (1)); + do { + asm("NOP"); + } while (!(DMAARM & (0x01 << (1)))); + + /* Set AES mode */ + do { ENCCS = (ENCCS & ~0x07) | (0x06); } while(0); + + /* Kick it off, block until AES is ready */ + ENCCS |= 0x01; + while( !(ENCCS & 0x08) ); +#line 257 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +} + +/****************************************************************************** + * @fn AesLoadKey + * + * @brief Writes the key into the CC2540 + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void AesLoadKey( uint8 *AesKey ) +{ + + halDMADesc_t *ch = (dmaCh1234+((1)-1)); + + /* Modify descriptors for channel 1 */ + do { ch->srcAddrH = (uint8)((uint16)(AesKey) >> 8); ch->srcAddrL = (uint8)((uint16)(AesKey) & 0xFF); } while (276 == -1); + do { ch->xferLenL = (uint8)(uint16)(16); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)(16) >> 8); } while (277 == -1); + + /* Arm DMA channel 1 */ + DMAIRQ &= ~( 1 << (1) ); + DMAARM = (0x01 << (1)); + do { + asm("NOP"); + } while (!(DMAARM & (0x01 << (1)))); + + /* Set AES mode */ + do { ENCCS = (ENCCS & ~0x07) | (0x04); } while(0); + + /* Kick it off, block until AES is ready */ + ENCCS |= 0x01; + while( !(ENCCS & 0x08) ); +#line 299 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +} + + +/****************************************************************************** + * @fn AesDmaSetup + * + * @brief Sets up DMA of 16 byte block using CC2540 HW aes encryption engine + * + * input parameters + * + * @param Cstate - Pointer to output data. + * @param msg_out_len - message out length + * @param msg_in - pointer to input data. + * @param msg_in_len - message in length + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void AesDmaSetup( uint8 *Cstate, uint16 msg_out_len, uint8 *msg_in, uint16 msg_in_len ) +{ + halDMADesc_t *ch; + + /* Modify descriptors for channel 1 */ + ch = (dmaCh1234+((1)-1)); + do { ch->srcAddrH = (uint8)((uint16)(msg_in) >> 8); ch->srcAddrL = (uint8)((uint16)(msg_in) & 0xFF); } while (327 == -1); + do { ch->xferLenL = (uint8)(uint16)(msg_in_len); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)(msg_in_len) >> 8); } while (328 == -1); + + /* Modify descriptors for channel 2 */ + ch = (dmaCh1234+((2)-1)); + do { ch->dstAddrH = (uint8)((uint16)(Cstate) >> 8); ch->dstAddrL = (uint8)((uint16)(Cstate) & 0xFF); } while (332 == -1); + do { ch->xferLenL = (uint8)(uint16)(msg_out_len); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)(msg_out_len) >> 8); } while (333 == -1); + + /* Arm DMA channels 1 and 2 */ + DMAIRQ &= ~( 1 << (1) ); + DMAARM = (0x01 << (1)); + do { + asm("NOP"); + } while (!(DMAARM & (0x01 << (1)))); + DMAIRQ &= ~( 1 << (2) ); + DMAARM = (0x01 << (2)); + do { + asm("NOP"); + } while (!(DMAARM & (0x01 << (2)))); +} + + +/****************************************************************************** + * @fn HalAesInit + * + * @brief Initilize AES engine + * + * input parameters + * + * @param None + * + * @return None + */ +void HalAesInit( void ) +{ + + /* Init DMA channels 1 and 2 */ + aesDmaInit(); + +} + +/****************************************************************************** + * @fn ssp_HW_KeyInit + * + * @brief Writes the key into AES engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * + * @return None + */ +void ssp_HW_KeyInit( uint8 *AesKey ) +{ + do { ENCCS = (ENCCS & ~0x70) | (0x40); } while (0); + AesLoadKey( AesKey ); +} + +/****************************************************************************** + * @fn sspAesEncryptHW + * + * @brief Encrypts 16 byte block using AES encryption engine + * + * input parameters + * + * @param AesKey - Pointer to AES Key. + * @param Cstate - Pointer to input data. + * + * output parameters + * + * @param Cstate - Pointer to encrypted data. + * + * @return None + * + */ +void sspAesEncryptHW( uint8 *AesKey, uint8 *Cstate ) +{ + (void)AesKey; + + + /* Setup DMA for AES encryption */ + AesDmaSetup( Cstate, 16, Cstate, 16 ); + do { ENCCS = (ENCCS & ~0x07) | (0x00); } while(0); + + /* Kick it off, block until DMA is done */ + ENCCS |= 0x01; + while( !(DMAIRQ & ( 1 << (2) )) ); +#line 422 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_aes.c" +} diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_crc.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_crc.i new file mode 100644 index 0000000..3875875 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_crc.i @@ -0,0 +1,1290 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_crc.c" +/************************************************************************************************** + Filename: _hal_crc.c + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file defines the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_crc.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_crc.h" +/************************************************************************************************** + Filename: hal_crc.h + Revised: $Date: 2012-12-04 18:36:53 -0800 (Tue, 04 Dec 2012) $ + Revision: $Revision: 32433 $ + + Description: This file declares the interface to the H/W CRC driver by LFSR. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void); + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch); + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed); + + +/************************************************************************************************** + */ +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_crc.c" + + +/************************************************************************************************** + * @fn HalCRCCalc + * + * @brief Calculate the H/W CRC result. + * + * input parameters + * + * None. + * + * output parameters + * + * None. + * + * @return The H/W CRC result. + */ +uint16 HalCRCCalc(void) +{ + uint16 crc = RNDH; + crc = (crc << 8) | RNDL; + + return crc; +} + +/************************************************************************************************** + * @fn HalCRCExec + * + * @brief Execute the H/W CRC calculation on the input byte. + * + * input parameters + * + * @param ch - The byte on which to execute the H/W CRC calculation. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCExec(uint8 ch) +{ + RNDH = ch; +} + +/************************************************************************************************** + * @fn HalCRCInit + * + * @brief Initialize the H/W for a new CRC calculation. + * + * input parameters + * + * @param seed - The CRC seed. + * + * output parameters + * + * None. + * + * @return None. + */ +void HalCRCInit(uint16 seed) +{ + ADCCON1 &= 0xF3; // CRC configuration of LRSR. + + RNDL = (((seed) >> 8) & 0xFF); + RNDL = ((seed) & 0xFF); +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_dma.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_dma.i new file mode 100644 index 0000000..8da507a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_dma.i @@ -0,0 +1,1690 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.c" +/************************************************************************************************** + Filename: hal_dma.c + Revised: $Date: 2012-07-18 12:44:06 -0700 (Wed, 18 Jul 2012) $ + Revision: $Revision: 30952 $ + + Description: This file contains the interface to the DMA. + + + Copyright 2009-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macro for quickly setting the source address of a DMA structure. + + + + + + +// Macro for quickly setting the destination address of a DMA structure. + + + + + + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count + +// Transfer the first byte + the number of bytes indicated by the first byte + +// Transfer the number of bytes indicated by the first byte (starting with the first byte) + +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte + +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes + + + + + + + + + + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' + + + +// Bit fields of the 'ctrlA' + + + + +// Bit fields of the 'ctrlB' + + + + + + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + + + + + + + + + +/****************************************************************************** +******************************************************************************/ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.c" + + + + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +halDMADesc_t dmaCh0; +halDMADesc_t dmaCh1234[4]; + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +void HalDmaInit( void ) +{ + do { DMA0CFGH = (uint8)( (uint16)(&dmaCh0) >> 8 ); DMA0CFGL = (uint8)( (uint16)(&dmaCh0) & 0xFF ); } while (73 == -1); + do { DMA1CFGH = (uint8)( (uint16)(dmaCh1234) >> 8 ); DMA1CFGL = (uint8)( (uint16)(dmaCh1234) & 0xFF); } while (74 == -1); + + + + DMAIE = 1; + +} + + + + +/****************************************************************************** + * @fn HalDMAInit + * + * @brief DMA Interrupt Service Routine + * + * @param None + * + * @return None + *****************************************************************************/ +_Pragma("vector=0x43") __near_func __interrupt void halDmaIsr(void); _Pragma("vector=0x43") __near_func __interrupt void halDmaIsr(void) +{ + { halIntState_t _isrIntState = EA; do { EA = 1; } while (96 == -1);; + + DMAIF = 0; + + + + if ((DMAIRQ & ( 1 << (4) ))) + { + DMAIRQ &= ~( 1 << (4) ); + extern void HalUARTIsrDMA(void); + HalUARTIsrDMA(); + } + + +#line 117 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.c" + + ; + EA = _isrIntState; }; + + return; +} + + + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_drivers.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_drivers.i new file mode 100644 index 0000000..e6b169b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_drivers.i @@ -0,0 +1,3646 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +/************************************************************************************************** + Filename: hal_drivers.c + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Drivers Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_aes.h" +/************************************************************************************************** + Filename: hal_aes.h + Revised: $Date: 2012-05-23 14:51:42 -0700 (Wed, 23 May 2012) $ + Revision: $Revision: 30615 $ + + Description: Support for HW/SW AES encryption. + + + Copyright 2007-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/* AES Engine is default to hardware AES. To turn on software AES, #define one of the followings: + * #define SOFTWARE_AES TRUE, uses software aes ( slowest setting ) + * #define SW_AES_AND_KEY_EXP TRUE, enables software aes with key expansion ( improves speed at the cost of 176 bytes of data (RAM) ) + */ + + + + +extern void HalAesInit( void ); +extern void AesLoadBlock( uint8 * ); +extern void AesStartBlock( uint8 *, uint8 * ); +extern void AesStartShortBlock( uint8 *, uint8 * ); +extern void AesLoadIV(uint8 *); +extern void AesDmaSetup( uint8 *, uint16, uint8 *, uint16 ); +extern void AesLoadKey( uint8 * ); + +extern void (*pSspAesEncrypt)( uint8 *, uint8 * ); +extern void ssp_HW_KeyInit (uint8 *); +extern void sspKeyExpansion (uint8 *, uint8 *); + +extern void sspAesEncryptHW (uint8 *, uint8 *); +extern void sspAesEncryptKeyExp (uint8 *, uint8 *); +extern void sspAesEncryptBasic (uint8 *, uint8 *); + +extern void sspAesDecryptHW( uint8 *, uint8 * ); +extern void sspAesDecrypt( uint8 *key, uint8 *buf ); + +// AES Status + + + + +// Macro for setting the mode of the AES operation + + + + + +// AES Modes +#line 93 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_aes.h" + +// Macro for issuing AES command + + + + + +// AES Commands + + + + + +// Macro for starting the AES module for either encryption, decryption, +// key or initialisation vector loading. + + +/* Used by DMA macros to shift 1 to create a mask for DMA registers. */ + + + +/* AES registers */ + + + +#line 125 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_aes.h" + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_dma.h" +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macro for quickly setting the source address of a DMA structure. + + + + + + +// Macro for quickly setting the destination address of a DMA structure. + + + + + + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count + +// Transfer the first byte + the number of bytes indicated by the first byte + +// Transfer the number of bytes indicated by the first byte (starting with the first byte) + +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte + +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes + + + + + + + + + + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' + + + +// Bit fields of the 'ctrlA' + + + + +// Bit fields of the 'ctrlB' + + + + + + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + + + + + + + + + +/****************************************************************************** +******************************************************************************/ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" +/************************************************************************************************** + Filename: hal_lcd.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LCD Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* These are used to specify which line the text will be printed */ + + +/* + This to support LCD with extended number of lines (more than 2). + Don't use these if LCD doesn't support more than 2 lines +*/ +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize LCD Service + */ +extern void HalLcdInit(void); + +/* + * Write a string to the LCD + */ +extern void HalLcdWriteString ( char *str, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteScreen( char *line1, char *line2 ); + +/* + * Write a string followed by a value to the LCD + */ +extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ); + +/* + * Write a string followed by 2 values to the LCD + */ +extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line ); + +/* + * Write a percentage bar to the LCD + */ +extern void HalLcdDisplayPercentBar( char *title, uint8 value ); + + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" +/************************************************************************************************** + Filename: hal_timer.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + + + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ +/* Timer ID definitions */ + + + + + + +/* Operation Modes for timer */ + + + + +/* Timer1 channels */ + + + + + + +/* Channel definitions */ +#line 95 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 0 Channel compare mode definitions */ +#line 103 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer 1 Channel 1-5 channel compare mode definitions */ + + + + + // compare, clear on 0. + + // on compare, set on 0 + + + + + +/* Timer 1 Capture mode */ + + + + + + +/* Channel mode definitions */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Error Code */ +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 16bit timer1 and timer3 */ +#line 150 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer0 and timer2 */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + +/* Timer clock pre-scaler definitions for 8bit timer2 */ +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_timer.h" + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ +typedef void (*halTimerCBack_t) (uint8 timerId, uint8 channel, uint8 channelMode); + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/* + * Initialize Timer Service + */ +extern void HalTimerInit ( void ); + +/* + * Configure channel in different modes + */ +extern uint8 HalTimerConfig ( uint8 timerId, + uint8 opMode, + uint8 channel, + uint8 channelMode, + bool intEnable, + halTimerCBack_t cback ); + +/* + * Start a Timer + */ +extern uint8 HalTimerStart ( uint8 timerId, uint32 timePerTick ); + +/* + * Stop a Timer + */ +extern uint8 HalTimerStop ( uint8 timerId ); + + +/* + * This is used for polling, provide the tick increment + */ +extern void HalTimerTick ( void ); + +/* + * Enable and disable particular timer + */ +extern uint8 HalTimerInterruptEnable (uint8 timerId, uint8 channelMode, bool enable); + +/* + * Configures timer 1 to control 4 PWM outputs + */ +void HalTimer1Init (halTimerCBack_t cBack); + + +/* + * Set dutycycle on timer 1 PWM output channel + */ +void halTimer1SetChannelDuty (uint8 channel, uint16 promill); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 62 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 66 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +uint8 Hal_TaskID; + +extern void HalLedUpdate( void ); /* Notes: This for internal only so it shouldn't be in hal_led.h */ + +/************************************************************************************************** + * @fn Hal_Init + * + * @brief Hal Initialization function. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_Init( uint8 task_id ) +{ + /* Register task ID */ + Hal_TaskID = task_id; + + + + +} + +/************************************************************************************************** + * @fn Hal_DriverInit + * + * @brief Initialize HW - These need to be initialized before anyone. + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void HalDriverInit (void) +{ + /* TIMER */ + + + + /* ADC */ + + HalAdcInit(); + + + /* DMA */ + + // Must be called before the init call to any module that uses DMA. + HalDmaInit(); + + + /* AES */ + + HalAesInit(); + + + /* LCD */ + + + + + /* LED */ + + + + + /* UART */ + + HalUARTInit(); + + + /* KEY */ + + + + + /* HID */ + + + +} + +/************************************************************************************************** + * @fn Hal_ProcessEvent + * + * @brief Hal Process Event + * + * @param task_id - Hal TaskId + * events - events + * + * @return None + **************************************************************************************************/ +uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) +{ + uint8 *msgPtr; + + (void)task_id; // Intentionally unreferenced parameter + + if ( events & 0x8000 ) + { + msgPtr = osal_msg_receive(Hal_TaskID); + + while (msgPtr) + { + /* Do something here - for now, just deallocate the msg and move on */ + + /* De-allocate */ + osal_msg_deallocate( msgPtr ); + /* Next */ + msgPtr = osal_msg_receive( Hal_TaskID ); + } + return events ^ 0x8000; + } + +#line 195 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" + +#line 203 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" + + if ( events & 0x0020 ) + { + + + + return events ^ 0x0020; + } + + if (events & 0x0010) + { +#line 224 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" + return events ^ 0x0010; + } + +#line 250 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\common\\hal_drivers.c" + + return 0; +} + +/************************************************************************************************** + * @fn Hal_ProcessPoll + * + * @brief This routine will be called by OSAL to poll UART, TIMER... + * + * @param task_id - Hal TaskId + * + * @return None + **************************************************************************************************/ +void Hal_ProcessPoll () +{ + /* UART Poll */ + + HalUARTPoll(); + + + /* HID poll */ + + + + + + + + +} + +/************************************************************************************************** +**************************************************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_flash.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_flash.i new file mode 100644 index 0000000..1c2ad3e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_flash.i @@ -0,0 +1,1632 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_flash.c" +/************************************************************************************************** + Filename: _hal_flash.c + Revised: $Date: 2010-07-06 15:24:36 -0700 (Tue, 06 Jul 2010) $ + Revision: $Revision: 22897 $ + + Description: This file contains the interface to the H/W Flash driver. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_flash.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macro for quickly setting the source address of a DMA structure. + + + + + + +// Macro for quickly setting the destination address of a DMA structure. + + + + + + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count + +// Transfer the first byte + the number of bytes indicated by the first byte + +// Transfer the number of bytes indicated by the first byte (starting with the first byte) + +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte + +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes + + + + + + + + + + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' + + + +// Bit fields of the 'ctrlA' + + + + +// Bit fields of the 'ctrlB' + + + + + + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + + + + + + + + + +/****************************************************************************** +******************************************************************************/ +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_flash.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_flash.h" +/************************************************************************************************** + Filename: hal_flash.h + Revised: $Date:$ + Revision: $Revision:$ + + Description: This file contains the interface to the Flash Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_flash.h" + + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128). + * @param offset - Valid offset into the page (so < HAL_NV_PAGE_SIZE and byte-aligned is ok). + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to read: a read cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to write: a write cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases 'cnt' pages of the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128) to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg); + + + + + + + +/************************************************************************************************** +*/ +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_flash.c" + + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number. + * @param offset - A valid offset into the page. + * @param buf - A valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - A valid number of bytes to read. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) +{ + // Calculate the offset into the containing flash bank as it gets mapped into XDATA. + uint8 *ptr = (uint8 *)(offset + 0x8000) + + ((pg % 16) * 2048); + uint8 memctr = MEMCTR; // Save to restore. + + + halIntState_t is; + + + pg /= 16; // Calculate the flash bank from the flash page. + + + do { is = EA; do { EA = 0; } while (83 == -1); } while (83 == -1); + + + // Calculate and map the containing flash bank into XDATA. + MEMCTR = (MEMCTR & 0xF8) | pg; + + while (cnt--) + { + *buf++ = *ptr++; + } + + MEMCTR = memctr; + + + do { EA = is; } while (97 == -1); + +} + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function writes 'cnt' bytes to the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as 'cnt' X 4. + * @param cnt - Number of 4-byte blocks to write. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt) +{ + + halDMADesc_t *ch = &dmaCh0; + + do { ch->srcAddrH = (uint8)((uint16)(buf) >> 8); ch->srcAddrL = (uint8)((uint16)(buf) & 0xFF); } while (124 == -1); + do { ch->dstAddrH = (uint8)((uint16)(&((unsigned char volatile __xdata *) 0)[0x6273]) >> 8); ch->dstAddrL = (uint8)((uint16)(&((unsigned char volatile __xdata *) 0)[0x6273]) & 0xFF); } while (125 == -1); + do { ch->xferLenV &= ~0xE0; ch->xferLenV |= (0x00 << 5); } while (126 == -1); + do { ch->xferLenL = (uint8)(uint16)((cnt * 4)); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)((cnt * 4)) >> 8); } while (127 == -1); + do { ch->ctrlA &= ~0x80; ch->ctrlA |= (0x00 << 7); } while (128 == -1); + do { ch->ctrlA &= ~0x60; ch->ctrlA |= (0x00 << 5); } while (129 == -1); + do { ch->ctrlA &= ~0x1F; ch->ctrlA |= 18; } while (130 == -1); + do { ch->ctrlB &= ~0xC0; ch->ctrlB |= (0x01 << 6); } while (131 == -1); + do { ch->ctrlB &= ~0x30; ch->ctrlB |= (0x00 << 4); } while (132 == -1); + // The DMA is to be polled and shall not issue an IRQ upon completion. + do { ch->ctrlB &= ~0x08; ch->ctrlB |= (0x00 << 3); } while (134 == -1); + do { ch->ctrlB &= ~0x04; ch->ctrlB |= (0x00 << 2); } while (135 == -1); + do { ch->ctrlB &= ~0x03; ch->ctrlB |= 0x02; } while (136 == -1); + DMAIRQ &= ~( 1 << (0) ); + DMAARM = (0x01 << (0)); + + ((unsigned char volatile __xdata *) 0)[0x6271] = (uint8)addr; + ((unsigned char volatile __xdata *) 0)[0x6272] = (uint8)(addr >> 8); + ((unsigned char volatile __xdata *) 0)[0x6270] |= 0x02; // Trigger the DMA writes. + while (((unsigned char volatile __xdata *) 0)[0x6270] & 0x80); // Wait until writing is done. + +} + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases the specified page of the internal flash. + * + * input parameters + * + * @param pg - A valid flash page number to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg) +{ + ((unsigned char volatile __xdata *) 0)[0x6272] = pg * (2048 / 4 / 256); + ((unsigned char volatile __xdata *) 0)[0x6270] |= 0x01; +} + +/************************************************************************************************** +*/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_key.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_key.i new file mode 100644 index 0000000..0cc0af5 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_key.i @@ -0,0 +1,2368 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" +/************************************************************************************************** + Filename: hal_key.c + Revised: $Date: 2012-12-06 14:00:35 -0800 (Thu, 06 Dec 2012) $ + Revision: $Revision: 32474 $ + + Description: This file contains the interface to the HAL KEY Service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ +/********************************************************************* + NOTE: If polling is used, the hal_driver task schedules the KeyRead() + to occur every 100ms. This should be long enough to naturally + debounce the keys. The KeyRead() function remembers the key + state of the previous poll and will only return a non-zero + value if the key state changes. + + NOTE: If interrupts are used, the KeyRead() function is scheduled + 25ms after the interrupt occurs by the ISR. This delay is used + for key debouncing. The ISR disables any further Key interrupt + until KeyRead() is executed. KeyRead() will re-enable Key + interrupts after executing. Unlike polling, when interrupts + are enabled, the previous key state is not remembered. This + means that KeyRead() will return the current state of the keys + (not a change in state of the keys). + + NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by + the ISR. Therefore, the joystick movements will only be detected + during a pushbutton interrupt caused by S1 or the center joystick + pushbutton. + + NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally + high state to a low state. This transition is typically clean. The + duration of the low state is around 200ms. When the signal returns + to the high state, there is a high likelihood of signal bounce, which + causes a unwanted interrupts. Normally, we would set the interrupt + edge to falling edge to generate an interrupt when S1 is pushed, but + because of the signal bounce, it is better to set the edge to rising + edge to generate an interrupt when S1 is released. The debounce logic + can then filter out the signal bounce. The result is that we typically + get only 1 interrupt per button push. This mechanism is not totally + foolproof because occasionally, signal bound occurs during the falling + edge as well. A similar mechanism is used to handle the joystick + pushbutton on the DB. For the EB, we do not have independent control + of the interrupt edge for the S1 and center joystick pushbutton. As + a result, only one or the other pushbuttons work reasonably well with + interrupts. The default is the make the S1 switch on the EB work more + reliably. + +*********************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 87 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 88 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 90 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" + +#line 645 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_key.c" + +void HalKeyInit(void){} +void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){} +uint8 HalKeyRead(void){ return 0;} +void HalKeyPoll(void){} + + +/************************************************************************************************** +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_lcd.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_lcd.i new file mode 100644 index 0000000..70205b8 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_lcd.i @@ -0,0 +1,2725 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +/************************************************************************************************** + Filename: hal_lcd.c + Revised: $Date: 2012-08-03 14:28:46 -0700 (Fri, 03 Aug 2012) $ + Revision: $Revision: 31092 $ + + Description: This file contains the interface to the HAL LCD Service. + + + Copyright 2007 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" +/************************************************************************************************** + Filename: hal_lcd.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LCD Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + +// Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* These are used to specify which line the text will be printed */ + + +/* + This to support LCD with extended number of lines (more than 2). + Don't use these if LCD doesn't support more than 2 lines +*/ +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize LCD Service + */ +extern void HalLcdInit(void); + +/* + * Write a string to the LCD + */ +extern void HalLcdWriteString ( char *str, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteScreen( char *line1, char *line2 ); + +/* + * Write a string followed by a value to the LCD + */ +extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ); + +/* + * Write a string followed by 2 values to the LCD + */ +extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line ); + +/* + * Write a percentage bar to the LCD + */ +extern void HalLcdDisplayPercentBar( char *title, uint8 value ); + + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + + + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ +/* + LCD pins + + //control + P0.0 - LCD_MODE + P1.1 - LCD_FLASH_RESET + P1.2 - LCD_CS + + //spi + P1.5 - CLK + P1.6 - MOSI + P1.7 - MISO +*/ + +/* LCD Max Chars and Buffer */ + + + +/* LCD Control lines */ + + + + + + + + + +/* LCD SPI lines */ + + + + + + + + + +/* SPI settings */ + + + + +/* LCD lines */ + + +/* Defines for HW LCD */ + +/* Set power save mode */ + + + + + + +/* Function Set */ +#line 119 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + +/* Set Display Start Line */ + + + + + + +/* Bias control */ + + + + +/* Power control */ + + + + + + +// Set display control +#line 147 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + +/* Set DD/ CGRAM address */ + + + +/* Set ICONRAM address */ + + + +/* Set double height */ + + + + + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + + + + + + + + + + + + + +/* SPI interface control */ +#line 189 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +/* clear the received and transmit byte status, write tx data to buffer, wait till transmit done */ + + + + +/* Control macros */ + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ +#line 223 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + +/************************************************************************************************** + * @fn HalLcdInit + * + * @brief Initilize LCD Service + * + * @param None + * + * @return None + **************************************************************************************************/ +void HalLcdInit(void) +{ + + + + +} + +/************************************************************************************************* + * LCD EMULATION FUNCTIONS + * + * Some evaluation boards are equipped with Liquid Crystal Displays + * (LCD) which may be used to display diagnostic information. These + * functions provide LCD emulation, sending the diagnostic strings + * to Z-Tool via the RS232 serial port. These functions are enabled + * when the "LCD_SUPPORTED" compiler flag is placed in the makefile. + * + * Most applications update both lines (1 and 2) of the LCD whenever + * text is posted to the device. This emulator assumes that line 1 is + * updated first (saved locally) and the formatting and send operation + * is triggered by receipt of line 2. Nothing will be transmitted if + * only line 1 is updated. + * + *************************************************************************************************/ + + +/************************************************************************************************** + * @fn HalLcdWriteString + * + * @brief Write a string to the LCD + * + * @param str - pointer to the string that will be displayed + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteString ( char *str, uint8 option) +{ +#line 328 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + +} + +/************************************************************************************************** + * @fn HalLcdWriteValue + * + * @brief Write a value to the LCD + * + * @param value - value that will be displayed + * radix - 8, 10, 16 + * option - display options + * + * @return None + **************************************************************************************************/ +void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option) +{ +#line 350 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +} + +/************************************************************************************************** + * @fn HalLcdWriteScreen + * + * @brief Write a value to the LCD + * + * @param line1 - string that will be displayed on line 1 + * line2 - string that will be displayed on line 2 + * + * @return None + **************************************************************************************************/ +void HalLcdWriteScreen( char *line1, char *line2 ) +{ + + + + +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value - value + * format - redix + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ) +{ +#line 396 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +} + +/************************************************************************************************** + * @fn HalLcdWriteStringValue + * + * @brief Write a string followed by a value to the LCD + * + * @param title - Title that will be displayed before the value + * value1 - value #1 + * format1 - redix of value #1 + * value2 - value #2 + * format2 - redix of value #2 + * line - line number + * + * @return None + **************************************************************************************************/ +void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, + uint16 value2, uint8 format2, uint8 line ) +{ + +#line 441 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" +} + +/************************************************************************************************** + * @fn HalLcdDisplayPercentBar + * + * @brief Display percentage bar on the LCD + * + * @param title - + * value - + * + * @return None + **************************************************************************************************/ +void HalLcdDisplayPercentBar( char *title, uint8 value ) +{ +#line 490 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + +} + + +#line 761 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\WIMU3\\BLE\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_lcd.c" + + +/************************************************************************************************** +**************************************************************************************************/ + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_led.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_led.i new file mode 100644 index 0000000..5312cba --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_led.i @@ -0,0 +1,2353 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +/************************************************************************************************** + Filename: hal_led.c + Revised: $Date: 2012-10-26 14:09:08 -0700 (Fri, 26 Oct 2012) $ + Revision: $Revision: 31932 $ + + Description: This file contains the interface to the HAL LED Service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +/* LED control structure */ +typedef struct { + uint8 mode; /* Operation mode */ + uint8 left; /* Blink cycles left */ + uint8 onPct; /* On cycle percentage */ + uint16 time; /* On/off cycle time (msec) */ + uint32 next; /* Time for next change */ +} HalLedControl_t; + +typedef struct +{ + HalLedControl_t HalLedControlTable[4]; + uint8 sleepActive; +} HalLedStatus_t; + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + +static uint8 HalLedState; // LED state at last set/clr/blink update + + + + + + + + + + + +/*************************************************************************************************** + * LOCAL FUNCTION + ***************************************************************************************************/ + + + + + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ + +/*************************************************************************************************** + * @fn HalLedInit + * + * @brief Initialize LED Service + * + * @param init - pointer to void that contains the initialized value + * + * @return None + ***************************************************************************************************/ +void HalLedInit (void) +{ +#line 126 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" +} + +/*************************************************************************************************** + * @fn HalLedSet + * + * @brief Tun ON/OFF/TOGGLE given LEDs + * + * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE + * mode - BLINK, FLASH, TOGGLE, ON, OFF + * @return None + ***************************************************************************************************/ +uint8 HalLedSet (uint8 leds, uint8 mode) +{ + +#line 191 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) mode; + + + return ( HalLedState ); +} + +/*************************************************************************************************** + * @fn HalLedBlink + * + * @brief Blink the leds + * + * @param leds - bit mask value of leds to be blinked + * numBlinks - number of blinks + * percent - the percentage in each period where the led + * will be on + * period - length of each cycle in milliseconds + * + * @return None + ***************************************************************************************************/ +void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) +{ +#line 263 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + // HAL LED is disabled, suppress unused argument warnings + (void) leds; + (void) numBlinks; + (void) percent; + (void) period; + +} + +#line 438 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + +/*************************************************************************************************** + * @fn HalGetLedState + * + * @brief Dim LED2 - Dim (set level) of LED2 + * + * @param none + * + * @return led state + ***************************************************************************************************/ +uint8 HalLedGetState () +{ + + + + return 0; + +} + +/*************************************************************************************************** + * @fn HalLedEnterSleep + * + * @brief Store current LEDs state before sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedEnterSleep( void ) +{ + + + + + +#line 484 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + +} + +/*************************************************************************************************** + * @fn HalLedExitSleep + * + * @brief Restore current LEDs state after sleep + * + * @param none + * + * @return none + ***************************************************************************************************/ +void HalLedExitSleep( void ) +{ +#line 505 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_led.c" + + + + + +} + +/*************************************************************************************************** +***************************************************************************************************/ + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_sleep.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_sleep.i new file mode 100644 index 0000000..b5d191e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_sleep.i @@ -0,0 +1,3884 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +/******************************************************************************* + Filename: hal_sleep.c + Revised: $Date: 2013-03-07 06:38:43 -0800 (Thu, 07 Mar 2013) $ + Revision: $Revision: 33411 $ + + Description: This module contains the HAL power management procedures for + the CC2540. + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_PwrMgr.h" +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ + + + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_sleep.h" +/******************************************************************************* + Filename: ll_sleep.h + Revised: $Date: 2013-02-27 09:25:28 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33310 $ + + Description: This file contains the Link Layer (LL) types, constants, + API's etc. for Sleep Management for the Bluetooth Low Energy + (ULE) Controller + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_sleep.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// NanoRisc Execution Mode + + + +// Sleep Management + + + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +extern volatile __data unsigned char phyState; +extern volatile __data unsigned char clkState; + +/******************************************************************************* + * API + */ + +extern __near_func void HaltMcuUsingPhyFlag(void); +// +extern __near_func void LL_TimeToNextRfEvent( uint32 *sleepTimer, uint32 *timeout ); +extern __near_func uint8 LL_PowerOffReq( uint8 mode ); +extern __near_func void LL_PowerOnReq( uint8 wakeFromPM3, uint8 wakeForRF ); + + + + + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_timer2.h" +/******************************************************************************* + Filename: ll_timer2.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Link + Layer (LL) software timer management software for Timer2. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + + + + + + +/******************************************************************************* + * CONSTANTS + */ + +// Timer 2 Control Register + + + +/* +** Timer 2 Multiplex Select +*/ + + + + + +// + + + + + + +/* +** Timer 2 Interrupt Masks and Flags +*/ + + + +// + + + +// + + + + + +/* +** Timer 2 Interrupt Masks +*/ + + + +// + + + +// + + + + + +/* +** Timer 2 Event Configuration +*/ + + + +// + + + +// +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_timer2.h" +// + + + +// + + + +// +#line 150 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_timer2.h" + +/* +** Timer 2 Miscellanous +*/ + +#line 162 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_timer2.h" + +/******************************************************************************* + * TYPEDEFS + */ + +/* +** Anchor Point +*/ +typedef struct +{ + uint32 coarse; // number of 625us ticks at SFD capture + uint16 fine; // number of 31.25ns ticks at SFD capture +} sysTime_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern void llInitTimer2( void ); +extern void llStopTimer2( void ); +extern void llStartTimer2( void ); +extern void llSetT2C1Timeout( uint16 timeout ); +extern void llSetT2C2Timeout( uint16 timeout ); +extern void llSetT2OVFC1Timeout( uint32 timeout ); +extern void llSetT2OVFC2Timeout( uint32 timeout ); +extern void llSetT2LongC1Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2LongC2Timeout( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2C1Event1( uint16 timeout ); +extern void llSetT2OVFC1Event1( uint32 timeout ); +extern void llSetT2LongC1Event1( uint32 timeout1, uint16 timeout2 ); +extern void llSetT2OVFC2Event2( uint32 timeout ); +extern void llSetT2Delta( uint16 count ); +extern void llDisableT2Ints( void ); +extern void llDisableT2IntsEvts( void ); +extern void llDisableT2E1( void ); +extern void llGetTimer2Capture( uint32 *coarseTime, uint16 *fineTime ); +extern uint32 llGetCurrentTime( void ); +extern uint16 llGetCurrentFineTime( void ); +extern void llGetFullCurrentTime( uint32 *coarse, uint16 *fine ); +//extern void llGetFullCTandST( uint32 *coarseTime, uint16 *fineTime, uint32 *sleepTime ); +extern void llGetFullCTandST( sysTime_t *curTime, uint32 *sleepTime ); +extern uint32 llGetT2OVFC1( void ); +extern uint32 llGetT2OVFC2( void ); +extern uint16 ll_McuPrecisionCount( void ); +// +extern __near_func uint8 ll24BitTimeCompare( uint32 time1, uint32 time2 ); +extern __near_func uint32 ll24BitTimeDelta( uint32 time1, uint32 time2 ); +extern __near_func uint32 ll24BitAbsTimeDelta( uint32 time1, uint32 time2 ); +extern __near_func void llAdjustTimeForward( sysTime_t *curTime, sysTime_t *adjTime ); +extern __near_func void llAdjustTimeBackward( sysTime_t *curTime, sysTime_t *adjTime ); + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll_math.h" +/******************************************************************************* + Filename: ll_math.h + Revised: $Date: 2011-02-17 15:41:10 -0800 (Thu, 17 Feb 2011) $ + Revision: $Revision: 25131 $ + + Description: This file contains the types, contants, API's etc. for math + routines. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +extern __near_func uint32 llDivide31By16To16( uint32 dividend, + uint16 divisor ); + + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" + +/******************************************************************************* + * MACROS + */ + + +// Set CC2540 power mode; always use PM2. +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" + +// sleep timer interrupt control + + + + +// backup interrupt enable registers before sleep +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" + +// restore interrupt enable registers before sleep + + + + + + +// convert msec to 625 usec units with round + + +// convert msec to 32kHz units without round : the ratio of 32 kHz ticks to +// msec ticks is 32768/1000 = 32.768 or 4096/125 + + +// max allowed sleep time in ms +// Note: When OSAL timer was updated to 32 bits, the call to halSleep was +// changed to take a 32-bit osal_timeout value. But since the CC2540 +// previously used a 16 bit ll_McuPrecisionCount, halSleep was modified +// to limit osal_timeout to 16 bits as well (please see SVN rev. 27618). +// However, the max value of the 16 bit ll_McuPrecisionCount is about 41s, +// which is shorter than the max sleep time of 65.535s! So it is possible +// Timer2 rollover could occur during sleep, which could affect when an +// OSAL timer event is generated. The OSAL timer software should +// be updated to use the full 24bit value of Timer2, allowing timer +// events of up to 2.9 hours, but until this can be done properly, the +// max sleep duration will be limited to less than ll_McuPrecisionCount. +// Note: Not an issue for BLE as the max sleep time would have to be less +// than 32s. + + +/******************************************************************************* + * CONSTANTS + */ + +// POWER CONSERVATION DEFINITIONS +// Sleep mode H/W definitions (enabled with POWER_SAVING compile option). + + + + + +// HAL power management mode is set according to the power management state. +// The default setting is HAL_SLEEP_OFF. The actual value is tailored to +// different HW platform. Both HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections +// will turn off the system clock, and halt the MCU. HAL_SLEEP_TIMER can be +// woken up by sleep timer interrupt, I/O interrupt and reset. HAL_SLEEP_DEEP +// can be woken up by I/O interrupt and reset. + + + + +// MAX_SLEEP_TIME calculation: +// Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds +// Round it to 510 seconds or 510000 ms + + +// Minimum time to sleep: +// 1. avoid thrashing in-and-out of sleep with short OSAL timer +// 2. define minimum safe sleep period + + + + +// This value is used to adjust the sleep timer compare value such that the +// sleep timer compare takes into account the amount of processing time spent in +// function halSleep(). The first value is determined by measuring the number of +// sleep timer ticks from the beginning of the function to entering sleep mode. +// The second value is determined by measuring the number of sleep timer ticks +// from exit of sleep mode to the call to osal_adjust_timers(). + + + + + + +// sleep and external interrupt port masks + + + + + +// for optimized indexing of uint32 +#line 193 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_sleep.c" + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +// HAL power management mode is set according to the power management state. +static uint8 halPwrMgtMode = 0; + +// Flag to indicate if wake is due to impending radio event. +static uint8 wakeForRF; + + + + + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +// PCON register value to program when setting power mode +volatile __data uint8 halSleepPconValue = (1 << (0)); + +/******************************************************************************* + * Prototypes + */ + +// The PCON instruction must be 4-byte aligned. The following code may cause +// excessive power consumption if not aligned. See linker file ".xcl" for +// actual placement. +#pragma location = "SLEEP_CODE" +void halSetSleepMode(void); + +void halSleepSetTimer( uint32 sleepTime, uint32 timeout ); +uint32 halSleepReadTimer( void ); +uint32 TimerElapsed( void ); + +/******************************************************************************* + * @fn halSleep + * + * @brief This function put the CC2540 to sleep. The PCON instruction must + * be 4-byte aligned. The following code may cause excessive power + * consumption if not aligned. See linker file ".xcl" for actual + * placement. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +#pragma optimize=none +void halSetSleepMode(void) +{ + // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT! + PCON = halSleepPconValue; + // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq(). + do { EA = 0; } while (257 == -1); +} + +/******************************************************************************* + * @fn halSleep + * + * @brief This function is called from the OSAL task loop using and + * existing OSAL interface. It sets the low power mode of the LL + * and the CC2540. + * + * input parameters + * + * @param osal_timeout - Next OSAL timer timeout, in msec. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleep( uint32 osal_timeout ) +{ + uint32 timeout; + uint32 llTimeout; + uint32 sleepTimer; + + + + + + + // max allowed sleep time in ms + if (osal_timeout > 40000) + { + osal_timeout = 40000; + } + + // get LL timeout value already converted to 32kHz ticks + LL_TimeToNextRfEvent( &sleepTimer, &llTimeout ); + + // check if no OSAL timeout + // Note: If the next wake event is due to an OSAL timeout, then wakeForRF + // will already be FALSE, and the call to LL_TimeToNExtRfEvent will + // already have taken a snapshot of the Sleep Timer. + if (osal_timeout == 0) + { + // use common variable + timeout = llTimeout; + + // check if there's time before the next radio event + // Note: Since the OSAL timeout is zero, then if the radio timeout is + // not zero, the next wake (if one) will be due to the radio event. + wakeForRF = (timeout != 0) ? 1 : 0; + } + else // OSAL timeout is non-zero + { + // convet OSAL timeout to sleep time + // Note: Could be early by one 32kHz timer tick due to rounding. + timeout = ((((uint32) (osal_timeout)) * 4096) / 125); + + // so check time to radio event is non-zero, and if so, use shorter value + if ((llTimeout != 0) && (llTimeout < timeout)) + { + // use common variable + timeout = llTimeout; + + // the next ST wake time is due to radio + wakeForRF = 1; + } + else // OSAL timeout will be used to wake + { + // so take a snapshot of the sleep timer for sleep based on OSAL timeout + sleepTimer = halSleepReadTimer(); + + // the next ST wake time is not due to radio + wakeForRF = 0; + } + } + + // HAL_SLEEP_PM3 is entered only if the timeout is zero + halPwrMgtMode = (timeout == 0) ? 3 : 2; + + + + + + + // check if sleep should be entered + if ( (timeout > 66) || (timeout == 0) ) + { + halIntState_t ien0, ien1, ien2; + + + + + + + ; + do { EA = 0; } while (355 == -1); + + // check if radio allows sleep, and if so, preps system for shutdown + if ( LL_PowerOffReq(halPwrMgtMode) == 0 ) + { + + + + + + + + + // use this to turn LEDs off during sleep + HalLedEnterSleep(); + + + // enable sleep timer interrupt + if (timeout != 0) + { + // check if the time to next wake event is greater than max sleep time + if (timeout > 16711680 ) + { + // it is, so limit to max allowed sleep time (~510s) + halSleepSetTimer( sleepTimer, 16711680 ); + } + else // not more than allowed sleep time + { + // so set sleep time to actual amount + halSleepSetTimer( sleepTimer, timeout ); + } + } + + // prep CC254x power mode + do { SLEEPCMD &= ~((1 << (1)) | (1 << (0))); SLEEPCMD |= halPwrMgtMode; while (!(STLOAD & (1 << (0)))); halSleepPconValue = (1 << (0)); } while (389 == -1); + + // save interrupt enable registers and disable all interrupts + do { (ien0) = IEN0; (ien1) = IEN1; (ien2) = IEN2; IEN0 &= (1 << (5)); IEN1 &= (1 << (5)); IEN2 &= ((1 << (4))|(1 << (1))); } while (392 == -1); + do { EA = 1; } while (393 == -1); + + + + + + + // set CC254x power mode; interrupts are disabled after this function + // Note: Any ISR that could wake the device from sleep needs to use + // CLEAR_SLEEP_MODE(), which will clear the halSleepPconValue flag + // used to enter sleep mode, thereby preventing the device from + // missing this interrupt. + halSetSleepMode(); + + + + + + + // check if ST interrupt pending, and if not, clear wakeForRF flag + // Note: This is needed in case we are not woken by the sleep timer but + // by for example a key press. In this case, the flag has to be + // cleared as we are not just before a radio event. + // Note: There is the possiblity that we may wake from an interrupt just + // before the sleep timer would have woken us just before a radio + // event, in which case power will be wasted as we will probably + // enter this routine one or more times before the radio event. + // However, this is presumably unusual, and isn't expected to have + // much impact on average power consumption. + if ( (wakeForRF == 1) && !(IRCON & 0x80) ) + { + wakeForRF = 0; + } + + // restore interrupt enable registers + do { IEN0 = (ien0); IEN1 = (ien1); IEN2 = (ien2); } while (428 == -1); + + // power on the LL; blocks until completion + // Note: This is done here to ensure the 32MHz XOSC has stablized, in + // case it is needed (e.g. the ADC is used by the joystick). + LL_PowerOnReq( (halPwrMgtMode == 3), wakeForRF ); + + + + + // use this to turn LEDs back on after sleep + HalLedExitSleep(); + + + + + + + } + + do { EA = 1; } while (448 == -1); + } + + + + + + + return; +} + + +/******************************************************************************* + * @fn halSleepSetTimer + * + * @brief This function sets the CC2540 sleep timer compare value based + * on a given snapshot of the sleep timer, and a timeout that is + * relative to that snapshot. The snapshot is provided as it may + * need to be taken as close to the snapshot of Timer 2 (the radio + * timer) as possible so that the time to the next radio event, + * when converted to 32kHz ticks, is as accurate as possible in + * terms of sleep time. In addition, the offset is adjusted based + * on a configurable adjustment to take the sleep handler's + * execution time into account. The sleep timer interrupt is then + * setup for wake. + * + * input parameters + * + * @param sleepTimer - Sleep timer value timeout is relative to. + * @param timeout - Timeout value in 32kHz units. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halSleepSetTimer( uint32 sleepTimer, uint32 timeout ) +{ + do { IEN0 &= ~(1 << (5)); } while (487 == -1); + + // compute sleep timer compare value + sleepTimer += timeout; + + // subtract the processing time spent in function halSleep() + sleepTimer -= 35; + + // set sleep timer compare; ST0 must be written last + ST2 = ((uint8 *)&sleepTimer)[2]; + ST1 = ((uint8 *)&sleepTimer)[1]; + ST0 = ((uint8 *)&sleepTimer)[0]; + + do { IRCON &= ~0x80; } while (500 == -1); + do { IEN0 |= (1 << (5)); } while (501 == -1); + + return; +} + + +/******************************************************************************* + * @fn halSleepReadTimer + * + * @brief This function reads the CC2540 sleep timer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return A snapshot of the 24 bit sleep timer. + */ +uint32 halSleepReadTimer( void ) +{ + uint32 sleepTimer; + + // read the sleep timer + // Note: Read of ST0 latches ST1 and ST2. + ((uint8 *)&sleepTimer)[0] = ST0; + ((uint8 *)&sleepTimer)[1] = ST1; + ((uint8 *)&sleepTimer)[2] = ST2; + ((uint8 *)&sleepTimer)[3] = 0; + + return( sleepTimer ); +} + + +/******************************************************************************* + * @fn TimerElapsed + * + * @brief Determine the number of OSAL timer ticks elapsed during sleep. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Number of timer ticks elapsed during sleep. + */ +uint32 TimerElapsed( void ) +{ + return( 0 ); +} + + +/******************************************************************************* + * @fn halRestoreSleepLevel + * + * @brief Restore the deepest timer sleep level. + * + * input parameters + * + * @param None + * + * output parameters + * + * @param None. + * + * @return None. + */ +void halRestoreSleepLevel( void ) +{ + // Stub + + + +} + + +/******************************************************************************* + * @fn halSleepTimerIsr + * + * @brief Sleep timer ISR. + * + * input parameters + * + * None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +_Pragma("vector=0x2B") __near_func __interrupt void halSleepTimerIsr(void); _Pragma("vector=0x2B") __near_func __interrupt void halSleepTimerIsr(void) +{ + { halIntState_t _isrIntState = EA; do { EA = 1; } while (599 == -1);; + + do { IRCON &= ~0x80; } while (601 == -1); + + + + + + ; + + EA = _isrIntState; }; + + return; +} + +/******************************************************************************* + */ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_startup.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_startup.i new file mode 100644 index 0000000..45abafc --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_startup.i @@ -0,0 +1,1177 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_startup.c" +/************************************************************************************************** + Filename: hal_startup.c + Revised: $Date: 2012-06-12 12:38:53 -0700 (Tue, 12 Jun 2012) $ + Revision: $Revision: 30729 $ + + Description: Contains code that needs to run before main() + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + *************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 43 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_startup.c" + + + + + + +#pragma language=extended + +// +// Locate low_level_init in the CSTART module +// +#pragma location="CSTART" +// +// If the code model is banked, low_level_init must be declared +// __near_func elsa a ?BRET is performed +// + +__near_func __root char + + + +__low_level_init(void); + +/************************************************************************************************** + * @fn __low_level_init + * + * @brief The function __low_level_init is called by the start-up code before doing + * the normal initialization of data segments. If the return value is zero, + * initialization is not performed. + * + * @param None + * + * @return 0 - don't intialize data segments / 1 - do initialization + **************************************************************************************************/ + +__near_func __root char + + + +__low_level_init(void) +{ + /*==================================*/ + /* Initialize hardware. */ + /*==================================*/ + // Map flash bank with constants into XDATA for access to "ROM mapped as data". + + + + + + MEMCTR = (MEMCTR & 0xF8) | 0x01; + + + /*==================================*/ + /* Choose if segment initialization */ + /* should be done or not. */ + /* Return: 0 to omit seg_init */ + /* 1 to run seg_init */ + /*==================================*/ + return 1; +} + +#pragma language=default + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_timer.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_timer.i new file mode 100644 index 0000000..2e8e279 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_timer.i @@ -0,0 +1,46 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_timer.c" +/************************************************************************************************** + Filename: hal_timer.c + Revised: $Date: 2010-06-01 13:25:59 -0700 (Tue, 01 Jun 2010) $ + Revision: $Revision: 22687 $ + + Description: This file contains the interface to the Timer Service. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + NOTE: Z-Stack and TIMAC no longer use CC2530 Timer 1, Timer 3, and + Timer 4. The supporting timer driver module is removed and left + for the users to implement their own application timer + functions. +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_uart.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_uart.i new file mode 100644 index 0000000..5e6dff0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hal_uart.i @@ -0,0 +1,2899 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +/************************************************************************************************** + Filename: hal_uart.c + Revised: $Date: 2013-02-06 09:21:21 -0800 (Wed, 06 Feb 2013) $ + Revision: $Revision: 33001 $ + + Description: This file contains the interface to the H/W UART driver. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_drivers.h" +/************************************************************************************************** + Filename: hal_drivers.h + Revised: $Date: 2012-07-09 13:23:30 -0700 (Mon, 09 Jul 2012) $ + Revision: $Revision: 30873 $ + + Description: This file contains the interface to the Drivers service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + + + + + + + + + + + + + + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + +extern uint8 Hal_TaskID; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +extern void Hal_Init ( uint8 task_id ); + +/* + * Process Serial Buffer + */ +extern uint16 Hal_ProcessEvent ( uint8 task_id, uint16 events ); + +/* + * Process Polls + */ +extern void Hal_ProcessPoll (void); + +/* + * Initialize HW + */ +extern void HalDriverInit (void); + + + + + + + +/************************************************************************************************** +**************************************************************************************************/ +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + + + + + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +void HalUARTIsrDMA(void); + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" +/************************************************************************************************** + Filename: _hal_uart_dma.c + Revised: $Date: 2012-12-12 13:58:27 -0800 (Wed, 12 Dec 2012) $ + Revision: $Revision: 32579 $ + + Description: This file contains the interface to the H/W UART driver by DMA. + + A known defect is that when flow control is enabled, the function HalUARTPollTxTrigDMA() can + prematurely invoke HAL_DMA_MAN_TRIGGER(HAL_DMA_CH_TX) and clobber that last byte of one txBuf[] + block transfer with the first byte of the next txBuf[] block transfer. Additionally, Tx can + become permanently stalled during heavy use and/or simultaeous heavy radio traffic when using + DMA for the Tx and hardware flow control. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\string.h" +/* - STRING.H - + + The ANSI 'string' function declarations. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\string.h" + + + + + + + + + + + + + + + +__intrinsic void *memcpy(void *, const void *, size_t); + +__intrinsic void *memmove(void *, const void *, size_t); + +__intrinsic void *memchr(const void *, int, size_t); + +__intrinsic void *memset(void *, int, size_t); + +__intrinsic int memcmp(const void *, const void *, size_t); + +__intrinsic char *strchr(const char *, int); + +__intrinsic int strcmp(const char *, const char *); + +__intrinsic int strncmp(const char *, const char *, size_t); + +__intrinsic int strcoll(const char *, const char *); + +__intrinsic size_t strlen(const char *); + +__intrinsic size_t strcspn(const char *, const char *); + +__intrinsic size_t strspn(const char *, const char *); + +__intrinsic char *strpbrk(const char *, const char *); + +__intrinsic char *strrchr(const char *, int); + +__intrinsic char *strstr(const char *, const char *); + +__intrinsic char *strcat(char *, const char *); + +__intrinsic char *strncat(char *, const char *, size_t); + +__intrinsic char *strcpy(char *, const char *); + +__intrinsic char *strncpy(char *, const char *, size_t); + +__intrinsic char *strerror(int); + +__intrinsic char *strtok(char *, const char *); + +__intrinsic size_t strxfrm(char *, const char *, size_t); + + + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_dma.h" +/************************************************************************************************** + Filename: hal_dma.h + Revised: $Date: 2011-08-23 08:53:54 -0700 (Tue, 23 Aug 2011) $ + Revision: $Revision: 27253 $ + + Description: This file contains the interface to the DMA Service. + + + Copyright 2007-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_dma.h" + + + + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macro for quickly setting the source address of a DMA structure. + + + + + + +// Macro for quickly setting the destination address of a DMA structure. + + + + + + +// Macro for quickly setting the number of bytes to be transferred by the DMA, +// max length is 0x1FFF. +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +// Use LEN for transfer count + +// Transfer the first byte + the number of bytes indicated by the first byte + +// Transfer the number of bytes indicated by the first byte (starting with the first byte) + +// Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte + +// Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes + + + + + + + + + + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_dma.h" + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +// Bit fields of the 'lenModeH' + + + +// Bit fields of the 'ctrlA' + + + + +// Bit fields of the 'ctrlB' + + + + + + +typedef struct { + uint8 srcAddrH; + uint8 srcAddrL; + uint8 dstAddrH; + uint8 dstAddrL; + uint8 xferLenV; + uint8 xferLenL; + uint8 ctrlA; + uint8 ctrlB; +} halDMADesc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern halDMADesc_t dmaCh0; +extern halDMADesc_t dmaCh1234[4]; + +/********************************************************************* + * FUNCTIONS - API + */ + +void HalDmaInit( void ); + + + + + + + + + +/****************************************************************************** +******************************************************************************/ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + + + +/* ------------------------------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------------------------------ + */ + +// UxCSR - USART Control and Status Register. +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +// UxUCR - USART UART Control Register. +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +// UxUCR - USART UART Generic Control + + + + + + + + + + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +#line 158 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +#line 188 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" +// Falling edge ISR on P1.4-7 pins. + + + + + +#line 201 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +// For known defects described above in the moduel description, prefer to drive the Tx by ISR vice +// DMA unless H/W flow control is not used and full-throughput on Tx is absolutely essential. + + + + +// TRUE or FALSE whether or not to flush the Rx queue when an Rx overrun is detected. +// Note that when HAL_UART_RX_FLUSH is set to TRUE, then uartRxBug and its hunt for where the Rx +// DMA is working is absolutely necessary because the flush can leave the dmaCfg.rxHead stranded. + + + + +// Minimum delay before allowing sleep and/or clearing DMA ready-out after a DMA ready-in ISR. +// ST-ticks for 6-msecs plus 1 tick added for when the dmaRdyDly is forced from zero to 0xFF. +// If a greater delay than 6-msec is configured, then the logic should be changed to use a uint16. +//efine DMA_PM_DLY 198 // 32768 * 0.006 + 1 -> 198. +// This delay should be set as short as possible to work with the max expected latency in the sender +// between its asserting ready-out and its checking of the ready-in response. The RBA Master +// logic in the internal uart-to-uart bridge app checks for ready-in immediately, +// so this is just set to zero. + + +// The timeout tick is at 32-kHz, so multiply msecs by 33. + + +#line 243 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +// ST-ticks for 1 byte @ 38.4-kB plus 1 tick added for when the txTick is forced from zero to 0xFF. + + +/* ------------------------------------------------------------------------------------------------ + * TypeDefs + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef uint16 rxIdx_t; + + + +typedef uint8 txIdx_t; + + + + +typedef struct +{ + uint16 rxBuf[300]; + rxIdx_t rxHead; + rxIdx_t rxTail; + + + + + + uint8 txBuf[50]; + volatile txIdx_t txHead; + txIdx_t txTail; + uint8 txMT; +#line 289 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + halUARTCBack_t uartCB; +} uartDMACfg_t; + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + +#line 318 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +#line 329 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + + + + + +/* ------------------------------------------------------------------------------------------------ + * Local Variables + * ------------------------------------------------------------------------------------------------ + */ + +// The following two variables are only used when POWER_SAVING is defined. +static volatile uint8 dmaRdyIsr; +static uint8 dmaRdyDly; // Minimum delay before allowing sleep after detecting RdyIn de-asserted. + +static uartDMACfg_t dmaCfg; + +/* Used to walk the dmaCfg.rxBuf[] one byte per polling pass as a work-around for the case when + * full-duplex traffic using Rx & Tx DMA running simultaneously. + * Although not captured in this UART by DMA case, the _hal_uart_spi.c was able to show that the + * immediate buffer area around the spiRxIdx consists of "cleared" uint16 values, + * but 10-16 indices ahead, there are valid SPI packets ready to be parsed. + */ +static rxIdx_t uartRxBug; // Pre-emptive (not empirically determined necessary) use from SPI case. + +/* ------------------------------------------------------------------------------------------------ + * Global Functions + * ------------------------------------------------------------------------------------------------ + */ + +void HalUART_DMAIsrDMA(void); + +/* ------------------------------------------------------------------------------------------------ + * Local Functions + * ------------------------------------------------------------------------------------------------ + */ + +// Invoked by functions in hal_uart.c when this file is included. +static void HalUARTInitDMA(void); +static void HalUARTOpenDMA(halUARTCfg_t *config); +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len); +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len); +static void HalUARTPollDMA(void); +static uint16 HalUARTRxAvailDMA(void); +static uint8 HalUARTBusyDMA(void); + + + + + +/****************************************************************************** + * @fn HalUARTInitDMA + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTInitDMA(void) +{ + halDMADesc_t *ch; + + + + PERCFG |= 0x02; // Set UART1 I/O to Alt. 2 location on P1. + + P1SEL |= 0xC0; // Enable Peripheral control of Rx/Tx on Px. + U1CSR = 0x80; // Mode is UART Mode. + U1UCR = 0x80; // Flush it. + + P2DIR &= ~0xC0; + P2DIR |= 0x40; + + if (0) + { + // Setup GPIO for interrupts by falling edge on DMA_RDY_IN. + P1IEN |= (1 << (4)); + PICTL |= (1 << (2)); + + (P1_5 = 1); + P1DIR |= (1 << (5)); + } + +#line 448 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + // Setup Rx by DMA. + ch = (dmaCh1234+((3)-1)); + + // Abort any pending DMA operations (in case of a soft reset). + DMAARM = (0x80 | (0x01 << (3))); + + // The start address of the source. + do { ch->srcAddrH = (uint8)((uint16)(0x70F9) >> 8); ch->srcAddrL = (uint8)((uint16)(0x70F9) & 0xFF); } while (456 == -1); + + // Using the length field to determine how many bytes to transfer. + do { ch->xferLenV &= ~0xE0; ch->xferLenV |= (0x00 << 5); } while (459 == -1); + + /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx. + * The byte after the Rx Data Buffer is the Baud Cfg Register, + * which always has a known value. So init Rx buffer to inverse of that + * known value. DMA word xfer will flip the bytes, so every valid Rx byte + * in the Rx buffer will be preceded by a DMA_PAD char equal to the + * Baud Cfg Register value. + */ + do { ch->ctrlA &= ~0x80; ch->ctrlA |= (0x01 << 7); } while (468 == -1); + + // The bytes are transferred 1-by-1 on Rx Complete trigger. + do { ch->ctrlA &= ~0x60; ch->ctrlA |= (0x02 << 5); } while (471 == -1); + do { ch->ctrlA &= ~0x1F; ch->ctrlA |= 16; } while (472 == -1); + + // The source address is constant - the Rx Data Buffer. + do { ch->ctrlB &= ~0xC0; ch->ctrlB |= (0x00 << 6); } while (475 == -1); + + // The destination address is incremented by 1 word after each transfer. + do { ch->ctrlB &= ~0x30; ch->ctrlB |= (0x01 << 4); } while (478 == -1); + do { ch->dstAddrH = (uint8)((uint16)(dmaCfg . rxBuf) >> 8); ch->dstAddrL = (uint8)((uint16)(dmaCfg . rxBuf) & 0xFF); } while (479 == -1); + do { ch->xferLenL = (uint8)(uint16)(300); ch->xferLenV &= ~0x1F; ch->xferLenV |= (uint8)((uint16)(300) >> 8); } while (480 == -1); + + // The DMA is to be polled and shall not issue an IRQ upon completion. + do { ch->ctrlB &= ~0x08; ch->ctrlB |= (0x00 << 3); } while (483 == -1); + + // Xfer all 8 bits of a byte xfer. + do { ch->ctrlB &= ~0x04; ch->ctrlB |= (0x00 << 2); } while (486 == -1); + + // DMA has highest priority for memory access. + do { ch->ctrlB &= ~0x03; ch->ctrlB |= 0x02; } while (489 == -1); + + volatile uint8 dummy = *(volatile uint8 *)0x70F9; // Clear the DMA Rx trigger. + DMAIRQ &= ~( 1 << (3) ); + DMAARM = (0x01 << (3)); + (void)memset(dmaCfg.rxBuf, (U1BAUD ^ 0xFF), 300*2); +} + +/****************************************************************************** + * @fn HalUARTOpenDMA + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param config - contains configuration information + * + * @return none + *****************************************************************************/ +static void HalUARTOpenDMA(halUARTCfg_t *config) +{ + dmaCfg.uartCB = config->callBackFunc; + + // Only supporting subset of baudrate for code size - other is possible. + /* + HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) || + (config->baudRate == HAL_UART_BR_19200) || + (config->baudRate == HAL_UART_BR_38400) || + (config->baudRate == HAL_UART_BR_57600) || + (config->baudRate == HAL_UART_BR_115200)); + + */ + if (config->baudRate == 0x07 || + config->baudRate == 0x08 || + config->baudRate == 0x03 || + config->baudRate == 0x04 || + config->baudRate == 0x0A) + { + U1BAUD = 216; + } + else + { + U1BAUD = 59; + } + + switch (config->baudRate) + { + case 0x05: + U1GCR = 6; + break; + case 0x06: + U1GCR = 7; + break; + case 0x00: + case 0x07: + U1GCR = 8; + break; + case 0x01: + case 0x08: + U1GCR = 9; + break; + case 0x02: + case 0x03: + U1GCR = 10; + break; + case 0x09: + case 0x04: + U1GCR = 11; + break; + case 0x0A: + U1GCR = 12; + break; + default: + // HAL_UART_BR_115200 + U1GCR = 11; + break; + } +// UxBAUD = 0; +// UxBAUD = 59; +// UxBAUD = 216; +// UxGCR = 11; + + if (0 || config->flowControl) + { + U1UCR = 0x40 | 0x02; // 8 bits/char; no parity; 1 stop bit; stop bit hi. + P1SEL |= 0x10; // Enable Peripheral control of CTS flow control on Px. + } + else + { + U1UCR = 0x02; // 8 bits/char; no parity; 1 stop bit; stop bit hi. +// UxUCR = UCR_START; +// UxUCR = UCR_STOP | UCR_SPB; // 8 bits/char; no parity; 2 stop bits; stop bit hi. +// UxUCR = UCR_START | UCR_SPB; // 8 bits/char; no parity; 2 stop bits; stop bit lo. + + } + + + U1CSR = (0x80 | 0x40); + + if (0) + { + P1IFG = 0; + P1IF = 0; + IEN2 |= (1 << (4)); + } + else if (U1UCR & 0x40) + { + // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the + // circular Rx queue depth. Start by allowing flow. + (P1_5 = 0); + P1DIR |= 0x20; + } + + + UTX1IF = 1; // Prime the ISR pump. + + +// UxGCR |= GCR_ORDER; +// UxUCR = 0; +// UxUCR |= UCR_FLUSH; +// UxUCR |= UCR_FLOW; +// UxUCR |= UCR_D9; +// UxUCR |= UCR_BIT9; +// UxUCR |= UCR_PARITY; +// UxUCR |= UCR_SPB; +// UxUCR |= UCR_STOP; +// UxUCR |= UCR_START; + +} + +/***************************************************************************** + * @fn HalUARTReadDMA + * + * @brief Read a buffer from the UART + * + * @param buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +static uint16 HalUARTReadDMA(uint8 *buf, uint16 len) +{ + uint16 cnt; + + for (cnt = 0; cnt < len; cnt++) + { + if (!((uint8)U1BAUD == (((dmaCfg . rxBuf[(dmaCfg . rxHead)]) >> 8) & 0xFF))) + { + break; + } + *buf++ = (*(volatile uint8 *)(dmaCfg . rxBuf+(dmaCfg . rxHead))); + (dmaCfg . rxBuf[(dmaCfg . rxHead)] = ((uint16)(((0) & 0x00FF) + ((((U1BAUD ^ 0xFF)) & 0x00FF) << 8)))); + do { if (++(dmaCfg . rxHead) >= 300) { (dmaCfg . rxHead) = 0; } } while (639 == -1); + } + + if (!0 && (U1UCR & 0x40)) + { + if (HalUARTRxAvailDMA() < (300 - 1)) + { + (P1_5 = 0); // Re-enable the flow asap (i.e. not wait until next uart poll). + } + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTWriteDMA + * + * @brief Write a buffer to the UART, enforcing an all or none policy if the requested length + * exceeds the space available. + * + * @param buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +static uint16 HalUARTWriteDMA(uint8 *buf, uint16 len) +{ + + // Enforce all or none. + if ((dmaCfg . txHead > dmaCfg . txTail) ? (dmaCfg . txHead - dmaCfg . txTail - 1) : (50 - dmaCfg . txTail + dmaCfg . txHead - 1) < len) + { + return 0; + } + + for (uint16 cnt = 0; cnt < len; cnt++) + { + dmaCfg.txBuf[dmaCfg.txTail] = *buf++; + dmaCfg.txMT = 0; + + if (dmaCfg.txTail >= 50-1) + { + dmaCfg.txTail = 0; + } + else + { + dmaCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= 0x08; + } +#line 739 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + return len; +} + +/****************************************************************************** + * @fn HalUARTPollDMA + * + * @brief Poll a USART module implemented by DMA, including the hybrid solution in which the Rx + * is driven by DMA but the Tx is driven by ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +static void HalUARTPollDMA(void) +{ + uint8 evt = 0; + uint16 cnt; + +#line 793 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + + + + + if (!((uint8)U1BAUD == (((dmaCfg . rxBuf[(dmaCfg . rxHead)]) >> 8) & 0xFF))) + { + if (((uint8)U1BAUD == (((dmaCfg . rxBuf[(uartRxBug)]) >> 8) & 0xFF))) + { + do { + do { if (++(dmaCfg . rxHead) >= 300) { (dmaCfg . rxHead) = 0; } } while (803 == -1); + } while (!((uint8)U1BAUD == (((dmaCfg . rxBuf[(dmaCfg . rxHead)]) >> 8) & 0xFF))); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + do { if (++(uartRxBug) >= 300) { (uartRxBug) = 0; } } while (809 == -1); + } + + cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around. + +#line 832 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + if (cnt != 0) + { + evt = 0x04; + } + + + if (cnt >= (300 - 16)) + { + evt |= 0x01; + } + else if (cnt >= (300 - 1)) + { + evt |= 0x02; + + if (!0 && (U1UCR & 0x40)) + { + (P1_5 = 1); // Disable Rx flow. + } + } + + if (dmaCfg.txMT) + { + dmaCfg.txMT = 0; + evt |= 0x10; + } + + if ((evt != 0) && (dmaCfg.uartCB != 0)) + { + dmaCfg.uartCB(2-1, evt); + } + + if (0 && (dmaRdyDly == 0) && !HalUARTBusyDMA()) + { + (P1_5 = 1); + } +} + +/************************************************************************************************** + * @fn HalUARTRxAvailDMA() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param none + * + * @return length of current Rx Buffer + **************************************************************************************************/ +static uint16 HalUARTRxAvailDMA(void) +{ + // First, synchronize the Rx tail marker with where the DMA Rx engine is working. + rxIdx_t tail = dmaCfg.rxTail; + + do + { + if (!((uint8)U1BAUD == (((dmaCfg . rxBuf[(tail)]) >> 8) & 0xFF))) + { + break; + } + + do { if (++(tail) >= 300) { (tail) = 0; } } while (890 == -1); + } while (tail != dmaCfg.rxHead); + + dmaCfg.rxTail = tail; + + uint16 cnt = tail - dmaCfg.rxHead; + + // If the DMA Rx may have overrun the circular queue, investigate further. + if ((cnt == 0) && ((uint8)U1BAUD == (((dmaCfg . rxBuf[(tail)]) >> 8) & 0xFF))) + { + /* Ascertain whether this polling is racing with the DMA Rx which may have clocked in a byte + * since walking the tail. The Rx queue has wrapped only if the byte before the head is new. + */ + tail = dmaCfg.rxHead; + do { if ((tail)-- == 0) { (tail) = 300-1; } } while (904 == -1); + + if (((uint8)U1BAUD == (((dmaCfg . rxBuf[(tail)]) >> 8) & 0xFF))) + { + if (1) + { + (void)memset(dmaCfg.rxBuf, (U1BAUD ^ 0xFF), 300*2); + + uartRxBug = dmaCfg.rxHead; + dmaCfg.rxTail = dmaCfg.rxHead; + } + else + { + cnt = 300; + } + } + else + { + cnt = 1; + } + } + else if (cnt > 300) // If the tail has wrapped at the end of the Rx queue. + { + cnt += 300; + } + + return cnt; +} + +/****************************************************************************** + * @fn HalUARTBusyDMA + * + * @brief Query the UART hardware & buffers before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return TRUE if the UART H/W is busy or buffers are not empty; FALSE otherwise. + *****************************************************************************/ +static uint8 HalUARTBusyDMA( void ) +{ + + return !((!(U1CSR & (0x01 | 0x04))) && (HalUARTRxAvailDMA() == 0) && + (dmaCfg.txHead == dmaCfg.txTail)); + + + + +} + +#line 1017 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + +/****************************************************************************** + * @fn HalUART_DMAIsrDMA + * + * @brief Handle the Tx done DMA ISR. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUART_DMAIsrDMA(void) +{ +#line 1049 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" +} + +#line 1078 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\_hal_uart_dma.c" + + +/*************************************************************************************************** + * @fn halUartTxIsr + * + * @brief UART Transmit Interrupt + * + * @param None + * + * @return None + ***************************************************************************************************/ + + + +_Pragma("vector=0x73") __near_func __interrupt void halUart1TxIsr(void); _Pragma("vector=0x73") __near_func __interrupt void halUart1TxIsr(void) + +{ + { halIntState_t _isrIntState = EA; do { EA = 1; } while (1095 == -1);; + + if (dmaCfg.txHead == dmaCfg.txTail) + { + IEN2 &= ~0x08; + dmaCfg.txMT = 1; + } + else + { + UTX1IF = 0; + U1DBUF = dmaCfg.txBuf[dmaCfg.txHead++]; + + if ((50 != 256) && (dmaCfg.txHead >= 50)) + { + dmaCfg.txHead = 0; + } + } + + EA = _isrIntState; }; +} + + +/************************************************************************************************** +*/ +#line 66 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + +/****************************************************************************** + * @fn HalUARTInit + * + * @brief Initialize the UART + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTInit(void) +{ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + HalUARTInitDMA(); +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +} + +/****************************************************************************** + * @fn HalUARTOpen + * + * @brief Open a port according tp the configuration specified by parameter. + * + * @param port - UART port + * config - contains configuration information + * + * @return Status of the function call + *****************************************************************************/ +uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) +{ + + + + + if (port == 0x01) HalUARTOpenDMA(config); +#line 151 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + + return 0x00; +} + +/***************************************************************************** + * @fn HalUARTRead + * + * @brief Read a buffer from the UART + * + * @param port - USART module designation + * buf - valid data buffer at least 'len' bytes in size + * len - max length number of bytes to copy to 'buf' + * + * @return length of buffer that was read + *****************************************************************************/ +uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) +{ + + + + + if (port == 0x01) return HalUARTReadDMA(buf, len); +#line 186 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + +#line 196 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + return 0; + +} + +/****************************************************************************** + * @fn HalUARTWrite + * + * @brief Write a buffer to the UART. + * + * @param port - UART port + * buf - pointer to the buffer that will be written, not freed + * len - length of + * + * @return length of the buffer that was sent + *****************************************************************************/ +uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) +{ + + + + + if (port == 0x01) return HalUARTWriteDMA(buf, len); +#line 231 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + +#line 242 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + return 0; + +} + +/****************************************************************************** + * @fn HalUARTSuspend + * + * @brief Suspend UART hardware before entering PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTSuspend( void ) +{ + + + +} + +/****************************************************************************** + * @fn HalUARTResume + * + * @brief Resume UART hardware after exiting PM mode 1, 2 or 3. + * + * @param None + * + * @return None + *****************************************************************************/ +void HalUARTResume( void ) +{ + + + +} + +/*************************************************************************************************** + * @fn HalUARTPoll + * + * @brief Poll the UART. + * + * @param none + * + * @return none + *****************************************************************************/ +void HalUARTPoll(void) +{ +#line 300 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + HalUARTPollDMA(); +#line 312 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" +} + +/************************************************************************************************** + * @fn Hal_UART_RxBufLen() + * + * @brief Calculate Rx Buffer length - the number of bytes in the buffer. + * + * @param port - UART port + * + * @return length of current Rx Buffer + **************************************************************************************************/ +uint16 Hal_UART_RxBufLen( uint8 port ) +{ + + + + + if (port == 0x01) return HalUARTRxAvailDMA(); +#line 343 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + +#line 351 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + return 0; + +} + +void HalUARTIsrDMA(void) +{ +#line 367 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\COMPONENTS\\hal\\target\\CC2540EB\\hal_uart.c" + HalUART_DMAIsrDMA(); + + + +} + +/****************************************************************************** +******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hiddev.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/hiddev.i new file mode 100644 index 0000000..e69de29 diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/npi.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/npi.i new file mode 100644 index 0000000..21fdd88 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/npi.i @@ -0,0 +1,1651 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.c" +/******************************************************************************* + Filename: npi.c + Revised: $Date: 2008-06-11 14:30:47 -0700 (Wed, 11 Jun 2008) $ + Revision: $Revision: 17210 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.h" +/******************************************************************************* + Filename: npi.h + Revised: $Date: 2007-10-28 09:35:41 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15796 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_board.h" +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* UART port */ +#line 75 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.h" + + + + + + + + + + + + + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef void (*npiCBack_t) ( uint8 port, uint8 event ); + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +// +// Network Processor Interface APIs +// + +extern void NPI_InitTransport( npiCBack_t npiCBack ); +extern uint16 NPI_ReadTransport( uint8 *buf, uint16 len ); +extern uint16 NPI_WriteTransport( uint8 *, uint16 ); +extern uint16 NPI_RxBufLen( void ); +extern uint16 NPI_GetMaxRxBufSize( void ); +extern uint16 NPI_GetMaxTxBufSize( void ); + +/******************************************************************************* +*/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\common\\npi\\npi_np\\npi.c" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * PROTOTYPES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +/******************************************************************************* + * @fn NPI_InitTransport + * + * @brief This routine initializes the transport layer and opens the port + * of the device. Note that based on project defines, either the + * UART, USB (CDC), or SPI driver can be used. + * + * input parameters + * + * @param npiCback - User callback function when data is available. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void NPI_InitTransport( npiCBack_t npiCBack ) +{ + halUARTCfg_t uartConfig; + + // configure UART + uartConfig.configured = 1; + uartConfig.baudRate = 0x04; + uartConfig.flowControl = 1; + uartConfig.flowControlThreshold = 48; + uartConfig.rx.maxBufSize = 128; + uartConfig.tx.maxBufSize = 128; + uartConfig.idleTimeout = 6; + uartConfig.intEnable = 1; + uartConfig.callBackFunc = (halUARTCBack_t)npiCBack; + + // start UART + // Note: Assumes no issue opening UART port. + (void)HalUARTOpen( 0x00, &uartConfig ); + + return; +} + + +/******************************************************************************* + * @fn NPI_ReadTransport + * + * @brief This routine reads data from the transport layer based on len, + * and places it into the buffer. + * + * input parameters + * + * @param buf - Pointer to buffer to place read data. + * @param len - Number of bytes to read. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes read from transport. + */ +uint16 NPI_ReadTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTRead( 0x00, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_WriteTransport + * + * @brief This routine writes data from the buffer to the transport layer. + * + * input parameters + * + * @param buf - Pointer to buffer to write data from. + * @param len - Number of bytes to write. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes written to transport. + */ +uint16 NPI_WriteTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTWrite( 0x00, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_RxBufLen + * + * @brief This routine returns the number of bytes in the receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes in the receive buffer. + */ +uint16 NPI_RxBufLen( void ) +{ + return( Hal_UART_RxBufLen( 0x00 ) ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxRxBufSize + * + * @brief This routine returns the max size receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the receive buffer. + */ +uint16 NPI_GetMaxRxBufSize( void ) +{ + return( 128 ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxTxBufSize + * + * @brief This routine returns the max size transmit buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the transmit buffer. + */ +uint16 NPI_GetMaxTxBufSize( void ) +{ + return( 128 ); +} + + +/******************************************************************************* + ******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_bufmgr.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_bufmgr.i new file mode 100644 index 0000000..8a78b93 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_bufmgr.i @@ -0,0 +1,2182 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_bufmgr.c" +/************************************************************************************************** + Filename: osal_bufmgr.c + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the buffer management APIs. These APIs + are not reentrant hence cannot be called from an interrupt + contex. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_bufmgr.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_bufmgr.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_bufmgr.h" +/************************************************************************************************** + Filename: osal_bufmgr.h + Revised: $Date: 2009-01-14 14:59:55 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18763 $ + + Description: This file contains the buffer management definitions. + + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * VARIABLES + */ + + +/********************************************************************* + * MACROS + */ + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Allocate a block of memory. + */ +extern void *osal_bm_alloc( uint16 size ); + +/* + * Add or remove header space for the payload pointer. + */ +extern void *osal_bm_adjust_header( void *payload_ptr, int16 size ); + +/* + * Add or remove tail space for the payload pointer. + */ +extern void *osal_bm_adjust_tail( void *payload_ptr, int16 size ); + +/* + * Free a block of memory. + */ +extern void osal_bm_free( void *payload_ptr ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_bufmgr.c" + +/********************************************************************* + * MACROS + */ +// 'bd_ptr' used with these macros must be of the type 'bm_desc_t *' + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ +typedef struct bm_desc +{ + struct bm_desc *next_ptr; // pointer to next buffer descriptor + uint16 payload_len; // length of user's buffer +} bm_desc_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * GLOBAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Linked list of allocated buffer descriptors +static bm_desc_t *bm_list_ptr = 0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ); + +/********************************************************************* + * @fn osal_bm_alloc + * + * @brief Implementation of the allocator functionality. + * + * WARNING: THIS FUNCTION CAN BE CALLED ONLY FROM THE BOTTOM + * LAYER OF THE STACK (HCI FOR DUAL MODE AND LINK + * LAYER FOR SINGLE MODE). + * + * @param size - number of bytes to allocate from the heap. + * + * @return pointer to the heap allocation; NULL if error or failure. + */ +void *osal_bm_alloc( uint16 size ) +{ + bm_desc_t *bd_ptr; + + bd_ptr = osal_mem_alloc( sizeof( bm_desc_t ) + size ); + if ( bd_ptr != 0 ) + { + // set the buffer descriptor info + bd_ptr->payload_len = size; + + // add item to the beginning of the list + bd_ptr->next_ptr = bm_list_ptr; + bm_list_ptr = bd_ptr; + + // return start of the buffer + return ( (void *)( (bd_ptr) + 1 ) ); + } + + return ( (void *)0 ); +} + +/********************************************************************* + * @fn osal_bm_free + * + * @brief Implementation of the de-allocator functionality. + * + * @param payload_ptr - pointer to the memory to free. + * + * @return none + */ +void osal_bm_free( void *payload_ptr ) +{ + bm_desc_t *loop_ptr; + bm_desc_t *prev_ptr = 0; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != 0 ) + { + if ( payload_ptr >= (void *)( (loop_ptr) + 1 ) && + payload_ptr <= (void *)( (uint8 *)( (loop_ptr) + 1 ) + (loop_ptr)->payload_len ) ) + { + // unlink item from the linked list + if ( prev_ptr == 0 ) + { + // it's the first item on the list + bm_list_ptr = loop_ptr->next_ptr; + } + else + { + prev_ptr->next_ptr = loop_ptr->next_ptr; + } + + // free the memory + osal_mem_free( loop_ptr ); + + // we're done here + break; + } + + // move on to next item + prev_ptr = loop_ptr; + loop_ptr = loop_ptr->next_ptr; + } +} + +/********************************************************************* + * @fn osal_bm_adjust_header + * + * @brief Add or remove header space for the payload pointer. A positive + * adjustment adds header space, and negative removes header space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_header( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != 0 ) + { + new_payload_ptr = (uint8 *)( (uint8 *)payload_ptr - size ); + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)( (bd_ptr) + 1 ) && + new_payload_ptr <= (uint8 *)( (uint8 *)( (bd_ptr) + 1 ) + (bd_ptr)->payload_len ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn osal_bm_adjust_tail + * + * @brief Add or remove tail space for the payload pointer. A positive + * adjustment adds tail space, and negative removes tail space. + * + * @param payload_ptr - pointer to payload + * @param size - +/- number of bytes to move (affecting header area) + * + * @return pointer to payload at the new adjusted location + */ +void *osal_bm_adjust_tail( void *payload_ptr, int16 size ) +{ + bm_desc_t *bd_ptr; + uint8 *new_payload_ptr; + + bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr ); + if ( bd_ptr != 0 ) + { + new_payload_ptr = (uint8 *)( (uint8 *)( (bd_ptr) + 1 ) + (bd_ptr)->payload_len ) - size; + + // make sure the new payload is within valid range + if ( new_payload_ptr >= (uint8 *)( (bd_ptr) + 1 ) && + new_payload_ptr <= (uint8 *)( (uint8 *)( (bd_ptr) + 1 ) + (bd_ptr)->payload_len ) ) + { + // return new payload pointer + return ( (void *)new_payload_ptr ); + } + } + + // return original value + return ( payload_ptr ); +} + +/********************************************************************* + * @fn bm_desc_from_payload + * + * @brief Find buffer descriptor from payload pointer + * + * @param payload_ptr - pointer to payload + * + * @return pointer to buffer descriptor + */ +static bm_desc_t *bm_desc_from_payload ( uint8 *payload_ptr ) +{ + bm_desc_t *loop_ptr; + + loop_ptr = bm_list_ptr; + while ( loop_ptr != 0 ) + { + if ( payload_ptr >= (uint8 *)( (loop_ptr) + 1 ) && + payload_ptr <= (uint8 *)( (uint8 *)( (loop_ptr) + 1 ) + (loop_ptr)->payload_len ) ) + { + // item found + break; + } + + // move on to next item + loop_ptr = loop_ptr->next_ptr; + } + + return ( loop_ptr ); +} + + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_cbtimer.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_cbtimer.i new file mode 100644 index 0000000..4dadb8e --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_cbtimer.i @@ -0,0 +1,1584 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_cbtimer.c" +/************************************************************************************************* + Filename: osal_cbtimer.c + Revised: $Date: 2009-01-14 14:51:34 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18762 $ + + Description: This file contains the Callback Timer task(s). This module + provides 'callback' timers using the existing 'event' timers. + In other words, the registered callback function is called + instead of an OSAL event being sent to the owner of the timer + when it expires. + + + Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_cbtimer.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_Tasks.h" +/************************************************************************************************** + Filename: OSAL_Tasks.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Task definition and manipulation functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/* + * Event handler function prototype + */ +typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +extern const pTaskEventHandlerFn tasksArr[]; +extern const uint8 tasksCnt; +extern uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Call each of the tasks initailization functions. + */ +extern void osalInitTasks( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_cbtimer.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_cbtimer.h" +/************************************************************************************************** + Filename: osal_cbtimer.h + Revised: $Date: 2009-01-29 09:58:32 -0800 (Thu, 29 Jan 2009) $ + Revision: $Revision: 18882 $ + + Description: This file contains the Callback Timer definitions. + + + Copyright 2008-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ +// Invalid timer id + + +// Timed out timer + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ +#line 77 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_cbtimer.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Callback Timer function prototype. Callback function will be called +// when the associated timer expires. +// +// pData - pointer to data registered with timer +// +typedef void (*pfnCbTimer_t)( uint8 *pData ); + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Callback Timer task initialization function. + */ +extern void osal_CbTimerInit( uint8 taskId ); + +/* + * Callback Timer task event processing function. + */ +extern uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ); + +/* + * Function to start a timer to expire in n mSecs. + */ +extern Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ); + +/* + * Function to update a timer that has already been started. + */ +extern Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ); + +/* + * Function to stop a timer that has already been started. + */ +extern Status_t osal_CbTimerStop( uint8 timerId ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\common\\osal_cbtimer.c" + +/********************************************************************* + * MACROS + */ +// Macros to convert one-dimensional index 'timer id' to two-dimensional indices +// 'task id' and 'event id'. + +// Find out event id using timer id + + +// Find out task id using timer id + + +// Find out bank task id using task id + + +/********************************************************************* + * CONSTANTS + */ +// Number of callback timers supported per task (limited by the number of OSAL event timers) + + +// Total number of callback timers + + +/********************************************************************* + * TYPEDEFS + */ +// Callback Timer structure +typedef struct +{ + pfnCbTimer_t pfnCbTimer; // callback function to be called when timer expires + uint8 *pData; // data to be passed in to callback function +} cbTimer_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Callback Timer base task id +uint16 baseTaskID = 0xFF; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +// Callback Timers table. + + cbTimer_t cbTimers[( 1 * 15 )]; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn osal_CbTimerInit + * + * @brief Callback Timer task initialization function. This function + * can be called more than once (OSAL_CBTIMER_NUM_TASKS times). + * + * @param taskId - Message Timer task ID. + * + * @return void + */ +void osal_CbTimerInit( uint8 taskId ) +{ + if ( baseTaskID == 0xFF ) + { + // Only initialize the base task id + baseTaskID = taskId; + + // Initialize all timer structures + osal_memset( cbTimers, 0, sizeof( cbTimers ) ); + } +} + +/********************************************************************* + * @fn osal_CbTimerProcessEvent + * + * @brief Callback Timer task event processing function. + * + * @param taskId - task ID. + * @param events - events. + * + * @return events not processed + */ +uint16 osal_CbTimerProcessEvent( uint8 taskId, uint16 events ) +{ + if ( events & 0x8000 ) + { + // Process OSAL messages + + // return unprocessed events + return ( events ^ 0x8000 ); + } + + if ( events ) + { + uint8 i; + uint16 event; + + // Process event timers + for ( i = 0; i < 15; i++ ) + { + if ( ( events >> i ) & 0x0001 ) + { + cbTimer_t *pTimer = &cbTimers[( ( baseTaskID - ( taskId ) ) * ( 1 * 15 ) )+i]; + + // Found the first event + event = 0x0001 << i; + + // Timer expired, call the registered callback function + pTimer->pfnCbTimer( pTimer->pData ); + + // Mark entry as free + pTimer->pfnCbTimer = 0; + + // Null out data pointer + pTimer->pData = 0; + + // We only process one event at a time + break; + } + } + + // return unprocessed events + return ( events ^ event ); + } + + // If reach here, the events are unknown + // Discard or make more handlers + return 0; +} + +/********************************************************************* + * @fn osal_CbTimerStart + * + * @brief This function is called to start a callback timer to expire + * in n mSecs. When the timer expires, the registered callback + * function will be called. + * + * @param pfnCbTimer - callback function to be called when timer expires + * @param pData - data to be passed in to callback function + * @param timeout - in milliseconds. + * @param pTimerId - will point to new timer Id (if not null) + * + * @return Success, or Failure. + */ +Status_t osal_CbTimerStart( pfnCbTimer_t pfnCbTimer, uint8 *pData, + uint16 timeout, uint8 *pTimerId ) +{ + uint8 i; + + // Validate input parameters + if ( pfnCbTimer == 0 ) + { + return ( 0x02 ); + } + + // Look for an unused timer first + for ( i = 0; i < ( 1 * 15 ); i++ ) + { + if ( cbTimers[i].pfnCbTimer == 0 ) + { + // Start the OSAL event timer first + if ( osal_start_timerEx( ( ( ( i ) / 15 ) + baseTaskID ), ( 0x0001 << ( ( i ) % 15 ) ), timeout ) == 0x00 ) + { + // Set up the callback timer + cbTimers[i].pfnCbTimer = pfnCbTimer; + cbTimers[i].pData = pData; + + if ( pTimerId != 0 ) + { + // Caller is intreseted in the timer id + *pTimerId = i; + } + + return ( 0x00 ); + } + } + } + + // No timer available + return ( 0x08 ); +} + +/********************************************************************* + * @fn osal_CbTimerUpdate + * + * @brief This function is called to update a message timer that has + * already been started. If SUCCESS, the function will update + * the timer's timeout value. If INVALIDPARAMETER, the timer + * either doesn't exit. + * + * @param timerId - identifier of the timer that is to be updated + * @param timeout - new timeout in milliseconds. + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerUpdate( uint8 timerId, uint16 timeout ) +{ + // Look for the existing timer + if ( timerId < ( 1 * 15 ) ) + { + if ( cbTimers[timerId].pfnCbTimer != 0 ) + { + // Make sure the corresponding OSAL event timer is still running + if ( osal_get_timeoutEx( ( ( ( timerId ) / 15 ) + baseTaskID ), ( 0x0001 << ( ( timerId ) % 15 ) ) ) != 0 ) + { + // Timer exists; update it + osal_start_timerEx( ( ( ( timerId ) / 15 ) + baseTaskID ), ( 0x0001 << ( ( timerId ) % 15 ) ), timeout ); + + return ( 0x00 ); + } + } + } + + // Timer not found + return ( 0x02 ); +} + + +/********************************************************************* + * @fn osal_CbTimerStop + * + * @brief This function is called to stop a timer that has already been + * started. If SUCCESS, the function will cancel the timer. If + * INVALIDPARAMETER, the timer doesn't exit. + * + * @param timerId - identifier of the timer that is to be stopped + * + * @return SUCCESS or INVALIDPARAMETER if timer not found + */ +Status_t osal_CbTimerStop( uint8 timerId ) +{ + // Look for the existing timer + if ( timerId < ( 1 * 15 ) ) + { + if ( cbTimers[timerId].pfnCbTimer != 0 ) + { + // Timer exists; stop the OSAL event timer first + osal_stop_timerEx( ( ( ( timerId ) / 15 ) + baseTaskID ), ( 0x0001 << ( ( timerId ) % 15 ) ) ); + + // Mark entry as free + cbTimers[timerId].pfnCbTimer = 0; + + // Null out data pointer + cbTimers[timerId].pData = 0; + + return ( 0x00 ); + } + } + + // Timer not found + return ( 0x02 ); +} + +/**************************************************************************** +****************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_snv.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_snv.i new file mode 100644 index 0000000..c9fadc4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/osal_snv.i @@ -0,0 +1,3414 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +/************************************************************************************************** + Filename: osal_snv.c + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module contains the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_flash.h" +/************************************************************************************************** + Filename: hal_flash.h + Revised: $Date:$ + Revision: $Revision:$ + + Description: This file contains the interface to the Flash Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_flash.h" + + +/************************************************************************************************** + * @fn HalFlashRead + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128). + * @param offset - Valid offset into the page (so < HAL_NV_PAGE_SIZE and byte-aligned is ok). + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to read: a read cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashWrite + * + * @brief This function reads 'cnt' bytes from the internal flash. + * + * input parameters + * + * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned. + * @param buf - Valid buffer space at least as big as the 'cnt' parameter. + * @param cnt - Valid number of bytes to write: a write cannot cross into the next 32KB bank. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt); + +/************************************************************************************************** + * @fn HalFlashErase + * + * @brief This function erases 'cnt' pages of the internal flash. + * + * input parameters + * + * @param pg - Valid HAL flash page number (ie < 128) to erase. + * + * output parameters + * + * None. + * + * @return None. + ************************************************************************************************** + */ +void HalFlashErase(uint8 pg); + + + + + + + +/************************************************************************************************** +*/ +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ + + + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_snv.h" +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + + + + + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +extern uint8 osal_snv_compact( uint8 threshold ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\services\\saddr\\saddr.h" +/************************************************************************************************** + Filename: saddr.h + Revised: $Date: 2009-12-10 08:32:15 -0800 (Thu, 10 Dec 2009) $ + Revision: $Revision: 21311 $ + + Description: Zigbee and 802.15.4 device address utility functions. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/**************************************************************************** + * MACROS + */ + +/* Extended address length */ + + +/* Address modes */ + + + + +/**************************************************************************** + * TYPEDEFS + */ + +/* Extended address */ +typedef uint8 sAddrExt_t[8]; + +/* Combined short/extended device address */ +typedef struct +{ + union + { + uint16 shortAddr; /* Short address */ + sAddrExt_t extAddr; /* Extended address */ + } addr; + uint8 addrMode; /* Address mode */ +} sAddr_t; + +/**************************************************************************** + * @fn sAddrCmp + * + * @brief Compare two device addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrCmp(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrIden + * + * @brief Check if two device addresses are identical. + * + * This routine is virtually the same as sAddrCmp, which is used + * to determine if two different addresses are the same. However, + * this routine can be used to determine if an address is the + * same as a previously stored address. The key difference is in + * the former case, if the address mode is "none", then the + * assumption is that the two addresses can not be the same. But + * in the latter case, the address mode itself is being compared. + * So two addresses can be identical even if the address mode is + * "none", as long as the address mode of both addresses being + * compared is the "none". + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are identical, FALSE otherwise + */ +extern bool sAddrIden(const sAddr_t *pAddr1, const sAddr_t *pAddr2); + +/**************************************************************************** + * @fn sAddrCpy + * + * @brief Copy a device address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return None. + */ +extern void sAddrCpy(sAddr_t *pDest, const sAddr_t *pSrc); + +/**************************************************************************** + * @fn sAddrExtCmp + * + * @brief Compare two extended addresses. + * + * input parameters + * + * @param pAddr1 - Pointer to first address. + * @param pAddr2 - Pointer to second address. + * + * output parameters + * + * @return TRUE if addresses are equal, FALSE otherwise + */ +extern bool sAddrExtCmp(const uint8 * pAddr1, const uint8 * pAddr2); + +/**************************************************************************** + * @fn sAddrExtCpy + * + * @brief Copy an extended address. + * + * input parameters + * + * @param pSrc - Pointer to address to copy. + * + * output parameters + * + * @param pDest - Pointer to address of copy. + * + * @return pDest + SADDR_EXT_LEN. + */ +void *sAddrExtCpy(uint8 * pDest, const uint8 * pSrc); + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\mcu\\cc2540\\osal_snv.c" + + + + + +/********************************************************************* + * CONSTANTS + */ + +// NV page configuration + + + + + +// Default byte value when flash is erased + + +// NV page header size in bytes + + +// In case pages 0-1 are ever used, define a null page value. + + +// In case item Id 0 is ever used, define a null item value. + + +// Length in bytes of a flash word + + +// NV page header offset within a page + + + +// Flag in a length field of an item header to indicate validity +// of the length field + + +// Flag in an ID field of an item header to indicate validity of +// the identifier field + + + +// Bit difference between active page state indicator value and +// transfer page state indicator value + + +// active page state indicator value + + +// transfer page state indicator value + + + + + +/********************************************************************* + * MACROS + */ + +// Macro to check supply voltage + + + + + +// The radio chip does not support voltage monitoring + + + +/********************************************************************* + * TYPEDEFS + */ + +// NV item header structure +typedef struct +{ + uint16 id; + uint16 len; +} osalNvItemHdr_t; +// Note that osalSnvId_t and osalSnvLen_t cannot be bigger than uint16 + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +extern bool HalAdcCheckVdd(uint8 limit); + +/********************************************************************* + * GLOBAL VARIABLES + */ + + +// When NV pages are to remain intact during OAD download, +// the image itself should not include NV pages. +#pragma location="BLENV_ADDRESS_SPACE" +__no_init uint8 _nvBuf[2 * 2048]; +#pragma required=_nvBuf + + + + + + + + +/********************************************************************* + * LOCAL VARIABLES + */ + +// active page +static uint8 activePg; + +// active page offset +static uint16 pgOff; + +// flag to indicate that an error has occurred while writing to or erasing the +// flash device. Once this flag indicates failure, it is unsafe to attempt +// another write or erase. +static uint8 failF; + +/********************************************************************* + * LOCAL FUNCTIONS + */ + +static uint8 initNV( void ); + +static void setActivePage( uint8 pg ); +static void setXferPage(void); +static void erasePage( uint8 pg ); +static void cleanErasedPage( uint8 pg ); +static void findOffset( void ); +static void compactPage( uint8 pg ); + +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ); +static void writeWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ); + + +// NOTE: Triggering erase upon power up may cause fast aging of the flash device +// if there is power switch debounce issue, etc. +// Improvement of this is to add a certain delay upon power up before +// osal_nv_init() is called. + +/********************************************************************* + * @fn initNV + * + * @brief Initialize the NV flash pages. + * + * @param none + * + * @return TRUE if initialization succeeds. FALSE, otherwise. + */ +static uint8 initNV( void ) +{ + uint32 pgHdr; + uint8 xferPg = 0; + uint8 pg; + + failF = 0; + activePg = 0; + + // Pick active page and clean up erased page if necessary + for ( pg = (126-2+1); pg <= ((126-2+1) + 2 - 1); pg++ ) + { + HalFlashRead(pg, 0, (uint8 *)(&pgHdr), 4); + + if ( pgHdr == 0x00100000) + { + if (activePg != 0) + { + // Both pages are active only when power failed during flash erase and + // with very low probability. + // As it is hard (code size intensive) to figure out which page is the real active page, + // and theoretically impossible as well in lowest probability, erase both pages + // in this case + cleanErasedPage(activePg); + cleanErasedPage(pg); + activePg = 0; + } + else + { + activePg = pg; + } + } + else if ( pgHdr == (0x00100000 ^ 0x00100000)) + { + xferPg = pg; + } + else + { + // Erase this page if it is not erased. + // This is to ensure that any page that were in the middle of + // compacting gets erased. + cleanErasedPage(pg); + } + } + + if (activePg == 0) + { + if (xferPg == 0) + { + // Both pages are erased. This must be initial state. + // Pick one page as active page. + setActivePage((126-2+1)); + pgOff = 4; + + // If setting active page from a completely erased page failed, + // it is not recommended to operate any further. + // Other cases, even if non-active page is corrupt, NV module can still read + // the active page content and hence this function could return TRUE. + return (!failF); + } + else + { + // Compacting a page hasn't completed in previous power cycle. + // Complete the compacting. + activePg = xferPg; + findOffset(); + + compactPage(xferPg); + } + } + else + { + if (xferPg != 0) + { + // Compacting has completed except for the final step of erasing + // the xferPage. + erasePage(xferPg); + } + + // find the active page offset to write a new variable location item + findOffset(); + } + + return 1; +} + +/********************************************************************* + * @fn setActivePage + * + * @brief Set page header active state to be active. + * + * @param pg - Valid NV page to activate. + * + * @return none + */ +static void setActivePage( uint8 pg ) +{ + uint32 pgHdr; + + pgHdr = 0x00100000; + + writeWord( pg, 0, (uint8*) &pgHdr ); + if (!failF) + { + activePg = pg; + } +} + +/********************************************************************* + * @fn setXferPage + * + * @brief Set active page header state to be transfer state. + * + * @param none + * + * @return none + */ +static void setXferPage(void) +{ + uint32 pgHdr; + + // erase difference bit between active state and xfer state + pgHdr = (0x00100000 ^ 0x00100000); + + writeWord( activePg, 0, (uint8*)&pgHdr ); +} + +/********************************************************************* + * @fn erasePage + * + * @brief Erases a page in Flash. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void erasePage( uint8 pg ) +{ + if ( !1 || failF) + { + failF = 1; + return; + } + + HalFlashErase(pg); + + { + // Verify the erase operation + uint16 offset; + uint8 tmp; + + for (offset = 0; offset < 2048; offset ++) + { + HalFlashRead(pg, offset, &tmp, 1); + if (tmp != 0xFF) + { + failF = 1; + break; + } + } + } +} + +/********************************************************************* + * @fn cleanErasedPage + * + * @brief Erases a page in Flash if the page is not completely erased. + * + * @param pg - Valid NV page to erase. + * + * @return none + */ +static void cleanErasedPage( uint8 pg ) +{ + uint8 buf; + uint16 offset; + + for (offset = 0; offset < 2048; offset ++) + { + HalFlashRead(pg, offset, &buf, 1); + if (buf != 0xFF) + { + erasePage(pg); + break; + } + } +} + +/********************************************************************* + * @fn findOffset + * + * @brief find an offset of an empty space in active page + * where to write a new item to. + * + * @param None + * + * @return none + */ +static void findOffset(void) +{ + uint16 offset; + for (offset = 2048 - 4; + offset >= 4; + offset -= 4) + { + uint32 tmp; + + HalFlashRead(activePg, offset, (uint8 *)&tmp, 4); + if (tmp != 0xFFFFFFFF) + { + break; + } + } + pgOff = offset + 4; +} + +/********************************************************************* + * @fn findItem + * + * @brief find a valid item from a designated page and offset + * + * @param pg - NV page + * @param offset - offset in the NV page from where to start + * search up. + * Usually this paramter is set to the empty space + * offset. + * @param id - NV item ID to search for + * + * @return offset of the item, 0 when not found + */ +static uint16 findItem(uint8 pg, uint16 offset, osalSnvId_t id) +{ + offset -= 4; + + while (offset >= 4) + { + osalNvItemHdr_t hdr; + + HalFlashRead(pg, offset, (uint8 *) &hdr, 4); + + if (hdr.id == id) + { + // item found + // length field could be corrupt. Mask invalid length mark. + uint8 len = hdr.len & ~0x8000; + return offset - len; + } + else if (hdr.len & 0x8000) + { + offset -= 4; + } + else + { + // valid length field + if (hdr.len + 4 <= offset) + { + // valid length + offset -= hdr.len + 4; + } + else + { + // active page is corrupt + // This could happen if NV initialization failed upon failure to erase + // page and active page is set to uncleanly erased page. + ; + return 0; + } + } + } + return 0; +} + +/********************************************************************* + * @fn writeItem + * + * @brief Write a data item to NV. Function can write an entire item to NV + * + * @param pg - Page number + * @param offset - offset within the NV page where to write the new item + * @param id - NV item ID + * @param alignedLen - Length of data to write, alinged in flash word + * boundary + * @param *pBuf - Data to write. + * + * @return none + */ +static void writeItem( uint8 pg, uint16 offset, osalSnvId_t id, uint16 alignedLen, uint8 *pBuf ) +{ + osalNvItemHdr_t hdr; + + hdr.id = 0xFFFF; + hdr.len = alignedLen | 0x8000; + + // Write the len portion of the header first + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // remove invalid len mark + hdr.len &= ~0x8000; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // Copy over the data + writeWordM(pg, offset, pBuf, alignedLen / 4); + + // value is valid. Write header except for the most significant bit. + hdr.id = id | 0x8000; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); + + // write the most significant bit + hdr.id &= ~0x8000; + writeWord(pg, offset + alignedLen, (uint8 *) &hdr); +} + +/********************************************************************* + * @fn xferItem + * + * @brief Copy an NV item from the active page to a designated page. + * + * @param pg - NV page where to copy the item to. + * @param offset - NV page offset where to copy the item to. + * @param alignedLen - Length of data to write, aligned in flash word + * boundary. + * @param srcOff - NV page offset of the original data in active page + * + * @return none. + */ +static void xferItem( uint8 pg, uint16 offset, uint16 alignedLen, uint16 srcOff ) +{ + uint8 tmp[4]; + uint16 i = 0; + + // Copy over the data + while (i <= alignedLen) + { + HalFlashRead(activePg, srcOff + i, tmp, 4); + writeWord(pg, offset + i, tmp); + + i += 4; + } +} + +/********************************************************************* + * @fn compactPage + * + * @brief Compacts the page specified. + * + * @param srcPg - Valid NV page to compact from. + * The page must have changed its state (header) to xfer state + * prior to this function call. This function will not + * modify the state of its header to xfer state before starting + * to compact. + * + * @return none. + */ +static void compactPage( uint8 srcPg ) +{ + uint16 srcOff, dstOff; + uint8 dstPg; + osalSnvId_t lastId = (osalSnvId_t) 0xFFFF; + + dstPg = (srcPg == (126-2+1))? ((126-2+1) + 2 - 1) : (126-2+1); + + dstOff = 4; + + // Read from the latest value + srcOff = pgOff - sizeof(osalNvItemHdr_t); + + while (srcOff >= 4) + { + osalNvItemHdr_t hdr; + + if (failF) + { + // Failure during transfer item will make next findItem error prone. + return; + } + + HalFlashRead(srcPg, srcOff, (uint8 *) &hdr, 4); + + if (hdr.id == 0xFFFF) + { + // Invalid entry. Skip this one. + if (hdr.len & 0x8000) + { + srcOff -= 4; + } + else + { + if (hdr.len + 4 <= srcOff) + { + srcOff -= hdr.len + 4; + } + else + { + // invalid length. Source page must be a corrupt page. + // This is possible only if the NV initialization failed upon erasing + // what is selected as active page. + // This is supposed to be a very rare case, as power should be + // shutdown exactly during erase and then the page header is + // still retained as either the Xfer or the Active state. + + // For production code, it might be useful to attempt to erase the page + // so that at next power cycle at least the device is runnable + // (with all entries removed). + // However, it might be still better not to attempt erasing the page + // just to see if this very rare case actually happened. + //erasePage(srcPg); + + ; + return; + } + } + + continue; + } + + // Consider only valid item + if (!(hdr.id & 0x8000) && hdr.id != lastId) + { + // lastId is used to speed up compacting in case the same item ID + // items were neighboring each other contiguously. + lastId = (osalSnvId_t) hdr.id; + + // Check if the latest value of the item was already written + if (findItem(dstPg, dstOff, lastId) == 0) + { + // This item was not copied over yet. + // This must be the latest value. + // Write the latest value to the destination page + + xferItem(dstPg, dstOff, hdr.len, srcOff - hdr.len); + + dstOff += hdr.len + 4; + } + } + srcOff -= hdr.len + 4; + } + + // All items copied. + // Activate the new page + setActivePage(dstPg); + + if (!failF) + { + pgOff = dstOff; // update active page offset + } + + // Erase the currently active page + erasePage(srcPg); +} + +/********************************************************************* + * @fn verifyWordM + * + * @brief verify the written word. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to verify. + * + * @return none + */ +static void verifyWordM( uint8 pg, uint16 offset, uint8 *pBuf, osalSnvLen_t cnt ) +{ + uint8 tmp[4]; + + while (cnt--) + { + // Reading byte per byte will reduce code size but will slow down + // and not sure it will meet the timing requirements. + HalFlashRead(pg, offset, tmp, 4); + if (0 == osal_memcmp(tmp, pBuf, 4)) + { + failF = 1; + return; + } + offset += 4; + pBuf += 4; + } +} + +/********************************************************************* + * @fn writeWord + * + * @brief Writes a Flash-WORD to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param pBuf - Pointer to source buffer. + * + * @return none + */ +static void writeWord( uint8 pg, uint16 offset, uint8 *pBuf ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, pBuf, 1); + verifyWordM(pg, offset, pBuf, 1); + } +} + +/********************************************************************* + * @fn writeWordM + * + * @brief Writes multiple Flash-WORDs to NV. + * + * @param pg - A valid NV Flash page. + * @param offset - A valid offset into the page. + * @param buf - Pointer to source buffer. + * @param cnt - Number of 4-byte blocks to write. + * + * @return none + */ +static void writeWordM( uint8 pg, uint16 offset, uint8 *buf, osalSnvLen_t cnt ) +{ + uint16 addr = (offset >> 2) + ((uint16)pg << 9); + + if ( !failF ) + { + HalFlashWrite(addr, buf, cnt); + verifyWordM(pg, offset, buf, cnt); + } +} + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +uint8 osal_snv_init( void ) +{ + if (!initNV()) + { + // NV initialization failed + ; + + return 0x01; + } + + return 0x00; +} + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 alignedLen; + + { + uint16 offset = findItem(activePg, pgOff, id); + + if (offset > 0) + { + uint8 tmp; + osalSnvLen_t i; + + for (i = 0; i < len; i++) + { + HalFlashRead(activePg, offset, &tmp, 1); + if (tmp != ((uint8 *)pBuf)[i]) + { + break; + } + offset++; + } + + if (i == len) + { + // Changed value is the same value as before. + // Return here instead of re-writing the same value to NV. + return 0x00; + } + } + } + + alignedLen = ((len + 4 - 1) / 4) * 4; + + if ( pgOff + alignedLen + 4 > 2048 ) + { + setXferPage(); + compactPage(activePg); + } + + // pBuf shall be referenced beyond its valid length to save code size. + writeItem(activePg, pgOff, id, alignedLen, pBuf); + if (failF) + { + return 0x0A; + } + + pgOff += alignedLen + 4; + + return 0x00; +} + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf ) +{ + uint16 offset = findItem(activePg, pgOff, id); + + if (offset != 0) + { + HalFlashRead(activePg, offset, pBuf, len); + return 0x00; + } + return 0x0A; +} + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +uint8 osal_snv_compact( uint8 threshold ) +{ + if ( ( threshold < 70 ) || + ( threshold > 95 ) ) + { + return 0x02; + } + + // See if NV active page usage has reached compaction threshold + if ( ( (uint32)pgOff * 100 ) >= ( 2048 * (uint32)threshold ) ) + { + setXferPage(); + compactPage(activePg); + + return 0x00; + } + + return 0x0A; +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/peripheral.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/peripheral.i new file mode 100644 index 0000000..1d98bd3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/peripheral.i @@ -0,0 +1,14765 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +/************************************************************************************************** + Filename: peripheral.c + Revised: $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + Revision: $Revision: 34101 $ + + Description: GAP Peripheral Role + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2013-05-14 12:23:59 -0700 (Tue, 14 May 2013) $ + Revision: $Revision: 34279 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2013-05-15 05:57:26 -0700 (Wed, 15 May 2013) $ + Revision: $Revision: 34287 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + +/******************************************************************************* + * MACROS + */ + +// check if connection parameter ranges for CI (min/max), SL, and LSTO are valid +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// check if the CI/SL/LSTO combination is valid +// based on: LSTO > (1 + Slave Latency) * (Connection Interval * 2) +// Note: The CI * 2 requirement based on ESR05 V1.0, Erratum 3904. +// Note: LSTO time is normalized to units of 1.25ms (i.e. 10ms = 8 * 1.25ms). + + + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// Internal + + + +// Encryption Key Request Reason Codes + + + + +// Disconnect Reason Codes +#line 161 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// Disconnect API Parameter +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#line 195 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// LL Advertiser Channels + + + + + +// LL Advertiser Events + + + + + +// LL Address Type + + + +// Advertiser White List Policy + + + + + +// Scanner White List Policy + + + +// Initiator White List Policy + + + +// Black List Control + + + +// Advertiser Commands + + + + +// LL Scan Commands + + + +// LL Scan Filtering + + + +// LL Scan Types + + + +// LL Tx Power Types + + + +// Data Fragmentation Flag + + + + +// Connection Complete Role + + + +// Encryption Related + + + +// Feature Set Related + +// + + + +// Receive Flow Control + + + +// Direct Test Mode + + +// +#line 287 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// Vendor Specific + + +// + + + + + + + + + + + + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + + +// +#line 348 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// + + + +// Packet Lengths +#line 365 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Event Parameters +*/ + +// Advertising Report Data +#line 377 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// Sleep Clock Accuracy (SCA) +#line 389 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Miscellaneous +*/ + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ 37 ]; + uint16 numCrcErr[ 37 ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + + +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); + + + + +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); + + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + + +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); + + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + + +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); + + + + +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); + + + + +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); + + + + +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); + + + + +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); + + + +#line 1215 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + +#line 1244 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); + + + + +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); + + + + +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); + + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + + +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); + + + + +/******************************************************************************* + * @fn LL_EXT_SetSlaveLatencyOverride API + * + * @brief This API is used to enable or disable the suspention of slave + * latency. This can be helpful when the Slave application knows + * it will soon receive something that needs to be handled without + * delay. + * + * input parameters + * + * @param control - LL_EXT_DISABLE_SL_OVERRIDE, + * LL_EXT_ENABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetSlaveLatencyOverride( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); + + + + +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + + +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn LL_EXT_BuildRevision Vendor Specific API + * + * @brief This API is used to to set a user revision number or read the + * build revision number. + * + * input parameters + * + * @param mode - LL_EXT_SET_USER_REVISION | + * LL_EXT_READ_BUILD_REVISION + * @param userRevNum - A 16 bit value the user can set as their own + * revision number + * + * output parameters + * + * @param buildRev - Pointer to returned build revision, if any. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_BuildRevision( uint8 mode, uint16 userRevNum, uint8 *buildRev ); + + +/* +** LL Callbacks to HCI +*/ + + +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); + + + + +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); + + + + +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); + + + + +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); + + + +#line 2416 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); + + + + +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); + + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + + +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); + + + + +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); + + + + +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); + + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + + + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags + + + + +// Receive Data Packet + + +// Disconnect Reasons +#line 158 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Tx Power Types + + + +// Host Flow Control + + + + + +// Device Address Type + + + +// Advertiser Events + + + + + +// Advertiser Channels + + + + + +// Advertiser White List Policy + + + + + +// Advertiser Commands + + + +// Scan Types + + + +// Scan White List Policy + + + +// Scan Filtering + + + +// Scan Commands + + + +// Initiator White List Policy + + + +// Encryption Related + + + +// Direct Test Mode + + +// +#line 231 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Vendor Specific + + +// + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + +// +#line 275 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +// + + +// + + +// + + + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[6]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[6]; // device address + uint8 dataLen; // length of report data + uint8 rspData[31]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[8]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_ValidConnTimeParams API + * + * @brief This API is used to check that the connection time parameter + * ranges are valid, and that the connection time parameter + * combination is valid. + * + * Note: Only connIntervalMax is used as part of the time parameter + * combination check. + * + * input parameters + * + * @param connIntervalMin - Minimum connection interval. + * @param connIntervalMax - Maximum connection interval. + * @param connLatency - Connection slave latency. + * @param connTimeout - Connection supervision timeout. + * + * output parameters + * + * @param None. + * + * @return TRUE: Connection time parameter check is valid. + * FALSE: Connection time parameter check is invalid. + */ +extern uint8 HCI_ValidConnTimeParams( uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + + +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + +/* +** HCI API +*/ + + +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); + + + + +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + + +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); + + + + +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); + + + + +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); + + + + +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); + + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); + + + +#line 1240 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + +#line 1266 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + + +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); + + + + +/******************************************************************************* + * @fn HCI_EXT_SetSlaveLatencyOverrideCmd API + * + * @brief This HCI Extension API is used to to enable or disable + * suspending slave latency. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_SL_OVERRIDE, + * HCI_EXT_DISABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSlaveLatencyOverrideCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); + + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + + +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn HCI_EXT_BuildRevisionCmd Vendor Specific API + * + * @brief This HCI Extension API is used set a user revision number or + * read the build revision number. + * + * input parameters + * + * @param mode - HCI_EXT_SET_USER_REVISION | HCI_EXT_READ_BUILD_REVISION + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS + */ +extern hciStatus_t HCI_EXT_BuildRevisionCmd( uint8 mode, uint16 userRevNum ); + + + + + + +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_data.h" +/******************************************************************************* + Filename: hci_c_data.h + Revised: $Date: 2011-08-22 08:41:40 -0700 (Mon, 22 Aug 2011) $ + Revision: $Revision: 27235 $ + + Description: This file handles HCI data for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_bufmgr.h" +/************************************************************************************************** + Filename: osal_bufmgr.h + Revised: $Date: 2009-01-14 14:59:55 -0800 (Wed, 14 Jan 2009) $ + Revision: $Revision: 18763 $ + + Description: This file contains the buffer management definitions. + + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +/********************************************************************* + * VARIABLES + */ + + +/********************************************************************* + * MACROS + */ + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Allocate a block of memory. + */ +extern void *osal_bm_alloc( uint16 size ); + +/* + * Add or remove header space for the payload pointer. + */ +extern void *osal_bm_adjust_header( void *payload_ptr, int16 size ); + +/* + * Add or remove tail space for the payload pointer. + */ +extern void *osal_bm_adjust_tail( void *payload_ptr, int16 size ); + +/* + * Free a block of memory. + */ +extern void osal_bm_free( void *payload_ptr ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_data.h" + +/******************************************************************************* + * MACROS + */ + + + +/******************************************************************************* + * CONSTANTS + */ + + + +// Data State + + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 state; // DATA_BUF_FREE, DATA_BUF_IN_USE, DATA_BUF_PENDING + uint16 connHandle; // Connection Handle + uint8 fragFlag; // Packet Boundary Flag + uint16 len; // Data Length + uint8 *pData; // Pointer to Packet Payload +} hciTxData_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Data API +*/ + +/******************************************************************************* + * This function will initialize the buffers for transmit data. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataBufferInit( void ); + + + +/******************************************************************************* + * @fn HCI_TxDataBufferInsert + * + * @brief This function will insert a transmit data packet into the free + * buffers. + * + * input parameters + * + * @param connHandle - Connection handle. + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED + */ +extern hciStatus_t HCI_TxDataBufferInsert( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_TxDataSend + * + * @brief This function sends an ACL transmit data packet to the LL. If + * the packet is successfully transferred to the TX FIFO by the + * LL, then the buffer can be freed. Otherwise, the packet is + * still pending in the LL, so it can't be released. If any error + * occurs (due to parametric checks), then the buffer is freed + * and a Number of Completed Packets event is generated with the + * number of completed packets set to zero. + * + * input parameters + * + * @param connHandle - Connection handle, or HCI_TX_DATA_ANY_CONNECTION. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TxDataSend( uint8 connHandle ); + + + +/******************************************************************************* + * @fn HCI_ReverseBytes + * + * @brief This function is used to reverse the order of the bytes in + * an array in place. + * + * input parameters + * + * @param *buf - Pointer to buffer containing bytes to be reversed. + * @param len - Number of bytes in buffer. + * + * Note: The length must be even. + * + * Note: The maximum length is 128 bytes. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ReverseBytes( uint8 *buf, + uint8 len ); + + + + + + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" +/******************************************************************************* + Filename: hci_c_event.h + Revised: $Date: 2012-05-01 12:13:50 -0700 (Tue, 01 May 2012) $ + Revision: $Revision: 30418 $ + + Description: This file contains the HCI Event types, contants, + external functions etc. for the BLE Controller. + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_tl.h" +/******************************************************************************* + Filename: hci_tl.h + Revised: $Date: 2012-04-20 15:24:45 -0700 (Fri, 20 Apr 2012) $ + Revision: $Revision: 30292 $ + + Description: This file contains the types, contants, external functions + etc. for the BLE HCI Transport Layer. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" + +extern uint8 bleEvtMask; +extern uint8 pHciEvtMask[]; + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +// Event Mask Default Values +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\hci\\hci_event.h" +// + + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** Internal Functions +*/ + +extern void hciInitEventMasks( void ); + +/* +** HCI Controller Events +*/ + +/******************************************************************************* + * @fn HCI_DataBufferOverflowEvent + * + * @brief This function sends the Data Buffer Overflow Event to the Host. + * + * input parameters + * + * @param linkType - HCI_LINK_TYPE_SCO_BUFFER_OVERFLOW, + * HCI_LINK_TYPE_ACL_BUFFER_OVERFLOW + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_DataBufferOverflowEvent( uint8 linkType ); + + +/******************************************************************************* + * @fn HCI_NumOfCompletedPacketsEvent + * + * @brief This function sends the Number of Completed Packets Event to + * the Host. + * + * Note: Currently, the number of handles is always one. + * + * input parameters + * + * @param numHandles - Number of handles. + * @param handlers - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets for + * each handle. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_NumOfCompletedPacketsEvent( uint8 numHandles, + uint16 *handlers, + uint16 *numCompletedPackets ); + + +/******************************************************************************* + * @fn HCI_CommandCompleteEvent + * + * @brief This function sends a Command Complete Event to the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandCompleteEvent( uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_VendorSpecifcCommandCompleteEvent + * + * @brief This function sends a Vendor Specific Command Complete Event to + * the Host. + * + * input parameters + * + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_VendorSpecifcCommandCompleteEvent( uint16 opcode, + uint8 len, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_CommandStatusEvent + * + * @brief This function sends a Command Status Event to the Host. + * + * input parameters + * + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_CommandStatusEvent( uint8 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_HardwareErrorEvent + * + * @brief This function sends a Hardware Error Event to the Host. + * + * input parameters + * + * @param hwErrorCode - The hardware error code. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_HardwareErrorEvent( uint8 hwErrorCode ); + + +/******************************************************************************* + * @fn HCI_SendCommandStatusEvent + * + * @brief This generic function sends a Command Status event to the Host. + * It is provided as a direct call so the Host can use it directly. + * + * input parameters + * + * @param eventCode - The event code. + * @param status - The resulting status of the comamnd. + * @param opcode - The opcode of the command that generated this event. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandStatusEvent ( uint8 eventCode, + uint16 status, + uint16 opcode ); + + +/******************************************************************************* + * @fn HCI_SendCommandCompleteEvent + * + * @brief This generic function sends a Command Complete or a Vendor + * Specific Command Complete Event to the Host. + * + * input parameters + * + * @param eventCode - The event code. + * @param opcode - The opcode of the command that generated this event. + * @param numParam - The number of parameters in the event. + * @param param - The event parameters associated with the command. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendCommandCompleteEvent ( uint8 eventCode, + uint16 opcode, + uint8 numParam, + uint8 *param ); + + +/******************************************************************************* + * @fn HCI_SendControllerToHostEvent + * + * @brief This generic function sends a Controller to Host Event. + * + * input parameters + * + * @param eventCode - Bluetooth event code. + * @param dataLen - Length of dataField. + * @param pData - Pointer to data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SendControllerToHostEvent( uint8 eventCode, + uint8 dataLen, + uint8 *pData ); + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +extern uint8 hciTaskID; +// +extern uint8 hciTestTaskID; +extern uint8 hciGapTaskID; +extern uint8 hciL2capTaskID; +extern uint8 hciSmpTaskID; + +/******************************************************************************* + * MACROS + */ + + + +/******************************************************************************* + * CONSTANTS + */ + +// OSAL Task Events + + + + + +// OSAL Message Header Events + + + + + + +// Max Buffers Supported + + + +// Max Allowed HCI Packet + + + +// Max Data Length in Packet + + +// +// Minimum length for CMD packet is 1+2+1 +// | Packet Type (1) | OPCode(2) | Length(1) | +// + + +// +// Minimum length for EVENT packet is 1+1+1 +// | Packet Type (1) | Event Code(1) | Length(1) | +// + + +// +// Minimum length for DATA packet is 1+2+2 +// | Packet Type (1) | Handler(2) | Length(2) | +// + + +// Max Number of Connections + +// + + +// HCI Packet Types + + + + + +/* +** HCI Command Opcodes +*/ + +// Link Control Commands + + + +// Controller and Baseband Commands +#line 143 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// Information Parameters + + + + + +// Status Parameters + + +// LE Commands +#line 184 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// LE Vendor Specific LL Extension Commands +#line 214 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +/* +** HCI Event Codes +*/ + +// BT Events +#line 229 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +// LE Event Code (for LE Meta Events) + + +// LE Meta Event Codes + + + + + + +// Vendor Specific Event Code + + +// LE Vendor Specific LL Extension Events +#line 272 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\hci\\hci_tl.h" + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI OSAL API +*/ + +/******************************************************************************* + * @fn HCI_Init + * + * @brief This is the HCI OSAL task initialization routine. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_Init( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ProcessEvent + * + * @brief This is the HCI OSAL task process event handler. + * + * input parameters + * + * @param taskID - The HCI OSAL task identifer. + * @param events - HCI OSAL task events. + * + * output parameters + * + * @param None. + * + * @return Unprocessed events. + */ +extern uint16 HCI_ProcessEvent( uint8 task_id, + uint16 events ); + + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 48 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 51 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\osal_snv.h" +/************************************************************************************************** + Filename: osal_snv.h + Revised: $Date: 2013-02-15 10:12:26 -0800 (Fri, 15 Feb 2013) $ + Revision: $Revision: 33143 $ + + Description: This module defines the OSAL simple non-volatile memory functions. + + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + + + + + typedef uint8 osalSnvId_t; + typedef uint8 osalSnvLen_t; + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* + * @fn osal_snv_init + * + * @brief Initialize NV service. + * + * @return SUCCESS if initialization succeeds. FAILURE, otherwise. + */ +extern uint8 osal_snv_init( void ); + +/********************************************************************* + * @fn osal_snv_read + * + * @brief Read data from NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to read. + * @param *pBuf - Data is read into this buffer. + * + * @return SUCCESS if successful. + * Otherwise, NV_OPER_FAILED for failure. + */ +extern uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_write + * + * @brief Write a data item to NV. + * + * @param id - Valid NV item Id. + * @param len - Length of data to write. + * @param *pBuf - Data to write. + * + * @return SUCCESS if successful, NV_OPER_FAILED if failed. + */ +extern uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void *pBuf); + +/********************************************************************* + * @fn osal_snv_compact + * + * @brief Compacts NV if its usage has reached a specific threshold. + * + * @param threshold - compaction threshold + * + * @return SUCCESS if successful, + * NV_OPER_FAILED if failed, or + * INVALIDPARAMETER if threshold invalid. + */ +extern uint8 osal_snv_compact( uint8 threshold ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.h" +/** + @headerfile: peripheral.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage TI BLE GAP Peripheral Role + + This GAP profile advertises and allows connections. + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#line 86 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.h" +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/** + * Possible actions the peripheral device may take if an unsuccessful parameter + * update is received. + * + * Parameters for GAPRole_SendUpdateParam() only + */ + + + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16 connInterval, + uint16 connSlaveLatency, + uint16 connTimeout ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_API GAP Peripheral Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connInterval - the new connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ); + +/** + * @brief Register application's callbacks. + * + * @param pParamUpdateCB - pointer to param update callback. + * + * @return none + */ +extern void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ); + +/** + * @} End GAPROLES_PERIPHERAL_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\Roles\\peripheral.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ +// Profile Events + + + + + + + + + + + + + + + + + + + + + + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ +static uint8 gapRole_TaskID; // Task ID for internal task/event processing + +static gaprole_States_t gapRole_state; + +/********************************************************************* + * Profile Parameters - reference GAPROLE_PROFILE_PARAMETERS for + * descriptions + */ + +static uint8 gapRole_profileRole; +static uint8 gapRole_IRK[16]; +static uint8 gapRole_SRK[16]; +static uint32 gapRole_signCounter; +static uint8 gapRole_bdAddr[6]; +static uint8 gapRole_AdvEnabled = 1; +static uint16 gapRole_AdvertOffTime = 30000; +static uint8 gapRole_AdvertDataLen = 3; +static uint8 gapRole_AdvertData[31] = +{ + 0x02, // length of this data + 0x01, // AD Type = Flags + // Limited Discoverable & BR/EDR not supported + (0x02 | 0x04), + 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 +}; +static uint8 gapRole_ScanRspDataLen = 0; +static uint8 gapRole_ScanRspData[31] = {0}; +static uint8 gapRole_AdvEventType; +static uint8 gapRole_AdvDirectType; +static uint8 gapRole_AdvDirectAddr[6] = {0}; +static uint8 gapRole_AdvChanMap; +static uint8 gapRole_AdvFilterPolicy; + +static uint16 gapRole_ConnectionHandle = 0xFFFF; +static uint16 gapRole_RSSIReadRate = 0; + +static uint8 gapRole_ConnectedDevAddr[6] = {0}; + +static uint8 gapRole_ParamUpdateEnable = 0; +static uint16 gapRole_MinConnInterval = 0x0006; +static uint16 gapRole_MaxConnInterval = 0x0C80; +static uint16 gapRole_SlaveLatency = 0; +static uint16 gapRole_TimeoutMultiplier = 1000; + +static uint16 gapRole_ConnInterval = 0; +static uint16 gapRole_ConnSlaveLatency = 0; +static uint16 gapRole_ConnTimeout = 0; + +static uint8 paramUpdateNoSuccessOption = 0; + +// Application callbacks +static gapRolesCBs_t *pGapRoles_AppCGs = 0; +static gapRolesParamUpdateCB_t *pGapRoles_ParamUpdateCB = 0; + +/********************************************************************* + * Profile Attributes - variables + */ + +/********************************************************************* + * Profile Attributes - Table + */ + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ); +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ); +static void gapRole_SetupGAP( void ); +static void gapRole_HandleParamUpdateNoSuccess( void ); +static void gapRole_startConnUpdate( uint8 handleFailure ); + +/********************************************************************* + * NETWORK LAYER CALLBACKS + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @brief Set a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0x301: + if ( len == 16 ) + { + (void) osal_memcpy( gapRole_IRK, pValue, 16 ) ; + } + else + { + ret = 0x18; + } + break; + + case 0x302: + if ( len == 16 ) + { + (void) osal_memcpy( gapRole_SRK, pValue, 16 ) ; + } + else + { + ret = 0x18; + } + break; + + case 0x303: + if ( len == sizeof ( uint32 ) ) + { + gapRole_signCounter = *((uint32*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x305: + if ( len == sizeof( uint8 ) ) + { + uint8 oldAdvEnabled = gapRole_AdvEnabled; + gapRole_AdvEnabled = *((uint8*)pValue); + + if ( (oldAdvEnabled) && (gapRole_AdvEnabled == 0) ) + { + // Turn off Advertising + if ( gapRole_state == GAPROLE_ADVERTISING ) + { + (void) GAP_EndDiscoverable( gapRole_TaskID ); + } + } + else if ( (oldAdvEnabled == 0) && (gapRole_AdvEnabled) ) + { + // Turn on Advertising + if ( (gapRole_state == GAPROLE_STARTED) + || (gapRole_state == GAPROLE_WAITING) + || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) + { + (void) osal_set_event( gapRole_TaskID, 0x0001 ); + } + } + } + else + { + ret = 0x18; + } + break; + + case 0x306: + if ( len == sizeof ( uint16 ) ) + { + gapRole_AdvertOffTime = *((uint16*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x307: + if ( len <= 31 ) + { + (void) osal_memset( gapRole_AdvertData, 0, 31 ); + (void) osal_memcpy( gapRole_AdvertData, pValue, len ); + gapRole_AdvertDataLen = len; + } + else + { + ret = 0x18; + } + break; + + case 0x308: + if ( len <= 31 ) + { + (void) osal_memset( gapRole_ScanRspData, 0, 31 ); + (void) osal_memcpy( gapRole_ScanRspData, pValue, len ); + gapRole_ScanRspDataLen = len; + } + else + { + ret = 0x18; + } + break; + + case 0x309: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x03) ) + { + gapRole_AdvEventType = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x30A: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x03) ) + { + gapRole_AdvDirectType = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x30B: + if ( len == 6 ) + { + (void) osal_memcpy( gapRole_AdvDirectAddr, pValue, 6 ) ; + } + else + { + ret = 0x18; + } + break; + + case 0x30C: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x07) ) + { + gapRole_AdvChanMap = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x30D: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 0x03) ) + { + gapRole_AdvFilterPolicy = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x30F: + if ( len == sizeof ( uint16 ) ) + { + gapRole_RSSIReadRate = *((uint16*)pValue); + + if ( (gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED) ) + { + // Start the RSSI Reads + (void) osal_start_timerEx( gapRole_TaskID, 0x0002, gapRole_RSSIReadRate ); + } + } + else + { + ret = 0x18; + } + break; + + case 0x310: + if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= 1) ) + { + gapRole_ParamUpdateEnable = *((uint8*)pValue); + } + else + { + ret = 0x18; + } + break; + + case 0x311: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= 0x0006 ) && + ( newInterval <= 0x0C80 ) ) + { + gapRole_MinConnInterval = newInterval; + } + else + { + ret = 0x18; + } + } + break; + + case 0x312: + { + uint16 newInterval = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && + ( newInterval >= 0x0006) && + ( newInterval <= 0x0C80) ) + { + gapRole_MaxConnInterval = newInterval; + } + else + { + ret = 0x18; + } + } + break; + + case 0x313: + { + uint16 latency = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) && (latency < 500) ) + { + gapRole_SlaveLatency = latency; + } + else + { + ret = 0x18; + } + } + break; + + case 0x314: + { + uint16 newTimeout = *((uint16*)pValue); + if ( len == sizeof ( uint16 ) + && (newTimeout >= 0x000a) && (newTimeout <= 0x0c80) ) + { + gapRole_TimeoutMultiplier = newTimeout; + } + else + { + ret = 0x18; + } + } + break; + + case 0x319: + { + uint8 req = *((uint8*)pValue); + if ( len == sizeof ( uint8 ) && (req == 1) ) + { + // Make sure we don't send an L2CAP Connection Parameter Update Request + // command within TGAP(conn_param_timeout) of an L2CAP Connection Parameter + // Update Response being received. + if ( osal_get_timeoutEx( gapRole_TaskID, 0x0008 ) == 0 ) + { + // Start connection update procedure + gapRole_startConnUpdate( 0 ); + + // Connection update requested by app, cancel such pending procedure (if active) + (void) osal_stop_timerEx( gapRole_TaskID, 0x0004 ); + } + else + { + ret = 0x16; + } + } + else + { + ret = 0x18; + } + } + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( (param < 38) && (len == sizeof ( uint16 )) ) + { + ret = GAP_SetParamValue( param, *((uint16*)pValue) ); + } + else + { + ret = 0x02; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Get a GAP Role parameter. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0x300: + *((uint8*)pValue) = gapRole_profileRole; + break; + + case 0x301: + (void) osal_memcpy( pValue, gapRole_IRK, 16 ) ; + break; + + case 0x302: + (void) osal_memcpy( pValue, gapRole_SRK, 16 ) ; + break; + + case 0x303: + *((uint32*)pValue) = gapRole_signCounter; + break; + + case 0x304: + (void) osal_memcpy( pValue, gapRole_bdAddr, 6 ) ; + break; + + case 0x305: + *((uint8*)pValue) = gapRole_AdvEnabled; + break; + + case 0x306: + *((uint16*)pValue) = gapRole_AdvertOffTime; + break; + + case 0x307: + (void) osal_memcpy( pValue , gapRole_AdvertData, gapRole_AdvertDataLen ); + break; + + case 0x308: + (void) osal_memcpy( pValue, gapRole_ScanRspData, gapRole_ScanRspDataLen ) ; + break; + + case 0x309: + *((uint8*)pValue) = gapRole_AdvEventType; + break; + + case 0x30A: + *((uint8*)pValue) = gapRole_AdvDirectType; + break; + + case 0x30B: + (void) osal_memcpy( pValue, gapRole_AdvDirectAddr, 6 ) ; + break; + + case 0x30C: + *((uint8*)pValue) = gapRole_AdvChanMap; + break; + + case 0x30D: + *((uint8*)pValue) = gapRole_AdvFilterPolicy; + break; + + case 0x30E: + *((uint16*)pValue) = gapRole_ConnectionHandle; + break; + + case 0x30F: + *((uint16*)pValue) = gapRole_RSSIReadRate; + break; + + case 0x310: + *((uint16*)pValue) = gapRole_ParamUpdateEnable; + break; + + case 0x311: + *((uint16*)pValue) = gapRole_MinConnInterval; + break; + + case 0x312: + *((uint16*)pValue) = gapRole_MaxConnInterval; + break; + + case 0x313: + *((uint16*)pValue) = gapRole_SlaveLatency; + break; + + case 0x314: + *((uint16*)pValue) = gapRole_TimeoutMultiplier; + break; + + case 0x315: + (void) osal_memcpy( pValue, gapRole_ConnectedDevAddr, 6 ) ; + break; + + case 0x316: + *((uint16*)pValue) = gapRole_ConnInterval; + break; + + case 0x317: + *((uint16*)pValue) = gapRole_ConnSlaveLatency; + break; + + case 0x318: + *((uint16*)pValue) = gapRole_ConnTimeout; + break; + + default: + // The param value isn't part of this profile, try the GAP. + if ( param < 38 ) + { + *((uint16*)pValue) = GAP_GetParamValue( param ); + } + else + { + ret = 0x02; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @brief Does the device initialization. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ) +{ + if ( gapRole_state == GAPROLE_INIT ) + { + // Clear all of the Application callbacks + if ( pAppCallbacks ) + { + pGapRoles_AppCGs = pAppCallbacks; + } + + // Start the GAP + gapRole_SetupGAP(); + + return ( 0x00 ); + } + else + { + return ( 0x11 ); + } +} + +/********************************************************************* + * @brief Register application's callbacks. + * + * Public function defined in peripheral.h. + */ +void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ) +{ + if ( pParamUpdateCB != 0 ) + { + pGapRoles_ParamUpdateCB = pParamUpdateCB; + } +} + +/********************************************************************* + * @brief Terminates the existing connection. + * + * Public function defined in peripheral.h. + */ +bStatus_t GAPRole_TerminateConnection( void ) +{ + if ( gapRole_state == GAPROLE_CONNECTED ) + { + return ( GAP_TerminateLinkReq( gapRole_TaskID, gapRole_ConnectionHandle ) ); + } + else + { + return ( 0x12 ); + } +} + +/********************************************************************* + * LOCAL FUNCTION PROTOTYPES + */ + +/********************************************************************* + * @brief Task Initialization function. + * + * Internal function defined in peripheral.h. + */ +void GAPRole_Init( uint8 task_id ) +{ + gapRole_TaskID = task_id; + + gapRole_state = GAPROLE_INIT; + gapRole_ConnectionHandle = 0xFFFF; + + GAP_RegisterForHCIMsgs( gapRole_TaskID ); + + // Initialize the Profile Advertising and Connection Parameters + gapRole_profileRole = 0x04; + (void) osal_memset( gapRole_IRK, 0, 16 ); + (void) osal_memset( gapRole_SRK, 0, 16 ); + gapRole_signCounter = 0; + gapRole_AdvEventType = 0x00; + gapRole_AdvDirectType = 0x00; + gapRole_AdvChanMap = (0x01 | 0x02 | 0x04); + gapRole_AdvFilterPolicy = 0x00; + + // Restore Items from NV + (void) osal_snv_read( 0x02, 16, gapRole_IRK ); + (void) osal_snv_read( 0x03, 16, gapRole_SRK ); + (void) osal_snv_read( 0x04, sizeof( uint32 ), &gapRole_signCounter ); +} + +/********************************************************************* + * @brief Task Event Processor function. + * + * Internal function defined in peripheral.h. + */ +uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ) +{ + (void) task_id; // OSAL required parameter that isn't used in this function + + if ( events & 0x8000 ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( gapRole_TaskID )) != 0 ) + { + gapRole_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + (void) osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ 0x8000); + } + + if ( events & 0x4000 ) + { + // Sign counter changed, save it to NV + (void) osal_snv_write( 0x04, sizeof( uint32 ), &gapRole_signCounter ); + + return ( events ^ 0x4000 ); + } + + if ( events & 0x0001 ) + { + if ( gapRole_AdvEnabled ) + { + gapAdvertisingParams_t params; + + // Setup advertisement parameters + params.eventType = gapRole_AdvEventType; + params.initiatorAddrType = gapRole_AdvDirectType; + (void) osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, 6 ); + params.channelMap = gapRole_AdvChanMap; + params.filterPolicy = gapRole_AdvFilterPolicy; + + if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != 0x00 ) + { + gapRole_state = GAPROLE_ERROR; + + // Notify the application with the new state change + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } + } + return ( events ^ 0x0001 ); + } + + if ( events & 0x0002 ) + { + // Only get RSSI when in a connection + if ( gapRole_state == GAPROLE_CONNECTED ) + { + // Ask for RSSI + (void) HCI_ReadRssiCmd( gapRole_ConnectionHandle ); + + // Setup next event + if ( gapRole_RSSIReadRate ) + { + (void) osal_start_timerEx( gapRole_TaskID, 0x0002, gapRole_RSSIReadRate ); + } + } + return ( events ^ 0x0002 ); + } + + if ( events & 0x0004 ) + { + // Start connection update procedure + gapRole_startConnUpdate( 0 ); + + return ( events ^ 0x0004 ); + } + + if ( events & 0x0008 ) + { + // Unsuccessful in updating connection parameters + gapRole_HandleParamUpdateNoSuccess(); + + return ( events ^ 0x0008 ); + } + + // Discard unknown events + return 0; +} + +/********************************************************************* + * @fn gapRole_ProcessOSALMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessOSALMsg( osal_event_hdr_t *pMsg ) +{ + switch ( pMsg->event ) + { + case 0x91: + if ( pMsg->status == 0x0E ) + { + hciEvt_CmdComplete_t *pPkt = (hciEvt_CmdComplete_t *)pMsg; + + if ( pPkt->cmdOpcode == 0x1405 ) + { + int8 rssi = (int8)pPkt->pReturnParam[3]; + + if ( (gapRole_state == GAPROLE_CONNECTED) && (rssi != 127) ) + { + // Report RSSI to app + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead ) + { + pGapRoles_AppCGs->pfnRssiRead( rssi ); + } + } + } + } + break; + + case 0xD0: + gapRole_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + break; + + case 0xA2: + { + l2capSignalEvent_t *pPkt = (l2capSignalEvent_t *)pMsg; + + // Process the Parameter Update Response + if ( pPkt->opcode == 0x13 ) + { + l2capParamUpdateRsp_t *pRsp = (l2capParamUpdateRsp_t *)&(pPkt->cmd.updateRsp); + + if ( ( pRsp->result == 0x0001 ) && + ( paramUpdateNoSuccessOption == 2 ) ) + { + // Cancel connection param update timeout timer + (void) osal_stop_timerEx( gapRole_TaskID, 0x0008 ); + + // Terminate connection immediately + GAPRole_TerminateConnection(); + } + else + { + uint16 timeout = GAP_GetParamValue( 5 ); + + // Let's wait for Controller to update connection parameters if they're + // accepted. Otherwise, decide what to do based on no success option. + (void) osal_start_timerEx( gapRole_TaskID, 0x0008, timeout ); + } + } + } + break; + + default: + break; + } +} + +/********************************************************************* + * @fn gapRole_ProcessGAPMsg + * + * @brief Process an incoming task message. + * + * @param pMsg - message to process + * + * @return none + */ +static void gapRole_ProcessGAPMsg( gapEventHdr_t *pMsg ) +{ + uint8 notify = 0; // State changed notify the app? (default no) + + switch ( pMsg->opcode ) + { + case 0x00: + { + gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *)pMsg; + bStatus_t stat = pPkt->hdr.status; + + if ( stat == 0x00 ) + { + // Save off the generated keys + (void) osal_snv_write( 0x02, 16, gapRole_IRK ); + (void) osal_snv_write( 0x03, 16, gapRole_SRK ); + + // Save off the information + (void) osal_memcpy( gapRole_bdAddr, pPkt->devAddr, 6 ); + + gapRole_state = GAPROLE_STARTED; + + // Update the advertising data + stat = GAP_UpdateAdvertisingData( gapRole_TaskID, + 1, gapRole_AdvertDataLen, gapRole_AdvertData ); + } + + if ( stat != 0x00 ) + { + gapRole_state = GAPROLE_ERROR; + } + + notify = 1; + } + break; + + case 0x02: + { + gapAdvDataUpdateEvent_t *pPkt = (gapAdvDataUpdateEvent_t *)pMsg; + + if ( pPkt->hdr.status == 0x00 ) + { + if ( pPkt->adType ) + { + // Setup the Response Data + pPkt->hdr.status = GAP_UpdateAdvertisingData( gapRole_TaskID, + 0, gapRole_ScanRspDataLen, gapRole_ScanRspData ); + } + else + { + // Start advertising + (void) osal_set_event( gapRole_TaskID, 0x0001 ); + } + } + + if ( pPkt->hdr.status != 0x00 ) + { + // Set into Error state + gapRole_state = GAPROLE_ERROR; + notify = 1; + } + } + break; + + case 0x03: + case 0x04: + { + gapMakeDiscoverableRspEvent_t *pPkt = (gapMakeDiscoverableRspEvent_t *)pMsg; + + if ( pPkt->hdr.status == 0x00 ) + { + if ( pMsg->opcode == 0x03 ) + { + gapRole_state = GAPROLE_ADVERTISING; + } + else // GAP_END_DISCOVERABLE_DONE_EVENT + { + + if ( gapRole_AdvertOffTime != 0 ) + { + if ( ( gapRole_AdvEnabled ) ) + { + (void) osal_start_timerEx( gapRole_TaskID, 0x0001, gapRole_AdvertOffTime ); + } + } + else + { + // Since gapRole_AdvertOffTime is set to 0, the device should not + // automatically become discoverable again after a period of time. + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = 0; + } + + // In the Advertising Off period + gapRole_state = GAPROLE_WAITING; + + } + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = 1; + } + break; + + case 0x05: + { + gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg; + + if ( pPkt->hdr.status == 0x00 ) + { + (void) osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, 6 ); + gapRole_ConnectionHandle = pPkt->connectionHandle; + gapRole_state = GAPROLE_CONNECTED; + + if ( gapRole_RSSIReadRate ) + { + // Start the RSSI Reads + (void) osal_start_timerEx( gapRole_TaskID, 0x0002, gapRole_RSSIReadRate ); + } + + // Store connection information + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + + // Check whether update parameter request is enabled + if ( gapRole_ParamUpdateEnable == 1 ) + { + // Get the minimum time upon connection establishment before the + // peripheral can start a connection update procedure. + uint16 timeout = GAP_GetParamValue( 31 ); + + osal_start_timerEx( gapRole_TaskID, 0x0004, timeout*1000 ); + } + + // Notify the Bond Manager to the connection + (void) GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, 0x04 ); + } + else if ( pPkt->hdr.status == 0x31 ) + { + // Set enabler to FALSE; device will become discoverable again when + // this value gets set to TRUE + gapRole_AdvEnabled = 0; + + // Go to WAITING state, and then start advertising + gapRole_state = GAPROLE_WAITING; + } + else + { + gapRole_state = GAPROLE_ERROR; + } + notify = 1; + } + break; + + case 0x06: + { + gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg; + + GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg ); + osal_memset( gapRole_ConnectedDevAddr, 0, 6 ); + + // Erase connection information + gapRole_ConnInterval = 0; + gapRole_ConnSlaveLatency = 0; + gapRole_ConnTimeout = 0; + + // Cancel all connection parameter update timers (if any active) + (void) osal_stop_timerEx( gapRole_TaskID, 0x0004 ); + (void) osal_stop_timerEx( gapRole_TaskID, 0x0008 ); + + // Go to WAITING state, and then start advertising + if( pPkt->reason == 0x08 ) + { + gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; + } + else + { + gapRole_state = GAPROLE_WAITING; + } + + notify = 1; + + (void) osal_set_event( gapRole_TaskID, 0x0001 ); + + gapRole_ConnectionHandle = 0xFFFF; + } + break; + + case 0x07: + { + gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg; + + // Cancel connection param update timeout timer (if active) + (void) osal_stop_timerEx( gapRole_TaskID, 0x0008 ); + + if ( pPkt->hdr.status == 0x00 ) + { + // Store new connection parameters + gapRole_ConnInterval = pPkt->connInterval; + gapRole_ConnSlaveLatency = pPkt->connLatency; + gapRole_ConnTimeout = pPkt->connTimeout; + + // Make sure there's no pending connection update procedure + if ( osal_get_timeoutEx( gapRole_TaskID, 0x0004 ) == 0 ) + { + // Notify the application with the new connection parameters + if ( pGapRoles_ParamUpdateCB != 0 ) + { + (*pGapRoles_ParamUpdateCB)( gapRole_ConnInterval, + gapRole_ConnSlaveLatency, + gapRole_ConnTimeout ); + } + } + } + } + break; + + default: + break; + } + + if ( notify == 1 ) + { + // Notify the application with the new state change + if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange ) + { + pGapRoles_AppCGs->pfnStateChange( gapRole_state ); + } + } +} + +/********************************************************************* + * @fn gapRole_SetupGAP + * + * @brief Call the GAP Device Initialization function using the + * Profile Parameters. + * + * @param none + * + * @return none + */ +static void gapRole_SetupGAP( void ) +{ + (void) GAP_DeviceInit( gapRole_TaskID, + gapRole_profileRole, 0, + gapRole_IRK, gapRole_SRK, + &gapRole_signCounter ); +} + +/********************************************************************* + * @fn gapRole_HandleParamUpdateNoSuccess + * + * @brief Handle unsuccessful connection parameters update. + * + * @param none + * + * @return none + */ +static void gapRole_HandleParamUpdateNoSuccess( void ) +{ + // See which option was choosen for unsuccessful updates + switch ( paramUpdateNoSuccessOption ) + { + case 1: + GAPRole_SendUpdateParam( gapRole_MinConnInterval, gapRole_MaxConnInterval, + gapRole_SlaveLatency, gapRole_TimeoutMultiplier, + 1 ); + break; + + case 2: + GAPRole_TerminateConnection(); + break; + + case 0: + // fall through + default: + //do nothing + break; + } +} + +/******************************************************************** + * @fn gapRole_startConnUpdate + * + * @brief Start the connection update procedure + * + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return none + */ +static void gapRole_startConnUpdate( uint8 handleFailure ) +{ + // First check the current connection parameters versus the configured parameters + if ( (gapRole_ConnInterval < gapRole_MinConnInterval) || + (gapRole_ConnInterval > gapRole_MaxConnInterval) || + (gapRole_ConnSlaveLatency != gapRole_SlaveLatency) || + (gapRole_ConnTimeout != gapRole_TimeoutMultiplier) ) + { + l2capParamUpdateReq_t updateReq; + uint16 timeout = GAP_GetParamValue( 5 ); + + updateReq.intervalMin = gapRole_MinConnInterval; + updateReq.intervalMax = gapRole_MaxConnInterval; + updateReq.slaveLatency = gapRole_SlaveLatency; + updateReq.timeoutMultiplier = gapRole_TimeoutMultiplier; + + (void) L2CAP_ConnParamUpdateReq( gapRole_ConnectionHandle, &updateReq, gapRole_TaskID ); + + paramUpdateNoSuccessOption = handleFailure; + + // Let's wait for L2CAP Connection Parameters Update Response + (void) osal_start_timerEx( gapRole_TaskID, 0x0008, timeout ); + } +} + +/******************************************************************** + * @fn GAPRole_SendUpdateParam + * + * @brief Update the parameters of an existing connection + * + * @param minConnInterval - the new min connection interval + * @param maxConnInterval - the new max connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected, or bleInvalidRange + */ +bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ) +{ + // If there is no existing connection no update need be sent + if ( gapRole_state != GAPROLE_CONNECTED ) + { + return ( 0x14 ); + } + + // Check that all parameters are in range before sending request + if ( ( minConnInterval >= 0x0006 ) && + ( minConnInterval < 0x0C80 ) && + ( maxConnInterval >= 0x0006 ) && + ( maxConnInterval < 0x0C80 ) && + ( latency < 500 ) && + ( connTimeout >= 0x000a ) && + ( connTimeout < 0x0c80 ) ) + { + gapRole_MinConnInterval = minConnInterval; + gapRole_MaxConnInterval = maxConnInterval; + gapRole_SlaveLatency = latency; + gapRole_TimeoutMultiplier = connTimeout; + + // Start connection update procedure + gapRole_startConnUpdate( handleFailure ); + + // Connection update requested by app, cancel such pending procedure (if active) + (void) osal_stop_timerEx( gapRole_TaskID, 0x0004 ); + + return ( 0x00 ); + } + + return ( 0x18 ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/simpleGATTprofile.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/simpleGATTprofile.i new file mode 100644 index 0000000..d4982b0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/simpleGATTprofile.i @@ -0,0 +1,7820 @@ +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +/************************************************************************************************** + Filename: simpleGATTprofile.c + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the Simple GATT profile sample GATT service + profile for use with the BLE sample application. + + Copyright 2010 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 106 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "E:\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "E:\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "E:\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "E:\\BLE\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "E:\\BLE\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "E:\\BLE\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 48 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 49 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 50 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "E:\\BLE\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 71 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 51 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" + +#line 1 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.h" +/************************************************************************************************** + Filename: simpleGATTprofile.h + Revised: $Date: 2010-08-06 08:56:11 -0700 (Fri, 06 Aug 2010) $ + Revision: $Revision: 23333 $ + + Description: This file contains the Simple GATT profile definitions and + prototypes. + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters + + + + +// Simple Profile Service UUID + + + + + + +// Simple Keys Profile Services bit fields + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*simpleProfileChange_t)( uint8 paramID ); + +typedef struct +{ + simpleProfileChange_t pfnSimpleProfileChange; // Called when characteristic value changes +} simpleProfileCBs_t; + + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * SimpleProfile_AddService- Initializes the Simple GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ + +extern bStatus_t SimpleProfile_AddService( uint32 services ); + +/* + * SimpleProfile_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t SimpleProfile_RegisterAppCBs( simpleProfileCBs_t *appCallbacks ); + +/* + * SimpleProfile_SetParameter - Set a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * SimpleProfile_GetParameter - Get a Simple GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 53 "E:\\BLE\\Projects\\Wimu\\Projects\\ble\\Profiles\\SIMPLEPROFILE\\simpleGATTprofile.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Simple GATT Profile Service UUID: 0xFFF0 +const uint8 simpleProfileServUUID[2] = +{ + ((0x1819) & 0xFF), (((0x1819) >> 8) & 0xFF) +}; + +// GPS_FEATURES_UUID +const uint8 simpleProfilechar1UUID[2] = +{ + ((0x2A6A) & 0xFF), (((0x2A6A) >> 8) & 0xFF) +}; + +// GPS_LOCATION_AND_SPEED_UUID +const uint8 simpleProfilechar2UUID[2] = +{ + ((0x2A67) & 0xFF), (((0x2A67) >> 8) & 0xFF) +}; + +// GPS_POSITION_QUALITY_UUID +const uint8 simpleProfilechar3UUID[2] = +{ + ((0x2A69) & 0xFF), (((0x2A69) >> 8) & 0xFF) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static simpleProfileCBs_t *simpleProfile_AppCBs = 0; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Simple Profile Service attribute +static const gattAttrType_t simpleProfileService = { 2, simpleProfileServUUID }; + + +// Simple Profile Characteristic 1 Properties +static uint8 simpleProfileChar1Props = 0x02; + +// Characteristic 1 Value +static uint8 simpleProfileChar1 = 30; + +// Simple Profile Characteristic 1 User Description +static uint8 simpleProfileChar1UserDesp[17] = "Characteristic 1\0"; + + +// Simple Profile Characteristic 2 Properties +static uint8 simpleProfileChar2Props = 0x02; + +// Characteristic 2 Value +static uint8 simpleProfileChar2 = 20; + +// Simple Profile Characteristic 2 User Description +static uint8 simpleProfileChar2UserDesp[17] = "Characteristic 2\0"; + + +// Simple Profile Characteristic 3 Properties +static uint8 simpleProfileChar3Props = 0x02; + +// Characteristic 3 Value +static uint8 simpleProfileChar3 = 10; + +// Simple Profile Characteristic 3 User Description +static uint8 simpleProfileChar3UserDesp[17] = "Characteristic 3\0"; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t simpleProfileAttrTbl[17] = +{ + // Simple Profile Service + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&simpleProfileService /* pValue */ + }, + + // Characteristic 1 Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &simpleProfileChar1Props + }, + + // Characteristic Value 1 + { + { 2, simpleProfilechar1UUID }, + 0x01 | 0x02, + 0, + &simpleProfileChar1 + }, + + // Characteristic 1 User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + simpleProfileChar1UserDesp + }, + + // Characteristic 2 Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &simpleProfileChar2Props + }, + + // Characteristic Value 2 + { + { 2, simpleProfilechar2UUID }, + 0x01, + 0, + &simpleProfileChar2 + }, + + // Characteristic 2 User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + simpleProfileChar2UserDesp + }, + + // Characteristic 3 Declaration + { + { 2, characterUUID }, + 0x01, + 0, + &simpleProfileChar3Props + }, + + // Characteristic Value 3 + { + { 2, simpleProfilechar3UUID }, + 0x02, + 0, + &simpleProfileChar3 + }, + + // Characteristic 3 User Description + { + { 2, charUserDescUUID }, + 0x01, + 0, + simpleProfileChar3UserDesp + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +static void simpleProfile_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Simple Profile Service Callbacks +const gattServiceCBs_t simpleProfileCBs = +{ + simpleProfile_ReadAttrCB, // Read callback function pointer + simpleProfile_WriteAttrCB, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn SimpleProfile_AddService + * + * @brief Initializes the Simple Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return Success or Failure + */ +bStatus_t SimpleProfile_AddService( uint32 services ) +{ + uint8 status = 0x00; + + // Register with Link DB to receive link status change callback + (void) linkDB_Register( simpleProfile_HandleConnStatusCB ); + + if ( services & 0x00000001 ) + { + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( simpleProfileAttrTbl, + ( sizeof( simpleProfileAttrTbl ) / sizeof( gattAttribute_t ) ), + &simpleProfileCBs ); + } + + return ( status ); +} + + +/********************************************************************* + * @fn SimpleProfile_RegisterAppCBs + * + * @brief Registers the application callback function. Only call + * this function once. + * + * @param callbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +bStatus_t SimpleProfile_RegisterAppCBs( simpleProfileCBs_t *appCallbacks ) +{ + if ( appCallbacks ) + { + simpleProfile_AppCBs = appCallbacks; + + return ( 0x00 ); + } + else + { + return ( 0x11 ); + } +} + + +/********************************************************************* + * @fn SimpleProfile_SetParameter + * + * @brief Set a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar1 = *((uint8*)value); + } + else + { + ret = 0x18; + } + break; + + case 1: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar2 = *((uint8*)value); + } + else + { + ret = 0x18; + } + break; + + case 2: + if ( len == sizeof ( uint8 ) ) + { + simpleProfileChar3 = *((uint8*)value); + } + else + { + ret = 0x18; + } + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn SimpleProfile_GetParameter + * + * @brief Get a Simple Profile parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + *((uint8*)value) = simpleProfileChar1; + break; + + case 1: + *((uint8*)value) = simpleProfileChar2; + break; + + case 2: + *((uint8*)value) = simpleProfileChar3; + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn simpleProfile_ReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = 0x00; + + // If attribute permissions require authorization to read, return error + if ( ( (pAttr->permissions) & 0x10 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( 0x0b ); + } + + if ( pAttr->type.len == 2 ) + { + // 16-bit UUID + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + // No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases; + // gattserverapp handles those reads + + // characteristics 1 and 2 have read permissions + // characteritisc 3 does not have read permissions; therefore it is not + // included here + // characteristic 4 does not have read permissions, but because it + // can be sent as a notification, it is included here + case 0x2A6A: + case 0x2A67: + *pLen = 1; + pValue[0] = *pAttr->pValue; + break; + + default: + // Should never get here! (characteristics 3 and 4 do not have read permissions) + *pLen = 0; + status = 0x0a; + break; + } + } + else + { + // 128-bit UUID + *pLen = 0; + status = 0x01; + } + + return ( status ); +} + +/********************************************************************* + * @fn simpleProfile_WriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + bStatus_t status = 0x00; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( ( (pAttr->permissions) & 0x20 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + if ( pAttr->type.len == 2 ) + { + // 16-bit UUID + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + switch ( uuid ) + { + case 0x2A6A: + case 0x2A69: + + //Validate the value + // Make sure it's not a blob oper + if ( offset == 0 ) + { + if ( len != 1 ) + { + status = 0x0d; + } + } + else + { + status = 0x0b; + } + + //Write the value + if ( status == 0x00 ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + *pCurValue = pValue[0]; + + if( pAttr->pValue == &simpleProfileChar1 ) + { + notifyApp = 0; + } + else + { + notifyApp = 2; + } + } + + break; + + case 0x2902: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, 0x0001 ); + break; + + default: + // Should never get here! (characteristics 2 and 4 do not have write permissions) + status = 0x0a; + break; + } + } + else + { + // 128-bit UUID + status = 0x01; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange ) + { + simpleProfile_AppCBs->pfnSimpleProfileChange( notifyApp ); + } + + return ( status ); +} + +/********************************************************************* + * @fn simpleProfile_HandleConnStatusCB + * + * @brief Simple Profile link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +static void simpleProfile_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + +} + + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/st_util.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/st_util.i new file mode 100644 index 0000000..ca65dcb --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/st_util.i @@ -0,0 +1,4359 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.c" +/************************************************************************************************** + Filename: st_util.c + Revised: $Date: 2012-09-25 06:26:26 -0700 (Tue, 25 Sep 2012) $ + Revision: $Revision: 31617 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 44 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.h" +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/********************************************************************* + * MACROS + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.h" + +// Using 16-bit UUID + + + + + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.c" + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pUuid - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pUuid) +{ + bStatus_t status = 0x00; + + if ( pAttr->type.len == 2 ) + { + // 16-bit UUID direct + *pUuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); +#line 77 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\SENSORPROFILE\\st_util.c" + } else { + *pUuid = 0xFFFF; + status = 0x01; + } + + return status; +} + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/timeservice.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/timeservice.i new file mode 100644 index 0000000..b5d4335 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/timeservice.i @@ -0,0 +1,7421 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +/************************************************************************************************** + Filename: timeservice.c + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Current Time service. + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 14 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 15 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 16 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\host\\linkdb.h" +/************************************************************************************************** + Filename: linkdb.h + Revised: $Date: 2011-11-07 09:13:23 -0800 (Mon, 07 Nov 2011) $ + Revision: $Revision: 28245 $ + + Description: This file contains the linkDB interface. + + Copyright 2009 - 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Special case connection handles + + + +// Link state flags + + + + + + +// Link Database Status callback changeTypes + + + + +// Link Authentication Errors + + + + +/********************************************************************* + * TYPEDEFS + */ + +typedef struct +{ + uint8 srk[16]; // Signature Resolving Key + uint32 signCounter; // Sign Counter +} linkSec_t; + +typedef struct +{ + uint8 ltk[16]; // Long Term Key + uint16 div; // Diversifier + uint8 rand[8]; // random number + uint8 keySize; // LTK Key Size +} encParams_t; + +typedef struct +{ + uint8 taskID; // Application that controls the link + uint16 connectionHandle; // Controller connection handle + uint8 stateFlags; // LINK_CONNECTED, LINK_AUTHENTICATED... + uint8 addrType; // Address type of connected device + uint8 addr[6]; // Other Device's address + uint16 connInterval; // The connection's interval (n * 1.23 ms) + linkSec_t sec; // Connection Security related items + encParams_t *pEncParams; // pointer to LTK, ediv, rand. if needed. +} linkDBItem_t; + +// function pointer used to register for a status callback +typedef void (*pfnLinkDBCB_t)( uint16 connectionHandle, uint8 changeType ); + +// function pointer used to perform specialized link database searches +typedef void (*pfnPerformFuncCB_t)( linkDBItem_t *pLinkItem ); + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + /* + * linkDB_Init - Initialize the Link Database. + */ + extern void linkDB_Init( void ); + + /* + * linkDB_Register - Register with this function to receive a callback when + * status changes on a connection. + */ + extern uint8 linkDB_Register( pfnLinkDBCB_t pFunc ); + + /* + * linkDB_Add - Adds a record to the link database. + */ + extern uint8 linkDB_Add( uint8 taskID, uint16 connectionHandle, uint8 stateFlags, + uint8 addrType, uint8 *pAddr, uint16 connInterval ); + + /* + * linkDB_Remove - Removes a record from the link database. + */ + extern uint8 linkDB_Remove( uint16 connectionHandle ); + + /* + * linkDB_Update - This function is used to update the stateFlags of + * a link record. + */ + extern uint8 linkDB_Update( uint16 connectionHandle, uint8 newState ); + + /* + * linkDB_NumActive - returns the number of active connections. + */ + extern uint8 linkDB_NumActive( void ); + + /* + * linkDB_Find - Find link database item (link information) + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_Find( uint16 connectionHandle ); + + /* + * linkDB_FindFirst - Find the first link that matches the taskID. + * + * returns a pointer to the link item, NULL if not found + */ + extern linkDBItem_t *linkDB_FindFirst( uint8 taskID ); + + /* + * linkDB_State - Check to see if a physical link is in a specific state. + * + * returns TRUE is the link is in state. FALSE, otherwise. + */ + extern uint8 linkDB_State( uint16 connectionHandle, uint8 state ); + + /* + * linkDB_Authen - Check to see if the physical link is encrypted and authenticated. + * returns SUCCESS if the link is authenticated or + * bleNotConnected - connection handle is invalid, + * LINKDB_ERR_INSUFFICIENT_AUTHEN - link is not encrypted, + * LINBDB_ERR_INSUFFICIENT_KEYSIZE - key size encrypted is not large enough, + * LINKDB_ERR_INSUFFICIENT_ENCRYPTION - link is encrypted, but not authenticated + */ + extern uint8 linkDB_Authen( uint16 connectionHandle, uint8 keySize ); + + /* + * linkDB_PerformFunc - Perform a function of each connection in the link database. + */ + extern void linkDB_PerformFunc( pfnPerformFuncCB_t cb ); + + /* + * linkDB_Up - Check to see if a physical link is up (connected). + * Use like: uint8 linkDB_Up( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is up. FALSE, otherwise. + */ + + + /* + * linkDB_Encrypted - Check to see if the physical link is encrypted. + * Use like: linkDB_Encrypted( uint16 connectionHandle ); + * connectionHandle - controller link connection handle. + * returns TRUE if the link is authenticated. FALSE, otherwise. + */ + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 17 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 18 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 19 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" +/************************************************************************************************** + Filename: gatt_uuid.h + Revised: $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + Revision: $Revision: 20240 $ + + Description: This file contains Generic Attribute Profile (GATT) + UUID types. + + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +/* + * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published + * in the Bluetooth Assigned Numbers page. Do not change these values. + * Changing them will cause Bluetooth interoperability issues. + */ + +/** + * GATT Services + */ + + + +/** + * GATT Declarations + */ + + + + + +/** + * GATT Descriptors + */ +#line 89 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Characteristics + */ +#line 99 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/** + * GATT Units + */ +#line 111 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 136 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + + + +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt_uuid.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * VARIABLES + */ + +/** + * GATT Services + */ +extern const uint8 gapServiceUUID[]; +extern const uint8 gattServiceUUID[]; + +/** + * GATT Attribute Types + */ +extern const uint8 primaryServiceUUID[]; +extern const uint8 secondaryServiceUUID[]; +extern const uint8 includeUUID[]; +extern const uint8 characterUUID[]; + +/** + * GATT Characteristic Descriptors + */ +extern const uint8 charExtPropsUUID[]; +extern const uint8 charUserDescUUID[]; +extern const uint8 clientCharCfgUUID[]; +extern const uint8 clientCharCfg2UUID[]; +extern const uint8 servCharCfgUUID[]; +extern const uint8 charFormatUUID[]; +extern const uint8 charAggFormatUUID[]; +extern const uint8 validRangeUUID[]; +extern const uint8 extReportRefUUID[]; +extern const uint8 reportRefUUID[]; + +/** + * GATT Characteristic Types + */ +extern const uint8 deviceNameUUID[]; +extern const uint8 appearanceUUID[]; +extern const uint8 periPrivacyFlagUUID[]; +extern const uint8 reconnectAddrUUID[]; +extern const uint8 periConnParamUUID[]; +extern const uint8 serviceChangedUUID[]; +extern const uint8 manuNameUUID[]; +extern const uint8 serialNumUUID[]; +extern const uint8 manuAddrUUID[]; + +/********************************************************************* + * FUNCTIONS + */ +extern const uint8 *GATT_FindUUIDRec( uint8 *pUUID, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 20 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 21 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hid_uuid.h" +/************************************************************************************************** + Filename: hid_uuid.h + Revised: $Date: 2012-01-26 13:42:33 -0800 (Thu, 26 Jan 2012) $ + Revision: $Revision: 64 $ + + Description: This file contains UUIDs for the HID service. + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/* HID service */ + + +/* HID characteristics */ +#line 63 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hid_uuid.h" + +/* HID information flags */ + + + +/* Control point commands */ + + + +/* HID protocol mode values */ + + + +/* Attribute value lengths */ + + + + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" +/************************************************************************************************** + Filename: hiddev.h + Revised: $Date: 2013-05-06 13:33:47 -0700 (Mon, 06 May 2013) $ + Revision: $Revision: 34153 $ + + Description: This file contains the common HID Device profile. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// HID Device Parameters + + +// HID read/write operation + + + + + +// HID callback events + + + + + +/* HID Report type */ + + + + +// HID Keyboard/Keypad Usage IDs (subset of the codes available in the USB HID Usage Tables spec) +#line 189 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + + + + + +// HID Consumer Usage IDs (subset of the codes available in the USB HID Usage Tables spec) + + + + +#line 208 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +#line 225 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +#line 232 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\HIDDev\\hiddev.h" + +/********************************************************************* + * TYPEDEFS + */ + +// HID report mapping table +typedef struct +{ + uint16 handle; // Handle of report characteristic + uint16 cccdHandle; // Handle of CCCD for report characteristic + uint8 id; // Report ID + uint8 type; // Report type + uint8 mode; // Protocol mode (report or boot) +} hidRptMap_t; + +// HID dev configuration structure +typedef struct +{ + uint32 idleTimeout; // Idle timeout in milliseconds + uint8 hidFlags; // HID feature flags + +} hidDevCfg_t; + +/********************************************************************* + * Global Variables + */ + +// These variables are defined in the service .c file that uses HID Dev + +// HID report map length +extern uint8 hidReportMapLen; + +// HID protocol mode +extern uint8 hidProtocolMode; + +/********************************************************************* + * Profile Callbacks + */ + +// HID Report callback +typedef uint8 (*hidDevReportCB_t)( uint8 id, uint8 type, uint16 uuid, + uint8 oper, uint8 *pLen, uint8 *pData ); + +// HID event callback +typedef void (*hidDevEvtCB_t)( uint8 evt ); + +// HID passcode callback +typedef void (*hidDevPasscodeCB_t)( uint8 *deviceAddr, uint16 connectionHandle, + uint8 uiInputs, uint8 uiOutputs ); + +typedef struct +{ + hidDevReportCB_t reportCB; + hidDevEvtCB_t evtCB; + hidDevPasscodeCB_t passcodeCB; +} hidDevCB_t; + +/********************************************************************* + * @fn HidDev_Init + * + * @brief Initialization function for the Hid Dev Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +extern void HidDev_Init( uint8 task_id ); + +/********************************************************************* + * @fn HidDev_ProcessEvent + * + * @brief Hid Dev Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 HidDev_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* + * @fn HidDev_Register + * + * @brief Register a callback function with HID Dev. + * + * @param pCfg - Parameter configuration. + * @param pCBs - Callback function. + * + * @return None. + */ +extern void HidDev_Register( hidDevCfg_t *pCfg, hidDevCB_t *pCBs ); + +/********************************************************************* + * @fn HidDev_RegisterReports + * + * @brief Register the report table with HID Dev. + * + * @param numReports - Length of report table. + * @param pRpt - Report table. + * + * @return None. + */ +extern void HidDev_RegisterReports( uint8 numReports, hidRptMap_t *pRpt ); + +/********************************************************************* + * @fn HidDev_Report + * + * @brief Send a HID report. + * + * @param id - HID report ID. + * @param type - HID report type. + * @param len - Length of report. + * @param pData - Report data. + * + * @return None. + */ +extern void HidDev_Report( uint8 id, uint8 type, uint8 len, uint8 *pData ); + +/********************************************************************* + * @fn HidDev_Close + * + * @brief Close the connection or stop advertising. + * + * @return None. + */ +extern void HidDev_Close( void ); + +/********************************************************************* + * @fn HidDev_SetParameter + * + * @brief Set a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_SetParameter( uint8 param, uint8 len, void *pValue ); + +/********************************************************************* + * @fn HidDev_GetParameter + * + * @brief Get a HID Dev parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t HidDev_GetParameter( uint8 param, void *pValue ); + +/********************************************************************* + * @fn HidDev_PasscodeRsp + * + * @brief Respond to a passcode request. + * + * @param status - SUCCESS if passcode is available, otherwise + * see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return none + */ +extern void HidDev_PasscodeRsp( uint8 status, uint32 passcode ); + +/********************************************************************* + * @fn HidDev_ReadAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 HidDev_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); + +/********************************************************************* + * @fn HidDev_WriteAttrCB + * + * @brief HID Dev attribute read callback. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern bStatus_t HidDev_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 23 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.h" +/************************************************************************************************** + Filename: timeservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Current Time service definitions and + prototypes according to the BLE standard + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Service UUIDs + + + +// Parameters + + +/********************************************************************* + * TYPEDEFS + */ + +// Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*timeChange_t)( uint8 paramID ); + +typedef struct +{ + timeChange_t pfnTimeChange; // Called when characteristic value changes +} timeCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Time_AddService + * + * @brief Initializes the Current Time service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Time_AddService( void ); + +/********************************************************************* + * @fn Time_Register + * + * @brief Register a callback function with the Current Time Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Time_Register( timeCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Time_SetParameter + * + * @brief Set a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Time_GetParameter + * + * @brief Get a Current Time parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Time_HandleConnStatusCB + * + * @brief Current Time Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Time_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 25 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\util\\WIMU\\wimu_util.h" + + + + + + + + +// WIMU sensor data packet size + + + + + + + + + + + + + + + + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags + + + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ + + + + +#line 26 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/********************************************************************* + * MACROS + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" + +// Using 16-bit UUID + + + + + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + + + +#line 27 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\Profiles\\TimeService\\timeservice.c" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +// Current Time service +const uint8 timeServUUID[2] = +{ + ((0x1805) & 0xFF), (((0x1805) >> 8) & 0xFF) +}; + +// Current Time characteristic +const uint8 currentTimeUUID[2] = +{ + ((0x2A2B) & 0xFF), (((0x2A2B) >> 8) & 0xFF) +}; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static timeCBs_t *Time_AppCBs = 0; + +/********************************************************************* + * Profile Attributes - variables + */ + +// Time Service attribute +static const gattAttrType_t timeService = { 2, timeServUUID }; + +// Current Time characteristic +static uint8 currentTimeProps = 0x02 | 0x10 | 0x08; +static uint8 currentTime[sizeof(currentTime_t)]; +static gattCharCfg_t currentTimeClientCharCfg[( 3 + 1 )]; + +/********************************************************************* + * Profile Attributes - Table + */ + +static gattAttribute_t timeAttrTbl[] = +{ + // Current Time Service + { + { 2, primaryServiceUUID }, /* type */ + 0x01, /* permissions */ + 0, /* handle */ + (uint8 *)&timeService /* pValue */ + }, + + // Current Time Declaration + { + { 2, characterUUID }, + 0x01, + 0, + ¤tTimeProps + }, + + // Current Time Value + { + { 2, currentTimeUUID }, + 0x01 | 0x02, + 0, + (uint8*)¤tTime + }, + + // Current Time Client Characteristic Configuration + { + { 2, clientCharCfgUUID }, + 0x01 | 0x02, + 0, + (uint8 *)currentTimeClientCharCfg + } +}; + + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static uint8 timeReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ); +static bStatus_t timeWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +//static void battNotifyCB( linkDBItem_t *pLinkItem ); +//static uint8 battMeasure( void ); +//static void battNotifyLevel( void ); + +/********************************************************************* + * PROFILE CALLBACKS + */ +// Current Time Service Callbacks +const gattServiceCBs_t timeCBs = +{ + timeReadAttrCB, // Read callback function pointer + timeWriteAttrCB, // Write callback function pointer + 0 // Authorization callback function pointer +}; + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn Time_AddService + * + * @brief Initializes the Current Time Service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +bStatus_t Time_AddService( void ) +{ + uint8 status = 0x00; + + // Initialize Client Characteristic Configuration attributes + GATTServApp_InitCharCfg( 0xFFFF, currentTimeClientCharCfg ); + + // Register GATT attribute list and CBs with GATT Server App + status = GATTServApp_RegisterService( timeAttrTbl, + ( sizeof( timeAttrTbl ) / sizeof( gattAttribute_t ) ), + &timeCBs ); + + return ( status ); +} + +/********************************************************************* + * @fn Time_Register + * + * @brief Register a callback function with the Current Time Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +bStatus_t Time_Register( timeCBs_t *appCallbacks ) +{ + if ( Time_AppCBs == 0 ) + { + if ( appCallbacks != 0 ) + { + Time_AppCBs = appCallbacks; + } + + return ( 0x00 ); + } + + return ( 0x11 ); +} +/********************************************************************* + * @fn Time_SetParameter + * + * @brief Set a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Time_SetParameter( uint8 param, uint8 len, void *value ) +{ + bStatus_t ret = 0x00; + + switch ( param ) + { + case 0: + if ( len == sizeof(currentTime_t) ) + { + osal_memcpy( currentTime, value, sizeof(currentTime_t) ); + // See if Notification has been enabled + GATTServApp_ProcessCharCfg( currentTimeClientCharCfg, currentTime, 0, + timeAttrTbl, ( sizeof( timeAttrTbl ) / sizeof( gattAttribute_t ) ), + 0xFF ); + } + else + { + ret = 0x18; + } + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn Time_GetParameter + * + * @brief Get a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t Time_GetParameter( uint8 param, void *value ) +{ + bStatus_t ret = 0x00; + switch ( param ) + { + case 0: + + osal_memcpy( value, currentTime, sizeof(currentTime_t) ); + //*((uint8*)value) = currentTime; + break; + + default: + ret = 0x02; + break; + } + + return ( ret ); +} + +/********************************************************************* + * @fn timeReadAttrCB + * + * @brief Read an attribute. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ + +static uint8 timeReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) +{ + bStatus_t status = 0x00; + + // Make sure it's not a blob operation (no attributes in the profile are long) + if ( offset > 0 ) + { + return ( 0x0b ); + } + + uint16 uuid = ((uint16)(((pAttr->type . uuid[0]) & 0x00FF) + (((pAttr->type . uuid[1]) & 0x00FF) << 8))); + + if ( uuid == 0x2A2B ) + { + *pLen = sizeof(currentTime_t); + (void) osal_memcpy( pValue, pAttr->pValue, sizeof(currentTime_t) ); + } + else + { + status = 0x0a; + } + + return ( status ); +} + +/********************************************************************* + * @fn timeWriteAttrCB + * + * @brief Validate attribute data prior to a write operation + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +static bStatus_t timeWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ) +{ + uint16 uuid; + bStatus_t status = 0x00; + uint8 notifyApp = 0xFF; + + // If attribute permissions require authorization to write, return error + if ( ( (pAttr->permissions) & 0x20 ) ) + { + // Insufficient authorization + return ( 0x08 ); + } + + if (utilExtractUuid16(pAttr,&uuid) == 0x01) { + // Invalid handle + return 0x01; + } + + switch ( uuid ) + { + + case 0x2A2B: + //Validate the value + if ( offset == 0 ) + { + if ( len != sizeof(currentTime_t) ) + { + status = 0x0d; + } + } + else + { + status = 0x0b; + } + + //Write the value + if ( status == 0x00 ) + { + uint8 *pCurValue = (uint8 *)pAttr->pValue; + + //*pCurValue = pValue[0]; + osal_memcpy( pCurValue, pValue, sizeof(currentTime_t) ); + + osal_set_event(/*WIMU_TaskID*/10, 0x0010); + + /*if( pAttr->pValue == ¤tTime ) + {*/ + notifyApp = 0; + //} + } + break; + + case 0x2902: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, 0x0001 ); + break; + + default: + // Should never get here! + status = 0x0a; + break; + } + + // If a charactersitic value changed then callback function to notify application of change + if ( (notifyApp != 0xFF ) && Time_AppCBs && Time_AppCBs->pfnTimeChange ) + { + Time_AppCBs->pfnTimeChange( notifyApp ); + } +/* + uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); + switch ( uuid ) + { + case GATT_CLIENT_CHAR_CFG_UUID: + status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len, + offset, GATT_CLIENT_CFG_NOTIFY ); + break; + + default: + status = ATT_ERR_ATTR_NOT_FOUND; + break; + } + */ + return ( status ); +} + +/********************************************************************* + * @fn Time_HandleConnStatusCB + * + * @brief Current Time link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Time_HandleConnStatusCB( uint16 connHandle, uint8 changeType ) +{ + // Make sure this is not loopback connection + if ( connHandle != 0xFFFE ) + { + // Reset Client Char Config if connection has dropped + if ( ( changeType == 1 ) || + ( ( changeType == 2 ) && + ( !linkDB_State( (connHandle), 0x01 ) ) ) ) + { + GATTServApp_InitCharCfg( connHandle, currentTimeClientCharCfg ); + } + } +} + + +/********************************************************************* +*********************************************************************/ + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/wimu.i b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/wimu.i new file mode 100644 index 0000000..2a495fa --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/List/wimu.i @@ -0,0 +1,15986 @@ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +/************************************************************************************************** + Filename: wimu.c + + Description: This file contains the WIMU application + (based on Simple BLE Peripheral sample application). + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdio.h" +/* - STDIO.H - + + Subset of ANSI standard I/O function declarations. + + $Revision: 6265 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdarg.h" +/* - STDARG.H - + The ANSI macros for reading variable argument lists (...). + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" +/* - SYSMAC.H - + + Defines system macros to maintain source compatibility + with different IAR compilers. + + $Revision: 6040 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 65 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + +#line 73 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\sysmac.h" + + + + + + + +/* Macro for frmwri and frmrd */ + + +/* Typedefs put here to appear only once */ +typedef unsigned int size_t; +typedef signed int ptrdiff_t; + +#line 17 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdarg.h" + + + + +typedef void *va_list[1]; + +__intrinsic void __va_start(va_list); + + + + +/*=====================================*/ +/* These targets has char pushed as */ +/* word on stack. */ +/* Stack grows in negativ direction. */ +/* (New type of code-generators) */ +/* - - - - - - - - - - - - - - - - - - */ +/* ICC78000 version 4.xx */ +/* M32C version 3.xx */ +/*=====================================*/ +#line 46 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdarg.h" + +#line 54 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdarg.h" + + + +#line 18 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\stdio.h" + + + + + + + + + + + + + +#pragma language=save +#pragma language=extended + int puts(const char *); + +__near_func int putchar(int); +__near_func int getchar(void); + + + + + int sprintf(char *,const char *,...); + int vsprintf(char *,const char *,va_list); + int printf(const char *,...); + int vprintf(const char *,va_list); + int scanf(const char *,...); + int sscanf(const char *, const char *,...); + char *gets(char *); +#pragma language=restore + + +#line 13 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" +/** + @headerfile: bcomdef.h + + +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +/************************************************************************************************** + Filename: comdef.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: Type definitions and macros. + + + Copyright 2004-2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/* HAL */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" +/** + @headerfile: hal_types.h + + +**************************************************************************************************/ + + + + +/* Texas Instruments CC2540 */ + +/* ------------------------------------------------------------------------------------------------ + * Types + * ------------------------------------------------------------------------------------------------ + */ +/** @defgroup HAL_TYPES HAL Types + * @{ + */ +typedef signed char int8; //!< Signed 8 bit integer +typedef unsigned char uint8; //!< Unsigned 8 bit integer + +typedef signed short int16; //!< Signed 16 bit integer +typedef unsigned short uint16; //!< Unsigned 16 bit integer + +typedef signed long int32; //!< Signed 32 bit integer +typedef unsigned long uint32; //!< Unsigned 32 bit integer + +typedef unsigned char bool; //!< Boolean data type + +typedef uint8 halDataAlign_t; //!< Used for byte alignment +/** @} End HAL_TYPES */ + +/* ------------------------------------------------------------------------------------------------ + * Memory Attributes and Compiler Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* ----------- IAR Compiler ----------- */ +#line 82 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + +/* ----------- KEIL Compiler ----------- */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_types.h" + + +/* ------------------------------------------------------------------------------------------------ + * Standard Defines + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + +/************************************************************************************************** + */ +#line 55 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" +/************************************************************************************************** + Filename: hal_defs.h + Revised: $Date: 2012-08-17 16:28:43 -0700 (Fri, 17 Aug 2012) $ + Revision: $Revision: 31295 $ + + Description: This file contains useful macros and data types + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + + + + + + + + + + + + + + + + + + + +/* takes a byte out of a uint32 : var - uint32, ByteNum - byte to take out (0 - 3) */ + + + + + + + + + + + + + + + + + + + + + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_defs.h" + +/* + * This macro is for use by other macros to form a fully valid C statement. + * Without this, the if/else conditionals could show unexpected behavior. + * + * For example, use... + * #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) + * instead of ... + * #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } + * or + * #define SET_REGS() ioreg1 = 0; ioreg2 = 0; + * The last macro would not behave as expected in the if/else construct. + * The second to last macro will cause a compiler error in certain uses + * of if/else construct + * + * It is not necessary, or recommended, to use this macro where there is + * already a valid C statement. For example, the following is redundant... + * #define CALL_FUNC() st( func(); ) + * This should simply be... + * #define CALL_FUNC() func() + * + * (The while condition below evaluates false without generating a + * constant-controlling-loop type of warning on most compilers.) + */ + + + +/************************************************************************************************** + */ +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * Lint Keywords + */ + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + + + + + + + + + + + + + + + +/*** Generic Status Return Values ***/ +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\comdef.h" + +/********************************************************************* + * TYPEDEFS + */ + +// Generic Status return +typedef uint8 Status_t; + +// Data types +typedef int32 int24; +typedef uint32 uint24; + +/********************************************************************* + * Global System Events + */ + + + +/********************************************************************* + * Global Generic System Messages + */ + + + +// OSAL System Message IDs/Events Reserved for applications (user applications) +// 0xE0 – 0xFC + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 57 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/********************************************************************* + * CONSTANTS + */ + + + // Set the Controller Configuration +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +#line 102 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +/** @defgroup BLE_COMMON_DEFINES BLE Common Defines + * @{ + */ +//! Default Public and Random Address Length + + +//! Default key length + + +//! BLE Channel Map length + + +//! BLE Event mask length + + +//! BLE Local Name length + + +//! BLE Maximum Advertising Packet Length + + +//! BLE Random Number Size + + +//! BLE Feature Supported length + + +/** @defgroup BLE_STATUS_VALUES BLE Default BLE Status Values + * returned as bStatus_t + * @{ + */ +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\bcomdef.h" + +// GAP Status Return Values - returned as bStatus_t + + + + +// ATT Status Return Values - returned as bStatus_t + + + + + +// L2CAP Status Return Values - returned as bStatus_t + + +/** @} End BLE_STATUS_VALUES */ + +/** @defgroup BLE_NV_IDS BLE Non-volatile IDs + * @{ + */ +// Device NV Items - Range 0 - 0x1F + + + + +// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings + + + +// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries + + +/** @} End BLE_NV_IDS */ + +/********************************************************************* + * BLE OSAL GAP GLOBAL Events + */ + + + +/** @defgroup BLE_MSG_IDS BLE OSAL Message ID Events + * Reserved Message ID Event Values:
+ * 0xC0 - Key Presses
+ * 0xE0 to 0xFC - App
+ * @{ + */ +// GAP - Messages IDs (0xD0 - 0xDF) + + +// SM - Messages IDs (0xC1 - 0xCF) + + +// GATT - Messages IDs (0xB0 - 0xBF) + + + +// L2CAP - Messages IDs (0xA0 - 0xAF) + + + +// HCI - Messages IDs (0x90 - 0x9F) + + + + +/** @} End BLE_MSG_IDS */ + +/********************************************************************* + * TYPEDEFS + */ + + //! BLE Generic Status return: @ref BLE_STATUS_VALUES +typedef Status_t bStatus_t; + +/** @} End GAP_MSG_EVENT_DEFINES */ + + +/********************************************************************* + * System Events + */ + +/********************************************************************* + * Global System Messages + */ + +/********************************************************************* + * MACROS + */ + +// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000 + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 15 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +/****************************************************************************** + Filename: OSAL.h + Revised: $Date: 2012-02-17 15:07:16 -0800 (Fri, 17 Feb 2012) $ + Revision: $Revision: 29376 $ + + Description: This API allows the software components in the Z-Stack to be + written independently of the specifics of the operating system, + kernel, or tasking environment (including control loops or + connect-to-interrupt systems). + + + Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +******************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" +/* - LIMITS.H - + + Integral ANSI element sizes. + + $Revision: 38615 $ + + Copyright 1986 - 1999 IAR Systems. All rights reserved. +*/ + + + + + + #pragma system_include + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#line 80 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\clib\\limits.h" + +#line 56 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" +/************************************************************************************************** + Filename: OSAL_Memory.h + Revised: $Date: 2010-07-28 08:42:48 -0700 (Wed, 28 Jul 2010) $ + Revision: $Revision: 23160 $ + + Description: This module defines the OSAL memory control functions. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * CONSTANTS + */ + + + + + +/********************************************************************* + * MACROS + */ + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize memory manager. + */ + void osal_mem_init( void ); + + /* + * Setup efficient search for the first free block of heap. + */ + void osal_mem_kick( void ); + + /* + * Allocate a block of memory. + */ + + + + + void *osal_mem_alloc( uint16 size ); + + + /* + * Free a block of memory. + */ + + + + + void osal_mem_free( void *ptr ); + + +#line 130 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Memory.h" + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\osal\\include\\OSAL_Timers.h" +/************************************************************************************************** + Filename: OSAL_Timers.h + Revised: $Date: 2011-09-16 19:09:24 -0700 (Fri, 16 Sep 2011) $ + Revision: $Revision: 27618 $ + + Description: This file contains the OSAL Timer definition and manipulation functions. + + + Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + * the unit is chosen such that the 320us tick equivalent can fit in + * 32 bits. + */ + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialization for the OSAL Timer System. + */ + extern void osalTimerInit( void ); + + /* + * Set a Timer + */ + extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); + + /* + * Set a timer that reloads itself. + */ + extern uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint32 timeout_value ); + + /* + * Stop a Timer + */ + extern uint8 osal_stop_timerEx( uint8 task_id, uint16 event_id ); + + /* + * Get the tick count of a Timer. + */ + extern uint32 osal_get_timeoutEx( uint8 task_id, uint16 event_id ); + + /* + * Simulated Timer Interrupt Service Routine + */ + + extern void osal_timer_ISR( void ); + + /* + * Adjust timer tables + */ + extern void osal_adjust_timers( void ); + + /* + * Update timer tables + */ + extern void osalTimerUpdate( uint32 updateTime ); + + /* + * Count active timers + */ + extern uint8 osal_timer_num_active( void ); + + /* + * Set the hardware timer interrupts for sleep mode. + * These functions should only be called in OSAL_PwrMgr.c + */ + extern void osal_sleep_timers( void ); + extern void osal_unsleep_timers( void ); + + /* + * Read the system clock - returns milliseconds + */ + extern uint32 osal_GetSystemClock( void ); + + /* + * Get the next OSAL timer expiration. + * This function should only be called in OSAL_PwrMgr.c + */ + extern uint32 osal_next_timeout( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 60 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL.h" + +/********************************************************************* + * MACROS + */ + + + + + + + + + + + + + + + + + + +/********************************************************************* + * CONSTANTS + */ + +/*** Interrupts ***/ + + +/********************************************************************* + * TYPEDEFS + */ +typedef struct +{ + void *next; + uint16 len; + uint8 dest_id; +} osal_msg_hdr_t; + +typedef struct +{ + uint8 event; + uint8 status; +} osal_event_hdr_t; + +typedef void * osal_msg_q_t; + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/*** Message Management ***/ + + /* + * Task Message Allocation + */ + extern uint8 * osal_msg_allocate(uint16 len ); + + /* + * Task Message Deallocation + */ + extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); + + /* + * Send a Task Message + */ + extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); + + /* + * Receive a Task Message + */ + extern uint8 *osal_msg_receive( uint8 task_id ); + + /* + * Find in place a matching Task Message / Event. + */ + extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); + + /* + * Enqueue a Task Message + */ + extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Enqueue a Task Message Up to Max + */ + extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); + + /* + * Dequeue a Task Message + */ + extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); + + /* + * Push a Task Message to head of queue + */ + extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); + + /* + * Extract and remove a Task Message from queue + */ + extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); + + +/*** Task Synchronization ***/ + + /* + * Set a Task Event + */ + extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); + + + /* + * Clear a Task Event + */ + extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); + + +/*** Interrupt Management ***/ + + /* + * Register Interrupt Service Routine (ISR) + */ + extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); + + /* + * Enable Interrupt + */ + extern uint8 osal_int_enable( uint8 interrupt_id ); + + /* + * Disable Interrupt + */ + extern uint8 osal_int_disable( uint8 interrupt_id ); + + +/*** Task Management ***/ + + /* + * Initialize the Task System + */ + extern uint8 osal_init_system( void ); + + /* + * System Processing Loop + */ + + + + extern void osal_start_system( void ); + + + /* + * One Pass Throu the OSAL Processing Loop + */ + extern void osal_run_system( void ); + + /* + * Get the active task ID + */ + extern uint8 osal_self( void ); + + +/*** Helper Functions ***/ + + /* + * String Length + */ + extern int osal_strlen( char *pString ); + + /* + * Memory copy + */ + extern void *osal_memcpy( void*, const void *, unsigned int ); + + /* + * Memory Duplicate - allocates and copies + */ + extern void *osal_memdup( const void *src, unsigned int len ); + + /* + * Reverse Memory copy + */ + extern void *osal_revmemcpy( void*, const void *, unsigned int ); + + /* + * Memory compare + */ + extern uint8 osal_memcmp( const void *src1, const void *src2, unsigned int len ); + + /* + * Memory set + */ + extern void *osal_memset( void *dest, uint8 value, int len ); + + /* + * Build a uint16 out of 2 bytes (0 then 1). + */ + extern uint16 osal_build_uint16( uint8 *swapped ); + + /* + * Build a uint32 out of sequential bytes. + */ + extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); + + /* + * Convert long to ascii string + */ + + extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); + + + /* + * Random number generator + */ + extern uint16 osal_rand( void ); + + /* + * Buffer an uint32 value - LSB first. + */ + extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); + + /* + * Buffer an uint24 value - LSB first + */ + extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); + + /* + * Is all of the array elements set to a value? + */ + extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 16 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\osal\\include\\OSAL_PwrMgr.h" +/************************************************************************************************** + Filename: OSAL_PwrMgr.h + Revised: $Date: 2007-10-28 18:41:49 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15799 $ + + Description: This file contains the OSAL Power Management API. + + + Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/* These attributes define sleep beheaver. The attributes can be changed + * for each sleep cycle or when the device characteristic change. + */ +typedef struct +{ + uint16 pwrmgr_task_state; + uint16 pwrmgr_next_timeout; + uint16 accumulated_sleep_time; + uint8 pwrmgr_device; +} pwrmgr_attribute_t; + +/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the + * device is most likely on mains power. The PWRMGR_BATTERY selection allows + * the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state. + */ + + + +/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to + * agree. The PWRMGR_HOLD selection turns power savings off. + */ + + + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* This global variable stores the power management attributes. + */ +extern pwrmgr_attribute_t pwrmgr_attribute; + +/********************************************************************* + * FUNCTIONS + */ + + /* + * Initialize the power management system. + * This function is called from OSAL. + * + */ + extern void osal_pwrmgr_init( void ); + + /* + * This function is called by each task to state whether or not this + * task wants to conserve power. The task will call this function to + * vote whether it wants the OSAL to conserve power or it wants to + * hold off on the power savings. By default, when a task is created, + * its own power state is set to conserve. If the task always wants + * to converse power, it doesn't need to call this function at all. + * It is important for the task that changed the power manager task + * state to PWRMGR_HOLD to switch back to PWRMGR_CONSERVE when the + * hold period ends. + */ + extern uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state ); + + /* + * This function is called on power-up, whenever the device characteristic + * change (ex. Battery backed coordinator). This function works with the timer + * to set HAL's power manager sleep state when power saving is entered. + * This function should be called form HAL initialization. After power up + * initialization, it should only be called from NWK or ZDO. + */ + extern void osal_pwrmgr_device( uint8 pwrmgr_device ); + + /* + * This function is called from the main OSAL loop when there are + * no events scheduled and shouldn't be called from anywhere else. + */ + extern void osal_pwrmgr_powerconserve( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 17 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" +/************************************************************************************************** + Filename: hal_mcu.h + Revised: $Date: 2012-07-13 06:58:11 -0700 (Fri, 13 Jul 2012) $ + Revision: $Revision: 30922 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* + * Target : Texas Instruments CC2540 (8051 core) + * + */ + + +/* ------------------------------------------------------------------------------------------------ + * Includes + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Target Defines + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +/* ---------------------- IAR Compiler ---------------------- */ + + +#line 1 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/************************************************************************************************** + * - ioCC2540.h - + * + * Header file with definitions for the Texas Instruments CC2540 low-power System-on-Chip: + * an 8051-based MCU with 2.4 GHz Bluetooth low energy RF transceiver, and up to 256 kB FLASH. + * + * This file supports the IAR Embedded Workbench for 8051. + * + ************************************************************************************************** + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * Compiler Abstraction + * ------------------------------------------------------------------------------------------------ + */ + +#pragma language=extended +#line 41 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 77 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Vectors + * ------------------------------------------------------------------------------------------------ + */ +#line 101 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Alias + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + * SFR Bit Alias + * ------------------------------------------------------------------------------------------------ + */ + +/* USBIE P2IE , not in a bit addressable register */ + +/* ------------------------------------------------------------------------------------------------ + * SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * SFRs with an address ending with 0 or 8 are bit accessible. + * They are defined with the SFRBIT() macro that sets the name of each bit. + */ + +/* Port 0 */ +__sfr __no_init volatile union { unsigned char P0; struct { unsigned char P0_0 : 1; unsigned char P0_1 : 1; unsigned char P0_2 : 1; unsigned char P0_3 : 1; unsigned char P0_4 : 1; unsigned char P0_5 : 1; unsigned char P0_6 : 1; unsigned char P0_7 : 1; }; } @ 0x80; +__sfr __no_init volatile unsigned char SP @ 0x81; /* Stack Pointer */ +__sfr __no_init volatile unsigned char DPL0 @ 0x82; /* Data Pointer 0 Low Byte */ +__sfr __no_init volatile unsigned char DPH0 @ 0x83; /* Data Pointer 0 High Byte */ +__sfr __no_init volatile unsigned char DPL1 @ 0x84; /* Data Pointer 1 Low Byte */ +__sfr __no_init volatile unsigned char DPH1 @ 0x85; /* Data Pointer 1 High Byte */ +__sfr __no_init volatile unsigned char U0CSR @ 0x86; /* USART 0 Control and Status */ +__sfr __no_init volatile unsigned char PCON @ 0x87; /* Power Mode Control */ + +/* Interrupt Flags */ +__sfr __no_init volatile union { unsigned char TCON; struct { unsigned char IT0 : 1; unsigned char RFERRIF : 1; unsigned char IT1 : 1; unsigned char URX0IF : 1; unsigned char _TCON4 : 1; unsigned char ADCIF : 1; unsigned char _TCON6 : 1; unsigned char URX1IF : 1; }; } @ 0x88; +__sfr __no_init volatile unsigned char P0IFG @ 0x89; /* Port 0 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P1IFG @ 0x8A; /* Port 1 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char P2IFG @ 0x8B; /* Port 2 Interrupt Status Flag */ +__sfr __no_init volatile unsigned char PICTL @ 0x8C; /* Port Interrupt Control */ +__sfr __no_init volatile unsigned char P1IEN @ 0x8D; /* Port 1 Interrupt Mask */ +__sfr __no_init volatile unsigned char _SFR8E @ 0x8E; /* not used */ +__sfr __no_init volatile unsigned char P0INP @ 0x8F; /* Port 0 Input Mode */ + +/* Port 1 */ +__sfr __no_init volatile union { unsigned char P1; struct { unsigned char P1_0 : 1; unsigned char P1_1 : 1; unsigned char P1_2 : 1; unsigned char P1_3 : 1; unsigned char P1_4 : 1; unsigned char P1_5 : 1; unsigned char P1_6 : 1; unsigned char P1_7 : 1; }; } @ 0x90; +__sfr __no_init volatile unsigned char _SFR91 @ 0x91; /* reserved */ +__sfr __no_init volatile unsigned char DPS @ 0x92; /* Data Pointer Select */ +__sfr __no_init volatile unsigned char MPAGE @ 0x93; /* Memory Page Select */ +__sfr __no_init volatile unsigned char T2CTRL @ 0x94; /* Timer2 Control Register */ +__sfr __no_init volatile unsigned char ST0 @ 0x95; /* Sleep Timer 0 */ +__sfr __no_init volatile unsigned char ST1 @ 0x96; /* Sleep Timer 1 */ +__sfr __no_init volatile unsigned char ST2 @ 0x97; /* Sleep Timer 2 */ + +/* Interrupt Flags 2 */ +__sfr __no_init volatile union { unsigned char S0CON; struct { unsigned char ENCIF_0 : 1; unsigned char ENCIF_1 : 1; unsigned char _S0CON2 : 1; unsigned char _S0CON3 : 1; unsigned char _S0CON4 : 1; unsigned char _S0CON5 : 1; unsigned char _S0CON6 : 1; unsigned char _S0CON7 : 1; }; } @ 0x98; +__sfr __no_init volatile unsigned char _SFR99 @ 0x99; /* reserved */ +__sfr __no_init volatile unsigned char IEN2 @ 0x9A; /* Interrupt Enable 2 */ +__sfr __no_init volatile unsigned char S1CON @ 0x9B; /* Interrupt Flags 3 */ +__sfr __no_init volatile unsigned char T2CSPCFG @ 0x9C; /* Timer2 CSP Interface Configuration (legacy name) */ +__sfr __no_init volatile unsigned char T2EVTCFG @ 0x9C; /* Timer2 Event Output Configuration */ +__sfr __no_init volatile unsigned char SLEEPSTA @ 0x9D; /* Sleep Status */ +__sfr __no_init volatile unsigned char CLKCONSTA @ 0x9E; /* Clock Control Status */ +__sfr __no_init volatile unsigned char FMAP @ 0x9F; /* Flash Bank Map */ + +/* Port 2 */ +__sfr __no_init volatile union { unsigned char P2; struct { unsigned char P2_0 : 1; unsigned char P2_1 : 1; unsigned char P2_2 : 1; unsigned char P2_3 : 1; unsigned char P2_4 : 1; unsigned char _P2_5 : 1; unsigned char _P2_6 : 1; unsigned char _P2_7 : 1; }; } @ 0xA0; +__sfr __no_init volatile unsigned char T2IRQF @ 0xA1; /* Timer2 Interrupt Flags */ +__sfr __no_init volatile unsigned char T2M0 @ 0xA2; /* Timer2 Multiplexed Register 0 */ +__sfr __no_init volatile unsigned char T2M1 @ 0xA3; /* Timer2 Multiplexed Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF0 @ 0xA4; /* Timer2 Multiplexed Overflow Register 0 */ +__sfr __no_init volatile unsigned char T2MOVF1 @ 0xA5; /* Timer2 Multiplexed Overflow Register 1 */ +__sfr __no_init volatile unsigned char T2MOVF2 @ 0xA6; /* Timer2 Multiplexed Overflow Register 2 */ +__sfr __no_init volatile unsigned char T2IRQM @ 0xA7; /* Timer2 Interrupt Mask */ + +/* Interrupt Enable 0 */ +__sfr __no_init volatile union { unsigned char IEN0; struct { unsigned char RFERRIE : 1; unsigned char ADCIE : 1; unsigned char URX0IE : 1; unsigned char URX1IE : 1; unsigned char ENCIE : 1; unsigned char STIE : 1; unsigned char _IEN06 : 1; unsigned char EA : 1; }; } @ 0xA8; +__sfr __no_init volatile unsigned char IP0 @ 0xA9; /* Interrupt Priority 0 */ +__sfr __no_init volatile unsigned char _SFRAA @ 0xAA; /* not used */ +__sfr __no_init volatile unsigned char P0IEN @ 0xAB; /* Port 0 Interrupt Mask */ +__sfr __no_init volatile unsigned char P2IEN @ 0xAC; /* Port 2 Interrupt Mask */ +__sfr __no_init volatile unsigned char STLOAD @ 0xAD; /* Sleep Timer Load Status */ +__sfr __no_init volatile unsigned char PMUX @ 0xAE; /* Power Down Signal MUX */ +__sfr __no_init volatile unsigned char T1STAT @ 0xAF; /* Timer 1 Status */ + +__sfr __no_init volatile unsigned char _SFRB0 @ 0xB0; /* not used */ +__sfr __no_init volatile unsigned char ENCDI @ 0xB1; /* Encryption/Decryption Input Data */ +__sfr __no_init volatile unsigned char ENCDO @ 0xB2; /* Encryption/Decryption Output Data */ +__sfr __no_init volatile unsigned char ENCCS @ 0xB3; /* Encryption/Decryption Control and Status */ +__sfr __no_init volatile unsigned char ADCCON1 @ 0xB4; /* ADC Control 1 */ +__sfr __no_init volatile unsigned char ADCCON2 @ 0xB5; /* ADC Control 2 */ +__sfr __no_init volatile unsigned char ADCCON3 @ 0xB6; /* ADC Control 3 */ +__sfr __no_init volatile unsigned char _SFRB7 @ 0xB7; /* reserved */ + +/* Interrupt Enable 1 */ +__sfr __no_init volatile union { unsigned char IEN1; struct { unsigned char DMAIE : 1; unsigned char T1IE : 1; unsigned char T2IE : 1; unsigned char T3IE : 1; unsigned char T4IE : 1; unsigned char P0IE : 1; unsigned char _IEN16 : 1; unsigned char _IEN17 : 1; }; } @ 0xB8; +__sfr __no_init volatile unsigned char IP1 @ 0xB9; /* Interrupt Priority 1 */ +__sfr __no_init volatile unsigned char ADCL @ 0xBA; /* ADC Data Low */ +__sfr __no_init volatile unsigned char ADCH @ 0xBB; /* ADC Data High */ +__sfr __no_init volatile unsigned char RNDL @ 0xBC; /* Random Number Generator Low Byte */ +__sfr __no_init volatile unsigned char RNDH @ 0xBD; /* Random Number Generator High Byte */ +__sfr __no_init volatile unsigned char SLEEPCMD @ 0xBE; /* Sleep Mode Control Command */ +__sfr __no_init volatile unsigned char _SFRBF @ 0xBF; /* reserved */ + +/* Interrupt Flags 4 */ +__sfr __no_init volatile union { unsigned char IRCON; struct { unsigned char DMAIF : 1; unsigned char T1IF : 1; unsigned char T2IF : 1; unsigned char T3IF : 1; unsigned char T4IF : 1; unsigned char P0IF : 1; unsigned char _IRCON6 : 1; unsigned char STIF : 1; }; } @ 0xC0; +__sfr __no_init volatile unsigned char U0DBUF @ 0xC1; /* USART 0 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U0BAUD @ 0xC2; /* USART 0 Baud Rate Control */ +__sfr __no_init volatile unsigned char T2MSEL @ 0xC3; /* Timer2 Multiplex Select */ +__sfr __no_init volatile unsigned char U0UCR @ 0xC4; /* USART 0 UART Control */ +__sfr __no_init volatile unsigned char U0GCR @ 0xC5; /* USART 0 Generic Control */ +__sfr __no_init volatile unsigned char CLKCONCMD @ 0xC6; /* Clock Control Command */ +__sfr __no_init volatile unsigned char MEMCTR @ 0xC7; /* Memory System Control */ + +__sfr __no_init volatile unsigned char _SFRC8 @ 0xC8; /* not used */ +__sfr __no_init volatile unsigned char WDCTL @ 0xC9; /* Watchdog Timer Control */ +__sfr __no_init volatile unsigned char T3CNT @ 0xCA; /* Timer 3 Counter */ +__sfr __no_init volatile unsigned char T3CTL @ 0xCB; /* Timer 3 Control */ +__sfr __no_init volatile unsigned char T3CCTL0 @ 0xCC; /* Timer 3 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC0 @ 0xCD; /* Timer 3 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T3CCTL1 @ 0xCE; /* Timer 3 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T3CC1 @ 0xCF; /* Timer 3 Channel 1 Capture/Compare Value */ + + /* Program Status Word */ +__sfr __no_init volatile union { unsigned char PSW; struct { unsigned char P : 1; unsigned char F1 : 1; unsigned char OV : 1; unsigned char RS0 : 1; unsigned char RS1 : 1; unsigned char F0 : 1; unsigned char AC : 1; unsigned char CY : 1; }; } @ 0xD0; +__sfr __no_init volatile unsigned char DMAIRQ @ 0xD1; /* DMA Interrupt Flag */ +__sfr __no_init volatile unsigned char DMA1CFGL @ 0xD2; /* DMA Channel 1-4 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA1CFGH @ 0xD3; /* DMA Channel 1-4 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMA0CFGL @ 0xD4; /* DMA Channel 0 Configuration Address Low Byte */ +__sfr __no_init volatile unsigned char DMA0CFGH @ 0xD5; /* DMA Channel 0 Configuration Address High Byte */ +__sfr __no_init volatile unsigned char DMAARM @ 0xD6; /* DMA Channel Arm */ +__sfr __no_init volatile unsigned char DMAREQ @ 0xD7; /* DMA Channel Start Request and Status */ + +/* Timers 1/3/4 Interrupt Mask/Flag */ +__sfr __no_init volatile union { unsigned char TIMIF; struct { unsigned char T3OVFIF : 1; unsigned char T3CH0IF : 1; unsigned char T3CH1IF : 1; unsigned char T4OVFIF : 1; unsigned char T4CH0IF : 1; unsigned char T4CH1IF : 1; unsigned char T1OVFIM : 1; unsigned char _TIMIF7 : 1; }; } @ 0xD8; +__sfr __no_init volatile unsigned char _SFRD9 @ 0xD9; /* reserved */ +__sfr __no_init volatile unsigned char T1CC0L @ 0xDA; /* Timer 1 Channel 0 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC0H @ 0xDB; /* Timer 1 Channel 0 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC1L @ 0xDC; /* Timer 1 Channel 1 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC1H @ 0xDD; /* Timer 1 Channel 1 Capture/Compare Value High Byte */ +__sfr __no_init volatile unsigned char T1CC2L @ 0xDE; /* Timer 1 Channel 2 Capture/Compare Value Low Byte */ +__sfr __no_init volatile unsigned char T1CC2H @ 0xDF; /* Timer 1 Channel 2 Capture/Compare Value High Byte */ + +__sfr __no_init volatile unsigned char ACC @ 0xE0; /* Accumulator */ +__sfr __no_init volatile unsigned char _SFRE1 @ 0xE1; /* reserved */ +__sfr __no_init volatile unsigned char T1CNTL @ 0xE2; /* Timer 1 Counter Low */ +__sfr __no_init volatile unsigned char T1CNTH @ 0xE3; /* Timer 1 Counter High */ +__sfr __no_init volatile unsigned char T1CTL @ 0xE4; /* Timer 1 Control And Status */ +__sfr __no_init volatile unsigned char T1CCTL0 @ 0xE5; /* Timer 1 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL1 @ 0xE6; /* Timer 1 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T1CCTL2 @ 0xE7; /* Timer 1 Channel 2 Capture/Compare Control */ + +/* Interrupt Flags 5 */ +__sfr __no_init volatile union { unsigned char IRCON2; struct { unsigned char P2IF : 1; unsigned char UTX0IF : 1; unsigned char UTX1IF : 1; unsigned char P1IF : 1; unsigned char WDTIF : 1; unsigned char _IRCON25 : 1; unsigned char _IRCON26 : 1; unsigned char _IRCON27 : 1; }; } @ 0xE8; +__sfr __no_init volatile unsigned char _SFRE9 @ 0xE9; /* reserved */ +__sfr __no_init volatile unsigned char T4CNT @ 0xEA; /* Timer 4 Counter */ +__sfr __no_init volatile unsigned char T4CTL @ 0xEB; /* Timer 4 Control */ +__sfr __no_init volatile unsigned char T4CCTL0 @ 0xEC; /* Timer 4 Channel 0 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC0 @ 0xED; /* Timer 4 Channel 0 Capture/Compare Value */ +__sfr __no_init volatile unsigned char T4CCTL1 @ 0xEE; /* Timer 4 Channel 1 Capture/Compare Control */ +__sfr __no_init volatile unsigned char T4CC1 @ 0xEF; /* Timer 4 Channel 1 Capture/Compare Value */ + +__sfr __no_init volatile unsigned char B @ 0xF0; /* B Register */ +__sfr __no_init volatile unsigned char PERCFG @ 0xF1; /* Peripheral I/O Control */ +__sfr __no_init volatile unsigned char ADCCFG @ 0xF2; /* ADC Input Configuration (legacy name) */ +__sfr __no_init volatile unsigned char APCFG @ 0xF2; /* Analog Periferal I/O Configuration */ +__sfr __no_init volatile unsigned char P0SEL @ 0xF3; /* Port 0 Function Select */ +__sfr __no_init volatile unsigned char P1SEL @ 0xF4; /* Port 1 Function Select */ +__sfr __no_init volatile unsigned char P2SEL @ 0xF5; /* Port 2 Function Select */ +__sfr __no_init volatile unsigned char P1INP @ 0xF6; /* Port 1 Input Mode */ +__sfr __no_init volatile unsigned char P2INP @ 0xF7; /* Port 2 Input Mode */ + +/* USART 1 Control and Status */ +__sfr __no_init volatile union { unsigned char U1CSR; struct { unsigned char U1ACTIVE : 1; unsigned char U1TX_BYTE : 1; unsigned char U1RX_BYTE : 1; unsigned char U1ERR : 1; unsigned char U1FE : 1; unsigned char U1SLAVE : 1; unsigned char U1RE : 1; unsigned char U1MODE : 1; }; } @ 0xF8; +__sfr __no_init volatile unsigned char U1DBUF @ 0xF9; /* USART 1 Receive/Transmit Data Buffer */ +__sfr __no_init volatile unsigned char U1BAUD @ 0xFA; /* USART 1 Baud Rate Control */ +__sfr __no_init volatile unsigned char U1UCR @ 0xFB; /* USART 1 UART Control */ +__sfr __no_init volatile unsigned char U1GCR @ 0xFC; /* USART 1 Generic Control */ +__sfr __no_init volatile unsigned char P0DIR @ 0xFD; /* Port 0 Direction */ +__sfr __no_init volatile unsigned char P1DIR @ 0xFE; /* Port 1 Direction */ +__sfr __no_init volatile unsigned char P2DIR @ 0xFF; /* Port 2 Direction */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Radio Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Radio Control Registers */ + + + +/* ------------------------------------------------------------------------------------------------ + * Xdata USB Registers + * ------------------------------------------------------------------------------------------------ + */ +#line 329 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Xdata Registers + * ------------------------------------------------------------------------------------------------ + */ +/* Observability Control */ +#line 345 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Identification */ + + + +/* Debug Interface DMA Write to Flash */ + + +/* Flash Controller */ +#line 360 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* Chip Information */ + + + +/* IR Generation Control */ + + +/* Clock Loss Detector */ + + +/* Timer 1 Channels (only mapped as XREG) */ +#line 378 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Definition which includes channels represented in SFR (additional XREG mapping of SFR) */ +#line 394 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" +/* Pointers for array access */ + + + +/* Sleep Timer Capture Control */ + + + + + + +/* Op.Amp. Control */ + + + + +/* Analog Comparator Control */ + + +/* ------------------------------------------------------------------------------------------------ + * Xdata Mapped SFRs + * ------------------------------------------------------------------------------------------------ + */ + +/* + * Most SFRs are also accessible through XDATA address space. The register definitions for + * this type of access are listed below. The register names are identical to the SFR names + * but with the prefix X_ to denote an XDATA register. + * + * Some SFRs are not accessible through XDATA space. For clarity, entries are included for these + * registers. They have a prefix of _NA to denote "not available." + * + * For register descriptions, refer to the actual SFR declartions elsewhere in this file. + */ + +#line 437 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 446 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 455 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 465 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 474 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 483 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 492 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 501 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 510 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 519 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 528 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 537 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 546 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 555 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 565 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +#line 574 "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.0\\8051\\inc\\ioCC2540.h" + +/* ------------------------------------------------------------------------------------------------ + * Flash + * ------------------------------------------------------------------------------------------------ + */ + + + +/* ------------------------------------------------------------------------------------------------ + */ + + +#pragma language=default + + +/************************************************************************************************** + */ +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ---------------------- Keil Compiler ---------------------- */ +#line 104 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + + +/* ------------------------------------------------------------------------------------------------ + * Interrupt Macros + * ------------------------------------------------------------------------------------------------ + */ + + + + +typedef unsigned char halIntState_t; + + + + + + /* IAR library uses XCH instruction with EA. It may cause the higher priority interrupt to be + * locked out, therefore, may increase interrupt latency. It may also create a lockup condition. + * This workaround should only be used with 8051 using IAR compiler. When IAR fixes this by + * removing XCH usage in its library, compile the following macros to null to disable them. + */ +#line 131 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* ------------------------------------------------------------------------------------------------ + * Reset Macro + * ------------------------------------------------------------------------------------------------ + */ +#line 142 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/* disable interrupts, set watchdog timer, wait for reset */ + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 rev numbers + * ------------------------------------------------------------------------------------------------ + */ + + + + + +/* ------------------------------------------------------------------------------------------------ + * CC2540 sleep common code + * ------------------------------------------------------------------------------------------------ + */ + +/* PCON bit definitions */ + + +/* SLEEPCMD bit definitions */ + + + +/* SLEEPSTA bit definitions */ + + + +/* SLEEPCMD and SLEEPSTA bit definitions */ + + + +/* CLKCONCMD bit definitions */ + + + + + + +/* STLOAD */ + + + + +#line 199 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_mcu.h" + +/************************************************************************************************** + */ +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_sleep.h" +/************************************************************************************************** + Filename: hal_sleep.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: This file contains the interface to the power management service. + + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Execute power management procedure + */ +extern void halSleep( uint32 osal_timer ); + +/* + * Used in mac_mcu + */ +extern void halSleepWait(uint16 duration); + +/* + * Used in hal_drivers, AN044 - DELAY EXTERNAL INTERRUPTS + */ +extern void halRestoreSleepLevel( void ); + +/* + * Used by the interrupt routines to exit from sleep. + */ +extern void halSleepExit(void); + +/* + * Set the max sleep loop time lesser than the T2 rollover period. + */ +extern void halSetMaxSleepLoopTime(uint32 rolloverTime); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 46 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + + +/********************************************************************* + */ +// Internal (MCU) RAM addresses + + + + +// Internal (MCU) heap size + + + + +// Memory Allocation Heap + + + + + + +// Initialization levels + + + + + + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions + + + +/* OSAL timer defines */ + + + + + +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); + + + + + + +/* Tx and Rx buffer size defines used by SPIMgr.c */ + + + + + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset + + + + + + + + +/* Reset reason for reset indication */ + + +/* port definition stuff used by MT */ +#line 133 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\common\\cc2540\\OnBoard.h" + +/* sleep macros required by OSAL_PwrMgr.c */ + + + + + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#line 19 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" +/************************************************************************************************** + Filename: hal_adc.h + Revised: $Date: 2013-03-06 13:50:31 -0800 (Wed, 06 Mar 2013) $ + Revision: $Revision: 33395 $ + + Description: This file contains the interface to the ADC Service. + + + Copyright 2005-2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" +/******************************************************************************* + Filename: hal_board_cfg.h + Revised: $Date: 2013-02-27 11:32:02 -0800 (Wed, 27 Feb 2013) $ + Revision: $Revision: 33315 $ + + Description: + + Abstract board-specific registers, addresses, & initialization for H/W based on the + Texas Instruments CC254x (8051 core). + + + Copyright 2006-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + + + + +/******************************************************************************* + * CONSTANTS + */ + +/* Board Identifier */ + + + + + +/* Clock Speed */ + + + +/* Sleep Clock */ + + + + +// For non-USB, assume external, unless an internal crystal is explicitly indicated. + + + + + + +// Minimum Time for Stable External 32kHz Clock (in ms) + + +/* LCD Max Chars and Buffer */ + + + +/* LED Configuration */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + +/* 1 - Green */ + + + + + + + /* 2 - Red */ + + + + + + /* 3 - Yellow */ + + + + + + +/* Push Button Configuration */ + + + + +/* S1 */ + + + +#line 140 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Joystick Center Press */ + + + + +/* OSAL NV implemented by internal flash pages. */ + +// Flash is partitioned into 8 banks of 32 KB or 16 pages. + + +// Flash is constructed of 128 pages of 2 KB. + + +// SNV can use a larger logical page size to accomodate more or bigger items or extend lifetime. + + + +// CODE banks get mapped into the XDATA range 8000-FFFF. + + +// The last 16 bytes of the last available page are reserved for flash lock bits. + + +// NV page definitions must coincide with segment declaration in project *.xcl file. +#line 172 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file. + + + + + + + + +// Used by DMA macros to shift 1 to create a mask for DMA registers. + + + + + + + +/* Critical Vdd Monitoring to prevent flash damage or radio lockup. */ + +// Vdd/3 / Internal Reference X ENOB --> (Vdd / 3) / 1.15 X 127 + + + + + + + +/******************************************************************************* + * MACROS + */ + +/* Cache Prefetch Control */ + + + + +/* Setting Clocks */ + +// switch to the 16MHz HSOSC and wait until it is stable + + + + + + +// switch to the 32MHz XOSC and wait until it is stable + + + + + + +// set 32kHz OSC and wait until it is stable + + + + + + + + + + + + + + + + + +/* Board Initialization */ +#line 256 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Debounce */ + + +/* ----------- Push Buttons ---------- */ +#line 267 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* LED's */ + + + + + + + + + + + + + + + + + + + + + + + +#line 315 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* XNV */ + + + + + + + +// The TI reference design uses UART1 Alt. 2 in SPI mode. +#line 356 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Driver Configuration */ + +/* Set to TRUE enable H/W TIMER usage, FALSE disable it */ + + + + +/* Set to TRUE enable ADC usage, FALSE disable it */ + + + + +/* Set to TRUE enable DMA usage, FALSE disable it */ + + + + +/* Set to TRUE enable Flash access, FALSE disable it */ + + + + +/* Set to TRUE enable AES usage, FALSE disable it */ + + + + + + + + +/* Set to TRUE enable LCD usage, FALSE disable it */ + + + + +/* Set to TRUE enable LED usage, FALSE disable it */ +#line 400 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + +/* Set to TRUE enable KEY usage, FALSE disable it */ + + + + +/* Set to TRUE enable UART usage, FALSE disable it */ +#line 414 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + + // Always prefer to use DMA over ISR. +#line 444 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\target\\CC2540EB\\hal_board_cfg.h" + + // Used to set P2 priority - USART0 over USART1 if both are defined. + + + + + + + + + + + + + + + + + + + + + +/******************************************************************************* +*/ +#line 2 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 54 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Resolution */ + + + + + +/* Channels */ +#line 74 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +#line 92 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + + + + +/* Vdd Limits */ +#line 105 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_adc.h" + +/* Reference Voltages */ + + + + + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize ADC Service with reference set to default value + */ +extern void HalAdcInit ( void ); + +/* + * Read value from a specified ADC Channel at the given resolution + */ +extern uint16 HalAdcRead ( uint8 channel, uint8 resolution ); + +/* + * Set the reference voltage for the ADC + */ +extern void HalAdcSetReference ( uint8 reference ); + +/* + * Check for minimum Vdd specified. + */ +extern bool HalAdcCheckVdd(uint8 vdd); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 20 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" +/************************************************************************************************** + Filename: hal_led.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LED Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_led.h" + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +/* LEDS - The LED number is the same as the bit position */ + + + + + + +/* Modes */ + + + + + + +/* Defaults */ + + + + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * GLOBAL VARIABLES + */ + +/* + * Initialize LED Service. + */ +extern void HalLedInit( void ); + +/* + * Set the LED ON/OFF/TOGGLE. + */ +extern uint8 HalLedSet( uint8 led, uint8 mode ); + +/* + * Blink the LED. + */ +extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); + +/* + * Put LEDs in sleep state - store current values + */ +extern void HalLedEnterSleep( void ); + +/* + * Retore LEDs from sleep state + */ +extern void HalLedExitSleep( void ); + +/* + * Return LED state + */ +extern uint8 HalLedGetState ( void ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 21 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" +/************************************************************************************************** + Filename: hal_key.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the KEY Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_key.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* Interrupt option - Enable or disable */ + + + +/* Key state - shift or nornal */ + + + + + + + + + + + + +/* Joystick */ + + + + + + +/* Buttons */ + + + + + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ +typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ +extern bool Hal_KeyIntEnable; + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize the Key Service + */ +extern void HalKeyInit( void ); + +/* + * Configure the Key Service + */ +extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback); + +/* + * Read the Key status + */ +extern uint8 HalKeyRead( void); + +/* + * Enter sleep mode, store important values + */ +extern void HalKeyEnterSleep ( void ); + +/* + * Exit sleep mode, retore values + */ +extern uint8 HalKeyExitSleep ( void ); + +/* + * This is for internal used by hal_driver + */ +extern void HalKeyPoll ( void ); + +/* + * This is for internal used by hal_sleep + */ +extern bool HalKeyPressed( void ); + +extern uint8 hal_key_keys(void); + +extern uint8 hal_key_int_keys(void); + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" +/************************************************************************************************** + Filename: hal_lcd.h + Revised: $Date: 2007-07-06 10:42:24 -0700 (Fri, 06 Jul 2007) $ + Revision: $Revision: 13579 $ + + Description: This file contains the interface to the LCD Service. + + + Copyright 2005-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + + + +/************************************************************************************************** + * CONSTANTS + **************************************************************************************************/ + +/* These are used to specify which line the text will be printed */ + + +/* + This to support LCD with extended number of lines (more than 2). + Don't use these if LCD doesn't support more than 2 lines +*/ +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_lcd.h" + +/************************************************************************************************** + * MACROS + **************************************************************************************************/ + + +/************************************************************************************************** + * TYPEDEFS + **************************************************************************************************/ + + +/************************************************************************************************** + * GLOBAL VARIABLES + **************************************************************************************************/ + + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + +/* + * Initialize LCD Service + */ +extern void HalLcdInit(void); + +/* + * Write a string to the LCD + */ +extern void HalLcdWriteString ( char *str, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option); + +/* + * Write a value to the LCD + */ +extern void HalLcdWriteScreen( char *line1, char *line2 ); + +/* + * Write a string followed by a value to the LCD + */ +extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line ); + +/* + * Write a string followed by 2 values to the LCD + */ +extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line ); + +/* + * Write a percentage bar to the LCD + */ +extern void HalLcdDisplayPercentBar( char *title, uint8 value ); + + +/************************************************************************************************** +**************************************************************************************************/ + + + + + +#line 23 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" +/************************************************************************************************** + Filename: hal_uart.h + Revised: $Date: 2012-10-17 09:45:25 -0700 (Wed, 17 Oct 2012) $ + Revision: $Revision: 31844 $ + + Description: This file contains the interface to the UART Service. + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/*************************************************************************************************** + * INCLUDES + ***************************************************************************************************/ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\hal\\include\\hal_board.h" +#line 52 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/*************************************************************************************************** + * MACROS + ***************************************************************************************************/ + +/*************************************************************************************************** + * CONSTANTS + ***************************************************************************************************/ + + +/* UART Ports */ + +/* + Serial Port Baudrate Settings + Have to match with baudrate table +*/ +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_uart.h" + +/* Frame Format constant */ + +/* Stop Bits */ + + + +/* Parity settings */ + + + + +/* Character Size */ + + + +/* Flow control */ + + + +/* Ports */ + + + + +/* UART Status */ + + + + + + +/* UART Events */ + + + + + + +/*************************************************************************************************** + * TYPEDEFS + ***************************************************************************************************/ + +typedef void (*halUARTCBack_t) (uint8 port, uint8 event); + +typedef struct +{ + // The head or tail is updated by the Tx or Rx ISR respectively, when not polled. + volatile uint16 bufferHead; + volatile uint16 bufferTail; + uint16 maxBufSize; + uint8 *pBuffer; +} halUARTBufControl_t; + +typedef struct +{ + bool configured; + uint8 baudRate; + bool flowControl; + uint16 flowControlThreshold; + uint8 idleTimeout; + halUARTBufControl_t rx; + halUARTBufControl_t tx; + bool intEnable; + uint32 rxChRvdTime; + halUARTCBack_t callBackFunc; +}halUARTCfg_t; + +typedef union +{ + bool paramCTS; + bool paramRTS; + bool paramDSR; + bool paramDTR; + bool paramCD; + bool paramRI; + uint16 baudRate; + bool flowControl; + bool flushControl; +}halUARTIoctl_t; + + +/*************************************************************************************************** + * GLOBAL VARIABLES + ***************************************************************************************************/ + + +/*************************************************************************************************** + * FUNCTIONS - API + ***************************************************************************************************/ +/* + * Initialize UART at the startup + */ +extern void HalUARTInit ( void ); + +/* + * Open a port based on the configuration + */ +extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config ); + +/* + * Close a port + */ +extern void HalUARTClose ( uint8 port ); + +/* + * Read a buffer from the UART + */ +extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buff to the uart * + */ +extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); + +/* + * Write a buffer to the UART + */ +extern uint8 HalUARTIoctl ( uint8 port, uint8 cmd, halUARTIoctl_t *pIoctl ); + +/* + * This to support polling + */ +extern void HalUARTPoll( void ); + +/* + * Return the number of bytes in the Rx buffer + */ +extern uint16 Hal_UART_RxBufLen ( uint8 port ); + +/* + * Return the number of bytes in the Tx buffer + */ +extern uint16 Hal_UART_TxBufLen ( uint8 port ); + +/* + * This enable/disable flow control + */ +extern void Hal_UART_FlowControlSet ( uint8 port, bool status ); + +/* + * Initialize hardware for UART + */ +extern uint8 HalUART_HW_Init(uint8 port); + +/* + * Abort UART when entering sleep mode + */ +extern void HalUARTSuspend(void); + +/* + * Resume UART after wakeup from sleep + */ +extern void HalUARTResume(void); + +/*************************************************************************************************** +***************************************************************************************************/ + + + + + +#line 24 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" +/** + @headerfile: gatt.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT API + + Description: This file contains Generic Attribute Profile (GATT) + definitions and prototypes.

+ + \image html HighLevelGATT.PNG + + \htmlinclude GATTDesc.html + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" +/** + @headerfile: att.h + + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" +/************************************************************************************************** + Filename: l2cap.h + Revised: $Date: 2012-01-04 14:47:09 -0800 (Wed, 04 Jan 2012) $ + Revision: $Revision: 28826 $ + + Description: This file contains the L2CAP definitions. + + + Copyright 2009-2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +// Minimum supported information payload for the Basic information frame (B-frame) + + +// Minimum supported information payload for the Control frame (C-frame) + + +// Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes) + + +// Minimum size of PDU received from lower layer protocol (incoming +// packet), or delivered to lower layer protocol (outgoing packet). + + +// L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are +// reserved for specific L2CAP functions. Identifiers 0x0001-0x0003 +// are reserved by BR/EDR. + + + + + + +// L2CAP Dynamic Channel Identifiers + + + +// Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel + + +// Number of Protocols supported -- for future use + + +// Number of Auxiliary channels: one for each of Echo Request, Information +// Request and Connection Parameter Update Request + + +// Number of Dynamic channels: one per each protocol supported on each physical connection + + +// Total number of L2CAP channels: Dynamic channels plus Auxiliary channels + + +// L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds). +// The RTX timer is used for response timeout or to terminate a dynamic channel +// when the remote device is unresponsive to signaling requests. Its value may +// range from 1 to 60 seconds. + + +// L2CAP Signaling Codes (type of commands) +#line 114 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\l2cap.h" + +/********************************************************************* + * Command Reject: Reason Codes + */ + // Command not understood + + + // Signaling MTU exceeded + + + // Invalid CID in request + + +/********************************************************************* + * Information Request/Response: Info Type + */ + // Connectionless MTU + + + // Extended features supported + + + // Fixed channels supported + + +/********************************************************************* + * Information Response: Extended Features Mask Values + */ + // Fixed channels are supported + + + // Length of Extended Features bit mask + + +/********************************************************************* + * Information Response: Fixed Channels Mask Values + */ + // Fixed Channel ATT is supported + + + // Fixed Channel L2CAP Signaling is supported + + + // Fixed Channel SMP is supported + + + // Length of Fixed Channels bit mask + + +/********************************************************************* + * Information Response: Result Values + */ + // Success + + + // Not supported + + +/********************************************************************* + * Connection Parameter Update Response: Result values + */ + // Connection Parameters accepted + + + // Connection Parameters rejected + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +// Invalid CID in Request format +typedef struct +{ + uint16 localCID; // Destination CID from the rejected command + uint16 remoteCID; // Source CID from the rejected command +} l2capInvalidCID_t; + +// Command Reject Reason Data format +typedef union +{ + uint16 signalMTU; // Maximum Signaling MTU + l2capInvalidCID_t invalidCID; // Invalid CID in Request +} l2capReasonData_t; + +// Command Reject format +typedef struct +{ + uint16 reason; // Reason + l2capReasonData_t reasonData; // Reason Data + + // Shorthand access for union members + + + +} l2capCmdReject_t; + +// Echo Request format +typedef struct +{ + uint8 *pData; // Optional data field + uint16 len; // Length of data +} l2capEchoReq_t; + +// Echo Response format +typedef struct +{ + uint8 *pData; // Optional data field -- must be freed by the application + uint16 len; // Length of data +} l2capEchoRsp_t; + +// Information Request format +typedef struct +{ + uint16 infoType; // Information type +} l2capInfoReq_t; + +// Information Response Data field +typedef union +{ + uint16 connectionlessMTU; // Connectionless MTU + uint32 extendedFeatures; // Extended features supported + uint8 fixedChannels[8]; // Fixed channels supported +} l2capInfo_t; + +// Information Response format +typedef struct +{ + uint16 result; // Result + uint16 infoType; // Information type + l2capInfo_t info; // Content of Info field depends on infoType +} l2capInfoRsp_t; + +// Connection Parameter Update Request format +typedef struct +{ + uint16 intervalMin; // Minimum Interval + uint16 intervalMax; // Maximum Interval + uint16 slaveLatency; // Slave Latency + uint16 timeoutMultiplier; // Timeout Multiplier +} l2capParamUpdateReq_t; + +// Connection Parameter Update Response format +typedef struct +{ + uint16 result; // Result +} l2capParamUpdateRsp_t; + +// Union of all L2CAP Signaling commands +typedef union +{ + // Requests + l2capEchoReq_t echoReq; + l2capInfoReq_t infoReq; + l2capParamUpdateReq_t updateReq; + + // Responses + l2capCmdReject_t cmdReject; + l2capEchoRsp_t echoRsp; + l2capInfoRsp_t infoRsp; + l2capParamUpdateRsp_t updateRsp; +} l2capSignalCmd_t; + +// OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an +// incoming Signaling command up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status + uint16 connHandle; // connection message was received on + uint8 id; // identifier to match responses with requests + uint8 opcode; // type of command + l2capSignalCmd_t cmd; // command data +} l2capSignalEvent_t; + +// L2CAP packet structure +typedef struct +{ + uint16 CID; // local channel id + uint8 *pPayload; // pointer to information payload. This contains the payload + // received from the upper layer protocol (outgoing packet), + // or delivered to the upper layer protocol (incoming packet). + uint16 len; // length of information payload +} l2capPacket_t; + +// OSAL L2CAP_DATA_EVENT message format. This message is used to forward an +// incoming data packet up to an upper layer application. +typedef struct +{ + osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status + uint16 connHandle; // connection packet was received on + l2capPacket_t pkt; // received packet +} l2capDataEvent_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Initialize L2CAP layer. + */ +extern void L2CAP_Init( uint8 taskId ); + +/* + * L2CAP Task event processing function. + */ +extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events ); + +/* + * Register a protocol/application with an L2CAP channel. + */ +extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID ); + +/* + * Send L2CAP Data Packet. + */ +extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt ); + +/* + * Send Command Reject. + */ +extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject ); + +/* + * Build Command Reject. + */ +extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd ); + +/* + * Send L2CAP Echo Request. + */ +extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId ); + +/* + * Send L2CAP Information Request. + */ +extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId ); + +/* + * Build Information Response. + */ +extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd ); + +/* + * Parse Information Request. + */ +extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId ); + +/* + * Parse Connection Parameter Update Request. + */ +extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len ); + +/* + * Send L2CAP Connection Parameter Update Response. + */ +extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp ); + +/* + * Build Connection Parameter Update Response. + */ +extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData ); + +/* + * Allocate a block of memory at the L2CAP layer. + */ +extern void *L2CAP_bm_alloc( uint16 size ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/********************************************************************* + * CONSTANTS + */ + +// The Exchanging MTU Size is defined as the maximum size of any packet +// transmitted between a client and a server. A higher layer specification +// defines the default ATT MTU value. The ATT MTU value should be within +// the range 23 to 517 inclusive. + + + +/** @defgroup ATT_METHOD_DEFINES ATT Methods + * @{ + */ + +#line 101 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + + + + +/** @} End ATT_METHOD_DEFINES */ + +/*** Opcode fields: bitmasks ***/ +// Method (bits 5-0) + + +// Command Flag (bit 6) + + +// Authentication Signature Flag (bit 7) + + +// Size of 16-bit Bluetooth UUID + + +// Size of 128-bit UUID + + +// ATT Response or Confirmation timeout + + +// Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent + + + + +/********************************************************************* + * Error Response: Error Code + */ + +/** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes + * @{ + */ + +#line 156 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\att.h" + +/*** Reserved for future use: 0x12 - 0x7F ***/ + +/*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ + + + +/** @} End ATT_ERR_CODE_DEFINES */ + +/********************************************************************* + * Find Information Response: UUID Format + */ + // Handle and 16-bit Bluetooth UUID + + + // Handle and 128-bit UUID + + +// Maximum number of handle and 16-bit UUID pairs in a single Find Info Response + + +// Maximum number of handle and 128-bit UUID pairs in a single Find Info Response + + +/********************************************************************* + * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) + */ + // Maximum number of handles info in a single Find By Type Value Response + + +/********************************************************************* + * Read Multiple Request: Handles + */ + // Maximum number of handles in a single Read Multiple Request + + + // Minimum number of handles in a single Read Multiple Request + + +/********************************************************************* + * Execute Write Request: Flags + */ + // Cancel all prepared writes + + + // Immediately write all pending prepared values + + + + + + + + +/********************************************************************* + * Size of mandatory fields of ATT requests + */ +// Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) + + +// Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) + + +/********************************************************************* + * VARIABLES + */ +extern const uint8 btBaseUUID[16]; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * TYPEDEFS + */ + +/** + * Attribute Protocol PDU format. + */ +typedef struct +{ + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag + uint8 method; //!< Method + uint16 len; //!< Length of Attribute Parameters + uint8 *pParams; //!< Attribute Parameters +} attPacket_t; + +/** + * Attribute Type format (2 or 16 octet UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[16]; //!< 16 or 128 bit UUID +} attAttrType_t; + +/** + * Attribute Type format (2-octet Bluetooth UUID). + */ +typedef struct +{ + uint8 len; //!< Length of UUID + uint8 uuid[2]; //!< 16 bit UUID +} attAttrBtType_t; + +/** + * Error Response format. + */ +typedef struct +{ + uint8 reqOpcode; //!< Request that generated this error response + uint16 handle; //!< Attribute handle that generated error response + uint8 errCode; //!< Reason why the request has generated error response +} attErrorRsp_t; + +/** + * Exchange MTU Request format. + */ +typedef struct +{ + uint16 clientRxMTU; //!< Client receive MTU size +} attExchangeMTUReq_t; + +/** + * Exchange MTU Response format. + */ +typedef struct +{ + uint16 serverRxMTU; //!< Server receive MTU size +} attExchangeMTURsp_t; + +/** + * Find Information Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number +} attFindInfoReq_t; + +/** + * Handle and its 16-bit Bluetooth UUIDs. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[2]; //!< 2-octet Bluetooth UUID +} attHandleBtUUID_t; + +/** + * Handle and its 128-bit UUID. + */ +typedef struct +{ + uint16 handle; //!< Handle + uint8 uuid[16]; //!< 16-octect UUID +} attHandleUUID_t; + +/** + * Info data format for Find Information Response (handle-UUID pair). + */ +typedef union +{ + attHandleBtUUID_t btPair[( ( 23 - 2 ) / ( 2 + 2 ) )]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs + attHandleUUID_t pair[( ( 23 - 2 ) / ( 2 + 16 ) )]; //!< A list of 1 or more handles with their 128-bit UUIDs +} attFindInfo_t; + +/** + * Find Information Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of attribute handle-UUID pairs found + uint8 format; //!< Format of information data + attFindInfo_t info; //!< Information data whose format is determined by format field +} attFindInfoRsp_t; + +/** + * Find By Type Value Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrBtType_t type; //!< 2-octet UUID to find + uint8 len; //!< Length of value + uint8 value[23-7]; //!< Attribute value to find +} attFindByTypeValueReq_t; + +/** + * Handles Infomation format. + */ +typedef struct +{ + uint16 handle; //!< Found attribute handle + uint16 grpEndHandle; //!< Group end handle +} attHandlesInfo_t; + +/** + * Find By Type Value Response format. + */ +typedef struct +{ + uint8 numInfo; //!< Number of handles information found + attHandlesInfo_t handlesInfo[( ( 23 - 1 ) / 4 )]; //!< List of 1 or more handles information +} attFindByTypeValueRsp_t; + +/** + * Read By Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested type (2 or 16 octet UUID) +} attReadByTypeReq_t; + +/** + * Read By Type Response format. + */ +typedef struct +{ + uint8 numPairs; //!< Number of attribute handle-UUID pairs found + uint8 len; //!< Size of each attribute handle-value pair + uint8 dataList[23-2]; //!< List of 1 or more attribute handle-value pairs +} attReadByTypeRsp_t; + +/** + * Read Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) +} attReadReq_t; + +/** + * Read Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Value of the attribute with the handle given +} attReadRsp_t; + +/** + * Read Blob Req format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be read (must be first field) + uint16 offset; //!< Offset of the first octet to be read +} attReadBlobReq_t; + +/** + * Read Blob Response format. + */ +typedef struct +{ + uint8 len; //!< Length of value + uint8 value[23-1]; //!< Part of the value of the attribute with the handle given +} attReadBlobRsp_t; + +/** + * Read Multiple Request format. + */ +typedef struct +{ + uint16 handle[( ( 23 - 1 ) / 2 )]; //!< Set of two or more attribute handles (must be first field) + uint8 numHandles; //!< Number of attribute handles +} attReadMultiReq_t; + +/** + * Read Multiple Response format. + */ +typedef struct +{ + uint8 len; //!< Length of values + uint8 values[23-1]; //!< Set of two or more values +} attReadMultiRsp_t; + +/** + * Read By Group Type Request format. + */ +typedef struct +{ + uint16 startHandle; //!< First requested handle number (must be first field) + uint16 endHandle; //!< Last requested handle number + attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) +} attReadByGrpTypeReq_t; + +/** + * Read By Group Type Response format. + */ +typedef struct +{ + uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found + uint8 len; //!< Length of each attribute handle, end group handle and value set + uint8 dataList[23-2]; //!< List of 1 or more attribute handle, end group handle and value +} attReadByGrpTypeRsp_t; + +/** + * Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< Value of the attribute to be written + uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) + uint8 cmd; //!< Command Flag +} attWriteReq_t; + +/** + * Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteReq_t; + +/** + * Prepare Write Response format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been read + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 value[23-5]; //!< Part of the value of the attribute to be written +} attPrepareWriteRsp_t; + +/** + * Execute Write Request format. + */ +typedef struct +{ + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} attExecuteWriteReq_t; + +/** + * Handle Value Notification format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueNoti_t; + +/** + * Handle Value Indication format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute that has been changed (must be first field) + uint8 len; //!< Length of value + uint8 value[23-3]; //!< New value of the attribute +} attHandleValueInd_t; + +/** + * ATT Message format. It's a union of all attribute protocol messages used + * between the attribute protocol and upper layer profile/application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} attMsg_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * General Utility APIs + */ + +/* + * Parse an attribute protocol message. + */ +extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); + +/* + * Compare two UUIDs. The UUIDs are converted if necessary. + */ +extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, + const uint8 *pUUID2, uint16 len2 ); +/* + * Convert a 16-bit UUID to 128-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); + +/* + * Convert a 128-bit UUID to 16-bit UUID. + */ +extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); + + +/*------------------------------------------------------------------- + * Attribute Client Utility APIs + */ + +/* + * Build Error Response. + */ +extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Error Response. + */ +extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Exchange MTU Request. + */ +extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Exchange MTU Respnose. + */ +extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Exchange MTU Response. + */ +extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Request. + */ +extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find Information Response. + */ +extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Find Information Response. + */ +extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Request. + */ +extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Find By Type Value Response. + */ +extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Find By Type Value Response. + */ +extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Type Request. + */ +extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read By Type Response. + */ +extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Type Response. + */ +extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Request. + */ +extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Response. + */ +extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Response. + */ +extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Blob Request. + */ +extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Blob Response. + */ +extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Blob Response. + */ +extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read Multiple Request. + */ +extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Read Multiple Response. + */ +extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read Multiple Response. + */ +extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Read By Group Type Response. + */ +extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Read By Group Type Response. + */ +extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Write Request. + */ +extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Write Response. + */ +extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Prepare Write Request. + */ +extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Build Prepare Write Response. + */ +extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Prepare Write Response. + */ +extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Execute Write Request. + */ +extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Execute Write Response. + */ +extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Build Handle Value Indication. + */ +extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); + +/* + * Parse Handle Value Indication. + */ +extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Server Utility APIs + */ + +/* + * Parse Exchange MTU Request. + */ +extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find Information Request. + */ +extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Find By Type Value Request. + */ +extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read By Type Request. + */ +extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Request. + */ +extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Blob Request. + */ +extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Read Multiple Request. + */ +extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Write Request. + */ +extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Execute Write Request. + */ +extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Prepare Write Request. + */ +extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); + +/* + * Parse Handle Value Confirmation. + */ +extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); + + +/*------------------------------------------------------------------- + * Attribute Client Public APIs + */ + +/** + * @defgroup ATT_CLIENT_API ATT Client API Functions + * + * @{ + */ + +/** + * @brief Send Exchange MTU Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); + +/** + * @brief Send Find Information Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); + +/** + * @brief Send Find By Type Value Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); + +/** + * @brief Send Read By Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); + +/** + * @brief Send Read Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); + +/** + * @brief Send Read Blob Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); + +/** + * @brief Send Read Multiple Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); + +/** + * @brief Send Read By Group Type Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); + +/** + * @brief Send Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ */ +extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief Send Prepare Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); + +/** + * @brief Send Execute Write Request. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); + +/** + * @brief Send Handle Value Confirmation. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Confirmation was sent successfully.
+ * INVALIDPARAMETER: Invalid confirmation field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Attribute Server Public APIs + */ + +/** + * @defgroup ATT_SERVER_API ATT Server API Functions + * + * @{ + */ + +/** + * @brief Send Error Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to error response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); + +/** + * @brief Send Exchange MTU Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to request to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); + +/** + * @brief Send Find Information Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); + +/** + * @brief Send Find By Tyep Value Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); + +/** + * @brief Send Read By Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); + +/** + * @brief Send Read Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); + +/** + * @brief Send Read Blob Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); + +/** + * @brief Send Read Multiple Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; + +/** + * @brief Send Read By Group Type Respond. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); + +/** + * @brief Send Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_WriteRsp( uint16 connHandle ); + +/** + * @brief Send Prepare Write Response. + * + * @param connHandle - connection to use + * @param pRsp - pointer to response to be sent + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); + +/** + * @brief Send Execute Write Response. + * + * @param connHandle - connection to use + * + * @return SUCCESS: Response was sent successfully.
+ * INVALIDPARAMETER: Invalid response field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); + +/** + * @brief Send Handle Value Notification. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid notification field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); + +/** + * @brief Send Handle Value Indication. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid indication field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); + +/** + * @} + */ + +/** + * @brief Set a ATT Parameter value. Use this function to change + * the default ATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void ATT_SetParamValue( uint16 value ); + +/** + * @brief Get a ATT Parameter value. + * + * @param none + * + * @return ATT Parameter value + */ +extern uint16 ATT_GetParamValue( void ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 61 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_PERMIT_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields + * @{ + */ + +#line 76 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/** @} End GATT_PERMIT_BITMAPS_DEFINES */ + + +/** @defgroup GATT_NUM_PREPARE_WRITES_DEFINES GATT Maximum Number of Prepare Writes + * @{ + */ + + + + + +/** @} End GATT_NUM_PREPARE_WRITES_DEFINES */ + + +/** @defgroup GATT_ENCRYPT_KEY_SIZE_DEFINES GATT Encryption Key Size + * @{ + */ + + + +/** @} End GATT_ENCRYPT_KEY_SIZE_DEFINES */ + + +/** @defgroup GATT_MAX_ATTR_SIZE_DEFINES GATT Maximum Attribute Value Length + * @{ + */ + + + +/** @} End GATT_MAX_ATTR_SIZE_DEFINES */ + +// GATT Maximum number of connections (including loopback) + + + // GATT Base Method + + +// Attribute handle defintions + + + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// Attribute Access Permissions +#line 134 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +// Check for different UUID types +#line 146 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gatt.h" + +/********************************************************************* + * TYPEDEFS + */ + +/** + * GATT Read By Type Request format. + */ +typedef struct +{ + uint8 discCharsByUUID; //!< Whether this is a GATT Discover Characteristics by UUID sub-procedure + attReadByTypeReq_t req; //!< Read By Type Request +} gattReadByTypeReq_t; + +/** + * GATT Prepare Write Request format. + */ +typedef struct +{ + uint16 handle; //!< Handle of the attribute to be written (must be first field) + uint16 offset; //!< Offset of the first octet to be written + uint8 len; //!< Length of value + uint8 *pValue; //!< Part of the value of the attribute to be written (must be allocated) +} gattPrepareWriteReq_t; + +/** + * GATT Write Long Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always FALSE for Write Long) + gattPrepareWriteReq_t req; //!< GATT Prepare Write Request + uint16 lastOffset; //!< Offset of last Prepare Write Request sent +} gattWriteLongReq_t; + +/** + * GATT Reliable Writes Request format. Do not change the order of the members. + */ +typedef struct +{ + uint8 reliable; //!< Whether reliable writes requested (always TRUE for Reliable Writes) + attPrepareWriteReq_t *pReqs; //!< Arrary of Prepare Write Requests (must be allocated) + uint8 numReqs; //!< Number of Prepare Write Requests + uint8 index; //!< Index of last Prepare Write Request sent + uint8 flags; //!< 0x00 - cancel all prepared writes. + //!< 0x01 - immediately write all pending prepared values. +} gattReliableWritesReq_t; + +/** + * GATT Message format. It's a union of all attribute protocol/profile messages + * used between the attribute protocol/profile and upper layer application. + */ +typedef union +{ + // Request messages + attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request + attFindInfoReq_t findInfoReq; //!< ATT Find Information Request + attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request + attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request + attReadReq_t readReq; //!< ATT Read Request + attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request + attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request + attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request + attWriteReq_t writeReq; //!< ATT Write Request + attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request + attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request + gattReadByTypeReq_t gattReadByTypeReq; //!< GATT Read By Type Request + gattWriteLongReq_t gattWriteLongReq; //!< GATT Long Write Request + gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request + + // Response messages + attErrorRsp_t errorRsp; //!< ATT Error Response + attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response + attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response + attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response + attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response + attReadRsp_t readRsp; //!< ATT Read Response + attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response + attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response + attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response + attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response + + // Indication and Notification messages + attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification + attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication +} gattMsg_t; + +/** + * GATT OSAL GATT_MSG_EVENT message format. This message is used to forward an + * incoming attribute protocol/profile message up to upper layer application. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< Type of message + gattMsg_t msg; //!< Attribute protocol/profile message +} gattMsgEvent_t; + +/** + * GATT Attribute Type format. + */ +typedef struct +{ + uint8 len; //!< Length of UUID + const uint8 *uuid; //!< Pointer to UUID +} gattAttrType_t; + +/** + * GATT Attribute format. + */ +typedef struct attAttribute_t +{ + gattAttrType_t type; //!< Attribute type (2 or 16 octet UUIDs) + uint8 permissions; //!< Attribute permissions + uint16 handle; //!< Attribute handle - assigned internally by attribute server + uint8* const pValue; //!< Attribute value - encoding of the octet array is defined in + //!< the applicable profile. The maximum length of an attribute + //!< value shall be 512 octets. +} gattAttribute_t; + +/** + * GATT Service format. + */ +typedef struct +{ + uint16 numAttrs; //!< Number of attributes in attrs + + /** Array of attribute records. + * NOTE: The list must start with a Service attribute followed by + * all attributes associated with this Service attribute. + */ + gattAttribute_t *attrs; +} gattService_t; + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/*------------------------------------------------------------------- + * GATT Client Public APIs + */ + +/** + * @defgroup GATT_CLIENT_API GATT Client API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Client. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitClient( void ); + +/** + * @brief Register to receive incoming ATT Indications or Notifications + * of attribute values. + * + * @param taskId – task to forward indications or notifications to + * + * @return void + */ +extern void GATT_RegisterForInd( uint8 taskId ); + +/** + * @brief The Prepare Write Request is used to request the server to + * prepare to write the value of an attribute. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief The Execute Write Request is used to request the server to + * write or cancel the write of all the prepared values currently + * held in the prepare queue from this client. + * + * Note: This function is needed only for GATT testing. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Public APIs + */ + +/** + * @defgroup GATT_SERVER_API GATT Server API Functions + * + * @{ + */ + +/** + * @brief Initialize the Generic Attribute Profile Server. + * + * @return SUCCESS + */ +extern bStatus_t GATT_InitServer( void ); + +/** + * @brief Register a service attribute list with the GATT Server. A service + * is composed of characteristics or references to other services. + * Each characteristic contains a value and may contain optional + * information about the value. There are two types of services: + * primary service and secondary service. + * + * A service definition begins with a service declaration and ends + * before the next service declaration or the maximum Attribute Handle. + * + * A characteristic definition begins with a characteristic declaration + * and ends before the next characteristic or service declaration or + * maximum Attribute Handle. + * + * The attribute server will only keep a pointer to the attribute + * list, so the calling application will have to maintain the code + * and RAM associated with this list. + * + * @param pService - pointer to service attribute list to be registered + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATT_RegisterService( gattService_t *pService ); + +/** + * @brief Deregister a service attribute list with the GATT Server. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param pService - pointer to deregistered service (to be returned) + * + * @return SUCCESS: Service deregistered successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATT_DeregisterService( uint16 handle, gattService_t *pService ); + +/** + * @brief Register to receive incoming ATT Requests. + * + * @param taskId – task to forward requests to + * + * @return void + */ +extern void GATT_RegisterForReq( uint8 taskId ); + +/** + * @brief Verify the permissions of an attribute for reading. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * + * @return SUCCESS: Attribute can be read.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be read.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyReadPermissions( uint16 connHandle, uint8 permissions ); + +/** + * @brief Verify the permissions of an attribute for writing. + * + * @param connHandle - connection to use + * @param permissions - attribute permissions + * @param pReq - pointer to write request + * + * @return SUCCESS: Attribute can be written.
+ * ATT_ERR_READ_NOT_PERMITTED: Attribute cannot be written.
+ * ATT_ERR_INSUFFICIENT_AUTHEN: Attribute requires authentication.
+ * ATT_ERR_INSUFFICIENT_KEY_SIZE: Key Size used for encrypting is insufficient.
+ * ATT_ERR_INSUFFICIENT_ENCRYPT: Attribute requires encryption.
+ */ +extern bStatus_t GATT_VerifyWritePermissions( uint16 connHandle, uint8 permissions, attWriteReq_t *pReq ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern uint8 GATT_ServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Find the attribute record for a given handle and UUID. + * + * @param startHandle - first handle to look for + * @param endHandle - last handle to look for + * @param pUUID - pointer to UUID to look for + * @param len - length of UUID + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandleUUID( uint16 startHandle, uint16 endHandle, const uint8 *pUUID, + uint16 len, uint16 *pHandle ); +/** + * @brief Find the attribute record for a given handle + * + * @param handle - handle to look for + * @param pHandle - handle of owner of attribute (to be returned) + * + * @return Pointer to attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindHandle( uint16 handle, uint16 *pHandle ); + +/** + * @brief Find the next attribute of the same type for a given attribute. + * + * @param pAttr - pointer to attribute to find a next for + * @param endHandle - last handle to look for + * @param service - handle of owner service + * @param pLastHandle - handle of last attribute (to be returned) + * + * @return Pointer to next attribute record. NULL, otherwise. + */ +extern gattAttribute_t *GATT_FindNextAttr( gattAttribute_t *pAttr, uint16 endHandle, + uint16 service, uint16 *pLastHandle ); +/** + * @brief Get the number of attributes for a given service + * + * @param handle - service handle to look for + * + * @return Number of attributes. 0, otherwise. + */ +extern uint16 GATT_ServiceNumAttrs( uint16 handle ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Server Sub-Procedure APIs + */ + +/** + * @defgroup GATT_SERVER_SUB_PROCEDURE_API GATT Server Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used when a server is configured to + * indicate a characteristic value to a client and expects an + * attribute protocol layer acknowledgement that the indication + * was successfully received. + * + * The ATT Handle Value Indication is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be ATT_HANDLE_VALUE_CFM. + * + * Note: This sub-procedure is complete when ATT_HANDLE_VALUE_CFM + * (with SUCCESS or bleTimeout status) is received by the + * calling application task. + * + * @param connHandle - connection to use + * @param pInd - pointer to indication to be sent + * @param authenticated - whether an authenticated link is required + * @param taskId - task to be notified of response + * + * @return SUCCESS: Indication was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Indication( uint16 connHandle, attHandleValueInd_t *pInd, + uint8 authenticated, uint8 taskId ); +/** + * @brief This sub-procedure is used when a server is configured to + * notify a characteristic value to a client without expecting + * any attribute protocol layer acknowledgement that the + * notification was successfully received. + * + * The ATT Handle Value Notification is used in this sub-procedure. + * + * Note: A notification may be sent at any time and does not + * invoke a confirmation. + * + * No confirmation will be sent to the calling application task for + * this sub-procedure. + * + * @param connHandle - connection to use + * @param pNoti - pointer to notification to be sent + * @param authenticated - whether an authenticated link is required + * + * @return SUCCESS: Notification was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, + uint8 authenticated ); +/** + * @} + */ + +/*------------------------------------------------------------------- + * GATT Client Sub-Procedure APIs + */ + +/** + * @defgroup GATT_CLIENT_SUB_PROCEDURE_API GATT Client Sub-Procedure API Functions + * + * @{ + */ + +/** + * @brief This sub-procedure is used by the client to set the ATT_MTU + * to the maximum possible value that can be supported by both + * devices when the client supports a value greater than the + * default ATT_MTU for the Attribute Protocol. This sub-procedure + * shall only be initiated once during a connection. + * + * The ATT Exchange MTU Request is used by this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_EXCHANGE_MTU_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_EXCHANGE_MTU_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ExchangeMTU( uint16 connHandle, attExchangeMTUReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover all + * the primary services on a server. + * + * The ATT Read By Group Type Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service". The + * Starting Handle is set to 0x0001 and the Ending Handle is + * set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_GRP_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_GRP_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application + * task. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllPrimaryServices( uint16 connHandle, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to discover a specific + * primary service on a server when only the Service UUID is + * known. The primary specific service may exist multiple times + * on a server. The primary service being discovered is identified + * by the service UUID. + * + * The ATT Find By Type Value Request is used with the Attribute + * Type parameter set to the UUID for "Primary Service" and the + * Attribute Value set to the 16-bit Bluetooth UUID or 128-bit + * UUID for the specific primary service. The Starting Handle shall + * be set to 0x0001 and the Ending Handle shall be set to 0xFFFF. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_BY_TYPE_VALUE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_BY_TYPE_VALUE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pValue - pointer to value to look for + * @param len - length of value + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscPrimaryServiceByUUID( uint16 connHandle, uint8 *pValue, + uint8 len, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find include + * service declarations within a service definition on a + * server. The service specified is identified by the service + * handle range. + * + * The ATT Read By Type Request is used with the Attribute + * Type parameter set to the UUID for "Included Service". The + * Starting Handle is set to starting handle of the specified + * service and the Ending Handle is set to the ending handle + * of the specified service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_FindIncludedServices( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic declarations within a service definition on + * a server when only the service handle range is known. The + * service specified is identified by the service handle range. + * + * The ATT Read By Type Request is used with the Attribute Type + * parameter set to the UUID for "Characteristic". The Starting + * Handle is set to starting handle of the specified service and + * the Ending Handle is set to the ending handle of the specified + * service. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllChars( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used by a client to discover service + * characteristics on a server when only the service handle + * ranges are known and the characteristic UUID is known. + * The specific service may exist multiple times on a server. + * The characteristic being discovered is identified by the + * characteristic UUID. + * + * The ATT Read By Type Request is used with the Attribute Type + * is set to the UUID for "Characteristic" and the Starting + * Handle and Ending Handle parameters is set to the service + * handle range. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscCharsByUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used by a client to find all the + * characteristic descriptor’s Attribute Handles and Attribute + * Types within a characteristic definition when only the + * characteristic handle range is known. The characteristic + * specified is identified by the characteristic handle range. + * + * The ATT Find Information Request is used with the Starting + * Handle set to starting handle of the specified characteristic + * and the Ending Handle set to the ending handle of the specified + * characteristic. The UUID Filter parameter is NULL (zero length). + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_FIND_INFO_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_FIND_INFO_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param startHandle - starting handle + * @param endHandle - end handle + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_DiscAllCharDescs( uint16 connHandle, uint16 startHandle, + uint16 endHandle, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client knows the Characteristic Value + * Handle. The ATT Read Request is used with the Attribute Handle + * parameter set to the Characteristic Value Handle. The Read + * Response returns the Characteristic Value in the Attribute + * Value parameter. + * + * The Read Response only contains a Characteristic Value that + * is less than or equal to (ATT_MTU – 1) octets in length. If + * the Characteristic Value is greater than (ATT_MTU – 1) octets + * in length, the Read Long Characteristic Value procedure may + * be used if the rest of the Characteristic Value is required. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharValue( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a Characteristic Value + * from a server when the client only knows the characteristic + * UUID and does not know the handle of the characteristic. + * + * The ATT Read By Type Request is used to perform the sub-procedure. + * The Attribute Type is set to the known characteristic UUID and + * the Starting Handle and Ending Handle parameters shall be set + * to the range over which this read is to be performed. This is + * typically the handle range for the service in which the + * characteristic belongs. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT messages. + * The type of the message will be either ATT_READ_BY_TYPE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BY_TYPE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadUsingCharUUID( uint16 connHandle, attReadByTypeReq_t *pReq, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a Characteristic Value from + * a server when the client knows the Characteristic Value Handle + * and the length of the Characteristic Value is longer than can + * be sent in a single Read Response Attribute Protocol message. + * + * The ATT Read Blob Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharValue( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read multiple Characteristic Values + * from a server when the client knows the Characteristic Value + * Handles. The Attribute Protocol Read Multiple Requests is used + * with the Set Of Handles parameter set to the Characteristic Value + * Handles. The Read Multiple Response returns the Characteristic + * Values in the Set Of Values parameter. + * + * The ATT Read Multiple Request is used in this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_MULTI_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_MULTI_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadMultiCharValues( uint16 connHandle, attReadMultiReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the client does not need an acknowledgement that + * the write was successfully performed. This sub-procedure + * only writes the first (ATT_MTU – 3) octets of a Characteristic + * Value. This sub-procedure can not be used to write a long + * characteristic; instead the Write Long Characteristic Values + * sub-procedure should be used. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the Characteristic Value write request is the + * wrong size, or has an invalid value as defined by the profile, + * then the write will not succeed and no error will be generated + * by the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value + * to a server when the client knows the Characteristic Value + * Handle and the ATT Bearer is not encrypted. This sub-procedure + * shall only be used if the Characteristic Properties authenticated + * bit is enabled and the client and server device share a bond as + * defined in the GAP. + * + * This sub-procedure only writes the first (ATT_MTU – 15) octets + * of an Attribute Value. This sub-procedure cannot be used to + * write a long Attribute. + * + * The ATT Write Command is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new Characteristic Value authenticated by signing the + * value, as defined in the Security Manager. + * + * No response will be sent to the calling application task for this + * sub-procedure. If the authenticated Characteristic Value that is + * written is the wrong size, or has an invalid value as defined by + * the profile, or the signed value does not authenticate the client, + * then the write will not succeed and no error will be generated by + * the server. + * + * @param connHandle - connection to use + * @param pReq - pointer to command to be sent + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleLinkEncrypted: Connection is already encrypted.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_SignedWriteNoRsp( uint16 connHandle, attWriteReq_t *pReq ); + +/** + * @brief This sub-procedure is used to write a characteristic value + * to a server when the client knows the characteristic value + * handle. This sub-procedure only writes the first (ATT_MTU-3) + * octets of a characteristic value. This sub-procedure can not + * be used to write a long attribute; instead the Write Long + * Characteristic Values sub-procedure should be used. + * + * The ATT Write Request is used in this sub-procedure. The + * Attribute Handle parameter shall be set to the Characteristic + * Value Handle. The Attribute Value parameter shall be set to + * the new characteristic. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharValue( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle, + * and assurance is required that the correct Characteristic Value + * is going to be written by transferring the Characteristic Value + * to be written in both directions before the write is performed. + * This sub-procedure can also be used when multiple values must + * be written, in order, in a single operation. + * + * The sub-procedure has two phases, the first phase prepares the + * characteristic values to be written. Once this is complete, + * the second phase performs the execution of all of the prepared + * characteristic value writes on the server from this client. + * + * In the first phase, the ATT Prepare Write Request is used. + * In the second phase, the attribute protocol Execute Write + * Request is used. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReqs' pointer will be freed when the sub-procedure is + * complete. + * + * @param connHandle - connection to use + * @param pReqs - pointer to requests to be sent (must be allocated) + * @param numReqs - number of requests in pReq + * @param flags - execute write request flags + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReliableWrites( uint16 connHandle, attPrepareWriteReq_t *pReqs, + uint8 numReqs, uint8 flags, uint8 taskId ); +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle. + * + * The ATT Read Request is used for this sub-procedure. The Read + * Request is used with the Attribute Handle parameter set to the + * characteristic descriptor handle. The Read Response returns the + * characteristic descriptor value in the Attribute Value parameter. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_READ_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadCharDesc( uint16 connHandle, attReadReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to read a characteristic descriptor + * from a server when the client knows the characteristic descriptor + * declaration’s Attribute handle and the length of the characteristic + * descriptor declaration is longer than can be sent in a single Read + * Response attribute protocol message. + * + * The ATT Read Blob Request is used to perform this sub-procedure. + * The Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Value Offset parameter shall be the offset + * within the characteristic descriptor to be read. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_READ_BLOB_RSP or + * ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_READ_BLOB_RSP + * (with bleProcedureComplete or bleTimeout status) or ATT_ERROR_RSP + * (with SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_ReadLongCharDesc( uint16 connHandle, attReadBlobReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a characteristic + * descriptor value to a server when the client knows the + * characteristic descriptor handle. + * + * The ATT Write Request is used for this sub-procedure. The + * Attribute Handle parameter shall be set to the characteristic + * descriptor handle. The Attribute Value parameter shall be + * set to the new characteristic descriptor value. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive an OSAL GATT_MSG_EVENT message. + * The type of the message will be either ATT_WRITE_RSP + * or ATT_ERROR_RSP (if an error occurred on the server). + * + * Note: This sub-procedure is complete when either ATT_WRITE_RSP + * (with SUCCESS or bleTimeout status) or ATT_ERROR_RSP (with + * SUCCESS status) is received by the calling application task. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteCharDesc( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId ); + +/** + * @brief This sub-procedure is used to write a Characteristic Value to + * a server when the client knows the Characteristic Value Handle + * but the length of the Characteristic Value is longer than can + * be sent in a single Write Request Attribute Protocol message. + * + * The ATT Prepare Write Request and Execute Write Request are + * used to perform this sub-procedure. + * + * If the return status from this function is SUCCESS, the calling + * application task will receive multiple OSAL GATT_MSG_EVENT messages. + * The type of the messages will be either ATT_PREPARE_WRITE_RSP, + * ATT_EXECUTE_WRITE_RSP or ATT_ERROR_RSP (if an error occurred on + * the server). + * + * Note: This sub-procedure is complete when either ATT_PREPARE_WRITE_RSP + * (with bleTimeout status), ATT_EXECUTE_WRITE_RSP (with SUCCESS + * or bleTimeout status), or ATT_ERROR_RSP (with SUCCESS status) + * is received by the calling application task. + * + * Note: The 'pReq->pValue' pointer will be freed when the sub-procedure + * is complete. + * + * @param connHandle - connection to use + * @param pReq - pointer to request to be sent + * @param taskId - task to be notified of response + * + * @return SUCCESS: Request was sent successfully.
+ * INVALIDPARAMETER: Invalid connection handle or request field.v + * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A response is pending with this server.
+ * bleMemAllocError: Memory allocation error occurred.
+ * bleTimeout: Previous transaction timed out.
+ */ +extern bStatus_t GATT_WriteLongCharDesc( uint16 connHandle, gattPrepareWriteReq_t *pReq, uint8 taskId ); + +/** + * @} + */ + +/*------------------------------------------------------------------- + * Internal API - This function is only called from GATT Qualification modules. + */ + + /** + * @internal + * + * @brief Set the next available attribute handle. + * + * @param handle - next attribute handle. + * + * @return none + */ +extern void GATT_SetNextHandle( uint16 handle ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief GATT Task initialization function. + * + * @param taskId - GATT task ID. + * + * @return void + */ +extern void GATT_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Task event processing function. + * + * @param taskId - GATT task ID + * @param events - GATT events. + * + * @return events not processed + */ +extern uint16 GATT_ProcessEvent( uint8 taskId, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 27 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +/******************************************************************************* + Filename: hci.h + Revised: $Date: 2013-05-14 12:23:59 -0700 (Tue, 14 May 2013) $ + Revision: $Revision: 34279 $ + + Description: This file contains the Host Controller Interface (HCI) API. + It provides the defines, types, and functions for all + supported Bluetooth Low Energy (BLE) commands. + + All Bluetooth and BLE commands are based on: + Bluetooth Core Specification, V4.0.0, Vol. 2, Part E. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +/******************************************************************************* + Filename: ll.h + Revised: $Date: 2013-05-15 05:57:26 -0700 (Wed, 15 May 2013) $ + Revision: $Revision: 34287 $ + + Description: This file contains the Link Layer (LL) API for the Bluetooth + Low Energy (BLE) Controller. It provides the defines, types, + and functions for all supported Bluetooth Low Energy (BLE) + commands. + + This API is based on the Bluetooth Core Specification, + V4.0.0, Vol. 6. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + + + + + + + + + +/******************************************************************************* + * INCLUDES + */ + + +/******************************************************************************* + * MACROS + */ + +// check if connection parameter ranges for CI (min/max), SL, and LSTO are valid +#line 72 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// check if the CI/SL/LSTO combination is valid +// based on: LSTO > (1 + Slave Latency) * (Connection Interval * 2) +// Note: The CI * 2 requirement based on ESR05 V1.0, Erratum 3904. +// Note: LSTO time is normalized to units of 1.25ms (i.e. 10ms = 8 * 1.25ms). + + + +/******************************************************************************* + * CONSTANTS + */ + +/* +** LL API Status Codes +** +** Note: These status values map directly to the HCI Error Codes. +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// Internal + + + +// Encryption Key Request Reason Codes + + + + +// Disconnect Reason Codes +#line 161 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// Disconnect API Parameter +#line 170 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** LL API Parameters +*/ + +// LL Parameter Limits +#line 195 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +// LL Advertiser Channels + + + + + +// LL Advertiser Events + + + + + +// LL Address Type + + + +// Advertiser White List Policy + + + + + +// Scanner White List Policy + + + +// Initiator White List Policy + + + +// Black List Control + + + +// Advertiser Commands + + + + +// LL Scan Commands + + + +// LL Scan Filtering + + + +// LL Scan Types + + + +// LL Tx Power Types + + + +// Data Fragmentation Flag + + + + +// Connection Complete Role + + + +// Encryption Related + + + +// Feature Set Related + +// + + + +// Receive Flow Control + + + +// Direct Test Mode + + +// +#line 287 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// Vendor Specific + + +// + + + + + + + + + + + + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + + +// +#line 348 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// + + +// + + + +// Packet Lengths +#line 365 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Event Parameters +*/ + +// Advertising Report Data +#line 377 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" +// + + +// Sleep Clock Accuracy (SCA) +#line 389 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + +/* +** Miscellaneous +*/ + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 llStatus_t; + +// Packet Error Rate Information By Channel +typedef struct +{ + uint16 numPkts[ 37 ]; + uint16 numCrcErr[ 37 ]; +} perByChan_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * LL OSAL Functions + */ + +/******************************************************************************* + * @fn LL_Init + * + * @brief This is the Link Layer task initialization called by OSAL. It + * must be called once when the software system is started and + * before any other function in the LL API is called. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_Init( uint8 taskId ); + + +/******************************************************************************* + * @fn LL_ProcessEvent + * + * @brief This is the Link Layer process event handler called by OSAL. + * + * input parameters + * + * @param taskId - Task identifier assigned by OSAL. + * events - Event flags to be processed by this task. + * + * output parameters + * + * @param None. + * + * @return Unprocessed event flags. + */ +extern uint16 LL_ProcessEvent( uint8 task_id, uint16 events ); + + +/******************************************************************************* + * LL API for HCI + */ + +/******************************************************************************* + * @fn LL_Reset API + * + * @brief This function is used by the HCI to reset and initialize the + * LL Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Reset( void ); + + +/******************************************************************************* + * @fn LL_ReadBDADDR API + * + * @brief This API is called by the HCI to read the controller's + * own public device address. + * + * Note: The device's address is stored in NV memory. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadBDADDR( uint8 *bdAddr ); + + +/******************************************************************************* + * + * @fn LL_SetRandomAddress API + * + * @brief This function is used to save this device's random address. It + * is provided by the Host for devices that are unable to store a + * IEEE assigned public address in NV memory. + * + * input parameters + * + * @param devAddr - Pointer to a random address (LSO..MSO). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + * + */ +extern llStatus_t LL_SetRandomAddress( uint8 *devAddr ); + + +/******************************************************************************* + * @fn LL_ClearWhiteList API + * + * @brief This API is called by the HCI to clear the White List. + * + * Note: If Scanning is enabled using filtering, and the white + * list policy is "Any", then this command will be + * disallowed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ClearWhiteList( void ); + + +/******************************************************************************* + * @fn LL_AddWhiteListDevice API + * + * @brief This API is called by the HCI to add a device address and its + * type to the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_FULL + */ +extern llStatus_t LL_AddWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + +/******************************************************************************* + * @fn LL_RemoveWhiteListDevice API + * + * @brief This API is called by the HCI to remove a device address and + * it's type from the White List. + * + * input parameters + * + * @param devAddr - Pointer to a 6 byte device address. + * @param addrType - Public or Random device address. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_WL_TABLE_EMPTY, + * LL_STATUS_ERROR_WL_ENTRY_NOT_FOUND + */ +extern llStatus_t LL_RemoveWhiteListDevice( uint8 *devAddr, + uint8 addrType ); + + +/******************************************************************************* + * @fn LL_ReadWlSize API + * + * @brief This API is called by the HCI to get the total number of white + * list entries that can be stored in the Controller. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEntries - Total number of available White List entries. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadWlSize( uint8 *numEntries ); + + +/******************************************************************************* + * @fn LL_NumEmptyWlEntries API + * + * @brief This API is called by the HCI to get the number of White List + * entries that are empty. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *numEmptyEntries - number of empty entries in the White List. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_NumEmptyWlEntries( uint8 *numEmptyEntries ); + + +/******************************************************************************* + * @fn LL_Encrypt API + * + * @brief This API is called by the HCI to request the LL to encrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * output parameters + * + * @param *encryptedData - A 128 bit block that is encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_Encrypt( uint8 *key, + uint8 *plaintextData, + uint8 *encryptedData ); + + +/******************************************************************************* + * @fn LL_Rand API + * + * @brief This API is called by the HCI to request the LL Controller to + * provide a data block with random content. + * + * Note: If the radio is in use, then this operation has to be + * delayed until the radio finishes. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * @param dataLen - The length of the random data block, from 1-255. + * + * output parameters + * + * @param *randData - Pointer to buffer containing a block of true random + * data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_DUE_TO_LIMITED_RESOURCES, + * LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER, LL_STATUS_ERROR_RNG_FAILURE + */ +extern llStatus_t LL_Rand( uint8 *randData, + uint8 dataLen ); + + +/******************************************************************************* + * @fn LL_ReadSupportedStates API + * + * @brief This function is used to provide the HCI with the Link Layer + * supported states and supported state/role combinations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param *states - Eight byte Bit map of supported states/combos. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadSupportedStates( uint8 *states ); + + +/******************************************************************************* + * @fn LL_ReadLocalSupportedFeatures API + * + * @brief This API is called by the HCI to read the controller's + * Features Set. The Controller indicates which features it + * supports. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature not supported. + * 1: Feature supported by controller. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalSupportedFeatures( uint8 *featureSet ); + + +/******************************************************************************* + * @fn LL_ReadLocalVersionInfo API + * + * @brief This API is called by the HCI to read the controller's + * Version information. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadLocalVersionInfo( uint8 *verNum, + uint16 *comId, + uint16 *subverNum ); + + + +/******************************************************************************* + * @fn LL_CtrlToHostFlowControl API + * + * @brief This function is used to indicate if the LL enable/disable + * receive FIFO processing. This function provides support for + * Controller to Host flow control. + * + * input parameters + * + * @param mode: LL_ENABLE_RX_FLOW_CONTROL, LL_DISABLE_RX_FLOW_CONTROL + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_CtrlToHostFlowControl( uint8 mode ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfo API + * + * @brief This API is called by the HCI to read the peer controller's + * Version Information. If the peer's Version Information has + * already been received by its request for our Version + * Information, then this data is already cached and can be + * directly returned to the Host. If the peer's Version Information + * is not already cached, then it will be requested from the peer, + * and when received, returned to the Host via the + * LL_ReadRemoteVersionInfoCback callback. + * + * Note: Only one Version Indication is allowed for a connection. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_VER_IND_ALREADY_SENT + */ +extern llStatus_t LL_ReadRemoteVersionInfo( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ReadTxPowerLevel + * + * @brief This function is used to read a connection's current transmit + * power level or the maximum transmit power level. + * + * input parameters + * + * @param connId - The LL connection handle. + * @param type - LL_READ_CURRENT_TX_POWER_LEVEL or + * LL_READ_MAX_TX_POWER_LEVEL + * @param *txPower - A signed value from -30..+20, in dBm. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_PARAM_OUT_OF_RANGE, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +llStatus_t LL_ReadTxPowerLevel( uint8 connId, + uint8 type, + int8 *txPower ); + + + + +/******************************************************************************* + * @fn LL_ReadChanMap API + * + * @brief This API is called by the HCI to read the channel map that the + * LL controller is using for the LL connection. + * + * input parameters + * + * @param connId - The LL connection handle. + * + * output parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used" and a 0 means + * the channel is "unused". + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadChanMap( uint8 connId, + uint8 *chanMap ); + + + +/******************************************************************************* + * @fn LL_ReadRssi API + * + * @brief This API is called by the HCI to request RSSI. If there is an + * active connection for the given connection ID, then the RSSI of + * the last received data packet in the LL will be returned. If a + * receiver Modem Test is running, then the RF RSSI for the last + * received data will be returned. If no valid RSSI value is + * available, then LL_RSSI_NOT_AVAILABLE will be returned. + * + * input parameters + * + * @param connId - The LL connection ID on which to read last RSSI. + * + * output parameters + * + * @param *lastRssi - The last data RSSI received. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ReadRssi( uint16 connId, + int8 *lastRssi ); + + + +/******************************************************************************* + * @fn LL_Disconnect API + * + * @brief This API is called by the HCI to terminate a LL connection. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param reason - The reason for the Host connection termination. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE + */ +extern llStatus_t LL_Disconnect( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_TxData API + * + * @brief This API is called by the HCI to transmit a buffer of data on a + * given LL connection. If fragmentation is supported, the HCI must + * also indicate whether this is the first Host packet, or a + * continuation Host packet. When fragmentation is not supported, + * then a start packet should always specified. If the device is in + * a connection as a Master and the current connection ID is the + * connection for this data, or is in a connection as a Slave, then + * the data is written to the TX FIFO (even if the radio is + * curerntly active). If this is a Slave connection, and Fast TX is + * enabled and Slave Latency is being used, then the amount of time + * to the next event is checked. If there's at least a connection + * interval plus some overhead, then the next event is re-aligned + * to the next event boundary. Otherwise, in all cases, the buffer + * pointer will be retained for transmission, and the callback + * event LL_TxDataCompleteCback will be generated to the HCI when + * the buffer pointer is no longer needed by the LL. + * + * Note: If the return status is LL_STATUS_ERROR_OUT_OF_TX_MEM, + * then the HCI must not release the buffer until it receives + * the LL_TxDataCompleteCback callback, which indicates the + * LL has copied the transmit buffer. + * + * Note: The HCI should not call this routine if a buffer is still + * pending from a previous call. This is fatal! + * + * Note: If the connection should be terminated within the LL + * before the Host knows, attempts by the HCI to send more + * data (after receiving a LL_TxDataCompleteCback) will + * fail (LL_STATUS_ERROR_INACTIVE_CONNECTION). + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit. + * @param len - The number of bytes to transmit on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT_HOST_TO_CTRL: + * Indicates buffer is the start of a + * Host-to-Controller packet. + * LL_DATA_CONTINUATION_PKT: + * Indicates buffer is a continuation of a + * Host-to-Controller packet. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_OUT_OF_TX_MEM, + * LL_STATUS_ERROR_UNEXPECTED_PARAMETER + */ +extern llStatus_t LL_TxData( uint16 connId, + uint8 *pBuf, + uint8 len, + uint8 fragFlag ); + + + +/******************************************************************************* + * @fn LL_DirectTestTxTest API + * + * @brief This function is used to initiate a BLE PHY level Transmit Test + * in Direct Test Mode where the DUT generates test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. + * + * Note: The BLE device is to transmit at maximum power. + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency k=0..39, where F=2402+(k*2MHz). + * @param payloadLen - Number of bytes (0..37)in payload for each packet. + * @param payloadType - The type of pattern to transmit. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestTxTest( uint8 txFreq, + uint8 payloadLen, + uint8 payloadType ); + + +/******************************************************************************* + * @fn LL_DirectTestRxTest API + * + * @brief This function is used to initiate a BLE PHY level Receive Test + * in Direct Test Mode where the DUT receives test reference + * packets at fixed intervals. This test will make use of the + * nanoRisc Raw Data Transmit and Receive task. The received + * packets are verified based on the CRC, and metrics are kept. + * + * Note: A LL reset should be issued when done using DTM! + * + * input parameters + * + * @param rxFreq - Rx RF frequency k=0..39, where F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestRxTest( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_DirectTestEnd API + * + * @brief This function is used to end the Direct Test Transmit or Direct + * Test Receive tests executing in Direct Test mode. When the raw + * task is ended, the LL_DirectTestEndDoneCback callback is called. + * If a Direct Test mode operation is not currently active, an + * error is returned. + * + * Note: A LL reset is issued upon completion! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_DirectTestEnd( void ); + + + +/******************************************************************************* + * @fn LL_SetAdvParam API + * + * @brief This API is called by the HCI to set the Advertiser's + * parameters. + * + * input parameters + * @param advIntervalMin - The minimum Adv interval. + * @param advIntervalMax - The maximum Adv interval. + * @param advEvtType - The type of advertisment event. + * @param ownAddrType - The Adv's address type of public or random. + * @param directAddrType - Only used for directed advertising. + * @param *directAddr - Only used for directed advertising (NULL otherwise). + * @param advChanMap - A byte containing 1 bit per advertising + * channel. A bit set to 1 means the channel is + * used. The bit positions define the advertising + * channels as follows: + * Bit 0: 37, Bit 1: 38, Bit 2: 39. + * @param advWlPolicy - The Adv white list filter policy. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_NO_ADV_CHAN_FOUND + */ +extern llStatus_t LL_SetAdvParam( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advEvtType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChanMap, + uint8 advWlPolicy ); + + + + +/******************************************************************************* + * @fn LL_SetAdvData API + * + * @brief This API is called by the HCI to set the Advertiser's data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * Note: If the data happens to be changed while advertising, then + * the new data will be sent on the next advertising event. + * + * input parameters + * + * @param advDataLen - The number of scan response bytes: 0..31. + * @param advData - Pointer to the advertiser data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetAdvData( uint8 advDataLen, + uint8 *advData ); + + + + +/******************************************************************************* + * @fn LL_SetScanRspData API + * + * @brief This API is called by the HCI to set the Advertiser's Scan + * Response data. + * + * Note: If the Advertiser is restarted without intervening calls + * to this routine to make updates, then the previously + * defined data will be reused. + * + * input parameters + * + * @param scanRspLen - The number of scan response bytes: 0..31. + * @param *scanRspData - Pointer to the scan response data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_SetScanRspData( uint8 scanRspLen, + uint8 *scanRspData ); + + + + +/******************************************************************************* + * @fn LL_SetAdvControl API + * + * @brief This API is called by the HCI to request the Controller to start + * or stop advertising. + * + * input parameters + * + * @param advMode - LL_ADV_MODE_ON or LL_ADV_MODE_OFF. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_PARAMETER, + * LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_SetAdvControl( uint8 advMode ); + + + + +/******************************************************************************* + * @fn LL_ReadAdvChanTxPower + * + * @brief This function is used to read the transmit power level used + * for BLE advertising channel packets. Currently, only two + * settings are possible, a standard setting of 0 dBm, and a + * maximum setting of 4 dBm. + * + * input parameters + * + * @param *txPower - A non-null pointer. + * + * output parameters + * + * @param *txPower - A signed value from -20..+10, in dBm. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_PARAM_OUT_OF_RANGE + */ +extern llStatus_t LL_ReadAdvChanTxPower( int8 *txPower ); + + + +#line 1215 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + +#line 1244 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_EncLtkReply API + * + * @brief This API is called by the HCI to provide the controller with + * the Long Term Key (LTK) for encryption. This command is + * actually a reply to the link layer's LL_EncLtkReqCback, which + * provided the random number and encryption diversifier received + * from the Master during an encryption setup. + * + * Note: The key parameter is byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkReply( uint16 connId, + uint8 *key ); + + + + +/******************************************************************************* + * @fn LL_EncLtkNegReply API + * + * @brief This API is called by the HCI to indicate to the controller + * that the Long Term Key (LTK) for encryption can not be provided. + * This command is actually a reply to the link layer's + * LL_EncLtkReqCback, which provided the random number and + * encryption diversifier received from the Master during an + * encryption setup. How the LL responds to the negative reply + * depends on whether this is part of a start encryption or a + * re-start encryption after a pause. For the former, an + * encryption request rejection is sent to the peer device. For + * the latter, the connection is terminated. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EncLtkNegReply( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_CreateConn API + * + * @brief This API is called by the HCI to create a connection. + * + * input parameters + * + * @param scanInterval - The scan interval. + * @param scanWindow - The scan window. + * @param initWlPolicy - Filter Adv address directly or using WL. + * @param peerAddrType - Peer address is Public or Random. + * @param *peerAddr - The Adv address, or NULL for WL policy. + * @param ownAddrType - This device's address is Public or Random. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_CreateConn( uint16 scanInterval, + uint16 scanWindow, + uint8 initWlPolicy, + uint8 peerAddrType, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_CreateConnCancel API + * + * @brief This API is called by the HCI to cancel a previously given LL + * connection creation command that is still pending. This command + * should only be used after the LL_CreateConn command as been + * issued, but before the LL_ConnComplete callback. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_CreateConnCancel( void ); + + + + +/******************************************************************************* + * @fn LL_ConnActive + * + * @brief This API is called by the HCI to check if a connection + * given by the connection handle is active. + * + * input parameters + * + * @param connId - Connection handle. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_ConnActive( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_ConnUpdate API + * + * @brief This API is called by the HCI to update the connection + * parameters by initiating a connection update control procedure. + * + * input parameters + * + * @param connId - The connection ID on which to send this data. + * @param connIntervalMin - Defines minimum connection interval value. + * @param connIntervalMax - Defines maximum connection interval value. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param minLength - Info parameter about min length of connection. + * @param maxLength - Info parameter about max length of connection. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_INACTIVE_CONNECTION + * LL_STATUS_ERROR_CTRL_PROC_ALREADY_ACTIVE, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ConnUpdate( uint16 connId, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLength, + uint16 maxLength ); + + + + +/******************************************************************************* + * @fn LL_ChanMapUpdate API + * + * @brief This API is called by the HCI to update the Host data channels + * initiating an Update Data Channel control procedure. + * + * Note: While it isn't specified, it is assumed that the Host + * expects an update channel map on all active connections. + * + * Note: This LL currently only supports one connection. + * + * input parameters + * + * @param chanMap - A five byte array containing one bit per data channel + * where a 1 means the channel is "used". + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_ILLEGAL_PARAM_COMBINATION + */ +extern llStatus_t LL_ChanMapUpdate( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn LL_StartEncrypt API + * + * @brief This API is called by the Master HCI to setup encryption and to + * update encryption keys in the LL connection. If the connection + * is already in encryption mode, then this command will first + * pause the encryption before subsequently running the encryption + * setup. + * + * Note: The parameters are byte ordered LSO to MSO. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *rand - Random vector used in device identification. + * @param *eDiv - Encrypted diversifier. + * @param *key - A 128 bit key to be used to calculate the session key. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_FEATURE_NOT_SUPPORTED + */ +extern llStatus_t LL_StartEncrypt( uint16 connId, + uint8 *rand, + uint8 *eDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeatures API + * + * @brief This API is called by the Master HCI to initiate a feature + * setup control process. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_ReadRemoteUsedFeatures( uint16 connId ); + + + +/* +** Vendor Specific Command API +*/ + +/******************************************************************************* + * @fn LL_EXT_SetRxGain Vendor Specific API + * + * @brief This function is used to to set the RF RX gain. + * + * input parameters + * + * @param rxGain - LL_EXT_RX_GAIN_STD, LL_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetRxGain( uint8 rxGain, + uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPower Vendor Specific API + * + * @brief This function is used to to set the RF TX power. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetTxPower( uint8 txPower, + uint8 *cmdComplete ); + + + +/******************************************************************************* + * @fn LL_EXT_OnePacketPerEvent Vendor Specific API + * + * @brief This function is used to enable or disable allowing only one + * packet per event. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_ONE_PKT_PER_EVT, + * LL_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_OnePacketPerEvent( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ClkDivOnHalt Vendor Specific API + * + * @brief This function is used to enable or disable dividing down the + * system clock while halted. + * + * Note: This command is disallowed if haltDuringRf is not defined. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * LL_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_ClkDivOnHalt( uint8 control ); + + +/******************************************************************************* + * @fn LL_EXT_DeclareNvUsage Vendor Specific API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_DeclareNvUsage( uint8 mode ); + + +/******************************************************************************* + * @fn LL_EXT_Decrypt API + * + * @brief This API is called by the HCI to request the LL to decrypt the + * data in the command using the key given in the command. + * + * Note: The parameters are byte ordered MSO to LSO. + * + * input parameters + * + * @param *key - A 128 bit key to be used to calculate the + * session key. + * @param *encryptedData - A 128 bit block that is encrypted. + * + * output parameters + * + * @param *plaintextData - A 128 bit block that is to be encrypted. + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_Decrypt( uint8 *key, + uint8 *encryptedData, + uint8 *plaintextData ); + + +/******************************************************************************* + * @fn LL_EXT_SetLocalSupportedFeatures API + * + * @brief This API is called by the HCI to indicate to the Controller + * which features can or can not be used. + * + * Note: Not all features indicated by the Host to the Controller + * are valid. If invalid, they shall be ignored. + * + * input parameters + * + * @param featureSet - A pointer to the Feature Set where each bit: + * 0: Feature shall not be used. + * 1: Feature can be used. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_SetLocalSupportedFeatures( uint8 *featureSet ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFastTxResponseTime API + * + * @brief This API is used to enable or disable the fast TX response + * time feature. This can be helpful when a short connection + * interval is used in combination with slave latency. In such + * a scenario, the response time for sending the TX data packet + * can effectively shorten or eliminate slave latency, thereby + * increasing power consumption. By disabling, this feature + * trades fast response time for less power consumption. + * + * input parameters + * + * @param control - LL_EXT_ENABLE_FAST_TX_RESP_TIME, + * LL_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFastTxResponseTime( uint8 control ); + + + + +/******************************************************************************* + * @fn LL_EXT_SetSlaveLatencyOverride API + * + * @brief This API is used to enable or disable the suspention of slave + * latency. This can be helpful when the Slave application knows + * it will soon receive something that needs to be handled without + * delay. + * + * input parameters + * + * @param control - LL_EXT_DISABLE_SL_OVERRIDE, + * LL_EXT_ENABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetSlaveLatencyOverride( uint8 control ); + + + +/******************************************************************************* + * @fn LL_EXT_ModemTestTx + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * LL_EXT_EndModemTest command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param cwMode - LL_EXT_TX_MODULATED_CARRIER, + * LL_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestTx( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn LL_EXT_ModemHopTestTx + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use LL_EXT_EndModemTest + * command to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemHopTestTx( void ); + + +/******************************************************************************* + * @fn LL_EXT_ModemTestRx + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * LL_EXT_SetRxGain command. RSSI may be read during this test by + * using the LL_ReadRssi command. Use LL_EXT_EndModemTest command + * to end the test. + * + * Note: A LL reset will be issued by LL_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_ModemTestRx( uint8 rxFreq ); + + +/******************************************************************************* + * @fn LL_EXT_EndModemTest + * + * @brief This API is used to shutdown a modem test. A complete link + * layer reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_UNEXPECTED_STATE_ROLE + */ +extern llStatus_t LL_EXT_EndModemTest( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetBDADDR + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetBDADDR( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn LL_EXT_SetSCA + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - This device's SCA in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SetSCA( uint16 scaInPPM ); + + + +/******************************************************************************* + * @fn LL_EXT_SetFreqTune + * + * @brief This API is used to set the Frequncy Tuning up or down. If the + * current setting is already at the max/min value, then no + * update is performed. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - LL_EXT_SET_FREQ_TUNE_UP or LL_EXT_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetFreqTune( uint8 step ); + + +/******************************************************************************* + * @fn LL_EXT_SaveFreqTune + * + * @brief This API is used to save the current Frequency Tuning value to + * flash memory. It is restored on reboot or wake from sleep. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_SaveFreqTune( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetMaxDtmTxPower Vendor Specific API + * + * @brief This function is used to set the max RF TX power to be used + * when using Direct Test Mode. + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_SetMaxDtmTxPower( uint8 txPower ); + + +/******************************************************************************* + * @fn LL_EXT_MapPmIoPort Vendor Specific API + * + * @brief This function is used to configure and map a CC254x I/O Port as + * a General Purpose I/O (GPIO) output signal that reflects the + * Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying LL_EXT_PM_IO_PORT_NONE for + * the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - LL_EXT_PM_IO_PORT_P0, + * LL_EXT_PM_IO_PORT_P1, + * LL_EXT_PM_IO_PORT_P2, + * LL_EXT_PM_IO_PORT_NONE + * + * @param ioPin - LL_EXT_PM_IO_PORT_PIN0, + * LL_EXT_PM_IO_PORT_PIN1, + * LL_EXT_PM_IO_PORT_PIN2, + * LL_EXT_PM_IO_PORT_PIN3, + * LL_EXT_PM_IO_PORT_PIN4, + * LL_EXT_PM_IO_PORT_PIN5, + * LL_EXT_PM_IO_PORT_PIN6, + * LL_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER, + * LL_STATUS_ERROR_COMMAND_DISALLOWED + */ +extern llStatus_t LL_EXT_MapPmIoPort( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn LL_EXT_DisconnectImmed Vendor Specific API + * + * @brief This function is used to disconnect the connection immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_DisconnectImmed( uint16 connId ); + + + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. When Reset, the counters are cleared; + * when Read, the total number of packets received, the number of + * packets received with a CRC error, the number of events, and the + * number of missed events are returned via a callback. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param command - LL_EXT_PER_RESET, LL_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PacketErrorRate( uint16 connId, uint8 command ); + + + + +/******************************************************************************* + * @fn LL_EXT_PERbyChan Vendor Specific API + * + * @brief This API is called by the HCI to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern llStatus_t LL_EXT_PERbyChan( uint16 connId, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRange Vendor Specific API + * + * @brief This function is used to Extend Rf Range using the TI CC2590 + * 2.4 GHz RF Front End device. + * + * input parameters + * + * @param cmdComplete - Pointer to get indicatin if command is done. + * + * output parameters + * + * @param cmdComplete - Boolean to indicate the command is still pending. + * + * @return LL_STATUS_SUCCESS + */ +extern llStatus_t LL_EXT_ExtendRfRange( uint8 *cmdComplete ); + + +/******************************************************************************* + * @fn LL_EXT_HaltDuringRf Vendor Specfic API + * + * @brief This function is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * input parameters + * + * @param mode - LL_EXT_HALT_DURING_RF_ENABLE, + * LL_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_COMMAND_DISALLOWED, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_HaltDuringRf( uint8 mode ); + + + +/******************************************************************************* + * @fn LL_EXT_AdvEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a Adv + * event ends. A non-zero taskEvent value is taken to be "enable", + * while a zero valued taskEvent is taken to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_AdvEventNotice( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn LL_EXT_ConnEventNotice Vendor Specific API + * + * @brief This API is called to enable or disable a notification to the + * specified task using the specified task event whenever a + * Connection event ends. A non-zero taskEvent value is taken to + * be "enable", while a zero valued taskEvent is taken to be + * "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION, + * LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_ConnEventNotice( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn LL_EXT_BuildRevision Vendor Specific API + * + * @brief This API is used to to set a user revision number or read the + * build revision number. + * + * input parameters + * + * @param mode - LL_EXT_SET_USER_REVISION | + * LL_EXT_READ_BUILD_REVISION + * @param userRevNum - A 16 bit value the user can set as their own + * revision number + * + * output parameters + * + * @param buildRev - Pointer to returned build revision, if any. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_BAD_PARAMETER + */ +extern llStatus_t LL_EXT_BuildRevision( uint8 mode, uint16 userRevNum, uint8 *buildRev ); + + +/* +** LL Callbacks to HCI +*/ + + +/******************************************************************************* + * @fn LL_ConnectionCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * a new connection has been created. For the Slave, this means + * a CONNECT_REQ message was received from an Initiator. For the + * Master, this means a CONNECT_REQ message was sent in response + * to a directed or undirected message addressed to the Initiator. + * + * input parameters + * + * @param reasonCode - LL_STATUS_SUCCESS or ? + * @param connId - The LL connection ID for new connection. + * @param role - LL_LINK_CONNECT_COMPLETE_MASTER or + * LL_LINK_CONNECT_COMPLETE_SLAVE. + * @param peerAddrType - Peer address type (public or random). + * @param peerAddr - Peer address. + * @param connInterval - Connection interval. + * @param slaveLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * @param clockAccuracy - The sleep clock accurracy of the Master. Only + * valid on the Slave. Set to 0x00 for the Master. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnectionCompleteCback( uint8 reasonCode, + uint16 connId, + uint8 role, + uint8 peerAddrType, + uint8 *peerAddr, + uint16 connInterval, + uint16 slaveLatency, + uint16 connTimeout, + uint8 clockAccuracy ); + + + + +/******************************************************************************* + * @fn LL_DisconnectCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the connection has been terminated. The cause is given by the + * reason code. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param reason - The reason the connection was terminated. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_DisconnectCback( uint16 connId, + uint8 reason ); + + + + +/******************************************************************************* + * @fn LL_ConnParamUpdateCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the update parameters control procedure has completed. It is + * always made to the Master's Host when the update request has + * been sent. It is only made to the Slave's Host when the update + * results in a change to the connection interval, and/or the + * connection latency, and/or the connection timeout. + * + * input parameters + * + * @param connId - The LL connection ID. + * @param connInterval - Connection interval. + * @param connLatency - The connection's Slave Latency. + * @param connTimeout - The connection's Supervision Timeout. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ConnParamUpdateCback( uint16 connId, + uint16 connInterval, + uint16 connLatency, + uint16 connTimeout ); + + + + +/******************************************************************************* + * @fn LL_ReadRemoteVersionInfoCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host the + * requested peer's Version information. + * + * input parameters + * + * @param status - Status of callback. + * @param connId - The LL connection ID. + * @param verNum - Version of the Bluetooth Controller specification. + * @param comId - Company identifier of the manufacturer of the + * Bluetooth Controller. + * @param subverNum - A unique value for each implementation or revision + * of an implementation of the Bluetooth Controller. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteVersionInfoCback( uint8 status, + uint16 connId, + uint8 verNum, + uint16 comId, + uint16 subverNum ); + + + + +/******************************************************************************* + * @fn LL_EncChangeCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is not + * already enabled. + * + * Note: If the key request was rejected, then encryption will + * remain off. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED or LL_ENC_KEY_REQ_REJECTED. + * @param encEnab - LL_ENCRYPTION_OFF or LL_ENCRYPTION_ON. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncChangeCback( uint16 connId, + uint8 reason, + uint8 encEnab ); + + + + +/******************************************************************************* + * @fn LL_EncKeyRefreshCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * an encryption key change has taken place. This results when + * the host performs a LL_StartEncrypt when encryption is already + * enabled. + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param reason - LL_ENC_KEY_REQ_ACCEPTED. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncKeyRefreshCback( uint16 connId, + uint8 reason ); + + + +#line 2416 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\controller\\include\\ll.h" + + + +/******************************************************************************* + * @fn LL_ReadRemoteUsedFeaturesCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the Host that + * the Read Remote Feature Support command as completed. + * + * input parameters + * + * @param status - SUCCESS or control procedure timeout. + * @param connId - The LL connection ID for new connection. + * @param featureSet - A pointer to the Feature Set. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_ReadRemoteUsedFeaturesCompleteCback( uint8 status, + uint16 connId, + uint8 *featureSet ); + + + + +/******************************************************************************* + * @fn LL_EncLtkReqCback Callback + * + * @brief This Callback is used by the LL to provide to the Host the + * Master's random number and encryption diversifier, and to + * request the Host's Long Term Key (LTK). + * + * input parameters + * + * @param connId - The LL connection ID for new connection. + * @param randNum - Random vector used in device identification. + * @param encDiv - Encrypted diversifier. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EncLtkReqCback( uint16 connId, + uint8 *randNum, + uint8 *encDiv ); + + + +/******************************************************************************* + * @fn LL_DirectTestEndDone Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Direct Test End command has completed. + * + * + * input parameters + * + * @param numPackets - The number of packets received. Zero for transmit. + * @param mode - LL_DIRECT_TEST_MODE_TX or LL_DIRECT_TEST_MODE_RX. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS + */ +extern void LL_DirectTestEndDoneCback( uint16 numPackets, + uint8 mode ); + + + +/******************************************************************************* + * @fn LL_TxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * the HCI's buffer is free for its own use again. + * + * input parameters + * + * @param connId - The LL connection ID on which to send this data. + * @param *pBuf - A pointer to the data buffer to transmit, or NULL. + * + * output parameters + * + * @param None. + * + * @return None. + ******************************************************************************/ +extern void LL_TxDataCompleteCback( uint16 connId, + uint8 *pBuf ); + + + + +/******************************************************************************* + * @fn LL_RxReqDataBufCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that a + * receive data buffer of a given size is needed. + * + * input parameters + * + * @param size - Number of bytes in the payload. + * + * output parameters + * + * @param None. + * + * @return Pointer to allocated buffer, or NULL. + */ +extern uint8 *LL_RxReqDataBufCback( uint8 size ); + + + + +/******************************************************************************* + * @fn LL_RxDataCompleteCback Callback + * + * @brief This Callback is used by the LL to indicate to the HCI that + * data has been received and placed in the buffer provided by + * the HCI. + * + * input parameters + * + * @param connId - The LL connection ID on which data was received. + * @param *pBuf - A pointer to the receive data buffer provided by + * the HCI. + * @param len - The number of bytes received on this connection. + * @param fragFlag - LL_DATA_FIRST_PKT indicates buffer is the start of + * a Host packet. + * LL_DATA_CONTINUATION_PKT: Indicates buffer is a + * continuation of a Host packet. + * @param rssi - The RSSI of this received packet as a signed byte. + * Range: -127dBm..+20dBm, 127=Not Available. + * + * output parameters + * + * @param **pBuf - A double pointer updated to the next receive data + * buffer, or NULL if no next buffer is available. + * + * @return None. + */ +extern void LL_RxDataCompleteCback( uint16 connId, + uint8 *ppBuf, + uint8 len, + uint8 fragFlag, + int8 rssi ); + + + +/******************************************************************************* + * @fn LL_RandCback API + * + * @brief This Callback is used by the LL to notify the HCI that the true + * random number command has been completed. + * + * Note: The length is always given by B_RANDOM_NUM_SIZE. + * + * input parameters + * + * @param *randData - Pointer to buffer to place a random block of data. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_RandCback( uint8 *randData ); + + +/******************************************************************************* + * @fn LL_EXT_SetRxGainCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * RX gain command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetRxGainCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_SetTxPowerCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the set + * TX power command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_SetTxPowerCback( void ); + + +/******************************************************************************* + * @fn LL_EXT_PacketErrorRateCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Packet Error Rate Read command has been completed. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param numPkts - Number of Packets received. + * @param numCrcErr - Number of Packets received with a CRC error. + * @param numEvents - Number of Connection Events. + * @param numPkts - Number of Missed Connection Events. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_PacketErrorRateCback( uint16 numPkts, + uint16 numCrcErr, + uint16 numEvents, + uint16 numMissedEvts ); + + +/******************************************************************************* + * @fn LL_EXT_ExtendRfRangeCback Callback + * + * @brief This Callback is used by the LL to notify the HCI that the + * Extend Rf Range command has been completed. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void LL_EXT_ExtendRfRangeCback( void ); + + + + + + + + +#line 58 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" +/************************************************************************************************** + Filename: hal_assert.h + Revised: $Date: 2009-02-16 18:03:22 -0800 (Mon, 16 Feb 2009) $ + Revision: $Revision: 19172 $ + + Description: Describe the purpose and contents of the file. + + + Copyright 2006-2007 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/* ------------------------------------------------------------------------------------------------ + * Macros + * ------------------------------------------------------------------------------------------------ + */ + +/* + * HAL_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert + * handler is called. From here, the call stack feature of the debugger can pinpoint where + * the problem occurred. + * + * HAL_ASSERT_FORCED( ) - If asserts are in use, immediately calls the assert handler. + * + * HAL_ASSERT_STATEMENT( statement ) - Inserts the given C statement but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * HAL_ASSERT_DECLARATION( declaration ) - Inserts the given C declaration but only when asserts + * are in use. This macros allows debug code that is not part of an expression. + * + * Asserts can be disabled for optimum performance and minimum code size (ideal for + * finalized, debugged production code). To disable, define the preprocessor + * symbol HALNODEBUG at the project level. + */ + + +#line 78 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\hal\\include\\hal_assert.h" + + +/* + * This macro compares the size of the first parameter to the integer value + * of the second parameter. If they do not match, a compile time error for + * negative array size occurs (even gnu chokes on negative array size). + * + * This compare is done by creating a typedef for an array. No variables are + * created and no memory is consumed with this check. The created type is + * used for checking only and is not for use by any other code. The value + * of 10 in this macro is arbitrary, it just needs to be a value larger + * than one to result in a positive number for the array size. + */ + + + +/* ------------------------------------------------------------------------------------------------ + * Prototypes + * ------------------------------------------------------------------------------------------------ + */ +void halAssertHandler(void); + + +/************************************************************************************************** + */ + +/************************************************************************************************** + * FUNCTIONS - API + **************************************************************************************************/ + + +extern void halAssertHazardLights(void); +#line 59 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +/* +** HCI Command API Parameters +*/ + +// Send Data Packet Boundary Flags + + + + +// Receive Data Packet + + +// Disconnect Reasons +#line 158 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Tx Power Types + + + +// Host Flow Control + + + + + +// Device Address Type + + + +// Advertiser Events + + + + + +// Advertiser Channels + + + + + +// Advertiser White List Policy + + + + + +// Advertiser Commands + + + +// Scan Types + + + +// Scan White List Policy + + + +// Scan Filtering + + + +// Scan Commands + + + +// Initiator White List Policy + + + +// Encryption Related + + + +// Direct Test Mode + + +// +#line 231 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + +// Vendor Specific + + +// + + + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + +// + + + + +// +#line 275 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" +// + + +// + + +// + + + +/* +** HCI Event Parameters +*/ + +// HCI Link Type for Buffer Overflow + + + +/******************************************************************************* + * TYPEDEFS + */ + +typedef uint8 hciStatus_t; + +/* +** LE Events +*/ + +// LE Connection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 role; + uint8 peerAddrType; + uint8 peerAddr[6]; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; + uint8 clockAccuracy; +} hciEvt_BLEConnComplete_t; + +// LE Advertising Report Event +typedef struct +{ + uint8 eventType; // advertisment or scan response event type + uint8 addrType; // public or random address type + uint8 addr[6]; // device address + uint8 dataLen; // length of report data + uint8 rspData[31]; // report data given by dataLen + int8 rssi; // report RSSI +} hciEvt_DevInfo_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 numDevices; + hciEvt_DevInfo_t* devInfo; // pointer to the array of devInfo +} hciEvt_BLEAdvPktReport_t; + +// LE Connection Update Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint16 connInterval; + uint16 connLatency; + uint16 connTimeout; +} hciEvt_BLEConnUpdateComplete_t; + +// LE Read Remote Used Features Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint8 status; + uint16 connectionHandle; + uint8 features[8]; +} hciEvt_BLEReadRemoteFeatureComplete_t; + +// LE Encryption Change Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 reason; + uint8 encEnable; +} hciEvt_EncryptChange_t; + +// LE Long Term Key Requested Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 BLEEventCode; + uint16 connHandle; + uint8 random[8]; + uint16 encryptedDiversifier; +} hciEvt_BLELTKReq_t; + +// Number of Completed Packets Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHandles; + uint16 *pConnectionHandle; // pointer to the connection handle array + uint16 *pNumCompletedPackets; // pointer to the number of completed packets array +} hciEvt_NumCompletedPkt_t; + +// Command Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 numHciCmdPkt; // number of HCI Command Packet + uint16 cmdOpcode; + uint8 *pReturnParam; // pointer to the return parameter +} hciEvt_CmdComplete_t; + +// Command Status Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 cmdStatus; + uint8 numHciCmdPkt; + uint16 cmdOpcode; +} hciEvt_CommandStatus_t; + +// Hardware Error Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 hardwareCode; +} hciEvt_HardwareError_t; + +// Disconnection Complete Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 status; + uint16 connHandle; // connection handle + uint8 reason; +} hciEvt_DisconnComplete_t; + +// Data Buffer Overflow Event +typedef struct +{ + osal_event_hdr_t hdr; + uint8 linkType; // synchronous or asynchronous buffer overflow +} hciEvt_BufferOverflow_t; + +// Data structure for HCI Command Complete Event Return Parameter +typedef struct +{ + uint8 status; + uint16 dataPktLen; + uint8 numDataPkts; +} hciRetParam_LeReadBufSize_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 *pData; +} hciPacket_t; + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 pktType; + uint16 connHandle; + uint8 pbFlag; + uint16 pktLen; + uint8 *pData; +} hciDataPacket_t; + +// OSAL HCI_DATA_EVENT message format. This message is used to forward incoming +// data messages up to an application +typedef struct +{ + osal_event_hdr_t hdr; // OSAL event header + uint16 connHandle; // connection handle + uint8 pbFlag; // data packet boundary flag + uint16 len; // length of data packet + uint8 *pData; // data packet given by len +} hciDataEvent_t; + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/* +** HCI Support Functions +*/ + +/******************************************************************************* + * @fn HCI_bm_alloc API + * + * @brief This API is used to allocate memory using buffer management. + * + * Note: This function should never be called by the application. + * It is only used by HCI and L2CAP_bm_alloc. + * + * input parameters + * + * @param size - Number of bytes to allocate from the heap. + * + * output parameters + * + * @param None. + * + * @return Pointer to buffer, or NULL. + */ +extern void *HCI_bm_alloc( uint16 size ); + + +/******************************************************************************* + * @fn HCI_ValidConnTimeParams API + * + * @brief This API is used to check that the connection time parameter + * ranges are valid, and that the connection time parameter + * combination is valid. + * + * Note: Only connIntervalMax is used as part of the time parameter + * combination check. + * + * input parameters + * + * @param connIntervalMin - Minimum connection interval. + * @param connIntervalMax - Maximum connection interval. + * @param connLatency - Connection slave latency. + * @param connTimeout - Connection supervision timeout. + * + * output parameters + * + * @param None. + * + * @return TRUE: Connection time parameter check is valid. + * FALSE: Connection time parameter check is invalid. + */ +extern uint8 HCI_ValidConnTimeParams( uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout ); + + +/******************************************************************************* + * @fn HCI_TestAppTaskRegister + * + * @brief HCI vendor specific registration for HCI Test Application. + * + * input parameters + * + * @param taskID - The HCI Test Application OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_TestAppTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_GAPTaskRegister + * + * @brief HCI vendor specific registration for Host GAP. + * + * input parameters + * + * @param taskID - The Host GAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_GAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * + * @fn HCI_L2CAPTaskRegister + * + * @brief HCI vendor specific registration for Host L2CAP. + * + * input parameters + * + * @param taskID - The Host L2CAP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + * + */ +extern void HCI_L2CAPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_SMPTaskRegister + * + * @brief HCI vendor specific registration for Host SMP. + * + * input parameters + * + * @param taskID - The Host SMP OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_SMPTaskRegister( uint8 taskID ); + + +/******************************************************************************* + * @fn HCI_ExtTaskRegister + * + * @brief HCI vendor specific registration for Host extended commands. + * + * input parameters + * + * @param taskID - The Host Extended Command OSAL task identifer. + * + * output parameters + * + * @param None. + * + * @return None. + */ +extern void HCI_ExtTaskRegister( uint8 taskID ); + + + +/******************************************************************************* + * @fn HCI_SendDataPkt API + * + * @brief This API is used to send a ACL data packet over a connection. + * + * Note: Empty packets are not sent. + * + * Related Events: HCI_NumOfCompletedPacketsEvent + * + * input parameters + * + * @param connHandle - Connection ID (handle). + * @param pbFlag - Packet Boundary Flag. + * @param pktLen - Number of bytes of data to transmit. + * @param *pData - Pointer to data buffer to transmit. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS, HCI_ERROR_CODE_MEM_CAP_EXCEEDED, + * HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS, + * HCI_ERROR_CODE_UNKNOWN_CONN_ID + */ +extern hciStatus_t HCI_SendDataPkt( uint16 connHandle, + uint8 pbFlag, + uint16 pktLen, + uint8 *pData ); + + + +/* +** HCI API +*/ + + +/******************************************************************************* + * @fn HCI_DisconnectCmd API + * + * @brief This BT API is used to terminate a connection. + * + * Related Events: HCI_CommandStatusEvent, + * DisconnectEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param reason - Reason for disconnection: + * HCI_DISCONNECT_AUTH_FAILURE, + * HCI_DISCONNECT_REMOTE_USER_TERM, + * HCI_DISCONNECT_REMOTE_DEV_POWER_OFF, + * HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE, + * HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED + * HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_DisconnectCmd( uint16 connHandle, + uint8 reason ); + + + + +/******************************************************************************* + * @fn HCI_ReadRemoteVersionInfoCmd API + * + * @brief This BT API is used to request version information from the + * the remote device in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteVersionInfoEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRemoteVersionInfoCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_SetEventMaskCmd API + * + * @brief This BT API is used to set the HCI event mask, which is used to + * determine which events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pMask - Pointer to an eight byte event mask. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetEventMaskCmd( uint8 *pMask ); + + +/******************************************************************************* + * @fn HCI_Reset API + * + * @brief This BT API is used to reset the Link Layer. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ResetCmd( void ); + + + +/******************************************************************************* + * @fn HCI_ReadTransmitPowerLevelCmd API + * + * @brief This BT API is used to read the transmit power level. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param txPwrType - HCI_READ_CURRENT_TX_POWER_LEVEL, + * HCI_READ_MAXIMUM_TX_POWER_LEVEL + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadTransmitPowerLevelCmd( uint16 connHandle, + uint8 txPwrType ); + + + + +/******************************************************************************* + * @fn HCI_SetControllerToHostFlowCtrlCmd API + * + * @brief This BT API is used by the Host to turn flow control on or off + * for data sent from the Controller to Host. + * + * Note: This command is currently not supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param flowControlEnable - HCI_CTRL_TO_HOST_FLOW_CTRL_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_OFF, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_OFF_SYNCH_ON, + * HCI_CTRL_TO_HOST_FLOW_CTRL_ACL_ON_SYNCH_ON + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_SetControllerToHostFlowCtrlCmd( uint8 flowControlEnable ); + + + + +/******************************************************************************* + * @fn HCI_HostBufferSizeCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * maximum size ACL buffer size the Controller can send to the + * Host. + * + * Note: This command is currently ignored by the Controller. It + * is assumed that the Host can always handle the maximum + * BLE data packet size. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param hostAclPktLen - Host ACL data packet length. + * @param hostSyncPktLen - Host SCO data packet length . + * @param hostTotalNumAclPkts - Host total number of ACL data packets. + * @param hostTotalNumSyncPkts - Host total number of SCO data packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostBufferSizeCmd( uint16 hostAclPktLen, + uint8 hostSyncPktLen, + uint16 hostTotalNumAclPkts, + uint16 hostTotalNumSyncPkts ); + + + + +/******************************************************************************* + * @fn HCI_HostNumCompletedPktCmd API + * + * @brief This BT API is used by the Host to notify the Controller of the + * number of HCI data packets that have been completed for each + * connection handle since this command was previously sent to the + * controller. + * + * The Host_Number_Of_Conpleted_Packets command is a special + * command. No event is normally generated after the command + * has completed. The command should only be issued by the + * Host if flow control in the direction from controller to + * the host is on and there is at least one connection, or + * if the controller is in local loopback mode. + * + * Note: The current version of BLE stack does not support + * controller to host flow control. Hence, the command is + * ignored if received. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param numHandles - Number of connection handles. + * @param connHandles - Array of connection handles. + * @param numCompletedPkts - Array of number of completed packets. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_HostNumCompletedPktCmd( uint8 numHandles, + uint16 *connHandles, + uint16 *numCompletedPkts ); + + + +/******************************************************************************* + * @fn HCI_ReadLocalVersionInfoCmd API + * + * @brief This BT API is used to read the local version information. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalVersionInfoCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedCommandsCmd API + * + * @brief This BT API is used to read the locally supported commands. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedCommandsCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadLocalSupportedFeaturesCmd API + * + * @brief This BT API is used to read the locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadBDADDRCmd API + * + * @brief This BT API is used to read this device's BLE address (BDADDR). + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadBDADDRCmd( void ); + + +/******************************************************************************* + * @fn HCI_ReadRssiCmd API + * + * @brief This BT API is used to read the RSSI of the last packet + * received on a connection given by the connection handle. If + * the Receiver Modem test is running (HCI_EXT_ModemTestRx), then + * the RF RSSI for the last received data will be returned. If + * there is no RSSI value, then HCI_RSSI_NOT_AVAILABLE will be + * returned. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_ReadRssiCmd( uint16 connHandle ); + +/* +** HCI Low Energy Commands +*/ + +/******************************************************************************* + * @fn HCI_LE_SetEventMaskCmd API + * + * @brief This LE API is used to set the HCI LE event mask, which is used + * to determine which LE events are supported. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pEventMask - Pointer to LE event mask of 8 bytes. + + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetEventMaskCmd( uint8 *pEventMask ); + + +/******************************************************************************* + * @fn HCI_LE_ReadBufSizeCmd API + * + * @brief This LE API is used by the Host to determine the maximum ACL + * data packet size allowed by the Controller. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadBufSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReadLocalSupportedFeaturesCmd API + * + * @brief This LE API is used to read the LE locally supported features. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadLocalSupportedFeaturesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_SetRandomAddressCmd API + * + * @brief This LE API is used to set this device's Random address. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param pRandAddr - Pointer to random address. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetRandomAddressCmd( uint8 *pRandAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvParamCmd API + * + * @brief This LE API is used to set the Advertising parameters. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advIntervalMin - Minimum allowed advertising interval. + * @param advIntervalMax - Maximum allowed advertising interval. + * @param advType - HCI_CONNECTABLE_UNDIRECTED_ADV, + * HCI_CONNECTABLE_DIRECTED_ADV, + * HCI_SCANNABLE_UNDIRECTED, + * HCI_NONCONNECTABLE_UNDIRECTED_ADV + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param directAddr - Pointer to address of device when using + * directed advertising. + * @param advChannelMap - HCI_ADV_CHAN_37, + * HCI_ADV_CHAN_38 + * HCI_ADV_CHAN_39 + * HCI_ADV_CHAN_ALL + * @param advFilterPolicy - HCI_ADV_WL_POLICY_ANY_REQ, + * HCI_ADV_WL_POLICY_WL_SCAN_REQ, + * HCI_ADV_WL_POLICY_WL_CONNECT_REQ, + * HCI_ADV_WL_POLICY_WL_ALL_REQ + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvParamCmd( uint16 advIntervalMin, + uint16 advIntervalMax, + uint8 advType, + uint8 ownAddrType, + uint8 directAddrType, + uint8 *directAddr, + uint8 advChannelMap, + uint8 advFilterPolicy ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvDataCmd API + * + * @brief This LE API is used to set the Advertising data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Advertising data. + * @param pData - Pointer to Advertising data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetScanRspDataCmd API + * + * @brief This LE API is used to set the Advertising Scan Response data. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param dataLen - Length of Scan Response data. + * @param pData - Pointer to Scan Response data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetScanRspDataCmd( uint8 dataLen, + uint8 *pData ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetAdvEnableCmd API + * + * @brief This LE API is used to turn Advertising on or off. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param advEnable - HCI_ENABLE_ADV, HCI_DISABLE_ADV + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetAdvEnableCmd( uint8 advEnable ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadAdvChanTxPowerCmd API + * + * @brief This LE API is used to read transmit power when Advertising. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadAdvChanTxPowerCmd( void ); + + + +#line 1240 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + +#line 1266 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\hci.h" + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCmd API + * + * @brief This LE API is used to create a connection. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionCompleteEvent + * + * input parameters + * + * @param scanInterval - Time between Init scan events. + * @param scanWindow - Time of scan before Init scan event ends. + * Note: When the scanWindow equals the + * scanInterval then scanning is + * continuous. + * @param initFilterPolicy - HCI_INIT_WL_POLICY_USE_PEER_ADDR, + * HCI_INIT_WL_POLICY_USE_WHITE_LIST + * @param addrTypePeer - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param peerAddr - Pointer to peer device's address. + * @param ownAddrType - HCI_PUBLIC_DEVICE_ADDRESS, + * HCI_RANDOM_DEVICE_ADDRESS + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCmd( uint16 scanInterval, + uint16 scanWindow, + uint8 initFilterPolicy, + uint8 addrTypePeer, + uint8 *peerAddr, + uint8 ownAddrType, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_CreateConnCancelCmd API + * + * @brief This LE API is used to cancel a create connection. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_CreateConnCancelCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadWhiteListSizeCmd API + * + * @brief This LE API is used to read the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadWhiteListSizeCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ClearWhiteListCmd API + * + * @brief This LE API is used to clear the white list. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ClearWhiteListCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_AddWhiteListCmd API + * + * @brief This LE API is used to add a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to put in white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_AddWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + +/******************************************************************************* + * @fn HCI_LE_RemoveWhiteListCmd API + * + * @brief This LE API is used to remove a white list entry. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param addrType - HCI_PUBLIC_DEVICE_ADDRESS, HCI_RANDOM_DEVICE_ADDRESS + * @param devAddr - Pointer to address of device to remove from the + * white list. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RemoveWhiteListCmd( uint8 addrType, + uint8 *devAddr ); + + + +/******************************************************************************* + * @fn HCI_LE_ConnUpdateCmd API + * + * @brief This LE API is used to update the connection parameters. + * + * Related Events: HCI_CommandStatusEvent, + * ConnectionUpdateCompleteEvent + * + * input parameters + * + * @param connHandle - Time between Init scan events. + * @param connIntervalMin - Minimum allowed connection interval. + * @param connIntervalMax - Maximum allowed connection interval. + * @param connLatency - Number of skipped events (slave latency). + * @param connTimeout - Connection supervision timeout. + * @param minLen - Info parameter about min length of conn. + * @param maxLen - Info parameter about max length of conn. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle, + uint16 connIntervalMin, + uint16 connIntervalMax, + uint16 connLatency, + uint16 connTimeout, + uint16 minLen, + uint16 maxLen ); + + + + +/******************************************************************************* + * @fn HCI_LE_SetHostChanClassificationCmd API + * + * @brief This LE API is used to update the current data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param chanMap - Pointer to the new channel map. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_SetHostChanClassificationCmd( uint8 *chanMap ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadChannelMapCmd API + * + * @brief This LE API is used to read a connection's data channel map. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadChannelMapCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_LE_ReadRemoteUsedFeaturesCmd API + * + * @brief This LE API is used to read the remote device's used features. + * + * Related Events: HCI_CommandStatusEvent, + * ReadRemoteUsedFeaturesCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadRemoteUsedFeaturesCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_EncryptCmd API + * + * @brief This LE API is used to perform an encryption using AES128. + * + * Note: Input parameters are ordered MSB..LSB. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param plainText - Pointer to 16 byte plaintext data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_EncryptCmd( uint8 *key, + uint8 *plainText ); + + +/******************************************************************************* + * @fn HCI_LE_RandCmd API + * + * @brief This LE API is used to generate a random number. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_RandCmd( void ); + + + +/******************************************************************************* + * @fn HCI_LE_StartEncyptCmd API + * + * @brief This LE API is used to start encryption in a connection. + * + * Related Events: HCI_CommandStatusEvent, + * EncChangeEvent or + * EncKeyRefreshEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param random - Pointer to eight byte Random number. + * @param encDiv - Pointer to two byte Encrypted Diversifier. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_StartEncyptCmd( uint16 connHandle, + uint8 *random, + uint8 *encDiv, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * positive LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connection handle. + * @param ltk - Pointer to 16 byte Long Term Key. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqReplyCmd( uint16 connHandle, + uint8 *ltk ); + + + + +/******************************************************************************* + * @fn HCI_LE_LtkReqNegReplyCmd API + * + * @brief This LE API is used by the Host to send to the Controller a + * negative LTK reply. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param connHandle - Connectin handle. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_LtkReqNegReplyCmd( uint16 connHandle ); + + + +/******************************************************************************* + * @fn HCI_LE_ReadSupportedStatesCmd API + * + * @brief This LE API is used to read the Controller's supported states. + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReadSupportedStatesCmd( void ); + + +/******************************************************************************* + * @fn HCI_LE_ReceiverTestCmd API + * + * @brief This LE API is used to start the receiver Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param rxFreq - Rx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: F=2402+(k*2MHz) + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_ReceiverTestCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_LE_TransmitterTestCmd API + * + * @brief This LE API is used to start the transmit Direct Test Mode test. + * + * Note: The BLE device is to transmit at maximum power! + * + * Note: A HCI reset should be issued when done using DTM! + * + * input parameters + * + * @param txFreq - Tx RF frequency: + * k=0..HCI_DTM_NUMBER_RF_CHANS-1, where: + * F=2402+(k*2MHz) + * @param dataLen - Test data length in bytes: + * 0..HCI_DIRECT_TEST_MAX_PAYLOAD_LEN + * @param payloadType - Type of packet payload, per Direct Test Mode spec: + * HCI_DIRECT_TEST_PAYLOAD_PRBS9, + * HCI_DIRECT_TEST_PAYLOAD_0x0F, + * HCI_DIRECT_TEST_PAYLOAD_0x55, + * HCI_DIRECT_TEST_PAYLOAD_PRBS15, + * HCI_DIRECT_TEST_PAYLOAD_0xFF, + * HCI_DIRECT_TEST_PAYLOAD_0x00, + * HCI_DIRECT_TEST_PAYLOAD_0xF0, + * HCI_DIRECT_TEST_PAYLOAD_0xAA + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TransmitterTestCmd( uint8 txFreq, + uint8 dataLen, + uint8 pktPayload ); + + +/******************************************************************************* + * @fn HCI_LE_TestEndCmd API + * + * @brief This LE API is used to end the Direct Test Mode test. + * + * Note: A HCI reset should be issued when done using DTM! + * + * Related Events: HCI_CommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_LE_TestEndCmd( void ); + +/* +** HCI Vendor Specific Comamnds: Link Layer Extensions +*/ + +/******************************************************************************* + * @fn HCI_EXT_SetRxGainCmd API + * + * @brief This HCI Extension API is used to set the receiver gain. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param rxGain - HCI_EXT_RX_GAIN_STD, HCI_EXT_RX_GAIN_HIGH + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetRxGainCmd( uint8 rxGain ); + + +/******************************************************************************* + * @fn HCI_EXT_SetTxPowerCmd API + * + * @brief This HCI Extension API is used to set the transmit power. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); + + + +/******************************************************************************* + * @fn HCI_EXT_OnePktPerEvtCmd API + * + * @brief This HCI Extension API is used to set whether a connection will + * be limited to one packet per event. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_ONE_PKT_PER_EVT, + * HCI_EXT_DISABLE_ONE_PKT_PER_EVT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_OnePktPerEvtCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ClkDivOnHaltCmd API + * + * @brief This HCI Extension API is used to set whether the system clock + * will be divided when the MCU is halted. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT, + * HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ClkDivOnHaltCmd( uint8 control ); + + +/******************************************************************************* + * @fn HCI_EXT_DeclareNvUsageCmd API + * + * @brief This HCI Extension API is used to indicate to the Controller + * whether or not the Host will be using the NV memory during BLE + * operations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_NV_IN_USE, HCI_EXT_NV_NOT_IN_USE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DeclareNvUsageCmd( uint8 mode ); + + +/******************************************************************************* + * @fn HCI_EXT_DecryptCmd API + * + * @brief This HCI Extension API is used to decrypt encrypted data using + * AES128. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param key - Pointer to 16 byte encryption key. + * @param encText - Pointer to 16 byte encrypted data. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_DecryptCmd( uint8 *key, + uint8 *encText ); + + +/******************************************************************************* + * @fn HCI_EXT_SetLocalSupportedFeaturesCmd API + * + * @brief This HCI Extension API is used to write this devie's supported + * features. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param localFeatures - Pointer to eight bytes of local features. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetLocalSupportedFeaturesCmd( uint8 *localFeatures ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetFastTxResponseTimeCmd API + * + * @brief This HCI Extension API is used to set whether transmit data is + * sent as soon as possible even when slave latency is used. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_FAST_TX_RESP_TIME, + * HCI_EXT_DISABLE_FAST_TX_RESP_TIME + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFastTxResponseTimeCmd( uint8 control ); + + + + +/******************************************************************************* + * @fn HCI_EXT_SetSlaveLatencyOverrideCmd API + * + * @brief This HCI Extension API is used to to enable or disable + * suspending slave latency. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param control - HCI_EXT_ENABLE_SL_OVERRIDE, + * HCI_EXT_DISABLE_SL_OVERRIDE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSlaveLatencyOverrideCmd( uint8 control ); + + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestTxCmd + * + * @brief This API is used start a continuous transmitter modem test, + * using either a modulated or unmodulated carrier wave tone, at + * the frequency that corresponds to the specified RF channel. Use + * HCI_EXT_EndModemTest command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param cwMode - HCI_EXT_TX_MODULATED_CARRIER, + * HCI_EXT_TX_UNMODULATED_CARRIER + * txFreq - Transmit RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestTxCmd( uint8 cwMode, + uint8 txFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemHopTestTxCmd + * + * @brief This API is used to start a continuous transmitter direct test + * mode test using a modulated carrier wave and transmitting a + * 37 byte packet of Pseudo-Random 9-bit data. A packet is + * transmitted on a different frequency (linearly stepping through + * all RF channels 0..39) every 625us. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * Note: This API can be used to verify this device meets Japan's + * TELEC regulations. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemHopTestTxCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_ModemTestRxCmd + * + * @brief This API is used to start a continuous receiver modem test + * using a modulated carrier wave tone, at the frequency that + * corresponds to the specific RF channel. Any received data is + * discarded. Receiver gain may be adjusted using the + * HCI_EXT_SetRxGain command. RSSI may be read during this test + * by using the HCI_ReadRssi command. Use HCI_EXT_EndModemTest + * command to end the test. + * + * Note: A Controller reset will be issued by HCI_EXT_EndModemTest! + * Note: The BLE device will transmit at maximum power. + * + * input parameters + * + * @param rxFreq - Receiver RF channel k=0..39, where BLE F=2402+(k*2MHz). + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ModemTestRxCmd( uint8 rxFreq ); + + +/******************************************************************************* + * @fn HCI_EXT_EndModemTestCmd + * + * @brief This API is used to shutdown a modem test. A complete Controller + * reset will take place. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EndModemTestCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetBDADDRCmd + * + * @brief This API is used to set this device's BLE address (BDADDR). + * + * Note: This command is only allowed when the device's state is + * Standby. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param bdAddr - A pointer to a buffer to hold this device's address. + * An invalid address (i.e. all FF's) will restore this + * device's address to the address set at initialization. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetBDADDRCmd( uint8 *bdAddr ); + + + +/******************************************************************************* + * @fn HCI_EXT_SetSCACmd + * + * @brief This API is used to set this device's Sleep Clock Accuracy. + * + * Note: For a slave device, this value is directly used, but only + * if power management is enabled. For a master device, this + * value is converted into one of eight ordinal values + * representing a SCA range, as specified in Table 2.2, + * Vol. 6, Part B, Section 2.3.3.1 of the Core specification. + * + * Note: This command is only allowed when the device is not in a + * connection. + * + * Note: The device's SCA value remains unaffected by a HCI_Reset. + * + * input parameters + * + * @param scaInPPM - A SCA value in PPM from 0..500. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetSCACmd( uint16 scaInPPM ); + + +/******************************************************************************* + * @fn HCI_EXT_EnablePTMCmd + * + * @brief This HCI Extension API is used to enable Production Test Mode. + * + * Note: This function can only be directly called from the + * application and is not available via an external transport + * interface such as RS232. Also, no vendor specific + * command complete will be returned. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_EnablePTMCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetFreqTuneCmd + * + * @brief This HCI Extension API is used to set the frequency tuning up + * or down. Setting the mode up/down decreases/increases the amount + * of capacitance on the external crystal oscillator. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param step - HCI_PTM_SET_FREQ_TUNE_UP, HCI_PTM_SET_FREQ_TUNE_DOWN + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetFreqTuneCmd( uint8 step ); + + +/******************************************************************************* + * @fn HCI_EXT_SaveFreqTuneCmd + * + * @brief This HCI Extension API is used to save the frequency tuning + * value to flash. + * + * Note: This is a Production Test Mode only command! + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SaveFreqTuneCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_SetMaxDtmTxPowerCmd API + * + * @brief This HCI Extension API is used to set the maximum transmit + * output power for Direct Test Mode. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param txPower - LL_EXT_TX_POWER_MINUS_23_DBM, + * LL_EXT_TX_POWER_MINUS_6_DBM, + * LL_EXT_TX_POWER_0_DBM, + * LL_EXT_TX_POWER_4_DBM + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_SetMaxDtmTxPowerCmd( uint8 txPower ); + + +/******************************************************************************* + * @fn HCI_EXT_MapPmIoPortCmd Vendor Specific API + * + * @brief This HCI Extension API is used to configure and map a CC254x I/O + * Port as a General Purpose I/O (GPIO) output signal that reflects + * the Power Management (PM) state of the CC254x device. The GPIO + * output will be High on Wake, and Low upon entering Sleep. This + * feature can be disabled by specifying HCI_EXT_PM_IO_PORT_NONE + * for the ioPort (ioPin is then ignored). The system default value + * upon hardware reset is disabled. This command can be used to + * control an external DC-DC Converter (its actual intent) such has + * the TI TPS62730 (or any similar converter that works the same + * way). This command should be used with extreme care as it will + * override how the Port/Pin was previously configured! This + * includes the mapping of Port 0 pins to 32kHz clock output, + * Analog I/O, UART, Timers; Port 1 pins to Observables, Digital + * Regulator status, UART, Timers; Port 2 pins to an external 32kHz + * XOSC. The selected Port/Pin will be configured as an output GPIO + * with interrupts masked. Careless use can result in a + * reconfiguration that could disrupt the system. It is therefore + * the user's responsibility to ensure the selected Port/Pin does + * not cause any conflicts in the system. + * + * Note: Only Pins 0, 3 and 4 are valid for Port 2 since Pins 1 + * and 2 are mapped to debugger signals DD and DC. + * + * Note: Port/Pin signal change will only occur when Power Savings + * is enabled. + * + * input parameters + * + * @param ioPort - HCI_EXT_PM_IO_PORT_P0, + * HCI_EXT_PM_IO_PORT_P1, + * HCI_EXT_PM_IO_PORT_P2, + * HCI_EXT_PM_IO_PORT_NONE + * + * @param ioPin - HCI_EXT_PM_IO_PORT_PIN0, + * HCI_EXT_PM_IO_PORT_PIN1, + * HCI_EXT_PM_IO_PORT_PIN2, + * HCI_EXT_PM_IO_PORT_PIN3, + * HCI_EXT_PM_IO_PORT_PIN4, + * HCI_EXT_PM_IO_PORT_PIN5, + * HCI_EXT_PM_IO_PORT_PIN6, + * HCI_EXT_PM_IO_PORT_PIN7 + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern llStatus_t HCI_EXT_MapPmIoPortCmd( uint8 ioPort, uint8 ioPin ); + + + +/******************************************************************************* + * @fn HCI_EXT_DisconnectImmedCmd API + * + * @brief This HCI Extension API is used to disconnect the connection + * immediately. + * + * Note: The connection (if valid) is immediately terminated + * without notifying the remote device. The Host is still + * notified. + * + * input parameters + * + * @param connHandle - Connection handle. + * + * output parameters + * + * @param None. + * + * @return HCI_SUCCESS + */ +extern hciStatus_t HCI_EXT_DisconnectImmedCmd( uint16 connHandle ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PacketErrorRate Vendor Specific API + * + * @brief This function is used to Reset or Read the Packet Error Rate + * counters for a connection. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param command - HCI_EXT_PER_RESET, HCI_EXT_PER_READ + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PacketErrorRateCmd( uint16 connHandle, uint8 command ); + + + + +/******************************************************************************* + * @fn HCI_EXT_PERbyChanCmd Vendor Specific API + * + * @brief This HCI Extension API is used to start or end Packet Error Rate + * by Channel counter accumulation for a connection. If the + * pointer is not NULL, it is assumed there is sufficient memory + * for the PER data, per the type perByChan_t. If NULL, then + * the operation is considered disabled. + * + * Note: It is the user's responsibility to make sure there is + * sufficient memory for the data, and that the counters + * are cleared prior to first use. + * + * Note: The counters are only 16 bits. At the shortest connection + * interval, this provides a bit over 8 minutes of data. + * + * input parameters + * + * @param connHandle - The LL connection ID on which to send this data. + * @param perByChan - Pointer to PER by Channel data, or NULL. + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, LL_STATUS_ERROR_INACTIVE_CONNECTION + */ +extern hciStatus_t HCI_EXT_PERbyChanCmd( uint16 connHandle, perByChan_t *perByChan ); + + + +/******************************************************************************* + * @fn HCI_EXT_ExtendRfRangeCmd API + * + * @brief This HCI Extension API is used to Extend Rf Range using the TI + * CC2590 2.4 GHz RF Front End device. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ExtendRfRangeCmd( void ); + + +/******************************************************************************* + * @fn HCI_EXT_HaltDuringRfCmd API + * + * @brief This HCI Extension API is used to enable or disable halting the + * CPU during RF. The system defaults to enabled. + * + * Related Events: HCI_VendorSpecifcCommandCompleteEvent + * + * input parameters + * + * @param mode - HCI_EXT_HALT_DURING_RF_ENABLE, + * HCI_EXT_HALT_DURING_RF_DISABLE + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_HaltDuringRfCmd( uint8 mode ); + + + +/******************************************************************************* + * @fn HCI_EXT_AdvEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Adv event ends. A non-zero taskEvent value is + * taken to be "enable", while a zero valued taskEvent is taken + * to be "disable". + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_AdvEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + + +/******************************************************************************* + * @fn HCI_EXT_ConnEventNoticeCmd Vendor Specific API + * + * @brief This HCI Extension API is used to enable or disable a + * notification to the specified task using the specified task + * event whenever a Connection event ends. A non-zero taskEvent + * value is taken to be "enable", while a zero valued taskEvent + * taken to be "disable". + * + * Note: Currently, only a Slave connection is supported. + * + * input parameters + * + * @param taskID - User's task ID. + * @param taskEvent - User's task event. + * + * output parameters + * + * @param None. + * + * @return hciStatus_t + */ +extern hciStatus_t HCI_EXT_ConnEventNoticeCmd( uint8 taskID, uint16 taskEvent ); + + + +/******************************************************************************* + * @fn HCI_EXT_BuildRevisionCmd Vendor Specific API + * + * @brief This HCI Extension API is used set a user revision number or + * read the build revision number. + * + * input parameters + * + * @param mode - HCI_EXT_SET_USER_REVISION | HCI_EXT_READ_BUILD_REVISION + * + * output parameters + * + * @param None. + * + * @return LL_STATUS_SUCCESS, HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS + */ +extern hciStatus_t HCI_EXT_BuildRevisionCmd( uint8 mode, uint16 userRevNum ); + + + + + + +#line 29 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" +/************************************************************************************************** + Filename: gapgattserver.h + Revised: $Date: 2009-10-21 07:25:22 -0700 (Wed, 21 Oct 2009) $ + Revision: $Revision: 20946 $ + + Description: This file contains GAP GATT attribute definitions + and prototypes. + + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + + +// Privacy Flag States + + + +// GAP GATT Server Parameters +#line 73 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +// GAP Services bit fields + + +// Attribute ID used with application's callback when attribute value is changed OTA + + + +#line 88 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gapgattserver.h" + +/********************************************************************* + * TYPEDEFS + */ +// Callback to notify when attribute value is changed over the air. +typedef void (*ggsAttrValueChange_t)( uint8 attrId ); + +// GAP GATT Server callback structure +typedef struct +{ + ggsAttrValueChange_t pfnAttrValueChange; // When attribute value is changed OTA +} ggsAppCBs_t; + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @brief Set a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_SetParameter( uint8 param, uint8 len, void *value ); + +/** + * @brief Get a GAP GATT Server parameter. + * + * @param param - Profile parameter ID
+ * @param value - pointer to data to put. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer).
+ * + * @return bStatus_t + */ +extern bStatus_t GGS_GetParameter( uint8 param, void *value ); + +/** + * @brief Add function for the GAP GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GGS_AddService( uint32 services ); + +/** + * @brief Delete function for the GAP GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GGS_DelService( uint32 services ); + +/** + * @brief Registers the application callback function. + * + * Note: Callback registration is needed only when the + * Device Name is made writable. The application + * will be notified when the Device Name is changed + * over the air. + * + * @param appCallbacks - pointer to application callbacks. + * + * @return none + */ +extern void GGS_RegisterAppCBs( ggsAppCBs_t *appCallbacks ); + +/** + * @brief Set a GGS Parameter value. Use this function to change + * the default GGS parameter values. + * + * @param value - new GGS param value + * + * @return void + */ +extern void GGS_SetParamValue( uint16 value ); + +/** + * @brief Get a GGS Parameter value. + * + * @param none + * + * @return GGS Parameter value + */ +extern uint16 GGS_GetParamValue( void ); + +/********************************************************************* + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/********************************************************************* +*********************************************************************/ + + + + + +#line 31 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" +/** + @headerfile: gattservapp.h + $Date: 2009-06-29 16:20:52 -0700 (Mon, 29 Jun 2009) $ + $Revision: 20240 $ + + @mainpage BLE GATT Server Application API + + Description: This file contains the GATT Server Application (GATTServApp) + definitions and prototypes.

+ + \image html HighLevelGATTServApp.PNG + +
+

Functional Description

+

The GATT Server Application (GATTServApp) provides the following abilities:

+
    +
  • Service Registration - This API is used to register a service's + attribute list and callback functions with the GATT Server Application.
  • +
  • Service Deregistration - This API is used to deregister a service's + attribute list and callback functions from the GATT Server Application.
  • +
  • GATT Service Addition - This API is the add function for the GATT + Service. It registers the GATT Service's attribute list and callback + functions with the GATT Server Application.
  • +
  • GATT Service Deletion - This API is the delete function for the + GATT Service. It deregisters the GATT Service's attribute list and + callback functions from the GATT Server Application.
  • +

+ +

Service Attribute List

+

A profile may support one or more services. Each of the services may support + characteristics or references to other services. Each characteristic contains + a value and may contain optional descriptors. The service, characteristic, + characteristic value and descriptors are all stored as attributes on the server. + The service attribute list to be registered with the GATT Server must start + with a Service attribute followed by all the attributes associated with that + Service attribute. +



+ + \image html GATTAttributeList.PNG + +
+

Service Callback Functions

+

The encoding of each attribute value is defined in the applicable profile. + The GATT Server doesn't directly access the attribute value for reading + or writing. It uses the Read and Write callback functions provided by the + registering profile to execute the incoming Attribute Protocol (ATT) Read + and Write request respectively. +







+ + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + + +/********************************************************************* + * CONSTANTS + */ + +/** @defgroup GATT_SERV_MSG_EVENT_DEFINES GATT Server Message IDs + * @{ + */ + + + +/** @} End GATT_SERV_MSG_EVENT_DEFINES */ + + +/** @defgroup GATT_PROP_BITMAPS_DEFINES GATT Characteristic Properties Bit Fields + * @{ + */ + +#line 120 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_EXT_PROP_BITMAPS_DEFINES GATT Characteristic Extended Properties Bit Fields + * @{ + */ + + + + +/** @} End GATT_EXT_PROP_BITMAPS_DEFINES */ + +/** @defgroup GATT_CLIENT_CFG_BITMAPS_DEFINES GATT Client Characteristic Configuration Bit Fields + * @{ + */ + + + + +/** @} End GATT_CLIENT_CFG_BITMAPS_DEFINES */ + +/** @defgroup GATT_SERV_CFG_BITMAPS_DEFINES GATT Server Characteristic Configuration Bit Fields + * @{ + */ + + + +/** @} End GATT_SERV_CFG_BITMAPS_DEFINES */ + + + +/** @defgroup GATT_FORMAT_TYPES_DEFINES GATT Characteristic Format Types + * @{ + */ + +#line 182 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +/** @} End GATT_FORMAT_TYPES_DEFINES */ + +/** @defgroup GATT_NS_TYPES_DEFINES GATT Namespace Types + * @{ + */ + + + + +/** @} End GATT_NS_TYPES_DEFINES */ + +/** @defgroup GATT_NS_BT_DESC_DEFINES GATT Bluetooth Namespace Descriptions + * @{ + */ + + + +/** @} End GATT_NS_BT_DESC_DEFINES */ + +// All profile services bit fields + + +// GATT Services bit fields + + +#line 216 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\include\\gattservapp.h" + +// GATT Server Parameters + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * MACROS + */ + +// The number of attribute records in a given attribute table + + +// The handle of a service is the handle of the first attribute + + +// The handle of the first included service (i = 1) is the value of the second attribute + + +/********************************************************************* + * TYPEDEFS + */ + +/** + * @defgroup GATT_SERV_APP_CB_API GATT Server App Callback API Functions + * + * @{ + */ + +/** + * @brief Callback function prototype to read an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be read (to be returned) + * @param pLen - length of data (to be returned) + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return SUCCESS: Read was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTReadAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 *pLen, uint16 offset, + uint8 maxLen ); +/** + * @brief Callback function prototype to write an attribute value. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param pValue - pointer to data to be written + * @param pLen - length of data + * @param offset - offset of the first octet to be written + * + * @return SUCCESS: Write was successfully.
+ * Error, otherwise: ref ATT_ERR_CODE_DEFINES.
+ */ +typedef bStatus_t (*pfnGATTWriteAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset ); +/** + * @brief Callback function prototype to authorize a Read or Write operation + * on a given attribute. + * + * @param connHandle - connection request was received on + * @param pAttr - pointer to attribute + * @param opcode - request opcode (ATT_READ_REQ or ATT_WRITE_REQ) + * + * @return SUCCESS: Operation authorized.
+ * ATT_ERR_INSUFFICIENT_AUTHOR: Authorization required.
+ */ +typedef bStatus_t (*pfnGATTAuthorizeAttrCB_t)( uint16 connHandle, gattAttribute_t *pAttr, + uint8 opcode ); +/** + * @} + */ + +/** + * GATT Structure for Characteristic Presentation Format Value. + */ +typedef struct +{ + uint8 format; //!< Format of the value of this characteristic + uint8 exponent; //!< A sign integer which represents the exponent of an integer + uint16 unit; //!< Unit of this attribute as defined in the data dictionary + uint8 nameSpace; //!< Name space of the description + uint16 desc; //!< Description of this attribute as defined in a higher layer profile +} gattCharFormat_t; + +/** + * GATT Structure for Client Characteristic Configuration. + */ +typedef struct +{ + uint16 connHandle; //!< Client connection handle + uint8 value; //!< Characteristic configuration value for this client +} gattCharCfg_t; + +/** + * GATT Structure for service callback functions - must be setup by the application + * and used when GATTServApp_RegisterService() is called. + */ +typedef struct +{ + pfnGATTReadAttrCB_t pfnReadAttrCB; //!< Read callback function pointer + pfnGATTWriteAttrCB_t pfnWriteAttrCB; //!< Write callback function pointer + pfnGATTAuthorizeAttrCB_t pfnAuthorizeAttrCB; //!< Authorization callback function pointer +} gattServiceCBs_t; + +/** + * GATT Server App event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT type of command. Ref: @ref GATT_SERV_MSG_EVENT_DEFINES +} gattEventHdr_t; + +/** + * GATT_CLIENT_CHAR_CFG_UPDATED_EVENT message format. This message is sent to + * the app when a Client Characteristic Configuration is updated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GATT_SERV_MSG_EVENT and status + uint16 connHandle; //!< Connection message was received on + uint8 method; //!< GATT_CLIENT_CHAR_CFG_UPDATED_EVENT + uint16 attrHandle; //!< attribute handle + uint16 value; //!< attribute new value +} gattClientCharCfgUpdatedEvent_t; + + +/********************************************************************* + * VARIABLES + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/** + * @defgroup GATT_SERV_APP_API GATT Server App API Functions + * + * @{ + */ + +/** + * @brief Register your task ID to receive event messages + * from the GATT Server Application. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ +extern void GATTServApp_RegisterForMsg( uint8 taskID ); + +/** + * @brief Register a service's attribute list and callback functions with + * the GATT Server Application. + * + * @param pAttrs - Array of attribute records to be registered + * @param numAttrs - Number of attributes in array + * @param pServiceCBs - Service callback function pointers + * + * @return SUCCESS: Service registered successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_RegisterService( gattAttribute_t *pAttrs, uint16 numAttrs, + const gattServiceCBs_t *pServiceCBs ); +/** + * @brief Deregister a service's attribute list and callback functions from + * the GATT Server Application. + * + * NOTE: It's the caller's responsibility to free the service attribute + * list returned from this API. + * + * @param handle - handle of service to be deregistered + * @param p2pAttrs - pointer to array of attribute records (to be returned) + * + * @return SUCCESS: Service deregistered successfully. + * FAILURE: Service not found. + */ +bStatus_t GATTServApp_DeregisterService( uint16 handle, gattAttribute_t **p2pAttrs ); + +/** + * @brief Find the attribute record within a service attribute + * table for a given attribute value pointer. + * + * @param pAttrTbl - pointer to attribute table + * @param numAttrs - number of attributes in attribute table + * @param pValue - pointer to attribute value + * + * @return Pointer to attribute record. NULL, if not found. + */ +extern gattAttribute_t *GATTServApp_FindAttr( gattAttribute_t *pAttrTbl, + uint16 numAttrs, uint8 *pValue ); +/** + * @brief Add function for the GATT Service. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service added successfully.
+ * INVALIDPARAMETER: Invalid service field.
+ * FAILURE: Not enough attribute handles available.
+ * bleMemAllocError: Memory allocation error occurred.
+ */ +extern bStatus_t GATTServApp_AddService( uint32 services ); + +/** + * @brief Delete function for the GATT Service. + * + * @param services - services to delete. This is a bit map and can + * contain more than one service. + * + * @return SUCCESS: Service deleted successfully.
+ * FAILURE: Service not found.
+ */ +extern bStatus_t GATTServApp_DelService( uint32 services ); + +/** + * @brief Set a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param pValue - pointer to data to write. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast + * to uint16 pointer). + * + * @return SUCCESS: Parameter set successful + * FAILURE: Parameter in use + * INVALIDPARAMETER: Invalid parameter + * bleInvalidRange: Invalid value + * bleMemAllocError: Memory allocation failed + */ +extern bStatus_t GATTServApp_SetParameter( uint8 param, uint8 len, void *pValue ); + +/** + * @brief Get a GATT Server parameter. + * + * @param param - Profile parameter ID + * @param pValue - pointer to data to put. This is dependent on the + * parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be + * cast to uint16 pointer). + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_GetParameter( uint8 param, void *pValue ); + +/** + * @brief Update the Client Characteristic Configuration for a given + * Client. + * + * Note: This API should only be called from the Bond Manager. + * + * @param connHandle - connection handle. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS: Parameter get successful + * INVALIDPARAMETER: Invalid parameter + */ +extern bStatus_t GATTServApp_UpdateCharCfg( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Initialize the client characteristic configuration table. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads/Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle (0xFFFF for all connections). + * @param charCfgTbl - client characteristic configuration table. + * + * @return none + */ +extern void GATTServApp_InitCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Read the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Reads of the Client + * Characteristic Configuration only shows the configuration + * for that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * + * @return attribute value + */ +extern uint16 GATTServApp_ReadCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl ); + +/** + * @brief Write the client characteristic configuration for a given + * client. + * + * Note: Each client has its own instantiation of the Client + * Characteristic Configuration. Writes of the Client + * Characteristic Configuration only only affect the + * configuration of that client. + * + * @param connHandle - connection handle. + * @param charCfgTbl - client characteristic configuration table. + * @param value - attribute new value. + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteCharCfg( uint16 connHandle, gattCharCfg_t *charCfgTbl, uint16 value ); + +/** + * @brief Process the client characteristic configuration + * write request for a given client. + * + * @param connHandle - connection message was received on. + * @param pAttr - pointer to attribute. + * @param pValue - pointer to data to be written. + * @param len - length of data. + * @param offset - offset of the first octet to be written. + * @param validCfg - valid configuration. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCCCWriteReq( uint16 connHandle, gattAttribute_t *pAttr, + uint8 *pValue, uint8 len, uint16 offset, + uint16 validCfg ); + +/** + * @brief Process Client Charateristic Configuration change. + * + * @param charCfgTbl - characteristic configuration table. + * @param pValue - pointer to attribute value. + * @param authenticated - whether an authenticated link is required. + * @param attrTbl - attribute table. + * @param numAttrs - number of attributes in attribute table. + * @param taskId - task to be notified of confirmation. + * + * @return Success or Failure + */ +extern bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue, + uint8 authenticated, gattAttribute_t *attrTbl, + uint16 numAttrs, uint8 taskId ); + +/** + * @brief Build and send the GATT_CLIENT_CHAR_CFG_UPDATED_EVENT to + * the application. + * + * @param connHandle - connection handle + * @param attrHandle - attribute handle + * @param value - attribute new value + * + * @return none + */ +extern void GATTServApp_SendCCCUpdatedEvent( uint16 connHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Send out a Service Changed Indication. + * + * @param connHandle - connection to use + * @param taskId - task to be notified of confirmation + * + * @return SUCCESS: Indication was sent successfully.
+ * FAILURE: Service Changed attribute not found.
+ * INVALIDPARAMETER: Invalid connection handle or request field.
+ * MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
+ * bleNotConnected: Connection is down.
+ * blePending: A confirmation is pending with this client.
+ */ +extern bStatus_t GATTServApp_SendServiceChangedInd( uint16 connHandle, uint8 taskId ); + +/** + * @brief Read an attribute. If the format of the attribute value + * is unknown to GATT Server, use the callback function + * provided by the Service. + * + * @param connHandle - connection message was received on + * @param pAttr - pointer to attribute + * @param service - handle of owner service + * @param pValue - pointer to data to be read + * @param pLen - length of data to be read + * @param offset - offset of the first octet to be read + * @param maxLen - maximum length of data to be read + * + * @return Success or Failure + */ +extern uint8 GATTServApp_ReadAttr( uint16 connHandle, gattAttribute_t *pAttr, + uint16 service, uint8 *pValue, uint8 *pLen, + uint16 offset, uint8 maxLen ); + +/** + * @brief Write attribute data + * + * @param connHandle - connection message was received on + * @param handle - attribute handle + * @param pValue - pointer to data to be written + * @param len - length of data + * @param offset - offset of the first octet to be written + * + * @return Success or Failure + */ +extern uint8 GATTServApp_WriteAttr( uint16 connHandle, uint16 handle, + uint8 *pValue, uint16 len, uint16 offset ); + +/** + * @} + */ + +/** + * @brief Set a GATT Server Application Parameter value. Use this + * function to change the default GATT parameter values. + * + * @param value - new param value + * + * @return void + */ +extern void GATTServApp_SetParamValue( uint16 value ); + +/** + * @brief Get a GATT Server Application Parameter value. + * + * @param none + * + * @return GATT Parameter value + */ +extern uint16 GATTServApp_GetParamValue( void ); + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called by OSAL. + */ + +/** + * @internal + * + * @brief Initialize the GATT Server Test Application. + * + * @param taskId - Task identifier for the desired task + * + * @return void + * + */ +extern void GATTServApp_Init( uint8 taskId ); + +/** + * @internal + * + * @brief GATT Server Application Task event processor. This function + * is called to process all events for the task. Events include + * timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return none + */ +extern uint16 GATTServApp_ProcessEvent( uint8 taskId, uint16 events ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 32 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\DevInfo\\devinfoservice.h" +/************************************************************************************************** + Filename: devinfoservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Device Information service definitions and + prototypes. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Device Information Service Parameters +#line 67 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\DevInfo\\devinfoservice.h" + +// Device Information Service UUIDs +#line 79 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\DevInfo\\devinfoservice.h" + +// IEEE 11073 authoritative body values + + + + + +// System ID length + + + // PnP ID length + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * DevInfo_AddService- Initializes the Device Information service by registering + * GATT attributes with the GATT server. + * + */ + +extern bStatus_t DevInfo_AddService( void ); + +/********************************************************************* + * @fn DevInfo_SetParameter + * + * @brief Set a Device Information parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +bStatus_t DevInfo_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * DevInfo_GetParameter - Get a Device Information parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t DevInfo_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 33 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Batt\\battservice.h" +/************************************************************************************************** + Filename: battservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Battery service definitions and + prototypes. + + Copyright 2011-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Battery Service UUIDs + + + +// Battery Service Get/Set Parameters + + +// Callback events + + + +/********************************************************************* + * TYPEDEFS + */ + +// Battery Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*batteryChange_t)( uint8 paramID ); + +typedef struct +{ + batteryChange_t pfnBatteryChange; // Called when characteristic value changes +} batteryCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Batt_AddService + * + * @brief Initializes the Battery service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Batt_AddService( void ); + +/********************************************************************* + * @fn Batt_Register + * + * @brief Register a callback function with the Battery Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Batt_Register( batteryCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Batt_SetParameter + * + * @brief Set a Battery Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Batt_GetParameter + * + * @brief Get a Battery parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Batt_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Batt_HandleConnStatusCB + * + * @brief Battery Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Batt_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 34 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Actimetry\\actimetryservice.h" +/************************************************************************************************** + Filename: actimetryservice.h + + Description: Actimetry service definitions and prototypes. Based on + Gyroscope service from Sensors profile. + + The service consists of one characteristic which stores + the 20-byte value defined by specification. It allows + to send this data via notifications or read it directly. + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + +// If uncommented 128 bit UUIDs are used +//#define WIMU_LONG_UUIDS +/* + 128 bit Version 1 UUIDs generated on http://www.uuidgenerator.net/ + Macro as in Components\ble\include\bcomdef.h +*/ +#line 42 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Actimetry\\actimetryservice.h" + +// Service UUIDs + + + + + + +// Profile Parameters + + + + + +// Actimetry control flags + + +// Sensor Profile Services bit fields + + +// Length of sensor data in bytes + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*actimetryChange_t)( uint8 paramID ); + +typedef struct +{ + actimetryChange_t pfnActimetryChange; // Called when characteristic value changes +} actimetryCBs_t; + + +/********************************************************************* + * API FUNCTIONS + */ + + +/* + * Actimetry_AddService- Initializes the Sensor GATT Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Actimetry_AddService( uint32 services ); + +/* + * Actimetry_RegisterAppCBs - Registers the application callback function. + * Only call this function once. + * + * appCallbacks - pointer to application callbacks. + */ +extern bStatus_t Actimetry_RegisterAppCBs( actimetryCBs_t *appCallbacks ); + +/* + * Actimetry_SetParameter - Set a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * len - length of data to write + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Actimetry_GetParameter - Get a Sensor GATT Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Actimetry_GetParameter( uint8 param, void *value ); + + +/********************************************************************* +*********************************************************************/ + + + + + +#line 35 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Gps\\gpsservice.h" +/************************************************************************************************** + Filename: gpsprofile.h + Creation: Date: 2015-07-23 + + Description: Gps profile (based on simpleGATT Profile) + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\util\\WIMU\\wimu_util.h" + + + + + + + + +// WIMU sensor data packet size + + + + + + + + + + + + + + + + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags + + + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ + + + + +#line 22 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Gps\\gpsservice.h" + +/********************************************************************* + * CONSTANTS + */ + +// Profile Parameters + + + + + +// Simple Profile Service UUID + + + + + + + +// Simple Keys Profile Services bit fields + + +/********************************************************************* + * TYPEDEFS + */ + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +/********************************************************************* + * API FUNCTIONS + */ + +/* + * Gps_AddService- Initializes the Gps Profile service by registering + * GATT attributes with the GATT server. + * + * @param services - services to add. This is a bit map and can + * contain more than one service. + */ +extern bStatus_t Gps_AddService( uint32 services ); + +/* + * Gps_SetParameter - Set a Gps Profile parameter. + * + * param - Profile parameter ID + * len - length of data to right + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_SetParameter( uint8 param, uint8 len, void *value ); + +/* + * Gps_GetParameter - Get a Gps Profile parameter. + * + * param - Profile parameter ID + * value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + */ +extern bStatus_t Gps_GetParameter( uint8 param, void *value ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 36 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\TimeService\\timeservice.h" +/************************************************************************************************** + Filename: timeservice.h + Revised: $Date $ + Revision: $Revision $ + + Description: This file contains the Current Time service definitions and + prototypes according to the BLE standard + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + +/********************************************************************* + * CONSTANTS + */ + + +// Service UUIDs + + + +// Parameters + + +/********************************************************************* + * TYPEDEFS + */ + +// Service callback function +//typedef void (*battServiceCB_t)(uint8 event); + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * Profile Callbacks + */ + +// Callback when a characteristic value has changed +typedef void (*timeChange_t)( uint8 paramID ); + +typedef struct +{ + timeChange_t pfnTimeChange; // Called when characteristic value changes +} timeCBs_t; + +/********************************************************************* + * API FUNCTIONS + */ + +/********************************************************************* + * @fn Time_AddService + * + * @brief Initializes the Current Time service by registering + * GATT attributes with the GATT server. + * + * @return Success or Failure + */ +extern bStatus_t Time_AddService( void ); + +/********************************************************************* + * @fn Time_Register + * + * @brief Register a callback function with the Current Time Service. + * + * @param pfnServiceCB - Callback function. + * + * @return None. + */ +extern bStatus_t Time_Register( timeCBs_t *appCallbacks ); + +/********************************************************************* + * @fn Time_SetParameter + * + * @brief Set a Current Time Service parameter. + * + * @param param - Profile parameter ID + * @param len - length of data to right + * @param value - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_SetParameter( uint8 param, uint8 len, void *value ); + +/********************************************************************* + * @fn Time_GetParameter + * + * @brief Get a Current Time parameter. + * + * @param param - Profile parameter ID + * @param value - pointer to data to get. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return bStatus_t + */ +extern bStatus_t Time_GetParameter( uint8 param, void *value ); + +/********************************************************************* + * @fn Time_HandleConnStatusCB + * + * @brief Current Time Service link status change handler function. + * + * @param connHandle - connection handle + * @param changeType - type of change + * + * @return none + */ +void Time_HandleConnStatusCB( uint16 connHandle, uint8 changeType ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 37 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\peripheral.h" +/** + @headerfile: peripheral.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage TI BLE GAP Peripheral Role + + This GAP profile advertises and allows connections. + + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup GAPROLE_PROFILE_PARAMETERS GAP Role Parameters + * @{ + */ +#line 86 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\peripheral.h" +/** @} End GAPROLE_PROFILE_PARAMETERS */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + +/** + * GAP Peripheral Role States. + */ +typedef enum +{ + GAPROLE_INIT = 0, //!< Waiting to be started + GAPROLE_STARTED, //!< Started but not advertising + GAPROLE_ADVERTISING, //!< Currently Advertising + GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again + GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again + GAPROLE_CONNECTED, //!< In a connection + GAPROLE_ERROR //!< Error occurred - invalid state +} gaprole_States_t; + +/** + * Possible actions the peripheral device may take if an unsuccessful parameter + * update is received. + * + * Parameters for GAPRole_SendUpdateParam() only + */ + + + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * Profile Callbacks + */ + +/** + * Callback when the connection parameteres are updated. + */ +typedef void (*gapRolesParamUpdateCB_t)( uint16 connInterval, + uint16 connSlaveLatency, + uint16 connTimeout ); + +/** + * Callback when the device has been started. Callback event to + * the Notify of a state change. + */ +typedef void (*gapRolesStateNotify_t)( gaprole_States_t newState ); + +/** + * Callback when the device has read an new RSSI value during a connection. + */ +typedef void (*gapRolesRssiRead_t)( int8 newRSSI ); + +/** + * Callback structure - must be setup by the application and used when gapRoles_StartDevice() is called. + */ +typedef struct +{ + gapRolesStateNotify_t pfnStateChange; //!< Whenever the device changes state + gapRolesRssiRead_t pfnRssiRead; //!< When a valid RSSI is read from controller +} gapRolesCBs_t; + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_PERIPHERAL_API GAP Peripheral Role API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Role parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPROLE_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPRole_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Does the device initialization. Only call this function once. + * + * @param pAppCallbacks - pointer to application callbacks. + * + * @return SUCCESS or bleAlreadyInRequestedMode + */ +extern bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks ); + +/** + * @brief Terminates the existing connection. + * + * @return SUCCESS or bleIncorrectMode + */ +extern bStatus_t GAPRole_TerminateConnection( void ); + +/** + * @brief Update the parameters of an existing connection + * + * @param connInterval - the new connection interval + * @param latency - the new slave latency + * @param connTimeout - the new timeout value + * @param handleFailure - what to do if the update does not occur. + * Method may choose to terminate connection, try again, or take no action + * + * @return SUCCESS, bleNotConnected or bleInvalidRange + */ +extern bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, + uint16 latency, uint16 connTimeout, uint8 handleFailure ); + +/** + * @brief Register application's callbacks. + * + * @param pParamUpdateCB - pointer to param update callback. + * + * @return none + */ +extern void GAPRole_RegisterAppCBs( gapRolesParamUpdateCB_t *pParamUpdateCB ); + +/** + * @} End GAPROLES_PERIPHERAL_API + */ + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Role Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPRole_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Role Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPRole_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 42 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** + @headerfile: gapbondmgr.h + $Date: 2011-03-03 15:46:41 -0800 (Thu, 03 Mar 2011) $ + $Revision: 12 $ + + @mainpage TI BLE GAP Bond Manager + + This GAP profile manages bonded connections between devices.

+ + When operating as a slave, this profile will automatically respond + to SM Pairing Requests from a connected master device. When operating + as a master, this profile will automatically respond to SM Slave + Security Requests from a connected slave device. + + After pairing, if keys were exchanged and bonding was specified, this + profile will save the device and key information of the connected device, + so that, on future connections, the bonded devices can establish an + encrypted link without pairing.

+ + This GAP Bond Manager will handle all of the pairing and bonding actions + automatically and can be controlled by setting control parameters:
+ * GAPBondMgr_SetParameter()
+ * GAPBondMgr_GetParameter()

+ + Reference: @ref GAPBOND_PROFILE_PARAMETERS

+ + + Copyright 2010-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** + @headerfile: gap.h + $Date: 2013-05-01 13:58:23 -0700 (Wed, 01 May 2013) $ + $Revision: 34101 $ + + @mainpage BLE GAP API + + This file contains the interface to the GAP. + + \image html HighLevelGAP.PNG + + \htmlinclude GAPDesc.html + + \image html CentralDeviceDiscoveryProcess.PNG + + A central device can scan for advertising peripheral and broadcaster devices. The Observer process + is similar to the central process except that will not receive the SCAN_RSP data. +

+ The central device will initialize the device, then ask for a device discovery. The GAP will + setup the link layer to scan and it will filter incoming advertisements and SCAN_RSPs + based on the type of device discovery parameters passed in when GAP_DeviceDiscoveryRequest() was called. + Then, when the scan is complete, it will return an array of devices that pass through its filter. +

+ + \image html CentralLinkEstablishmentProcess.PNG + + After the Device Discovery Process, the central device can establish a connection with a peripheral + device by calling GAP_EstablishLinkRequest(). When the link has been established the GAP will send + back the @ref GAP_LINK_ESTABLISHED_EVENT [GAP_LinkEstablished]. +

+ + \image html CentralPairingProcess.PNG + + After a link is established, the central device can initiate a pairing process to either encrypt the + link or exchange keys for bonding. +





+ + Copyright 2009 - 2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Components\\ble\\include\\sm.h" +/** + @headerfile: sm.h + $Date: 2012-10-29 13:32:07 -0700 (Mon, 29 Oct 2012) $ + $Revision: 31951 $ + + @mainpage BLE SM API + + This file contains the interface to the SM. + + + Copyright 2009 - 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*/ + + + + + + + + + +/*------------------------------------------------------------------- + * INCLUDES + */ + + + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ +/** @defgroup SM_IO_CAP_DEFINES SM I/O Capabilities + * @{ + */ + + + + + +/** @} End SM_IO_CAP_DEFINES */ + + + +/** @defgroup SM_PASSKEY_TYPE_DEFINES SM Passkey Types (Bit Masks) + * @{ + */ + + +/** @} End SM_PASSKEY_TYPE_DEFINES */ + +/** @defgroup SM_BONDING_FLAGS_DEFINES SM AuthReq Bonding Flags + * Bonding flags 0x02 and 0x03 are reserved. + * @{ + */ + + +/** @} End SM_BONDING_FLAGS_DEFINES */ + + + + + + +/*------------------------------------------------------------------- + * General TYPEDEFS + */ + +/** + * SM_NEW_RAND_KEY_EVENT message format. This message is sent to the + * requesting task. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< SM_NEW_RAND_KEY_EVENT and status + uint8 newKey[16]; //!< New key value - if status is SUCCESS +} smNewRandKeyEvent_t; + +/** + * Key Distribution field - True or False fields + */ +typedef struct +{ + unsigned int sEncKey:1; //!< Set to distribute slave encryption key + unsigned int sIdKey:1; //!< Set to distribute slave identity key + unsigned int sSign:1; //!< Set to distribute slave signing key + unsigned int mEncKey:1; //!< Set to distribute master encryption key + unsigned int mIdKey:1; //!< Set to distribute master identity key + unsigned int mSign:1; //!< Set to distribute master signing key + unsigned int reserved:2; //!< Reserved - not to be used +} keyDist_t; + +/** + * Link Security Requirements + */ +typedef struct +{ + uint8 ioCaps; //!< I/O Capabilities (ie. + uint8 oobAvailable; //!< True if Out-of-band key available + uint8 oob[16]; //!< Out-Of-Bounds key + uint8 authReq; //!< Authentication Requirements + keyDist_t keyDist; //!< Key Distribution mask + uint8 maxEncKeySize; //!< Maximum Encryption Key size (7-16 bytes) +} smLinkSecurityReq_t; + +/** + * Link Security Information + */ +typedef struct +{ + uint8 ltk[16]; //!< Long Term Key (LTK) + uint16 div; //!< LTK Diversifier + uint8 rand[8]; //!< LTK random number + uint8 keySize; //!< LTK Key Size (7-16 bytes) +} smSecurityInfo_t; + +/** + * Link Identity Information + */ +typedef struct +{ + uint8 irk[16]; //!< Identity Resolving Key (IRK) + uint8 bd_addr[6]; //!< The advertiser may set this to zeroes to not disclose its BD_ADDR (public address). +} smIdentityInfo_t; + +/** + * Signing Information + */ +typedef struct +{ + uint8 srk[16]; //!< Signature Resolving Key (CSRK) + uint32 signCounter; //!< Sign Counter +} smSigningInfo_t; + +/** + * Pairing Request & Response - authReq field + */ +typedef struct +{ + unsigned int bonding:2; //!< Bonding flags + unsigned int mitm:1; //!< Man-In-The-Middle (MITM) + unsigned int reserved:5; //!< Reserved - don't use +} authReq_t; + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup SM_API Security Manager API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - MASTER API - Only use these in a master device + */ + +/** + * @brief Initialize SM Initiator on a master device. + * + * @return SUCCESS + */ +extern bStatus_t SM_InitiatorInit( void ); + +/** + * @brief Start the pairing process. This function is also + * called if the device is already bound. + * + * NOTE: Only one pairing process at a time per device. + * + * @param initiator - TRUE to start pairing as Initiator. + * @param taskID - task ID to send results. + * @param connectionHandle - Link's connection handle + * @param pSecReqs - Security parameters for pairing + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * bleAlreadyInRequestedMode + */ +extern bStatus_t SM_StartPairing( uint8 initiator, + uint8 taskID, + uint16 connectionHandle, + smLinkSecurityReq_t *pSecReqs ); + +/** + * @brief Send Start Encrypt through HCI + * + * @param connHandle - Connection Handle + * @param pLTK - pointer to 16 byte lkt + * @param div - div or ediv + * @param pRandNum - pointer to 8 byte random number + * @param keyLen - length of LTK (bytes) + * + * @return SUCCESS,
+ * INVALIDPARAMETER,
+ * other from HCI/LL + */ +extern bStatus_t SM_StartEncryption( uint16 connHandle, uint8 *pLTK, + uint16 div, uint8 *pRandNum, uint8 keyLen ); + + +/*------------------------------------------------------------------- + * FUNCTIONS - SLAVE API - Only use these in a slave device + */ + +/** + * @brief Initialize SM Responder on a slave device. + * + * @return SUCCESS + */ +extern bStatus_t SM_ResponderInit( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - GENERAL API - both master and slave + */ + +/** + * @brief Generate a key with a random value. + * + * @param taskID - task ID to send results. + * + * @return SUCCESS,
+ * bleNotReady,
+ * bleMemAllocError,
+ * FAILURE + */ +extern bStatus_t SM_NewRandKey( uint8 taskID ); + +/** + * @brief Calculate a new Private Resolvable address. + * + * @param pIRK - Identity Root Key. + * @param pNewAddr - pointer to place to put new calc'd address + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER + */ +extern bStatus_t SM_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr ); + +/** + * @brief Resolve a Private Resolveable Address. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the random address + * + * @return SUCCESS - match,
+ * FAILURE - don't match,
+ * INVALIDPARAMETER - parameters invalid + */ +extern bStatus_t SM_ResolveRandomAddrs( uint8 *pIRK, uint8 *pAddr ); + +/** + * @brief Encrypt the plain text data with the key.. + * + * @param pKey - key data + * @param pPlainText - Plain text data + * @param pResult - place to put the encrypted result + * + * @return SUCCESS - if started,
+ * INVALIDPARAMETER - one of the parameters are NULL,
+ * bleAlreadyInRequestedMode,
+ * bleMemAllocError + */ +extern bStatus_t SM_Encrypt( uint8 *pKey, uint8 *pPlainText, uint8 *pResult ); + +/** + * @brief Generate an outgoing Authentication Signature. + * + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - place to put new signature + * + * @return SUCCESS - signature authentication generated,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL,
+ * bleMemAllocError + */ +extern bStatus_t SM_GenerateAuthenSig( uint8 *pData, uint8 len, uint8 *pAuthenSig ); + +/** + * @brief Verify an Authentication Signature. + * + * @param connHandle - connection to verify against. + * @param authentication - TRUE if requires an authenticated CSRK, FALSE if not + * @param pData - message data + * @param len - length of pData + * @param pAuthenSig - message signature to verify + * + * @return SUCCESS - signature authentication verified,
+ * FAILURE - if not verified,
+ * bleNotConnected - Connection not found,
+ * INVALIDPARAMETER - pData or pAuthenSig is NULL, or signCounter is invalid,
+ * bleMemAllocError + */ +extern bStatus_t SM_VerifyAuthenSig( uint16 connHandle, + uint8 authentication, + uint8 *pData, + uint8 len, + uint8 *pAuthenSig ); + +/** + * @brief Update the passkey for the pairing process. + * + * @param pPasskey - pointer to the 6 digit passkey + * @param connectionHandle - connection handle to link. + * + * @return SUCCESS,
+ * bleIncorrectMode - Not pairing,
+ * INVALIDPARAMETER - link is incorrect + */ +extern bStatus_t SM_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + +/** + * @} End SM_API + */ + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief SM Task Initialization Function. + * + * @param taskID - SM task ID. + * + * @return void + */ + extern void SM_Init( uint8 task_id ); + + /** + * @internal + * + * @brief SM Task event processing function. + * + * @param taskID - SM task ID + * @param events - SM events. + * + * @return events not processed + */ + extern uint16 SM_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 84 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * CONSTANTS + */ + +/** @defgroup BLE_GAP_DEFINES BLE GAP Constants and Structures + * @{ + */ + +/** @defgroup GAP_MSG_EVENT_DEFINES GAP Message IDs + * @{ + */ +#line 116 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_MSG_EVENT_DEFINES */ + +/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles + * Used by GAP_TerminateLinkReq() + * @{ + */ + + +/** @} End GAP_CONN_HANDLE_DEFINES */ + +/** @defgroup GAP_PROFILE_ROLE_DEFINES GAP Profile Roles + * Bit mask values + * @{ + */ + + + + +/** @} End GAP_PROFILE_ROLE_DEFINES */ + +/** + * @defgroup GAP_PARAMETER_ID_DEFINES GAP Parameter IDs + * Used in place of gapParamIDs_t. + * @{ + */ +// Timers +#line 148 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Constants +#line 176 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +// Proprietary + + + + + + +#line 197 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" + +/** @} End GAP_PARAMETER_ID_DEFINES */ + +/** @defgroup GAP_DEVDISC_MODE_DEFINES GAP Device Discovery Modes + * @{ + */ + + + + +/** @} End GAP_DEVDISC_MODE_DEFINES */ + +/** @defgroup GAP_ADDR_TYPE_DEFINES GAP Address Types + * @{ + */ + + + + +/** @} End GAP_ADDR_TYPE_DEFINES */ + +/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertiser Event Types + * for eventType field in gapAdvertisingParams_t, gapDevRec_t and gapDeviceInfoEvent_t + * @{ + */ + + + + + +/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */ + +/** @defgroup GAP_FILTER_POLICY_DEFINES GAP Advertiser Filter Scan Parameters + * @{ + */ + + + + +/** @} End GAP_FILTER_POLICY_DEFINES */ + +//! Advertiser Channel Map + + +//! Maximum Pairing Passcode/Passkey value. Range of a passkey can be 0 - 999,999. + + +/** Sign Counter Initialized - Sign counter hasn't been used yet. Used when setting up + * a connection's signing information. + */ + + +/** @defgroup GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map + * @{ + */ + + + + +/** @} End GAP_ADVCHAN_DEFINES */ + +/** @defgroup GAP_WHITELIST_DEFINES GAP White List Options + * @{ + */ + + +/** @} End GAP_WHITELIST_DEFINES */ + +/** @defgroup GAP_ADTYPE_DEFINES GAP Advertisment Data Types + * These are the data type identifiers for the data tokens in the advertisement data field. + * @{ + */ +#line 291 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_ADTYPE_DEFINES */ + +/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes + * @{ + */ + + + +/** @} End GAP_ADTYPE_FLAGS_MODES */ + +/** @defgroup GAP_APPEARANCE_VALUES GAP Appearance Values + * @{ + */ +#line 333 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\..\\..\\Components\\ble\\include\\gap.h" +/** @} End GAP_APPEARANCE_VALUES */ + +/*------------------------------------------------------------------- + * TYPEDEFS - Initialization and Configuration + */ + +/** + * GAP Parameters IDs: @ref GAP_PARAMETER_ID_DEFINES + */ +typedef uint16 gapParamIDs_t; + +/** + * GAP event header format. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES +} gapEventHdr_t; + +/** + * GAP_RANDOM_ADDR_CHANGED_EVENT message format. This message is sent to the + * app when the random address changes. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_RANDOM_ADDR_CHANGED_EVENT + uint8 addrType; //!< Address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 newRandomAddr[6]; //!< the new calculated private addr +} gapRandomAddrEvent_t; + +/** + * Connection parameters for the peripheral device. These numbers are used + * to compare against connection events and request connection parameter + * updates with the master. + */ +typedef struct +{ + /** Minimum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMin; + /** Maximum value for the connection event (interval. 0x0006 - 0x0C80 * 1.25 ms) */ + uint16 intervalMax; + /** Number of LL latency connection events (0x0000 - 0x03e8) */ + uint16 latency; + /** Connection Timeout (0x000A - 0x0C80 * 10 ms) */ + uint16 timeout; +} gapPeriConnectParams_t; + +/** + * GAP_DEVICE_INIT_DONE_EVENT message format. This message is sent to the + * app when the Device Initialization is done [initiated by calling + * GAP_DeviceInit()]. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INIT_DONE_EVENT + uint8 devAddr[6]; //!< Device's BD_ADDR + uint16 dataPktLen; //!< HC_LE_Data_Packet_Length + uint8 numDataPkts; //!< HC_Total_Num_LE_Data_Packets +} gapDeviceInitDoneEvent_t; + +/** + * GAP_SIGNATURE_UPDATED_EVENT message format. This message is sent to the + * app when the signature counter has changed. This message is to inform the + * application in case it wants to save it to be restored on reboot or reconnect. + * This message is sent to update a connection's signature counter and to update + * this device's signature counter. If devAddr == BD_ADDR, then this message pertains + * to this device. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SIGNATURE_UPDATED_EVENT + uint8 addrType; //!< Device's address type for devAddr + uint8 devAddr[6]; //!< Device's BD_ADDR, could be own address + uint32 signCounter; //!< new Signed Counter +} gapSignUpdateEvent_t; + +/** + * GAP_DEVICE_INFO_EVENT message format. This message is sent to the + * app during a Device Discovery Request, when a new advertisement or scan + * response is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_INFO_EVENT + uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Address of the advertisement or SCAN_RSP + int8 rssi; //!< Advertisement or SCAN_RSP RSSI + uint8 dataLen; //!< Length (in bytes) of the data field (evtData) + uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP +} gapDeviceInfoEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Device Discovery + */ + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 taskID; //!< Requesting App's Task ID, used to return results + uint8 mode; //!< Discovery Mode: @ref GAP_DEVDISC_MODE_DEFINES + uint8 activeScan; //!< TRUE for active scanning + uint8 whiteList; //!< TRUE to only allow advertisements from devices in the white list. +} gapDevDiscReq_t; + +/** + * Type of device discovery (Scan) to perform. + */ +typedef struct +{ + uint8 eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES + uint8 addr[6]; //!< Device's Address +} gapDevRec_t; + +/** + * GAP_DEVICE_DISCOVERY_EVENT message format. This message is sent to the + * Application after a scan is performed. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_DEVICE_DISCOVERY_EVENT + uint8 numDevs; //!< Number of devices found during scan + gapDevRec_t *pDevList; //!< array of device records +} gapDevDiscEvent_t; + +/** + * Advertising Parameters + */ +typedef struct +{ + uint8 eventType; //!< Advertise Event Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES + uint8 initiatorAddrType; //!< Initiator's address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 initiatorAddr[6]; //!< Initiator's addr - used only with connectable directed eventType (ADV_EVTTYPE_CONNECTABLE_DIRECTED). + uint8 channelMap; //!< Channel Map: Bit mask @ref GAP_ADVCHAN_DEFINES + uint8 filterPolicy; //!< Filer Policy: @ref GAP_FILTER_POLICY_DEFINES. Ignored when directed advertising is used. +} gapAdvertisingParams_t; + +/** + * GAP_MAKE_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertise config is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_MAKE_DISCOVERABLE_DONE_EVENT + uint16 interval; //!< actual advertising interval selected by controller +} gapMakeDiscoverableRspEvent_t; + +/** + * GAP_END_DISCOVERABLE_DONE_EVENT message format. This message is sent to the + * app when the Advertising has stopped. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_END_DISCOVERABLE_DONE_EVENT +} gapEndDiscoverableRspEvent_t; + +/** + * GAP_ADV_DATA_UPDATE_DONE_EVENT message format. This message is sent to the + * app when Advertising Data Update is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_ADV_DATA_UPDATE_DONE_EVENT + uint8 adType; //!< TRUE if advertising data, FALSE if SCAN_RSP +} gapAdvDataUpdateEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Link Establishment + */ + +/** + * Establish Link Request parameters + */ +typedef struct +{ + uint8 taskID; //!< Requesting App/Profile's Task ID + uint8 highDutyCycle; //!< TRUE to high duty cycle scan, FALSE if not. + uint8 whiteList; //!< Determines use of the white list: @ref GAP_WHITELIST_DEFINES + uint8 addrTypePeer; //!< Address type of the advertiser: @ref GAP_ADDR_TYPE_DEFINES + uint8 peerAddr[6]; //!< Advertiser's address +} gapEstLinkReq_t; + +/** + * Update Link Parameters Request parameters + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection handle of the update + uint16 intervalMin; //!< Minimum Connection Interval + uint16 intervalMax; //!< Maximum Connection Interval + uint16 connLatency; //!< Connection Latency + uint16 connTimeout; //!< Connection Timeout +} gapUpdateLinkParamReq_t; + +/** + * GAP_LINK_ESTABLISHED_EVENT message format. This message is sent to the app + * when the link request is complete.
+ *
+ * For an Observer, this message is sent to complete the Establish Link Request.
+ * For a Peripheral, this message is sent to indicate that a link has been created. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_ESTABLISHED_EVENT + uint8 devAddrType; //!< Device address type: @ref GAP_ADDR_TYPE_DEFINES + uint8 devAddr[6]; //!< Device address of link + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint16 connInterval; //!< Connection Interval + uint16 connLatency; //!< Conenction Latency + uint16 connTimeout; //!< Connection Timeout + uint8 clockAccuracy; //!< Clock Accuracy +} gapEstLinkReqEvent_t; + +/** + * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app + * when the connection parameters update request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT + uint8 status; //!< bStatus_t + uint16 connectionHandle; //!< Connection handle of the update + uint16 connInterval; //!< Requested connection interval + uint16 connLatency; //!< Requested connection latency + uint16 connTimeout; //!< Requested connection timeout +} gapLinkUpdateEvent_t; + +/** + * GAP_LINK_TERMINATED_EVENT message format. This message is sent to the + * app when a link to a device is terminated. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_LINK_TERMINATED_EVENT + uint16 connectionHandle; //!< connection Handle + uint8 reason; //!< termination reason from LL +} gapTerminateLinkEvent_t; + +/*------------------------------------------------------------------- + * TYPEDEFS - Authentication, Bounding and Pairing + */ + +/** + * GAP_PASSKEY_NEEDED_EVENT message format. This message is sent to the + * app when a Passkey is needed from the app's user interface. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PASSKEY_NEEDED_EVENT + uint8 deviceAddr[6]; //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle; //!< Connection handle + uint8 uiInputs; //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs; //!< Pairing User Interface Outputs - Display passcode +} gapPasskeyNeededEvent_t; + +/** + * GAP_AUTHENTICATION_COMPLETE_EVENT message format. This message is sent to the app + * when the authentication request is complete. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_AUTHENTICATION_COMPLETE_EVENT + uint16 connectionHandle; //!< Connection Handle from controller used to ref the device + uint8 authState; //!< TRUE if the pairing was authenticated (MITM) + smSecurityInfo_t *pSecurityInfo; //!< BOUND - security information from this device + smIdentityInfo_t *pIdentityInfo; //!< BOUND - identity information + smSigningInfo_t *pSigningInfo; //!< Signing information + smSecurityInfo_t *pDevSecInfo; //!< BOUND - security information from connected device +} gapAuthCompleteEvent_t; + +/** + * securityInfo and identityInfo are only used if secReqs.bondable == BOUND, which means that + * the device is already bound and we should use the security information and keys. + */ +typedef struct +{ + uint16 connectionHandle; //!< Connection Handle from controller, + smLinkSecurityReq_t secReqs; //!< Pairing Control info +} gapAuthParams_t; + +/** + * GAP_SLAVE_REQUESTED_SECURITY_EVENT message format. This message is sent to the app + * when a Slave Security Request is received. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_SLAVE_REQUESTED_SECURITY_EVENT + uint16 connectionHandle; //!< Connection Handle + uint8 deviceAddr[6]; //!< address of device requesting security + uint8 authReq; //!< Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + +} gapSlaveSecurityReqEvent_t; + +/** + * GAP_BOND_COMPLETE_EVENT message format. This message is sent to the + * app when a bonding is complete. This means that a key is loaded and the link is encrypted. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_BOND_COMPLETE_EVENT + uint16 connectionHandle; //!< connection Handle +} gapBondCompleteEvent_t; + +/** + * Pairing Request fields - the parsed fields of the SMP Pairing Request command. + */ +typedef struct +{ + uint8 ioCap; //!< Pairing Request ioCap field + uint8 oobDataFlag; //!< Pairing Request OOB Data Flag field + uint8 authReq; //!< Pairing Request Auth Req field + uint8 maxEncKeySize; //!< Pairing Request Maximum Encryption Key Size field + keyDist_t keyDist; //!< Pairing Request Key Distribution field +} gapPairingReq_t; + +/** + * GAP_PAIRING_REQ_EVENT message format.
+ *
+ * This message is sent to the + * app when an unexpected Pairing Request is received. The application is + * expected to setup for a Security Manager pairing/bonding.
+ *
+ * To setup an SM Pairing, the application should call GAP_Authenticate() with these "pairReq" fields.
+ *
+* NOTE: This message should only be sent to peripheral devices. + */ +typedef struct +{ + osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status + uint8 opcode; //!< GAP_PAIRING_REQ_EVENT + uint16 connectionHandle; //!< connection Handle + gapPairingReq_t pairReq; //!< The Pairing Request fields received. +} gapPairingReqEvent_t; + +/** + * GAP Advertisement/Scan Response Data Token - These data items are stored as low byte first (OTA + * format). The data space for these items are passed in and maintained by + * the calling application + */ +typedef struct +{ + uint8 adType; //!< ADTYPE value: @ref GAP_ADTYPE_DEFINES + uint8 attrLen; //!< Number of bytes in the attribute data + uint8 *pAttrData; //!< pointer to Attribute data +} gapAdvDataToken_t; + +/** @} End BLE_GAP_DEFINES */ + +/*------------------------------------------------------------------- + * GLOBAL VARIABLES + */ + +/** + * @defgroup GAP_API GAP API Functions + * + * @{ + */ + +/*------------------------------------------------------------------- + * FUNCTIONS - Initialization and Configuation + */ + + /** + * @brief Called to setup the device. Call just once on initialization. + * + * NOTE: When initialization is complete, the calling app will be + * sent the GAP_DEVICE_INIT_DONE_EVENT + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles: @ref GAP_PROFILE_ROLE_DEFINES + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return SUCCESS - Processing, expect GAP_DEVICE_INIT_DONE_EVENT,
+ * INVALIDPARAMETER - for invalid profile role or role combination,
+ * bleIncorrectMode - trouble communicating with HCI + */ + extern bStatus_t GAP_DeviceInit( uint8 taskID, + uint8 profileRole, + uint8 maxScanResponses, + uint8 *pIRK, + uint8 *pSRK, + uint32 *pSignCounter ); + + /** + * @brief Called to setup a GAP Advertisement/Scan Response data token. + * + * NOTE: The data in these items are stored as low byte first (OTA format). + * The passed in structure "token" should be allocated by the calling app/profile + * and not released until after calling GAP_RemoveAdvToken(). + * + * @param pToken - Advertisement/Scan response token to write. + * + * @return SUCCESS - advertisement token added to the GAP list
+ * INVALIDPARAMETER - Invalid Advertisement Type or pAttrData is NULL
+ * INVALID_MEM_SIZE - The tokens take up too much space and don't fit into Advertisment data and Scan Response Data
+ * bleInvalidRange - token ID already exists.
+ * bleIncorrectMode - not a peripheral device
+ * bleMemAllocError - memory allocation failure, + */ + extern bStatus_t GAP_SetAdvToken( gapAdvDataToken_t *pToken ); + + /** + * @brief Called to read a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to get + * + * @return pointer to the advertisement data token structure, NULL if not found. + */ + extern gapAdvDataToken_t *GAP_GetAdvToken( uint8 adType ); + + /** + * @brief Called to remove a GAP Advertisement/Scan Response data token. + * + * @param adType - Advertisement type to remove + * + * @return pointer to the token structure removed from the GAP ADType list + * NULL if the requested adType wasn't found. + */ + extern gapAdvDataToken_t *GAP_RemoveAdvToken( uint8 adType ); + + /** + * @brief Called to rebuild and load Advertisement and Scan Response data from existing + * GAP Advertisement Tokens. + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_UpdateAdvTokens( void ); + + /** + * @brief Set a GAP Parameter value. Use this function to change + * the default GAP parameter values. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * @param paramValue - new param value + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ + extern bStatus_t GAP_SetParamValue( gapParamIDs_t paramID, uint16 paramValue ); + + /** + * @brief Get a GAP Parameter value. + * + * @param paramID - parameter ID: @ref GAP_PARAMETER_ID_DEFINES + * + * @return GAP Parameter value or 0xFFFF if invalid + */ + extern uint16 GAP_GetParamValue( gapParamIDs_t paramID ); + + /** + * @brief Setup the device's address type. If ADDRTYPE_PRIVATE_RESOLVE + * is selected, the address will change periodically. + * + * @param addrType - @ref GAP_ADDR_TYPE_DEFINES + * @param pStaticAddr - Only used with ADDRTYPE_STATIC + * or ADDRTYPE_PRIVATE_NONRESOLVE type.
+ * NULL to auto generate otherwise the application + * can specify the address value + * + * @return SUCCESS: address type updated,
+ * bleNotReady: Can't be called until GAP_DeviceInit() is called + * and the init process is completed,
+ * bleIncorrectMode: can't change with an active connection,
+ * or INVALIDPARAMETER.
+ * + * If return value isn't SUCCESS, the address type remains + * the same as before this call. + */ + extern bStatus_t GAP_ConfigDeviceAddr( uint8 addrType, uint8 *pStaticAddr ); + + /** + * @brief Register your task ID to receive extra (unwanted) + * HCI status and complete events. + * + * @param taskID - Default task ID to send events. + * + * @return none + */ + extern void GAP_RegisterForHCIMsgs( uint8 taskID ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Device Discovery + */ + + /** + * @brief Start a device discovery scan. + * + * @param pParams - Device Discovery parameters + * + * @return SUCCESS: scan started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available
+ */ + extern bStatus_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams ); + + /** + * @brief Cancel an existing device discovery request. + * + * @param taskID - used to return GAP_DEVICE_DISCOVERY_EVENT + * + * @return SUCCESS: cancel started,
+ * bleInvalidTaskID: Not the task that started discovery,
+ * bleIncorrectMode: not in discovery mode
+ */ + extern bStatus_t GAP_DeviceDiscoveryCancel( uint8 taskID ); + + /** + * @brief Setup or change advertising. Also starts advertising. + * + * @param taskID - used to return GAP_DISCOVERABLE_RESPONSE_EVENT + * @param pParams - advertising parameters + * + * @return SUCCESS: advertising started,
+ * bleIncorrectMode: invalid profile role,
+ * bleAlreadyInRequestedMode: not available at this time,
+ * bleNotReady: advertising data isn't set up yet.
+ */ + extern bStatus_t GAP_MakeDiscoverable( uint8 taskID, gapAdvertisingParams_t *pParams ); + + /** + * @brief Setup or change advertising and scan response data. + * + * NOTE: if the return status from this function is SUCCESS, + * the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT + * is sent to the calling application task. + * + * @param taskID - task ID of the app requesting the change + * @param adType - TRUE - advertisement data, FALSE - scan response data + * @param dataLen - Octet length of advertData + * @param pAdvertData - advertising or scan response data + * + * @return SUCCESS: data accepted,
+ * bleIncorrectMode: invalid profile role,
+ */ + extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 adType, + uint8 dataLen, uint8 *pAdvertData ); + + /** + * @brief Stops advertising. + * + * @param taskID - of task that called GAP_MakeDiscoverable + * + * @return SUCCESS: stopping discoverable mode,
+ * bleIncorrectMode: not in discoverable mode,
+ * bleInvalidTaskID: not correct task
+ */ + extern bStatus_t GAP_EndDiscoverable( uint8 taskID ); + + /** + * @brief Resolves a private address against an IRK. + * + * @param pIRK - pointer to the IRK + * @param pAddr - pointer to the Resovable Private address + * + * @return SUCCESS: match,
+ * FAILURE: don't match,
+ * INVALIDPARAMETER: parameters invalid
+ */ + extern bStatus_t GAP_ResolvePrivateAddr( uint8 *pIRK, uint8 *pAddr ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Link Establishment + */ + + /** + * @brief Establish a link to a slave device. + * + * @param pParams - link establishment parameters + * + * @return SUCCESS: started establish link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotReady: a scan is in progress,
+ * bleAlreadyInRequestedMode: can’t process now,
+ * bleNoResources: Too many links
+ */ + extern bStatus_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams ); + + /** + * @brief Terminate a link connection. + * + * @param taskID - requesting app's task id. + * @param connectionHandle - connection handle of link to terminate + * or @ref GAP_CONN_HANDLE_DEFINES + * + * @return SUCCESS: Terminate started,
+ * bleIncorrectMode: No Link to terminate,
+ * bleInvalidTaskID: not app that established link
+ */ + extern bStatus_t GAP_TerminateLinkReq( uint8 taskID, uint16 connectionHandle ); + + /** + * @brief Update the link parameters to a slave device. + * + * @param pParams - link update parameters + * + * @return SUCCESS: started update link process,
+ * bleIncorrectMode: invalid profile role,
+ * bleNotConnected: not in a connection
+ */ + extern bStatus_t GAP_UpdateLinkParamReq( gapUpdateLinkParamReq_t *pParams ); + + /** + * @brief Returns the number of active connections. + * + * @return Number of active connections. + */ + extern uint8 GAP_NumActiveConnections( void ); + +/*------------------------------------------------------------------- + * FUNCTIONS - Pairing + */ + + /** + * @brief Start the Authentication process with the requested device. + * This function is used to Initiate/Allow pairing. + * Called by both master and slave device (Central and Peripheral). + * + * NOTE: This function is called after the link is established. + * + * @param pParams - Authentication parameters + * @param pPairReq - Enter these parameters if the Pairing Request was already received. + * NULL, if waiting for Pairing Request or if initiating. + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * bleAlreadyInRequestedMode,
+ * FAILURE - not workable.
+ */ + extern bStatus_t GAP_Authenticate( gapAuthParams_t *pParams, gapPairingReq_t *pPairReq ); + + /** + * @brief Send a Pairing Failed message and end any existing pairing. + * + * @param connectionHandle - connection handle. + * @param reason - Pairing Failed reason code. + * + * @return SUCCESS - function was successful,
+ * bleMemAllocError - memory allocation error,
+ * INVALIDPARAMETER - one of the parameters were invalid,
+ * bleNotConnected - link not found,
+ * bleInvalidRange - one of the parameters were not within range. + */ + extern bStatus_t GAP_TerminateAuth( uint16 connectionHandle, uint8 reason ); + + /** + * @brief Update the passkey in string format. This function is called by the + * application/profile in response to receiving the + * GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasscodeUpdate(), except that + * the passkey is passed in as a string format. + * + * @param pPasskey - new passkey - pointer to numeric string (ie. "019655" ). + * This string's range is "000000" to "999999". + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasskeyUpdate( uint8 *pPasskey, uint16 connectionHandle ); + + /** + * @brief Update the passkey in a numeric value (not string). + * This function is called by the application/profile in response + * to receiving the GAP_PASSKEY_NEEDED_EVENT message. + * + * NOTE: This function is the same as GAP_PasskeyUpdate(), except that + * the passkey is passed in as a non-string format. + * + * @param passcode - not string - range: 0 - 999,999. + * @param connectionHandle - connection handle. + * + * @return SUCCESS: will start pairing with this entry,
+ * bleIncorrectMode: Link not found,
+ * INVALIDPARAMETER: passkey == NULL or passkey isn't formatted properly.
+ */ + extern bStatus_t GAP_PasscodeUpdate( uint32 passcode, uint16 connectionHandle ); + + /** + * @brief Generate a Slave Requested Security message to the master. + * + * @param connectionHandle - connection handle. + * @param authReq - Authentication Requirements: Bit 2: MITM, Bits 0-1: bonding (0 - no bonding, 1 - bonding) + * + * @return SUCCESS: will send,
+ * bleNotConnected: Link not found,
+ * bleIncorrectMode: wrong GAP role, must be a Peripheral Role
+ */ + extern bStatus_t GAP_SendSlaveSecurityRequest( uint16 connectionHandle, uint8 authReq ); + + /** + * @brief Set up the connection to accept signed data. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - TRUE if the signing information is authenticated, FALSE otherwise + * @param pParams - signing parameters + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Signable( uint16 connectionHandle, uint8 authenticated, smSigningInfo_t *pParams ); + + /** + * @brief Set up the connection's bound paramaters. + * + * NOTE: This function is called after the link is established. + * + * @param connectionHandle - connection handle of the signing information + * @param authenticated - this connection was previously authenticated + * @param pParams - the connected device's security parameters + * @param startEncryption - whether or not to start encryption + * + * @return SUCCESS,
+ * bleIncorrectMode: Not correct profile role,
+ * INVALIDPARAMETER,
+ * bleNotConnected,
+ * FAILURE: not workable.
+ */ + extern bStatus_t GAP_Bond( uint16 connectionHandle, uint8 authenticated, + smSecurityInfo_t *pParams, uint8 startEncryption ); + +/** + * @} End GAP_API + */ + +/*------------------------------------------------------------------- + * Internal API - These functions are only called from gap.c module. + */ + + /** + * @internal + * + * @brief Setup the device configuration parameters. + * + * @param taskID - Default task ID to send events. + * @param profileRole - GAP Profile Roles + * + * @return SUCCESS or bleIncorrectMode + */ + extern bStatus_t GAP_ParamsInit( uint8 taskID, uint8 profileRole ); + + /** + * @internal + * + * @brief Setup the device security configuration parameters. + * + * @param pIRK - pointer to Identity Root Key, NULLKEY (all zeroes) if the app + * wants the GAP to generate the key. + * @param pSRK - pointer to Sign Resolving Key, NULLKEY if the app + * wants the GAP to generate the key. + * @param pSignCounter - 32 bit value used in the SM Signing + * algorithm that shall be initialized to zero and incremented + * with every new signing. This variable must also be maintained + * by the application. + * + * @return none + */ + extern void GAP_SecParamsInit( uint8 *pIRK, uint8 *pSRK, uint32 *pSignCounter ); + + /** + * @internal + * + * @brief Initialize the GAP Peripheral Dev Manager. + * + * @param none + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_PeriDevMgrInit( void ); + + /** + * @internal + * + * @brief Initialize the GAP Central Dev Manager. + * + * @param maxScanResponses - maximum number to scan responses + * we can receive during a device discovery. + * + * @return SUCCESS or bleMemAllocError + */ + extern bStatus_t GAP_CentDevMgrInit( uint8 maxScanResponses ); + + /** + * @internal + * + * @brief Register the GAP Central Connection processing functions. + * + * @param none + * + * @return none + */ + extern void GAP_CentConnRegister( void ); + + +/*------------------------------------------------------------------- + * TASK API - These functions must only be called OSAL. + */ + + /** + * @internal + * + * @brief GAP Task initialization function. + * + * @param taskID - GAP task ID. + * + * @return void + */ + extern void GAP_Init( uint8 task_id ); + + /** + * @internal + * + * @brief GAP Task event processing function. + * + * @param taskID - GAP task ID + * @param events - GAP events. + * + * @return events not processed + */ + extern uint16 GAP_ProcessEvent( uint8 task_id, uint16 events ); + + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 71 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" + +/*------------------------------------------------------------------- + * CONSTANTS + */ + + + + + + + + +/** @defgroup GAPBOND_CONSTANTS_NAME GAP Bond Manager Constants + * @{ + */ + +/** @} End GAPBOND_CONSTANTS_NAME */ + +/** @defgroup GAPBOND_PROFILE_PARAMETERS GAP Bond Manager Parameters + * @{ + */ +#line 108 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_PROFILE_PARAMETERS */ + +/** @defgroup GAPBOND_PAIRING_MODE_DEFINES GAP Bond Manager Pairing Modes + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_MODE_DEFINES */ + +/** @defgroup GAPBOND_IO_CAP_DEFINES GAP Bond Manager I/O Capabilities + * @{ + */ + + + + + +/** @} End GAPBOND_IO_CAP_DEFINES */ + +/** @defgroup GAPBOND_KEY_DIST_DEFINES GAP Bond Manager Key Distribution + * @{ + */ +#line 137 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End GAPBOND_IO_CAP_DEFINES */ + + +/** @defgroup GAPBOND_PAIRING_STATE_DEFINES GAP Bond Manager Pairing States + * @{ + */ + + + +/** @} End GAPBOND_PAIRING_STATE_DEFINES */ + +/** @defgroup SMP_PAIRING_FAILED_DEFINES Pairing failure status values + * @{ + */ +#line 160 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\Roles\\gapbondmgr.h" +/** @} End SMP_PAIRING_FAILED_DEFINES */ + +/** @defgroup GAPBOND_BONDING_FAILURE_DEFINES Bonding Failure Actions + * @{ + */ + + + + +/** @} End GAPBOND_BONDING_FAILURE_DEFINES */ + +/*------------------------------------------------------------------- + * TYPEDEFS + */ + + +/** + * Passcode Callback Function + */ +typedef void (*pfnPasscodeCB_t) +( + uint8 *deviceAddr, //!< address of device to pair with, and could be either public or random. + uint16 connectionHandle, //!< Connection handle + uint8 uiInputs, //!< Pairing User Interface Inputs - Ask user to input passcode + uint8 uiOutputs //!< Pairing User Interface Outputs - Display passcode + ); + +/** + * Pairing State Callback Function + */ +typedef void (*pfnPairStateCB_t) +( + uint16 connectionHandle, //!< Connection handle + uint8 state, //!< Pairing state @ref GAPBOND_PAIRING_STATE_DEFINES + uint8 status //!< Pairing status +); + +/** + * Callback Registration Structure + */ +typedef struct +{ + pfnPasscodeCB_t passcodeCB; //!< Passcode callback + pfnPairStateCB_t pairStateCB; //!< Pairing state callback +} gapBondCBs_t; + +/*------------------------------------------------------------------- + * MACROS + */ + +/*------------------------------------------------------------------- + * API FUNCTIONS + */ + +/** + * @defgroup GAPROLES_BONDMGR_API GAP Bond Manager API Functions + * + * @{ + */ + +/** + * @brief Set a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will set the + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, + * the "len" field must be set to the size of a "uint16" and the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param len - length of data to write + * @param pValue - pointer to data to write. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ); + +/** + * @brief Get a GAP Bond Manager parameter. + * + * NOTE: You can call this function with a GAP Parameter ID and it will get a + * GAP Parameter. GAP Parameters are defined in (gap.h). Also, the + * "pValue" field must point to a "uint16". + * + * @param param - Profile parameter ID: @ref GAPBOND_PROFILE_PARAMETERS + * @param pValue - pointer to location to get the value. This is dependent on + * the parameter ID and WILL be cast to the appropriate + * data type (example: data type of uint16 will be cast to + * uint16 pointer). + * + * @return SUCCESS or INVALIDPARAMETER (invalid paramID) + */ +extern bStatus_t GAPBondMgr_GetParameter( uint16 param, void *pValue ); + +/** + * @brief Notify the Bond Manager that a connection has been made. + * + * NOTE: The GAP Peripheral/Central Role profile will + * call this function, if they are included in the project. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param connHandle - connection handle + * @param role - master or slave role. Reference GAP_PROFILE_ROLE_DEFINES in gap.h + * + * @return SUCCESS, otherwise failure + */ +extern bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role ); + +/** + * @brief Resolve an address from bonding information. + * + * @param addrType - device's address type. Reference GAP_ADDR_TYPE_DEFINES in gap.h + * @param pDevAddr - device's address + * @param pResolvedAddr - pointer to buffer to put the resolved address + * + * @return bonding index (0 - (GAP_BONDINGS_MAX-1) if found, + * GAP_BONDINGS_MAX if not found + */ +extern uint8 GAPBondMgr_ResolveAddr( uint8 addrType, uint8 *pDevAddr, uint8 *pResolvedAddr ); + +/** + * @brief Set/clear the service change indication in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param setParam - TRUE to set the service change indication, FALSE to clear it. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_ServiceChangeInd( uint16 connectionHandle, uint8 setParam ); + +/** + * @brief Update the Characteristic Configuration in a bond record. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param attrHandle - attribute handle. + * @param value - characteristic configuration value. + * + * @return SUCCESS - bond record found and changed,
+ * bleNoResources - bond record not found (for 0xFFFF connectionHandle),
+ * bleNotConnected - connection not found - connectionHandle is invalid (for non-0xFFFF connectionHandle). + */ +extern bStatus_t GAPBondMgr_UpdateCharCfg( uint16 connectionHandle, uint16 attrHandle, uint16 value ); + +/** + * @brief Register callback functions with the bond manager. + * + * NOTE: There is no need to register a passcode callback function + * if the passcode will be handled with the GAPBOND_DEFAULT_PASSCODE parameter. + * + * @param pCB - pointer to callback function structure. + * + * @return none + */ +extern void GAPBondMgr_Register( gapBondCBs_t *pCB ); + +/** + * @brief Respond to a passcode request. + * + * @param connectionHandle - connection handle of the connected device or 0xFFFF + * if all devices in database. + * @param status - SUCCESS if passcode is available, otherwise see @ref SMP_PAIRING_FAILED_DEFINES. + * @param passcode - integer value containing the passcode. + * + * @return SUCCESS - bond record found and changed,
+ * bleIncorrectMode - Link not found. + */ +extern bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode ); + +/** + * @brief This is a bypass mechanism to allow the bond manager to process + * GAP messages. + * + * NOTE: This is an advanced feature and shouldn't be called unless + * the normal GAP Bond Manager task ID registration is overridden. + * + * @param pMsg - GAP event message + * + * @return none + */ +extern void GAPBondMgr_ProcessGAPMsg( gapEventHdr_t *pMsg ); + +/** + * @brief This function will check the length of a Bond Manager NV Item. + * + * @param id - NV ID. + * @param len - lengths in bytes of item. + * + * @return SUCCESS or FAILURE + */ +extern uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len ); + +/** + * @} End GAPROLES_BONDMGR_API + */ + + + +/*------------------------------------------------------------------- + * TASK FUNCTIONS - Don't call these. These are system functions. + */ + +/** + * @internal + * + * @brief Initialization function for the GAP Bond Manager Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return void + */ +extern void GAPBondMgr_Init( uint8 task_id ); + +/** + * @internal + * + * @brief GAP Bond Manager Task event processor. + * This function is called to process all events for the task. + * Events include timers, messages and any other user defined + * events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +extern uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events ); + +/*------------------------------------------------------------------- +-------------------------------------------------------------------*/ + + + + + +#line 45 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.h" +/************************************************************************************************** + Filename: wimu.h + + Description: This file contains the WIMU application + (based on Simple BLE Peripheral sample application) + definitions and prototypes. + +**************************************************************************************************/ + + + + + + + + + +/********************************************************************* + * INCLUDES + */ + + +/********************************************************************* + * DATA TYPES + */ + +/********************************************************************* + * CONSTANTS + */ + +// Simple BLE Peripheral Task Events + + + + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * FUNCTIONS + */ + +/* + * Task Initialization for the BLE Application + */ +extern void WIMU_Init( uint8 task_id ); + +/* + * Task Event Processor for the BLE Application + */ +extern uint16 WIMU_ProcessEvent( uint8 task_id, uint16 events ); + +/********************************************************************* +*********************************************************************/ + + + + + +#line 47 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + +#line 1 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" +/************************************************************************************************** + Filename: st_util.h + Revised: $Date: 2012-11-27 14:16:18 -0800 (Tue, 27 Nov 2012) $ + Revision: $Revision: 32325 $ + + Description: Utilties for Sensor Tag services + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + + + + +/********************************************************************* + * MACROS + */ +#line 53 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\CC2540DB\\..\\..\\Profiles\\SensorProfile\\st_util.h" + +// Using 16-bit UUID + + + + + + +/*------------------------------------------------------------------- + * FUNCTIONS + */ + +/********************************************************************* + * @fn utilExtractUuid16 + * + * @brief Extracts a 16-bit UUID from a GATT attribute + * + * @param pAttr - pointer to attribute + * + * @param pValue - pointer to UUID to be extracted + * + * @return Success or Failure + */ +bStatus_t utilExtractUuid16(gattAttribute_t *pAttr, uint16 *pValue); + + + +#line 50 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + + + + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// ====== Debugging settings ====== +/* + For debugging purposes, code optomization was disabled. + It can be re-enabled in Options/ C/C++ compiler / Optimizations +*/ + +// If uncommented, data provided in packets is random +//#define WIMU_RANDOM_DATA + +// For debuggin purposes +//#define WIMU_DEBUG + + +// ====== WIMU UART settings ====== + + + +//#define WIMU_UART_BAUDRATE HAL_UART_BR_2400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_4800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_9600 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_14400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_19200 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_28800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_38400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_57600 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_76800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_115200 + + + + + + +// ====== WIMU Message Protocole ====== + + +#line 107 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + + +//#define WIMU_ACTIMETRY_DATALEN 40 // Expected data length for IMU Data, including header and CRC +//#define WIMU_BATTERY_DATALEN 5 // Expected data length for BATTERY Data, including header and CRC +//#define WIMU_GPS_NAVIGATION_DATALEN 103 // Expected data length for GPS Data, including header and CRC +//#define WIMU_DEVINFO_DATALEN 36 // Expected data length for Dev Info, including header and CRC + +// ====== Application configuration ====== + +// How often to perform periodic event + + +// ====== BLE stack configuration ====== + +// What is the advertising interval when device is discoverable (units of 625us, 160=100ms) + + +/* + This is set to true to renegotiate the connection interval +*/ +// Whether to enable automatic parameter update request when a connection is formed + + +// Limited discoverable mode advertises for 30.72s, and then stops +// General discoverable mode advertises indefinitely + + + + +/* + Adjust the connection interval so that there is less + than 4 notifications that have to be transferred on each connection + event. +*/ +// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled + + +// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled + + +// Slave latency to use if automatic parameter update request is enabled + + + +// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled + + +// Company Identifier: Texas Instruments Inc. (13) + + + + +// Length of bd addr as a string + + + + + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +//uint16 packetCount=0; +//bool sensorsReadEnabler = true; +//static uint16 numCalls=0; +//static uint16 seqNums[200]; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uint8 WIMU_TaskID; // Task ID for internal task/event processing + +// GAP - SCAN RSP data (max size = 31 bytes) +static uint8 scanRspData[] = +{ + // complete name + 0x0B, // length of this data + 0x09, + 'W', + 'I', + 'M', + 'U', + '3', + '-', + 'x', + 'x', + 'x', + 'x', + + // connection interval range + /* 0x05, // length of this data + GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, + LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), + HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), + LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), + HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), + + // Tx power level + 0x02, // length of this data + GAP_ADTYPE_POWER_LEVEL, + 0 // 0dBm*/ +}; + +// GAP - Advertisement data (max size = 31 bytes, though this is +// best kept short to conserve power while advertisting) +static uint8 advertData[] = +{ + // Flags; this sets the device to use limited discoverable + // mode (advertises for 30 seconds at a time) instead of general + // discoverable mode (advertises indefinitely) + 0x02, // length of this data + 0x01, + 0x02 | 0x04, + + // service UUID, to notify central devices what services are included + // in this peripheral + 0x07, // length of this data + + + + 0x02, + + // some of the UUID's, but not all + ((0x70ee) & 0xFF), (((0x70ee) >> 8) & 0xFF), + ((0x1819) & 0xFF), + (((0x1819) >> 8) & 0xFF), + ((0x180F) & 0xFF), + (((0x180F) >> 8) & 0xFF), + ((0x1805) & 0xFF), + (((0x1805) >> 8) & 0xFF) +}; + +// GAP GATT Attributes +static uint8 attDeviceName[5] = "WIMU3"; + +uint8 rx_byte[256]; +uint16 rx_index=0; +uint16 rx_len=0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void performPeriodicTask( void ); +static void WIMU_UARTCallback (uint8 port, uint8 event); +static void WIMU_updateProfileSensors( void ); +uint8 WIMU_getEndOfFrame_Position(void); +//void WIMU_SyncRX(); +// Consistent Overhead Byte Stuffing algorithm (COBS) implementation (https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing) +void COBS_StuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); +void COBS_UnStuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// GAP Role Callbacks +static gapRolesCBs_t WIMU_PeripheralCBs = +{ + ((void *) 0), // Profile State Change Callbacks + ((void *) 0) // When a valid RSSI is read from controller (not used by application) +}; + +// GAP Bond Manager Callbacks +static gapBondCBs_t WIMU_BondMgrCBs = +{ + ((void *) 0), // Passcode callback (not used by application) + ((void *) 0) // Pairing / Bonding state Callback (not used by application) +}; + + +static void WIMU_openUART( void ){ + + osal_memset(&rx_byte[0],0xFF, 256); + + halUARTCfg_t uartConf; + + uartConf.configured = 1; + uartConf.baudRate = 0x0A; + uartConf.flowControl = 0x00; + uartConf.flowControlThreshold=128; // Not used + uartConf.idleTimeout = 6; // Not used + uartConf.rx.maxBufSize = 256; // Not used + uartConf.tx.maxBufSize = 50; // Not used + uartConf.intEnable = 1; + uartConf.callBackFunc = &WIMU_UARTCallback; + + HalUARTOpen(0x01, &uartConf); + +}; + +void WIMU_requestDevInfo( void ){ + uint8 msg[2] = {4, 0}; + uint8 stuffed[4]; + + COBS_StuffData(&msg[0], 3, &stuffed[0]); + stuffed[3] = 0x00; + + HalUARTWrite(0x01, stuffed, 4); +} +/* +void WIMU_requestConfig( void ){ + uint8 msg[2] = {WIMU_MSGTYPE_CONFIG, 0}; + uint8 stuffed[4]; + + COBS_StuffData(&msg[0], 3, &stuffed[0]); + stuffed[3] = WIMU_SYNC_BYTE; + + HalUARTWrite(WIMU_UART_PORT, stuffed, 4); +}*/ + +void WIMU_setControlMode( uint8* config ){ + uint8 msg[2 + sizeof(RemControl_t)]; + msg[0] = 5; + msg[1] = sizeof(RemControl_t); + osal_memcpy(&msg[2], config, sizeof(RemControl_t)); + uint8 stuffed[2 + sizeof(RemControl_t) + 2]; + stuffed[2 + sizeof(RemControl_t) + 1] = 0x00; + + COBS_StuffData(&msg[0], 2 + sizeof(RemControl_t), &stuffed[0]); + + HalUARTWrite(0x01, stuffed, 2 + sizeof(RemControl_t) + 2); +} + +void WIMU_setCurrentTime( uint8* current ){ + uint8 msg[2 + sizeof(currentTime_t)]; + msg[0] = 6; + msg[1] = sizeof(currentTime_t); + osal_memcpy(&msg[2], current, sizeof(currentTime_t)); + + uint8 stuffed[2 + sizeof(currentTime_t) + 2]; + stuffed[2 + sizeof(currentTime_t) + 1] = 0x00; + + COBS_StuffData(&msg[0], 2 + sizeof(currentTime_t), &stuffed[0]); + + HalUARTWrite(0x01, stuffed, 2 + sizeof(currentTime_t) + 2); +} + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn WIMU_Init + * + * @brief Initialization function for the Simple BLE Peripheral App Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +void WIMU_Init( uint8 task_id ) +{ + WIMU_TaskID = task_id; + + // Setup the GAP Peripheral Role Profile + { + + // Start advertising upon initialization + uint8 initial_advertising_enable = 1; + + // By setting this to zero, the device will go into the waiting state after + // being discoverable for 30.72 seconds, and will not being advertising again + // until the enabler is set back to TRUE + uint16 gapRole_AdvertOffTime = 0; + + uint8 enable_update_request = 0; + uint16 desired_min_interval = 4; + uint16 desired_max_interval = 4; + uint16 desired_slave_latency = 0; + uint16 desired_conn_timeout = 1600; + + // Set the GAP Role Parameters + GAPRole_SetParameter( 0x305, sizeof( uint8 ), &initial_advertising_enable ); + GAPRole_SetParameter( 0x306, sizeof( uint16 ), &gapRole_AdvertOffTime ); + + GAPRole_SetParameter( 0x308, sizeof ( scanRspData ), scanRspData ); + GAPRole_SetParameter( 0x307, sizeof( advertData ), advertData ); + + GAPRole_SetParameter( 0x310, sizeof( uint8 ), &enable_update_request ); + GAPRole_SetParameter( 0x311, sizeof( uint16 ), &desired_min_interval ); + GAPRole_SetParameter( 0x312, sizeof( uint16 ), &desired_max_interval ); + GAPRole_SetParameter( 0x313, sizeof( uint16 ), &desired_slave_latency ); + GAPRole_SetParameter( 0x314, sizeof( uint16 ), &desired_conn_timeout ); + + } + + // Set the GAP Characteristics + uint8 devNamePermission = 0x01|0x02; + GGS_SetParameter( 6, sizeof ( uint8 ), &devNamePermission ); + GGS_SetParameter( 0, (20+1), attDeviceName ); + + // Set advertising interval + { + uint16 advInt = 160; + + GAP_SetParamValue( 6, advInt ); + GAP_SetParamValue( 7, advInt ); + GAP_SetParamValue( 8, advInt ); + GAP_SetParamValue( 9, advInt ); + } + + // Setup the GAP Bond Manager +/* { + uint32 passkey = 0; // passkey "000000" + uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; + uint8 mitm = TRUE; + uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; + uint8 bonding = TRUE; + GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); + GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode ); + GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm ); + GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap ); + GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding ); + }*/ + + // Initialize GATT attributes + GGS_AddService( 0xFFFFFFFF ); // GAP + GATTServApp_AddService( 0xFFFFFFFF ); // GATT attributes + + Actimetry_AddService( 0xFFFFFFFF ); // Actimetry Service + DevInfo_AddService(); // Device Information Service + Batt_AddService(); // Battery Service + Gps_AddService(0xFFFFFFFF); // Gps service + Time_AddService(); // Current Time Service + + + + + + + // Enable clock divide on halt + // This reduces active current while radio is active and CC254x MCU + // is halted + //HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT ); + +#line 468 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + // Initialize UART + HalUARTInit(); + + osal_memset(&rx_byte[rx_index],0xFF, 256); + + // Open UART + WIMU_openUART(); + + // Setup a delayed profile startup + osal_set_event( WIMU_TaskID, 0x0001 ); + + osal_set_event( WIMU_TaskID, 0x305); + + // Request dev info +// WIMU_requestDevInfo(); +} + +/********************************************************************* + * @fn WIMU_ProcessEvent + * + * @brief Simple BLE Peripheral Application Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +uint16 WIMU_ProcessEvent( uint8 task_id, uint16 events ) +{ + + (void) task_id; // OSAL required parameter that isn't used in this function +/////////////////////////////////////////////////////// + if ( events & 0x8000 ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( WIMU_TaskID )) != ((void *) 0) ) + { + //WIMU_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + (void) osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ 0x8000); + } +///////////////////////////////////////// + if ( events & 0x0001 ) + { + // Start the Device + (void) GAPRole_StartDevice( &WIMU_PeripheralCBs ); + + // Start Bond Manager + (void) GAPBondMgr_Register( &WIMU_BondMgrCBs ); + +// // Open UART + // WIMU_openUART(); + + // Set timer for first periodic event + osal_start_timerEx( WIMU_TaskID, 0x0002, 5 ); + + return ( events ^ 0x0001 ); + } +////////////////////////////////////////////// + if ( events & 0x0002 ) + { + // Restart timer + if ( 5 ) + { + osal_start_timerEx( WIMU_TaskID, 0x0002, 5 ); + } + + // Perform periodic application task + performPeriodicTask(); + + return (events ^ 0x0002); + } + +///////////////////////////////////////////// + if ( events & 0x305 ) + { + + // Request dev info + WIMU_requestDevInfo(); + + // Request module config + //WIMU_requestConfig(); + + return (events ^ 0x305); + } +///////////////////////////////////////////// + if ( events & 0x0008){ + //uint8 config; + uint8 config[sizeof(RemControl_t)]; + Actimetry_GetParameter(15, &config); + + WIMU_setControlMode(config); + + return (events ^ 0x0008); + } + +///////////////////////////////////////////// + if ( events & 0x0010){ + uint8 currentTime[sizeof(currentTime_t)]; + + Time_GetParameter(0, ¤tTime); + + WIMU_setCurrentTime(currentTime); + + return (events ^ 0x0010); + } + + + +#line 597 "D:\\Simon_Dev\\WIMuGPS\\Workspace\\openwimu\\Firmware\\Radio\\Projects\\Wimu\\Projects\\ble\\WIMU\\Source\\wimu.c" + + // Discard unknown events + return 0; +} + + +/********************************************************************* + * @fn performPeriodicTask + * + * @brief Perform a periodic application task. This function gets + * called every five seconds as a result of the SBP_PERIODIC_EVT + * OSAL event. In this example, the value of the third + * characteristic in the SimpleGATTProfile service is retrieved + * from the profile, and then copied into the value of the + * the fourth characteristic. + * + * @param none + * + * @return none + */ +static void performPeriodicTask( void ) +{ + +} + +/********************************************************************* + * @fn WIMU_UARTCallback + * + * @brief Called by the UART task when new data is received + * + * @param none + * + * @return none + */ +static void WIMU_UARTCallback(uint8 port, uint8 event) +{ + + if (port==0x01) { + WIMU_updateProfileSensors(); + } + +} + +/********************************************************************* + * @fn WIMU_updateProfileSensors + * + * @brief Called by the application to read sensors data + * and put data in profiles + * + * @param none + * + * @return none + */ + +static void WIMU_updateProfileSensors ( void ) +{ + static uint16 numBytes=0; + static uint8 msgCount=0; +// uint8 i; + uint8 end_pos=0; + uint8 msgType; + + // Process new data on UART port + numBytes = Hal_UART_RxBufLen(0x01); + if (numBytes>256){ + numBytes = 256; + } + if (rx_index+numBytes > 256){ + // Error: overflow detected! + rx_index=0; + } + + HalUARTRead (0x01, &rx_byte[rx_index], numBytes); // Read data + rx_index+=numBytes; + + // Check if we got the end of the message (SYNC byte) + end_pos = WIMU_getEndOfFrame_Position(); + + // Process message, if we got enough data + ///////////////////////////////////////// + while ( end_pos > 0){ + // Unpack the data + uint8 unstuffed[128]; + COBS_UnStuffData(&rx_byte[0], end_pos, &unstuffed[0]); + msgType = unstuffed[0]; + rx_len = unstuffed[1]; + msgCount++; + + switch(msgType){ + ///////////////// + // DEVICE INFO + ///////////////// + case 4:{ + WIMU_DevInfoFrame_t devinfo; + osal_memcpy(&devinfo,&unstuffed[2],sizeof(devinfo)); + //printf("DevInfo\n"); + + DevInfo_SetParameter( 2, 2, &devinfo.serialNumber ); + DevInfo_SetParameter( 4, sizeof(uint8), &devinfo.hardRevision ); + DevInfo_SetParameter( 3, 29, &devinfo.firmSoftRevision[0] ); + DevInfo_SetParameter( 5, 29, &devinfo.firmSoftRevision[0] ); + + if(scanRspData[8] == 'x' && scanRspData[9] == 'x' && scanRspData[10] == 'x' && scanRspData[11] == 'x') + { + uint8 serialNumber[4] = {0}; + sprintf ((char *)serialNumber, "00%X", devinfo.serialNumber); + scanRspData[8] = serialNumber[0]; + scanRspData[9] = serialNumber[1]; + scanRspData[10] = serialNumber[2]; + scanRspData[11] = serialNumber[3]; + GAP_UpdateAdvertisingData( WIMU_TaskID, 0, sizeof(scanRspData), scanRspData ); + } + + // Set sampling rate of the module + //Actimetry_SetParameter( ACTIMETRY_CONFIG, 1, &devinfo.samplingRate); + } + break; + + /////////////// + // Battery + /////////////// + case 3:{ // Battery Data + WIMU_battery_packet_t batteryData; + + // Process Data + osal_memcpy(&batteryData,&unstuffed[2],sizeof(batteryData)); + + // Update Battery values in the profile + Batt_SetParameter( 0, sizeof(WIMU_battery_packet_t), &batteryData ); + + //GAP_UpdateAdvertisingData( WIMU_TaskID, FALSE, sizeof(scanRspData), scanRspData ); + } + break; + + /////////////// + // IMU + /////////////// + case 1:{ //IMU Data{ + WIMU_actimetry_imu_packet_t imuData; + WIMU_actimetry_quaternion_packet_t quaternionData; + osal_memcpy(&imuData,&unstuffed[2],sizeof(imuData)); + osal_memcpy(&quaternionData,&unstuffed[2 + sizeof(imuData)],sizeof(WIMU_actimetry_quaternion_packet_t)); + + // Update Actimetry values in the profile + Actimetry_SetParameter( 12, sizeof(WIMU_actimetry_imu_packet_t), &imuData ); + Actimetry_SetParameter( 13, sizeof(WIMU_actimetry_quaternion_packet_t), &quaternionData ); + } + break; + + /////////////// + // GPS + /////////////// + case 2:{ + WIMU_GPSFrame_t gpsData; + osal_memcpy(&gpsData,&unstuffed[2],sizeof(gpsData)); + + // Update values in profile + Gps_SetParameter( 1, sizeof(locationAndSpeed_t), &gpsData.loc_speed ); + Gps_SetParameter( 2, sizeof(positionQuality_t), &gpsData.quality ); + Gps_SetParameter( 3, sizeof(date_time_t), &gpsData.date_time ); + } + break; + + // Date and time + case 6:{ + currentTime_t currentTime; + osal_memcpy(¤tTime,&unstuffed[2],sizeof(currentTime)); + Time_SetParameter(0, sizeof(currentTime_t), ¤tTime ); + } break; + + // WIMU Config + case 7:{ + //printf("Config\n"); + IMU_Config_t config; + osal_memcpy(&config, &unstuffed[2], sizeof(IMU_Config_t)); + Actimetry_SetParameter( 14, sizeof(IMU_Config_t), &config); + }break; + + // WIMU Control + case 5:{ + RemControl_t control; + osal_memcpy(&control, &unstuffed[2], sizeof(RemControl_t)); + Actimetry_SetParameter( 15, sizeof(RemControl_t), &control); + }break; + + + default: + break; + } + + // Remove bytes from data buffer + //printf("#%d: %d, %d\n\r", msgCount, unstuffed[0], unstuffed[1]); + osal_memcpy(&rx_byte[0],&rx_byte[end_pos+1],rx_index - end_pos); + rx_index -= end_pos+1; + osal_memset(&rx_byte[rx_index],0xFF, 256 - rx_index - 1); + + end_pos = WIMU_getEndOfFrame_Position(); + } + +} + +uint8 WIMU_getEndOfFrame_Position(void){ + uint8 end_pos=0; + uint16 i; + for (i=0; iseq = seq; +// +// packet->acc.x = osal_rand(); +// packet->acc.y = osal_rand(); +// packet->acc.z = osal_rand(); +// +// packet->gyr.x = osal_rand(); +// packet->gyr.y = osal_rand(); +// packet->gyr.z = osal_rand(); +// +// packet->mag.x = osal_rand(); +// packet->mag.y = osal_rand(); +// packet->mag.z = osal_rand(); +//} +// +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet){ +// return; +//} diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL.r51 new file mode 100644 index 0000000..a995d20 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_ClockBLE.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_ClockBLE.r51 new file mode 100644 index 0000000..e87599b Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_ClockBLE.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Memory.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Memory.r51 new file mode 100644 index 0000000..a8e8c45 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Memory.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_PwrMgr.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_PwrMgr.r51 new file mode 100644 index 0000000..8e1bd31 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_PwrMgr.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Timers.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Timers.r51 new file mode 100644 index 0000000..a37687c Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_Timers.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_WIMU.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_WIMU.r51 new file mode 100644 index 0000000..d6227e1 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OSAL_WIMU.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OnBoard.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OnBoard.r51 new file mode 100644 index 0000000..0406002 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/OnBoard.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU.pbd b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU.pbd new file mode 100644 index 0000000..de8b0d9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU.pbd @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +11:09 14s +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_ClockBLE.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Memory.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_PwrMgr.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_Timers.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OSAL_WIMU.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\OnBoard.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\WIMU_Main.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\actimetryservice.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\battservice.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\devinfoservice.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gap.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gapbondmgr.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gatt_uuid.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\gpsservice.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_adc.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_aes.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_crc.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_dma.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_drivers.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_flash.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_key.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_led.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_sleep.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_startup.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_timer.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\hal_uart.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\npi.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_bufmgr.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_cbtimer.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\osal_snv.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\peripheral.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\st_util.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\timeservice.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu.pbi +D:\Simon_Dev\WIMuGPS\Workspace\openwimu\Firmware\Radio\Projects\Wimu\Projects\ble\WIMU\CC2540DB\CC2540F128-WIMU\Obj\wimu_util.pbi diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU_Main.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU_Main.r51 new file mode 100644 index 0000000..bf39d15 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/WIMU_Main.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/actimetryservice.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/actimetryservice.r51 new file mode 100644 index 0000000..e6c9fc3 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/actimetryservice.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/battservice.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/battservice.r51 new file mode 100644 index 0000000..50b3abf Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/battservice.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/devinfoservice.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/devinfoservice.r51 new file mode 100644 index 0000000..6a699c8 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/devinfoservice.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gap.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gap.r51 new file mode 100644 index 0000000..0dc7720 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gap.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gapbondmgr.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gapbondmgr.r51 new file mode 100644 index 0000000..63f0e6a Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gapbondmgr.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gatt_uuid.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gatt_uuid.r51 new file mode 100644 index 0000000..a3f7051 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gatt_uuid.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gpsservice.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gpsservice.r51 new file mode 100644 index 0000000..08a4531 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/gpsservice.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_adc.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_adc.r51 new file mode 100644 index 0000000..628add0 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_adc.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_aes.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_aes.r51 new file mode 100644 index 0000000..0caaae7 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_aes.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_crc.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_crc.r51 new file mode 100644 index 0000000..cd36d64 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_crc.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_dma.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_dma.r51 new file mode 100644 index 0000000..16d6d90 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_dma.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_drivers.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_drivers.r51 new file mode 100644 index 0000000..78bceb6 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_drivers.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_flash.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_flash.r51 new file mode 100644 index 0000000..356955c Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_flash.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_key.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_key.r51 new file mode 100644 index 0000000..a4b3dd6 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_key.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_lcd.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_lcd.r51 new file mode 100644 index 0000000..0cfa621 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_lcd.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_led.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_led.r51 new file mode 100644 index 0000000..267e9f4 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_led.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_sleep.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_sleep.r51 new file mode 100644 index 0000000..36c361b Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_sleep.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_startup.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_startup.r51 new file mode 100644 index 0000000..af376d6 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_startup.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_timer.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_timer.r51 new file mode 100644 index 0000000..3ddbfc2 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_timer.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_uart.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_uart.r51 new file mode 100644 index 0000000..9050884 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/hal_uart.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/npi.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/npi.r51 new file mode 100644 index 0000000..5904d23 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/npi.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_bufmgr.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_bufmgr.r51 new file mode 100644 index 0000000..490271c Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_bufmgr.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_cbtimer.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_cbtimer.r51 new file mode 100644 index 0000000..2d65f90 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_cbtimer.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_snv.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_snv.r51 new file mode 100644 index 0000000..b57da4e Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/osal_snv.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/peripheral.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/peripheral.r51 new file mode 100644 index 0000000..719c0ab Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/peripheral.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/simpleGATTprofile.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/simpleGATTprofile.r51 new file mode 100644 index 0000000..aede3fe Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/simpleGATTprofile.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/st_util.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/st_util.r51 new file mode 100644 index 0000000..523d3c0 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/st_util.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/timeservice.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/timeservice.r51 new file mode 100644 index 0000000..7379aaa Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/timeservice.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu.r51 new file mode 100644 index 0000000..a12088f Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu_util.r51 b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu_util.r51 new file mode 100644 index 0000000..9766bb0 Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/CC2540F128-WIMU/Obj/wimu_util.r51 differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU - Copie.ewp b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU - Copie.ewp new file mode 100644 index 0000000..0ba3556 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU - Copie.ewp @@ -0,0 +1,10080 @@ + + + + 2 + + CC2540DK-MINI Keyfob + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540 + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540F128DK-MINI Keyfob + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540F128 + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540-OAD-ImgA + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2540-OAD-ImgA\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540-OAD-ImgB + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2540-OAD-ImgB\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540-OAD-Encrypted-ImgA + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2540-OAD-Encrypted-ImgA\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540-OAD-Encrypted-ImgB + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2540-OAD-Encrypted-ImgB\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2540F128-WIMU + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 5 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + APP + + $PROJ_DIR$\..\Source\OSAL_WIMU.c + + + $PROJ_DIR$\..\Source\wimu.c + + + $PROJ_DIR$\..\Source\wimu.h + + + $PROJ_DIR$\..\Source\WIMU_Main.c + + + $PROJ_DIR$\..\..\util\WIMU\wimu_util.c + + + $PROJ_DIR$\..\..\util\WIMU\wimu_util.h + + + + HAL + + Common + + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + + + + Include + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_adc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_assert.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_board.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_defs.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_drivers.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_flash.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_key.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_lcd.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_led.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_rpc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_sleep.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_timer.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_uart.h + + + $PROJ_DIR$\..\..\..\..\Components\services\saddr\saddr.h + + + + Target + + CC2540EB + + Config + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_board_cfg.h + + + + Drivers + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + + + + Includes + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_ccm.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_mcu.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_types.h + + + + + + + INCLUDE + + $PROJ_DIR$\..\..\..\..\Components\ble\include\att.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt_uuid.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\hci.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\l2cap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\linkdb.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll.h + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\phy.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\sm.h + + + + LIB + + $PROJ_DIR$\..\..\Libraries\CC2540DB\bin\CC2540_BLE_peri.lib + + + $PROJ_DIR$\..\..\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + + + + NPI + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi_spi.c + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi_uart.c + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + + OSAL + + $PROJ_DIR$\..\..\..\..\Components\ble\include\bcomdef.h + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + + + + PROFILES + + $PROJ_DIR$\..\..\Profiles\Actimetry\actimetryservice.c + + + $PROJ_DIR$\..\..\Profiles\Actimetry\actimetryservice.h + + + $PROJ_DIR$\..\..\Profiles\Batt\battservice.c + + + $PROJ_DIR$\..\..\Profiles\Batt\battservice.h + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.h + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.h + + + $PROJ_DIR$\..\..\Include\gapgattserver.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + + + $PROJ_DIR$\..\..\Include\gattservapp.h + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hid_uuid.h + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.c + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.h + + + $PROJ_DIR$\..\..\Profiles\OAD\oad.h + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.c + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.h + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.h + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.c + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.h + + CC2540DK-MINI Keyfob + CC2540 + CC2540F128DK-MINI Keyfob + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.h + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + + CC2540 + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.h + + CC2540 + CC2540F128 + CC2540-OAD-ImgA + CC2540-OAD-ImgB + CC2540-OAD-Encrypted-ImgA + CC2540-OAD-Encrypted-ImgB + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\SensorProfile\st_util.c + + + $PROJ_DIR$\..\..\Profiles\SensorProfile\st_util.h + + + + TOOLS + + $PROJ_DIR$\..\..\config\buildComponents.cfg + + + $PROJ_DIR$\buildConfig.cfg + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.h + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.dep b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.dep new file mode 100644 index 0000000..12f8c95 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.dep @@ -0,0 +1,1096 @@ + + + + 2 + 1037765366 + + CC2540F128-WIMU + + $PROJ_DIR$\..\Source\wimu.h + $PROJ_DIR$\..\Source\wimu.c + $PROJ_DIR$\..\Source\OSAL_WIMU.c + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL_Timers.h + $PROJ_DIR$\CC2540F128-WIMU\List\npi.i + $PROJ_DIR$\CC2540F128-WIMU\List\gapbondmgr.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\gap.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_uart.pbi + $PROJ_DIR$\..\Source\WIMU_Main.c + $PROJ_DIR$\..\..\util\WIMU\wimu_util.c + $PROJ_DIR$\..\..\util\WIMU\wimu_util.h + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\common\hal_drivers.c + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_adc.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_assert.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_board.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_defs.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_drivers.h + $PROJ_DIR$\CC2540F128-WIMU\List\hal_aes.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_adc.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\osal_bufmgr.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_startup.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_sleep.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\actimetryservice.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\battservice.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\actimetryservice.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_snv.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\hal_flash.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\OnBoard.pbi + $PROJ_DIR$\..\..\..\..\Components\osal\include\osal_cbtimer.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_sleep.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_key.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL_ClockBLE.i + $PROJ_DIR$\CC2540F128-WIMU\List\hal_dma.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\wimu.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\peripheral.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\WIMU.pbd + $TOOLKIT_DIR$\lib\clib\cl-pli-blxd-1e16x01.r51 + $PROJ_DIR$\CC2540F128-WIMU\Exe\WIMU.hex + $PROJ_DIR$\CC2540F128-WIMU\List\st_util.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_PwrMgr.r51 + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL_Tasks.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_aes.r51 + $PROJ_DIR$\..\..\..\..\Components\ble\hci\hci_tl.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_WIMU.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_ClockBLE.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\devinfoservice.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_startup.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\WIMU_Main.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_led.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_timer.pbi + $PROJ_DIR$\..\..\..\..\Components\osal\include\comdef.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_flash.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL_PwrMgr.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\gapbondmgr.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\OnBoard.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\wimu_util.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\timeservice.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\timeservice.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\timeservice.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_aes.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_adc.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_crc.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\gpsservice.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_timer.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\osal_snv.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_Timers.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\wimu.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\WIMU_Main.r51 + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll_sleep.h + $PROJ_DIR$\CC2540F128-WIMU\List\devinfoservice.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_dma.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\gapbondmgr.r51 + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll_timer2.h + $PROJ_DIR$\CC2540F128-WIMU\Exe\WIMU.d51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\gatt_uuid.pbi + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL_WIMU.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_bufmgr.pbi + $PROJ_DIR$\..\..\..\..\Components\osal\include\osal_snv.h + $PROJ_DIR$\..\..\..\..\Components\ble\hci\hci_event.h + $PROJ_DIR$\CC2540F128-WIMU\List\gap.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\wimu.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_cbtimer.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\hal_drivers.i + $PROJ_DIR$\CC2540F128-WIMU\List\hal_sleep.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_cbtimer.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_bufmgr.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\gatt_uuid.i + $TOOLKIT_DIR$\inc\clib\string.h + $PROJ_DIR$\CC2540F128-WIMU\List\hal_startup.i + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL.i + $TOOLKIT_DIR$\inc\ioCC2540.h + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll_math.h + $PROJ_DIR$\CC2540F128-WIMU\List\WIMU.map + $PROJ_DIR$\CC2540F128-WIMU\List\hal_adc.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_flash.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_drivers.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\osal_snv.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_crc.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\WIMU_Main.i + $PROJ_DIR$\CC2540F128-WIMU\List\hal_crc.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_Memory.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\npi.pbi + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\_hal_uart_dma.c + $PROJ_DIR$\CC2540F128-WIMU\List\gpsservice.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_led.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\devinfoservice.r51 + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\gatt_uuid.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_key.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\gpsservice.pbi + $PROJ_DIR$\CC2540F128-WIMU\List\peripheral.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\st_util.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\battservice.i + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL_Clock.h + $TOOLKIT_DIR$\inc\clib\stdarg.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_Timers.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_ClockBLE.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\wimu_util.i + $PROJ_DIR$\..\..\..\..\Components\osal\include\osal_bufmgr.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_drivers.r51 + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL_PwrMgr.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_PwrMgr.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\wimu_util.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\actimetryservice.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\st_util.pbi + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL_Memory.i + $PROJ_DIR$\CC2540F128-WIMU\List\OSAL_Timers.i + $PROJ_DIR$\CC2540F128-WIMU\List\OnBoard.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\npi.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\hal_key.i + $PROJ_DIR$\..\..\common\cc2540\ti_51ew_cc2540f128b.xcl + $TOOLKIT_DIR$\inc\clib\limits.h + $PROJ_DIR$\CC2540F128-WIMU\List\hal_timer.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\peripheral.pbi + $TOOLKIT_DIR$\inc\clib\sysmac.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_Memory.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_dma.r51 + $PROJ_DIR$\CC2540F128-WIMU\Obj\OSAL_WIMU.pbi + $PROJ_DIR$\CC2540F128-WIMU\Obj\battservice.pbi + $PROJ_DIR$\CC2540F128-WIMU\List\osal_cbtimer.i + $PROJ_DIR$\..\..\..\..\Components\ble\hci\hci_data.h + $PROJ_DIR$\CC2540F128-WIMU\Obj\hal_uart.r51 + $PROJ_DIR$\CC2540F128-WIMU\List\hal_led.i + $PROJ_DIR$\CC2540F128-WIMU\Obj\gap.pbi + $PROJ_DIR$\..\..\..\..\Components\osal\include\OSAL_Memory.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_flash.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_key.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_lcd.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_led.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_sleep.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_timer.h + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_uart.h + $PROJ_DIR$\..\..\..\..\Components\services\saddr\saddr.h + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_board_cfg.h + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_startup.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_uart.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_types.h + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.h + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.h + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_dma.h + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_mcu.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\att.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\gap.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt_uuid.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\hci.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\l2cap.h + $PROJ_DIR$\..\..\..\..\Components\ble\host\linkdb.h + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll.h + $PROJ_DIR$\..\..\common\npi\npi_np\npi.h + $PROJ_DIR$\..\..\..\..\Components\ble\include\sm.h + $PROJ_DIR$\..\..\Libraries\CC2540DB\bin\CC2540_BLE_peri.lib + $PROJ_DIR$\..\..\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + $PROJ_DIR$\..\..\..\..\Components\ble\include\bcomdef.h + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_ClockBLE.c + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Memory.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Timers.c + $PROJ_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.c + $PROJ_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.h + $PROJ_DIR$\..\..\Profiles\Batt\battservice.c + $PROJ_DIR$\..\..\Profiles\Batt\battservice.h + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.h + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.h + $PROJ_DIR$\..\..\Include\gapgattserver.h + $PROJ_DIR$\..\..\..\..\COMPONENTS\ble\host\gatt_uuid.c + $PROJ_DIR$\..\..\Include\gattservapp.h + $PROJ_DIR$\..\..\Profiles\GPS\gpsservice.c + $PROJ_DIR$\..\..\Profiles\GPS\gpsservice.h + $PROJ_DIR$\..\..\Profiles\HIDDev\hid_uuid.h + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.c + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.h + $PROJ_DIR$\..\..\Profiles\OAD\oad.h + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.c + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.h + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.h + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.c + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.h + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.h + $PROJ_DIR$\..\..\Profiles\SENSORPROFILE\st_util.c + $PROJ_DIR$\..\..\Profiles\SensorProfile\st_util.h + $PROJ_DIR$\..\..\Profiles\TimeService\timeservice.c + $PROJ_DIR$\..\..\Profiles\TimeService\timeservice.h + $PROJ_DIR$\..\..\config\buildComponents.cfg + $PROJ_DIR$\buildConfig.cfg + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + $PROJ_DIR$\..\..\common\cc2540\OnBoard.h + $TOOLKIT_DIR$\inc\clib\stdio.h + $PROJ_DIR$\CC2540F128-WIMU\List\hal_uart.i + + + $PROJ_DIR$\..\Source\wimu.c + + + BICOMP + 80 + + + ICC8051 + 66 33 + + + + + BICOMP + 228 115 136 185 50 167 15 107 133 146 3 121 227 171 91 151 12 14 155 150 148 149 153 174 172 177 176 179 13 203 205 198 197 195 207 10 223 215 202 173 181 0 221 + + + ICC8051 + 224 225 228 115 136 185 50 167 15 107 133 146 3 121 227 171 91 151 12 14 155 150 148 149 153 174 172 177 176 179 13 203 205 198 197 195 207 10 223 215 202 173 181 0 221 + + + + + $PROJ_DIR$\..\Source\OSAL_WIMU.c + + + BICOMP + 139 + + + ICC8051 + 75 43 + + + + + BICOMP + 167 107 133 136 50 15 146 3 40 16 179 185 42 176 13 153 14 155 171 91 142 119 78 28 177 173 181 203 202 174 172 205 215 0 + + + ICC8051 + 224 225 167 107 133 136 50 15 146 3 40 16 179 185 42 176 13 153 14 155 171 91 142 119 78 28 177 173 181 203 202 174 172 205 215 0 + + + + + $PROJ_DIR$\..\Source\WIMU_Main.c + + + BICOMP + 47 + + + ICC8051 + 99 67 + + + + + BICOMP + 167 148 14 155 171 15 91 152 16 150 107 133 136 50 146 3 40 121 77 227 151 + + + ICC8051 + 224 225 167 148 14 155 171 15 91 152 16 150 107 133 136 50 146 3 40 121 77 227 151 + + + + + $PROJ_DIR$\..\..\util\WIMU\wimu_util.c + + + BICOMP + 55 + + + ICC8051 + 118 123 + + + + + ICC8051 + 224 225 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\common\hal_drivers.c + + + BICOMP + 96 + + + ICC8051 + 82 120 + + + + + BICOMP + 12 167 14 155 171 15 91 168 170 16 148 149 150 151 152 153 107 133 136 50 146 3 + + + ICC8051 + 224 225 12 167 14 155 171 15 91 168 170 16 148 149 150 151 152 153 107 133 136 50 146 3 + + + + + $PROJ_DIR$\CC2540F128-WIMU\Obj\WIMU.pbd + + + BILINK + 129 44 137 122 116 139 27 47 24 140 45 145 53 74 110 60 59 61 70 96 95 109 48 21 46 49 7 102 76 84 97 135 125 56 80 55 + + + + + [ROOT_NODE] + + + XLINK + 73 93 37 + + + + + $PROJ_DIR$\CC2540F128-WIMU\Exe\WIMU.d51 + + + XLINK + 93 37 + + + + + XLINK + 132 182 183 85 117 101 39 65 43 54 67 22 23 106 6 71 108 62 18 41 98 138 120 51 30 105 29 20 63 143 130 86 81 25 34 112 57 33 123 36 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + BICOMP + 95 + + + ICC8051 + 26 51 + + + + + BICOMP + 155 171 15 167 91 170 14 147 + + + ICC8051 + 224 225 155 171 15 167 91 170 14 147 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + BICOMP + 60 + + + ICC8051 + 94 18 + + + + + BICOMP + 12 167 14 155 171 15 91 + + + ICC8051 + 224 225 12 167 14 155 171 15 91 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + BICOMP + 59 + + + ICC8051 + 17 41 + + + + + BICOMP + 107 133 136 50 167 15 146 3 168 170 14 155 171 91 + + + ICC8051 + 224 225 107 133 136 50 167 15 146 3 168 170 14 155 171 91 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + BICOMP + 61 + + + ICC8051 + 100 98 + + + + + BICOMP + 14 155 171 15 167 91 169 + + + ICC8051 + 224 225 14 155 171 15 167 91 169 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + BICOMP + 70 + + + ICC8051 + 32 138 + + + + + BICOMP + 170 14 155 171 15 167 91 153 + + + ICC8051 + 224 225 170 14 155 171 15 167 91 153 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + BICOMP + 21 + + + ICC8051 + 83 29 + + + + + BICOMP + 167 171 15 91 14 155 151 150 148 107 133 136 50 146 3 40 121 16 13 68 185 72 92 + + + ICC8051 + 224 225 167 171 15 91 14 155 151 150 148 107 133 136 50 146 3 40 121 16 13 68 185 72 92 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + BICOMP + 109 + + + ICC8051 + 131 30 + + + + + BICOMP + 171 15 167 91 16 12 14 155 148 107 133 136 50 146 3 + + + ICC8051 + 224 225 171 15 167 91 16 12 14 155 148 107 133 136 50 146 3 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + BICOMP + 48 + + + ICC8051 + 144 105 + + + + + BICOMP + 171 15 167 91 16 150 14 155 107 133 136 50 146 3 + + + ICC8051 + 224 225 171 15 167 91 16 150 14 155 107 133 136 50 146 3 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_startup.c + + + BICOMP + 46 + + + ICC8051 + 89 20 + + + + + BICOMP + 14 155 171 15 167 91 + + + ICC8051 + 224 225 14 155 171 15 167 91 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + BICOMP + 49 + + + ICC8051 + 134 63 + + + + + ICC8051 + 224 225 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_uart.c + + + BICOMP + 7 + + + ICC8051 + 229 143 + + + + + BICOMP + 155 171 15 167 91 16 153 14 103 88 136 13 170 + + + ICC8051 + 224 225 155 171 15 167 91 16 153 14 103 88 136 13 170 + + + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + BICOMP + 102 + + + ICC8051 + 4 130 + + + + + BICOMP + 167 14 155 171 15 91 180 153 + + + ICC8051 + 224 225 167 14 155 171 15 91 180 153 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL.c + + + BICOMP + 129 + + + ICC8051 + 90 85 + + + + + BICOMP + 88 136 50 167 15 14 155 171 91 107 133 146 3 40 121 114 227 151 16 + + + ICC8051 + 224 225 88 136 50 167 15 14 155 171 91 107 133 146 3 40 121 114 227 151 16 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + BICOMP + 76 + + + ICC8051 + 19 86 + + + + + BICOMP + 107 133 136 50 167 15 146 3 227 171 91 151 119 + + + ICC8051 + 224 225 107 133 136 50 167 15 146 3 227 171 91 151 119 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + BICOMP + 84 + + + ICC8051 + 141 81 + + + + + BICOMP + 107 133 136 50 167 15 146 3 40 28 + + + ICC8051 + 224 225 107 133 136 50 167 15 146 3 40 28 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_ClockBLE.c + + + BICOMP + 44 + + + ICC8051 + 31 117 + + + + + BICOMP + 50 167 15 227 171 91 151 107 133 136 146 3 114 + + + ICC8051 + 224 225 50 167 15 227 171 91 151 107 133 136 146 3 114 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Memory.c + + + BICOMP + 137 + + + ICC8051 + 126 101 + + + + + BICOMP + 50 167 15 107 133 136 146 3 227 171 91 151 13 + + + ICC8051 + 224 225 50 167 15 107 133 136 146 3 227 171 91 151 13 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + BICOMP + 122 + + + ICC8051 + 52 39 + + + + + BICOMP + 50 167 15 227 171 91 151 107 133 136 146 3 40 121 + + + ICC8051 + 224 225 50 167 15 227 171 91 151 107 133 136 146 3 40 121 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + BICOMP + 97 + + + ICC8051 + 64 25 + + + + + BICOMP + 12 167 14 155 171 15 91 147 50 107 133 136 146 3 77 13 154 + + + ICC8051 + 224 225 12 167 14 155 171 15 91 147 50 107 133 136 146 3 77 13 154 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Timers.c + + + BICOMP + 116 + + + ICC8051 + 127 65 + + + + + BICOMP + 50 167 15 227 171 91 151 107 133 136 146 3 152 14 155 + + + ICC8051 + 224 225 50 167 15 227 171 91 151 107 133 136 146 3 152 14 155 + + + + + $PROJ_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.c + + + BICOMP + 24 + + + ICC8051 + 124 22 + + + + + BICOMP + 185 50 167 15 178 174 107 133 136 146 3 172 177 175 205 195 10 221 + + + ICC8051 + 224 225 185 50 167 15 178 174 107 133 136 146 3 172 177 175 205 195 10 221 + + + + + $PROJ_DIR$\..\..\Profiles\Batt\battservice.c + + + BICOMP + 140 + + + ICC8051 + 113 23 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 12 14 155 171 91 178 172 177 174 175 205 208 210 197 10 221 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 12 14 155 171 91 178 172 177 174 175 205 208 210 197 10 221 + + + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + BICOMP + 45 + + + ICC8051 + 69 106 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 178 172 177 174 175 205 198 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 178 172 177 174 175 205 198 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + BICOMP + 145 + + + ICC8051 + 79 6 + + + + + BICOMP + 185 50 167 15 173 107 133 136 146 3 181 + + + ICC8051 + 224 225 185 50 167 15 173 107 133 136 146 3 181 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + BICOMP + 53 + + + ICC8051 + 5 71 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 77 173 181 178 174 172 177 175 176 179 13 205 203 202 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 77 173 181 178 174 172 177 175 176 179 13 205 203 202 + + + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\ble\host\gatt_uuid.c + + + BICOMP + 74 + + + ICC8051 + 87 108 + + + + + BICOMP + 50 167 15 107 133 136 146 3 174 185 172 177 175 + + + ICC8051 + 224 225 50 167 15 107 133 136 146 3 174 185 172 177 175 + + + + + $PROJ_DIR$\..\..\Profiles\GPS\gpsservice.c + + + BICOMP + 110 + + + ICC8051 + 104 62 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 178 172 177 174 175 205 202 173 181 207 10 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 178 172 177 174 175 205 202 173 181 207 10 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + BICOMP + 135 + + + ICC8051 + 111 34 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 42 176 179 13 153 14 155 171 91 142 119 78 177 173 181 178 172 174 77 215 202 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 42 176 179 13 153 14 155 171 91 142 119 78 177 173 181 178 172 174 77 215 202 + + + + + $PROJ_DIR$\..\..\Profiles\SENSORPROFILE\st_util.c + + + BICOMP + 125 + + + ICC8051 + 38 112 + + + + + BICOMP + 185 50 167 15 174 107 133 136 146 3 172 177 221 + + + ICC8051 + 224 225 185 50 167 15 174 107 133 136 146 3 172 177 221 + + + + + $PROJ_DIR$\..\..\Profiles\TimeService\timeservice.c + + + BICOMP + 56 + + + ICC8051 + 58 57 + + + + + BICOMP + 185 50 167 15 107 133 136 146 3 12 14 155 171 91 178 172 177 174 175 205 208 210 223 10 221 + + + ICC8051 + 224 225 185 50 167 15 107 133 136 146 3 12 14 155 171 91 178 172 177 174 175 205 208 210 223 10 221 + + + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + BICOMP + 27 + + + ICC8051 + 128 54 + + + + + BICOMP + 185 50 167 15 227 171 91 151 107 133 136 146 3 150 14 155 148 + + + ICC8051 + 224 225 185 50 167 15 227 171 91 151 107 133 136 146 3 150 14 155 148 + + + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewd b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewd new file mode 100644 index 0000000..a062745 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewd @@ -0,0 +1,637 @@ + + + 2 + + CC2540F128-WIMU + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewp b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewp new file mode 100644 index 0000000..2e5f2c4 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.ewp @@ -0,0 +1,1731 @@ + + + + 2 + + CC2540F128-WIMU + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + APP + + $PROJ_DIR$\..\Source\OSAL_WIMU.c + + + $PROJ_DIR$\..\Source\wimu.c + + + $PROJ_DIR$\..\Source\wimu.h + + + $PROJ_DIR$\..\Source\WIMU_Main.c + + + $PROJ_DIR$\..\..\util\WIMU\wimu_util.c + + + $PROJ_DIR$\..\..\util\WIMU\wimu_util.h + + + + HAL + + Common + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\common\hal_drivers.c + + + + Include + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_adc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_assert.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_board.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_defs.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_drivers.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_flash.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_key.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_lcd.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_led.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_rpc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_sleep.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_timer.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_uart.h + + + $PROJ_DIR$\..\..\..\..\Components\services\saddr\saddr.h + + + + Target + + CC2540EB + + Config + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_board_cfg.h + + + + Drivers + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_startup.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_uart.c + + + + Includes + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_ccm.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_mcu.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_types.h + + + + + + + INCLUDE + + $PROJ_DIR$\..\..\..\..\Components\ble\include\att.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt_uuid.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\hci.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\l2cap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\linkdb.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll.h + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\phy.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\sm.h + + + + LIB + + $PROJ_DIR$\..\..\Libraries\CC2540DB\bin\CC2540_BLE_peri.lib + + + $PROJ_DIR$\..\..\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + + + + NPI + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi_spi.c + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi_uart.c + + CC2540F128-WIMU + + + + + OSAL + + $PROJ_DIR$\..\..\..\..\Components\ble\include\bcomdef.h + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_ClockBLE.c + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Memory.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Timers.c + + + + PROFILES + + $PROJ_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.c + + CC2540F128-WIMU + + ICC8051 + + 9 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\..\..\Profiles\Actimetry\actimetryservice.h + + + $PROJ_DIR$\..\..\Profiles\Batt\battservice.c + + + $PROJ_DIR$\..\..\Profiles\Batt\battservice.h + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.h + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.h + + + $PROJ_DIR$\..\..\Include\gapgattserver.h + + + $PROJ_DIR$\..\..\..\..\COMPONENTS\ble\host\gatt_uuid.c + + + $PROJ_DIR$\..\..\Include\gattservapp.h + + + $PROJ_DIR$\..\..\Profiles\GPS\gpsservice.c + + + $PROJ_DIR$\..\..\Profiles\GPS\gpsservice.h + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hid_uuid.h + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.c + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\HIDDev\hiddev.h + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad.h + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.c + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.h + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.h + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.c + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.h + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.h + + CC2540F128-WIMU + + + + $PROJ_DIR$\..\..\Profiles\SENSORPROFILE\st_util.c + + + $PROJ_DIR$\..\..\Profiles\SensorProfile\st_util.h + + + $PROJ_DIR$\..\..\Profiles\TimeService\timeservice.c + + + $PROJ_DIR$\..\..\Profiles\TimeService\timeservice.h + + + + TOOLS + + $PROJ_DIR$\..\..\config\buildComponents.cfg + + + $PROJ_DIR$\buildConfig.cfg + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.h + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.eww b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.eww new file mode 100644 index 0000000..de681e9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMU.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\WIMU.ewp + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMUCustomSfr.sfr b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMUCustomSfr.sfr new file mode 100644 index 0000000..241820a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/WIMUCustomSfr.sfr @@ -0,0 +1,4 @@ +[Sfr] + + +[SfrGroupInfo] \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/buildConfig.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/buildConfig.cfg new file mode 100644 index 0000000..8e12bef --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/buildConfig.cfg @@ -0,0 +1,63 @@ +/************************************************************************************************** + Filename: buildConfig.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Host + build configuration. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Host Build Configurations + +//-DHOST_CONFIG=BROADCASTER_CFG +//-DHOST_CONFIG=OBSERVER_CFG +-DHOST_CONFIG=PERIPHERAL_CFG +//-DHOST_CONFIG=CENTRAL_CFG +//-DHOST_CONFIG=BROADCASTER_CFG+OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+OBSERVER_CFG +//-DHOST_CONFIG=CENTRAL_CFG+BROADCASTER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+CENTRAL_CFG + +// GATT Database being off chip +//-DGATT_DB_OFF_CHIP + +// GAP Privacy Feature +//-DGAP_PRIVACY +//-DGAP_PRIVACY_RECONNECT + +// Include GAP Bond Manager +//-DGAP_BOND_MGR + +// BLE Device Type +-DDEVICE_TYPE=LL_DEV_TYPE_SLAVE \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.bat b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.bat new file mode 100644 index 0000000..204ab86 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.bat @@ -0,0 +1,15 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM + + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin\8051proc.dll" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin\8051emu_cc.dll" %1 --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin\8051bat.dll" --backend -B "--proc_core" "plain" "--proc_code_model" "banked" "--proc_nr_virtual_regs" "16" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_codebank_reg" "0x9F" "--proc_codebank_start" "0x8000" "--proc_codebank_end" "0xFFFF" "--proc_codebank_mask" "0xFF" "--proc_data_model" "large" "-p" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\config\devices\_generic\io8052.ddf" "--proc_exclude_exit_breakpoint" "--proc_driver" "chipcon" "--retain_memory" "--verify_download" "use_crc16" "--stack_overflow" "--number_of_banks" "4" + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.batx b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.batx new file mode 100644 index 0000000..f7fe4a2 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.cspy.batx @@ -0,0 +1,24 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +"C:\Program Files\IAR Systems\Embedded Workbench 6.4_2\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 6.4_2\8051\bin\8051proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 6.4_2\8051\bin\8051emu_cc.dll" %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 6.4_2\8051\bin\8051bat.dll" --backend -B "--proc_core" "plain" "--proc_code_model" "banked" "--proc_nr_virtual_regs" "16" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_codebank_reg" "0x9F" "--proc_codebank_start" "0x8000" "--proc_codebank_end" "0xFFFF" "--proc_codebank_mask" "0xFF" "--proc_data_model" "large" "-p" "C:\Program Files\IAR Systems\Embedded Workbench 6.4_2\8051\config\devices\_generic\io8052.ddf" "--proc_exclude_exit_breakpoint" "--proc_driver" "chipcon" "--retain_memory" "--verify_download" "use_crc16" "--stack_overflow" "--number_of_banks" "4" + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dbgdt b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dbgdt new file mode 100644 index 0000000..8366a36 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dbgdt @@ -0,0 +1,71 @@ + + + + + + + + + 300BuildFind-in-FilesBreakpointsTool-Output201617 + + + + + + 20121232380300Debug-LogFind-in-FilesBreakpointsTool-Output + + + + + + + 3445270 + + + + + + Disassembly_I0 + + + + 50020 + + + + 11200111 + 300Debug-LogBuildBreakpointsTool-Output6649411381001gattAttrType_t-len3gattAttrType_t-uuid4struct attAttribute_t-pValue4struct attAttribute_t-permissions4{W}Watch-0:*pLen3{W}Watch-0:WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE3{W}Watch-0:currentTime32{W}Watch-0:gpsNavigationData4{W}Watch-0:numBytes3{W}Watch-0:rx_byte[4]4{W}Watch-0:rx_byte[5]4{W}Watch-0:rx_index3{W}Watch-0:rx_len3{W}Watch-0:status3{W}Watch-2:*pLen3{W}Watch-2:*pValue6{W}Watch-2:GPS_POSITION_QUALITY_UUID4{W}Watch-2:pAttr3{W}Watch-2:pValue4{W}Watch-2:pValue[1]4{W}Watch-2:pValue[7]4{W}Watch-2:uuid2{W}Watch-3:*pLen 3{W}Watch-3:WIMU_ACTIMETRY_PACKET_SIZE3{W}Watch-3:WIMU_GPS_POSITION_QUALITY_PACKET_SIZE3{W}Watch-3:maxLen3{W}Watch-3:nb3{W}Watch-3:pValue4200221376100100200103100100100300Debug-LogBuildFind-in-FilesBreakpoints30010200100224100100300Debug-LogBuildFind-in-FilesTool-Output200110$PROJ_DIR$\TermIOInput.txt10 + + + + + + + + TabID-10255-24664 + Workspace + Workspace + + + WIMUWIMU/APPWIMU/HALWIMU/HAL/TargetWIMU/HAL/Target/CC2540EBWIMU/HAL/Target/CC2540EB/DriversWIMU/LIBWIMU/OutputWIMU/PROFILES + + + + 0TabID-20238-8153Debug LogDebug-LogTabID-16109-7541BreakpointsBreakpointsTabID-23607-2446Find in FilesFind-in-FilesTabID-14904-13667Terminal I/OTerminalIO3TabID-27188-18875Call StackCallStack0TabID-26842-28079MemoryMemory1323932391000001970TabID-10574-4217LocalsLocals1031001001000TabID-3778-21417DisassemblyDisassembly0 + + + + + + TextEditor$WS_DIR$\..\..\Profiles\GPS\gpsservice.h0910211021TextEditor$WS_DIR$\..\..\Profiles\Batt\battservice.h016727752816TextEditor$WS_DIR$\..\..\Profiles\TimeService\timeservice.h08114151428TextEditor$WS_DIR$\..\..\util\WIMU\wimu_util.h012434413453TextEditor$WS_DIR$\..\Source\wimu.h03725725TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_uart.c010853895389TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\_hal_uart_dma.c08762893228932TextEditor$WS_DIR$\..\..\Profiles\TimeService\timeservice.c023371527185TextEditor$WS_DIR$\..\..\Profiles\DevInfo\devinfoservice.h011442384238TextEditor$WS_DIR$\..\..\Profiles\DevInfo\devinfoservice.c034854845484TextEditor$WS_DIR$\..\Source\wimu.c0683208802088010TextEditor$WS_DIR$\..\..\Profiles\GPS\gpsservice.c03271150411504TextEditor$WS_DIR$\..\Source\WIMU_Main.c03315481548TextEditor$WS_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.c06501807318073TextEditor$WS_DIR$\..\..\Profiles\Actimetry\actimetryservice.h02710971097TextEditor$WS_DIR$\..\..\Profiles\Batt\battservice.c03681173711737TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL.c010922901729017TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_ClockBLE.c014258335833TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Timers.c044612783127830100000010000001 + + + + + + + iaridepm.enu1debuggergui.enu1-2-2427413-2-2229212119271212425216146429860-2411427585411-227028414062528456990625429860-2-2427268-2-2270284140625284569140625429860-2266427466266-2200200104167200401104167429860-2-22201922-2-219242221002083222445104167223447218-25021922-221819242841002083284569140625284569 + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dni b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dni new file mode 100644 index 0000000..9194c8f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.dni @@ -0,0 +1,91 @@ +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[DebugChecksum] +Checksum=-1029487085 +[CallStack] +ShowArgs=0 +[Disassembly] +MixedMode=1 +[CallStackLog] +Enabled=0 +[DriverProfiling] +Enabled=0 +Mode=1 +Graph=0 +Symbiont=0 +Exclusions= +[InterruptLog] +LogEnabled=0 +SumEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=1 +SumSortOrder=0 +[DataLog] +LogEnabled=0 +SumEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=1 +[Breakpoints2] +Count=0 +[Interrupts] +Enabled=1 +[MemoryMap] +Enabled=0 +Base=0 +UseAuto=0 +TypeViolation=1 +UnspecRange=1 +ActionState=1 +[Trace1] +Enabled=0 +ShowSource=1 +[DisAssemblyWindow] +NumStates=_ 1 +State 1=_ 1 +[InstructionProfiling] +Enabled=_ 0 +[CodeCoverage] +Enabled=_ 0 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[RegisterFilter] +FilePath=_ "" +UseFilter=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[Breakpoints] +Count=0 +[ChipconEmu] +Stop timers on halt=0 +Leave target running=1 +[Aliases] +A0=_ "C:\Workspace\Etudiants_Bretagne\Projects\ble\Profiles\SensorProfile\st_util.c" "E:\BLE\Projects\Wimu\Projects\ble\Profiles\SensorProfile\st_util.c" +A1=_ "E:\BLE\Projects\Wimu\Projects\ble\WIMU\Source\WIMU_Main.c" "\\VBOXSVR\Stage_CdRV\WIMU3\BLE\Projects\Wimu\Projects\ble\WIMU\Source\WIMU_Main.c" +A2=_ "Z:\BLE\Projects\Wimu\Components\hal\target\CC2540EB\hal_led.c" "" +A3=_ "Z:\BLE\Projects\Wimu\Components\osal\common\OSAL_PwrMgr.c" "" +A4=_ "Z:\BLE\Projects\Wimu\Projects\ble\WIMU\Source\WIMU_Main.c" "E:\BLE\Projects\Wimu\Projects\ble\WIMU\Source\WIMU_Main.c" +Count=5 +SuppressDialog=1 diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.wsdt b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.wsdt new file mode 100644 index 0000000..554f379 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2540DB/settings/WIMU.wsdt @@ -0,0 +1,56 @@ + + + + + + + + WIMU/CC2540F128-WIMU + + + + + + + + + 26212270 + + + + + + 100SourceBrowser + + + + + + + 300Debug-LogFind-in-Files20139537293 + + + + 300BuildFind-in-Files201861 + 111300BuildDebug-Log664941138100Workspace300BuildDebug-LogFind-in-Files + + + + TabID-31552-26465WorkspaceWorkspaceWIMUWIMU/PROFILESTabID-9961-5344Source BrowserSourceBrowser214748364710TabID-16175-12039BuildBuildTabID-25878-12062Debug LogDebug-LogTabID-12475-18659Find in FilesFind-in-FilesTabID-11806-31727BreakpointsBreakpoints0 + + + + + + TextEditor$WS_DIR$\..\..\Profiles\GPS\gpsservice.h0910211021TextEditor$WS_DIR$\..\..\Profiles\Batt\battservice.h016727752816TextEditor$WS_DIR$\..\..\Profiles\TimeService\timeservice.h08114151428TextEditor$WS_DIR$\..\..\util\WIMU\wimu_util.h012434413453TextEditor$WS_DIR$\..\Source\wimu.h03725725TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\hal_uart.c010853895389TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\hal\target\CC2540EB\_hal_uart_dma.c08762893228932TextEditor$WS_DIR$\..\..\Profiles\TimeService\timeservice.c023371527185TextEditor$WS_DIR$\..\..\Profiles\DevInfo\devinfoservice.h011442384238TextEditor$WS_DIR$\..\..\Profiles\DevInfo\devinfoservice.c034854845484TextEditor$WS_DIR$\..\Source\wimu.c07102327823278TextEditor$WS_DIR$\..\..\Profiles\GPS\gpsservice.c03271150411504TextEditor$WS_DIR$\..\Source\WIMU_Main.c0331566156612TextEditor$WS_DIR$\..\..\Profiles\ACTIMETRY\actimetryservice.c06742010020100TextEditor$WS_DIR$\..\..\Profiles\Actimetry\actimetryservice.h02710971097TextEditor$WS_DIR$\..\..\Profiles\Batt\battservice.c03681173711737TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL.c010922901729017TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_ClockBLE.c014258335833TextEditor$WS_DIR$\..\..\..\..\COMPONENTS\osal\common\OSAL_Timers.c044612783127830100000010000001 + + + + + + + iaridepm.enu1-2-2721338-2-2424326220833326653177083724449-2-22321922-2-21924234100208323446971354144289 + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541/Obj/SimpleBLEPeripheral.pbd b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541/Obj/SimpleBLEPeripheral.pbd new file mode 100644 index 0000000..7255789 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541/Obj/SimpleBLEPeripheral.pbd @@ -0,0 +1,34 @@ +This is an internal working file generated by the Source Browser. +12:54 00s +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL_ClockBLE.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL_Memory.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL_PwrMgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL_SimpleBLEPeripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OSAL_Timers.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\OnBoard.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\SimpleBLEPeripheral_Main.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\devinfoservice.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\gap.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\gapbondmgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\gatt_uuid.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_adc.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_aes.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_crc.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_dma.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_drivers.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_flash.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_key.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_lcd.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_led.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_sleep.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_startup.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_timer.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\hal_uart.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\npi.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\osal_bufmgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\osal_cbtimer.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\osal_snv.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\peripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\simpleBLEPeripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541\Obj\simpleGATTprofile.pbi diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541DK-MINI Keyfob/Obj/SimpleBLEPeripheral.pbd b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541DK-MINI Keyfob/Obj/SimpleBLEPeripheral.pbd new file mode 100644 index 0000000..6c6b1e0 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/CC2541DK-MINI Keyfob/Obj/SimpleBLEPeripheral.pbd @@ -0,0 +1,35 @@ +This is an internal working file generated by the Source Browser. +12:53 26s +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL_ClockBLE.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL_Memory.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL_PwrMgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL_SimpleBLEPeripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OSAL_Timers.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\OnBoard.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\SimpleBLEPeripheral_Main.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\devinfoservice.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\gap.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\gapbondmgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\gatt_uuid.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_adc.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_aes.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_crc.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_dma.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_drivers.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_flash.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_key.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_lcd.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_led.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_sleep.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_startup.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_timer.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\hal_uart.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\npi.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\osal_bufmgr.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\osal_cbtimer.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\osal_snv.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\peripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\simpleBLEPeripheral.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\simpleGATTprofile.pbi +C:\Workspace\Etudiants_Bretagne\Projects\ble\WIMU\CC2541DB\CC2541DK-MINI Keyfob\Obj\simplekeys.pbi diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.dep b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.dep new file mode 100644 index 0000000..095909c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.dep @@ -0,0 +1,1138 @@ + + + + 2 + 2540052299 + + CC2541 + + $PROJ_DIR$\CC2541\Obj\hal_key.r51 + $PROJ_DIR$\CC2541\Obj\hal_flash.r51 + $PROJ_DIR$\CC2541\Obj\hal_crc.r51 + $PROJ_DIR$\CC2541\Obj\hal_dma.r51 + $PROJ_DIR$\CC2541\Obj\hal_adc.r51 + $PROJ_DIR$\CC2541\Obj\hal_aes.r51 + $PROJ_DIR$\CC2541\Obj\SimpleBLEPeripheral_Main.r51 + $PROJ_DIR$\CC2541\Obj\hal_drivers.r51 + $PROJ_DIR$\CC2541\Obj\simpleBLEPeripheral.r51 + $PROJ_DIR$\CC2541\Obj\hal_lcd.r51 + $PROJ_DIR$\CC2541\Obj\OSAL_SimpleBLEPeripheral.r51 + $PROJ_DIR$\CC2541\Obj\hal_led.r51 + $PROJ_DIR$\CC2541\Obj\SimpleBLEPeripheral.pbd + $PROJ_DIR$\CC2541\Obj\OSAL_ClockBLE.r51 + $PROJ_DIR$\CC2541\Obj\hal_sleep.r51 + $PROJ_DIR$\CC2541\Obj\hal_startup.r51 + $PROJ_DIR$\CC2541\Obj\hal_timer.r51 + $PROJ_DIR$\CC2541\Obj\hal_uart.r51 + $PROJ_DIR$\CC2541\Obj\npi.r51 + $PROJ_DIR$\CC2541\Obj\OnBoard.r51 + $PROJ_DIR$\CC2541\Obj\OSAL.r51 + $PROJ_DIR$\CC2541\Obj\osal_bufmgr.r51 + $PROJ_DIR$\CC2541\Obj\osal_cbtimer.r51 + $PROJ_DIR$\CC2541\Obj\OSAL_Memory.r51 + $PROJ_DIR$\CC2541\Obj\OSAL_PwrMgr.r51 + $PROJ_DIR$\CC2541\Obj\osal_snv.r51 + $PROJ_DIR$\CC2541\Obj\OSAL_Timers.r51 + $PROJ_DIR$\CC2541\Obj\devinfoservice.r51 + $PROJ_DIR$\CC2541\Obj\gap.r51 + $PROJ_DIR$\CC2541\Obj\gapbondmgr.r51 + $PROJ_DIR$\CC2541\Obj\OSAL_SimpleBLEPeripheral.pbi + $PROJ_DIR$\CC2541\Obj\gatt_uuid.r51 + $PROJ_DIR$\CC2541\Obj\peripheral.r51 + $PROJ_DIR$\CC2541\Obj\simpleGATTprofile.r51 + $PROJ_DIR$\CC2541\Obj\simpleBLEPeripheral.pbi + $PROJ_DIR$\CC2541\Obj\SimpleBLEPeripheral_Main.pbi + $PROJ_DIR$\CC2541\Obj\hal_drivers.pbi + $PROJ_DIR$\CC2541\Obj\hal_adc.pbi + $PROJ_DIR$\CC2541\Obj\hal_aes.pbi + $PROJ_DIR$\CC2541\Obj\hal_crc.pbi + $PROJ_DIR$\CC2541\Obj\hal_dma.pbi + $PROJ_DIR$\CC2541\Obj\hal_flash.pbi + $PROJ_DIR$\CC2541\Obj\hal_key.pbi + $PROJ_DIR$\CC2541\Obj\hal_lcd.pbi + $PROJ_DIR$\CC2541\Obj\hal_led.pbi + $PROJ_DIR$\CC2541\Obj\hal_sleep.pbi + $PROJ_DIR$\CC2541\Obj\hal_startup.pbi + $PROJ_DIR$\CC2541\Obj\hal_timer.pbi + $PROJ_DIR$\CC2541\Obj\hal_uart.pbi + $PROJ_DIR$\CC2541\Obj\npi.pbi + $PROJ_DIR$\CC2541\Obj\OSAL.pbi + $PROJ_DIR$\CC2541\Obj\osal_bufmgr.pbi + $PROJ_DIR$\CC2541\Obj\osal_cbtimer.pbi + $PROJ_DIR$\CC2541\Obj\OSAL_ClockBLE.pbi + $PROJ_DIR$\CC2541\Obj\OSAL_Memory.pbi + $PROJ_DIR$\CC2541\Obj\OSAL_PwrMgr.pbi + $PROJ_DIR$\CC2541\Obj\osal_snv.pbi + $PROJ_DIR$\CC2541\Obj\OSAL_Timers.pbi + $PROJ_DIR$\CC2541\Obj\devinfoservice.pbi + $PROJ_DIR$\CC2541\Obj\gap.pbi + $PROJ_DIR$\CC2541\Obj\gapbondmgr.pbi + $PROJ_DIR$\CC2541\Obj\gatt_uuid.pbi + $PROJ_DIR$\CC2541\Obj\peripheral.pbi + $PROJ_DIR$\CC2541\Obj\simpleGATTprofile.pbi + $PROJ_DIR$\CC2541\Obj\OnBoard.pbi + $PROJ_DIR$\CC2541\Exe\SimpleBLEPeripheral.d51 + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + $PROJ_DIR$\..\Source\OSAL_SimpleBLEPeripheral.c + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + $PROJ_DIR$\..\Source\simpleBLEPeripheral.c + $PROJ_DIR$\..\Source\SimpleBLEPeripheral_Main.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + [ROOT_NODE] + + + XLINK + 65 + + + + + $PROJ_DIR$\CC2541\Obj\SimpleBLEPeripheral.pbd + + + BILINK + 50 53 54 55 30 57 64 35 58 59 60 61 37 38 39 40 36 41 42 43 44 45 46 47 48 49 51 52 56 62 34 63 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + BICOMP + 41 + + + ICC8051 + 1 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + + + BICOMP + 43 + + + ICC8051 + 9 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + BICOMP + 42 + + + ICC8051 + 0 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + + + BICOMP + 46 + + + ICC8051 + 15 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + BICOMP + 44 + + + ICC8051 + 11 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + BICOMP + 45 + + + ICC8051 + 14 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + BICOMP + 47 + + + ICC8051 + 16 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + + + BICOMP + 48 + + + ICC8051 + 17 + + + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + BICOMP + 49 + + + ICC8051 + 18 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + BICOMP + 51 + + + ICC8051 + 21 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + + + BICOMP + 50 + + + ICC8051 + 20 + + + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + BICOMP + 58 + + + ICC8051 + 27 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + BICOMP + 52 + + + ICC8051 + 22 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + + + BICOMP + 53 + + + ICC8051 + 13 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + + + BICOMP + 54 + + + ICC8051 + 23 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + BICOMP + 55 + + + ICC8051 + 24 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + BICOMP + 56 + + + ICC8051 + 25 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + + + BICOMP + 57 + + + ICC8051 + 26 + + + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + + + BICOMP + 61 + + + ICC8051 + 31 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + BICOMP + 59 + + + ICC8051 + 28 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + BICOMP + 60 + + + ICC8051 + 29 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + BICOMP + 62 + + + ICC8051 + 32 + + + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + + + BICOMP + 63 + + + ICC8051 + 33 + + + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + BICOMP + 64 + + + ICC8051 + 19 + + + + + $PROJ_DIR$\..\Source\OSAL_SimpleBLEPeripheral.c + + + BICOMP + 30 + + + ICC8051 + 10 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + + + BICOMP + 36 + + + ICC8051 + 7 + + + + + $PROJ_DIR$\..\Source\simpleBLEPeripheral.c + + + BICOMP + 34 + + + ICC8051 + 8 + + + + + $PROJ_DIR$\..\Source\SimpleBLEPeripheral_Main.c + + + BICOMP + 35 + + + ICC8051 + 6 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + BICOMP + 37 + + + ICC8051 + 4 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + BICOMP + 38 + + + ICC8051 + 5 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + BICOMP + 39 + + + ICC8051 + 2 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + BICOMP + 40 + + + ICC8051 + 3 + + + + + [MULTI_TOOL] + XLINK + + + + CC2541-OAD-Encrypted-ImgA + + + [MULTI_TOOL] + XLINK + + + + CC2541-OAD-Encrypted-ImgB + + + [MULTI_TOOL] + XLINK + + + + CC2541-OAD-ImgA + + + [MULTI_TOOL] + XLINK + + + + CC2541-OAD-ImgB + + + [MULTI_TOOL] + XLINK + + + + CC2541DK-MINI Keyfob + + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_aes.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_drivers.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_SimpleBLEPeripheral.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_lcd.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_uart.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_dma.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_sleep.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_flash.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simpleBLEPeripheral.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\SimpleBLEPeripheral_Main.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simpleGATTprofile.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_crc.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_key.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simplekeys.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\SimpleBLEPeripheral.pbd + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OnBoard.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Exe\SimpleBLEPeripheral.d51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_timer.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_SimpleBLEPeripheral.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simpleGATTprofile.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_drivers.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_adc.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_aes.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_crc.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_dma.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_flash.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_key.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_lcd.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_led.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_sleep.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_startup.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_timer.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_uart.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\npi.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_bufmgr.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_cbtimer.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_ClockBLE.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_Memory.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_PwrMgr.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_snv.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_Timers.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\devinfoservice.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gap.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gapbondmgr.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gatt_uuid.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\peripheral.pbi + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_led.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simplekeys.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_startup.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\hal_adc.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\simpleBLEPeripheral.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\npi.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_ClockBLE.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OnBoard.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_bufmgr.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_cbtimer.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_Memory.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_PwrMgr.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\osal_snv.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\OSAL_Timers.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\devinfoservice.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gap.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gapbondmgr.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\SimpleBLEPeripheral_Main.pbi + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\gatt_uuid.r51 + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\peripheral.r51 + $PROJ_DIR$\..\Source\OSAL_SimpleBLEPeripheral.c + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + $PROJ_DIR$\..\Source\simpleBLEPeripheral.c + $PROJ_DIR$\..\Source\SimpleBLEPeripheral_Main.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + [ROOT_NODE] + + + XLINK + 16 + + + + + $PROJ_DIR$\CC2541DK-MINI Keyfob\Obj\SimpleBLEPeripheral.pbd + + + BILINK + 34 37 38 39 18 41 15 90 42 43 44 45 21 22 23 24 20 25 26 27 28 29 30 31 32 33 35 36 40 46 76 19 13 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + BICOMP + 25 + + + ICC8051 + 7 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + + + BICOMP + 27 + + + ICC8051 + 3 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + BICOMP + 26 + + + ICC8051 + 12 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + + + BICOMP + 30 + + + ICC8051 + 74 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + BICOMP + 28 + + + ICC8051 + 72 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + BICOMP + 29 + + + ICC8051 + 6 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + BICOMP + 31 + + + ICC8051 + 17 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + + + BICOMP + 32 + + + ICC8051 + 4 + + + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + BICOMP + 33 + + + ICC8051 + 77 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + BICOMP + 35 + + + ICC8051 + 81 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + + + BICOMP + 34 + + + ICC8051 + 80 + + + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + BICOMP + 42 + + + ICC8051 + 87 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + BICOMP + 36 + + + ICC8051 + 82 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + + + BICOMP + 37 + + + ICC8051 + 78 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + + + BICOMP + 38 + + + ICC8051 + 83 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + BICOMP + 39 + + + ICC8051 + 84 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + BICOMP + 40 + + + ICC8051 + 85 + + + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + + + BICOMP + 41 + + + ICC8051 + 86 + + + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + + + BICOMP + 45 + + + ICC8051 + 91 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + BICOMP + 43 + + + ICC8051 + 88 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + BICOMP + 44 + + + ICC8051 + 89 + + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + BICOMP + 46 + + + ICC8051 + 92 + + + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + + + BICOMP + 19 + + + ICC8051 + 10 + + + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + + + BICOMP + 13 + + + ICC8051 + 73 + + + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + BICOMP + 15 + + + ICC8051 + 79 + + + + + $PROJ_DIR$\..\Source\OSAL_SimpleBLEPeripheral.c + + + BICOMP + 18 + + + ICC8051 + 2 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + + + BICOMP + 20 + + + ICC8051 + 1 + + + + + $PROJ_DIR$\..\Source\simpleBLEPeripheral.c + + + BICOMP + 76 + + + ICC8051 + 8 + + + + + $PROJ_DIR$\..\Source\SimpleBLEPeripheral_Main.c + + + BICOMP + 90 + + + ICC8051 + 9 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + BICOMP + 21 + + + ICC8051 + 75 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + BICOMP + 22 + + + ICC8051 + 0 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + BICOMP + 23 + + + ICC8051 + 11 + + + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + BICOMP + 24 + + + ICC8051 + 5 + + + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewd b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewd new file mode 100644 index 0000000..b054901 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewd @@ -0,0 +1,3829 @@ + + + + 2 + + CC2541DK-MINI Keyfob + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + CC2541 + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + CC2541-OAD-ImgA + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + CC2541-OAD-ImgB + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + CC2541-OAD-Encrypted-ImgA + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + CC2541-OAD-Encrypted-ImgB + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewp b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewp new file mode 100644 index 0000000..9441efe --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.ewp @@ -0,0 +1,6700 @@ + + + + 2 + + CC2541DK-MINI Keyfob + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2541 + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2541-OAD-ImgA + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2541-OAD-ImgA\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2541-OAD-ImgB + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2541-OAD-ImgB\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2541-OAD-Encrypted-ImgA + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2541-OAD-Encrypted-ImgA\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + CC2541-OAD-Encrypted-ImgB + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + "$PROJ_DIR$\..\..\common\cc2540\cc254x_ubl_pp.bat" "$PROJ_DIR$" "ProdUBL" "$PROJ_DIR$\CC2541-OAD-Encrypted-ImgB\Exe\SimpleBLEPeripheral" + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + APP + + $PROJ_DIR$\..\Source\OSAL_SimpleBLEPeripheral.c + + + $PROJ_DIR$\..\Source\simpleBLEPeripheral.c + + + $PROJ_DIR$\..\Source\simpleBLEPeripheral.h + + + $PROJ_DIR$\..\Source\SimpleBLEPeripheral_Main.c + + + + HAL + + Common + + $PROJ_DIR$\..\..\..\..\Components\hal\common\hal_drivers.c + + + + Include + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_adc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_assert.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_board.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_defs.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_drivers.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_flash.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_key.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_lcd.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_led.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_rpc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_sleep.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_timer.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\include\hal_uart.h + + + $PROJ_DIR$\..\..\..\..\Components\services\saddr\saddr.h + + + + Target + + CC2540EB + + Config + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_board_cfg.h + + + + Drivers + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_adc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_flash.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_key.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_lcd.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_led.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_sleep.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_startup.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_timer.c + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_uart.c + + + + Includes + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_aes.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_ccm.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_crc.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_dma.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_mcu.h + + + $PROJ_DIR$\..\..\..\..\Components\hal\target\CC2540EB\hal_types.h + + + + + + + INCLUDE + + $PROJ_DIR$\..\..\..\..\Components\ble\include\att.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\gatt_uuid.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\hci.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\l2cap.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\linkdb.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\ll.h + + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\controller\include\phy.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\include\sm.h + + + + LIB + + $PROJ_DIR$\..\..\Libraries\CC2541DB\bin\CC2541_BLE_peri.lib + + + $PROJ_DIR$\..\..\Libraries\Common\bin\CC254x_BLE_HCI_TL_None.lib + + + + NPI + + $PROJ_DIR$\..\..\common\npi\npi_np\npi.c + + + + OSAL + + $PROJ_DIR$\..\..\..\..\Components\ble\include\bcomdef.h + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_bufmgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\osal_cbtimer.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_ClockBLE.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Memory.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_PwrMgr.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\mcu\cc2540\osal_snv.c + + + $PROJ_DIR$\..\..\..\..\Components\osal\common\OSAL_Timers.c + + + + PROFILES + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.c + + + $PROJ_DIR$\..\..\Profiles\DevInfo\devinfoservice.h + + + $PROJ_DIR$\..\..\Profiles\Roles\gap.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.c + + + $PROJ_DIR$\..\..\Profiles\Roles\gapbondmgr.h + + + $PROJ_DIR$\..\..\Include\gapgattserver.h + + + $PROJ_DIR$\..\..\..\..\Components\ble\host\gatt_uuid.c + + + $PROJ_DIR$\..\..\Include\gattservapp.h + + + $PROJ_DIR$\..\..\Profiles\OAD\oad.h + + CC2541DK-MINI Keyfob + CC2541 + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.c + + CC2541DK-MINI Keyfob + CC2541 + + + + $PROJ_DIR$\..\..\Profiles\OAD\oad_target.h + + CC2541DK-MINI Keyfob + CC2541 + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.c + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheral.h + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.c + + CC2541DK-MINI Keyfob + CC2541 + CC2541-OAD-ImgA + CC2541-OAD-ImgB + CC2541-OAD-Encrypted-ImgA + CC2541-OAD-Encrypted-ImgB + + + + $PROJ_DIR$\..\..\Profiles\Roles\peripheralBroadcaster.h + + CC2541DK-MINI Keyfob + CC2541 + CC2541-OAD-ImgA + CC2541-OAD-ImgB + CC2541-OAD-Encrypted-ImgA + CC2541-OAD-Encrypted-ImgB + + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.c + + + $PROJ_DIR$\..\..\Profiles\SimpleProfile\simpleGATTprofile.h + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.c + + CC2541 + CC2541-OAD-ImgA + CC2541-OAD-ImgB + CC2541-OAD-Encrypted-ImgA + CC2541-OAD-Encrypted-ImgB + + + + $PROJ_DIR$\..\..\Profiles\Keys\simplekeys.h + + CC2541 + CC2541-OAD-ImgA + CC2541-OAD-ImgB + CC2541-OAD-Encrypted-ImgA + CC2541-OAD-Encrypted-ImgB + + + + + TOOLS + + $PROJ_DIR$\..\..\config\buildComponents.cfg + + + $PROJ_DIR$\buildConfig.cfg + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.c + + + $PROJ_DIR$\..\..\common\cc2540\OnBoard.h + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.eww b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.eww new file mode 100644 index 0000000..f7f311a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/SimpleBLEPeripheral.eww @@ -0,0 +1,38 @@ + + + + + $WS_DIR$\SimpleBLEPeripheral.ewp + + + + All + + SimpleBLEPeripheral + CC2541 + + + SimpleBLEPeripheral + CC2541DK-MINI Keyfob + + + SimpleBLEPeripheral + CC2541-OAD-ImgA + + + SimpleBLEPeripheral + CC2541-OAD-ImgB + + + SimpleBLEPeripheral + CC2541-OAD-Encrypted-ImgA + + + SimpleBLEPeripheral + CC2541-OAD-Encrypted-ImgB + + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/buildConfig.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/buildConfig.cfg new file mode 100644 index 0000000..265a0f3 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/buildConfig.cfg @@ -0,0 +1,72 @@ +/************************************************************************************************** + Filename: buildConfig.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Host + build configuration. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Host Build Configurations + +//-DHOST_CONFIG=BROADCASTER_CFG +//-DHOST_CONFIG=OBSERVER_CFG +-DHOST_CONFIG=PERIPHERAL_CFG +//-DHOST_CONFIG=CENTRAL_CFG +//-DHOST_CONFIG=BROADCASTER_CFG+OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+OBSERVER_CFG +//-DHOST_CONFIG=CENTRAL_CFG+BROADCASTER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+CENTRAL_CFG + +// GATT Database being off chip +//-DGATT_DB_OFF_CHIP + +// GAP Privacy Feature +//-DGAP_PRIVACY +-DGAP_PRIVACY_RECONNECT + +// Include GAP Bond Manager +//-DGAP_BOND_MGR + +// CC2541 Device +-DCC2541 + +// OAD Target Configuration Parameters + +// OAD Image Version (0x0000-0x7FFF) +-DOAD_IMAGE_VERSION=0x0000 + +// OAD User IDs +-DOAD_IMAGE_A_USER_ID="'A', 'A', 'A', 'A'" +-DOAD_IMAGE_B_USER_ID="'B', 'B', 'B', 'B'" diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.cspy.bat b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.cspy.bat new file mode 100644 index 0000000..3b07309 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.cspy.bat @@ -0,0 +1,15 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM + + +"C:\Program Files\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\8051\bin\8051proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\8051\bin\8051emu_cc.dll" %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 6.0\8051\bin\8051bat.dll" --backend -B "--proc_core" "plain" "--proc_code_model" "banked" "--proc_nr_virtual_regs" "16" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_codebank_reg" "0x9F" "--proc_codebank_start" "0x8000" "--proc_codebank_end" "0xFFFF" "--proc_codebank_mask" "0xFF" "--proc_data_model" "large" "-p" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\8051\config\devices\Texas Instruments\ioCC2541F256.ddf" "--proc_exclude_exit_breakpoint" "--proc_driver" "chipcon" "--erase_flash" "--verify_download" "use_crc16" "--stack_overflow" "--number_of_banks" "4" + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dbgdt b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dbgdt new file mode 100644 index 0000000..e068f91 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dbgdt @@ -0,0 +1,5 @@ + + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dni b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dni new file mode 100644 index 0000000..d05f93d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.dni @@ -0,0 +1,8 @@ +[Breakpoints] +Count=0 +[ChipconEmu] +Stop timers on halt=1 +Leave target running=1 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.wsdt b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.wsdt new file mode 100644 index 0000000..5f06d17 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/CC2541DB/settings/SimpleBLEPeripheral.wsdt @@ -0,0 +1,49 @@ + + + + + + SimpleBLEPeripheral/CC2541 + + + + + + + + + 244272727 + + + + + + + + TabID-21373-5900 + Workspace + Workspace + + + SimpleBLEPeripheral + + + + 0 + + + + + + 0100000010000001 + + + + + + + iaridepm.enu1-2-21031318-2-2200200104167185874166667960037 + + + + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/OSAL_WIMU.c b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/OSAL_WIMU.c new file mode 100644 index 0000000..3bea158 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/OSAL_WIMU.c @@ -0,0 +1,135 @@ +/************************************************************************************************** + Filename: OSAL_WIMU.c + + Description: This file contains function that allows user setup tasks + +**************************************************************************************************/ + +/************************************************************************************************** + * INCLUDES + **************************************************************************************************/ +#include "hal_types.h" +#include "OSAL.h" +#include "OSAL_Tasks.h" + +/* HAL */ +#include "hal_drivers.h" + +/* LL */ +#include "ll.h" + +/* HCI */ +#include "hci_tl.h" + +#if defined ( OSAL_CBTIMER_NUM_TASKS ) + #include "osal_cbTimer.h" +#endif + +/* L2CAP */ +#include "l2cap.h" + +/* gap */ +#include "gap.h" +#include "gapgattserver.h" +#include "gapbondmgr.h" + +/* GATT */ +#include "gatt.h" + +#include "gattservapp.h" + +/* Profiles */ +#if defined ( PLUS_BROADCASTER ) + #include "peripheralBroadcaster.h" +#else + #include "peripheral.h" +#endif + +/* Application */ +#include "wimu.h" + +/********************************************************************* + * GLOBAL VARIABLES + */ + +// The order in this table must be identical to the task initialization calls below in osalInitTask. +const pTaskEventHandlerFn tasksArr[] = +{ + LL_ProcessEvent, // task 0 + Hal_ProcessEvent, // task 1 + HCI_ProcessEvent, // task 2 +#if defined ( OSAL_CBTIMER_NUM_TASKS ) +//OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3 +#endif + L2CAP_ProcessEvent, // task 4 + GAP_ProcessEvent, // task 5 + GATT_ProcessEvent, // task 6 + SM_ProcessEvent, // task 7 + GAPRole_ProcessEvent, // task 8 + GAPBondMgr_ProcessEvent, // task 9 + GATTServApp_ProcessEvent, // task 10 + WIMU_ProcessEvent // task 11 +}; + +const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] ); +uint16 *tasksEvents; + +/********************************************************************* + * FUNCTIONS + *********************************************************************/ + +/********************************************************************* + * @fn osalInitTasks + * + * @brief This function invokes the initialization function for each task. + * + * @param void + * + * @return none + */ +void osalInitTasks( void ) +{ + uint8 taskID = 0; + + tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); + osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); + + /* LL Task */ + LL_Init( taskID++ ); + + /* Hal Task */ + Hal_Init( taskID++ ); + + /* HCI Task */ + HCI_Init( taskID++ ); +/* +#if defined ( OSAL_CBTIMER_NUM_TASKS ) + // Callback Timer Tasks + osal_CbTimerInit( taskID ); + taskID += OSAL_CBTIMER_NUM_TASKS; +#endif*/ + + /* L2CAP Task */ + L2CAP_Init( taskID++ ); + + /* GAP Task */ + GAP_Init( taskID++ ); + + /* GATT Task */ + GATT_Init( taskID++ ); + + /* SM Task */ + SM_Init( taskID++ ); + + /* Profiles */ + GAPRole_Init( taskID++ ); + GAPBondMgr_Init( taskID++ ); + + GATTServApp_Init( taskID++ ); + + /* Application */ + WIMU_Init( taskID ); +} + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/WIMU_Main.c b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/WIMU_Main.c new file mode 100644 index 0000000..2fcf1c1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/WIMU_Main.c @@ -0,0 +1,84 @@ +/************************************************************************************************** + Filename: WIMU_Main.c + + Description: This file contains the main and callback functions for + the WIMU sample application. + +**************************************************************************************************/ + +/************************************************************************************************** + * Includes + **************************************************************************************************/ +/* Hal Drivers */ +#include "hal_types.h" +#include "hal_key.h" +#include "hal_timer.h" +#include "hal_drivers.h" +#include "hal_led.h" + +/* OSAL */ +#include "OSAL.h" +#include "OSAL_Tasks.h" +#include "OSAL_PwrMgr.h" +#include "osal_snv.h" +#include "OnBoard.h" + +/************************************************************************************************** + * FUNCTIONS + **************************************************************************************************/ + +/* This callback is triggered when a key is pressed */ +//void MSA_Main_KeyCallback(uint8 keys, uint8 state); + +/************************************************************************************************** + * @fn main + * + * @brief Start of application. + * + * @param none + * + * @return none + ************************************************************************************************** + */ +int main(void) +{ + /* Initialize hardware */ + HAL_BOARD_INIT(); + + // Initialize board I/O + InitBoard( OB_COLD ); + + /* Initialze the HAL driver */ + HalDriverInit(); + + /* Initialize NV system */ + osal_snv_init(); + + /* Initialize LL */ + + /* Initialize the operating system */ + osal_init_system(); + + /* Enable interrupts */ + HAL_ENABLE_INTERRUPTS(); + + // Final board initialization + InitBoard( OB_READY ); + + #if defined ( POWER_SAVING ) + osal_pwrmgr_device( PWRMGR_BATTERY ); + #endif + + /* Start OSAL */ + osal_start_system(); // No Return from here + + return 0; +} + +/************************************************************************************************** + CALL-BACKS +**************************************************************************************************/ + + +/************************************************************************************************* +**************************************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/wimu.c b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/wimu.c new file mode 100644 index 0000000..c4c1e27 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/WIMU/Source/wimu.c @@ -0,0 +1,863 @@ +/************************************************************************************************** + Filename: wimu.c + + Description: This file contains the WIMU application + (based on Simple BLE Peripheral sample application). + +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include + +#include "bcomdef.h" +#include "OSAL.h" +#include "OSAL_PwrMgr.h" + +#include "OnBoard.h" +#include "hal_adc.h" +#include "hal_led.h" +#include "hal_key.h" +#include "hal_lcd.h" +#include "hal_uart.h" +#include "hal_defs.h" + +#include "gatt.h" + +#include "hci.h" + +#include "gapgattserver.h" +#include "gattservapp.h" +#include "devinfoservice.h" +#include "battservice.h" +#include "actimetryservice.h" +#include "gpsservice.h" +#include "timeservice.h" + +#if defined ( PLUS_BROADCASTER ) + #include "peripheralBroadcaster.h" +#else + #include "peripheral.h" +#endif + +#include "gapbondmgr.h" + +#include "wimu.h" + +#include "wimu_util.h" +#include "st_util.h" + +#if defined FEATURE_OAD + #include "oad.h" + #include "oad_target.h" +#endif + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// ====== Debugging settings ====== +/* + For debugging purposes, code optomization was disabled. + It can be re-enabled in Options/ C/C++ compiler / Optimizations +*/ + +// If uncommented, data provided in packets is random +//#define WIMU_RANDOM_DATA + +// For debuggin purposes +//#define WIMU_DEBUG + + +// ====== WIMU UART settings ====== + +#define WIMU_UART_PORT HAL_UART_PORT_1 + +//#define WIMU_UART_BAUDRATE HAL_UART_BR_2400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_4800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_9600 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_14400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_19200 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_28800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_38400 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_57600 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_76800 +//#define WIMU_UART_BAUDRATE HAL_UART_BR_115200 +#define WIMU_UART_BAUDRATE HAL_UART_BR_230400 + +#define WIMU_UART_PARITY HAL_UART_NO_PARITY +#define WIMU_UART_STOPBITS HAL_UART_ONE_STOP_BIT +#define WIMU_UART_FLOWCONTROL HAL_UART_FLOW_OFF + +// ====== WIMU Message Protocole ====== +#define WIMU_SYNC_BYTE 0x00 + +#define WIMU_MSGTYPE_IMU 1 +#define WIMU_MSGTYPE_GPS 2 +#define WIMU_MSGTYPE_BATTERY 3 +#define WIMU_MSGTYPE_DEVINFO 4 +#define WIMU_MSGTYPE_CONTROL 5 +#define WIMU_MSGTYPE_DATETIME 6 +#define WIMU_MSGTYPE_CONFIG 7 + +#define WIMU_MSGTYPE_NUM 7 + +//#define WIMU_ACTIMETRY_DATALEN 40 // Expected data length for IMU Data, including header and CRC +//#define WIMU_BATTERY_DATALEN 5 // Expected data length for BATTERY Data, including header and CRC +//#define WIMU_GPS_NAVIGATION_DATALEN 103 // Expected data length for GPS Data, including header and CRC +//#define WIMU_DEVINFO_DATALEN 36 // Expected data length for Dev Info, including header and CRC + +// ====== Application configuration ====== + +// How often to perform periodic event +#define SBP_PERIODIC_EVT_PERIOD 5 + +// ====== BLE stack configuration ====== + +// What is the advertising interval when device is discoverable (units of 625us, 160=100ms) +#define DEFAULT_ADVERTISING_INTERVAL 160 + +/* + This is set to true to renegotiate the connection interval +*/ +// Whether to enable automatic parameter update request when a connection is formed +#define DEFAULT_ENABLE_UPDATE_REQUEST FALSE + +// Limited discoverable mode advertises for 30.72s, and then stops +// General discoverable mode advertises indefinitely + +#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL + + +/* + Adjust the connection interval so that there is less + than 4 notifications that have to be transferred on each connection + event. +*/ +// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled +#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 4//12 + +// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled +#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 4//12 + +// Slave latency to use if automatic parameter update request is enabled +#define DEFAULT_DESIRED_SLAVE_LATENCY 0 + + +// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled +#define DEFAULT_DESIRED_CONN_TIMEOUT 1600 + +// Company Identifier: Texas Instruments Inc. (13) +#define TI_COMPANY_ID 0x000D + +#define INVALID_CONNHANDLE 0xFFFF + +// Length of bd addr as a string +#define B_ADDR_STR_LEN 15 + +#if defined ( PLUS_BROADCASTER ) + #define ADV_IN_CONN_WAIT 500 // delay 500 ms +#endif + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ + +//uint16 packetCount=0; +//bool sensorsReadEnabler = true; +//static uint16 numCalls=0; +//static uint16 seqNums[200]; + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ + +/********************************************************************* + * LOCAL VARIABLES + */ + +static uint8 WIMU_TaskID; // Task ID for internal task/event processing + +// GAP - SCAN RSP data (max size = 31 bytes) +static uint8 scanRspData[] = +{ + // complete name + 0x0B, // length of this data + GAP_ADTYPE_LOCAL_NAME_COMPLETE, + 'W', + 'I', + 'M', + 'U', + '3', + '-', + 'x', + 'x', + 'x', + 'x', + + // connection interval range + /* 0x05, // length of this data + GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, + LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), + HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), + LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), + HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), + + // Tx power level + 0x02, // length of this data + GAP_ADTYPE_POWER_LEVEL, + 0 // 0dBm*/ +}; + +// GAP - Advertisement data (max size = 31 bytes, though this is +// best kept short to conserve power while advertisting) +static uint8 advertData[] = +{ + // Flags; this sets the device to use limited discoverable + // mode (advertises for 30 seconds at a time) instead of general + // discoverable mode (advertises indefinitely) + 0x02, // length of this data + GAP_ADTYPE_FLAGS, + DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, + + // service UUID, to notify central devices what services are included + // in this peripheral + 0x07, // length of this data +#ifdef WIMU_LONG_UUIDS + GAP_ADTYPE_128BIT_MORE, +#else + GAP_ADTYPE_16BIT_MORE, +#endif + // some of the UUID's, but not all + WIMU_ACTIMETRY_UUID(ACTIMETRY_SERV_UUID), + LO_UINT16(GPS_SERV_UUID), + HI_UINT16(GPS_SERV_UUID), + LO_UINT16(BATT_SERVICE_UUID), + HI_UINT16(BATT_SERVICE_UUID), + LO_UINT16(TIME_SERVICE_UUID), + HI_UINT16(TIME_SERVICE_UUID) +}; + +// GAP GATT Attributes +static uint8 attDeviceName[5] = "WIMU3"; + +uint8 rx_byte[WIMU_RX_MAX]; +uint16 rx_index=0; +uint16 rx_len=0; + +/********************************************************************* + * LOCAL FUNCTIONS + */ +static void performPeriodicTask( void ); +static void WIMU_UARTCallback (uint8 port, uint8 event); +static void WIMU_updateProfileSensors( void ); +uint8 WIMU_getEndOfFrame_Position(void); +//void WIMU_SyncRX(); +// Consistent Overhead Byte Stuffing algorithm (COBS) implementation (https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing) +void COBS_StuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); +void COBS_UnStuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); + +/********************************************************************* + * PROFILE CALLBACKS + */ + +// GAP Role Callbacks +static gapRolesCBs_t WIMU_PeripheralCBs = +{ + NULL, // Profile State Change Callbacks + NULL // When a valid RSSI is read from controller (not used by application) +}; + +// GAP Bond Manager Callbacks +static gapBondCBs_t WIMU_BondMgrCBs = +{ + NULL, // Passcode callback (not used by application) + NULL // Pairing / Bonding state Callback (not used by application) +}; + + +static void WIMU_openUART( void ){ + + osal_memset(&rx_byte[0],0xFF, WIMU_RX_MAX); + + halUARTCfg_t uartConf; + + uartConf.configured = TRUE; + uartConf.baudRate = WIMU_UART_BAUDRATE; + uartConf.flowControl = WIMU_UART_FLOWCONTROL; + uartConf.flowControlThreshold=128; // Not used + uartConf.idleTimeout = 6; // Not used + uartConf.rx.maxBufSize = 256; // Not used + uartConf.tx.maxBufSize = 50; // Not used + uartConf.intEnable = TRUE; + uartConf.callBackFunc = &WIMU_UARTCallback; + + HalUARTOpen(WIMU_UART_PORT, &uartConf); + +}; + +void WIMU_requestDevInfo( void ){ + uint8 msg[2] = {WIMU_MSGTYPE_DEVINFO, 0}; + uint8 stuffed[4]; + + COBS_StuffData(&msg[0], 3, &stuffed[0]); + stuffed[3] = WIMU_SYNC_BYTE; + + HalUARTWrite(WIMU_UART_PORT, stuffed, 4); +} +/* +void WIMU_requestConfig( void ){ + uint8 msg[2] = {WIMU_MSGTYPE_CONFIG, 0}; + uint8 stuffed[4]; + + COBS_StuffData(&msg[0], 3, &stuffed[0]); + stuffed[3] = WIMU_SYNC_BYTE; + + HalUARTWrite(WIMU_UART_PORT, stuffed, 4); +}*/ + +void WIMU_setControlMode( uint8* config ){ + uint8 msg[2 + sizeof(RemControl_t)]; + msg[0] = WIMU_MSGTYPE_CONTROL; + msg[1] = sizeof(RemControl_t); + osal_memcpy(&msg[2], config, sizeof(RemControl_t)); + uint8 stuffed[2 + sizeof(RemControl_t) + 2]; + stuffed[2 + sizeof(RemControl_t) + 1] = WIMU_SYNC_BYTE; + + COBS_StuffData(&msg[0], 2 + sizeof(RemControl_t), &stuffed[0]); + + HalUARTWrite(WIMU_UART_PORT, stuffed, 2 + sizeof(RemControl_t) + 2); +} + +void WIMU_setCurrentTime( uint8* current ){ + uint8 msg[2 + WIMU_GPS_CURRENT_TIME_PACKET_SIZE]; + msg[0] = WIMU_MSGTYPE_DATETIME; + msg[1] = WIMU_GPS_CURRENT_TIME_PACKET_SIZE; + osal_memcpy(&msg[2], current, WIMU_GPS_CURRENT_TIME_PACKET_SIZE); + + uint8 stuffed[2 + WIMU_GPS_CURRENT_TIME_PACKET_SIZE + 2]; + stuffed[2 + WIMU_GPS_CURRENT_TIME_PACKET_SIZE + 1] = WIMU_SYNC_BYTE; + + COBS_StuffData(&msg[0], 2 + WIMU_GPS_CURRENT_TIME_PACKET_SIZE, &stuffed[0]); + + HalUARTWrite(WIMU_UART_PORT, stuffed, 2 + WIMU_GPS_CURRENT_TIME_PACKET_SIZE + 2); +} + +/********************************************************************* + * PUBLIC FUNCTIONS + */ + +/********************************************************************* + * @fn WIMU_Init + * + * @brief Initialization function for the Simple BLE Peripheral App Task. + * This is called during initialization and should contain + * any application specific initialization (ie. hardware + * initialization/setup, table initialization, power up + * notificaiton ... ). + * + * @param task_id - the ID assigned by OSAL. This ID should be + * used to send messages and set timers. + * + * @return none + */ +void WIMU_Init( uint8 task_id ) +{ + WIMU_TaskID = task_id; + + // Setup the GAP Peripheral Role Profile + { + + // Start advertising upon initialization + uint8 initial_advertising_enable = TRUE; + + // By setting this to zero, the device will go into the waiting state after + // being discoverable for 30.72 seconds, and will not being advertising again + // until the enabler is set back to TRUE + uint16 gapRole_AdvertOffTime = 0; + + uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST; + uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; + uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; + uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY; + uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT; + + // Set the GAP Role Parameters + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable ); + GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime ); + + GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData ); + GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData ); + + GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request ); + GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval ); + GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval ); + GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency ); + GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout ); + + } + + // Set the GAP Characteristics + uint8 devNamePermission = GATT_PERMIT_READ|GATT_PERMIT_WRITE; + GGS_SetParameter( GGS_W_PERMIT_DEVICE_NAME_ATT, sizeof ( uint8 ), &devNamePermission ); + GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName ); + + // Set advertising interval + { + uint16 advInt = DEFAULT_ADVERTISING_INTERVAL; + + GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt ); + GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt ); + GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt ); + GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt ); + } + + // Setup the GAP Bond Manager +/* { + uint32 passkey = 0; // passkey "000000" + uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; + uint8 mitm = TRUE; + uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; + uint8 bonding = TRUE; + GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); + GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode ); + GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm ); + GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap ); + GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding ); + }*/ + + // Initialize GATT attributes + GGS_AddService( GATT_ALL_SERVICES ); // GAP + GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes + + Actimetry_AddService( GATT_ALL_SERVICES ); // Actimetry Service + DevInfo_AddService(); // Device Information Service + Batt_AddService(); // Battery Service + Gps_AddService(GATT_ALL_SERVICES); // Gps service + Time_AddService(); // Current Time Service + + +#if defined FEATURE_OAD + VOID OADTarget_AddService(); // OAD Profile +#endif + + // Enable clock divide on halt + // This reduces active current while radio is active and CC254x MCU + // is halted + //HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT ); + +#if defined ( DC_DC_P0_7 ) + + // Enable stack to toggle bypass control on TPS62730 (DC/DC converter) + HCI_EXT_MapPmIoPortCmd( HCI_EXT_PM_IO_PORT_P0, HCI_EXT_PM_IO_PORT_PIN7 ); + +#endif // defined ( DC_DC_P0_7 ) + + // Initialize UART + HalUARTInit(); + + osal_memset(&rx_byte[rx_index],0xFF, WIMU_RX_MAX); + + // Open UART + WIMU_openUART(); + + // Setup a delayed profile startup + osal_set_event( WIMU_TaskID, SBP_START_DEVICE_EVT ); + + osal_set_event( WIMU_TaskID, GAPROLE_ADVERT_ENABLED); + + // Request dev info +// WIMU_requestDevInfo(); +} + +/********************************************************************* + * @fn WIMU_ProcessEvent + * + * @brief Simple BLE Peripheral Application Task event processor. This function + * is called to process all events for the task. Events + * include timers, messages and any other user defined events. + * + * @param task_id - The OSAL assigned task ID. + * @param events - events to process. This is a bit map and can + * contain more than one event. + * + * @return events not processed + */ +uint16 WIMU_ProcessEvent( uint8 task_id, uint16 events ) +{ + + VOID task_id; // OSAL required parameter that isn't used in this function +/////////////////////////////////////////////////////// + if ( events & SYS_EVENT_MSG ) + { + uint8 *pMsg; + + if ( (pMsg = osal_msg_receive( WIMU_TaskID )) != NULL ) + { + //WIMU_ProcessOSALMsg( (osal_event_hdr_t *)pMsg ); + + // Release the OSAL message + VOID osal_msg_deallocate( pMsg ); + } + + // return unprocessed events + return (events ^ SYS_EVENT_MSG); + } +///////////////////////////////////////// + if ( events & SBP_START_DEVICE_EVT ) + { + // Start the Device + VOID GAPRole_StartDevice( &WIMU_PeripheralCBs ); + + // Start Bond Manager + VOID GAPBondMgr_Register( &WIMU_BondMgrCBs ); + +// // Open UART + // WIMU_openUART(); + + // Set timer for first periodic event + osal_start_timerEx( WIMU_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD ); + + return ( events ^ SBP_START_DEVICE_EVT ); + } +////////////////////////////////////////////// + if ( events & SBP_PERIODIC_EVT ) + { + // Restart timer + if ( SBP_PERIODIC_EVT_PERIOD ) + { + osal_start_timerEx( WIMU_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD ); + } + + // Perform periodic application task + performPeriodicTask(); + + return (events ^ SBP_PERIODIC_EVT); + } + +///////////////////////////////////////////// + if ( events & GAPROLE_ADVERT_ENABLED ) + { + + // Request dev info + WIMU_requestDevInfo(); + + // Request module config + //WIMU_requestConfig(); + + return (events ^ GAPROLE_ADVERT_ENABLED); + } +///////////////////////////////////////////// + if ( events & WIMU_CONTROL_EVT){ + //uint8 config; + uint8 config[sizeof(RemControl_t)]; + Actimetry_GetParameter(ACTIMETRY_CONTROL, &config); + + WIMU_setControlMode(config); + + return (events ^ WIMU_CONTROL_EVT); + } + +///////////////////////////////////////////// + if ( events & WIMU_TIME_EVT){ + uint8 currentTime[WIMU_GPS_CURRENT_TIME_PACKET_SIZE]; + + Time_GetParameter(CURRENT_TIME_PARAM, ¤tTime); + + WIMU_setCurrentTime(currentTime); + + return (events ^ WIMU_TIME_EVT); + } + + + +#if defined ( PLUS_BROADCASTER ) + if ( events & SBP_ADV_IN_CONNECTION_EVT ) + { + uint8 turnOnAdv = TRUE; + // Turn on advertising while in a connection + GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &turnOnAdv ); + + return (events ^ SBP_ADV_IN_CONNECTION_EVT); + } +#endif // PLUS_BROADCASTER + + // Discard unknown events + return 0; +} + + +/********************************************************************* + * @fn performPeriodicTask + * + * @brief Perform a periodic application task. This function gets + * called every five seconds as a result of the SBP_PERIODIC_EVT + * OSAL event. In this example, the value of the third + * characteristic in the SimpleGATTProfile service is retrieved + * from the profile, and then copied into the value of the + * the fourth characteristic. + * + * @param none + * + * @return none + */ +static void performPeriodicTask( void ) +{ + +} + +/********************************************************************* + * @fn WIMU_UARTCallback + * + * @brief Called by the UART task when new data is received + * + * @param none + * + * @return none + */ +static void WIMU_UARTCallback(uint8 port, uint8 event) +{ + + if (port==WIMU_UART_PORT) { + WIMU_updateProfileSensors(); + } + +} + +/********************************************************************* + * @fn WIMU_updateProfileSensors + * + * @brief Called by the application to read sensors data + * and put data in profiles + * + * @param none + * + * @return none + */ + +static void WIMU_updateProfileSensors ( void ) +{ + static uint16 numBytes=0; + static uint8 msgCount=0; +// uint8 i; + uint8 end_pos=0; + uint8 msgType; + + // Process new data on UART port + numBytes = Hal_UART_RxBufLen(WIMU_UART_PORT); + if (numBytes>WIMU_RX_MAX){ + numBytes = WIMU_RX_MAX; + } + if (rx_index+numBytes > WIMU_RX_MAX){ + // Error: overflow detected! + rx_index=0; + } + + HalUARTRead (WIMU_UART_PORT, &rx_byte[rx_index], numBytes); // Read data + rx_index+=numBytes; + + // Check if we got the end of the message (SYNC byte) + end_pos = WIMU_getEndOfFrame_Position(); + + // Process message, if we got enough data + ///////////////////////////////////////// + while ( end_pos > 0){ + // Unpack the data + uint8 unstuffed[128]; + COBS_UnStuffData(&rx_byte[0], end_pos, &unstuffed[0]); + msgType = unstuffed[0]; + rx_len = unstuffed[1]; + msgCount++; + + switch(msgType){ + ///////////////// + // DEVICE INFO + ///////////////// + case WIMU_MSGTYPE_DEVINFO:{ + WIMU_DevInfoFrame_t devinfo; + osal_memcpy(&devinfo,&unstuffed[2],sizeof(devinfo)); + //printf("DevInfo\n"); + + DevInfo_SetParameter( DEVINFO_SERIAL_NUMBER, DEVINFO_SERIAL_NUMBER_LEN, &devinfo.serialNumber ); + DevInfo_SetParameter( DEVINFO_HARDWARE_REV, sizeof(uint8), &devinfo.hardRevision ); + DevInfo_SetParameter( DEVINFO_FIRMWARE_REV, DEVINFO_FIRMSOFT_REVISION_LEN, &devinfo.firmSoftRevision[0] ); + DevInfo_SetParameter( DEVINFO_SOFTWARE_REV, DEVINFO_FIRMSOFT_REVISION_LEN, &devinfo.firmSoftRevision[0] ); + + if(scanRspData[8] == 'x' && scanRspData[9] == 'x' && scanRspData[10] == 'x' && scanRspData[11] == 'x') + { + uint8 serialNumber[4] = {0}; + sprintf ((char *)serialNumber, "00%X", devinfo.serialNumber); + scanRspData[8] = serialNumber[0]; + scanRspData[9] = serialNumber[1]; + scanRspData[10] = serialNumber[2]; + scanRspData[11] = serialNumber[3]; + GAP_UpdateAdvertisingData( WIMU_TaskID, FALSE, sizeof(scanRspData), scanRspData ); + } + + // Set sampling rate of the module + //Actimetry_SetParameter( ACTIMETRY_CONFIG, 1, &devinfo.samplingRate); + } + break; + + /////////////// + // Battery + /////////////// + case WIMU_MSGTYPE_BATTERY:{ // Battery Data + WIMU_battery_packet_t batteryData; + + // Process Data + osal_memcpy(&batteryData,&unstuffed[2],sizeof(batteryData)); + + // Update Battery values in the profile + Batt_SetParameter( BATT_PARAM_LEVEL, WIMU_BATTERY_PACKET_SIZE, &batteryData ); + + //GAP_UpdateAdvertisingData( WIMU_TaskID, FALSE, sizeof(scanRspData), scanRspData ); + } + break; + + /////////////// + // IMU + /////////////// + case WIMU_MSGTYPE_IMU:{ //IMU Data{ + WIMU_actimetry_imu_packet_t imuData; + WIMU_actimetry_quaternion_packet_t quaternionData; + osal_memcpy(&imuData,&unstuffed[2],sizeof(imuData)); + osal_memcpy(&quaternionData,&unstuffed[2 + sizeof(imuData)],WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE); + + // Update Actimetry values in the profile + Actimetry_SetParameter( ACTIMETRY_IMU, WIMU_ACTIMETRY_IMU_PACKET_SIZE, &imuData ); + Actimetry_SetParameter( ACTIMETRY_QUATERNION, WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE, &quaternionData ); + } + break; + + /////////////// + // GPS + /////////////// + case WIMU_MSGTYPE_GPS:{ + WIMU_GPSFrame_t gpsData; + osal_memcpy(&gpsData,&unstuffed[2],sizeof(gpsData)); + + // Update values in profile + Gps_SetParameter( GPS_LOCATION_AND_SPEED, WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE, &gpsData.loc_speed ); + Gps_SetParameter( GPS_POSITION_QUALITY, WIMU_GPS_POSITION_QUALITY_PACKET_SIZE, &gpsData.quality ); + Gps_SetParameter( GPS_DATE_TIME, WIMU_GPS_DATE_TIME_PACKET_SIZE, &gpsData.date_time ); + } + break; + + // Date and time + case WIMU_MSGTYPE_DATETIME:{ + currentTime_t currentTime; + osal_memcpy(¤tTime,&unstuffed[2],sizeof(currentTime)); + Time_SetParameter(CURRENT_TIME_PARAM, WIMU_GPS_CURRENT_TIME_PACKET_SIZE, ¤tTime ); + } break; + + // WIMU Config + case WIMU_MSGTYPE_CONFIG:{ + //printf("Config\n"); + IMU_Config_t config; + osal_memcpy(&config, &unstuffed[2], sizeof(IMU_Config_t)); + Actimetry_SetParameter( ACTIMETRY_CONFIG, sizeof(IMU_Config_t), &config); + }break; + + // WIMU Control + case WIMU_MSGTYPE_CONTROL:{ + RemControl_t control; + osal_memcpy(&control, &unstuffed[2], sizeof(RemControl_t)); + Actimetry_SetParameter( ACTIMETRY_CONTROL, sizeof(RemControl_t), &control); + }break; + + + default: + break; + } + + // Remove bytes from data buffer + //printf("#%d: %d, %d\n\r", msgCount, unstuffed[0], unstuffed[1]); + osal_memcpy(&rx_byte[0],&rx_byte[end_pos+1],rx_index - end_pos); + rx_index -= end_pos+1; + osal_memset(&rx_byte[rx_index],0xFF, WIMU_RX_MAX - rx_index - 1); + + end_pos = WIMU_getEndOfFrame_Position(); + } + +} + +uint8 WIMU_getEndOfFrame_Position(void){ + uint8 end_pos=0; + uint16 i; + for (i=0; ihdr.event = KEY_CHANGE; + msgPtr->state = state; + msgPtr->keys = keys; + + osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); + } + return ( SUCCESS ); + } + else + return ( FAILURE ); +} + +/********************************************************************* + * @fn OnBoard_KeyCallback + * + * @brief Callback service for keys + * + * @param keys - keys that were pressed + * state - shifted + * + * @return void + *********************************************************************/ +void OnBoard_KeyCallback ( uint8 keys, uint8 state ) +{ + uint8 shift; + (void)state; + + // shift key (S1) is used to generate key interrupt + // applications should not use S1 when key interrupt is enabled + shift = (OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE) ? false : ((keys & HAL_KEY_SW_6) ? true : false); + + if ( OnBoard_SendKeys( keys, shift ) != SUCCESS ) + { + // Process SW1 here + if ( keys & HAL_KEY_SW_1 ) // Switch 1 + { + } + // Process SW2 here + if ( keys & HAL_KEY_SW_2 ) // Switch 2 + { + } + // Process SW3 here + if ( keys & HAL_KEY_SW_3 ) // Switch 3 + { + } + // Process SW4 here + if ( keys & HAL_KEY_SW_4 ) // Switch 4 + { + } + // Process SW5 here + if ( keys & HAL_KEY_SW_5 ) // Switch 5 + { + } + // Process SW6 here + if ( keys & HAL_KEY_SW_6 ) // Switch 6 + { + } + } + + /* If any key is currently pressed down and interrupt + is still enabled, disable interrupt and switch to polling */ + if( keys != 0 ) + { + if( OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE ) + { + OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } + /* If no key is currently pressed down and interrupt + is disabled, enable interrupt and turn off polling */ + else + { + if( OnboardKeyIntEnable == HAL_KEY_INTERRUPT_DISABLE ) + { + OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } +} + +/********************************************************************* + * @fn Onboard_soft_reset + * + * @brief Effect a soft reset. + * + * @param none + * + * @return none + * + *********************************************************************/ +__near_func void Onboard_soft_reset( void ) +{ + HAL_DISABLE_INTERRUPTS(); + asm("LJMP 0x0"); +} + +#if defined FEATURE_ABL +#elif defined FEATURE_SBL +#elif defined FEATURE_EBL +#elif defined FEATURE_UBL_MSD +#else +/********************************************************************* + * @fn appForceBoot + * + * @brief Common force-boot function for the HCI library to invoke. + * + * @param none + * + * @return void + *********************************************************************/ +void appForceBoot(void) +{ + // Dummy function for HCI library that cannot depend on the SBL build defines. +} +#endif + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/OnBoard.h b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/OnBoard.h new file mode 100644 index 0000000..1b30b92 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/OnBoard.h @@ -0,0 +1,186 @@ +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ONBOARD_H +#define ONBOARD_H + +#include "hal_mcu.h" +#include "hal_sleep.h" +#include "osal.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses +#define MCU_RAM_BEG 0x0100 +#define MCU_RAM_END RAMEND +#define MCU_RAM_LEN (MCU_RAM_END - MCU_RAM_BEG + 1) + +// Internal (MCU) heap size +#if !defined( INT_HEAP_LEN ) + #define INT_HEAP_LEN 1024 // 1.00K +#endif + +// Memory Allocation Heap +#if defined( EXTERNAL_RAM ) + #define MAXMEMHEAP EXT_RAM_LEN // Typically, 32K +#else + #define MAXMEMHEAP INT_HEAP_LEN // Typically, 0.70-1.50K +#endif + +// Initialization levels +#define OB_COLD 0 +#define OB_WARM 1 +#define OB_READY 2 + +#define SystemResetSoft() Onboard_soft_reset() + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions +#define TIMER_DECR_TIME 1 // 1ms - has to be matched with TC_OCC +#define RETUNE_THRESHOLD 1 // Threshold for power saving algorithm + +/* OSAL timer defines */ +#define TICK_TIME 1000 /* Timer per tick - in micro-sec */ +#define TICK_COUNT 1 +#define OSAL_TIMER HAL_TIMER_3 + +#ifndef _WIN32 +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); +#endif + +#ifndef RAMEND +#define RAMEND 0x1000 +#endif + +/* Tx and Rx buffer size defines used by SPIMgr.c */ +#define MT_UART_THRESHOLD 5 +#define MT_UART_TX_BUFF_MAX 170 +#define MT_UART_RX_BUFF_MAX 128 +#define MT_UART_IDLE_TIMEOUT 5 + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset +#if _lint + #define SystemReset() +#else + #define SystemReset() HAL_SYSTEM_RESET(); +#endif + +#define BootLoader() + +/* Reset reason for reset indication */ +#define ResetReason() ((SLEEPSTA >> 3) & 0x03) + +/* port definition stuff used by MT */ +#if defined (ZAPP_P1) + #define ZAPP_PORT HAL_UART_PORT_0 //SERIAL_PORT1 +#elif defined (ZAPP_P2) + #define ZAPP_PORT HAL_UART_PORT_1 //SERIAL_PORT2 +#else + #undef ZAPP_PORT +#endif +#if defined (ZTOOL_P1) + #define ZTOOL_PORT HAL_UART_PORT_0 //SERIAL_PORT1 +#elif defined (ZTOOL_P2) + #define ZTOOL_PORT HAL_UART_PORT_1 //SERIAL_PORT2 +#else + #undef ZTOOL_PORT +#endif + +/* sleep macros required by OSAL_PwrMgr.c */ +#define SLEEP_DEEP 0 /* value not used */ +#define SLEEP_LITE 0 /* value not used */ +#define MIN_SLEEP_TIME 14 /* minimum time to sleep */ +#define OSAL_SET_CPU_INTO_SLEEP(m) halSleep(m) /* interface to HAL sleep */ + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#endif diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ebl.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ebl.xcl new file mode 100644 index 0000000..efc5420 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ebl.xcl @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: cc254x_f256_ebl.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the Encrypting Boot Loader. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)IMAGE_HEADER=0x800-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgA.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgA.xcl new file mode 100644 index 0000000..cbf88c1 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgA.xcl @@ -0,0 +1,210 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgA.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Image Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 // First page is for the IBM which intercepts the H/W INTVECS. +-D_CODE_END=0x3FFF // Next 7 pages of Bank 0. +// +-D_BANK4_BEG=0x4B000 // Last 10 pages of Bank 4. +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x0800-0x0801 +-Z(CODE)IMAGE_HEADER=0x802-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 5). +-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc=8005,=0804-_BANK7_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgAe.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgAe.xcl new file mode 100644 index 0000000..853b17c --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgAe.xcl @@ -0,0 +1,204 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgAe.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Encrypted Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 // First page is for the IBM which intercepts the H/W INTVECS. +-D_CODE_END=0x3FFF // Next 7 pages of Bank 0. +// +-D_BANK4_BEG=0x4B000 // Last 10 pages of Bank 4. +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)IMAGE_HEADER=0x800-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 5). +-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgB.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgB.xcl new file mode 100644 index 0000000..a9d41fa --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgB.xcl @@ -0,0 +1,209 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgB.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Image Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x4030 // Last 8 pages of Bank 0. +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4AFFF // First 6 pages of Bank 4. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x4000-0x4001 +-Z(CODE)IMAGE_HEADER=0x4002-0x400F +-Z(CODE)AES_HEADER=0x4010-0x402F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 4). +-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc=8005,=4004-_BANK4_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgBe.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgBe.xcl new file mode 100644 index 0000000..ece5b1a --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_imgBe.xcl @@ -0,0 +1,204 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgBe.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Encrypted Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x4030 // Last 8 pages of Bank 0. +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4AFFF // First 6 pages of Bank 4. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + + +-Z(CODE)IMAGE_HEADER=0x4000-0x400F +-Z(CODE)AES_HEADER=0x4010-0x402F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 4). +-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_oad.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_oad.xcl new file mode 100644 index 0000000..0eba5b6 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_oad.xcl @@ -0,0 +1,206 @@ +/************************************************************************************************** + Filename: cc254x_f256_oad.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the OAD Boot Loader. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3F7FF // First 15 pages of Bank 3. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x0800-0x0801 +-Z(CODE)IMAGE_HEADER=0x802-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc16,=0804-_BANK3_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_sbl.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_sbl.xcl new file mode 100644 index 0000000..75a4baa --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_sbl.xcl @@ -0,0 +1,219 @@ +/************************************************************************************************** + Filename: cc254x_f256_sbl.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the simple Serial Boot Loader. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0800 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)CHECKSUM=0x890-0x891 +-Z(CODE)CRC_SHDW=0x892-0x893 +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip SBL, CRC & SHDW, and NV pages when calculating the CRC. +// +-J2,crc16,=_CODE_BEG-890,894-_BANK7_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ubl_msd.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ubl_msd.xcl new file mode 100644 index 0000000..aa0e2cc --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_f256_ubl_msd.xcl @@ -0,0 +1,216 @@ +/************************************************************************************************** + Filename: cc254x_f256_ubl_msd.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC2540USB BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the Encrypting UBL by USB-MSD. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x820 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Skip NV pages 120-121; UBL pages 122-126; Lock-bits page 127. +-D_BANK7_END=0x7BFFF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)AES_CTRL_BLK=0x800-0x81F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)UBL_METADATA_SPACE=0xE9C-0xEFF +-Z(CODE)UBL_FILENAME_SPACE=0xF00-0xFFF +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_sim2bin.exe b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_sim2bin.exe new file mode 100644 index 0000000..283b58b Binary files /dev/null and b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_sim2bin.exe differ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.bat b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.bat new file mode 100644 index 0000000..0386c84 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.bat @@ -0,0 +1,78 @@ +:: /********************************************************************************************** +:: Filename: cc254x_ubl_pp.bat +:: Revised: $Date:$ +:: Revision: $Revision:$ +:: +:: Description: +:: +:: This is a launcher for the cc254x_ubl_pp.js script which does post-processing on IAR output +:: files; it is designed to be invoked from IAR project, Build Actions, Post-build command line. +:: +:: There are 3 or 5 required arguments when invoking this batch file: +:: +:: %1 must be the IAR project path: "$PROJ_DIR$" +:: +:: %2 directs the action of the post-processing script as follows: +:: +:: "ProdUBL" generates a binary application image from the IAR output "simple-code", .sim, file; +:: this binary is used for downloading via the UBL. +:: +:: "ProdHex" generates a hex image that is the combination of the serial boot loader +:: with the application image; this combination hex file is for mass production programming +:: via a tool like SmartRF Programmer. +:: +:: %3 must be the path and file name of the IAR output, like this: +:: "$PROJ_DIR$\CC2540F256_UBL\Exe\rnp_cc2540f256_ubl" +:: OR +:: "$PROJ_DIR$\CC2540F256_HEX\Exe\rnp_cc2540f256" +:: +:: %4 (Required for "ProdHex") must be the path and file name of the IAR output UBL, like this: +:: "$PROJ_DIR$\..\..\SerialBoot\CC254x\CC2540F256_UART0_HEX\Exe\ubl_cc2540f256_uart0.hex" +:: +:: %5 (Required for "ProdHex") the number of lines in the UBL hex file to pre-pend to the +:: application image (the remainder of the UBL hex file will be appended to the application). +:: Currently UBL is only using the first page to intercept the IVEC's, so 128 + 1 = 129 to +:: include the hex file header line (which is stripped from application image when appending it +:: to this root area of the UBL). +:: +:: Note that the above serial boot loader corresponding to the RPC transport of the application +:: build target (e.g. CC2540F256, USART0) must have been built prior to this batch file execution. +:: This is accomplished with the 'Pre-build command line' option invoking the cc254x_ubl_pre.bat +:: with the corresponding arguments as specified in that batch file. +:: +:: +:: Copyright 2011 Texas Instruments Incorporated. All rights reserved. +:: +:: IMPORTANT: Your use of this Software is limited to those specific rights +:: granted under the terms of a software license agreement between the user +:: who downloaded the software, his/her employer (which must be your employer) +:: and Texas Instruments Incorporated (the "License"). You may not use this +:: Software unless you agree to abide by the terms of the License. The License +:: limits your use, and you acknowledge, that the Software may not be modified, +:: copied or distributed unless embedded on a Texas Instruments microcontroller +:: or used solely and exclusively in conjunction with a Texas Instruments radio +:: frequency transceiver, which is integrated into your product. Other than for +:: the foregoing purpose, you may not use, reproduce, copy, prepare derivative +:: works of, modify, distribute, perform, display or sell this Software and/or +:: its documentation for any purpose. +:: +:: YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +:: PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +:: INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +:: NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +:: TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +:: NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +:: LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +:: INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE +:: OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCU:: +:: OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +:: (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +:: +:: Should you have any questions regarding your right to use this Software, +:: contact Texas Instruments Incorporated at www.TI.com. +:: **********************************************************************************************/ + +@echo off +chdir %1\..\..\common\cc2540 +start cc254x_ubl_pp.js %2 %3 %4 %5 + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.js b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.js new file mode 100644 index 0000000..d739fa9 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/cc254x_ubl_pp.js @@ -0,0 +1,121 @@ +/************************************************************************************************** + Filename: cc254x_ubl_pp.js + Revised: $Date: 2010-08-23 12:24:40 -0700 (Mon, 23 Aug 2010) $ + Revision: $Revision: 23475 $ + + Description: + + This file is a JScript file that can be run by the Windows Script Host, which is installed by + default on Windows XP SP2 and later. The script acts on the arguments to do post-processing for + the UBL-enabled build targets. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +var ForReading = 1; +var ForWriting = 2; + +// void main(void) +{ + var ppType = WScript.Arguments(0); + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var ppPath = WScript.Arguments(1); + var fin, fout; + + switch (ppType) { + case "ProdUBL": + fin = ppPath + ".sim" + fout = ppPath + ".bin" + fso.CopyFile(fin, "tmp.sim", true); + var WshShell = new ActiveXObject("WScript.Shell"); + // Invoke and wait for the binary file conversion tool to finish. + WshShell.Run("cc254x_sim2bin.exe tmp.sim tmp.bin", 8, true); + fso.CopyFile("tmp.bin", fout, true); + fso.DeleteFile("tmp.bin"); + fso.DeleteFile("tmp.sim"); + break; + + case "ProdHex": + var ublFile = WScript.Arguments(2); + var rootCnt = WScript.Arguments(3); + var fubl = fso.OpenTextFile(ublFile, ForReading); + fout = fso.CreateTextFile(ppPath + ".hex", true); + + // UBL is split between root (intercepting IVEC's) and the last or lock-bits page. + while (rootCnt != 0) + { + var s = fubl.ReadLine(); + fout.WriteLine(s); + rootCnt--; + } + + fin = fso.OpenTextFile(ppPath + ".a51", ForReading) + fin.ReadLine(); // Throw away the first line since appending to a valid .hex file. + + // Throw away the last two lines since a valid .hex file will be appended. + var line = new Array(3); + var rIdx = 2; + var wIdx = 0; + line[0] = fin.ReadLine(); + line[1] = fin.ReadLine(); + while (1) + { + fout.WriteLine(line[wIdx]); + line[rIdx] = fin.ReadLine(); + if (fin.AtEndOfStream) + { + break; + } + rIdx = (rIdx+1) % 3; + wIdx = (wIdx+1) % 3; + } + fin.Close(); + + // Look to throw away the header line to the banked area of the UBL image. + var s = fubl.ReadLine(); + if (s.substr(1,1) != "0") + { + fout.WriteLine(s); + } + + while (!fubl.AtEndOfStream) + { + var s = fubl.ReadLine(); + fout.WriteLine(s); + } + + fout.Close(); + fubl.Close(); + break; + } +} + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540b.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540b.xcl new file mode 100644 index 0000000..63af22b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540b.xcl @@ -0,0 +1,386 @@ +/************************************************************************************************** + Filename: ti_51ew_cc2540b.xcl + Revised: $Date$ + Revision: $Revision: 22814 $ + + Description: This is a linker command line file for the IAR XLINK tool for the + CC2540 SoC where the General Options + for location for constants and strings is "ROM mapped as data". + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Variables (used by lnk_base.xcl) +// ================================ +// +// Segment limits +// -------------- +// +// +// IDATA +// +-D_IDATA_END=0xFF // Last address of IDATA memory +// +// +// PDATA +// +-D_PDATA_START=0x1E00 // First address for PDATA +-D_PDATA_END=0x1EFF // Last address for PDATA +// // (note: any 256 byte page of (I)XDATA can be used as PDATA, +// // see "PDATA page setup" section below) +// +// IXDATA +// +-D_IXDATA_START=0x0001 // First address for internal XDATA (address 0x0000 saved for NULL pointer) +-D_IXDATA_END=0x1EFF // Last address for internal XDATA (for 8 kB SRAM option) +//-D_IXDATA_END=0x0EFF // (for 4 kB SRAM option) +//-D_IXDATA_END=0x06FF // (for 2 kB SRAM option) +// +// +// XDATA +// +// The internal XDATA is used as XDATA. +-D_XDATA_START=_IXDATA_START +-D_XDATA_END=_IXDATA_END +// +// +// CODE +// +-D_CODE_START=0x0000 +-D_CODE_END=0x7FFF // Last address for ROOT bank. +// // (the rest is mapped into BANKED_CODE segment) +// +-D_FIRST_BANK_ADDR=0x10000 // Offset fix for this part's unconventional bank numbering (root bank is callled "bank 0") +// +// +// + +// +// NEAR CODE +// +-D_NEAR_CODE_END=_CODE_END // Last address for near code, near code segment is 32kB +// // in banked code model. +// +// +// Special SFRs +// ------------ +// +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_START=0 // Start address for default register bank (00,08,10,18). +// +// +// PDATA page setup +// +-D?PBANK_NUMBER=0x1E // High byte of 16-bit address to the PDATA area + // (i.e. 0x1E00-0x1EFF as PDATA, if 8 kB SRAM). +//-D?PBANK=0x93 // Most significant byte in MOVX A,@Ri. (0x93 is sfr MPAGE). +// +// +// Virtual register setup +// ---------------------- +// +-D_BREG_START=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_START%8=0 where _BREG_START <= 0x78. +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_START/8. +// +//////////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////////// +// +// To the reader: Ignore this section ------------------------------------------ +// +// +// Dummy definitions needed to satisfy lnk_base.xcl +// +// +-D_FAR_DATA_NR_OF_BANKS=0x0E // Number of banks in far data memory. +-D_FAR_DATA_START=0x010001 // First address of far memory. +-D_FAR_DATA_END=0xFFFFFF // Last address of far memory. +-D_FAR_CODE_START=_CODE_START // First address for far code. +-D_FAR_CODE_END=_CODE_END // Last address for far code. +// +//////////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_START +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_START +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F +-Z(DATA)PSP,XSP=08-7F +-Z(DATA)DOVERLAY=08-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F + +-U(IDATA)0-7F=(DATA)0-7F + +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA_END +-Z(IDATA)IOVERLAY=08-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +// Note: INTVEC must be placed first. +// Note: CSTART Must be located in first 64k. + +// +// Top of memory +// +-Z(CODE)INTVEC=_CODE_START +-Z(CODE)CSTART=_CODE_START-_CODE_END + +// +// Initializers +// +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_START-_CODE_END +-Z(CODE)HUGE_ID=_FAR_CODE_START-_FAR_CODE_END + +// +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END +// +// Program memory +// +-Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_N,NEAR_CODE=_CODE_START-_CODE_END +// +// Setup for constants located in code memory: +// +-P(CODE)CODE_C=_CODE_START-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1) +-P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH +// +// Banked Code +// +-P(CODE)BANKED_CODE=_CODE_START-_CODE_END,[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 // Setup bank-switched segments. + +// +// FAR Code +// +-P(CODE)FAR_CODE_C,FAR_CODE_N,FAR_CODE=[_FAR_CODE_START-_FAR_CODE_END]/10000 +-P(CODE)HUGE_CODE_C=_FAR_CODE_START-_FAR_CODE_END + +// +// Checksum +// +-Z(CODE)CHECKSUM#_CODE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +// +// Stacks located in XDATA +// +-Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED_STACK_START +-Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA_START-_PDATA_END +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_START-_XDATA_END + +// +// PDATA - data memory +// +-Z(XDATA)PDATA_Z,PDATA_I=_PDATA_START-_PDATA_END +-P(XDATA)PDATA_N=_PDATA_START-_PDATA_END + +// +// XDATA - data memory +// +-Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA_START-_IXDATA_END +-P(XDATA)IXDATA_N=_IXDATA_START-_IXDATA_END + +-Z(XDATA)XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_START-_XDATA_END + +-Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA_START-_XDATA_END + +// +// FAR - extended data memory +// + +// initialized FAR data +// Note: The segment FAR_I and FAR_ID must start at the same address within a 64k bank, +// they must therefore be located first in the FAR data area, and in the xlink linker file +// Note: *_I segment is located in RAM but *_ID segments is located in ROM + +-Z(XDATA)FAR_Z=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-Z(XDATA)FAR_I=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-Z(CODE)FAR_ID=[_FAR_CODE_START-_FAR_CODE_END]/10000 +-Z(XDATA)FAR_HEAP+_FAR_HEAP_SIZE=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-P(XDATA)FAR_N=[_FAR_DATA_START-_FAR_DATA_END]*_FAR_DATA_NR_OF_BANKS+10000 +-P(CONST)FAR_ROM_C=[_FAR_DATA_START-_FAR_DATA_END]*_FAR_DATA_NR_OF_BANKS+10000 + +// +// HUGE - extended data memory +// +-Z(XDATA)HUGE_Z,HUGE_I=_FAR_DATA_START-_FAR_DATA_END +-P(XDATA)HUGE_N=_FAR_DATA_START-_FAR_DATA_END + +-Z(XDATA)HUGE_HEAP+_HUGE_HEAP_SIZE=_FAR_DATA_START-_FAR_DATA_END +-Z(CONST)HUGE_ROM_C=_FAR_DATA_START-_FAR_DATA_END + +-cx51 + + +// Internal flash used for NV address space. +// --------------------------- +// +// Address range for HAL_FLASH_PAGE_SIZE == 2048 +-D_BLENV_ADDRESS_SPACE_START=0x7E800 +-D_BLENV_ADDRESS_SPACE_END=0x7F7FF +// +// Address range for HAL_FLASH_PAGE_SIZE == 4096 +//-D_BLENV_ADDRESS_SPACE_START=0x7D000 +//-D_BLENV_ADDRESS_SPACE_END=0x7EFFF +// +-Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// Texas Instruments device specific +// ================================= +// +// +// Setup of CODE banks +// ------------------- +// +-D_BANK0_START=0x00000 // Note: Unconventional bank numbering on this part: +-D_BANK0_END=0x07FFF // "BANK0" is the root bank/common area! +// +-D_BANK1_START=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_START=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_START=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_START=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_START=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_START=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_START=0x78000 +// End of code space has to match that of OSAL NV page start. +// Note that in this way, we'll be wasting last page spaced by NV pages, +// but in order not to overwrite NV pages when downloading new image, the waste +// is inevitable. +// New OSAL NV driver will move the NV pages to the last pages not wasting +// last page itself. +-D_BANK7_END=(_BLENV_ADDRESS_SPACE_START-1) + +// +// Define each bank as a segment for allowing code placement into specific banks +-P(CODE)BANK0=_BANK0_START-_BANK0_END +-P(CODE)BANK1=_BANK1_START-_BANK1_END +-P(CODE)BANK2=_BANK2_START-_BANK2_END +-P(CODE)BANK3=_BANK3_START-_BANK3_END +-P(CODE)BANK4=_BANK4_START-_BANK4_END +-P(CODE)BANK5=_BANK5_START-_BANK5_END +-P(CODE)BANK6=_BANK6_START-_BANK6_END +-P(CODE)BANK7=_BANK7_START-_BANK7_END +// + +//-- +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses in EW8051 to physical +// addresses in output file format. (Without this, the HEX output file will include 32 kB blocks +// of zero bytes/gap in between each code bank.) +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000 +// +// If -M is used when building debug output, XLINK will give a warning [w69]. We will ignore it: +-ww69=i +// +//-- + +// +// Flash lock bits +// --------------- +// +// The CC2540 has its flash lock bits, one bit for each 2048 B flash page, located in +// the last available flash page, starting 16 bytes from the page end. The number of +// bytes with flash lock bits depends on the flash size configuration of the CC2540 +// (maximum 16 bytes, i.e. 128 page lock bits, for the CC2530 with 256 kB flash). +// But since the bit that controls the debug interface lock is always in the last byte +// we include all 16 bytes in the segment, regardless of flash size. +// +-D_FLASH_LOCK_BITS_START=((_NR_OF_BANKS*_FIRST_BANK_ADDR)+0xFFF0) +-D_FLASH_LOCK_BITS_END=((_NR_OF_BANKS*_FIRST_BANK_ADDR)+0xFFFF) +// (this should resolve to 0x7FFF0-0x7FFFF if 256 kB flash (_NR_OF_BANKS=7), and +// 0x3FFF0-0x3FFFF if 128 kB flash (_NR_OF_BANKS=3)) +// +// +// Define as segment in case one wants to put something there intentionally (then comment out the hack below) +-Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +// Hack to reserve the FLASH_LOCK_BITS segment from being used as CODE, avoiding +// code to be placed on top of the flash lock bits. If code is placed on address 0x0000, +// (INTVEC is by default located at 0x0000) then the flash lock bits will be reserved too. +// +-U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540f128b.xcl b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540f128b.xcl new file mode 100644 index 0000000..c10dcff --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/cc2540/ti_51ew_cc2540f128b.xcl @@ -0,0 +1,281 @@ +/************************************************************************************************** + Filename: ti_51ew_cc2540bf128.xcl + Revised: $Date$ + Revision: $Revision: 22814 $ + + Description: This is a linker command line file for the IAR XLINK tool for the + CC2540 SoC where the General Options + for location for constants and strings is "ROM mapped as data". + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// based on lnk51ew_CC2540F128_banked.xcl: linker command file for IAR Embedded Workbench IDE +// Generated: Mon May 24 00:00:01 +0200 2010 +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// ============== +// +// IDATA +// ----- +-D_IDATA0_START=0x00 +-D_IDATA0_END=0xFF +// +// PDATA +// ----- +// We select 256 bytes of (I)XDATA memory that can be used as PDATA (see also "PDATA page setup" below) +-D_PDATA0_START=0x1E00 +-D_PDATA0_END=0x1EFF +// +// +// IXDATA +// ------ +-D_IXDATA0_START=0x0001 // Skip address 0x0000 (to avoid ambiguities with NULL pointer) +-D_IXDATA0_END=0x1EFF // CC2540F128 has 8 kB RAM (NOTE: 256 bytes are used for IDATA) +// +// +// XDATA +// ----- +-D_XDATA0_START=_IXDATA0_START +-D_XDATA0_END=_IXDATA0_END +// +// NEAR CODE +// --------- +-D_NEAR_CODE_START=0x0000 +// +// Special SFRs +// ============ +// +// CODE bank setup +// --------------- +-D_FIRST_BANK_ADDR=0x10000 // Offset fix for this part's unconventional bank numbering (root bank is called "bank 0") +// +// Register bank setup +// ------------------- +-D?REGISTER_BANK=0x0 // Sets default register bank (0,1,2,3) +-D_REGISTER_BANK_START=0x0 // Start address for default register bank (0x0, 0x8, 0x10, 0x18) +// +// PDATA page setup +// ---------------- +-D?PBANK_NUMBER=0x1E // High byte of 16-bit address to the PDATA area +// +// Virtual register setup +// ---------------------- +-D_BREG_START=0x00 +-D?VB=0x20 +-D?ESP=0x9B //Extended stack pointer register location +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// ============ +-Z(BIT)BREG=_BREG_START +-Z(BIT)BIT_N=0-7F +-Z(DATA)REGISTERS+8=_REGISTER_BANK_START +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F +-Z(DATA)PSP,XSP=08-7F +-Z(DATA)DOVERLAY=08-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA0_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA0_END +-Z(IDATA)IOVERLAY=08-FF +// +// ROM memory +// ========== +// +// Top of memory +// ------------- +-Z(CODE)INTVEC=0 +-Z(CODE)CSTART=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// Initializers +// ------------ +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// +-D_SLEEP_CODE_SPACE_START=(_CODEBANK_START-8) +-D_SLEEP_CODE_SPACE_END=(_CODEBANK_START-1) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END +// +// Program memory +// -------------- +-Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_C,CODE_N,NEAR_CODE=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// Setup for constants located in code memory: +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1) +-P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH +// +// Banked code +// ----------- +-P(CODE)BANKED_CODE=_NEAR_CODE_START-(_CODEBANK_START-1),[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 +// +// Checksum +// -------- +-Z(CODE)CHECKSUM#(_CODEBANK_START-1) +// +// XDATA memory +// ============ +// +// Stacks located in XDATA +// ----------------------- +-Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED_STACK_START +-Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA0_START-_PDATA0_END +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA0_START-_XDATA0_END +// +// PDATA - data memory +// ------------------- +-Z(XDATA)PDATA_Z,PDATA_I=_PDATA0_START-_PDATA0_END +-P(XDATA)PDATA_N=_PDATA0_START-_PDATA0_END +// +// XDATA - data memory +// ------------------- +-Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA0_START-_IXDATA0_END +-P(XDATA)IXDATA_N=_IXDATA0_START-_IXDATA0_END +-Z(XDATA)XDATA_Z,XDATA_I=_XDATA0_START-_XDATA0_END +-P(XDATA)XDATA_N=_XDATA0_START-_XDATA0_END +-Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA0_START-_XDATA0_END + +// +// Core +// ==== +-cx51 + + +// Internal flash used for NV address space. +// --------------------------- +// +// Address range for HAL_FLASH_PAGE_SIZE == 2048 +-D_BLENV_ADDRESS_SPACE_START=0x3E800 +-D_BLENV_ADDRESS_SPACE_END=0x3F7FF +// +// Address range for HAL_FLASH_PAGE_SIZE == 4096 +//-D_BLENV_ADDRESS_SPACE_START=0x3D000 +//-D_BLENV_ADDRESS_SPACE_END=0x3EFFF +// +-Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// Texas Instruments device specific +// ================================= +// +// Building with Intel HEX (.hex) as output format +// ----------------------------------------------- +// NOTE: The -M option below is needed when linker output should be in the +// "intel-extended" (HEX) file format for banked code model. It translates +// the logical addresses used by EW8051/XLINK linker to the correct +// physical flash addresses used in output file format. (Without this, the +// HEX output file will include 32 kB blocks of empty space/gaps in between +// each code bank, and our HEX image will not work.) +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000 +// +// If -M is enabled when building debug output file for C-SPY, the XLINK linker +// will give a warning [w69] that it has no effect on the output file format. +// For EW8051 v7.51A and later, we can ignore/supress this warning (earlier +// versions caused a linker error, so then we had to turn the -M option on/off +// according to our output file format). +// +-ww69=i // Ignore linker warning 69 +// +// Hence for v7.51A and later, we can leave the -M option enabled at all times +// (as demonstrated above) regardless of output file format. Note however, that +// with the -M option enabled the code space addresses shown in the linker list +// file (.map) will also be translated to physical addresses (as found in the HEX +// file), i.e. not necessarily match the addresses used by EW8051/XLINK linker. +// +// +// Setup of CODE banks +// ------------------- +// +// We can also define each bank as a segment in order to allow code placement +// into specific banks, if needed. +-D_BANK0_START=0x00000 // Note: Unconventional bank numbering on this part: +-D_BANK0_END=0x07FFF // "BANK0" is the root bank/common area! +// +-D_BANK1_START=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_START=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_START=0x38000 +// End of code space has to match that of OSAL NV page start. +// Note that in this way, we'll be wasting last page spaced by NV pages, +// but in order not to overwrite NV pages when downloading new image, the waste +// is inevitable. +// New OSAL NV driver will move the NV pages to the last pages not wasting +// last page itself. +-D_BANK3_END=(_BLENV_ADDRESS_SPACE_START-1) +// +-P(CODE)BANK0=_BANK0_START-_BANK0_END +-P(CODE)BANK1=_BANK1_START-_BANK1_END +-P(CODE)BANK2=_BANK2_START-_BANK2_END +-P(CODE)BANK3=_BANK3_START-_BANK3_END +// +// +// Flash lock bits +// --------------- +// +// The CC2540 has its flash lock bits, one bit for each 2048 B flash page, located in +// the last available flash page, starting 16 bytes from the page end. The number of +// bytes with flash lock bits depends on the flash size configuration of the CC2540 +// (maximum 16 bytes, i.e. 128 page lock bits, for the CC2540 with 256 kB flash). +// Note that the bit that controls the debug interface lock is always in the last byte, +// regardless of flash size. +// +-D_FLASH_LOCK_BITS_START=0x3FFF0 +-D_FLASH_LOCK_BITS_END=0x3FFFF +// +// Define as segment in case one wants to put something there intentionally (then comment out the trick below) +-Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +// Trick to reserve the FLASH_LOCK_BITS segment from being used as normal CODE, avoiding +// code to be placed on top of the flash lock bits. If code is placed on address 0x0000, +// (INTVEC is by default located at 0x0000) then the flash lock bits will be reserved too. +// +-U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.c b/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.c new file mode 100644 index 0000000..8b1e407 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.c @@ -0,0 +1,228 @@ +/******************************************************************************* + Filename: npi.c + Revised: $Date: 2008-06-11 14:30:47 -0700 (Wed, 11 Jun 2008) $ + Revision: $Revision: 17210 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_board.h" +#include "npi.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * PROTOTYPES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +/******************************************************************************* + * @fn NPI_InitTransport + * + * @brief This routine initializes the transport layer and opens the port + * of the device. Note that based on project defines, either the + * UART, USB (CDC), or SPI driver can be used. + * + * input parameters + * + * @param npiCback - User callback function when data is available. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void NPI_InitTransport( npiCBack_t npiCBack ) +{ + halUARTCfg_t uartConfig; + + // configure UART + uartConfig.configured = TRUE; + uartConfig.baudRate = NPI_UART_BR; + uartConfig.flowControl = NPI_UART_FC; + uartConfig.flowControlThreshold = NPI_UART_FC_THRESHOLD; + uartConfig.rx.maxBufSize = NPI_UART_RX_BUF_SIZE; + uartConfig.tx.maxBufSize = NPI_UART_TX_BUF_SIZE; + uartConfig.idleTimeout = NPI_UART_IDLE_TIMEOUT; + uartConfig.intEnable = NPI_UART_INT_ENABLE; + uartConfig.callBackFunc = (halUARTCBack_t)npiCBack; + + // start UART + // Note: Assumes no issue opening UART port. + (void)HalUARTOpen( NPI_UART_PORT, &uartConfig ); + + return; +} + + +/******************************************************************************* + * @fn NPI_ReadTransport + * + * @brief This routine reads data from the transport layer based on len, + * and places it into the buffer. + * + * input parameters + * + * @param buf - Pointer to buffer to place read data. + * @param len - Number of bytes to read. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes read from transport. + */ +uint16 NPI_ReadTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTRead( NPI_UART_PORT, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_WriteTransport + * + * @brief This routine writes data from the buffer to the transport layer. + * + * input parameters + * + * @param buf - Pointer to buffer to write data from. + * @param len - Number of bytes to write. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes written to transport. + */ +uint16 NPI_WriteTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTWrite( NPI_UART_PORT, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_RxBufLen + * + * @brief This routine returns the number of bytes in the receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes in the receive buffer. + */ +uint16 NPI_RxBufLen( void ) +{ + return( Hal_UART_RxBufLen( NPI_UART_PORT ) ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxRxBufSize + * + * @brief This routine returns the max size receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the receive buffer. + */ +uint16 NPI_GetMaxRxBufSize( void ) +{ + return( NPI_UART_RX_BUF_SIZE ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxTxBufSize + * + * @brief This routine returns the max size transmit buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the transmit buffer. + */ +uint16 NPI_GetMaxTxBufSize( void ) +{ + return( NPI_UART_TX_BUF_SIZE ); +} + + +/******************************************************************************* + ******************************************************************************/ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.h b/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.h new file mode 100644 index 0000000..70bb899 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/common/npi/npi_np/npi.h @@ -0,0 +1,126 @@ +/******************************************************************************* + Filename: npi.h + Revised: $Date: 2007-10-28 09:35:41 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15796 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef NPI_H +#define NPI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_board.h" +#include "hal_uart.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* UART port */ +#if !defined NPI_UART_PORT +#if ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) +#define NPI_UART_PORT HAL_UART_PORT_1 +#else +#define NPI_UART_PORT HAL_UART_PORT_0 +#endif +#endif + +#if !defined( NPI_UART_FC ) +#define NPI_UART_FC TRUE +#endif // !NPI_UART_FC + +#define NPI_UART_FC_THRESHOLD 48 +#define NPI_UART_RX_BUF_SIZE 128 +#define NPI_UART_TX_BUF_SIZE 128 +#define NPI_UART_IDLE_TIMEOUT 6 +#define NPI_UART_INT_ENABLE TRUE + +#if !defined( NPI_UART_BR ) +#define NPI_UART_BR HAL_UART_BR_115200 +#endif // !NPI_UART_BR + +/******************************************************************************* + * TYPEDEFS + */ + +typedef void (*npiCBack_t) ( uint8 port, uint8 event ); + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +// +// Network Processor Interface APIs +// + +extern void NPI_InitTransport( npiCBack_t npiCBack ); +extern uint16 NPI_ReadTransport( uint8 *buf, uint16 len ); +extern uint16 NPI_WriteTransport( uint8 *, uint16 ); +extern uint16 NPI_RxBufLen( void ); +extern uint16 NPI_GetMaxRxBufSize( void ); +extern uint16 NPI_GetMaxTxBufSize( void ); + +/******************************************************************************* +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* NPI_H */ diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildComponents.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildComponents.cfg new file mode 100644 index 0000000..e821e0b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildComponents.cfg @@ -0,0 +1,57 @@ +/******************************************************************************* + Filename: buildComponents.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) + Host/Controller build components. + + Copyright 2009-2013 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +// BLE Host Build Components + +//-DBROADCASTER_CFG=0x01 +//-DOBSERVER_CFG=0x02 +-DPERIPHERAL_CFG=0x04 +//-DCENTRAL_CFG=0x08 + +// BLE Controller Build Components + +-DADV_NCONN_CFG=0x01 +-DADV_CONN_CFG=0x02 +//-DSCAN_CFG=0x04 +-DINIT_CFG=0x08 + +// Possible BLE Controller Pre-Defined Combinations +-DADV_CFG=ADV_NCONN_CFG+ADV_CONN_CFG +-DLINK_CFG=ADV_CONN_CFG+INIT_CFG +//-DFULL_CFG=INIT_CFG+SCAN_CFG+ADV_NCONN_CFG+ADV_CONN_CFG diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildConfig.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildConfig.cfg new file mode 100644 index 0000000..8ada9ad --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/config/buildConfig.cfg @@ -0,0 +1,50 @@ +/************************************************************************************************** + Filename: buildConfig.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Host + build configuration. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Host Build Configurations + +//-DHOST_CONFIG=BROADCASTER_CFG +//-DHOST_CONFIG=OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG +//-DHOST_CONFIG=CENTRAL_CFG +//-DHOST_CONFIG=BROADCASTER_CFG+OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+OBSERVER_CFG +//-DHOST_CONFIG=CENTRAL_CFG+BROADCASTER_CFG +-DHOST_CONFIG=PERIPHERAL_CFG+CENTRAL_CFG diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/config/config.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config.cfg new file mode 100644 index 0000000..e606c9b --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config.cfg @@ -0,0 +1,50 @@ +/************************************************************************************************** + Filename: config.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE device common configuration. + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type Values +-DLL_DEV_TYPE_MASTER=1 +-DLL_DEV_TYPE_SLAVE=2 +-DLL_DEV_TYPE_MASTER_SLAVE=3 + +-DADV_NCONN_CFG=0x01 +-DADV_CONN_CFG=0x02 +-DSCAN_CFG=0x04 +-DINIT_CFG=0x08 +-DCTRL_CONFIG=ADV_NCONN_CFG+ADV_CONN_CFG+SCAN_CFG+INIT_CFG diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_master.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_master.cfg new file mode 100644 index 0000000..8e4be5f --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_master.cfg @@ -0,0 +1,43 @@ +/************************************************************************************************** + Filename: config_master.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE master device configuration. + + Copyright 2009 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type +-DDEVICE_TYPE=LL_DEV_TYPE_MASTER + diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_slave.cfg b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_slave.cfg new file mode 100644 index 0000000..9cadb1d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/config/config_slave.cfg @@ -0,0 +1,42 @@ +/************************************************************************************************** + Filename: config_slave.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE slave device configuration. + + Copyright 2009 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type +-DDEVICE_TYPE=LL_DEV_TYPE_SLAVE diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.c b/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.c new file mode 100644 index 0000000..aa0d03d --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.c @@ -0,0 +1,22 @@ +//#include "wimu_util.h" +// +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet){ +// +// packet->seq = seq; +// +// packet->acc.x = osal_rand(); +// packet->acc.y = osal_rand(); +// packet->acc.z = osal_rand(); +// +// packet->gyr.x = osal_rand(); +// packet->gyr.y = osal_rand(); +// packet->gyr.z = osal_rand(); +// +// packet->mag.x = osal_rand(); +// packet->mag.y = osal_rand(); +// packet->mag.z = osal_rand(); +//} +// +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet){ +// return; +//} \ No newline at end of file diff --git a/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.h b/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.h new file mode 100644 index 0000000..1e18583 --- /dev/null +++ b/Firmware/Radio/Projects/Wimu/Projects/ble/util/WIMU/wimu_util.h @@ -0,0 +1,183 @@ +#ifndef WIMU_UTIL_H +#define WIMU_UTIL_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +// WIMU sensor data packet size +#define WIMU_ACTIMETRY_IMU_PACKET_SIZE sizeof(WIMU_actimetry_imu_packet_t) + +#define WIMU_ACTIMETRY_QUATERNION_PACKET_SIZE sizeof(WIMU_actimetry_quaternion_packet_t) + +#define WIMU_BATTERY_PACKET_SIZE sizeof(WIMU_battery_packet_t) + +#define WIMU_DEVINFO_PACKET_SIZE sizeof(WIMU_DevInfoFrame_t) + +#define WIMU_GPS_LOCATION_AND_SPEED_PACKET_SIZE sizeof(locationAndSpeed_t) + +#define WIMU_GPS_DATE_TIME_PACKET_SIZE sizeof(date_time_t) + +#define WIMU_GPS_POSITION_QUALITY_PACKET_SIZE sizeof(positionQuality_t) + +#define WIMU_GPS_CURRENT_TIME_PACKET_SIZE sizeof(currentTime_t) + +//#define RAND_SINGED_SHORT osal_rand()-32768 + +//#define RAND_UNSINGED_SHORT osal_rand() + +// Unsigned sensor values +typedef struct { + uint16 x; + uint16 y; + uint16 z; +} WIMU_uSensors_t; + +// Signed sensor values +typedef struct { + int16 x; + int16 y; + int16 z; +} WIMU_sensors_t; + +// WIMU actimetry imu data packet +typedef struct { + uint16 seq; + WIMU_sensors_t acc; + WIMU_sensors_t gyr; + WIMU_sensors_t mag; +} WIMU_actimetry_imu_packet_t; + +// WIMU actimetry quaternion data packet +typedef struct { + float q0; + float q1; + float q2; + float q3; +} WIMU_actimetry_quaternion_packet_t; + +// WIMU battery sensor data packet +typedef struct { + uint8 batteryValue; +} WIMU_battery_packet_t; + +// WIMU device information +typedef struct +{ + uint16 serialNumber; + uint8 hardRevision; + uint8 firmSoftRevision[29]; //should always be 29 in length (without \r\n) +} WIMU_DevInfoFrame_t; + +// WIMU gps sensor data packet +typedef struct +{ + uint16 year; + uint8 month; + uint8 day; + uint8 hours; + uint8 minutes; + uint8 seconds; + +} date_time_t; + +typedef struct +{ + uint16 flags; + uint16 instantSpeed; + int32 latitude; + int32 longitude; + int8 elevation[3]; + uint16 heading; +} locationAndSpeed_t; + +typedef struct +{ + uint16 flags; + uint8 beaconsInSolution; + uint8 beaconsInView; + uint16 timeFirstFix; + uint32 ehpe; // Estimated Horizontal Position Error + uint32 evpe; // Estimated Vertical Position Error + uint8 hdop; // Horizontal Dilution of Precision + uint8 vdop; // Vertical Dilution of Precision + +} positionQuality_t; + +typedef struct +{ + date_time_t date_time; + locationAndSpeed_t loc_speed; + positionQuality_t quality; +} WIMU_GPSFrame_t; + +// WIMU Current time structure +typedef struct +{ + date_time_t date_time; + uint8 day_of_week; // 0=Undefined, 1 = Monday, ... +} dayDateTime_t; + +typedef struct +{ + dayDateTime_t day_date_time; + uint8 fractions256; +} exactTime256_t; + +typedef struct +{ + exactTime256_t exact_time; + uint8 adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} currentTime_t; + +// IMU Config Structure +// NOTE: Not using full WIMU Config, since it would be larger than 22 bytes (limit of attributes size) +typedef struct { + uint16 enabled_modules; + uint8 sampling_rate; + uint8 acc_range; + uint8 gyro_range; + uint8 mag_range; +} IMU_Config_t; + +typedef struct { + uint8 status; + uint16 rec_id; +} RemControl_t; + + +// Event flags +#define WIMU_CONTROL_EVT 0x0008 // Sends control msg to the WIMU +#define WIMU_TIME_EVT 0x0010 // Update time on WIMU + +//static void WIMU_packetInitRand(uint16 seq, WIMU_packet_t* packet); +//static void WIMU_packetInitZero(uint16 seq, WIMU_packet_t* packet); + +/** + * Initialise a packet with random data + */ +/* +static void WIMU_packetInitRand(uint16 seq, WIMU_actimetry_packet_t* packet){ + + packet->seq = seq; + + packet->acc.x = RAND_UNSINGED_SHORT; + packet->acc.y = RAND_UNSINGED_SHORT; + packet->acc.z = RAND_UNSINGED_SHORT; + + packet->gyr.x = RAND_UNSINGED_SHORT; + packet->gyr.y = RAND_UNSINGED_SHORT; + packet->gyr.z = RAND_UNSINGED_SHORT; + + packet->mag.x = RAND_SINGED_SHORT; + packet->mag.y = RAND_SINGED_SHORT; + packet->mag.z = RAND_SINGED_SHORT; + +} +*/ +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/Firmware/Radio/common/cc2540/OnBoard.c b/Firmware/Radio/common/cc2540/OnBoard.c new file mode 100644 index 0000000..29b7664 --- /dev/null +++ b/Firmware/Radio/common/cc2540/OnBoard.c @@ -0,0 +1,345 @@ +/************************************************************************************************** + Filename: OnBoard.c + Revised: $Date: 2008-03-18 15:14:17 -0700 (Tue, 18 Mar 2008) $ + Revision: $Revision: 16604 $ + + Description: This file contains the UI and control for the + peripherals on the EVAL development board + Notes: This file targets the Chipcon CC2430DB/CC2430EB + + + Copyright 2005-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +/********************************************************************* + * INCLUDES + */ +#include "bcomdef.h" +#include "OnBoard.h" +#include "OSAL.h" +#include "OnBoard.h" + +#include "hal_led.h" +#include "hal_key.h" + + +/********************************************************************* + * MACROS + */ + +/********************************************************************* + * CONSTANTS + */ + +// Task ID not initialized +#define NO_TASK_ID 0xFF + + +/********************************************************************* + * TYPEDEFS + */ + +/********************************************************************* + * GLOBAL VARIABLES + */ +uint8 OnboardKeyIntEnable; + + +/********************************************************************* + * EXTERNAL VARIABLES + */ + +/********************************************************************* + * EXTERNAL FUNCTIONS + */ +extern uint8 LL_PseudoRand( uint8 *randData, uint8 dataLen ); + +#if defined FEATURE_ABL +#include "..\..\util\ABL\app\sbl_app.c" +#elif defined FEATURE_SBL +#include "..\..\util\SBL\app\sbl_app.c" +#elif defined FEATURE_EBL +#include "..\..\util\EBL\app\sbl_app.c" +#elif defined FEATURE_UBL_MSD +#include "..\..\util\UBL\soc_8051\usb_msd\app\ubl_app.c" +#else +void appForceBoot(void); +#endif + +/********************************************************************* + * LOCAL VARIABLES + */ + +// Registered keys task ID, initialized to NOT USED. +static uint8 registeredKeysTaskID = NO_TASK_ID; + +/********************************************************************* + * @fn InitBoard() + * @brief Initialize the CC2540DB Board Peripherals + * @param level: COLD,WARM,READY + * @return None + */ +void InitBoard( uint8 level ) +{ + if ( level == OB_COLD ) + { + // Interrupts off + osal_int_disable( INTS_ALL ); + // Turn all LEDs off + HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF ); + // Check for Brown-Out reset +// ChkReset(); + } + else // !OB_COLD + { + /* Initialize Key stuff */ + OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; + //OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } +} + +/********************************************************************* + * @fn Onboard_rand + * + * @brief Random number generator + * + * @param none + * + * @return uint16 - new random number + * + *********************************************************************/ +uint16 Onboard_rand( void ) +{ + uint16 randNum; + + LL_PseudoRand( (uint8 *)&randNum, 2 ); + + return ( randNum ); +} + +/********************************************************************* + * @fn _itoa + * + * @brief convert a 16bit number to ASCII + * + * @param num - + * buf - + * radix - + * + * @return void + * + *********************************************************************/ +void _itoa(uint16 num, uint8 *buf, uint8 radix) +{ + char c,i; + uint8 *p, rst[5]; + + p = rst; + for ( i=0; i<5; i++,p++ ) + { + c = num % radix; // Isolate a digit + *p = c + (( c < 10 ) ? '0' : '7'); // Convert to Ascii + num /= radix; + if ( !num ) + break; + } + + for ( c=0 ; c<=i; c++ ) + *buf++ = *p--; // Reverse character order + + *buf = '\0'; +} + +/********************************************************************* + * "Keyboard" Support + *********************************************************************/ + +/********************************************************************* + * Keyboard Register function + * + * The keyboard handler is setup to send all keyboard changes to + * one task (if a task is registered). + * + * If a task registers, it will get all the keys. You can change this + * to register for individual keys. + *********************************************************************/ +uint8 RegisterForKeys( uint8 task_id ) +{ + // Allow only the first task + if ( registeredKeysTaskID == NO_TASK_ID ) + { + registeredKeysTaskID = task_id; + return ( true ); + } + else + return ( false ); +} + +/********************************************************************* + * @fn OnBoard_SendKeys + * + * @brief Send "Key Pressed" message to application. + * + * @param keys - keys that were pressed + * state - shifted + * + * @return status + *********************************************************************/ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ) +{ + keyChange_t *msgPtr; + + if ( registeredKeysTaskID != NO_TASK_ID ) + { + // Send the address to the task + msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) ); + if ( msgPtr ) + { + msgPtr->hdr.event = KEY_CHANGE; + msgPtr->state = state; + msgPtr->keys = keys; + + osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); + } + return ( SUCCESS ); + } + else + return ( FAILURE ); +} + +/********************************************************************* + * @fn OnBoard_KeyCallback + * + * @brief Callback service for keys + * + * @param keys - keys that were pressed + * state - shifted + * + * @return void + *********************************************************************/ +void OnBoard_KeyCallback ( uint8 keys, uint8 state ) +{ + uint8 shift; + (void)state; + + // shift key (S1) is used to generate key interrupt + // applications should not use S1 when key interrupt is enabled + shift = (OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE) ? false : ((keys & HAL_KEY_SW_6) ? true : false); + + if ( OnBoard_SendKeys( keys, shift ) != SUCCESS ) + { + // Process SW1 here + if ( keys & HAL_KEY_SW_1 ) // Switch 1 + { + } + // Process SW2 here + if ( keys & HAL_KEY_SW_2 ) // Switch 2 + { + } + // Process SW3 here + if ( keys & HAL_KEY_SW_3 ) // Switch 3 + { + } + // Process SW4 here + if ( keys & HAL_KEY_SW_4 ) // Switch 4 + { + } + // Process SW5 here + if ( keys & HAL_KEY_SW_5 ) // Switch 5 + { + } + // Process SW6 here + if ( keys & HAL_KEY_SW_6 ) // Switch 6 + { + } + } + + /* If any key is currently pressed down and interrupt + is still enabled, disable interrupt and switch to polling */ + if( keys != 0 ) + { + if( OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE ) + { + OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } + /* If no key is currently pressed down and interrupt + is disabled, enable interrupt and turn off polling */ + else + { + if( OnboardKeyIntEnable == HAL_KEY_INTERRUPT_DISABLE ) + { + OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; + HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); + } + } +} + +/********************************************************************* + * @fn Onboard_soft_reset + * + * @brief Effect a soft reset. + * + * @param none + * + * @return none + * + *********************************************************************/ +__near_func void Onboard_soft_reset( void ) +{ + HAL_DISABLE_INTERRUPTS(); + asm("LJMP 0x0"); +} + +#if defined FEATURE_ABL +#elif defined FEATURE_SBL +#elif defined FEATURE_EBL +#elif defined FEATURE_UBL_MSD +#else +/********************************************************************* + * @fn appForceBoot + * + * @brief Common force-boot function for the HCI library to invoke. + * + * @param none + * + * @return void + *********************************************************************/ +void appForceBoot(void) +{ + // Dummy function for HCI library that cannot depend on the SBL build defines. +} +#endif + +/********************************************************************* +*********************************************************************/ diff --git a/Firmware/Radio/common/cc2540/OnBoard.h b/Firmware/Radio/common/cc2540/OnBoard.h new file mode 100644 index 0000000..1b30b92 --- /dev/null +++ b/Firmware/Radio/common/cc2540/OnBoard.h @@ -0,0 +1,186 @@ +/************************************************************************************************** + Filename: OnBoard.h + Revised: $Date: 2008-07-25 17:36:14 -0700 (Fri, 25 Jul 2008) $ + Revision: $Revision: 17620 $ + + Description: Defines stuff for EVALuation boards + This file targets the Chipcon CC2540DB/CC2540EB + + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +#ifndef ONBOARD_H +#define ONBOARD_H + +#include "hal_mcu.h" +#include "hal_sleep.h" +#include "osal.h" + +/********************************************************************* + */ +// Internal (MCU) RAM addresses +#define MCU_RAM_BEG 0x0100 +#define MCU_RAM_END RAMEND +#define MCU_RAM_LEN (MCU_RAM_END - MCU_RAM_BEG + 1) + +// Internal (MCU) heap size +#if !defined( INT_HEAP_LEN ) + #define INT_HEAP_LEN 1024 // 1.00K +#endif + +// Memory Allocation Heap +#if defined( EXTERNAL_RAM ) + #define MAXMEMHEAP EXT_RAM_LEN // Typically, 32K +#else + #define MAXMEMHEAP INT_HEAP_LEN // Typically, 0.70-1.50K +#endif + +// Initialization levels +#define OB_COLD 0 +#define OB_WARM 1 +#define OB_READY 2 + +#define SystemResetSoft() Onboard_soft_reset() + +typedef struct +{ + osal_event_hdr_t hdr; + uint8 state; // shift + uint8 keys; // keys +} keyChange_t; + +// Timer clock and power-saving definitions +#define TIMER_DECR_TIME 1 // 1ms - has to be matched with TC_OCC +#define RETUNE_THRESHOLD 1 // Threshold for power saving algorithm + +/* OSAL timer defines */ +#define TICK_TIME 1000 /* Timer per tick - in micro-sec */ +#define TICK_COUNT 1 +#define OSAL_TIMER HAL_TIMER_3 + +#ifndef _WIN32 +extern void _itoa(uint16 num, uint8 *buf, uint8 radix); +#endif + +#ifndef RAMEND +#define RAMEND 0x1000 +#endif + +/* Tx and Rx buffer size defines used by SPIMgr.c */ +#define MT_UART_THRESHOLD 5 +#define MT_UART_TX_BUFF_MAX 170 +#define MT_UART_RX_BUFF_MAX 128 +#define MT_UART_IDLE_TIMEOUT 5 + +/* system restart and boot loader used from MTEL.c */ +// Restart system from absolute beginning +// Disables interrupts, forces WatchDog reset +#if _lint + #define SystemReset() +#else + #define SystemReset() HAL_SYSTEM_RESET(); +#endif + +#define BootLoader() + +/* Reset reason for reset indication */ +#define ResetReason() ((SLEEPSTA >> 3) & 0x03) + +/* port definition stuff used by MT */ +#if defined (ZAPP_P1) + #define ZAPP_PORT HAL_UART_PORT_0 //SERIAL_PORT1 +#elif defined (ZAPP_P2) + #define ZAPP_PORT HAL_UART_PORT_1 //SERIAL_PORT2 +#else + #undef ZAPP_PORT +#endif +#if defined (ZTOOL_P1) + #define ZTOOL_PORT HAL_UART_PORT_0 //SERIAL_PORT1 +#elif defined (ZTOOL_P2) + #define ZTOOL_PORT HAL_UART_PORT_1 //SERIAL_PORT2 +#else + #undef ZTOOL_PORT +#endif + +/* sleep macros required by OSAL_PwrMgr.c */ +#define SLEEP_DEEP 0 /* value not used */ +#define SLEEP_LITE 0 /* value not used */ +#define MIN_SLEEP_TIME 14 /* minimum time to sleep */ +#define OSAL_SET_CPU_INTO_SLEEP(m) halSleep(m) /* interface to HAL sleep */ + +/* used by MTEL.c */ +uint8 OnBoard_SendKeys( uint8 keys, uint8 state ); + +/* + * Board specific random number generator + */ +extern uint16 Onboard_rand( void ); + +/* + * Get elapsed timer clock counts + * reset: reset count register if TRUE + */ +extern uint32 TimerElapsed( void ); + +/* + * Initialize the Peripherals + * level: 0=cold, 1=warm, 2=ready + */ +extern void InitBoard( uint8 level ); + +/* + * Register for all key events + */ +extern uint8 RegisterForKeys( uint8 task_id ); + +/* Keypad Control Functions */ + +/* + * Send "Key Pressed" message to application + */ +extern uint8 OnBoard_SendKeys( uint8 keys, uint8 shift); + +/* + * Callback routine to handle keys + */ +extern void OnBoard_KeyCallback ( uint8 keys, uint8 state ); + +/* + * Perform a soft reset - jump to 0x0 + */ +extern __near_func void Onboard_soft_reset( void ); + + +/********************************************************************* + */ + +#endif diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_ebl.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_ebl.xcl new file mode 100644 index 0000000..efc5420 --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_ebl.xcl @@ -0,0 +1,215 @@ +/************************************************************************************************** + Filename: cc254x_f256_ebl.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the Encrypting Boot Loader. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)IMAGE_HEADER=0x800-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_imgA.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_imgA.xcl new file mode 100644 index 0000000..cbf88c1 --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_imgA.xcl @@ -0,0 +1,210 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgA.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Image Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 // First page is for the IBM which intercepts the H/W INTVECS. +-D_CODE_END=0x3FFF // Next 7 pages of Bank 0. +// +-D_BANK4_BEG=0x4B000 // Last 10 pages of Bank 4. +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x0800-0x0801 +-Z(CODE)IMAGE_HEADER=0x802-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 5). +-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc=8005,=0804-_BANK7_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_imgAe.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_imgAe.xcl new file mode 100644 index 0000000..853b17c --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_imgAe.xcl @@ -0,0 +1,204 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgAe.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Encrypted Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 // First page is for the IBM which intercepts the H/W INTVECS. +-D_CODE_END=0x3FFF // Next 7 pages of Bank 0. +// +-D_BANK4_BEG=0x4B000 // Last 10 pages of Bank 4. +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)IMAGE_HEADER=0x800-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 5). +-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\ +_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_imgB.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_imgB.xcl new file mode 100644 index 0000000..a9d41fa --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_imgB.xcl @@ -0,0 +1,209 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgB.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Image Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x4030 // Last 8 pages of Bank 0. +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4AFFF // First 6 pages of Bank 4. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x4000-0x4001 +-Z(CODE)IMAGE_HEADER=0x4002-0x400F +-Z(CODE)AES_HEADER=0x4010-0x402F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 4). +-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc=8005,=4004-_BANK4_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_imgBe.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_imgBe.xcl new file mode 100644 index 0000000..ece5b1a --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_imgBe.xcl @@ -0,0 +1,204 @@ +/************************************************************************************************** + Filename: cc254x_f256_imgBe.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be run by the Boot Encrypted Manager. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x0A // Must reserve 0x08-0x09 for the IBM INTVEC re-direct. +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x4030 // Last 8 pages of Bank 0. +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4AFFF // First 6 pages of Bank 4. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + + +-Z(CODE)IMAGE_HEADER=0x4000-0x400F +-Z(CODE)AES_HEADER=0x4010-0x402F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 4). +-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_oad.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_oad.xcl new file mode 100644 index 0000000..0eba5b6 --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_oad.xcl @@ -0,0 +1,206 @@ +/************************************************************************************************** + Filename: cc254x_f256_oad.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the OAD Boot Loader. + + + Copyright 2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0830 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3F7FF // First 15 pages of Bank 3. + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)CHECKSUM=0x0800-0x0801 +-Z(CODE)IMAGE_HEADER=0x802-0x80F +-Z(CODE)AES_HEADER=0x810-0x82F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip CRC & SHDW when calculating the CRC. +// +-J2,crc16,=0804-_BANK3_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_sbl.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_sbl.xcl new file mode 100644 index 0000000..75a4baa --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_sbl.xcl @@ -0,0 +1,219 @@ +/************************************************************************************************** + Filename: cc254x_f256_sbl.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC254x BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the simple Serial Boot Loader. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x0800 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Cannot use the lock-bits page in a boot-loadable image; skip NV pages area. +-D_BANK7_END=0x7E7FF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)CHECKSUM=0x890-0x891 +-Z(CODE)CRC_SHDW=0x892-0x893 +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +// Skip SBL, CRC & SHDW, and NV pages when calculating the CRC. +// +-J2,crc16,=_CODE_BEG-890,894-_BANK7_END + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_f256_ubl_msd.xcl b/Firmware/Radio/common/cc2540/cc254x_f256_ubl_msd.xcl new file mode 100644 index 0000000..aa0e2cc --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_f256_ubl_msd.xcl @@ -0,0 +1,216 @@ +/************************************************************************************************** + Filename: cc254x_f256_ubl_msd.xcl + Revised: $Date: 2010-09-22 11:40:55 -0700 (Wed, 22 Sep 2010) $ + Revision: $Revision: 23872 $ + + Description: + + This is a linker command line file for the IAR XLINK tool for the CC2540USB BLE + sample applications built with the General Options for the location of constants and strings + configured to be "ROM mapped as data". + + This mapping is for applications that are to be loaded via the Encrypting UBL by USB-MSD. + + + Copyright 2011-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// + +// +// XDATA available to the program. +// +-D_XDATA_BEG=0x0000 +-D_XDATA_END=0x1EFF + +// +// The 8052 IDATA is overlayed on the SoC XDATA space from 0x1F00-0x1FFF. +// +-D_IDATA_BEG=0x08 +-D_IDATA_END=0xFF + +// +// CODE +// +-D_CODE_BEG=0x820 +-D_CODE_END=0x7FFF +// +-D_BANK1_BEG=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_BEG=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_BEG=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_BEG=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_BEG=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_BEG=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_BEG=0x78000 +// Skip NV pages 120-121; UBL pages 122-126; Lock-bits page 127. +-D_BANK7_END=0x7BFFF + +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_BEG=0 // Start address for default register bank (00,08,10,18). + +// +// PDATA page setup +// +-D?PBANK_NUMBER=00 // High byte of 16-bit address to the PDATA area. + +// +// Virtual register setup +// + +-D_BREG_BEG=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_BEG%8=0 where _BREG_BEG <= 0x78. + +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_BEG/8. + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_BEG +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_BEG +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=_IDATA_BEG-7F +-Z(DATA)PSP,XSP=_IDATA_BEG-7F +-Z(DATA)DOVERLAY=_IDATA_BEG-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=_IDATA_BEG-7F + +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=_IDATA_BEG-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#_IDATA_BEG-_IDATA_END +-Z(IDATA)IOVERLAY=_IDATA_BEG-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +-Z(CODE)AES_CTRL_BLK=0x800-0x81F + +-Z(CODE)INTVEC=_CODE_BEG-_CODE_END +-Z(CODE)UBL_METADATA_SPACE=0xE9C-0xEFF +-Z(CODE)UBL_FILENAME_SPACE=0xF00-0xFFF +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_BEG-_CODE_END +-Z(CODE)CSTART,RCODE,DIFUNCT,NEAR_CODE=_CODE_BEG-_CODE_END +-Z(CODE)BANK_RELAYS=_CODE_BEG-_CODE_END + +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END + +// +// Setup for constants located in code memory: +// +-Z(CODE)CODE_C=_CODE_BEG-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as upper XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1). +-P(CODE)XDATA_ROM_C_FLASH=_BANK1_BEG-_BANK1_END +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH + +-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END +-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\ +_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,\ +_BANK7_BEG-_BANK7_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_BEG-_XDATA_END +-Z(XDATA)XDATA_Z,XDATA_I,PDATA_Z=_XDATA_BEG-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_BEG-_XDATA_END + +-cx51 + +//////////////////////////////////////////////////////////////////////////////// +// +// Misc. +// + +// +// Offset fix for the unconventional bank numbering for this SOC (root bank is callled "bank 0"). +-D_FIRST_BANK_ADDR=0x10000 + +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses for the EW8051 +// to physical addresses in the output file format. Without this, the HEX output file will +// include 32 kB blocks of zero bytes/gap in between each code bank. +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=\ +0x8000 + +// When -M is used to build debug output, XLINK gives warning [w69] which is safely ignored. +-ww69=i + +// When INTVEC is relocated, XLINK gives error [e18] which is safely ignored. +-we18=i + +// +// Fill code gaps with 0xFFFF for monolithic binary file with no addressing. +// +-HFFFF + +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/cc254x_sim2bin.exe b/Firmware/Radio/common/cc2540/cc254x_sim2bin.exe new file mode 100644 index 0000000..283b58b Binary files /dev/null and b/Firmware/Radio/common/cc2540/cc254x_sim2bin.exe differ diff --git a/Firmware/Radio/common/cc2540/cc254x_ubl_pp.bat b/Firmware/Radio/common/cc2540/cc254x_ubl_pp.bat new file mode 100644 index 0000000..0386c84 --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_ubl_pp.bat @@ -0,0 +1,78 @@ +:: /********************************************************************************************** +:: Filename: cc254x_ubl_pp.bat +:: Revised: $Date:$ +:: Revision: $Revision:$ +:: +:: Description: +:: +:: This is a launcher for the cc254x_ubl_pp.js script which does post-processing on IAR output +:: files; it is designed to be invoked from IAR project, Build Actions, Post-build command line. +:: +:: There are 3 or 5 required arguments when invoking this batch file: +:: +:: %1 must be the IAR project path: "$PROJ_DIR$" +:: +:: %2 directs the action of the post-processing script as follows: +:: +:: "ProdUBL" generates a binary application image from the IAR output "simple-code", .sim, file; +:: this binary is used for downloading via the UBL. +:: +:: "ProdHex" generates a hex image that is the combination of the serial boot loader +:: with the application image; this combination hex file is for mass production programming +:: via a tool like SmartRF Programmer. +:: +:: %3 must be the path and file name of the IAR output, like this: +:: "$PROJ_DIR$\CC2540F256_UBL\Exe\rnp_cc2540f256_ubl" +:: OR +:: "$PROJ_DIR$\CC2540F256_HEX\Exe\rnp_cc2540f256" +:: +:: %4 (Required for "ProdHex") must be the path and file name of the IAR output UBL, like this: +:: "$PROJ_DIR$\..\..\SerialBoot\CC254x\CC2540F256_UART0_HEX\Exe\ubl_cc2540f256_uart0.hex" +:: +:: %5 (Required for "ProdHex") the number of lines in the UBL hex file to pre-pend to the +:: application image (the remainder of the UBL hex file will be appended to the application). +:: Currently UBL is only using the first page to intercept the IVEC's, so 128 + 1 = 129 to +:: include the hex file header line (which is stripped from application image when appending it +:: to this root area of the UBL). +:: +:: Note that the above serial boot loader corresponding to the RPC transport of the application +:: build target (e.g. CC2540F256, USART0) must have been built prior to this batch file execution. +:: This is accomplished with the 'Pre-build command line' option invoking the cc254x_ubl_pre.bat +:: with the corresponding arguments as specified in that batch file. +:: +:: +:: Copyright 2011 Texas Instruments Incorporated. All rights reserved. +:: +:: IMPORTANT: Your use of this Software is limited to those specific rights +:: granted under the terms of a software license agreement between the user +:: who downloaded the software, his/her employer (which must be your employer) +:: and Texas Instruments Incorporated (the "License"). You may not use this +:: Software unless you agree to abide by the terms of the License. The License +:: limits your use, and you acknowledge, that the Software may not be modified, +:: copied or distributed unless embedded on a Texas Instruments microcontroller +:: or used solely and exclusively in conjunction with a Texas Instruments radio +:: frequency transceiver, which is integrated into your product. Other than for +:: the foregoing purpose, you may not use, reproduce, copy, prepare derivative +:: works of, modify, distribute, perform, display or sell this Software and/or +:: its documentation for any purpose. +:: +:: YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE +:: PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, +:: INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, +:: NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL +:: TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, +:: NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER +:: LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES +:: INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE +:: OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCU:: +:: OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES +:: (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. +:: +:: Should you have any questions regarding your right to use this Software, +:: contact Texas Instruments Incorporated at www.TI.com. +:: **********************************************************************************************/ + +@echo off +chdir %1\..\..\common\cc2540 +start cc254x_ubl_pp.js %2 %3 %4 %5 + diff --git a/Firmware/Radio/common/cc2540/cc254x_ubl_pp.js b/Firmware/Radio/common/cc2540/cc254x_ubl_pp.js new file mode 100644 index 0000000..d739fa9 --- /dev/null +++ b/Firmware/Radio/common/cc2540/cc254x_ubl_pp.js @@ -0,0 +1,121 @@ +/************************************************************************************************** + Filename: cc254x_ubl_pp.js + Revised: $Date: 2010-08-23 12:24:40 -0700 (Mon, 23 Aug 2010) $ + Revision: $Revision: 23475 $ + + Description: + + This file is a JScript file that can be run by the Windows Script Host, which is installed by + default on Windows XP SP2 and later. The script acts on the arguments to do post-processing for + the UBL-enabled build targets. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +var ForReading = 1; +var ForWriting = 2; + +// void main(void) +{ + var ppType = WScript.Arguments(0); + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var ppPath = WScript.Arguments(1); + var fin, fout; + + switch (ppType) { + case "ProdUBL": + fin = ppPath + ".sim" + fout = ppPath + ".bin" + fso.CopyFile(fin, "tmp.sim", true); + var WshShell = new ActiveXObject("WScript.Shell"); + // Invoke and wait for the binary file conversion tool to finish. + WshShell.Run("cc254x_sim2bin.exe tmp.sim tmp.bin", 8, true); + fso.CopyFile("tmp.bin", fout, true); + fso.DeleteFile("tmp.bin"); + fso.DeleteFile("tmp.sim"); + break; + + case "ProdHex": + var ublFile = WScript.Arguments(2); + var rootCnt = WScript.Arguments(3); + var fubl = fso.OpenTextFile(ublFile, ForReading); + fout = fso.CreateTextFile(ppPath + ".hex", true); + + // UBL is split between root (intercepting IVEC's) and the last or lock-bits page. + while (rootCnt != 0) + { + var s = fubl.ReadLine(); + fout.WriteLine(s); + rootCnt--; + } + + fin = fso.OpenTextFile(ppPath + ".a51", ForReading) + fin.ReadLine(); // Throw away the first line since appending to a valid .hex file. + + // Throw away the last two lines since a valid .hex file will be appended. + var line = new Array(3); + var rIdx = 2; + var wIdx = 0; + line[0] = fin.ReadLine(); + line[1] = fin.ReadLine(); + while (1) + { + fout.WriteLine(line[wIdx]); + line[rIdx] = fin.ReadLine(); + if (fin.AtEndOfStream) + { + break; + } + rIdx = (rIdx+1) % 3; + wIdx = (wIdx+1) % 3; + } + fin.Close(); + + // Look to throw away the header line to the banked area of the UBL image. + var s = fubl.ReadLine(); + if (s.substr(1,1) != "0") + { + fout.WriteLine(s); + } + + while (!fubl.AtEndOfStream) + { + var s = fubl.ReadLine(); + fout.WriteLine(s); + } + + fout.Close(); + fubl.Close(); + break; + } +} + diff --git a/Firmware/Radio/common/cc2540/ti_51ew_cc2540b.xcl b/Firmware/Radio/common/cc2540/ti_51ew_cc2540b.xcl new file mode 100644 index 0000000..63af22b --- /dev/null +++ b/Firmware/Radio/common/cc2540/ti_51ew_cc2540b.xcl @@ -0,0 +1,386 @@ +/************************************************************************************************** + Filename: ti_51ew_cc2540b.xcl + Revised: $Date$ + Revision: $Revision: 22814 $ + + Description: This is a linker command line file for the IAR XLINK tool for the + CC2540 SoC where the General Options + for location for constants and strings is "ROM mapped as data". + + + Copyright 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// +// Variables (used by lnk_base.xcl) +// ================================ +// +// Segment limits +// -------------- +// +// +// IDATA +// +-D_IDATA_END=0xFF // Last address of IDATA memory +// +// +// PDATA +// +-D_PDATA_START=0x1E00 // First address for PDATA +-D_PDATA_END=0x1EFF // Last address for PDATA +// // (note: any 256 byte page of (I)XDATA can be used as PDATA, +// // see "PDATA page setup" section below) +// +// IXDATA +// +-D_IXDATA_START=0x0001 // First address for internal XDATA (address 0x0000 saved for NULL pointer) +-D_IXDATA_END=0x1EFF // Last address for internal XDATA (for 8 kB SRAM option) +//-D_IXDATA_END=0x0EFF // (for 4 kB SRAM option) +//-D_IXDATA_END=0x06FF // (for 2 kB SRAM option) +// +// +// XDATA +// +// The internal XDATA is used as XDATA. +-D_XDATA_START=_IXDATA_START +-D_XDATA_END=_IXDATA_END +// +// +// CODE +// +-D_CODE_START=0x0000 +-D_CODE_END=0x7FFF // Last address for ROOT bank. +// // (the rest is mapped into BANKED_CODE segment) +// +-D_FIRST_BANK_ADDR=0x10000 // Offset fix for this part's unconventional bank numbering (root bank is callled "bank 0") +// +// +// + +// +// NEAR CODE +// +-D_NEAR_CODE_END=_CODE_END // Last address for near code, near code segment is 32kB +// // in banked code model. +// +// +// Special SFRs +// ------------ +// +// +// Register bank setup +// +-D?REGISTER_BANK=0 // Default register bank (0,1,2,3). +-D_REGISTER_BANK_START=0 // Start address for default register bank (00,08,10,18). +// +// +// PDATA page setup +// +-D?PBANK_NUMBER=0x1E // High byte of 16-bit address to the PDATA area + // (i.e. 0x1E00-0x1EFF as PDATA, if 8 kB SRAM). +//-D?PBANK=0x93 // Most significant byte in MOVX A,@Ri. (0x93 is sfr MPAGE). +// +// +// Virtual register setup +// ---------------------- +// +-D_BREG_START=0x00 // The bit address where the BREG segments starts. + // Must be placed on: _BREG_START%8=0 where _BREG_START <= 0x78. +-D?VB=0x20 // ?VB is used when referencing BREG as whole byte. + // Must be placed on: ?VB=0x20+_BREG_START/8. +// +//////////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////////// +// +// To the reader: Ignore this section ------------------------------------------ +// +// +// Dummy definitions needed to satisfy lnk_base.xcl +// +// +-D_FAR_DATA_NR_OF_BANKS=0x0E // Number of banks in far data memory. +-D_FAR_DATA_START=0x010001 // First address of far memory. +-D_FAR_DATA_END=0xFFFFFF // Last address of far memory. +-D_FAR_CODE_START=_CODE_START // First address for far code. +-D_FAR_CODE_END=_CODE_END // Last address for far code. +// +//////////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// + +// Setup "bit" segments (only for '__no_init bool' variables). +-Z(BIT)BREG=_BREG_START +-Z(BIT)BIT_N=0-7F + +-Z(DATA)REGISTERS+8=_REGISTER_BANK_START +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F +-Z(DATA)PSP,XSP=08-7F +-Z(DATA)DOVERLAY=08-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F + +-U(IDATA)0-7F=(DATA)0-7F + +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA_END +-Z(IDATA)IOVERLAY=08-FF + +//////////////////////////////////////////////////////////////////////////////// +// +// ROM memory +// + +// Note: INTVEC must be placed first. +// Note: CSTART Must be located in first 64k. + +// +// Top of memory +// +-Z(CODE)INTVEC=_CODE_START +-Z(CODE)CSTART=_CODE_START-_CODE_END + +// +// Initializers +// +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_CODE_START-_CODE_END +-Z(CODE)HUGE_ID=_FAR_CODE_START-_FAR_CODE_END + +// +-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) +-D_SLEEP_CODE_SPACE_END=(_CODE_END) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END +// +// Program memory +// +-Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_N,NEAR_CODE=_CODE_START-_CODE_END +// +// Setup for constants located in code memory: +// +-P(CODE)CODE_C=_CODE_START-_CODE_END +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1) +-P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH +// +// Banked Code +// +-P(CODE)BANKED_CODE=_CODE_START-_CODE_END,[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 // Setup bank-switched segments. + +// +// FAR Code +// +-P(CODE)FAR_CODE_C,FAR_CODE_N,FAR_CODE=[_FAR_CODE_START-_FAR_CODE_END]/10000 +-P(CODE)HUGE_CODE_C=_FAR_CODE_START-_FAR_CODE_END + +// +// Checksum +// +-Z(CODE)CHECKSUM#_CODE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// XDATA memory +// + +// +// Stacks located in XDATA +// +-Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED_STACK_START +-Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA_START-_PDATA_END +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA_START-_XDATA_END + +// +// PDATA - data memory +// +-Z(XDATA)PDATA_Z,PDATA_I=_PDATA_START-_PDATA_END +-P(XDATA)PDATA_N=_PDATA_START-_PDATA_END + +// +// XDATA - data memory +// +-Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA_START-_IXDATA_END +-P(XDATA)IXDATA_N=_IXDATA_START-_IXDATA_END + +-Z(XDATA)XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END +-P(XDATA)XDATA_N=_XDATA_START-_XDATA_END + +-Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA_START-_XDATA_END + +// +// FAR - extended data memory +// + +// initialized FAR data +// Note: The segment FAR_I and FAR_ID must start at the same address within a 64k bank, +// they must therefore be located first in the FAR data area, and in the xlink linker file +// Note: *_I segment is located in RAM but *_ID segments is located in ROM + +-Z(XDATA)FAR_Z=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-Z(XDATA)FAR_I=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-Z(CODE)FAR_ID=[_FAR_CODE_START-_FAR_CODE_END]/10000 +-Z(XDATA)FAR_HEAP+_FAR_HEAP_SIZE=[_FAR_DATA_START-_FAR_DATA_END]/10000 +-P(XDATA)FAR_N=[_FAR_DATA_START-_FAR_DATA_END]*_FAR_DATA_NR_OF_BANKS+10000 +-P(CONST)FAR_ROM_C=[_FAR_DATA_START-_FAR_DATA_END]*_FAR_DATA_NR_OF_BANKS+10000 + +// +// HUGE - extended data memory +// +-Z(XDATA)HUGE_Z,HUGE_I=_FAR_DATA_START-_FAR_DATA_END +-P(XDATA)HUGE_N=_FAR_DATA_START-_FAR_DATA_END + +-Z(XDATA)HUGE_HEAP+_HUGE_HEAP_SIZE=_FAR_DATA_START-_FAR_DATA_END +-Z(CONST)HUGE_ROM_C=_FAR_DATA_START-_FAR_DATA_END + +-cx51 + + +// Internal flash used for NV address space. +// --------------------------- +// +// Address range for HAL_FLASH_PAGE_SIZE == 2048 +-D_BLENV_ADDRESS_SPACE_START=0x7E800 +-D_BLENV_ADDRESS_SPACE_END=0x7F7FF +// +// Address range for HAL_FLASH_PAGE_SIZE == 4096 +//-D_BLENV_ADDRESS_SPACE_START=0x7D000 +//-D_BLENV_ADDRESS_SPACE_END=0x7EFFF +// +-Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// Texas Instruments device specific +// ================================= +// +// +// Setup of CODE banks +// ------------------- +// +-D_BANK0_START=0x00000 // Note: Unconventional bank numbering on this part: +-D_BANK0_END=0x07FFF // "BANK0" is the root bank/common area! +// +-D_BANK1_START=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_START=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_START=0x38000 +-D_BANK3_END=0x3FFFF +// +-D_BANK4_START=0x48000 +-D_BANK4_END=0x4FFFF +// +-D_BANK5_START=0x58000 +-D_BANK5_END=0x5FFFF +// +-D_BANK6_START=0x68000 +-D_BANK6_END=0x6FFFF +// +-D_BANK7_START=0x78000 +// End of code space has to match that of OSAL NV page start. +// Note that in this way, we'll be wasting last page spaced by NV pages, +// but in order not to overwrite NV pages when downloading new image, the waste +// is inevitable. +// New OSAL NV driver will move the NV pages to the last pages not wasting +// last page itself. +-D_BANK7_END=(_BLENV_ADDRESS_SPACE_START-1) + +// +// Define each bank as a segment for allowing code placement into specific banks +-P(CODE)BANK0=_BANK0_START-_BANK0_END +-P(CODE)BANK1=_BANK1_START-_BANK1_END +-P(CODE)BANK2=_BANK2_START-_BANK2_END +-P(CODE)BANK3=_BANK3_START-_BANK3_END +-P(CODE)BANK4=_BANK4_START-_BANK4_END +-P(CODE)BANK5=_BANK5_START-_BANK5_END +-P(CODE)BANK6=_BANK6_START-_BANK6_END +-P(CODE)BANK7=_BANK7_START-_BANK7_END +// + +//-- +// +// NOTE: The -M option below is needed when linker output should be in "intel-extended" (HEX) +// file format for banked code model. It translates the logical addresses in EW8051 to physical +// addresses in output file format. (Without this, the HEX output file will include 32 kB blocks +// of zero bytes/gap in between each code bank.) +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000 +// +// If -M is used when building debug output, XLINK will give a warning [w69]. We will ignore it: +-ww69=i +// +//-- + +// +// Flash lock bits +// --------------- +// +// The CC2540 has its flash lock bits, one bit for each 2048 B flash page, located in +// the last available flash page, starting 16 bytes from the page end. The number of +// bytes with flash lock bits depends on the flash size configuration of the CC2540 +// (maximum 16 bytes, i.e. 128 page lock bits, for the CC2530 with 256 kB flash). +// But since the bit that controls the debug interface lock is always in the last byte +// we include all 16 bytes in the segment, regardless of flash size. +// +-D_FLASH_LOCK_BITS_START=((_NR_OF_BANKS*_FIRST_BANK_ADDR)+0xFFF0) +-D_FLASH_LOCK_BITS_END=((_NR_OF_BANKS*_FIRST_BANK_ADDR)+0xFFFF) +// (this should resolve to 0x7FFF0-0x7FFFF if 256 kB flash (_NR_OF_BANKS=7), and +// 0x3FFF0-0x3FFFF if 128 kB flash (_NR_OF_BANKS=3)) +// +// +// Define as segment in case one wants to put something there intentionally (then comment out the hack below) +-Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +// Hack to reserve the FLASH_LOCK_BITS segment from being used as CODE, avoiding +// code to be placed on top of the flash lock bits. If code is placed on address 0x0000, +// (INTVEC is by default located at 0x0000) then the flash lock bits will be reserved too. +// +-U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/cc2540/ti_51ew_cc2540f128b.xcl b/Firmware/Radio/common/cc2540/ti_51ew_cc2540f128b.xcl new file mode 100644 index 0000000..c10dcff --- /dev/null +++ b/Firmware/Radio/common/cc2540/ti_51ew_cc2540f128b.xcl @@ -0,0 +1,281 @@ +/************************************************************************************************** + Filename: ti_51ew_cc2540bf128.xcl + Revised: $Date$ + Revision: $Revision: 22814 $ + + Description: This is a linker command line file for the IAR XLINK tool for the + CC2540 SoC where the General Options + for location for constants and strings is "ROM mapped as data". + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. + +**************************************************************************************************/ + +//////////////////////////////////////////////////////////////////////////////// +// based on lnk51ew_CC2540F128_banked.xcl: linker command file for IAR Embedded Workbench IDE +// Generated: Mon May 24 00:00:01 +0200 2010 +//////////////////////////////////////////////////////////////////////////////// +// +// Segment limits +// ============== +// +// IDATA +// ----- +-D_IDATA0_START=0x00 +-D_IDATA0_END=0xFF +// +// PDATA +// ----- +// We select 256 bytes of (I)XDATA memory that can be used as PDATA (see also "PDATA page setup" below) +-D_PDATA0_START=0x1E00 +-D_PDATA0_END=0x1EFF +// +// +// IXDATA +// ------ +-D_IXDATA0_START=0x0001 // Skip address 0x0000 (to avoid ambiguities with NULL pointer) +-D_IXDATA0_END=0x1EFF // CC2540F128 has 8 kB RAM (NOTE: 256 bytes are used for IDATA) +// +// +// XDATA +// ----- +-D_XDATA0_START=_IXDATA0_START +-D_XDATA0_END=_IXDATA0_END +// +// NEAR CODE +// --------- +-D_NEAR_CODE_START=0x0000 +// +// Special SFRs +// ============ +// +// CODE bank setup +// --------------- +-D_FIRST_BANK_ADDR=0x10000 // Offset fix for this part's unconventional bank numbering (root bank is called "bank 0") +// +// Register bank setup +// ------------------- +-D?REGISTER_BANK=0x0 // Sets default register bank (0,1,2,3) +-D_REGISTER_BANK_START=0x0 // Start address for default register bank (0x0, 0x8, 0x10, 0x18) +// +// PDATA page setup +// ---------------- +-D?PBANK_NUMBER=0x1E // High byte of 16-bit address to the PDATA area +// +// Virtual register setup +// ---------------------- +-D_BREG_START=0x00 +-D?VB=0x20 +-D?ESP=0x9B //Extended stack pointer register location +//////////////////////////////////////////////////////////////////////////////// +// +// IDATA memory +// ============ +-Z(BIT)BREG=_BREG_START +-Z(BIT)BIT_N=0-7F +-Z(DATA)REGISTERS+8=_REGISTER_BANK_START +-Z(DATA)BDATA_Z,BDATA_N,BDATA_I=20-2F +-Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F +-Z(DATA)PSP,XSP=08-7F +-Z(DATA)DOVERLAY=08-7F +-Z(DATA)DATA_I,DATA_Z,DATA_N=08-7F +-U(IDATA)0-7F=(DATA)0-7F +-Z(IDATA)IDATA_I,IDATA_Z,IDATA_N=08-_IDATA0_END +-Z(IDATA)ISTACK+_IDATA_STACK_SIZE#08-_IDATA0_END +-Z(IDATA)IOVERLAY=08-FF +// +// ROM memory +// ========== +// +// Top of memory +// ------------- +-Z(CODE)INTVEC=0 +-Z(CODE)CSTART=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// Initializers +// ------------ +-Z(CODE)BIT_ID,BDATA_ID,DATA_ID,IDATA_ID,IXDATA_ID,PDATA_ID,XDATA_ID=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// +-D_SLEEP_CODE_SPACE_START=(_CODEBANK_START-8) +-D_SLEEP_CODE_SPACE_END=(_CODEBANK_START-1) +-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END +// +// Program memory +// -------------- +-Z(CODE)BANK_RELAYS,RCODE,DIFUNCT,CODE_C,CODE_N,NEAR_CODE=_NEAR_CODE_START-(_CODEBANK_START-1) +// +// Setup for constants located in code memory: +// +// Define segments for const data in flash. +// First the segment with addresses as used by the program (flash mapped as XDATA) +-P(CONST)XDATA_ROM_C=0x8000-0xFFFF +// +// Then the segment with addresses as put in the hex file (flash bank 1) +-P(CODE)XDATA_ROM_C_FLASH=0x18000-0x1FFFF +// +// Finally link these segments (XDATA_ROM_C_FLASH is the initializer segment for XDATA_ROM_C, +// we map the flash in the XDATA address range instead of copying the data to RAM) +-QXDATA_ROM_C=XDATA_ROM_C_FLASH +// +// Banked code +// ----------- +-P(CODE)BANKED_CODE=_NEAR_CODE_START-(_CODEBANK_START-1),[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+10000 +// +// Checksum +// -------- +-Z(CODE)CHECKSUM#(_CODEBANK_START-1) +// +// XDATA memory +// ============ +// +// Stacks located in XDATA +// ----------------------- +-Z(XDATA)EXT_STACK+_EXTENDED_STACK_SIZE=_EXTENDED_STACK_START +-Z(XDATA)PSTACK+_PDATA_STACK_SIZE=_PDATA0_START-_PDATA0_END +-Z(XDATA)XSTACK+_XDATA_STACK_SIZE=_XDATA0_START-_XDATA0_END +// +// PDATA - data memory +// ------------------- +-Z(XDATA)PDATA_Z,PDATA_I=_PDATA0_START-_PDATA0_END +-P(XDATA)PDATA_N=_PDATA0_START-_PDATA0_END +// +// XDATA - data memory +// ------------------- +-Z(XDATA)IXDATA_Z,IXDATA_I=_IXDATA0_START-_IXDATA0_END +-P(XDATA)IXDATA_N=_IXDATA0_START-_IXDATA0_END +-Z(XDATA)XDATA_Z,XDATA_I=_XDATA0_START-_XDATA0_END +-P(XDATA)XDATA_N=_XDATA0_START-_XDATA0_END +-Z(XDATA)XDATA_HEAP+_XDATA_HEAP_SIZE=_XDATA0_START-_XDATA0_END + +// +// Core +// ==== +-cx51 + + +// Internal flash used for NV address space. +// --------------------------- +// +// Address range for HAL_FLASH_PAGE_SIZE == 2048 +-D_BLENV_ADDRESS_SPACE_START=0x3E800 +-D_BLENV_ADDRESS_SPACE_END=0x3F7FF +// +// Address range for HAL_FLASH_PAGE_SIZE == 4096 +//-D_BLENV_ADDRESS_SPACE_START=0x3D000 +//-D_BLENV_ADDRESS_SPACE_END=0x3EFFF +// +-Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END + +//////////////////////////////////////////////////////////////////////////////// +// +// Texas Instruments device specific +// ================================= +// +// Building with Intel HEX (.hex) as output format +// ----------------------------------------------- +// NOTE: The -M option below is needed when linker output should be in the +// "intel-extended" (HEX) file format for banked code model. It translates +// the logical addresses used by EW8051/XLINK linker to the correct +// physical flash addresses used in output file format. (Without this, the +// HEX output file will include 32 kB blocks of empty space/gaps in between +// each code bank, and our HEX image will not work.) +// +-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000 +// +// If -M is enabled when building debug output file for C-SPY, the XLINK linker +// will give a warning [w69] that it has no effect on the output file format. +// For EW8051 v7.51A and later, we can ignore/supress this warning (earlier +// versions caused a linker error, so then we had to turn the -M option on/off +// according to our output file format). +// +-ww69=i // Ignore linker warning 69 +// +// Hence for v7.51A and later, we can leave the -M option enabled at all times +// (as demonstrated above) regardless of output file format. Note however, that +// with the -M option enabled the code space addresses shown in the linker list +// file (.map) will also be translated to physical addresses (as found in the HEX +// file), i.e. not necessarily match the addresses used by EW8051/XLINK linker. +// +// +// Setup of CODE banks +// ------------------- +// +// We can also define each bank as a segment in order to allow code placement +// into specific banks, if needed. +-D_BANK0_START=0x00000 // Note: Unconventional bank numbering on this part: +-D_BANK0_END=0x07FFF // "BANK0" is the root bank/common area! +// +-D_BANK1_START=0x18000 +-D_BANK1_END=0x1FFFF +// +-D_BANK2_START=0x28000 +-D_BANK2_END=0x2FFFF +// +-D_BANK3_START=0x38000 +// End of code space has to match that of OSAL NV page start. +// Note that in this way, we'll be wasting last page spaced by NV pages, +// but in order not to overwrite NV pages when downloading new image, the waste +// is inevitable. +// New OSAL NV driver will move the NV pages to the last pages not wasting +// last page itself. +-D_BANK3_END=(_BLENV_ADDRESS_SPACE_START-1) +// +-P(CODE)BANK0=_BANK0_START-_BANK0_END +-P(CODE)BANK1=_BANK1_START-_BANK1_END +-P(CODE)BANK2=_BANK2_START-_BANK2_END +-P(CODE)BANK3=_BANK3_START-_BANK3_END +// +// +// Flash lock bits +// --------------- +// +// The CC2540 has its flash lock bits, one bit for each 2048 B flash page, located in +// the last available flash page, starting 16 bytes from the page end. The number of +// bytes with flash lock bits depends on the flash size configuration of the CC2540 +// (maximum 16 bytes, i.e. 128 page lock bits, for the CC2540 with 256 kB flash). +// Note that the bit that controls the debug interface lock is always in the last byte, +// regardless of flash size. +// +-D_FLASH_LOCK_BITS_START=0x3FFF0 +-D_FLASH_LOCK_BITS_END=0x3FFFF +// +// Define as segment in case one wants to put something there intentionally (then comment out the trick below) +-Z(CODE)FLASH_LOCK_BITS=_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +// Trick to reserve the FLASH_LOCK_BITS segment from being used as normal CODE, avoiding +// code to be placed on top of the flash lock bits. If code is placed on address 0x0000, +// (INTVEC is by default located at 0x0000) then the flash lock bits will be reserved too. +// +-U(CODE)0x0000=(CODE)_FLASH_LOCK_BITS_START-_FLASH_LOCK_BITS_END +// +//////////////////////////////////////////////////////////////////////////////// diff --git a/Firmware/Radio/common/npi/npi_np/npi.c b/Firmware/Radio/common/npi/npi_np/npi.c new file mode 100644 index 0000000..8b1e407 --- /dev/null +++ b/Firmware/Radio/common/npi/npi_np/npi.c @@ -0,0 +1,228 @@ +/******************************************************************************* + Filename: npi.c + Revised: $Date: 2008-06-11 14:30:47 -0700 (Wed, 11 Jun 2008) $ + Revision: $Revision: 17210 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_board.h" +#include "npi.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/******************************************************************************* + * TYPEDEFS + */ + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * PROTOTYPES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +/******************************************************************************* + * @fn NPI_InitTransport + * + * @brief This routine initializes the transport layer and opens the port + * of the device. Note that based on project defines, either the + * UART, USB (CDC), or SPI driver can be used. + * + * input parameters + * + * @param npiCback - User callback function when data is available. + * + * output parameters + * + * @param None. + * + * @return None. + */ +void NPI_InitTransport( npiCBack_t npiCBack ) +{ + halUARTCfg_t uartConfig; + + // configure UART + uartConfig.configured = TRUE; + uartConfig.baudRate = NPI_UART_BR; + uartConfig.flowControl = NPI_UART_FC; + uartConfig.flowControlThreshold = NPI_UART_FC_THRESHOLD; + uartConfig.rx.maxBufSize = NPI_UART_RX_BUF_SIZE; + uartConfig.tx.maxBufSize = NPI_UART_TX_BUF_SIZE; + uartConfig.idleTimeout = NPI_UART_IDLE_TIMEOUT; + uartConfig.intEnable = NPI_UART_INT_ENABLE; + uartConfig.callBackFunc = (halUARTCBack_t)npiCBack; + + // start UART + // Note: Assumes no issue opening UART port. + (void)HalUARTOpen( NPI_UART_PORT, &uartConfig ); + + return; +} + + +/******************************************************************************* + * @fn NPI_ReadTransport + * + * @brief This routine reads data from the transport layer based on len, + * and places it into the buffer. + * + * input parameters + * + * @param buf - Pointer to buffer to place read data. + * @param len - Number of bytes to read. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes read from transport. + */ +uint16 NPI_ReadTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTRead( NPI_UART_PORT, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_WriteTransport + * + * @brief This routine writes data from the buffer to the transport layer. + * + * input parameters + * + * @param buf - Pointer to buffer to write data from. + * @param len - Number of bytes to write. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes written to transport. + */ +uint16 NPI_WriteTransport( uint8 *buf, uint16 len ) +{ + return( HalUARTWrite( NPI_UART_PORT, buf, len ) ); +} + + +/******************************************************************************* + * @fn NPI_RxBufLen + * + * @brief This routine returns the number of bytes in the receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the number of bytes in the receive buffer. + */ +uint16 NPI_RxBufLen( void ) +{ + return( Hal_UART_RxBufLen( NPI_UART_PORT ) ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxRxBufSize + * + * @brief This routine returns the max size receive buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the receive buffer. + */ +uint16 NPI_GetMaxRxBufSize( void ) +{ + return( NPI_UART_RX_BUF_SIZE ); +} + + +/******************************************************************************* + * @fn NPI_GetMaxTxBufSize + * + * @brief This routine returns the max size transmit buffer. + * + * input parameters + * + * @param None. + * + * output parameters + * + * @param None. + * + * @return Returns the max size of the transmit buffer. + */ +uint16 NPI_GetMaxTxBufSize( void ) +{ + return( NPI_UART_TX_BUF_SIZE ); +} + + +/******************************************************************************* + ******************************************************************************/ diff --git a/Firmware/Radio/common/npi/npi_np/npi.h b/Firmware/Radio/common/npi/npi_np/npi.h new file mode 100644 index 0000000..70bb899 --- /dev/null +++ b/Firmware/Radio/common/npi/npi_np/npi.h @@ -0,0 +1,126 @@ +/******************************************************************************* + Filename: npi.h + Revised: $Date: 2007-10-28 09:35:41 -0700 (Sun, 28 Oct 2007) $ + Revision: $Revision: 15796 $ + + Description: This file contains the Network Processor Interface (NPI), + which abstracts the physical link between the Application + Processor (AP) and the Network Processor (NP). The NPI + serves as the HAL's client for the SPI and UART drivers, and + provides API and callback services for its client. + + Copyright 2008-2012 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +*******************************************************************************/ + +#ifndef NPI_H +#define NPI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * INCLUDES + */ + +#include "hal_types.h" +#include "hal_board.h" +#include "hal_uart.h" + +/******************************************************************************* + * MACROS + */ + +/******************************************************************************* + * CONSTANTS + */ + +/* UART port */ +#if !defined NPI_UART_PORT +#if ((defined HAL_UART_SPI) && (HAL_UART_SPI != 0)) +#define NPI_UART_PORT HAL_UART_PORT_1 +#else +#define NPI_UART_PORT HAL_UART_PORT_0 +#endif +#endif + +#if !defined( NPI_UART_FC ) +#define NPI_UART_FC TRUE +#endif // !NPI_UART_FC + +#define NPI_UART_FC_THRESHOLD 48 +#define NPI_UART_RX_BUF_SIZE 128 +#define NPI_UART_TX_BUF_SIZE 128 +#define NPI_UART_IDLE_TIMEOUT 6 +#define NPI_UART_INT_ENABLE TRUE + +#if !defined( NPI_UART_BR ) +#define NPI_UART_BR HAL_UART_BR_115200 +#endif // !NPI_UART_BR + +/******************************************************************************* + * TYPEDEFS + */ + +typedef void (*npiCBack_t) ( uint8 port, uint8 event ); + +/******************************************************************************* + * LOCAL VARIABLES + */ + +/******************************************************************************* + * GLOBAL VARIABLES + */ + +/******************************************************************************* + * FUNCTIONS + */ + +// +// Network Processor Interface APIs +// + +extern void NPI_InitTransport( npiCBack_t npiCBack ); +extern uint16 NPI_ReadTransport( uint8 *buf, uint16 len ); +extern uint16 NPI_WriteTransport( uint8 *, uint16 ); +extern uint16 NPI_RxBufLen( void ); +extern uint16 NPI_GetMaxRxBufSize( void ); +extern uint16 NPI_GetMaxTxBufSize( void ); + +/******************************************************************************* +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* NPI_H */ diff --git a/Firmware/Radio/config/buildComponents.cfg b/Firmware/Radio/config/buildComponents.cfg new file mode 100644 index 0000000..f8d0e11 --- /dev/null +++ b/Firmware/Radio/config/buildComponents.cfg @@ -0,0 +1,58 @@ +/************************************************************************************************** + Filename: buildComponents.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) + Host/Controller build components. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Host Build Components + +-DBROADCASTER_CFG=0x01 +-DOBSERVER_CFG=0x02 +-DPERIPHERAL_CFG=0x04 +-DCENTRAL_CFG=0x08 + +// BLE Controller Build Components + +-DADV_NCONN_CFG=0x01 +-DADV_CONN_CFG=0x02 +-DSCAN_CFG=0x04 +-DINIT_CFG=0x08 + +// Possible BLE Controller Pre-Defined Combinations +-DADV_CFG=ADV_NCONN_CFG+ADV_CONN_CFG +-DLINK_CFG=ADV_CONN_CFG+INIT_CFG +-DFULL_CFG=INIT_CFG+SCAN_CFG+ADV_NCONN_CFG+ADV_CONN_CFG diff --git a/Firmware/Radio/config/buildConfig.cfg b/Firmware/Radio/config/buildConfig.cfg new file mode 100644 index 0000000..8ada9ad --- /dev/null +++ b/Firmware/Radio/config/buildConfig.cfg @@ -0,0 +1,50 @@ +/************************************************************************************************** + Filename: buildConfig.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: This file contains the Bluetooth Low Energy (BLE) Host + build configuration. + + + Copyright 2011 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Host Build Configurations + +//-DHOST_CONFIG=BROADCASTER_CFG +//-DHOST_CONFIG=OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG +//-DHOST_CONFIG=CENTRAL_CFG +//-DHOST_CONFIG=BROADCASTER_CFG+OBSERVER_CFG +//-DHOST_CONFIG=PERIPHERAL_CFG+OBSERVER_CFG +//-DHOST_CONFIG=CENTRAL_CFG+BROADCASTER_CFG +-DHOST_CONFIG=PERIPHERAL_CFG+CENTRAL_CFG diff --git a/Firmware/Radio/config/config.cfg b/Firmware/Radio/config/config.cfg new file mode 100644 index 0000000..e606c9b --- /dev/null +++ b/Firmware/Radio/config/config.cfg @@ -0,0 +1,50 @@ +/************************************************************************************************** + Filename: config.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE device common configuration. + + Copyright 2008 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type Values +-DLL_DEV_TYPE_MASTER=1 +-DLL_DEV_TYPE_SLAVE=2 +-DLL_DEV_TYPE_MASTER_SLAVE=3 + +-DADV_NCONN_CFG=0x01 +-DADV_CONN_CFG=0x02 +-DSCAN_CFG=0x04 +-DINIT_CFG=0x08 +-DCTRL_CONFIG=ADV_NCONN_CFG+ADV_CONN_CFG+SCAN_CFG+INIT_CFG diff --git a/Firmware/Radio/config/config_master.cfg b/Firmware/Radio/config/config_master.cfg new file mode 100644 index 0000000..8e4be5f --- /dev/null +++ b/Firmware/Radio/config/config_master.cfg @@ -0,0 +1,43 @@ +/************************************************************************************************** + Filename: config_master.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE master device configuration. + + Copyright 2009 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type +-DDEVICE_TYPE=LL_DEV_TYPE_MASTER + diff --git a/Firmware/Radio/config/config_slave.cfg b/Firmware/Radio/config/config_slave.cfg new file mode 100644 index 0000000..9cadb1d --- /dev/null +++ b/Firmware/Radio/config/config_slave.cfg @@ -0,0 +1,42 @@ +/************************************************************************************************** + Filename: config_slave.cfg + Revised: $Date: 2007-10-12 17:31:39 -0700 (Fri, 12 Oct 2007) $ + Revision: $Revision: 15678 $ + + Description: + + This file contains the Bluetooth LE slave device configuration. + + Copyright 2009 - 2010 Texas Instruments Incorporated. All rights reserved. + + IMPORTANT: Your use of this Software is limited to those specific rights + granted under the terms of a software license agreement between the user + who downloaded the software, his/her employer (which must be your employer) + and Texas Instruments Incorporated (the "License"). You may not use this + Software unless you agree to abide by the terms of the License. The License + limits your use, and you acknowledge, that the Software may not be modified, + copied or distributed unless embedded on a Texas Instruments microcontroller + or used solely and exclusively in conjunction with a Texas Instruments radio + frequency transceiver, which is integrated into your product. Other than for + the foregoing purpose, you may not use, reproduce, copy, prepare derivative + works of, modify, distribute, perform, display or sell this Software and/or + its documentation for any purpose. + + YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE + PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, + NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL + TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, + NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER + LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES + INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE + OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT + OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES + (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. + + Should you have any questions regarding your right to use this Software, + contact Texas Instruments Incorporated at www.TI.com. +**************************************************************************************************/ + +// BLE Device Type +-DDEVICE_TYPE=LL_DEV_TYPE_SLAVE diff --git a/Firmware/WIMU3/Libraries/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf b/Firmware/WIMU3/Libraries/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf new file mode 100644 index 0000000..c67c867 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt new file mode 100644 index 0000000..14dae71 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..2710261 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_class_marks_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.ini new file mode 100644 index 0000000..0b2af12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_class_marks_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvoptx new file mode 100644 index 0000000..77860f6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvoptx @@ -0,0 +1,997 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + C:\working\ARM\PACK\ARM\CMSIS\DSP_Lib\Examples\arm_class_marks_example\ARM\RTE\Device\ARMCM7_DP\startup_ARMCM7.s + + +
+ + 1 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + +
+ + 2 + 0 + 210 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\arm_class_marks_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + C:\working\ARM\PACK\ARM\CMSIS\DSP_Lib\Examples\arm_class_marks_example\ARM\RTE\Device\ARMCM7_DP\startup_ARMCM7.s + + +
+ + 1 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + +
+ + 2 + 0 + 210 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\arm_class_marks_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 210 + 1 +
456
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_class_marks_example_f32.c + + +
+ + 1 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + C:\working\ARM\PACK\ARM\CMSIS\DSP_Lib\Examples\arm_class_marks_example\ARM\RTE\Device\ARMCM7_DP\startup_ARMCM7.s + + +
+ + 2 + 0 + 155 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + +
+
+ + + 1 + 2 + 0x20001190 + 0 + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
506
+ 0 + 0 + 0 + 0 + 0 + 1 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + \\arm_class_marks_example\RTE/Device/ARMCM7_SP/startup_ARMCM7.s\155 +
+ + 1 + 0 + 210 + 1 +
456
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_class_marks_example_f32.c + + \\arm_class_marks_example\arm_class_marks_example_f32.c\210 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_class_marks_example_f32.c + arm_class_marks_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 2 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 3 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 7 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvprojx new file mode 100644 index 0000000..3964f7a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example.uvprojx @@ -0,0 +1,3301 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_DP\startup_ARMCM7.s + + + + + + RTE\Device\ARMCM7_DP\system_ARMCM7.c + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c new file mode 100644 index 0000000..d140e26 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c @@ -0,0 +1,211 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt new file mode 100644 index 0000000..14dae71 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/ARMCMx.ld b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/ARMCMx.ld new file mode 100644 index 0000000..cdc8b66 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/ARMCMx.ld @@ -0,0 +1,195 @@ +/* Linker script to configure memory regions. */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000 /* 256k */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000 /* 32k */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.vectors)) + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + KEEP(*(.stack*)) /* changed MG 30.05.14 */ + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM0.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM0.S new file mode 100644 index 0000000..9f69025 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM0.S @@ -0,0 +1,320 @@ +/* File: startup_ARMCM0.S + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 1 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM3.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM3.S new file mode 100644 index 0000000..7c74bf7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM3.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM3.S + * Purpose: startup file for Cortex-M3 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM4.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM4.S new file mode 100644 index 0000000..d56ba36 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/startup_ARMCM4.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Startup/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.ini new file mode 100644 index 0000000..0b2af12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_class_marks_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvopt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvopt new file mode 100644 index 0000000..d937fd9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvopt @@ -0,0 +1,621 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 210 + 1 +
544
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_class_marks_example\GCC\arm_class_marks_example_f32.c + + \\arm_class_marks_example\arm_class_marks_example_f32.c\210 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM3 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 210 + 1 +
532
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_class_marks_example\GCC\arm_class_marks_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM4_FP + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_class_marks_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 210 + 1 +
532
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_class_marks_example\GCC\arm_class_marks_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_class_marks_example_f32.c + arm_class_marks_example_f32.c + 0 + 0 + + + + + CMSIS Device + 1 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + 0 + ./Startup/startup_ARMCM0.S + startup_ARMCM0.S + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM0.c + system_ARMCM0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM3.S + startup_ARMCM3.S + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM3.c + system_ARMCM3.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM4.S + startup_ARMCM4.S + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM4.c + system_ARMCM4.c + 0 + 0 + + + + + CMSIS DSP_Library + 0 + 0 + 0 + 0 + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvproj b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvproj new file mode 100644 index 0000000..2ccd298 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example.uvproj @@ -0,0 +1,1517 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M0" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM0l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM3 + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M3" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM3l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM4_FP + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_class_marks_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_class_marks_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + ARM_MATH_CM4, __FPU_PRESENT = 1, ARMCM4_FP + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM4lf_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_class_marks_example_f32.c + 1 + .\arm_class_marks_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + + + CMSIS DSP_Library + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c new file mode 100644 index 0000000..d140e26 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c @@ -0,0 +1,211 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt new file mode 100644 index 0000000..42dce12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..ae212f8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_convolution_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.ini new file mode 100644 index 0000000..b1a95db --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_convolution_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvoptx new file mode 100644 index 0000000..cfdd337 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvoptx @@ -0,0 +1,954 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 241 + 1 +
1722
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\241 +
+ + 1 + 0 + 244 + 1 +
1726
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\244 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 244 + 1 +
1696
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + +
+ + 1 + 0 + 241 + 1 +
1692
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 244 + 1 +
2032
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + +
+ + 1 + 0 + 241 + 1 +
2028
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 241 + 1 +
2028
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\241 +
+ + 1 + 0 + 244 + 1 +
2032
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\244 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_convolution_example_f32.c + arm_convolution_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 3 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 8 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 9 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 10 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 11 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 12 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 13 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 14 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvprojx new file mode 100644 index 0000000..405ea35 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example.uvprojx @@ -0,0 +1,3309 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c new file mode 100644 index 0000000..00b0213 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c @@ -0,0 +1,247 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt new file mode 100644 index 0000000..42dce12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/ARMCMx.ld b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/ARMCMx.ld new file mode 100644 index 0000000..cdc8b66 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/ARMCMx.ld @@ -0,0 +1,195 @@ +/* Linker script to configure memory regions. */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000 /* 256k */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000 /* 32k */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.vectors)) + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + KEEP(*(.stack*)) /* changed MG 30.05.14 */ + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM0.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM0.S new file mode 100644 index 0000000..9f69025 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM0.S @@ -0,0 +1,320 @@ +/* File: startup_ARMCM0.S + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 1 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM3.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM3.S new file mode 100644 index 0000000..7c74bf7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM3.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM3.S + * Purpose: startup file for Cortex-M3 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM4.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM4.S new file mode 100644 index 0000000..d56ba36 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/startup_ARMCM4.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Startup/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.ini new file mode 100644 index 0000000..b1a95db --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_convolution_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvopt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvopt new file mode 100644 index 0000000..908092c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvopt @@ -0,0 +1,682 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 244 + 1 +
660
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\244 +
+ + 1 + 0 + 241 + 1 +
658
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + \\arm_convolution_example\arm_convolution_example_f32.c\241 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM3 + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 244 + 1 +
590
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + +
+ + 1 + 0 + 241 + 1 +
588
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM4_FP + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_convolution_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 244 + 1 +
596
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + +
+ + 1 + 0 + 241 + 1 +
594
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_convolution_example\GCC\arm_convolution_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_convolution_example_f32.c + arm_convolution_example_f32.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + + + CMSIS Device + 1 + 0 + 0 + 0 + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + ./Startup/startup_ARMCM0.S + startup_ARMCM0.S + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM0.c + system_ARMCM0.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM3.S + startup_ARMCM3.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM3.c + system_ARMCM3.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM4.S + startup_ARMCM4.S + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM4.c + system_ARMCM4.c + 0 + 0 + + + + + CMSIS DSP_Library + 0 + 0 + 0 + 0 + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvproj b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvproj new file mode 100644 index 0000000..2ace9d8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example.uvproj @@ -0,0 +1,1532 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M0" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM0l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + math_helper.c + 1 + .\math_helper.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM3 + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M3" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM3l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + math_helper.c + 1 + .\math_helper.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM4_FP + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_convolution_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_convolution_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + ARM_MATH_CM4, __FPU_PRESENT = 1, ARMCM4_FP + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM4lf_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_convolution_example_f32.c + 1 + .\arm_convolution_example_f32.c + + + math_helper.c + 1 + .\math_helper.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + + + CMSIS DSP_Library + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c new file mode 100644 index 0000000..00b0213 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c @@ -0,0 +1,247 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt new file mode 100644 index 0000000..0c0fd5d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..f15c8ec --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_dotproduct_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.ini new file mode 100644 index 0000000..16feac5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.ini @@ -0,0 +1,13 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_dotproduct_example.ini + +*/ + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvoptx new file mode 100644 index 0000000..e4fec99 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvoptx @@ -0,0 +1,941 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
444
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\175 +
+ + 1 + 0 + 172 + 1 +
440
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\172 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
432
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + +
+ + 1 + 0 + 172 + 1 +
428
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
448
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + +
+ + 1 + 0 + 172 + 1 +
444
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
448
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\175 +
+ + 1 + 0 + 172 + 1 +
444
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\172 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_dotproduct_example_f32.c + arm_dotproduct_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 2 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 3 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 7 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvprojx new file mode 100644 index 0000000..c71cf08 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example.uvprojx @@ -0,0 +1,3289 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c new file mode 100644 index 0000000..4bfe357 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c @@ -0,0 +1,178 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt new file mode 100644 index 0000000..0c0fd5d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/ARMCMx.ld b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/ARMCMx.ld new file mode 100644 index 0000000..cdc8b66 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/ARMCMx.ld @@ -0,0 +1,195 @@ +/* Linker script to configure memory regions. */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000 /* 256k */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000 /* 32k */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.vectors)) + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + KEEP(*(.stack*)) /* changed MG 30.05.14 */ + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM0.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM0.S new file mode 100644 index 0000000..9f69025 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM0.S @@ -0,0 +1,320 @@ +/* File: startup_ARMCM0.S + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 1 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM3.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM3.S new file mode 100644 index 0000000..7c74bf7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM3.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM3.S + * Purpose: startup file for Cortex-M3 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM4.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM4.S new file mode 100644 index 0000000..d56ba36 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/startup_ARMCM4.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Startup/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.ini new file mode 100644 index 0000000..16feac5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.ini @@ -0,0 +1,13 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_dotproduct_example.ini + +*/ + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvopt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvopt new file mode 100644 index 0000000..bdab2ea --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvopt @@ -0,0 +1,669 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
530
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\175 +
+ + 1 + 0 + 172 + 1 +
528
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + \\arm_dotproduct_example\arm_dotproduct_example_f32.c\172 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM3 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
506
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + +
+ + 1 + 0 + 172 + 1 +
504
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + ARMCM4_FP + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_dotproduct_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 175 + 1 +
510
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + +
+ + 1 + 0 + 172 + 1 +
508
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_dotproduct_example\GCC\arm_dotproduct_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_dotproduct_example_f32.c + arm_dotproduct_example_f32.c + 0 + 0 + + + + + CMSIS Device + 1 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + 0 + ./Startup/startup_ARMCM0.S + startup_ARMCM0.S + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM0.c + system_ARMCM0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM3.S + startup_ARMCM3.S + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM3.c + system_ARMCM3.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM4.S + startup_ARMCM4.S + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM4.c + system_ARMCM4.c + 0 + 0 + + + + + CMSIS DSP_Library + 0 + 0 + 0 + 0 + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvproj b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvproj new file mode 100644 index 0000000..ea97d03 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example.uvproj @@ -0,0 +1,1517 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M0" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM0l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM3 + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M3" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM3l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM4_FP + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_dotproduct_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_dotproduct_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + ARM_MATH_CM4, __FPU_PRESENT = 1, ARMCM4_FP + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM4lf_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_dotproduct_example_f32.c + 1 + .\arm_dotproduct_example_f32.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + + + CMSIS DSP_Library + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c new file mode 100644 index 0000000..4bfe357 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c @@ -0,0 +1,178 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt new file mode 100644 index 0000000..f6a7fba --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..5c5e185 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_fft_bin_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c new file mode 100644 index 0000000..b5159e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c @@ -0,0 +1,308 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.ini new file mode 100644 index 0000000..62e3049 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.ini @@ -0,0 +1,13 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_fft_bin_example.ini + +*/ + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvoptx new file mode 100644 index 0000000..57ac03e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvoptx @@ -0,0 +1,954 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
476
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\155 +
+ + 1 + 0 + 152 + 1 +
472
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\152 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
670
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + +
+ + 1 + 0 + 152 + 1 +
666
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
674
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + +
+ + 1 + 0 + 152 + 1 +
670
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
674
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\155 +
+ + 1 + 0 + 152 + 1 +
670
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\152 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_fft_bin_data.c + arm_fft_bin_data.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_fft_bin_example_f32.c + arm_fft_bin_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 3 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 8 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 9 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 10 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 11 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 12 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 13 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 14 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvprojx new file mode 100644 index 0000000..5910877 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example.uvprojx @@ -0,0 +1,3309 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c new file mode 100644 index 0000000..6214211 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c @@ -0,0 +1,158 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt new file mode 100644 index 0000000..f6a7fba --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/ARMCMx.ld b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/ARMCMx.ld new file mode 100644 index 0000000..cdc8b66 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/ARMCMx.ld @@ -0,0 +1,195 @@ +/* Linker script to configure memory regions. */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000 /* 256k */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000 /* 32k */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.vectors)) + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + KEEP(*(.stack*)) /* changed MG 30.05.14 */ + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM0.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM0.S new file mode 100644 index 0000000..9f69025 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM0.S @@ -0,0 +1,320 @@ +/* File: startup_ARMCM0.S + * Purpose: startup file for Cortex-M0 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 1 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM3.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM3.S new file mode 100644 index 0000000..7c74bf7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM3.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM3.S + * Purpose: startup file for Cortex-M3 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM4.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM4.S new file mode 100644 index 0000000..d56ba36 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/startup_ARMCM4.S @@ -0,0 +1,314 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.01 + * Date: 12 June 2014 + * + */ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler /* 0: Watchdog Timer */ + .long RTC_IRQHandler /* 1: Real Time Clock */ + .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */ + .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */ + .long MCIA_IRQHandler /* 4: MCIa */ + .long MCIB_IRQHandler /* 5: MCIb */ + .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */ + .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */ + .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */ + .long UART4_IRQHandler /* 9: UART4 - not connected */ + .long AACI_IRQHandler /* 10: AACI / AC97 */ + .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */ + .long ENET_IRQHandler /* 12: Ethernet */ + .long USBDC_IRQHandler /* 13: USB Device */ + .long USBHC_IRQHandler /* 14: USB Host Controller */ + .long CHLCD_IRQHandler /* 15: Character LCD */ + .long FLEXRAY_IRQHandler /* 16: Flexray */ + .long CAN_IRQHandler /* 17: CAN */ + .long LIN_IRQHandler /* 18: LIN */ + .long I2C_IRQHandler /* 19: I2C ADC/DAC */ + .long 0 /* 20: Reserved */ + .long 0 /* 21: Reserved */ + .long 0 /* 22: Reserved */ + .long 0 /* 23: Reserved */ + .long 0 /* 24: Reserved */ + .long 0 /* 25: Reserved */ + .long 0 /* 26: Reserved */ + .long 0 /* 27: Reserved */ + .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */ + .long 0 /* 29: Reserved - CPU FPGA */ + .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */ + .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler WDT_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TIM0_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler MCIA_IRQHandler + def_irq_handler MCIB_IRQHandler + def_irq_handler UART0_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler AACI_IRQHandler + def_irq_handler CLCD_IRQHandler + def_irq_handler ENET_IRQHandler + def_irq_handler USBDC_IRQHandler + def_irq_handler USBHC_IRQHandler + def_irq_handler CHLCD_IRQHandler + def_irq_handler FLEXRAY_IRQHandler + def_irq_handler CAN_IRQHandler + def_irq_handler LIN_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler CPU_CLCD_IRQHandler + def_irq_handler SPI_IRQHandler + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Startup/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c new file mode 100644 index 0000000..b5159e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c @@ -0,0 +1,308 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.ini new file mode 100644 index 0000000..62e3049 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.ini @@ -0,0 +1,13 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_fft_bin_example.ini + +*/ + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvopt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvopt new file mode 100644 index 0000000..e8da5e0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvopt @@ -0,0 +1,682 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
502
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\155 +
+ + 1 + 0 + 152 + 1 +
500
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + \\arm_fft_bin_example\arm_fft_bin_example_f32.c\152 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x3 + ARM-GNU + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL040000 -FS00 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
480
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + +
+ + 1 + 0 + 152 + 1 +
478
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fft_bin_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 155 + 1 +
480
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + +
+ + 1 + 0 + 152 + 1 +
478
+ 0 + 0 + 0 + 0 + 0 + 1 + C:\Keil\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\GCC\arm_fft_bin_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_fft_bin_example_f32.c + arm_fft_bin_example_f32.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_fft_bin_data.c + arm_fft_bin_data.c + 0 + 0 + + + + + CMSIS Device + 1 + 0 + 0 + 0 + + 2 + 3 + 1 + 0 + 0 + 0 + 0 + ./Startup/startup_ARMCM0.S + startup_ARMCM0.S + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM0.c + system_ARMCM0.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM3.S + startup_ARMCM3.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM3.c + system_ARMCM3.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + 0 + .\Startup\startup_ARMCM4.S + startup_ARMCM4.S + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + 0 + .\Startup\system_ARMCM4.c + system_ARMCM4.c + 0 + 0 + + + + + CMSIS DSP_Library + 0 + 0 + 0 + 0 + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvproj b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvproj new file mode 100644 index 0000000..3c48b8f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example.uvproj @@ -0,0 +1,1532 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M0" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM0l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM3 + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M3" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3 + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM3l_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + + + CMSIS DSP_Library + + + + + ARMCM4_FP + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.2.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_fft_bin_example + 1 + 0 + 0 + 1 + 0 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + + 0 + 0 + + + + + + .\arm_fft_bin_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + ARM_MATH_CM4, __FPU_PRESENT = 1, ARMCM4_FP + + ..\..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + arm_cortexM4lf_math + ..\..\..\..\Lib\GCC + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + .\Startup\ARMCMx.ld + + + + + + Source Files + + + arm_fft_bin_example_f32.c + 1 + .\arm_fft_bin_example_f32.c + + + arm_fft_bin_data.c + 1 + .\arm_fft_bin_data.c + + + + + CMSIS Device + + + startup_ARMCM0.S + 1 + ./Startup/startup_ARMCM0.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + .\Startup\system_ARMCM0.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM3.S + 1 + .\Startup\startup_ARMCM3.S + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + .\Startup\system_ARMCM3.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 0 + 2 + + + + + + + + + + + + startup_ARMCM4.S + 1 + .\Startup\startup_ARMCM4.S + + + system_ARMCM4.c + 1 + .\Startup\system_ARMCM4.c + + + + + CMSIS DSP_Library + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c new file mode 100644 index 0000000..6214211 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c @@ -0,0 +1,158 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt new file mode 100644 index 0000000..1fb1bfb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..c4f5b95 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_fir_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c new file mode 100644 index 0000000..283a25e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.ini new file mode 100644 index 0000000..0645e7c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.ini @@ -0,0 +1,13 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_fir_lpf_example.ini + +*/ + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvoptx new file mode 100644 index 0000000..19232ed --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvoptx @@ -0,0 +1,967 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fir_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
1640
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + \\arm_fir_example\arm_fir_example_f32.c\230 +
+ + 1 + 0 + 227 + 1 +
1636
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + \\arm_fir_example\arm_fir_example_f32.c\227 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fir_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
1710
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + +
+ + 1 + 0 + 227 + 1 +
1706
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_fir_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
2042
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + +
+ + 1 + 0 + 227 + 1 +
2038
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_fir_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
2042
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + \\arm_fir_example\arm_fir_example_f32.c\230 +
+ + 1 + 0 + 227 + 1 +
2038
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_fir_example_f32.c + + \\arm_fir_example\arm_fir_example_f32.c\227 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_fir_data.c + arm_fir_data.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + .\arm_fir_example_f32.c + arm_fir_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 4 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 8 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 15 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvprojx new file mode 100644 index 0000000..e3d76ef --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example.uvprojx @@ -0,0 +1,3329 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_fir_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fir_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_fir_data.c + 1 + .\arm_fir_data.c + + + arm_fir_example_f32.c + 1 + .\arm_fir_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_fir_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fir_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_fir_data.c + 1 + .\arm_fir_data.c + + + arm_fir_example_f32.c + 1 + .\arm_fir_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_fir_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_fir_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_fir_data.c + 1 + .\arm_fir_data.c + + + arm_fir_example_f32.c + 1 + .\arm_fir_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_fir_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_fir_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_fir_data.c + 1 + .\arm_fir_data.c + + + arm_fir_example_f32.c + 1 + .\arm_fir_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c new file mode 100644 index 0000000..58dfb47 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------- + * 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt new file mode 100644 index 0000000..a4ece08 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..6c7b81e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_graphic_equalizer_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c new file mode 100644 index 0000000..ffb0ff3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.ini new file mode 100644 index 0000000..b1c66aa --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_geq_5band_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvoptx new file mode 100644 index 0000000..95a26e4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvoptx @@ -0,0 +1,967 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_graphic_equalizer_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 402 + 1 +
1898
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + \\arm_graphic_equalizer_example\arm_graphic_equalizer_example_q31.c\402 +
+ + 1 + 0 + 405 + 1 +
1902
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + \\arm_graphic_equalizer_example\arm_graphic_equalizer_example_q31.c\405 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_graphic_equalizer_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 405 + 1 +
1880
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + +
+ + 1 + 0 + 402 + 1 +
1876
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_graphic_equalizer_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 405 + 1 +
2212
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + +
+ + 1 + 0 + 402 + 1 +
2208
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_graphic_equalizer_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 402 + 1 +
2208
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + \\arm_graphic_equalizer_example\arm_graphic_equalizer_example_q31.c\402 +
+ + 1 + 0 + 405 + 1 +
2212
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_graphic_equalizer_example_q31.c + + \\arm_graphic_equalizer_example\arm_graphic_equalizer_example_q31.c\405 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_graphic_equalizer_data.c + arm_graphic_equalizer_data.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + .\arm_graphic_equalizer_example_q31.c + arm_graphic_equalizer_example_q31.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 4 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 8 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 15 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvprojx new file mode 100644 index 0000000..8ecd65a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example.uvprojx @@ -0,0 +1,3329 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_graphic_equalizer_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_graphic_equalizer_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_graphic_equalizer_data.c + 1 + .\arm_graphic_equalizer_data.c + + + arm_graphic_equalizer_example_q31.c + 1 + .\arm_graphic_equalizer_example_q31.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_graphic_equalizer_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_graphic_equalizer_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_graphic_equalizer_data.c + 1 + .\arm_graphic_equalizer_data.c + + + arm_graphic_equalizer_example_q31.c + 1 + .\arm_graphic_equalizer_example_q31.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_graphic_equalizer_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_graphic_equalizer_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_graphic_equalizer_data.c + 1 + .\arm_graphic_equalizer_data.c + + + arm_graphic_equalizer_example_q31.c + 1 + .\arm_graphic_equalizer_example_q31.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_graphic_equalizer_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_graphic_equalizer_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_graphic_equalizer_data.c + 1 + .\arm_graphic_equalizer_data.c + + + arm_graphic_equalizer_example_q31.c + 1 + .\arm_graphic_equalizer_example_q31.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c new file mode 100644 index 0000000..5cd2a8a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c @@ -0,0 +1,411 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt new file mode 100644 index 0000000..eef467a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..5c2e57e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_linear_interp_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c new file mode 100644 index 0000000..5a53ec6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c @@ -0,0 +1,23616 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.ini new file mode 100644 index 0000000..062223e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_linear_interp_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvoptx new file mode 100644 index 0000000..126e9f0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvoptx @@ -0,0 +1,967 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_linear_interp_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
1832
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + \\arm_linear_interp_example\arm_linear_interp_example_f32.c\201 +
+ + 1 + 0 + 198 + 1 +
1828
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + \\arm_linear_interp_example\arm_linear_interp_example_f32.c\198 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_linear_interp_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
1906
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + +
+ + 1 + 0 + 198 + 1 +
1902
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_linear_interp_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
2078
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + +
+ + 1 + 0 + 198 + 1 +
2074
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_linear_interp_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
2078
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + \\arm_linear_interp_example\arm_linear_interp_example_f32.c\201 +
+ + 1 + 0 + 198 + 1 +
2074
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_linear_interp_example_f32.c + + \\arm_linear_interp_example\arm_linear_interp_example_f32.c\198 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_linear_interp_data.c + arm_linear_interp_data.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + .\arm_linear_interp_example_f32.c + arm_linear_interp_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 4 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 8 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 15 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvprojx new file mode 100644 index 0000000..5a031f1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example.uvprojx @@ -0,0 +1,3329 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_linear_interp_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_linear_interp_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_linear_interp_data.c + 1 + .\arm_linear_interp_data.c + + + arm_linear_interp_example_f32.c + 1 + .\arm_linear_interp_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_linear_interp_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_linear_interp_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_linear_interp_data.c + 1 + .\arm_linear_interp_data.c + + + arm_linear_interp_example_f32.c + 1 + .\arm_linear_interp_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_linear_interp_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_linear_interp_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_linear_interp_data.c + 1 + .\arm_linear_interp_data.c + + + arm_linear_interp_example_f32.c + 1 + .\arm_linear_interp_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_linear_interp_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_linear_interp_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_linear_interp_data.c + 1 + .\arm_linear_interp_data.c + + + arm_linear_interp_example_f32.c + 1 + .\arm_linear_interp_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c new file mode 100644 index 0000000..c54564a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt new file mode 100644 index 0000000..36357bf --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..4aabc8d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_matrix_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.ini new file mode 100644 index 0000000..2bb2434 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_matrix_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvoptx new file mode 100644 index 0000000..bb3ebf5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvoptx @@ -0,0 +1,954 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_matrix_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
1752
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + \\arm_matrix_example\arm_matrix_example_f32.c\230 +
+ + 1 + 0 + 227 + 1 +
1748
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + \\arm_matrix_example\arm_matrix_example_f32.c\227 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_matrix_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
1722
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + +
+ + 1 + 0 + 227 + 1 +
1718
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_matrix_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
2054
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + +
+ + 1 + 0 + 227 + 1 +
2050
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_matrix_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 230 + 1 +
2054
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + \\arm_matrix_example\arm_matrix_example_f32.c\230 +
+ + 1 + 0 + 227 + 1 +
2050
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_matrix_example_f32.c + + \\arm_matrix_example\arm_matrix_example_f32.c\227 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_matrix_example_f32.c + arm_matrix_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 3 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 8 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 9 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 10 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 11 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 12 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 13 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 14 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvprojx new file mode 100644 index 0000000..f3c479f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example.uvprojx @@ -0,0 +1,3309 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_matrix_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_matrix_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_matrix_example_f32.c + 1 + .\arm_matrix_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_matrix_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_matrix_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_matrix_example_f32.c + 1 + .\arm_matrix_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_matrix_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_matrix_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_matrix_example_f32.c + 1 + .\arm_matrix_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_matrix_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_matrix_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_matrix_example_f32.c + 1 + .\arm_matrix_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c new file mode 100644 index 0000000..7696b41 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt new file mode 100644 index 0000000..d246eb8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..2ec40a3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_signal_converge_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c new file mode 100644 index 0000000..ddb1278 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c @@ -0,0 +1,269 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.ini new file mode 100644 index 0000000..0f86635 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_signal_converge_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvoptx new file mode 100644 index 0000000..2f1266d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvoptx @@ -0,0 +1,967 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_signal_converge_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 256 + 1 +
556
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + \\arm_signal_converge_example\arm_signal_converge_example_f32.c\256 +
+ + 1 + 0 + 253 + 1 +
552
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + \\arm_signal_converge_example\arm_signal_converge_example_f32.c\253 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_signal_converge_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 256 + 1 +
546
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + +
+ + 1 + 0 + 253 + 1 +
542
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_signal_converge_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 256 + 1 +
566
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + +
+ + 1 + 0 + 253 + 1 +
562
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_signal_converge_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 256 + 1 +
566
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + \\arm_signal_converge_example\arm_signal_converge_example_f32.c\256 +
+ + 1 + 0 + 253 + 1 +
562
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_signal_converge_example_f32.c + + \\arm_signal_converge_example\arm_signal_converge_example_f32.c\253 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\math_helper.c + math_helper.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + .\arm_signal_converge_data.c + arm_signal_converge_data.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + .\arm_signal_converge_example_f32.c + arm_signal_converge_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 4 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 7 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 8 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 15 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvprojx new file mode 100644 index 0000000..70a6189 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example.uvprojx @@ -0,0 +1,3329 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_signal_converge_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_signal_converge_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_signal_converge_data.c + 1 + .\arm_signal_converge_data.c + + + arm_signal_converge_example_f32.c + 1 + .\arm_signal_converge_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_signal_converge_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_signal_converge_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_signal_converge_data.c + 1 + .\arm_signal_converge_data.c + + + arm_signal_converge_example_f32.c + 1 + .\arm_signal_converge_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_signal_converge_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_signal_converge_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_signal_converge_data.c + 1 + .\arm_signal_converge_data.c + + + arm_signal_converge_example_f32.c + 1 + .\arm_signal_converge_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_signal_converge_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_signal_converge_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + math_helper.c + 1 + .\math_helper.c + + + arm_signal_converge_data.c + 1 + .\arm_signal_converge_data.c + + + arm_signal_converge_example_f32.c + 1 + .\arm_signal_converge_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c new file mode 100644 index 0000000..983b6bf --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c @@ -0,0 +1,259 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c new file mode 100644 index 0000000..dbf2cfe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h new file mode 100644 index 0000000..46b0af3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt new file mode 100644 index 0000000..d698b43 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..fea98aa --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_sin_cos_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.ini new file mode 100644 index 0000000..74ecea7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_sin_cos_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvoptx new file mode 100644 index 0000000..ae584ae --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvoptx @@ -0,0 +1,941 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_sin_cos_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 158 + 1 +
484
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + \\arm_sin_cos_example\arm_sin_cos_example_f32.c\158 +
+ + 1 + 0 + 153 + 1 +
470
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + \\arm_sin_cos_example\arm_sin_cos_example_f32.c\153 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_sin_cos_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 158 + 1 +
472
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + +
+ + 1 + 0 + 153 + 1 +
458
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_sin_cos_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 158 + 1 +
506
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + +
+ + 1 + 0 + 153 + 1 +
492
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_sin_cos_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 158 + 1 +
506
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + \\arm_sin_cos_example\arm_sin_cos_example_f32.c\158 +
+ + 1 + 0 + 153 + 1 +
492
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_sin_cos_example_f32.c + + \\arm_sin_cos_example\arm_sin_cos_example_f32.c\153 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_sin_cos_example_f32.c + arm_sin_cos_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 2 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 3 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 7 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvprojx new file mode 100644 index 0000000..839724a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example.uvprojx @@ -0,0 +1,3289 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_sin_cos_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_sin_cos_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_sin_cos_example_f32.c + 1 + .\arm_sin_cos_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_sin_cos_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_sin_cos_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_sin_cos_example_f32.c + 1 + .\arm_sin_cos_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_sin_cos_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_sin_cos_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_sin_cos_example_f32.c + 1 + .\arm_sin_cos_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_sin_cos_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_sin_cos_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_sin_cos_example_f32.c + 1 + .\arm_sin_cos_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c new file mode 100644 index 0000000..dc89a39 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c @@ -0,0 +1,161 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt new file mode 100644 index 0000000..931d02d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt @@ -0,0 +1,4 @@ +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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..fcf8d3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,253 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..3860b15 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..85467b1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..d7b2e91 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,84 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V1.08 + * @date 23. November 2012 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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. + ---------------------------------------------------------------------------*/ + + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..c8311e5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V1.08 +; * @date 23. November 2012 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 2012 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..0f63442 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,93 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V1.09 + * @date 26. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2012 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 (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..d3bc5e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,273 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device Series +; * @version V1.00 +; * @date 22. August 2014 +; * +; * @note +; * +; ******************************************************************************/ +;/* Copyright (c) 2011 - 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. +; ---------------------------------------------------------------------------*/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: Watchdog Timer + DCD RTC_IRQHandler ; 1: Real Time Clock + DCD TIM0_IRQHandler ; 2: Timer0 / Timer1 + DCD TIM2_IRQHandler ; 3: Timer2 / Timer3 + DCD MCIA_IRQHandler ; 4: MCIa + DCD MCIB_IRQHandler ; 5: MCIb + DCD UART0_IRQHandler ; 6: UART0 - DUT FPGA + DCD UART1_IRQHandler ; 7: UART1 - DUT FPGA + DCD UART2_IRQHandler ; 8: UART2 - DUT FPGA + DCD UART4_IRQHandler ; 9: UART4 - not connected + DCD AACI_IRQHandler ; 10: AACI / AC97 + DCD CLCD_IRQHandler ; 11: CLCD Combined Interrupt + DCD ENET_IRQHandler ; 12: Ethernet + DCD USBDC_IRQHandler ; 13: USB Device + DCD USBHC_IRQHandler ; 14: USB Host Controller + DCD CHLCD_IRQHandler ; 15: Character LCD + DCD FLEXRAY_IRQHandler ; 16: Flexray + DCD CAN_IRQHandler ; 17: CAN + DCD LIN_IRQHandler ; 18: LIN + DCD I2C_IRQHandler ; 19: I2C ADC/DAC + DCD 0 ; 20: Reserved + DCD 0 ; 21: Reserved + DCD 0 ; 22: Reserved + DCD 0 ; 23: Reserved + DCD 0 ; 24: Reserved + DCD 0 ; 25: Reserved + DCD 0 ; 26: Reserved + DCD 0 ; 27: Reserved + DCD CPU_CLCD_IRQHandler ; 28: Reserved - CPU FPGA CLCD + DCD 0 ; 29: Reserved - CPU FPGA + DCD UART3_IRQHandler ; 30: UART3 - CPU FPGA + DCD SPI_IRQHandler ; 31: SPI Touchscreen - CPU FPGA +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WDT_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TIM0_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT MCIA_IRQHandler [WEAK] + EXPORT MCIB_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT AACI_IRQHandler [WEAK] + EXPORT CLCD_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT USBDC_IRQHandler [WEAK] + EXPORT USBHC_IRQHandler [WEAK] + EXPORT CHLCD_IRQHandler [WEAK] + EXPORT FLEXRAY_IRQHandler [WEAK] + EXPORT CAN_IRQHandler [WEAK] + EXPORT LIN_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT CPU_CLCD_IRQHandler [WEAK] + EXPORT SPI_IRQHandler [WEAK] + +WDT_IRQHandler +RTC_IRQHandler +TIM0_IRQHandler +TIM2_IRQHandler +MCIA_IRQHandler +MCIB_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +AACI_IRQHandler +CLCD_IRQHandler +ENET_IRQHandler +USBDC_IRQHandler +USBHC_IRQHandler +CHLCD_IRQHandler +FLEXRAY_IRQHandler +CAN_IRQHandler +LIN_IRQHandler +I2C_IRQHandler +CPU_CLCD_IRQHandler +SPI_IRQHandler + B . + + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + + END diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..50a980d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,102 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V1.00 + * @date 27. August 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 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. + ---------------------------------------------------------------------------*/ + + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define __HSI ( 8000000UL) +#define __XTAL ( 5000000UL) /* Oscillator frequency */ + +#define __SYSTEM_CLOCK (5*__XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK;/* System Core Clock Frequency */ + + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate (void) +{ + + SystemCoreClock = __SYSTEM_CLOCK; + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ + #if (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */ + (3UL << 11*2) ); /* set CP11 Full Access */ + #endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = __SYSTEM_CLOCK; + +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/RTE_Components.h b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/RTE_Components.h new file mode 100644 index 0000000..38677f5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/RTE/RTE_Components.h @@ -0,0 +1,14 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'arm_variance_example' + * Target: 'ARMCM0' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.ini b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.ini new file mode 100644 index 0000000..92d19a4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.ini @@ -0,0 +1,15 @@ + +/* This file demonstrates how to Map memory ranges, specify read, write, and execute permissions + + The file can be executed in the following way: + 1) manually from uVision command window (in debug mode) using command: + INCLUIDE arm_variance_example.ini + +*/ + + +// usual initialisation for target setup +MAP 0x00000000, 0x0003FFFF EXEC READ // 256K Flash +MAP 0x20000000, 0x20007FFF READ WRITE // 32K RAM + + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvoptx new file mode 100644 index 0000000..4a30349 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvoptx @@ -0,0 +1,941 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ARMCM0 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM0_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_variance_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
570
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + \\arm_variance_example\arm_variance_example_f32.c\201 +
+ + 1 + 0 + 198 + 1 +
566
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + \\arm_variance_example\arm_variance_example_f32.c\198 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM3 + 0x4 + ARM-ADS + + 10000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM3_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_variance_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
550
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + +
+ + 1 + 0 + 198 + 1 +
546
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM4_FP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM4_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + .\arm_variance_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
588
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + +
+ + 1 + 0 + 198 + 1 +
584
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + ARMCM7_SP + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ARMCM7_debug\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + + + + + .\arm_variance_example.ini + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM) + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T0 + + + + + 0 + 0 + 201 + 1 +
588
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + \\arm_variance_example\arm_variance_example_f32.c\201 +
+ + 1 + 0 + 198 + 1 +
584
+ 0 + 0 + 0 + 0 + 0 + 1 + .\arm_variance_example_f32.c + + \\arm_variance_example\arm_variance_example_f32.c\198 +
+
+ + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + +
+
+ + + Source Files + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + .\arm_variance_example_f32.c + arm_variance_example_f32.c + 0 + 0 + + + + + Documentation + 1 + 0 + 0 + 0 + + 2 + 2 + 5 + 0 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::CMSIS + 1 + 0 + 0 + 1 + + 3 + 3 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + arm_cortexM0l_math.lib + 1 + 0 + + + 3 + 4 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + arm_cortexM3l_math.lib + 1 + 0 + + + 3 + 5 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + arm_cortexM4lf_math.lib + 1 + 0 + + + 3 + 6 + 4 + 0 + 0 + 0 + 0 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + arm_cortexM7lfsp_math.lib + 1 + 0 + + + + + ::Device + 1 + 0 + 0 + 1 + + 4 + 7 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\startup_ARMCM0.s + startup_ARMCM0.s + 1 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM0\system_ARMCM0.c + system_ARMCM0.c + 1 + 0 + + + 4 + 9 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\startup_ARMCM3.s + startup_ARMCM3.s + 1 + 0 + + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM3\system_ARMCM3.c + system_ARMCM3.c + 1 + 0 + + + 4 + 11 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + startup_ARMCM4.s + 1 + 0 + + + 4 + 12 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + system_ARMCM4.c + 1 + 0 + + + 4 + 13 + 2 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + startup_ARMCM7.s + 1 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + 0 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + system_ARMCM7.c + 1 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvprojx new file mode 100644 index 0000000..0579d12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example.uvprojx @@ -0,0 +1,3289 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ARMCM0 + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM0$Device\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM0_debug\ + arm_variance_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM0_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_variance_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_variance_example_f32.c + 1 + .\arm_variance_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM3 + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(10000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Flash\NEW_DEVICE.flm)) + 0 + $$Device:ARMCM3$Device\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM3_debug\ + arm_variance_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM3_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_variance_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_variance_example_f32.c + 1 + .\arm_variance_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM4_FP + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM4_debug\ + arm_variance_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM4_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + .\arm_variance_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_variance_example_f32.c + 1 + .\arm_variance_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + + + ARMCM7_SP + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.1.10 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\ARMCM7_debug\ + arm_variance_example + 1 + 0 + 0 + 1 + 1 + .\ARMCM7_debug\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + .\arm_variance_example.ini + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7 __FPU_PRESENT=1 + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Files + + + arm_variance_example_f32.c + 1 + .\arm_variance_example_f32.c + + + + + Documentation + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::CMSIS + + + arm_cortexM0l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM0l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM3l_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM3l_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM4lf_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + + + arm_cortexM7lfsp_math.lib + 4 + C:\Keil\ARM\PACK\ARM\CMSIS\4.1.10\CMSIS\Lib\ARM\arm_cortexM7lfsp_math.lib + + + + + ::Device + + + startup_ARMCM0.s + 2 + RTE\Device\ARMCM0\startup_ARMCM0.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM0.c + 1 + RTE\Device\ARMCM0\system_ARMCM0.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM3.s + 2 + RTE\Device\ARMCM3\startup_ARMCM3.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM3.c + 1 + RTE\Device\ARMCM3\system_ARMCM3.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM4.s + 2 + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + system_ARMCM4.c + 1 + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + startup_ARMCM7.s + 2 + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + system_ARMCM7.c + 1 + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\Device\ARMCM0\startup_ARMCM0.s + + + + + + + + RTE\Device\ARMCM0\system_ARMCM0.c + + + + + + + + RTE\Device\ARMCM3\startup_ARMCM3.s + + + + + + + + RTE\Device\ARMCM3\system_ARMCM3.c + + + + + + + + RTE\Device\ARMCM4\startup_ARMCM4.s + + + + + + RTE\Device\ARMCM4\system_ARMCM4.c + + + + + + RTE\Device\ARMCM4_FP\startup_ARMCM4.s + + + + + + + + RTE\Device\ARMCM4_FP\system_ARMCM4.c + + + + + + + + RTE\Device\ARMCM7_SP\startup_ARMCM7.s + + + + + + + + RTE\Device\ARMCM7_SP\system_ARMCM7.c + + + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c new file mode 100644 index 0000000..f2188e3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvoptx new file mode 100644 index 0000000..d83f349 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvoptx @@ -0,0 +1,5530 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + M0l + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M0l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M0b + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M0b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M3l + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M3l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M3b + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M3b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4l + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M4l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4b + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M4b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4lf + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M4lf\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4bf + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\intermediateFiles\M4bf\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7l + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7b + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7lfsp + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7lfsp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7bfsp + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7bfsp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7lfdp + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7lfdp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7bfdp + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\IntermediateFiles\M7bfdp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + BasicMathFunctions + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_f32.c + arm_abs_f32.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q7.c + arm_abs_q7.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q15.c + arm_abs_q15.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q31.c + arm_abs_q31.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_f32.c + arm_add_f32.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q7.c + arm_add_q7.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q15.c + arm_add_q15.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q31.c + arm_add_q31.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_f32.c + arm_dot_prod_f32.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q7.c + arm_dot_prod_q7.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q15.c + arm_dot_prod_q15.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q31.c + arm_dot_prod_q31.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_f32.c + arm_mult_f32.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q7.c + arm_mult_q7.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q15.c + arm_mult_q15.c + 0 + 0 + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q31.c + arm_mult_q31.c + 0 + 0 + + + 1 + 17 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_f32.c + arm_negate_f32.c + 0 + 0 + + + 1 + 18 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q7.c + arm_negate_q7.c + 0 + 0 + + + 1 + 19 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q15.c + arm_negate_q15.c + 0 + 0 + + + 1 + 20 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q31.c + arm_negate_q31.c + 0 + 0 + + + 1 + 21 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_f32.c + arm_offset_f32.c + 0 + 0 + + + 1 + 22 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q7.c + arm_offset_q7.c + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q15.c + arm_offset_q15.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q31.c + arm_offset_q31.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_f32.c + arm_scale_f32.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q7.c + arm_scale_q7.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q15.c + arm_scale_q15.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q31.c + arm_scale_q31.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q7.c + arm_shift_q7.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q15.c + arm_shift_q15.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q31.c + arm_shift_q31.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_f32.c + arm_sub_f32.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q7.c + arm_sub_q7.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q15.c + arm_sub_q15.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q31.c + arm_sub_q31.c + 0 + 0 + + + + + FastMathFunctions + 0 + 0 + 0 + 0 + + 2 + 36 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_f32.c + arm_cos_f32.c + 0 + 0 + + + 2 + 37 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_q15.c + arm_cos_q15.c + 0 + 0 + + + 2 + 38 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_q31.c + arm_cos_q31.c + 0 + 0 + + + 2 + 39 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_f32.c + arm_sin_f32.c + 0 + 0 + + + 2 + 40 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_q15.c + arm_sin_q15.c + 0 + 0 + + + 2 + 41 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_q31.c + arm_sin_q31.c + 0 + 0 + + + 2 + 42 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sqrt_q15.c + arm_sqrt_q15.c + 0 + 0 + + + 2 + 43 + 1 + 0 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sqrt_q31.c + arm_sqrt_q31.c + 0 + 0 + + + + + ComplexMathFunctions + 0 + 0 + 0 + 0 + + 3 + 44 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + arm_cmplx_conj_f32.c + 0 + 0 + + + 3 + 45 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + arm_cmplx_conj_q15.c + 0 + 0 + + + 3 + 46 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + arm_cmplx_conj_q31.c + 0 + 0 + + + 3 + 47 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + arm_cmplx_dot_prod_f32.c + 0 + 0 + + + 3 + 48 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + arm_cmplx_dot_prod_q15.c + 0 + 0 + + + 3 + 49 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + arm_cmplx_dot_prod_q31.c + 0 + 0 + + + 3 + 50 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + arm_cmplx_mag_f32.c + 0 + 0 + + + 3 + 51 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + arm_cmplx_mag_q15.c + 0 + 0 + + + 3 + 52 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + arm_cmplx_mag_q31.c + 0 + 0 + + + 3 + 53 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + arm_cmplx_mag_squared_f32.c + 0 + 0 + + + 3 + 54 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + arm_cmplx_mag_squared_q15.c + 0 + 0 + + + 3 + 55 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + arm_cmplx_mag_squared_q31.c + 0 + 0 + + + 3 + 56 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + arm_cmplx_mult_cmplx_f32.c + 0 + 0 + + + 3 + 57 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + arm_cmplx_mult_cmplx_q15.c + 0 + 0 + + + 3 + 58 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + arm_cmplx_mult_cmplx_q31.c + 0 + 0 + + + 3 + 59 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + arm_cmplx_mult_real_f32.c + 0 + 0 + + + 3 + 60 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + arm_cmplx_mult_real_q15.c + 0 + 0 + + + 3 + 61 + 1 + 0 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + arm_cmplx_mult_real_q31.c + 0 + 0 + + + + + FilteringFunctions + 0 + 0 + 0 + 0 + + 4 + 62 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + arm_biquad_cascade_df1_32x64_init_q31.c + 0 + 0 + + + 4 + 63 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + arm_biquad_cascade_df1_32x64_q31.c + 0 + 0 + + + 4 + 64 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + arm_biquad_cascade_df1_f32.c + 0 + 0 + + + 4 + 65 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + arm_biquad_cascade_df1_fast_q15.c + 0 + 0 + + + 4 + 66 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + arm_biquad_cascade_df1_fast_q31.c + 0 + 0 + + + 4 + 67 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + arm_biquad_cascade_df1_init_f32.c + 0 + 0 + + + 4 + 68 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + arm_biquad_cascade_df1_init_q15.c + 0 + 0 + + + 4 + 69 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + arm_biquad_cascade_df1_init_q31.c + 0 + 0 + + + 4 + 70 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + arm_biquad_cascade_df1_q15.c + 0 + 0 + + + 4 + 71 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + arm_biquad_cascade_df1_q31.c + 0 + 0 + + + 4 + 72 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + arm_biquad_cascade_df2T_init_f32.c + 0 + 0 + + + 4 + 73 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_f32.c + arm_conv_f32.c + 0 + 0 + + + 4 + 74 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_q15.c + arm_conv_fast_q15.c + 0 + 0 + + + 4 + 75 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_q31.c + arm_conv_fast_q31.c + 0 + 0 + + + 4 + 76 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_f32.c + arm_conv_partial_f32.c + 0 + 0 + + + 4 + 77 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + arm_conv_partial_fast_q15.c + 0 + 0 + + + 4 + 78 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + arm_conv_partial_fast_q31.c + 0 + 0 + + + 4 + 79 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q7.c + arm_conv_partial_q7.c + 0 + 0 + + + 4 + 80 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q15.c + arm_conv_partial_q15.c + 0 + 0 + + + 4 + 81 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q31.c + arm_conv_partial_q31.c + 0 + 0 + + + 4 + 82 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q7.c + arm_conv_q7.c + 0 + 0 + + + 4 + 83 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q15.c + arm_conv_q15.c + 0 + 0 + + + 4 + 84 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q31.c + arm_conv_q31.c + 0 + 0 + + + 4 + 85 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_f32.c + arm_correlate_f32.c + 0 + 0 + + + 4 + 86 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_q15.c + arm_correlate_fast_q15.c + 0 + 0 + + + 4 + 87 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_q31.c + arm_correlate_fast_q31.c + 0 + 0 + + + 4 + 88 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q7.c + arm_correlate_q7.c + 0 + 0 + + + 4 + 89 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q15.c + arm_correlate_q15.c + 0 + 0 + + + 4 + 90 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q31.c + arm_correlate_q31.c + 0 + 0 + + + 4 + 91 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_f32.c + arm_fir_decimate_f32.c + 0 + 0 + + + 4 + 92 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + arm_fir_decimate_fast_q15.c + 0 + 0 + + + 4 + 93 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + arm_fir_decimate_fast_q31.c + 0 + 0 + + + 4 + 94 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + arm_fir_decimate_init_f32.c + 0 + 0 + + + 4 + 95 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + arm_fir_decimate_init_q15.c + 0 + 0 + + + 4 + 96 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + arm_fir_decimate_init_q31.c + 0 + 0 + + + 4 + 97 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_q15.c + arm_fir_decimate_q15.c + 0 + 0 + + + 4 + 98 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_q31.c + arm_fir_decimate_q31.c + 0 + 0 + + + 4 + 99 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_f32.c + arm_fir_f32.c + 0 + 0 + + + 4 + 100 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_fast_q15.c + arm_fir_fast_q15.c + 0 + 0 + + + 4 + 101 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_fast_q31.c + arm_fir_fast_q31.c + 0 + 0 + + + 4 + 102 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_f32.c + arm_fir_init_f32.c + 0 + 0 + + + 4 + 103 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q7.c + arm_fir_init_q7.c + 0 + 0 + + + 4 + 104 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q15.c + arm_fir_init_q15.c + 0 + 0 + + + 4 + 105 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q31.c + arm_fir_init_q31.c + 0 + 0 + + + 4 + 106 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + arm_fir_interpolate_f32.c + 0 + 0 + + + 4 + 107 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + arm_fir_interpolate_init_f32.c + 0 + 0 + + + 4 + 108 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + arm_fir_interpolate_init_q15.c + 0 + 0 + + + 4 + 109 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + arm_fir_interpolate_init_q31.c + 0 + 0 + + + 4 + 110 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + arm_fir_interpolate_q15.c + 0 + 0 + + + 4 + 111 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + arm_fir_interpolate_q31.c + 0 + 0 + + + 4 + 112 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_f32.c + arm_fir_lattice_f32.c + 0 + 0 + + + 4 + 113 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + arm_fir_lattice_init_f32.c + 0 + 0 + + + 4 + 114 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + arm_fir_lattice_init_q15.c + 0 + 0 + + + 4 + 115 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + arm_fir_lattice_init_q31.c + 0 + 0 + + + 4 + 116 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_q15.c + arm_fir_lattice_q15.c + 0 + 0 + + + 4 + 117 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_q31.c + arm_fir_lattice_q31.c + 0 + 0 + + + 4 + 118 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q7.c + arm_fir_q7.c + 0 + 0 + + + 4 + 119 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q15.c + arm_fir_q15.c + 0 + 0 + + + 4 + 120 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q31.c + arm_fir_q31.c + 0 + 0 + + + 4 + 121 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_f32.c + arm_fir_sparse_f32.c + 0 + 0 + + + 4 + 122 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + arm_fir_sparse_init_f32.c + 0 + 0 + + + 4 + 123 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + arm_fir_sparse_init_q7.c + 0 + 0 + + + 4 + 124 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + arm_fir_sparse_init_q15.c + 0 + 0 + + + 4 + 125 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + arm_fir_sparse_init_q31.c + 0 + 0 + + + 4 + 126 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q7.c + arm_fir_sparse_q7.c + 0 + 0 + + + 4 + 127 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q15.c + arm_fir_sparse_q15.c + 0 + 0 + + + 4 + 128 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q31.c + arm_fir_sparse_q31.c + 0 + 0 + + + 4 + 129 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_f32.c + arm_iir_lattice_f32.c + 0 + 0 + + + 4 + 130 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + arm_iir_lattice_init_f32.c + 0 + 0 + + + 4 + 131 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + arm_iir_lattice_init_q15.c + 0 + 0 + + + 4 + 132 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + arm_iir_lattice_init_q31.c + 0 + 0 + + + 4 + 133 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_q15.c + arm_iir_lattice_q15.c + 0 + 0 + + + 4 + 134 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_q31.c + arm_iir_lattice_q31.c + 0 + 0 + + + 4 + 135 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_f32.c + arm_lms_f32.c + 0 + 0 + + + 4 + 136 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_f32.c + arm_lms_init_f32.c + 0 + 0 + + + 4 + 137 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_q15.c + arm_lms_init_q15.c + 0 + 0 + + + 4 + 138 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_q31.c + arm_lms_init_q31.c + 0 + 0 + + + 4 + 139 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_f32.c + arm_lms_norm_f32.c + 0 + 0 + + + 4 + 140 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + arm_lms_norm_init_f32.c + 0 + 0 + + + 4 + 141 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + arm_lms_norm_init_q15.c + 0 + 0 + + + 4 + 142 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + arm_lms_norm_init_q31.c + 0 + 0 + + + 4 + 143 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_q15.c + arm_lms_norm_q15.c + 0 + 0 + + + 4 + 144 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_q31.c + arm_lms_norm_q31.c + 0 + 0 + + + 4 + 145 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_q15.c + arm_lms_q15.c + 0 + 0 + + + 4 + 146 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_q31.c + arm_lms_q31.c + 0 + 0 + + + 4 + 147 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_opt_q15.c + arm_correlate_opt_q15.c + 0 + 0 + + + 4 + 148 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_opt_q7.c + arm_conv_opt_q7.c + 0 + 0 + + + 4 + 149 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_opt_q15.c + arm_conv_opt_q15.c + 0 + 0 + + + 4 + 150 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + arm_conv_partial_opt_q7.c + 0 + 0 + + + 4 + 151 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + arm_conv_partial_opt_q15.c + 0 + 0 + + + 4 + 152 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_opt_q7.c + arm_correlate_opt_q7.c + 0 + 0 + + + 4 + 153 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + arm_correlate_fast_opt_q15.c + 0 + 0 + + + 4 + 154 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + arm_conv_fast_opt_q15.c + 0 + 0 + + + 4 + 155 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + arm_conv_partial_fast_opt_q15.c + 0 + 0 + + + 4 + 156 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + arm_biquad_cascade_df2T_f32.c + 0 + 0 + + + 4 + 157 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + arm_biquad_cascade_df2T_f64.c + 0 + 0 + + + 4 + 158 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + arm_biquad_cascade_df2T_init_f64.c + 0 + 0 + + + 4 + 159 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + arm_biquad_cascade_stereo_df2T_f32.c + 0 + 0 + + + 4 + 160 + 1 + 0 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + arm_biquad_cascade_stereo_df2T_init_f32.c + 0 + 0 + + + + + MatrixFunctions + 0 + 0 + 0 + 0 + + 5 + 161 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_f32.c + arm_mat_add_f32.c + 0 + 0 + + + 5 + 162 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_q15.c + arm_mat_add_q15.c + 0 + 0 + + + 5 + 163 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_q31.c + arm_mat_add_q31.c + 0 + 0 + + + 5 + 164 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_f32.c + arm_mat_init_f32.c + 0 + 0 + + + 5 + 165 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_q15.c + arm_mat_init_q15.c + 0 + 0 + + + 5 + 166 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_q31.c + arm_mat_init_q31.c + 0 + 0 + + + 5 + 167 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_inverse_f32.c + arm_mat_inverse_f32.c + 0 + 0 + + + 5 + 168 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_f32.c + arm_mat_mult_f32.c + 0 + 0 + + + 5 + 169 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + arm_mat_mult_fast_q15.c + 0 + 0 + + + 5 + 170 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + arm_mat_mult_fast_q31.c + 0 + 0 + + + 5 + 171 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_q15.c + arm_mat_mult_q15.c + 0 + 0 + + + 5 + 172 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_q31.c + arm_mat_mult_q31.c + 0 + 0 + + + 5 + 173 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_f32.c + arm_mat_scale_f32.c + 0 + 0 + + + 5 + 174 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_q15.c + arm_mat_scale_q15.c + 0 + 0 + + + 5 + 175 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_q31.c + arm_mat_scale_q31.c + 0 + 0 + + + 5 + 176 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_f32.c + arm_mat_sub_f32.c + 0 + 0 + + + 5 + 177 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_q15.c + arm_mat_sub_q15.c + 0 + 0 + + + 5 + 178 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_q31.c + arm_mat_sub_q31.c + 0 + 0 + + + 5 + 179 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_f32.c + arm_mat_trans_f32.c + 0 + 0 + + + 5 + 180 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_q15.c + arm_mat_trans_q15.c + 0 + 0 + + + 5 + 181 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_q31.c + arm_mat_trans_q31.c + 0 + 0 + + + 5 + 182 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + arm_mat_cmplx_mult_f32.c + 0 + 0 + + + 5 + 183 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + arm_mat_cmplx_mult_q15.c + 0 + 0 + + + 5 + 184 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + arm_mat_cmplx_mult_q31.c + 0 + 0 + + + 5 + 185 + 1 + 0 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_inverse_f64.c + arm_mat_inverse_f64.c + 0 + 0 + + + + + TransformFunctions + 0 + 0 + 0 + 0 + + 6 + 186 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_f32.c + arm_cfft_radix4_f32.c + 0 + 0 + + + 6 + 187 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + arm_cfft_radix4_init_f32.c + 0 + 0 + + + 6 + 188 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + arm_cfft_radix4_init_q15.c + 0 + 0 + + + 6 + 189 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + arm_cfft_radix4_init_q31.c + 0 + 0 + + + 6 + 190 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_q15.c + arm_cfft_radix4_q15.c + 0 + 0 + + + 6 + 191 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_q31.c + arm_cfft_radix4_q31.c + 0 + 0 + + + 6 + 192 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_f32.c + arm_dct4_f32.c + 0 + 0 + + + 6 + 193 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_f32.c + arm_dct4_init_f32.c + 0 + 0 + + + 6 + 194 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_q15.c + arm_dct4_init_q15.c + 0 + 0 + + + 6 + 195 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_q31.c + arm_dct4_init_q31.c + 0 + 0 + + + 6 + 196 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_q15.c + arm_dct4_q15.c + 0 + 0 + + + 6 + 197 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_q31.c + arm_dct4_q31.c + 0 + 0 + + + 6 + 198 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_f32.c + arm_rfft_f32.c + 0 + 0 + + + 6 + 199 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_f32.c + arm_rfft_init_f32.c + 0 + 0 + + + 6 + 200 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_q15.c + arm_rfft_init_q15.c + 0 + 0 + + + 6 + 201 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_q31.c + arm_rfft_init_q31.c + 0 + 0 + + + 6 + 202 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_q15.c + arm_rfft_q15.c + 0 + 0 + + + 6 + 203 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_q31.c + arm_rfft_q31.c + 0 + 0 + + + 6 + 204 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_bitreversal.c + arm_bitreversal.c + 0 + 0 + + + 6 + 205 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_f32.c + arm_cfft_radix2_f32.c + 0 + 0 + + + 6 + 206 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + arm_cfft_radix2_init_f32.c + 0 + 0 + + + 6 + 207 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + arm_cfft_radix2_init_q15.c + 0 + 0 + + + 6 + 208 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + arm_cfft_radix2_init_q31.c + 0 + 0 + + + 6 + 209 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_q15.c + arm_cfft_radix2_q15.c + 0 + 0 + + + 6 + 210 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_q31.c + arm_cfft_radix2_q31.c + 0 + 0 + + + 6 + 211 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_f32.c + arm_cfft_f32.c + 0 + 0 + + + 6 + 212 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix8_f32.c + arm_cfft_radix8_f32.c + 0 + 0 + + + 6 + 213 + 2 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_bitreversal2.S + arm_bitreversal2.S + 0 + 0 + + + 6 + 214 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_fast_f32.c + arm_rfft_fast_f32.c + 0 + 0 + + + 6 + 215 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + arm_rfft_fast_init_f32.c + 0 + 0 + + + 6 + 216 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_q31.c + arm_cfft_q31.c + 0 + 0 + + + 6 + 217 + 1 + 0 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_q15.c + arm_cfft_q15.c + 0 + 0 + + + + + ControllerFunctions + 0 + 0 + 0 + 0 + + 7 + 218 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_f32.c + arm_pid_init_f32.c + 0 + 0 + + + 7 + 219 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_q15.c + arm_pid_init_q15.c + 0 + 0 + + + 7 + 220 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_q31.c + arm_pid_init_q31.c + 0 + 0 + + + 7 + 221 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_f32.c + arm_pid_reset_f32.c + 0 + 0 + + + 7 + 222 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_q15.c + arm_pid_reset_q15.c + 0 + 0 + + + 7 + 223 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_q31.c + arm_pid_reset_q31.c + 0 + 0 + + + 7 + 224 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_sin_cos_f32.c + arm_sin_cos_f32.c + 0 + 0 + + + 7 + 225 + 1 + 0 + 0 + 0 + 0 + ..\ControllerFunctions\arm_sin_cos_q31.c + arm_sin_cos_q31.c + 0 + 0 + + + + + StatisticsFunctions + 0 + 0 + 0 + 0 + + 8 + 226 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_f32.c + arm_max_f32.c + 0 + 0 + + + 8 + 227 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q7.c + arm_max_q7.c + 0 + 0 + + + 8 + 228 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q15.c + arm_max_q15.c + 0 + 0 + + + 8 + 229 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q31.c + arm_max_q31.c + 0 + 0 + + + 8 + 230 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_f32.c + arm_mean_f32.c + 0 + 0 + + + 8 + 231 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q7.c + arm_mean_q7.c + 0 + 0 + + + 8 + 232 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q15.c + arm_mean_q15.c + 0 + 0 + + + 8 + 233 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q31.c + arm_mean_q31.c + 0 + 0 + + + 8 + 234 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_f32.c + arm_min_f32.c + 0 + 0 + + + 8 + 235 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q7.c + arm_min_q7.c + 0 + 0 + + + 8 + 236 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q15.c + arm_min_q15.c + 0 + 0 + + + 8 + 237 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q31.c + arm_min_q31.c + 0 + 0 + + + 8 + 238 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_f32.c + arm_power_f32.c + 0 + 0 + + + 8 + 239 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q7.c + arm_power_q7.c + 0 + 0 + + + 8 + 240 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q15.c + arm_power_q15.c + 0 + 0 + + + 8 + 241 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q31.c + arm_power_q31.c + 0 + 0 + + + 8 + 242 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_f32.c + arm_rms_f32.c + 0 + 0 + + + 8 + 243 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_q15.c + arm_rms_q15.c + 0 + 0 + + + 8 + 244 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_q31.c + arm_rms_q31.c + 0 + 0 + + + 8 + 245 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_f32.c + arm_std_f32.c + 0 + 0 + + + 8 + 246 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_q15.c + arm_std_q15.c + 0 + 0 + + + 8 + 247 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_q31.c + arm_std_q31.c + 0 + 0 + + + 8 + 248 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_f32.c + arm_var_f32.c + 0 + 0 + + + 8 + 249 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_q15.c + arm_var_q15.c + 0 + 0 + + + 8 + 250 + 1 + 0 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_q31.c + arm_var_q31.c + 0 + 0 + + + + + SupportFunctions + 0 + 0 + 0 + 0 + + 9 + 251 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_f32.c + arm_copy_f32.c + 0 + 0 + + + 9 + 252 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q7.c + arm_copy_q7.c + 0 + 0 + + + 9 + 253 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q15.c + arm_copy_q15.c + 0 + 0 + + + 9 + 254 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q31.c + arm_copy_q31.c + 0 + 0 + + + 9 + 255 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_f32.c + arm_fill_f32.c + 0 + 0 + + + 9 + 256 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q7.c + arm_fill_q7.c + 0 + 0 + + + 9 + 257 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q15.c + arm_fill_q15.c + 0 + 0 + + + 9 + 258 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q31.c + arm_fill_q31.c + 0 + 0 + + + 9 + 259 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q7.c + arm_float_to_q7.c + 0 + 0 + + + 9 + 260 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q15.c + arm_float_to_q15.c + 0 + 0 + + + 9 + 261 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q31.c + arm_float_to_q31.c + 0 + 0 + + + 9 + 262 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_float.c + arm_q7_to_float.c + 0 + 0 + + + 9 + 263 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_q15.c + arm_q7_to_q15.c + 0 + 0 + + + 9 + 264 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_q31.c + arm_q7_to_q31.c + 0 + 0 + + + 9 + 265 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_float.c + arm_q15_to_float.c + 0 + 0 + + + 9 + 266 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_q7.c + arm_q15_to_q7.c + 0 + 0 + + + 9 + 267 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_q31.c + arm_q15_to_q31.c + 0 + 0 + + + 9 + 268 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_float.c + arm_q31_to_float.c + 0 + 0 + + + 9 + 269 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_q7.c + arm_q31_to_q7.c + 0 + 0 + + + 9 + 270 + 1 + 0 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_q15.c + arm_q31_to_q15.c + 0 + 0 + + + + + CommonTables + 0 + 0 + 0 + 0 + + 10 + 271 + 1 + 0 + 0 + 0 + 0 + ..\CommonTables\arm_common_tables.c + arm_common_tables.c + 0 + 0 + + + 10 + 272 + 1 + 0 + 0 + 0 + 0 + ..\CommonTables\arm_const_structs.c + arm_const_structs.c + 0 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvprojx new file mode 100644 index 0000000..a85acb3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math.uvprojx @@ -0,0 +1,25466 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + M0l + 0x4 + ARM-ADS + 5060020::V5.06 (build 20)::ARMCC + + + ARMCM0 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M0l\ + arm_cortexM0l_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M0l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM0 + ARM_MATH_CM0 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M0b + 0x4 + ARM-ADS + + + ARMCM0 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M0b\ + arm_cortexM0b_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M0b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM0, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM0 + ARM_MATH_CM0 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M3l + 0x4 + ARM-ADS + 5060020::V5.06 (build 20)::ARMCC + + + ARMCM3 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M3l\ + arm_cortexM3l_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M3l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM3 + ARM_MATH_CM3 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M3b + 0x4 + ARM-ADS + + + ARMCM3 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M3b\ + arm_cortexM3b_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M3b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM3, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM3 + ARM_MATH_CM3 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4l + 0x4 + ARM-ADS + + + ARMCM4 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4$Device\ARM\ARMCM4\Include\ARMCM4.h + + + + + + + + + + $$Device:ARMCM4$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4l\ + arm_cortexM4l_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M4l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM4 + ARM_MATH_CM4 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4b + 0x4 + ARM-ADS + + + ARMCM4 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4$Device\ARM\ARMCM4\Include\ARMCM4.h + + + + + + + + + + $$Device:ARMCM4$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4b\ + arm_cortexM4b_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M4b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM4 + ARM_MATH_CM4 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4lf + 0x4 + ARM-ADS + 5060020::V5.06 (build 20)::ARMCC + + + ARMCM4_FP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4lf\ + arm_cortexM4lf_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M4lf\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --fpmode=ieee_full + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM4 + ARM_MATH_CM4 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4bf + 0x4 + ARM-ADS + + + ARMCM4_FP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4bf\ + arm_cortexM4bf_math + 0 + 1 + 0 + 1 + 1 + .\intermediateFiles\M4bf\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM4 + ARM_MATH_CM4 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7l + 0x4 + ARM-ADS + + + ARMCM7 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7$Device\ARM\ARMCM7\Include\ARMCM7.h + + + + + + + + + + $$Device:ARMCM7$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7l\ + arm_cortexM7l_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7b + 0x4 + ARM-ADS + + + ARMCM7 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7$Device\ARM\ARMCM7\Include\ARMCM7.h + + + + + + + + + + $$Device:ARMCM7$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7b\ + arm_cortexM7b_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7lfsp + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7lfsp\ + arm_cortexM7lfsp_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7lfsp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --fpmode=ieee_full + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7bfsp + 0x4 + ARM-ADS + + + ARMCM7_SP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7bfsp\ + arm_cortexM7bfsp_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7bfsp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --fpmode=ieee_full + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7lfdp + 0x4 + ARM-ADS + + + ARMCM7_DP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_DP$Device\ARM\ARMCM7\Include\ARMCM7_DP.h + + + + + + + + + + $$Device:ARMCM7_DP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7lfdp\ + arm_cortexM7lfdp_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7lfdp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --fpmode=ieee_full + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7bfdp + 0x4 + ARM-ADS + + + ARMCM7_DP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_DP$Device\ARM\ARMCM7\Include\ARMCM7_DP.h + + + + + + + + + + $$Device:ARMCM7_DP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7bfdp\ + arm_cortexM7bfdp_math + 0 + 1 + 0 + 1 + 1 + .\IntermediateFiles\M7bfdp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "!L" "..\..\..\Lib\ARM\" + cmd.exe /C getSizeInfo "%K" "!L" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + 8 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --fpmode=ieee_full + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + + --cpreproc --cpreproc_opts=-D,ARM_MATH_CM7 + ARM_MATH_CM7 + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x00000000 + + + + + + + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 2 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math_Build.bat b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math_Build.bat new file mode 100644 index 0000000..9e7b5e1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/arm_cortexM_math_Build.bat @@ -0,0 +1,57 @@ +@echo off + +SET UVEXE=C:\Keil\UV4\UV4.EXE + +echo. +echo Building DSP Libraries ARM +echo. +echo Building DSP Library for Cortex-M0 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M0l" -o "DspLib_M0l_build.log" +echo Building DSP Library for Cortex-M0 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M0b" -o "DspLib_M0b_build.log" +echo Building DSP Library for Cortex-M3 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M3l" -o "DspLib_M3l_build.log" +echo Building DSP Library for Cortex-M3 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M3b" -o "DspLib_M3b_build.log" +echo Building DSP Library for Cortex-M4 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4l" -o "DspLib_M4l_build.log" +echo Building DSP Library for Cortex-M4 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4b" -o "DspLib_M4b_build.log" +echo Building DSP Library for Cortex-M4 with FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4lf" -o "DspLib_M4lf_build.log" +echo Building DSP Library for Cortex-M4 with FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4bf" -o "DspLib_M4bf_build.log" +echo Building DSP Library for Cortex-M7 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7l" -o "DspLib_M7l_build.log" +echo Building DSP Library for Cortex-M7 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7b" -o "DspLib_M7b_build.log" +echo Building DSP Library for Cortex-M7 with single precision FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7lfsp" -o "DspLib_M7lfsp_build.log" +echo Building DSP Library for Cortex-M7 with single precision FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7bfsp" -o "DspLib_M7bfsp_build.log" +echo Building DSP Library for Cortex-M7 with double precision FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7lfdp" -o "DspLib_M7lfdp_build.log" +echo Building DSP Library for Cortex-M7 with double precision FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7bfdp" -o "DspLib_M7bfdp_build.log" + +echo. +ECHO Deleting intermediate files +rmdir /S /Q IntermediateFiles\M0l +rmdir /S /Q IntermediateFiles\M0b +rmdir /S /Q IntermediateFiles\M3l +rmdir /S /Q IntermediateFiles\M3b +rmdir /S /Q IntermediateFiles\M4l +rmdir /S /Q IntermediateFiles\M4b +rmdir /S /Q IntermediateFiles\M4lf +rmdir /S /Q IntermediateFiles\M4bf +rmdir /S /Q IntermediateFiles\M7l +rmdir /S /Q IntermediateFiles\M7b +rmdir /S /Q IntermediateFiles\M7lfsp +rmdir /S /Q IntermediateFiles\M7bfsp +rmdir /S /Q IntermediateFiles\M7lfdp +rmdir /S /Q IntermediateFiles\M7bfdp +del /Q IntermediateFiles\*.* +del /Q *.bak +del /Q *.dep +del /Q *.uvguix.* +del /Q ArInp.* \ No newline at end of file diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/getSizeInfo.bat b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/getSizeInfo.bat new file mode 100644 index 0000000..1eee60a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ARM/getSizeInfo.bat @@ -0,0 +1,17 @@ +@echo off + +if .%1==. goto help +if exist %1 goto getSizeInfo +goto help + +:getSizeInfo +%1\ARM\ARMCC\bin\armar --sizes %2 > %3 +goto end + +:help +echo Syntax: getSizeInfo inFile outFile +echo. +echo e.g.: getSizeInfo ..\..\..\Lib\ARM\arm_cortexM0l_math.lib arm_cortexM0l_math.txt + +:end + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c new file mode 100644 index 0000000..66b10df --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c @@ -0,0 +1,165 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c new file mode 100644 index 0000000..f0af091 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c @@ -0,0 +1,179 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c new file mode 100644 index 0000000..294ba75 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c @@ -0,0 +1,130 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c new file mode 100644 index 0000000..54c6f71 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c new file mode 100644 index 0000000..3430e83 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c @@ -0,0 +1,150 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c new file mode 100644 index 0000000..570aa4c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c new file mode 100644 index 0000000..63d83a8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c new file mode 100644 index 0000000..66e1e23 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c new file mode 100644 index 0000000..d7f7bdc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c @@ -0,0 +1,135 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c new file mode 100644 index 0000000..6f04ed1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c new file mode 100644 index 0000000..b199f8b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c new file mode 100644 index 0000000..0ad6ae4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c new file mode 100644 index 0000000..27eca68 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c @@ -0,0 +1,174 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c new file mode 100644 index 0000000..99e36bb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c @@ -0,0 +1,154 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c new file mode 100644 index 0000000..ca8b07b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c @@ -0,0 +1,160 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c new file mode 100644 index 0000000..c2b50b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c @@ -0,0 +1,127 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c new file mode 100644 index 0000000..4a260b0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c new file mode 100644 index 0000000..b130e7b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c @@ -0,0 +1,142 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c new file mode 100644 index 0000000..470e151 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c new file mode 100644 index 0000000..e1ba06d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c @@ -0,0 +1,125 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c new file mode 100644 index 0000000..4f3f593 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c @@ -0,0 +1,165 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c new file mode 100644 index 0000000..8124753 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c new file mode 100644 index 0000000..49516ef --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c new file mode 100644 index 0000000..111b9b4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c @@ -0,0 +1,135 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c new file mode 100644 index 0000000..2c4febc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c @@ -0,0 +1,169 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c new file mode 100644 index 0000000..4587cce --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c @@ -0,0 +1,162 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c new file mode 100644 index 0000000..2dba5bd --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c @@ -0,0 +1,239 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c new file mode 100644 index 0000000..330c739 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c @@ -0,0 +1,149 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c new file mode 100644 index 0000000..b2d27e6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c @@ -0,0 +1,248 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c new file mode 100644 index 0000000..5990491 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c @@ -0,0 +1,203 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c new file mode 100644 index 0000000..f925054 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c @@ -0,0 +1,220 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c new file mode 100644 index 0000000..e7ff234 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c @@ -0,0 +1,150 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c new file mode 100644 index 0000000..420db7f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c new file mode 100644 index 0000000..40ee7e1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c new file mode 100644 index 0000000..2a2cb5e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c new file mode 100644 index 0000000..79fe976 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c @@ -0,0 +1,27251 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c new file mode 100644 index 0000000..f05c1c2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c new file mode 100644 index 0000000..c54ae41 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c @@ -0,0 +1,182 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c
new file mode 100644
index 0000000..c1ce26c
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c
@@ -0,0 +1,161 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c
new file mode 100644
index 0000000..f882f4c
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c
@@ -0,0 +1,180 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c
new file mode 100644
index 0000000..1a6acb8
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c
@@ -0,0 +1,203 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c
new file mode 100644
index 0000000..d794e2c
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c
@@ -0,0 +1,189 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c
new file mode 100644
index 0000000..6eeafc1
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c
@@ -0,0 +1,187 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c
new file mode 100644
index 0000000..497348b
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c
@@ -0,0 +1,165 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c
new file mode 100644
index 0000000..bfe2a5d
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c
@@ -0,0 +1,153 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c
new file mode 100644
index 0000000..1091673
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c
@@ -0,0 +1,185 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c
new file mode 100644
index 0000000..5bf3f80
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c
@@ -0,0 +1,215 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c
new file mode 100644
index 0000000..f5148ba
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c
@@ -0,0 +1,148 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c
new file mode 100644
index 0000000..2cc0b1f
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c
@@ -0,0 +1,161 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c
new file mode 100644
index 0000000..bfb7d51
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c
@@ -0,0 +1,207 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c
new file mode 100644
index 0000000..df6eac0
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c
@@ -0,0 +1,193 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c
new file mode 100644
index 0000000..ec6b947
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c
@@ -0,0 +1,326 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c
new file mode 100644
index 0000000..04e8eca
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c
@@ -0,0 +1,225 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c
new file mode 100644
index 0000000..51b2f86
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c
@@ -0,0 +1,203 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c
new file mode 100644
index 0000000..73db107
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c
@@ -0,0 +1,223 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c
new file mode 100644
index 0000000..2bc1854
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c
@@ -0,0 +1,87 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c
new file mode 100644
index 0000000..c163901
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c
@@ -0,0 +1,122 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c
new file mode 100644
index 0000000..012e873
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c
@@ -0,0 +1,107 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c
new file mode 100644
index 0000000..081cf0c
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c
@@ -0,0 +1,65 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c
new file mode 100644
index 0000000..4dfe419
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c
@@ -0,0 +1,64 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c
new file mode 100644
index 0000000..540a54a
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c
@@ -0,0 +1,65 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c
new file mode 100644
index 0000000..37d63a8
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c
@@ -0,0 +1,149 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c
new file mode 100644
index 0000000..5e11b0f
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c
@@ -0,0 +1,122 @@
+/* ----------------------------------------------------------------------    
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c
new file mode 100644
index 0000000..890f37a
--- /dev/null
+++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c
@@ -0,0 +1,127 @@
+/* ----------------------------------------------------------------------
+* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c new file mode 100644 index 0000000..cb69268 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c new file mode 100644 index 0000000..72c51e6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c new file mode 100644 index 0000000..8655cf9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c @@ -0,0 +1,133 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c new file mode 100644 index 0000000..e2209b3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c @@ -0,0 +1,88 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c new file mode 100644 index 0000000..606ab66 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c @@ -0,0 +1,87 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c new file mode 100644 index 0000000..3085dec --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c @@ -0,0 +1,155 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c new file mode 100644 index 0000000..a9a0bf4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c @@ -0,0 +1,153 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c new file mode 100644 index 0000000..9f4ab2f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c new file mode 100644 index 0000000..a44d10d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c @@ -0,0 +1,561 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c new file mode 100644 index 0000000..83e9f76 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c @@ -0,0 +1,425 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c new file mode 100644 index 0000000..a637b03 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c @@ -0,0 +1,286 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c new file mode 100644 index 0000000..b135b2e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c @@ -0,0 +1,305 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c new file mode 100644 index 0000000..fab57d6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c @@ -0,0 +1,109 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c new file mode 100644 index 0000000..0dbb6d1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c @@ -0,0 +1,111 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c new file mode 100644 index 0000000..96ae6f9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c @@ -0,0 +1,111 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c new file mode 100644 index 0000000..8cfc534 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c @@ -0,0 +1,411 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c new file mode 100644 index 0000000..35f2124 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c @@ -0,0 +1,405 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c new file mode 100644 index 0000000..fc15e3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c @@ -0,0 +1,603 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c new file mode 100644 index 0000000..265bd3a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c @@ -0,0 +1,603 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c new file mode 100644 index 0000000..d9011fe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c @@ -0,0 +1,102 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c new file mode 100644 index 0000000..c6065e9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c @@ -0,0 +1,102 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c new file mode 100644 index 0000000..4811973 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c @@ -0,0 +1,683 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c new file mode 100644 index 0000000..b19587a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c @@ -0,0 +1,102 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c new file mode 100644 index 0000000..1fdc6a1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c @@ -0,0 +1,647 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c new file mode 100644 index 0000000..70f1bfc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c @@ -0,0 +1,543 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c new file mode 100644 index 0000000..44f19bb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c @@ -0,0 +1,1410 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c new file mode 100644 index 0000000..4111a1e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c @@ -0,0 +1,577 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c new file mode 100644 index 0000000..dffa2de --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c @@ -0,0 +1,545 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c new file mode 100644 index 0000000..b77afbe --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c @@ -0,0 +1,435 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c new file mode 100644 index 0000000..226ffd5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c @@ -0,0 +1,669 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c new file mode 100644 index 0000000..194246f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c @@ -0,0 +1,768 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c new file mode 100644 index 0000000..794879e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c @@ -0,0 +1,1492 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c new file mode 100644 index 0000000..46ef94d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c @@ -0,0 +1,611 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c new file mode 100644 index 0000000..0734938 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c @@ -0,0 +1,765 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c new file mode 100644 index 0000000..e8fcce5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c @@ -0,0 +1,803 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c new file mode 100644 index 0000000..c297989 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c @@ -0,0 +1,786 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c new file mode 100644 index 0000000..98fc654 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c @@ -0,0 +1,607 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c new file mode 100644 index 0000000..65eacea --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c @@ -0,0 +1,741 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c new file mode 100644 index 0000000..a3c3774 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c @@ -0,0 +1,734 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c new file mode 100644 index 0000000..c108bed --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c @@ -0,0 +1,565 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c new file mode 100644 index 0000000..12a0055 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c @@ -0,0 +1,690 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c new file mode 100644 index 0000000..6a8127b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c @@ -0,0 +1,739 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c new file mode 100644 index 0000000..7aa289f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c @@ -0,0 +1,512 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c new file mode 100644 index 0000000..d15bb1d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c @@ -0,0 +1,1319 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c new file mode 100644 index 0000000..ed8efb7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c @@ -0,0 +1,612 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c new file mode 100644 index 0000000..ccb8652 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c @@ -0,0 +1,513 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c new file mode 100644 index 0000000..2f62f60 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c @@ -0,0 +1,464 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c new file mode 100644 index 0000000..3003f75 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c @@ -0,0 +1,719 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c new file mode 100644 index 0000000..eaab75f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c @@ -0,0 +1,665 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c new file mode 100644 index 0000000..6adef05 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c @@ -0,0 +1,790 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c new file mode 100644 index 0000000..1592973 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c @@ -0,0 +1,524 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c new file mode 100644 index 0000000..8ae0d2e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c @@ -0,0 +1,598 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c new file mode 100644 index 0000000..4f01269 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c @@ -0,0 +1,351 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c new file mode 100644 index 0000000..7896510 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c @@ -0,0 +1,117 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c new file mode 100644 index 0000000..a3fad6b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c @@ -0,0 +1,119 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c new file mode 100644 index 0000000..9d332f3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c @@ -0,0 +1,117 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c new file mode 100644 index 0000000..f3a6a4a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c @@ -0,0 +1,696 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c new file mode 100644 index 0000000..5696b23 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c @@ -0,0 +1,311 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c new file mode 100644 index 0000000..a827e68 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c @@ -0,0 +1,997 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c new file mode 100644 index 0000000..72b5063 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c @@ -0,0 +1,345 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c new file mode 100644 index 0000000..13073c4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c @@ -0,0 +1,305 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c new file mode 100644 index 0000000..34cf7ea --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c @@ -0,0 +1,96 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c new file mode 100644 index 0000000..7eaab23 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c @@ -0,0 +1,154 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c new file mode 100644 index 0000000..c2092e0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c new file mode 100644 index 0000000..ccbc7d7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c @@ -0,0 +1,94 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c new file mode 100644 index 0000000..5ad249e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c @@ -0,0 +1,581 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c new file mode 100644 index 0000000..085cb57 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c @@ -0,0 +1,121 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c new file mode 100644 index 0000000..9989522 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c @@ -0,0 +1,120 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c new file mode 100644 index 0000000..1887524 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c @@ -0,0 +1,121 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c new file mode 100644 index 0000000..34c085a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c @@ -0,0 +1,508 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c new file mode 100644 index 0000000..a4e91b0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c @@ -0,0 +1,504 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c new file mode 100644 index 0000000..4be468c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c @@ -0,0 +1,506 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c new file mode 100644 index 0000000..c6aa00d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c new file mode 100644 index 0000000..34f3333 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c new file mode 100644 index 0000000..786152f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c new file mode 100644 index 0000000..044a500 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c @@ -0,0 +1,536 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c new file mode 100644 index 0000000..4a64538 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c @@ -0,0 +1,353 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c new file mode 100644 index 0000000..b0d3d09 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c @@ -0,0 +1,691 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c new file mode 100644 index 0000000..3536059 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c @@ -0,0 +1,365 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c new file mode 100644 index 0000000..24a50dc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c @@ -0,0 +1,397 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c new file mode 100644 index 0000000..9ef8edf --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c @@ -0,0 +1,444 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c new file mode 100644 index 0000000..a0fa81c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c @@ -0,0 +1,107 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c new file mode 100644 index 0000000..41bbd7e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c @@ -0,0 +1,107 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c new file mode 100644 index 0000000..8250550 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c new file mode 100644 index 0000000..6c495a4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c @@ -0,0 +1,107 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c new file mode 100644 index 0000000..2366685 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c @@ -0,0 +1,481 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c new file mode 100644 index 0000000..2183cd3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c @@ -0,0 +1,461 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c new file mode 100644 index 0000000..9f43580 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c @@ -0,0 +1,480 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c new file mode 100644 index 0000000..f3056f4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c @@ -0,0 +1,447 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c new file mode 100644 index 0000000..89bfb68 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c new file mode 100644 index 0000000..bc5c0af --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c new file mode 100644 index 0000000..d8e26a3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c new file mode 100644 index 0000000..5bee62d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c @@ -0,0 +1,464 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c new file mode 100644 index 0000000..347c857 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c @@ -0,0 +1,350 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c new file mode 100644 index 0000000..269330c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c @@ -0,0 +1,442 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c new file mode 100644 index 0000000..a347ddb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c @@ -0,0 +1,95 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c new file mode 100644 index 0000000..cac7dfc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c @@ -0,0 +1,105 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c new file mode 100644 index 0000000..d425557 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c @@ -0,0 +1,105 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c new file mode 100644 index 0000000..6e3117f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c new file mode 100644 index 0000000..2c23315 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c @@ -0,0 +1,105 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c new file mode 100644 index 0000000..be3e31f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c @@ -0,0 +1,112 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c new file mode 100644 index 0000000..9ada3a0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c @@ -0,0 +1,111 @@ +/*----------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c new file mode 100644 index 0000000..208a9d8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c @@ -0,0 +1,440 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c new file mode 100644 index 0000000..3d990e3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c @@ -0,0 +1,431 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c new file mode 100644 index 0000000..c0d465a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c @@ -0,0 +1,380 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c new file mode 100644 index 0000000..53c57f0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c @@ -0,0 +1,369 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvoptx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvoptx new file mode 100644 index 0000000..5e437d4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvoptx @@ -0,0 +1,5258 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + M0l + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M0l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M0b + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M0b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M3l + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M3l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M3b + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M3b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4l + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M4l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4b + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M4b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4lf + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M4lf\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M4bf + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M4bf\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7l + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7l\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7b + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7b\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7lfsp + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7lfsp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7bfsp + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7bfsp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7lfdp + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7lfdp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + M7bfdp + 0x3 + ARM-GNU + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\IntermediateFiles\M7bfdp\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 7 + + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + + + + + 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 + + + + + BasicMathFunctions + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_f32.c + arm_abs_f32.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q7.c + arm_abs_q7.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q15.c + arm_abs_q15.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_abs_q31.c + arm_abs_q31.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_f32.c + arm_add_f32.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q7.c + arm_add_q7.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q15.c + arm_add_q15.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_add_q31.c + arm_add_q31.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_f32.c + arm_dot_prod_f32.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q7.c + arm_dot_prod_q7.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q15.c + arm_dot_prod_q15.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_dot_prod_q31.c + arm_dot_prod_q31.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_f32.c + arm_mult_f32.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q7.c + arm_mult_q7.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q15.c + arm_mult_q15.c + 0 + 0 + + + 1 + 16 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_mult_q31.c + arm_mult_q31.c + 0 + 0 + + + 1 + 17 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_f32.c + arm_negate_f32.c + 0 + 0 + + + 1 + 18 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q7.c + arm_negate_q7.c + 0 + 0 + + + 1 + 19 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q15.c + arm_negate_q15.c + 0 + 0 + + + 1 + 20 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_negate_q31.c + arm_negate_q31.c + 0 + 0 + + + 1 + 21 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_f32.c + arm_offset_f32.c + 0 + 0 + + + 1 + 22 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q7.c + arm_offset_q7.c + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q15.c + arm_offset_q15.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_offset_q31.c + arm_offset_q31.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_f32.c + arm_scale_f32.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q7.c + arm_scale_q7.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q15.c + arm_scale_q15.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_scale_q31.c + arm_scale_q31.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q7.c + arm_shift_q7.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q15.c + arm_shift_q15.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_shift_q31.c + arm_shift_q31.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_f32.c + arm_sub_f32.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q7.c + arm_sub_q7.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q15.c + arm_sub_q15.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + ..\BasicMathFunctions\arm_sub_q31.c + arm_sub_q31.c + 0 + 0 + + + + + FastMathFunctions + 0 + 0 + 0 + 0 + + 2 + 36 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_f32.c + arm_cos_f32.c + 0 + 0 + + + 2 + 37 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_q15.c + arm_cos_q15.c + 0 + 0 + + + 2 + 38 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_cos_q31.c + arm_cos_q31.c + 0 + 0 + + + 2 + 39 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_f32.c + arm_sin_f32.c + 0 + 0 + + + 2 + 40 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_q15.c + arm_sin_q15.c + 0 + 0 + + + 2 + 41 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sin_q31.c + arm_sin_q31.c + 0 + 0 + + + 2 + 42 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sqrt_q15.c + arm_sqrt_q15.c + 0 + 0 + + + 2 + 43 + 1 + 0 + 0 + 0 + ..\FastMathFunctions\arm_sqrt_q31.c + arm_sqrt_q31.c + 0 + 0 + + + + + ComplexMathFunctions + 0 + 0 + 0 + 0 + + 3 + 44 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + arm_cmplx_conj_f32.c + 0 + 0 + + + 3 + 45 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + arm_cmplx_conj_q15.c + 0 + 0 + + + 3 + 46 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + arm_cmplx_conj_q31.c + 0 + 0 + + + 3 + 47 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + arm_cmplx_dot_prod_f32.c + 0 + 0 + + + 3 + 48 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + arm_cmplx_dot_prod_q15.c + 0 + 0 + + + 3 + 49 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + arm_cmplx_dot_prod_q31.c + 0 + 0 + + + 3 + 50 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + arm_cmplx_mag_f32.c + 0 + 0 + + + 3 + 51 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + arm_cmplx_mag_q15.c + 0 + 0 + + + 3 + 52 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + arm_cmplx_mag_q31.c + 0 + 0 + + + 3 + 53 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + arm_cmplx_mag_squared_f32.c + 0 + 0 + + + 3 + 54 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + arm_cmplx_mag_squared_q15.c + 0 + 0 + + + 3 + 55 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + arm_cmplx_mag_squared_q31.c + 0 + 0 + + + 3 + 56 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + arm_cmplx_mult_cmplx_f32.c + 0 + 0 + + + 3 + 57 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + arm_cmplx_mult_cmplx_q15.c + 0 + 0 + + + 3 + 58 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + arm_cmplx_mult_cmplx_q31.c + 0 + 0 + + + 3 + 59 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + arm_cmplx_mult_real_f32.c + 0 + 0 + + + 3 + 60 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + arm_cmplx_mult_real_q15.c + 0 + 0 + + + 3 + 61 + 1 + 0 + 0 + 0 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + arm_cmplx_mult_real_q31.c + 0 + 0 + + + + + FilteringFunctions + 0 + 0 + 0 + 0 + + 4 + 62 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + arm_biquad_cascade_df1_32x64_init_q31.c + 0 + 0 + + + 4 + 63 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + arm_biquad_cascade_df1_32x64_q31.c + 0 + 0 + + + 4 + 64 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + arm_biquad_cascade_df1_f32.c + 0 + 0 + + + 4 + 65 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + arm_biquad_cascade_df1_fast_q15.c + 0 + 0 + + + 4 + 66 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + arm_biquad_cascade_df1_fast_q31.c + 0 + 0 + + + 4 + 67 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + arm_biquad_cascade_df1_init_f32.c + 0 + 0 + + + 4 + 68 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + arm_biquad_cascade_df1_init_q15.c + 0 + 0 + + + 4 + 69 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + arm_biquad_cascade_df1_init_q31.c + 0 + 0 + + + 4 + 70 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + arm_biquad_cascade_df1_q15.c + 0 + 0 + + + 4 + 71 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + arm_biquad_cascade_df1_q31.c + 0 + 0 + + + 4 + 72 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + arm_biquad_cascade_df2T_init_f32.c + 0 + 0 + + + 4 + 73 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_f32.c + arm_conv_f32.c + 0 + 0 + + + 4 + 74 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_q15.c + arm_conv_fast_q15.c + 0 + 0 + + + 4 + 75 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_q31.c + arm_conv_fast_q31.c + 0 + 0 + + + 4 + 76 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_f32.c + arm_conv_partial_f32.c + 0 + 0 + + + 4 + 77 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + arm_conv_partial_fast_q15.c + 0 + 0 + + + 4 + 78 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + arm_conv_partial_fast_q31.c + 0 + 0 + + + 4 + 79 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q7.c + arm_conv_partial_q7.c + 0 + 0 + + + 4 + 80 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q15.c + arm_conv_partial_q15.c + 0 + 0 + + + 4 + 81 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_q31.c + arm_conv_partial_q31.c + 0 + 0 + + + 4 + 82 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q7.c + arm_conv_q7.c + 0 + 0 + + + 4 + 83 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q15.c + arm_conv_q15.c + 0 + 0 + + + 4 + 84 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_q31.c + arm_conv_q31.c + 0 + 0 + + + 4 + 85 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_f32.c + arm_correlate_f32.c + 0 + 0 + + + 4 + 86 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_q15.c + arm_correlate_fast_q15.c + 0 + 0 + + + 4 + 87 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_q31.c + arm_correlate_fast_q31.c + 0 + 0 + + + 4 + 88 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q7.c + arm_correlate_q7.c + 0 + 0 + + + 4 + 89 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q15.c + arm_correlate_q15.c + 0 + 0 + + + 4 + 90 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_q31.c + arm_correlate_q31.c + 0 + 0 + + + 4 + 91 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_f32.c + arm_fir_decimate_f32.c + 0 + 0 + + + 4 + 92 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + arm_fir_decimate_fast_q15.c + 0 + 0 + + + 4 + 93 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + arm_fir_decimate_fast_q31.c + 0 + 0 + + + 4 + 94 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + arm_fir_decimate_init_f32.c + 0 + 0 + + + 4 + 95 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + arm_fir_decimate_init_q15.c + 0 + 0 + + + 4 + 96 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + arm_fir_decimate_init_q31.c + 0 + 0 + + + 4 + 97 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_q15.c + arm_fir_decimate_q15.c + 0 + 0 + + + 4 + 98 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_decimate_q31.c + arm_fir_decimate_q31.c + 0 + 0 + + + 4 + 99 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_f32.c + arm_fir_f32.c + 0 + 0 + + + 4 + 100 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_fast_q15.c + arm_fir_fast_q15.c + 0 + 0 + + + 4 + 101 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_fast_q31.c + arm_fir_fast_q31.c + 0 + 0 + + + 4 + 102 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_f32.c + arm_fir_init_f32.c + 0 + 0 + + + 4 + 103 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q7.c + arm_fir_init_q7.c + 0 + 0 + + + 4 + 104 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q15.c + arm_fir_init_q15.c + 0 + 0 + + + 4 + 105 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_init_q31.c + arm_fir_init_q31.c + 0 + 0 + + + 4 + 106 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + arm_fir_interpolate_f32.c + 0 + 0 + + + 4 + 107 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + arm_fir_interpolate_init_f32.c + 0 + 0 + + + 4 + 108 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + arm_fir_interpolate_init_q15.c + 0 + 0 + + + 4 + 109 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + arm_fir_interpolate_init_q31.c + 0 + 0 + + + 4 + 110 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + arm_fir_interpolate_q15.c + 0 + 0 + + + 4 + 111 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + arm_fir_interpolate_q31.c + 0 + 0 + + + 4 + 112 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_f32.c + arm_fir_lattice_f32.c + 0 + 0 + + + 4 + 113 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + arm_fir_lattice_init_f32.c + 0 + 0 + + + 4 + 114 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + arm_fir_lattice_init_q15.c + 0 + 0 + + + 4 + 115 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + arm_fir_lattice_init_q31.c + 0 + 0 + + + 4 + 116 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_q15.c + arm_fir_lattice_q15.c + 0 + 0 + + + 4 + 117 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_lattice_q31.c + arm_fir_lattice_q31.c + 0 + 0 + + + 4 + 118 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q7.c + arm_fir_q7.c + 0 + 0 + + + 4 + 119 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q15.c + arm_fir_q15.c + 0 + 0 + + + 4 + 120 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_q31.c + arm_fir_q31.c + 0 + 0 + + + 4 + 121 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_f32.c + arm_fir_sparse_f32.c + 0 + 0 + + + 4 + 122 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + arm_fir_sparse_init_f32.c + 0 + 0 + + + 4 + 123 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + arm_fir_sparse_init_q7.c + 0 + 0 + + + 4 + 124 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + arm_fir_sparse_init_q15.c + 0 + 0 + + + 4 + 125 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + arm_fir_sparse_init_q31.c + 0 + 0 + + + 4 + 126 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q7.c + arm_fir_sparse_q7.c + 0 + 0 + + + 4 + 127 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q15.c + arm_fir_sparse_q15.c + 0 + 0 + + + 4 + 128 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_fir_sparse_q31.c + arm_fir_sparse_q31.c + 0 + 0 + + + 4 + 129 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_f32.c + arm_iir_lattice_f32.c + 0 + 0 + + + 4 + 130 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + arm_iir_lattice_init_f32.c + 0 + 0 + + + 4 + 131 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + arm_iir_lattice_init_q15.c + 0 + 0 + + + 4 + 132 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + arm_iir_lattice_init_q31.c + 0 + 0 + + + 4 + 133 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_q15.c + arm_iir_lattice_q15.c + 0 + 0 + + + 4 + 134 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_iir_lattice_q31.c + arm_iir_lattice_q31.c + 0 + 0 + + + 4 + 135 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_f32.c + arm_lms_f32.c + 0 + 0 + + + 4 + 136 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_f32.c + arm_lms_init_f32.c + 0 + 0 + + + 4 + 137 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_q15.c + arm_lms_init_q15.c + 0 + 0 + + + 4 + 138 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_init_q31.c + arm_lms_init_q31.c + 0 + 0 + + + 4 + 139 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_f32.c + arm_lms_norm_f32.c + 0 + 0 + + + 4 + 140 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + arm_lms_norm_init_f32.c + 0 + 0 + + + 4 + 141 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + arm_lms_norm_init_q15.c + 0 + 0 + + + 4 + 142 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + arm_lms_norm_init_q31.c + 0 + 0 + + + 4 + 143 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_q15.c + arm_lms_norm_q15.c + 0 + 0 + + + 4 + 144 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_norm_q31.c + arm_lms_norm_q31.c + 0 + 0 + + + 4 + 145 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_q15.c + arm_lms_q15.c + 0 + 0 + + + 4 + 146 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_lms_q31.c + arm_lms_q31.c + 0 + 0 + + + 4 + 147 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_opt_q15.c + arm_correlate_opt_q15.c + 0 + 0 + + + 4 + 148 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_opt_q7.c + arm_conv_opt_q7.c + 0 + 0 + + + 4 + 149 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_opt_q15.c + arm_conv_opt_q15.c + 0 + 0 + + + 4 + 150 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + arm_conv_partial_opt_q7.c + 0 + 0 + + + 4 + 151 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + arm_conv_partial_opt_q15.c + 0 + 0 + + + 4 + 152 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_opt_q7.c + arm_correlate_opt_q7.c + 0 + 0 + + + 4 + 153 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + arm_correlate_fast_opt_q15.c + 0 + 0 + + + 4 + 154 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + arm_conv_fast_opt_q15.c + 0 + 0 + + + 4 + 155 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + arm_conv_partial_fast_opt_q15.c + 0 + 0 + + + 4 + 156 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + arm_biquad_cascade_df2T_f32.c + 0 + 0 + + + 4 + 157 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + arm_biquad_cascade_df2T_f64.c + 0 + 0 + + + 4 + 158 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + arm_biquad_cascade_df2T_init_f64.c + 0 + 0 + + + 4 + 159 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + arm_biquad_cascade_stereo_df2T_f32.c + 0 + 0 + + + 4 + 160 + 1 + 0 + 0 + 0 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + arm_biquad_cascade_stereo_df2T_init_f32.c + 0 + 0 + + + + + MatrixFunctions + 0 + 0 + 0 + 0 + + 5 + 161 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_f32.c + arm_mat_add_f32.c + 0 + 0 + + + 5 + 162 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_q15.c + arm_mat_add_q15.c + 0 + 0 + + + 5 + 163 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_add_q31.c + arm_mat_add_q31.c + 0 + 0 + + + 5 + 164 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_f32.c + arm_mat_init_f32.c + 0 + 0 + + + 5 + 165 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_q15.c + arm_mat_init_q15.c + 0 + 0 + + + 5 + 166 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_init_q31.c + arm_mat_init_q31.c + 0 + 0 + + + 5 + 167 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_inverse_f32.c + arm_mat_inverse_f32.c + 0 + 0 + + + 5 + 168 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_f32.c + arm_mat_mult_f32.c + 0 + 0 + + + 5 + 169 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + arm_mat_mult_fast_q15.c + 0 + 0 + + + 5 + 170 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + arm_mat_mult_fast_q31.c + 0 + 0 + + + 5 + 171 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_q15.c + arm_mat_mult_q15.c + 0 + 0 + + + 5 + 172 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_mult_q31.c + arm_mat_mult_q31.c + 0 + 0 + + + 5 + 173 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_f32.c + arm_mat_scale_f32.c + 0 + 0 + + + 5 + 174 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_q15.c + arm_mat_scale_q15.c + 0 + 0 + + + 5 + 175 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_scale_q31.c + arm_mat_scale_q31.c + 0 + 0 + + + 5 + 176 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_f32.c + arm_mat_sub_f32.c + 0 + 0 + + + 5 + 177 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_q15.c + arm_mat_sub_q15.c + 0 + 0 + + + 5 + 178 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_sub_q31.c + arm_mat_sub_q31.c + 0 + 0 + + + 5 + 179 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_f32.c + arm_mat_trans_f32.c + 0 + 0 + + + 5 + 180 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_q15.c + arm_mat_trans_q15.c + 0 + 0 + + + 5 + 181 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_trans_q31.c + arm_mat_trans_q31.c + 0 + 0 + + + 5 + 182 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + arm_mat_cmplx_mult_f32.c + 0 + 0 + + + 5 + 183 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + arm_mat_cmplx_mult_q15.c + 0 + 0 + + + 5 + 184 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + arm_mat_cmplx_mult_q31.c + 0 + 0 + + + 5 + 185 + 1 + 0 + 0 + 0 + ..\MatrixFunctions\arm_mat_inverse_f64.c + arm_mat_inverse_f64.c + 0 + 0 + + + + + TransformFunctions + 0 + 0 + 0 + 0 + + 6 + 186 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_f32.c + arm_cfft_radix4_f32.c + 0 + 0 + + + 6 + 187 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + arm_cfft_radix4_init_f32.c + 0 + 0 + + + 6 + 188 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + arm_cfft_radix4_init_q15.c + 0 + 0 + + + 6 + 189 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + arm_cfft_radix4_init_q31.c + 0 + 0 + + + 6 + 190 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_q15.c + arm_cfft_radix4_q15.c + 0 + 0 + + + 6 + 191 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix4_q31.c + arm_cfft_radix4_q31.c + 0 + 0 + + + 6 + 192 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_f32.c + arm_dct4_f32.c + 0 + 0 + + + 6 + 193 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_f32.c + arm_dct4_init_f32.c + 0 + 0 + + + 6 + 194 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_q15.c + arm_dct4_init_q15.c + 0 + 0 + + + 6 + 195 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_init_q31.c + arm_dct4_init_q31.c + 0 + 0 + + + 6 + 196 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_q15.c + arm_dct4_q15.c + 0 + 0 + + + 6 + 197 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_dct4_q31.c + arm_dct4_q31.c + 0 + 0 + + + 6 + 198 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_f32.c + arm_rfft_f32.c + 0 + 0 + + + 6 + 199 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_f32.c + arm_rfft_init_f32.c + 0 + 0 + + + 6 + 200 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_q15.c + arm_rfft_init_q15.c + 0 + 0 + + + 6 + 201 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_init_q31.c + arm_rfft_init_q31.c + 0 + 0 + + + 6 + 202 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_q15.c + arm_rfft_q15.c + 0 + 0 + + + 6 + 203 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_q31.c + arm_rfft_q31.c + 0 + 0 + + + 6 + 204 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_bitreversal.c + arm_bitreversal.c + 0 + 0 + + + 6 + 205 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_f32.c + arm_cfft_radix2_f32.c + 0 + 0 + + + 6 + 206 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + arm_cfft_radix2_init_f32.c + 0 + 0 + + + 6 + 207 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + arm_cfft_radix2_init_q15.c + 0 + 0 + + + 6 + 208 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + arm_cfft_radix2_init_q31.c + 0 + 0 + + + 6 + 209 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_q15.c + arm_cfft_radix2_q15.c + 0 + 0 + + + 6 + 210 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix2_q31.c + arm_cfft_radix2_q31.c + 0 + 0 + + + 6 + 211 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_f32.c + arm_cfft_f32.c + 0 + 0 + + + 6 + 212 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_radix8_f32.c + arm_cfft_radix8_f32.c + 0 + 0 + + + 6 + 213 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_bitreversal2.S + arm_bitreversal2.S + 0 + 0 + + + 6 + 214 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_fast_f32.c + arm_rfft_fast_f32.c + 0 + 0 + + + 6 + 215 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + arm_rfft_fast_init_f32.c + 0 + 0 + + + 6 + 216 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_q31.c + arm_cfft_q31.c + 0 + 0 + + + 6 + 217 + 1 + 0 + 0 + 0 + ..\TransformFunctions\arm_cfft_q15.c + arm_cfft_q15.c + 0 + 0 + + + + + ControllerFunctions + 0 + 0 + 0 + 0 + + 7 + 218 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_f32.c + arm_pid_init_f32.c + 0 + 0 + + + 7 + 219 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_q15.c + arm_pid_init_q15.c + 0 + 0 + + + 7 + 220 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_init_q31.c + arm_pid_init_q31.c + 0 + 0 + + + 7 + 221 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_f32.c + arm_pid_reset_f32.c + 0 + 0 + + + 7 + 222 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_q15.c + arm_pid_reset_q15.c + 0 + 0 + + + 7 + 223 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_pid_reset_q31.c + arm_pid_reset_q31.c + 0 + 0 + + + 7 + 224 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_sin_cos_f32.c + arm_sin_cos_f32.c + 0 + 0 + + + 7 + 225 + 1 + 0 + 0 + 0 + ..\ControllerFunctions\arm_sin_cos_q31.c + arm_sin_cos_q31.c + 0 + 0 + + + + + StatisticsFunctions + 0 + 0 + 0 + 0 + + 8 + 226 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_f32.c + arm_max_f32.c + 0 + 0 + + + 8 + 227 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q7.c + arm_max_q7.c + 0 + 0 + + + 8 + 228 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q15.c + arm_max_q15.c + 0 + 0 + + + 8 + 229 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_max_q31.c + arm_max_q31.c + 0 + 0 + + + 8 + 230 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_f32.c + arm_mean_f32.c + 0 + 0 + + + 8 + 231 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q7.c + arm_mean_q7.c + 0 + 0 + + + 8 + 232 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q15.c + arm_mean_q15.c + 0 + 0 + + + 8 + 233 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_mean_q31.c + arm_mean_q31.c + 0 + 0 + + + 8 + 234 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_f32.c + arm_min_f32.c + 0 + 0 + + + 8 + 235 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q7.c + arm_min_q7.c + 0 + 0 + + + 8 + 236 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q15.c + arm_min_q15.c + 0 + 0 + + + 8 + 237 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_min_q31.c + arm_min_q31.c + 0 + 0 + + + 8 + 238 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_f32.c + arm_power_f32.c + 0 + 0 + + + 8 + 239 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q7.c + arm_power_q7.c + 0 + 0 + + + 8 + 240 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q15.c + arm_power_q15.c + 0 + 0 + + + 8 + 241 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_power_q31.c + arm_power_q31.c + 0 + 0 + + + 8 + 242 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_f32.c + arm_rms_f32.c + 0 + 0 + + + 8 + 243 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_q15.c + arm_rms_q15.c + 0 + 0 + + + 8 + 244 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_rms_q31.c + arm_rms_q31.c + 0 + 0 + + + 8 + 245 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_f32.c + arm_std_f32.c + 0 + 0 + + + 8 + 246 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_q15.c + arm_std_q15.c + 0 + 0 + + + 8 + 247 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_std_q31.c + arm_std_q31.c + 0 + 0 + + + 8 + 248 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_f32.c + arm_var_f32.c + 0 + 0 + + + 8 + 249 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_q15.c + arm_var_q15.c + 0 + 0 + + + 8 + 250 + 1 + 0 + 0 + 0 + ..\StatisticsFunctions\arm_var_q31.c + arm_var_q31.c + 0 + 0 + + + + + SupportFunctions + 0 + 0 + 0 + 0 + + 9 + 251 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_f32.c + arm_copy_f32.c + 0 + 0 + + + 9 + 252 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q7.c + arm_copy_q7.c + 0 + 0 + + + 9 + 253 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q15.c + arm_copy_q15.c + 0 + 0 + + + 9 + 254 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_copy_q31.c + arm_copy_q31.c + 0 + 0 + + + 9 + 255 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_f32.c + arm_fill_f32.c + 0 + 0 + + + 9 + 256 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q7.c + arm_fill_q7.c + 0 + 0 + + + 9 + 257 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q15.c + arm_fill_q15.c + 0 + 0 + + + 9 + 258 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_fill_q31.c + arm_fill_q31.c + 0 + 0 + + + 9 + 259 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q7.c + arm_float_to_q7.c + 0 + 0 + + + 9 + 260 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q15.c + arm_float_to_q15.c + 0 + 0 + + + 9 + 261 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_float_to_q31.c + arm_float_to_q31.c + 0 + 0 + + + 9 + 262 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_float.c + arm_q7_to_float.c + 0 + 0 + + + 9 + 263 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_q15.c + arm_q7_to_q15.c + 0 + 0 + + + 9 + 264 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q7_to_q31.c + arm_q7_to_q31.c + 0 + 0 + + + 9 + 265 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_float.c + arm_q15_to_float.c + 0 + 0 + + + 9 + 266 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_q7.c + arm_q15_to_q7.c + 0 + 0 + + + 9 + 267 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q15_to_q31.c + arm_q15_to_q31.c + 0 + 0 + + + 9 + 268 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_float.c + arm_q31_to_float.c + 0 + 0 + + + 9 + 269 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_q7.c + arm_q31_to_q7.c + 0 + 0 + + + 9 + 270 + 1 + 0 + 0 + 0 + ..\SupportFunctions\arm_q31_to_q15.c + arm_q31_to_q15.c + 0 + 0 + + + + + CommonTables + 0 + 0 + 0 + 0 + + 10 + 271 + 1 + 0 + 0 + 0 + ..\CommonTables\arm_common_tables.c + arm_common_tables.c + 0 + 0 + + + 10 + 272 + 1 + 0 + 0 + 0 + ..\CommonTables\arm_const_structs.c + arm_const_structs.c + 0 + 0 + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvprojx b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvprojx new file mode 100644 index 0000000..9e356cf --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math.uvprojx @@ -0,0 +1,24049 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + M0l + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M0l\ + arm_cortexM0l_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M0l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M0" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M0b + 0x3 + ARM-GNU + + + ARMCM0 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM0$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h + + + + + + + + + + $$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M0b\ + arm_cortexM0b_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M0b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M0" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM0, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M3l + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M3l\ + arm_cortexM3l_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M3l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M3" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M3b + 0x3 + ARM-GNU + + + ARMCM3 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x40000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM3$Device\ARM\ARMCM3\Include\ARMCM3.h + + + + + + + + + + $$Device:ARMCM3$Device\ARM\SVD\ARMCM3.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M3b\ + arm_cortexM3b_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M3b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM3 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M3" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM3, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4l + 0x3 + ARM-GNU + + + ARMCM4 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4$Device\ARM\ARMCM4\Include\ARMCM4.h + + + + + + + + + + $$Device:ARMCM4$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4l\ + arm_cortexM4l_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M4l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4b + 0x3 + ARM-GNU + + + ARMCM4 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4$Device\ARM\ARMCM4\Include\ARMCM4.h + + + + + + + + + + $$Device:ARMCM4$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4b\ + arm_cortexM4b_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M4b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4lf + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4lf\ + arm_cortexM4lf_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M4lf\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M4bf + 0x3 + ARM-GNU + + + ARMCM4_FP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + $$Device:ARMCM4_FP$Device\ARM\SVD\ARMCM4.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M4bf\ + arm_cortexM4bf_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M4bf\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M4" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM4, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7l + 0x3 + ARM-GNU + + + ARMCM7 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7$Device\ARM\ARMCM7\Include\ARMCM7.h + + + + + + + + + + $$Device:ARMCM7$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7l\ + arm_cortexM7l_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7l\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7b + 0x3 + ARM-GNU + + + ARMCM7 + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7$Device\ARM\ARMCM7\Include\ARMCM7.h + + + + + + + + + + $$Device:ARMCM7$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7b\ + arm_cortexM7b_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7b\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7lfsp + 0x3 + ARM-GNU + + + ARMCM7_SP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7lfsp\ + arm_cortexM7lfsp_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7lfsp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv5-sp-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7bfsp + 0x3 + ARM-GNU + + + ARMCM7_SP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_SP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_SP$Device\ARM\ARMCM7\Include\ARMCM7_SP.h + + + + + + + + + + $$Device:ARMCM7_SP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7bfsp\ + arm_cortexM7bfsp_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7bfsp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv5-sp-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7lfdp + 0x3 + ARM-GNU + + + ARMCM7_DP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_DP$Device\ARM\ARMCM7\Include\ARMCM7_DP.h + + + + + + + + + + $$Device:ARMCM7_DP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7lfdp\ + arm_cortexM7lfdp_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7lfdp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv5-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1 + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv5-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + M7bfdp + 0x3 + ARM-GNU + + + ARMCM7_DP + ARM + ARM.CMSIS.4.4.0 + http://www.keil.com/pack/ + IROM(0x00000000,0x80000) IRAM(0x20000000,0x20000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL080000 -FP0($$Device:ARMCM7_DP$Device\ARM\Flash\NEW_DEVICE.FLM)) + 0 + $$Device:ARMCM7_DP$Device\ARM\ARMCM7\Include\ARMCM7_DP.h + + + + + + + + + + $$Device:ARMCM7_DP$Device\ARM\SVD\ARMCM7.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\IntermediateFiles\M7bfdp\ + arm_cortexM7bfdp_math + 0 + 1 + 0 + 1 + 0 + .\IntermediateFiles\M7bfdp\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + cmd.exe /C copy "$L\lib@L.a" "..\..\..\Lib\GCC\" + cmd.exe /C getSizeInfo "$L\lib@L.a" "@L_SizeInfo.txt" + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 0 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + "Cortex-M7" + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 5 + 2 + 1 + + -fno-strict-aliasing -ffunction-sections -fdata-sections -mfpu=fpv5-d16 -mfloat-abi=hard -ffp-contract=off + ARM_MATH_CM7, ARM_MATH_MATRIX_CHECK, ARM_MATH_ROUNDING, UNALIGNED_SUPPORT_DISABLE, __FPU_PRESENT = 1, ARM_MATH_BIG_ENDIAN + + ..\..\..\Include + + + + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + + + + + + -Wl,--gc-sections -mfpu=fpv5-d16 -mfloat-abi=hard + + + + + + + BasicMathFunctions + + + arm_abs_f32.c + 1 + ..\BasicMathFunctions\arm_abs_f32.c + + + arm_abs_q7.c + 1 + ..\BasicMathFunctions\arm_abs_q7.c + + + arm_abs_q15.c + 1 + ..\BasicMathFunctions\arm_abs_q15.c + + + arm_abs_q31.c + 1 + ..\BasicMathFunctions\arm_abs_q31.c + + + arm_add_f32.c + 1 + ..\BasicMathFunctions\arm_add_f32.c + + + arm_add_q7.c + 1 + ..\BasicMathFunctions\arm_add_q7.c + + + arm_add_q15.c + 1 + ..\BasicMathFunctions\arm_add_q15.c + + + arm_add_q31.c + 1 + ..\BasicMathFunctions\arm_add_q31.c + + + arm_dot_prod_f32.c + 1 + ..\BasicMathFunctions\arm_dot_prod_f32.c + + + arm_dot_prod_q7.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q7.c + + + arm_dot_prod_q15.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q15.c + + + arm_dot_prod_q31.c + 1 + ..\BasicMathFunctions\arm_dot_prod_q31.c + + + arm_mult_f32.c + 1 + ..\BasicMathFunctions\arm_mult_f32.c + + + arm_mult_q7.c + 1 + ..\BasicMathFunctions\arm_mult_q7.c + + + arm_mult_q15.c + 1 + ..\BasicMathFunctions\arm_mult_q15.c + + + arm_mult_q31.c + 1 + ..\BasicMathFunctions\arm_mult_q31.c + + + arm_negate_f32.c + 1 + ..\BasicMathFunctions\arm_negate_f32.c + + + arm_negate_q7.c + 1 + ..\BasicMathFunctions\arm_negate_q7.c + + + arm_negate_q15.c + 1 + ..\BasicMathFunctions\arm_negate_q15.c + + + arm_negate_q31.c + 1 + ..\BasicMathFunctions\arm_negate_q31.c + + + arm_offset_f32.c + 1 + ..\BasicMathFunctions\arm_offset_f32.c + + + arm_offset_q7.c + 1 + ..\BasicMathFunctions\arm_offset_q7.c + + + arm_offset_q15.c + 1 + ..\BasicMathFunctions\arm_offset_q15.c + + + arm_offset_q31.c + 1 + ..\BasicMathFunctions\arm_offset_q31.c + + + arm_scale_f32.c + 1 + ..\BasicMathFunctions\arm_scale_f32.c + + + arm_scale_q7.c + 1 + ..\BasicMathFunctions\arm_scale_q7.c + + + arm_scale_q15.c + 1 + ..\BasicMathFunctions\arm_scale_q15.c + + + arm_scale_q31.c + 1 + ..\BasicMathFunctions\arm_scale_q31.c + + + arm_shift_q7.c + 1 + ..\BasicMathFunctions\arm_shift_q7.c + + + arm_shift_q15.c + 1 + ..\BasicMathFunctions\arm_shift_q15.c + + + arm_shift_q31.c + 1 + ..\BasicMathFunctions\arm_shift_q31.c + + + arm_sub_f32.c + 1 + ..\BasicMathFunctions\arm_sub_f32.c + + + arm_sub_q7.c + 1 + ..\BasicMathFunctions\arm_sub_q7.c + + + arm_sub_q15.c + 1 + ..\BasicMathFunctions\arm_sub_q15.c + + + arm_sub_q31.c + 1 + ..\BasicMathFunctions\arm_sub_q31.c + + + + + FastMathFunctions + + + arm_cos_f32.c + 1 + ..\FastMathFunctions\arm_cos_f32.c + + + arm_cos_q15.c + 1 + ..\FastMathFunctions\arm_cos_q15.c + + + arm_cos_q31.c + 1 + ..\FastMathFunctions\arm_cos_q31.c + + + arm_sin_f32.c + 1 + ..\FastMathFunctions\arm_sin_f32.c + + + arm_sin_q15.c + 1 + ..\FastMathFunctions\arm_sin_q15.c + + + arm_sin_q31.c + 1 + ..\FastMathFunctions\arm_sin_q31.c + + + arm_sqrt_q15.c + 1 + ..\FastMathFunctions\arm_sqrt_q15.c + + + arm_sqrt_q31.c + 1 + ..\FastMathFunctions\arm_sqrt_q31.c + + + + + ComplexMathFunctions + + + arm_cmplx_conj_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_f32.c + + + arm_cmplx_conj_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q15.c + + + arm_cmplx_conj_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_conj_q31.c + + + arm_cmplx_dot_prod_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_f32.c + + + arm_cmplx_dot_prod_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q15.c + + + arm_cmplx_dot_prod_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_dot_prod_q31.c + + + arm_cmplx_mag_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_f32.c + + + arm_cmplx_mag_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q15.c + + + arm_cmplx_mag_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_q31.c + + + arm_cmplx_mag_squared_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_f32.c + + + arm_cmplx_mag_squared_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q15.c + + + arm_cmplx_mag_squared_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mag_squared_q31.c + + + arm_cmplx_mult_cmplx_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_f32.c + + + arm_cmplx_mult_cmplx_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q15.c + + + arm_cmplx_mult_cmplx_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_cmplx_q31.c + + + arm_cmplx_mult_real_f32.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_f32.c + + + arm_cmplx_mult_real_q15.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q15.c + + + arm_cmplx_mult_real_q31.c + 1 + ..\ComplexMathFunctions\arm_cmplx_mult_real_q31.c + + + + + FilteringFunctions + + + arm_biquad_cascade_df1_32x64_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_init_q31.c + + + arm_biquad_cascade_df1_32x64_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_32x64_q31.c + + + arm_biquad_cascade_df1_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_f32.c + + + arm_biquad_cascade_df1_fast_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q15.c + + + arm_biquad_cascade_df1_fast_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_fast_q31.c + + + arm_biquad_cascade_df1_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c + + + arm_biquad_cascade_df1_init_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q15.c + + + arm_biquad_cascade_df1_init_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_init_q31.c + + + arm_biquad_cascade_df1_q15.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q15.c + + + arm_biquad_cascade_df1_q31.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df1_q31.c + + + arm_biquad_cascade_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f32.c + + + arm_conv_f32.c + 1 + ..\FilteringFunctions\arm_conv_f32.c + + + arm_conv_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_q15.c + + + arm_conv_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_fast_q31.c + + + arm_conv_partial_f32.c + 1 + ..\FilteringFunctions\arm_conv_partial_f32.c + + + arm_conv_partial_fast_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q15.c + + + arm_conv_partial_fast_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_q31.c + + + arm_conv_partial_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_q7.c + + + arm_conv_partial_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_q15.c + + + arm_conv_partial_q31.c + 1 + ..\FilteringFunctions\arm_conv_partial_q31.c + + + arm_conv_q7.c + 1 + ..\FilteringFunctions\arm_conv_q7.c + + + arm_conv_q15.c + 1 + ..\FilteringFunctions\arm_conv_q15.c + + + arm_conv_q31.c + 1 + ..\FilteringFunctions\arm_conv_q31.c + + + arm_correlate_f32.c + 1 + ..\FilteringFunctions\arm_correlate_f32.c + + + arm_correlate_fast_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q15.c + + + arm_correlate_fast_q31.c + 1 + ..\FilteringFunctions\arm_correlate_fast_q31.c + + + arm_correlate_q7.c + 1 + ..\FilteringFunctions\arm_correlate_q7.c + + + arm_correlate_q15.c + 1 + ..\FilteringFunctions\arm_correlate_q15.c + + + arm_correlate_q31.c + 1 + ..\FilteringFunctions\arm_correlate_q31.c + + + arm_fir_decimate_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_f32.c + + + arm_fir_decimate_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q15.c + + + arm_fir_decimate_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_fast_q31.c + + + arm_fir_decimate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_f32.c + + + arm_fir_decimate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q15.c + + + arm_fir_decimate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_init_q31.c + + + arm_fir_decimate_q15.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q15.c + + + arm_fir_decimate_q31.c + 1 + ..\FilteringFunctions\arm_fir_decimate_q31.c + + + arm_fir_f32.c + 1 + ..\FilteringFunctions\arm_fir_f32.c + + + arm_fir_fast_q15.c + 1 + ..\FilteringFunctions\arm_fir_fast_q15.c + + + arm_fir_fast_q31.c + 1 + ..\FilteringFunctions\arm_fir_fast_q31.c + + + arm_fir_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_init_f32.c + + + arm_fir_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_init_q7.c + + + arm_fir_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_init_q15.c + + + arm_fir_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_init_q31.c + + + arm_fir_interpolate_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_f32.c + + + arm_fir_interpolate_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_f32.c + + + arm_fir_interpolate_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q15.c + + + arm_fir_interpolate_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_init_q31.c + + + arm_fir_interpolate_q15.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q15.c + + + arm_fir_interpolate_q31.c + 1 + ..\FilteringFunctions\arm_fir_interpolate_q31.c + + + arm_fir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_f32.c + + + arm_fir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_f32.c + + + arm_fir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q15.c + + + arm_fir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_init_q31.c + + + arm_fir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q15.c + + + arm_fir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_fir_lattice_q31.c + + + arm_fir_q7.c + 1 + ..\FilteringFunctions\arm_fir_q7.c + + + arm_fir_q15.c + 1 + ..\FilteringFunctions\arm_fir_q15.c + + + arm_fir_q31.c + 1 + ..\FilteringFunctions\arm_fir_q31.c + + + arm_fir_sparse_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_f32.c + + + arm_fir_sparse_init_f32.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_f32.c + + + arm_fir_sparse_init_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q7.c + + + arm_fir_sparse_init_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q15.c + + + arm_fir_sparse_init_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_init_q31.c + + + arm_fir_sparse_q7.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q7.c + + + arm_fir_sparse_q15.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q15.c + + + arm_fir_sparse_q31.c + 1 + ..\FilteringFunctions\arm_fir_sparse_q31.c + + + arm_iir_lattice_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_f32.c + + + arm_iir_lattice_init_f32.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_f32.c + + + arm_iir_lattice_init_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q15.c + + + arm_iir_lattice_init_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_init_q31.c + + + arm_iir_lattice_q15.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q15.c + + + arm_iir_lattice_q31.c + 1 + ..\FilteringFunctions\arm_iir_lattice_q31.c + + + arm_lms_f32.c + 1 + ..\FilteringFunctions\arm_lms_f32.c + + + arm_lms_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_init_f32.c + + + arm_lms_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_init_q15.c + + + arm_lms_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_init_q31.c + + + arm_lms_norm_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_f32.c + + + arm_lms_norm_init_f32.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_f32.c + + + arm_lms_norm_init_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q15.c + + + arm_lms_norm_init_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_init_q31.c + + + arm_lms_norm_q15.c + 1 + ..\FilteringFunctions\arm_lms_norm_q15.c + + + arm_lms_norm_q31.c + 1 + ..\FilteringFunctions\arm_lms_norm_q31.c + + + arm_lms_q15.c + 1 + ..\FilteringFunctions\arm_lms_q15.c + + + arm_lms_q31.c + 1 + ..\FilteringFunctions\arm_lms_q31.c + + + arm_correlate_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q15.c + + + arm_conv_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_opt_q7.c + + + arm_conv_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_opt_q15.c + + + arm_conv_partial_opt_q7.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q7.c + + + arm_conv_partial_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_opt_q15.c + + + arm_correlate_opt_q7.c + 1 + ..\FilteringFunctions\arm_correlate_opt_q7.c + + + arm_correlate_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_correlate_fast_opt_q15.c + + + arm_conv_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_fast_opt_q15.c + + + arm_conv_partial_fast_opt_q15.c + 1 + ..\FilteringFunctions\arm_conv_partial_fast_opt_q15.c + + + arm_biquad_cascade_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f32.c + + + arm_biquad_cascade_df2T_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_f64.c + + + arm_biquad_cascade_df2T_init_f64.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_df2T_init_f64.c + + + arm_biquad_cascade_stereo_df2T_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c + + + arm_biquad_cascade_stereo_df2T_init_f32.c + 1 + ..\FilteringFunctions\arm_biquad_cascade_stereo_df2T_init_f32.c + + + + + MatrixFunctions + + + arm_mat_add_f32.c + 1 + ..\MatrixFunctions\arm_mat_add_f32.c + + + arm_mat_add_q15.c + 1 + ..\MatrixFunctions\arm_mat_add_q15.c + + + arm_mat_add_q31.c + 1 + ..\MatrixFunctions\arm_mat_add_q31.c + + + arm_mat_init_f32.c + 1 + ..\MatrixFunctions\arm_mat_init_f32.c + + + arm_mat_init_q15.c + 1 + ..\MatrixFunctions\arm_mat_init_q15.c + + + arm_mat_init_q31.c + 1 + ..\MatrixFunctions\arm_mat_init_q31.c + + + arm_mat_inverse_f32.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f32.c + + + arm_mat_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_mult_f32.c + + + arm_mat_mult_fast_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q15.c + + + arm_mat_mult_fast_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_fast_q31.c + + + arm_mat_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_mult_q15.c + + + arm_mat_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_mult_q31.c + + + arm_mat_scale_f32.c + 1 + ..\MatrixFunctions\arm_mat_scale_f32.c + + + arm_mat_scale_q15.c + 1 + ..\MatrixFunctions\arm_mat_scale_q15.c + + + arm_mat_scale_q31.c + 1 + ..\MatrixFunctions\arm_mat_scale_q31.c + + + arm_mat_sub_f32.c + 1 + ..\MatrixFunctions\arm_mat_sub_f32.c + + + arm_mat_sub_q15.c + 1 + ..\MatrixFunctions\arm_mat_sub_q15.c + + + arm_mat_sub_q31.c + 1 + ..\MatrixFunctions\arm_mat_sub_q31.c + + + arm_mat_trans_f32.c + 1 + ..\MatrixFunctions\arm_mat_trans_f32.c + + + arm_mat_trans_q15.c + 1 + ..\MatrixFunctions\arm_mat_trans_q15.c + + + arm_mat_trans_q31.c + 1 + ..\MatrixFunctions\arm_mat_trans_q31.c + + + arm_mat_cmplx_mult_f32.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_f32.c + + + arm_mat_cmplx_mult_q15.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q15.c + + + arm_mat_cmplx_mult_q31.c + 1 + ..\MatrixFunctions\arm_mat_cmplx_mult_q31.c + + + arm_mat_inverse_f64.c + 1 + ..\MatrixFunctions\arm_mat_inverse_f64.c + + + + + TransformFunctions + + + arm_cfft_radix4_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_f32.c + + + arm_cfft_radix4_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_f32.c + + + arm_cfft_radix4_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q15.c + + + arm_cfft_radix4_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_init_q31.c + + + arm_cfft_radix4_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q15.c + + + arm_cfft_radix4_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix4_q31.c + + + arm_dct4_f32.c + 1 + ..\TransformFunctions\arm_dct4_f32.c + + + arm_dct4_init_f32.c + 1 + ..\TransformFunctions\arm_dct4_init_f32.c + + + arm_dct4_init_q15.c + 1 + ..\TransformFunctions\arm_dct4_init_q15.c + + + arm_dct4_init_q31.c + 1 + ..\TransformFunctions\arm_dct4_init_q31.c + + + arm_dct4_q15.c + 1 + ..\TransformFunctions\arm_dct4_q15.c + + + arm_dct4_q31.c + 1 + ..\TransformFunctions\arm_dct4_q31.c + + + arm_rfft_f32.c + 1 + ..\TransformFunctions\arm_rfft_f32.c + + + arm_rfft_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_init_f32.c + + + arm_rfft_init_q15.c + 1 + ..\TransformFunctions\arm_rfft_init_q15.c + + + arm_rfft_init_q31.c + 1 + ..\TransformFunctions\arm_rfft_init_q31.c + + + arm_rfft_q15.c + 1 + ..\TransformFunctions\arm_rfft_q15.c + + + arm_rfft_q31.c + 1 + ..\TransformFunctions\arm_rfft_q31.c + + + arm_bitreversal.c + 1 + ..\TransformFunctions\arm_bitreversal.c + + + arm_cfft_radix2_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_f32.c + + + arm_cfft_radix2_init_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_f32.c + + + arm_cfft_radix2_init_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q15.c + + + arm_cfft_radix2_init_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_init_q31.c + + + arm_cfft_radix2_q15.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q15.c + + + arm_cfft_radix2_q31.c + 1 + ..\TransformFunctions\arm_cfft_radix2_q31.c + + + arm_cfft_f32.c + 1 + ..\TransformFunctions\arm_cfft_f32.c + + + arm_cfft_radix8_f32.c + 1 + ..\TransformFunctions\arm_cfft_radix8_f32.c + + + arm_bitreversal2.S + 1 + ..\TransformFunctions\arm_bitreversal2.S + + + arm_rfft_fast_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_f32.c + + + arm_rfft_fast_init_f32.c + 1 + ..\TransformFunctions\arm_rfft_fast_init_f32.c + + + arm_cfft_q31.c + 1 + ..\TransformFunctions\arm_cfft_q31.c + + + arm_cfft_q15.c + 1 + ..\TransformFunctions\arm_cfft_q15.c + + + + + ControllerFunctions + + + arm_pid_init_f32.c + 1 + ..\ControllerFunctions\arm_pid_init_f32.c + + + arm_pid_init_q15.c + 1 + ..\ControllerFunctions\arm_pid_init_q15.c + + + arm_pid_init_q31.c + 1 + ..\ControllerFunctions\arm_pid_init_q31.c + + + arm_pid_reset_f32.c + 1 + ..\ControllerFunctions\arm_pid_reset_f32.c + + + arm_pid_reset_q15.c + 1 + ..\ControllerFunctions\arm_pid_reset_q15.c + + + arm_pid_reset_q31.c + 1 + ..\ControllerFunctions\arm_pid_reset_q31.c + + + arm_sin_cos_f32.c + 1 + ..\ControllerFunctions\arm_sin_cos_f32.c + + + arm_sin_cos_q31.c + 1 + ..\ControllerFunctions\arm_sin_cos_q31.c + + + + + StatisticsFunctions + + + arm_max_f32.c + 1 + ..\StatisticsFunctions\arm_max_f32.c + + + arm_max_q7.c + 1 + ..\StatisticsFunctions\arm_max_q7.c + + + arm_max_q15.c + 1 + ..\StatisticsFunctions\arm_max_q15.c + + + arm_max_q31.c + 1 + ..\StatisticsFunctions\arm_max_q31.c + + + arm_mean_f32.c + 1 + ..\StatisticsFunctions\arm_mean_f32.c + + + arm_mean_q7.c + 1 + ..\StatisticsFunctions\arm_mean_q7.c + + + arm_mean_q15.c + 1 + ..\StatisticsFunctions\arm_mean_q15.c + + + arm_mean_q31.c + 1 + ..\StatisticsFunctions\arm_mean_q31.c + + + arm_min_f32.c + 1 + ..\StatisticsFunctions\arm_min_f32.c + + + arm_min_q7.c + 1 + ..\StatisticsFunctions\arm_min_q7.c + + + arm_min_q15.c + 1 + ..\StatisticsFunctions\arm_min_q15.c + + + arm_min_q31.c + 1 + ..\StatisticsFunctions\arm_min_q31.c + + + arm_power_f32.c + 1 + ..\StatisticsFunctions\arm_power_f32.c + + + arm_power_q7.c + 1 + ..\StatisticsFunctions\arm_power_q7.c + + + arm_power_q15.c + 1 + ..\StatisticsFunctions\arm_power_q15.c + + + arm_power_q31.c + 1 + ..\StatisticsFunctions\arm_power_q31.c + + + arm_rms_f32.c + 1 + ..\StatisticsFunctions\arm_rms_f32.c + + + arm_rms_q15.c + 1 + ..\StatisticsFunctions\arm_rms_q15.c + + + arm_rms_q31.c + 1 + ..\StatisticsFunctions\arm_rms_q31.c + + + arm_std_f32.c + 1 + ..\StatisticsFunctions\arm_std_f32.c + + + arm_std_q15.c + 1 + ..\StatisticsFunctions\arm_std_q15.c + + + arm_std_q31.c + 1 + ..\StatisticsFunctions\arm_std_q31.c + + + arm_var_f32.c + 1 + ..\StatisticsFunctions\arm_var_f32.c + + + arm_var_q15.c + 1 + ..\StatisticsFunctions\arm_var_q15.c + + + arm_var_q31.c + 1 + ..\StatisticsFunctions\arm_var_q31.c + + + + + SupportFunctions + + + arm_copy_f32.c + 1 + ..\SupportFunctions\arm_copy_f32.c + + + arm_copy_q7.c + 1 + ..\SupportFunctions\arm_copy_q7.c + + + arm_copy_q15.c + 1 + ..\SupportFunctions\arm_copy_q15.c + + + arm_copy_q31.c + 1 + ..\SupportFunctions\arm_copy_q31.c + + + arm_fill_f32.c + 1 + ..\SupportFunctions\arm_fill_f32.c + + + arm_fill_q7.c + 1 + ..\SupportFunctions\arm_fill_q7.c + + + arm_fill_q15.c + 1 + ..\SupportFunctions\arm_fill_q15.c + + + arm_fill_q31.c + 1 + ..\SupportFunctions\arm_fill_q31.c + + + arm_float_to_q7.c + 1 + ..\SupportFunctions\arm_float_to_q7.c + + + arm_float_to_q15.c + 1 + ..\SupportFunctions\arm_float_to_q15.c + + + arm_float_to_q31.c + 1 + ..\SupportFunctions\arm_float_to_q31.c + + + arm_q7_to_float.c + 1 + ..\SupportFunctions\arm_q7_to_float.c + + + arm_q7_to_q15.c + 1 + ..\SupportFunctions\arm_q7_to_q15.c + + + arm_q7_to_q31.c + 1 + ..\SupportFunctions\arm_q7_to_q31.c + + + arm_q15_to_float.c + 1 + ..\SupportFunctions\arm_q15_to_float.c + + + arm_q15_to_q7.c + 1 + ..\SupportFunctions\arm_q15_to_q7.c + + + arm_q15_to_q31.c + 1 + ..\SupportFunctions\arm_q15_to_q31.c + + + arm_q31_to_float.c + 1 + ..\SupportFunctions\arm_q31_to_float.c + + + arm_q31_to_q7.c + 1 + ..\SupportFunctions\arm_q31_to_q7.c + + + arm_q31_to_q15.c + 1 + ..\SupportFunctions\arm_q31_to_q15.c + + + + + CommonTables + + + arm_common_tables.c + 1 + ..\CommonTables\arm_common_tables.c + + + arm_const_structs.c + 1 + ..\CommonTables\arm_const_structs.c + + + + + + + +
diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math_Build.bat b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math_Build.bat new file mode 100644 index 0000000..bb121d1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/arm_cortexM_math_Build.bat @@ -0,0 +1,57 @@ +@echo off + +SET UVEXE=C:\Keil\UV4\UV4.EXE + +echo. +echo Building DSP Libraries GCC +echo. +echo Building DSP Library for Cortex-M0 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M0l" -o "DspLib_M0l_build.log" +echo Building DSP Library for Cortex-M0 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M0b" -o "DspLib_M0b_build.log" +echo Building DSP Library for Cortex-M3 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M3l" -o "DspLib_M3l_build.log" +echo Building DSP Library for Cortex-M3 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M3b" -o "DspLib_M3b_build.log" +echo Building DSP Library for Cortex-M4 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4l" -o "DspLib_M4l_build.log" +echo Building DSP Library for Cortex-M4 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4b" -o "DspLib_M4b_build.log" +echo Building DSP Library for Cortex-M4 with FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4lf" -o "DspLib_M4lf_build.log" +echo Building DSP Library for Cortex-M4 with FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M4bf" -o "DspLib_M4bf_build.log" +echo Building DSP Library for Cortex-M7 Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7l" -o "DspLib_M7l_build.log" +echo Building DSP Library for Cortex-M7 Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7b" -o "DspLib_M7b_build.log" +echo Building DSP Library for Cortex-M7 with single precision FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7lfsp" -o "DspLib_M7lfsp_build.log" +echo Building DSP Library for Cortex-M7 with single precision FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7bfsp" -o "DspLib_M7bfsp_build.log" +echo Building DSP Library for Cortex-M7 with double precision FPU Little Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7lfdp" -o "DspLib_M7lfdp_build.log" +echo Building DSP Library for Cortex-M7 with double precision FPU Big Endian +%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "M7bfdp" -o "DspLib_M7bfdp_build.log" + +echo. +ECHO Deleting intermediate files +rmdir /S /Q IntermediateFiles\M0l +rmdir /S /Q IntermediateFiles\M0b +rmdir /S /Q IntermediateFiles\M3l +rmdir /S /Q IntermediateFiles\M3b +rmdir /S /Q IntermediateFiles\M4l +rmdir /S /Q IntermediateFiles\M4b +rmdir /S /Q IntermediateFiles\M4lf +rmdir /S /Q IntermediateFiles\M4bf +rmdir /S /Q IntermediateFiles\M7l +rmdir /S /Q IntermediateFiles\M7b +rmdir /S /Q IntermediateFiles\M7lfsp +rmdir /S /Q IntermediateFiles\M7bfsp +rmdir /S /Q IntermediateFiles\M7lfdp +rmdir /S /Q IntermediateFiles\M7bfdp +del /Q IntermediateFiles\*.* +del /Q *.bak +del /Q *.dep +del /Q *.uvguix.* +del /Q ArInp.* \ No newline at end of file diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/getSizeInfo.bat b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/getSizeInfo.bat new file mode 100644 index 0000000..6ce4908 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/GCC/getSizeInfo.bat @@ -0,0 +1,17 @@ +@echo off + +if .%1==. goto help +if exist %1 goto getSizeInfo +goto help + +:getSizeInfo +arm-none-eabi-size -t %1 > %2 +goto end + +:help +echo Syntax: getSizeInfo inFile outFile +echo. +echo e.g.: getSizeInfo ..\..\..\Lib\GCC\arm_cortexM0l_math.lib arm_cortexM0l_math.txt + +:end + diff --git a/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c new file mode 100644 index 0000000..123f9e9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c @@ -0,0 +1,208 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c new file mode 100644 index 0000000..ef7f869 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c @@ -0,0 +1,163 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c new file mode 100644 index 0000000..de02d70 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c @@ -0,0 +1,207 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c new file mode 100644 index 0000000..dd41e7c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c @@ -0,0 +1,283 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c new file mode 100644 index 0000000..8e3fc06 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c @@ -0,0 +1,424 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c new file mode 100644 index 0000000..4dfe1fd --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c @@ -0,0 +1,293 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c new file mode 100644 index 0000000..1a0e5e8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c @@ -0,0 +1,88 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c new file mode 100644 index 0000000..33f2f78 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c @@ -0,0 +1,80 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c new file mode 100644 index 0000000..27c451a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c new file mode 100644 index 0000000..40b67ad --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c @@ -0,0 +1,703 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c new file mode 100644 index 0000000..a6c4980 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c @@ -0,0 +1,703 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c new file mode 100644 index 0000000..55349de --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c @@ -0,0 +1,286 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c new file mode 100644 index 0000000..11139b8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c @@ -0,0 +1,369 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c new file mode 100644 index 0000000..dbc3141 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c @@ -0,0 +1,226 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c new file mode 100644 index 0000000..9e8d26d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c @@ -0,0 +1,469 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c new file mode 100644 index 0000000..6c97eef --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c @@ -0,0 +1,294 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c new file mode 100644 index 0000000..b7be4ce --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c @@ -0,0 +1,181 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c new file mode 100644 index 0000000..4e67cf9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c @@ -0,0 +1,183 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c new file mode 100644 index 0000000..845f306 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c @@ -0,0 +1,202 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c new file mode 100644 index 0000000..5451a3a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c @@ -0,0 +1,209 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c new file mode 100644 index 0000000..cc5a7b9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c @@ -0,0 +1,160 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c new file mode 100644 index 0000000..d5ac206 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c @@ -0,0 +1,208 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c new file mode 100644 index 0000000..f5cd456 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c @@ -0,0 +1,218 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c new file mode 100644 index 0000000..c4656bb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c @@ -0,0 +1,284 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c new file mode 100644 index 0000000..459700a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c @@ -0,0 +1,210 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c new file mode 100644 index 0000000..6a1ad39 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c @@ -0,0 +1,186 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c new file mode 100644 index 0000000..9a59726 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c @@ -0,0 +1,176 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c new file mode 100644 index 0000000..8a95cf1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c @@ -0,0 +1,177 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c new file mode 100644 index 0000000..07150d6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c @@ -0,0 +1,177 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c new file mode 100644 index 0000000..3e699d3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c new file mode 100644 index 0000000..22ea8dc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c @@ -0,0 +1,133 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c new file mode 100644 index 0000000..9f80d84 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c new file mode 100644 index 0000000..31a3516 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c @@ -0,0 +1,133 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c new file mode 100644 index 0000000..7b6504c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c @@ -0,0 +1,183 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c new file mode 100644 index 0000000..88401b7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c @@ -0,0 +1,177 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c new file mode 100644 index 0000000..01746b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c @@ -0,0 +1,176 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c new file mode 100644 index 0000000..587afac --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c @@ -0,0 +1,178 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c new file mode 100644 index 0000000..564d84e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c new file mode 100644 index 0000000..02c4109 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c @@ -0,0 +1,152 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c new file mode 100644 index 0000000..75c6314 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c new file mode 100644 index 0000000..4f38156 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c @@ -0,0 +1,141 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c new file mode 100644 index 0000000..5f93537 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c @@ -0,0 +1,141 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c new file mode 100644 index 0000000..3f335a2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c @@ -0,0 +1,153 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c new file mode 100644 index 0000000..eaca28d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c @@ -0,0 +1,150 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c new file mode 100644 index 0000000..c73c707 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c @@ -0,0 +1,208 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c new file mode 100644 index 0000000..24054d3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c @@ -0,0 +1,195 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c new file mode 100644 index 0000000..f324273 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c @@ -0,0 +1,186 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c new file mode 100644 index 0000000..5f0ea7d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c new file mode 100644 index 0000000..94fcef9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c @@ -0,0 +1,195 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c new file mode 100644 index 0000000..6b9e228 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c @@ -0,0 +1,187 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c new file mode 100644 index 0000000..d6c846b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c @@ -0,0 +1,135 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c new file mode 100644 index 0000000..5c6a391 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c @@ -0,0 +1,114 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c new file mode 100644 index 0000000..0308cb8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c @@ -0,0 +1,123 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c new file mode 100644 index 0000000..e273144 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c @@ -0,0 +1,115 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c new file mode 100644 index 0000000..c8ea2dc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c new file mode 100644 index 0000000..5b306a9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c new file mode 100644 index 0000000..84068b2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c new file mode 100644 index 0000000..88ced50 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c @@ -0,0 +1,118 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c new file mode 100644 index 0000000..a2c486f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c new file mode 100644 index 0000000..d64609e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c @@ -0,0 +1,211 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c new file mode 100644 index 0000000..7ecebdf --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c @@ -0,0 +1,203 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c new file mode 100644 index 0000000..bbaf38c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c new file mode 100644 index 0000000..f046427 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c new file mode 100644 index 0000000..9b91c36 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c @@ -0,0 +1,154 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c new file mode 100644 index 0000000..5949474 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c new file mode 100644 index 0000000..33222bc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c new file mode 100644 index 0000000..d90898a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c new file mode 100644 index 0000000..f984cf0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c new file mode 100644 index 0000000..bba084c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c new file mode 100644 index 0000000..0519d92 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c @@ -0,0 +1,142 @@ +/* ---------------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c new file mode 100644 index 0000000..0404ea8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c @@ -0,0 +1,242 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S new file mode 100644 index 0000000..08c5d75 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S @@ -0,0 +1,211 @@ +;/* ---------------------------------------------------------------------- +;* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c new file mode 100644 index 0000000..5fb21b5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c @@ -0,0 +1,632 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c new file mode 100644 index 0000000..20ad7e7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c @@ -0,0 +1,264 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c new file mode 100644 index 0000000..8e3b77c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c @@ -0,0 +1,485 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c new file mode 100644 index 0000000..55d2a71 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c @@ -0,0 +1,205 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c new file mode 100644 index 0000000..3949140 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c @@ -0,0 +1,189 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c new file mode 100644 index 0000000..3ce6e5d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c @@ -0,0 +1,187 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c new file mode 100644 index 0000000..74d821a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c @@ -0,0 +1,742 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c new file mode 100644 index 0000000..6ed9a80 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c @@ -0,0 +1,351 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c new file mode 100644 index 0000000..c29927c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c @@ -0,0 +1,1210 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c new file mode 100644 index 0000000..1e1ad7c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c @@ -0,0 +1,165 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c new file mode 100644 index 0000000..7f29d67 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c @@ -0,0 +1,152 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c new file mode 100644 index 0000000..a375a5f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c new file mode 100644 index 0000000..761e43e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c @@ -0,0 +1,1924 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c new file mode 100644 index 0000000..0fbb40b --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c @@ -0,0 +1,1404 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c new file mode 100644 index 0000000..7ed8fde --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c @@ -0,0 +1,384 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c new file mode 100644 index 0000000..5ee7efa --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c @@ -0,0 +1,461 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c new file mode 100644 index 0000000..efc6501 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c @@ -0,0 +1,16519 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c new file mode 100644 index 0000000..7a78aa8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c @@ -0,0 +1,4284 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c new file mode 100644 index 0000000..1aa9081 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c @@ -0,0 +1,8364 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c new file mode 100644 index 0000000..38131d5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c @@ -0,0 +1,394 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c new file mode 100644 index 0000000..b8ec151 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c @@ -0,0 +1,395 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c new file mode 100644 index 0000000..b72f8fd --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c @@ -0,0 +1,329 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c new file mode 100644 index 0000000..d4970b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c @@ -0,0 +1,353 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c new file mode 100644 index 0000000..ba66980 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c new file mode 100644 index 0000000..b9b5004 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c @@ -0,0 +1,8376 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c new file mode 100644 index 0000000..31b97b4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c @@ -0,0 +1,2235 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c new file mode 100644 index 0000000..8ff254c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c @@ -0,0 +1,4285 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c new file mode 100644 index 0000000..6e76b9c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c @@ -0,0 +1,439 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c new file mode 100644 index 0000000..71bba21 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c @@ -0,0 +1,296 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/license.txt b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/license.txt new file mode 100644 index 0000000..8c9c1b3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/DSP_Lib/license.txt @@ -0,0 +1,28 @@ +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/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h new file mode 100644 index 0000000..bf3421d --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h @@ -0,0 +1,6355 @@ +/** + ****************************************************************************** + * @file stm32l1xx.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32L1xx High-density, Medium-density + * and Medium-density Plus devices. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_STDPERIPH_DRIVER" + * - To change few application-specific parameters such as the HSE + * crystal frequency + * - Data structures and the address mapping for all peripherals + * - Peripheral's registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l1xx + * @{ + */ + +#ifndef __STM32L1XX_H +#define __STM32L1XX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Library_configuration_section + * @{ + */ + +/* Uncomment the line below according to the target STM32L device used in your + application + */ + +#if !defined (STM32L1XX_MD) && !defined (STM32L1XX_MDP) && !defined (STM32L1XX_HD) + +/* #define STM32L1XX_MD */ /*!< - Ultra Low Power Medium-density devices: STM32L151x6xx, STM32L151x8xx, + STM32L151xBxx, STM32L152x6xx, STM32L152x8xx and STM32L152xBxx. + - Ultra Low Power Medium-density Value Line devices: STM32L100x6xx, + STM32L100x8xx and STM32L100xBxx. */ + +/* #define STM32L1XX_MDP */ /*!< - Ultra Low Power Medium-density Plus devices: STM32L151xCxx, STM32L152xCxx and STM32L162xCxx + - Ultra Low Power Medium-density Plus Value Line devices: STM32L100xCxx */ + +#define STM32L1XX_HD /*!< Ultra Low Power High-density devices: STM32L151xDxx, STM32L152xDxx and STM32L162xDxx */ +#endif +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + */ + +#if !defined (STM32L1XX_MD) && !defined (STM32L1XX_MDP) && !defined (STM32L1XX_HD) + #error "Please select first the target STM32L1xx device used in your application (in stm32l1xx.h file)" +#endif + +#if !defined USE_STDPERIPH_DRIVER +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + /*#define USE_STDPERIPH_DRIVER*/ +#endif + +/** + * @brief In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + 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. + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ +#endif + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + Timeout value + */ +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ +#endif + +/** + * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup + Timeout value + */ +#if !defined (HSI_STARTUP_TIMEOUT) +#define HSI_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSI start up */ +#endif + +#if !defined (HSI_VALUE) +#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal High Speed oscillator in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif + +#if !defined (LSI_VALUE) +#define LSI_VALUE ((uint32_t)37000) /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +#endif + +#if !defined (LSE_VALUE) +#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ +#endif + +/** + * @brief STM32L1xx Standard Peripheral Library version number V1.2.0 + */ +#define __STM32L1XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __STM32L1XX_STDPERIPH_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ +#define __STM32L1XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __STM32L1XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32L1XX_STDPERIPH_VERSION ( (__STM32L1XX_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM32L1XX_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM32L1XX_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM32L1XX_STDPERIPH_VERSION_RC)) + +/** + * @} + */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief STM32L1xx Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +#define __CM3_REV 0x200 /*!< Cortex-M3 Revision r2p0 */ +#define __MPU_PRESENT 1 /*!< STM32L1 provides MPU */ +#define __NVIC_PRIO_BITS 4 /*!< STM32L1 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +/*!< Interrupt Number Definition */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ******************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVC_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32L specific Interrupt Numbers ***********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_STAMP_IRQn = 2, /*!< Tamper and Time Stamp through EXTI Line Interrupts */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup Timer through EXTI Line Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ + USB_HP_IRQn = 19, /*!< USB High Priority Interrupt */ + USB_LP_IRQn = 20, /*!< USB Low Priority Interrupt */ + DAC_IRQn = 21, /*!< DAC Interrupt */ + COMP_IRQn = 22, /*!< Comparator through EXTI Line Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + LCD_IRQn = 24, /*!< LCD Interrupt */ + TIM9_IRQn = 25, /*!< TIM9 global Interrupt */ + TIM10_IRQn = 26, /*!< TIM10 global Interrupt */ + TIM11_IRQn = 27, /*!< TIM11 global Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ + USB_FS_WKUP_IRQn = 42, /*!< USB FS WakeUp from suspend through EXTI Line Interrupt */ + TIM6_IRQn = 43, /*!< TIM6 global Interrupt */ +#ifdef STM32L1XX_MD + TIM7_IRQn = 44 /*!< TIM7 global Interrupt */ +#endif /* STM32L1XX_MD */ + +#ifdef STM32L1XX_MDP + TIM7_IRQn = 44, /*!< TIM7 global Interrupt */ + TIM5_IRQn = 46, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 47, /*!< SPI3 global Interrupt */ + DMA2_Channel1_IRQn = 50, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 51, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 52, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 53, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 54, /*!< DMA2 Channel 5 global Interrupt */ + AES_IRQn = 55, /*!< AES global Interrupt */ + COMP_ACQ_IRQn = 56 /*!< Comparator Channel Acquisition global Interrupt */ +#endif /* STM32L1XX_MDP */ + +#ifdef STM32L1XX_HD + TIM7_IRQn = 44, /*!< TIM7 global Interrupt */ + SDIO_IRQn = 45, /*!< SDIO global Interrupt */ + TIM5_IRQn = 46, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 47, /*!< SPI3 global Interrupt */ + UART4_IRQn = 48, /*!< UART4 global Interrupt */ + UART5_IRQn = 49, /*!< UART5 global Interrupt */ + DMA2_Channel1_IRQn = 50, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 51, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 52, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 53, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 54, /*!< DMA2 Channel 5 global Interrupt */ + AES_IRQn = 55, /*!< AES global Interrupt */ + COMP_ACQ_IRQn = 56 /*!< Comparator Channel Acquisition global Interrupt */ +#endif /* STM32L1XX_HD */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32l1xx.h" +#include + +/** @addtogroup Exported_types + * @{ + */ + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +/** + * @brief __RAM_FUNC definition + */ +#if defined ( __CC_ARM ) +/* ARM Compiler + ------------ + RAM functions are defined using the toolchain options. + Functions that are executed in RAM should reside in a separate source module. + Using the 'Options for File' dialog you can simply change the 'Code / Const' + area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the 'Options for Target' + dialog. +*/ + #define __RAM_FUNC FLASH_Status + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- + RAM functions are defined using a specific toolchain keyword "__ramfunc". +*/ + #define __RAM_FUNC __ramfunc FLASH_Status + +#elif defined ( __GNUC__ ) +/* GNU Compiler + ------------ + RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".data")))". +*/ + #define __RAM_FUNC FLASH_Status __attribute__((section(".data"))) + +#elif defined ( __TASKING__ ) +/* TASKING Compiler + ---------------- + RAM functions are defined using a specific toolchain pragma. This pragma is + defined in the stm32l1xx_flash_ramfunc.c +*/ + #define __RAM_FUNC FLASH_Status + +#endif + +/** + * @} + */ + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t SMPR3; /*!< ADC sample time register 3, Address offset: 0x14 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x18 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x1C */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x20 */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x24 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x28 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x2C */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x30 */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x34 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x38 */ + __IO uint32_t SQR4; /*!< ADC regular sequence register 4, Address offset: 0x3C */ + __IO uint32_t SQR5; /*!< ADC regular sequence register 5, Address offset: 0x40 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x44 */ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x48 */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x4C */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x50 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x54 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x58 */ + __IO uint32_t SMPR0; /*!< ADC sample time register 0, Address offset: 0x5C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ +} ADC_Common_TypeDef; + + +/** + * @brief AES hardware accelerator + */ + +typedef struct +{ + __IO uint32_t CR; /*!< AES control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< AES status register, Address offset: 0x04 */ + __IO uint32_t DINR; /*!< AES data input register, Address offset: 0x08 */ + __IO uint32_t DOUTR; /*!< AES data output register, Address offset: 0x0C */ + __IO uint32_t KEYR0; /*!< AES key register 0, Address offset: 0x10 */ + __IO uint32_t KEYR1; /*!< AES key register 1, Address offset: 0x14 */ + __IO uint32_t KEYR2; /*!< AES key register 2, Address offset: 0x18 */ + __IO uint32_t KEYR3; /*!< AES key register 3, Address offset: 0x1C */ + __IO uint32_t IVR0; /*!< AES initialization vector register 0, Address offset: 0x20 */ + __IO uint32_t IVR1; /*!< AES initialization vector register 1, Address offset: 0x24 */ + __IO uint32_t IVR2; /*!< AES initialization vector register 2, Address offset: 0x28 */ + __IO uint32_t IVR3; /*!< AES initialization vector register 3, Address offset: 0x2C */ +} AES_TypeDef; + +/** + * @brief Comparator + */ + +typedef struct +{ + __IO uint32_t CSR; /*!< COMP comparator control and status register, Address offset: 0x00 */ +} COMP_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; /*!< DMA channel x configuration register */ + __IO uint32_t CNDTR; /*!< DMA channel x number of data register */ + __IO uint32_t CPAR; /*!< DMA channel x peripheral address register */ + __IO uint32_t CMAR; /*!< DMA channel x memory address register */ +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; /*!< DMA interrupt status register, Address offset: 0x00 */ + __IO uint32_t IFCR; /*!< DMA interrupt flag clear register, Address offset: 0x04 */ +} DMA_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI rising edge trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling edge trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< Access control register, Address offset: 0x00 */ + __IO uint32_t PECR; /*!< Program/erase control register, Address offset: 0x04 */ + __IO uint32_t PDKEYR; /*!< Power down key register, Address offset: 0x08 */ + __IO uint32_t PEKEYR; /*!< Program/erase key register, Address offset: 0x0c */ + __IO uint32_t PRGKEYR; /*!< Program memory key register, Address offset: 0x10 */ + __IO uint32_t OPTKEYR; /*!< Option byte key register, Address offset: 0x14 */ + __IO uint32_t SR; /*!< Status register, Address offset: 0x18 */ + __IO uint32_t OBR; /*!< Option byte register, Address offset: 0x1c */ + __IO uint32_t WRPR; /*!< Write protection register, Address offset: 0x20 */ + uint32_t RESERVED[23]; /*!< Reserved, 0x24 */ + __IO uint32_t WRPR1; /*!< Write protection register 1, Address offset: 0x28 */ + __IO uint32_t WRPR2; /*!< Write protection register 2, Address offset: 0x2C */ +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint32_t RDP; /*!< Read protection register, Address offset: 0x00 */ + __IO uint32_t USER; /*!< user register, Address offset: 0x04 */ + __IO uint32_t WRP01; /*!< write protection register 0 1, Address offset: 0x08 */ + __IO uint32_t WRP23; /*!< write protection register 2 3, Address offset: 0x0C */ + __IO uint32_t WRP45; /*!< write protection register 4 5, Address offset: 0x10 */ + __IO uint32_t WRP67; /*!< write protection register 6 7, Address offset: 0x14 */ + __IO uint32_t WRP89; /*!< write protection register 8 9, Address offset: 0x18 */ + __IO uint32_t WRP1011; /*!< write protection register 10 11, Address offset: 0x1C */ +} OB_TypeDef; + +/** + * @brief Operational Amplifier (OPAMP) + */ + +typedef struct +{ + __IO uint32_t CSR; /*!< OPAMP control/status register, Address offset: 0x00 */ + __IO uint32_t OTR; /*!< OPAMP offset trimming register for normal mode, Address offset: 0x04 */ + __IO uint32_t LPOTR; /*!< OPAMP offset trimming register for low power mode, Address offset: 0x08 */ +} OPAMP_TypeDef; + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief General Purpose IO + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint16_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + uint16_t RESERVED0; /*!< Reserved, 0x06 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint16_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + uint16_t RESERVED1; /*!< Reserved, 0x12 */ + __IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + uint16_t RESERVED2; /*!< Reserved, 0x16 */ + __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low registerBSRR, Address offset: 0x18 */ + __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high registerBSRR, Address offset: 0x1A */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */ + __IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */ + uint16_t RESERVED3; /*!< Reserved, 0x2A */ +} GPIO_TypeDef; + +/** + * @brief SysTem Configuration + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint16_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + uint16_t RESERVED0; /*!< Reserved, 0x02 */ + __IO uint16_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint16_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + uint16_t RESERVED2; /*!< Reserved, 0x0A */ + __IO uint16_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + uint16_t RESERVED3; /*!< Reserved, 0x0E */ + __IO uint16_t DR; /*!< I2C Data register, Address offset: 0x10 */ + uint16_t RESERVED4; /*!< Reserved, 0x12 */ + __IO uint16_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + uint16_t RESERVED5; /*!< Reserved, 0x16 */ + __IO uint16_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + uint16_t RESERVED6; /*!< Reserved, 0x1A */ + __IO uint16_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + uint16_t RESERVED7; /*!< Reserved, 0x1E */ + __IO uint16_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ + uint16_t RESERVED8; /*!< Reserved, 0x22 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + + +/** + * @brief LCD + */ + +typedef struct +{ + __IO uint32_t CR; /*!< LCD control register, Address offset: 0x00 */ + __IO uint32_t FCR; /*!< LCD frame control register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< LCD status register, Address offset: 0x08 */ + __IO uint32_t CLR; /*!< LCD clear register, Address offset: 0x0C */ + uint32_t RESERVED; /*!< Reserved, Address offset: 0x10 */ + __IO uint32_t RAM[16]; /*!< LCD display memory, Address offset: 0x14-0x50 */ +} LCD_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t ICSCR; /*!< RCC Internal clock sources calibration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC Clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC Clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHBRSTR; /*!< RCC AHB peripheral reset register, Address offset: 0x10 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x18 */ + __IO uint32_t AHBENR; /*!< RCC AHB peripheral clock enable register, Address offset: 0x1C */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x20 */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x24 */ + __IO uint32_t AHBLPENR; /*!< RCC AHB peripheral clock enable in low power mode register, Address offset: 0x28 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x2C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x30 */ + __IO uint32_t CSR; /*!< RCC Control/status register, Address offset: 0x34 */ +} RCC_TypeDef; + +/** + * @brief Routing Interface + */ + +typedef struct +{ + __IO uint32_t ICR; /*!< RI input capture register, Address offset: 0x00 */ + __IO uint32_t ASCR1; /*!< RI analog switches control register, Address offset: 0x04 */ + __IO uint32_t ASCR2; /*!< RI analog switch control register 2, Address offset: 0x08 */ + __IO uint32_t HYSCR1; /*!< RI hysteresis control register, Address offset: 0x0C */ + __IO uint32_t HYSCR2; /*!< RI Hysteresis control register, Address offset: 0x10 */ + __IO uint32_t HYSCR3; /*!< RI Hysteresis control register, Address offset: 0x14 */ + __IO uint32_t HYSCR4; /*!< RI Hysteresis control register, Address offset: 0x18 */ +} RI_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALR; /*!< RRTC calibration register, Address offset: 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + __IO uint32_t ALRMASSR; /*!< RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSSR; /*!< RTC alarm B sub second register, Address offset: 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 0, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ + __IO uint32_t BKP20R; /*!< RTC backup register 20, Address offset: 0xA0 */ + __IO uint32_t BKP21R; /*!< RTC backup register 21, Address offset: 0xA4 */ + __IO uint32_t BKP22R; /*!< RTC backup register 22, Address offset: 0xA8 */ + __IO uint32_t BKP23R; /*!< RTC backup register 23, Address offset: 0xAC */ + __IO uint32_t BKP24R; /*!< RTC backup register 24, Address offset: 0xB0 */ + __IO uint32_t BKP25R; /*!< RTC backup register 25, Address offset: 0xB4 */ + __IO uint32_t BKP26R; /*!< RTC backup register 26, Address offset: 0xB8 */ + __IO uint32_t BKP27R; /*!< RTC backup register 27, Address offset: 0xBC */ + __IO uint32_t BKP28R; /*!< RTC backup register 28, Address offset: 0xC0 */ + __IO uint32_t BKP29R; /*!< RTC backup register 29, Address offset: 0xC4 */ + __IO uint32_t BKP30R; /*!< RTC backup register 30, Address offset: 0xC8 */ + __IO uint32_t BKP31R; /*!< RTC backup register 31, Address offset: 0xCC */ +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __I uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __I uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __I uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __I uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __I uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __I uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __I uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __I uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + uint16_t RESERVED0; /*!< Reserved, 0x02 */ + __IO uint16_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint16_t SR; /*!< SPI status register, Address offset: 0x08 */ + uint16_t RESERVED2; /*!< Reserved, 0x0A */ + __IO uint16_t DR; /*!< SPI data register, Address offset: 0x0C */ + uint16_t RESERVED3; /*!< Reserved, 0x0E */ + __IO uint16_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + uint16_t RESERVED4; /*!< Reserved, 0x12 */ + __IO uint16_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + uint16_t RESERVED5; /*!< Reserved, 0x16 */ + __IO uint16_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + uint16_t RESERVED6; /*!< Reserved, 0x1A */ + __IO uint16_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + uint16_t RESERVED7; /*!< Reserved, 0x1E */ + __IO uint16_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ + uint16_t RESERVED8; /*!< Reserved, 0x22 */ +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint16_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + uint16_t RESERVED0; /*!< Reserved, 0x02 */ + __IO uint16_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint16_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + uint16_t RESERVED2; /*!< Reserved, 0x0A */ + __IO uint16_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + uint16_t RESERVED3; /*!< Reserved, 0x0E */ + __IO uint16_t SR; /*!< TIM status register, Address offset: 0x10 */ + uint16_t RESERVED4; /*!< Reserved, 0x12 */ + __IO uint16_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + uint16_t RESERVED5; /*!< Reserved, 0x16 */ + __IO uint16_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + uint16_t RESERVED6; /*!< Reserved, 0x1A */ + __IO uint16_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + uint16_t RESERVED7; /*!< Reserved, 0x1E */ + __IO uint16_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + uint16_t RESERVED8; /*!< Reserved, 0x22 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint16_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + uint16_t RESERVED10; /*!< Reserved, 0x2A */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + uint32_t RESERVED12; /*!< Reserved, 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + uint32_t RESERVED17; /*!< Reserved, 0x44 */ + __IO uint16_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + uint16_t RESERVED18; /*!< Reserved, 0x4A */ + __IO uint16_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + uint16_t RESERVED19; /*!< Reserved, 0x4E */ + __IO uint16_t OR; /*!< TIM option register, Address offset: 0x50 */ + uint16_t RESERVED20; /*!< Reserved, 0x52 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint16_t SR; /*!< USART Status register, Address offset: 0x00 */ + uint16_t RESERVED0; /*!< Reserved, 0x02 */ + __IO uint16_t DR; /*!< USART Data register, Address offset: 0x04 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + uint16_t RESERVED2; /*!< Reserved, 0x0A */ + __IO uint16_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + uint16_t RESERVED3; /*!< Reserved, 0x0E */ + __IO uint16_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + uint16_t RESERVED4; /*!< Reserved, 0x12 */ + __IO uint16_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + uint16_t RESERVED5; /*!< Reserved, 0x16 */ + __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ + uint16_t RESERVED6; /*!< Reserved, 0x1A */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + +#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define LCD_BASE (APB1PERIPH_BASE + 0x2400) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define COMP_BASE (APB1PERIPH_BASE + 0x7C00) +#define RI_BASE (APB1PERIPH_BASE + 0x7C04) +#define OPAMP_BASE (APB1PERIPH_BASE + 0x7C5C) + +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define TIM9_BASE (APB2PERIPH_BASE + 0x0800) +#define TIM10_BASE (APB2PERIPH_BASE + 0x0C00) +#define TIM11_BASE (APB2PERIPH_BASE + 0x1000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC_BASE (APB2PERIPH_BASE + 0x2700) +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) + +#define GPIOA_BASE (AHBPERIPH_BASE + 0x0000) +#define GPIOB_BASE (AHBPERIPH_BASE + 0x0400) +#define GPIOC_BASE (AHBPERIPH_BASE + 0x0800) +#define GPIOD_BASE (AHBPERIPH_BASE + 0x0C00) +#define GPIOE_BASE (AHBPERIPH_BASE + 0x1000) +#define GPIOH_BASE (AHBPERIPH_BASE + 0x1400) +#define GPIOF_BASE (AHBPERIPH_BASE + 0x1800) +#define GPIOG_BASE (AHBPERIPH_BASE + 0x1C00) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) +#define RCC_BASE (AHBPERIPH_BASE + 0x3800) + + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x3C00) /*!< FLASH registers base address */ +#define OB_BASE ((uint32_t)0x1FF80000) /*!< FLASH Option Bytes base address */ + +#define DMA1_BASE (AHBPERIPH_BASE + 0x6000) +#define DMA1_Channel1_BASE (DMA1_BASE + 0x0008) +#define DMA1_Channel2_BASE (DMA1_BASE + 0x001C) +#define DMA1_Channel3_BASE (DMA1_BASE + 0x0030) +#define DMA1_Channel4_BASE (DMA1_BASE + 0x0044) +#define DMA1_Channel5_BASE (DMA1_BASE + 0x0058) +#define DMA1_Channel6_BASE (DMA1_BASE + 0x006C) +#define DMA1_Channel7_BASE (DMA1_BASE + 0x0080) + +#define DMA2_BASE (AHBPERIPH_BASE + 0x6400) +#define DMA2_Channel1_BASE (DMA2_BASE + 0x0008) +#define DMA2_Channel2_BASE (DMA2_BASE + 0x001C) +#define DMA2_Channel3_BASE (DMA2_BASE + 0x0030) +#define DMA2_Channel4_BASE (DMA2_BASE + 0x0044) +#define DMA2_Channel5_BASE (DMA2_BASE + 0x0058) + +#define AES_BASE ((uint32_t)0x50060000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ + +#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define LCD ((LCD_TypeDef *) LCD_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) +#define COMP ((COMP_TypeDef *) COMP_BASE) +#define RI ((RI_TypeDef *) RI_BASE) +#define OPAMP ((OPAMP_TypeDef *) OPAMP_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) + +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC ((ADC_Common_TypeDef *) ADC_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) + +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) + +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) + +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) + +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define OB ((OB_TypeDef *) OB_BASE) + +#define AES ((AES_TypeDef *) AES_BASE) + +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) + +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + +/** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers Bits Definition */ +/******************************************************************************/ +/******************************************************************************/ +/* */ +/* Analog to Digital Converter (ADC) */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD ((uint32_t)0x00000001) /*!< Analog watchdog flag */ +#define ADC_SR_EOC ((uint32_t)0x00000002) /*!< End of conversion */ +#define ADC_SR_JEOC ((uint32_t)0x00000004) /*!< Injected channel end of conversion */ +#define ADC_SR_JSTRT ((uint32_t)0x00000008) /*!< Injected channel Start flag */ +#define ADC_SR_STRT ((uint32_t)0x00000010) /*!< Regular channel Start flag */ +#define ADC_SR_OVR ((uint32_t)0x00000020) /*!< Overrun flag */ +#define ADC_SR_ADONS ((uint32_t)0x00000040) /*!< ADC ON status */ +#define ADC_SR_RCNR ((uint32_t)0x00000100) /*!< Regular channel not ready flag */ +#define ADC_SR_JCNR ((uint32_t)0x00000200) /*!< Injected channel not ready flag */ + +/******************* Bit definition for ADC_CR1 register ********************/ +#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ +#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ +#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ +#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ +#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ +#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ +#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ +#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ + +#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ +#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ +#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ + +#define ADC_CR1_PDD ((uint32_t)0x00010000) /*!< Power Down during Delay phase */ +#define ADC_CR1_PDI ((uint32_t)0x00020000) /*!< Power Down during Idle phase */ + +#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ +#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ + +#define ADC_CR1_RES ((uint32_t)0x03000000) /*!< RES[1:0] bits (Resolution) */ +#define ADC_CR1_RES_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_CR1_RES_1 ((uint32_t)0x02000000) /*!< Bit 1 */ + +#define ADC_CR1_OVRIE ((uint32_t)0x04000000) /*!< Overrun interrupt enable */ + +/******************* Bit definition for ADC_CR2 register ********************/ +#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ +#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ +#define ADC_CR2_CFG ((uint32_t)0x00000004) /*!< ADC Configuration */ + +#define ADC_CR2_DELS ((uint32_t)0x00000070) /*!< DELS[2:0] bits (Delay selection) */ +#define ADC_CR2_DELS_0 ((uint32_t)0x00000010) /*!< Bit 0 */ +#define ADC_CR2_DELS_1 ((uint32_t)0x00000020) /*!< Bit 1 */ +#define ADC_CR2_DELS_2 ((uint32_t)0x00000040) /*!< Bit 2 */ + +#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ +#define ADC_CR2_DDS ((uint32_t)0x00000200) /*!< DMA disable selection (Single ADC) */ +#define ADC_CR2_EOCS ((uint32_t)0x00000400) /*!< End of conversion selection */ +#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ + +#define ADC_CR2_JEXTSEL ((uint32_t)0x000F0000) /*!< JEXTSEL[3:0] bits (External event select for injected group) */ +#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00040000) /*!< Bit 2 */ +#define ADC_CR2_JEXTSEL_3 ((uint32_t)0x00080000) /*!< Bit 3 */ + +#define ADC_CR2_JEXTEN ((uint32_t)0x00300000) /*!< JEXTEN[1:0] bits (External Trigger Conversion mode for injected channels) */ +#define ADC_CR2_JEXTEN_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_CR2_JEXTEN_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +#define ADC_CR2_JSWSTART ((uint32_t)0x00400000) /*!< Start Conversion of injected channels */ + +#define ADC_CR2_EXTSEL ((uint32_t)0x0F000000) /*!< EXTSEL[3:0] bits (External Event Select for regular group) */ +#define ADC_CR2_EXTSEL_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_CR2_EXTSEL_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_CR2_EXTSEL_2 ((uint32_t)0x04000000) /*!< Bit 2 */ +#define ADC_CR2_EXTSEL_3 ((uint32_t)0x08000000) /*!< Bit 3 */ + +#define ADC_CR2_EXTEN ((uint32_t)0x30000000) /*!< EXTEN[1:0] bits (External Trigger Conversion mode for regular channels) */ +#define ADC_CR2_EXTEN_0 ((uint32_t)0x10000000) /*!< Bit 0 */ +#define ADC_CR2_EXTEN_1 ((uint32_t)0x20000000) /*!< Bit 1 */ + +#define ADC_CR2_SWSTART ((uint32_t)0x40000000) /*!< Start Conversion of regular channels */ + +/****************** Bit definition for ADC_SMPR1 register *******************/ +#define ADC_SMPR1_SMP20 ((uint32_t)0x00000007) /*!< SMP20[2:0] bits (Channel 20 Sample time selection) */ +#define ADC_SMPR1_SMP20_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR1_SMP20_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR1_SMP20_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP21 ((uint32_t)0x00000038) /*!< SMP21[2:0] bits (Channel 21 Sample time selection) */ +#define ADC_SMPR1_SMP21_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR1_SMP21_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR1_SMP21_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP22 ((uint32_t)0x000001C0) /*!< SMP22[2:0] bits (Channel 22 Sample time selection) */ +#define ADC_SMPR1_SMP22_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR1_SMP22_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR1_SMP22_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP23 ((uint32_t)0x00000E00) /*!< SMP23[2:0] bits (Channel 23 Sample time selection) */ +#define ADC_SMPR1_SMP23_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR1_SMP23_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR1_SMP23_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP24 ((uint32_t)0x00007000) /*!< SMP24[2:0] bits (Channel 24 Sample time selection) */ +#define ADC_SMPR1_SMP24_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP24_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP24_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP25 ((uint32_t)0x00038000) /*!< SMP25[2:0] bits (Channel 25 Sample time selection) */ +#define ADC_SMPR1_SMP25_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP25_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP25_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP26 ((uint32_t)0x001C0000) /*!< SMP26[2:0] bits (Channel 26 Sample time selection) */ +#define ADC_SMPR1_SMP26_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP26_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP26_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP27 ((uint32_t)0x00E00000) /*!< SMP27[2:0] bits (Channel 27 Sample time selection) */ +#define ADC_SMPR1_SMP27_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP27_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP27_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP28 ((uint32_t)0x07000000) /*!< SMP28[2:0] bits (Channel 28 Sample time selection) */ +#define ADC_SMPR1_SMP28_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP28_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP28_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR1_SMP29 ((uint32_t)0x38000000) /*!< SMP29[2:0] bits (Channel 29 Sample time selection) */ +#define ADC_SMPR1_SMP29_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR1_SMP29_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR1_SMP29_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_SMPR2 register *******************/ +#define ADC_SMPR2_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMPR2_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR2_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR2_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMPR2_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR2_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR2_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMPR2_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR2_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR2_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMPR2_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR2_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR2_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMPR2_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMPR2_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMPR2_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMPR2_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP18 ((uint32_t)0x07000000) /*!< SMP18[2:0] bits (Channel 18 Sample time selection) */ +#define ADC_SMPR2_SMP18_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP18_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP18_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR2_SMP19 ((uint32_t)0x38000000) /*!< SMP19[2:0] bits (Channel 19 Sample time selection) */ +#define ADC_SMPR2_SMP19_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR2_SMP19_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR2_SMP19_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_SMPR3 register *******************/ +#define ADC_SMPR3_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMPR3_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR3_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR3_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMPR3_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR3_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR3_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMPR3_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ +#define ADC_SMPR3_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ +#define ADC_SMPR3_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMPR3_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ +#define ADC_SMPR3_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ +#define ADC_SMPR3_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMPR3_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMPR3_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMPR3_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMPR3_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMPR3_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMPR3_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ +#define ADC_SMPR3_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ +#define ADC_SMPR3_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ + +/****************** Bit definition for ADC_JOFR1 register *******************/ +#define ADC_JOFR1_JOFFSET1 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_JOFR2 register *******************/ +#define ADC_JOFR2_JOFFSET2 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_JOFR3 register *******************/ +#define ADC_JOFR3_JOFFSET3 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_JOFR4 register *******************/ +#define ADC_JOFR4_JOFFSET4 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_HTR register ********************/ +#define ADC_HTR_HT ((uint32_t)0x00000FFF) /*!< Analog watchdog high threshold */ + +/******************* Bit definition for ADC_LTR register ********************/ +#define ADC_LTR_LT ((uint32_t)0x00000FFF) /*!< Analog watchdog low threshold */ + +/******************* Bit definition for ADC_SQR1 register *******************/ +#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ +#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ + +#define ADC_SQR1_SQ28 ((uint32_t)0x000F8000) /*!< SQ28[4:0] bits (25th conversion in regular sequence) */ +#define ADC_SQR1_SQ28_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR1_SQ28_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR1_SQ28_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR1_SQ28_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR1_SQ28_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR1_SQ27 ((uint32_t)0x00007C00) /*!< SQ27[4:0] bits (27th conversion in regular sequence) */ +#define ADC_SQR1_SQ27_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR1_SQ27_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR1_SQ27_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR1_SQ27_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR1_SQ27_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR1_SQ26 ((uint32_t)0x000003E0) /*!< SQ26[4:0] bits (26th conversion in regular sequence) */ +#define ADC_SQR1_SQ26_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR1_SQ26_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR1_SQ26_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR1_SQ26_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR1_SQ26_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR1_SQ25 ((uint32_t)0x0000001F) /*!< SQ25[4:0] bits (25th conversion in regular sequence) */ +#define ADC_SQR1_SQ25_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR1_SQ25_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR1_SQ25_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR1_SQ25_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR1_SQ25_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR2 register *******************/ +#define ADC_SQR2_SQ19 ((uint32_t)0x0000001F) /*!< SQ19[4:0] bits (19th conversion in regular sequence) */ +#define ADC_SQR2_SQ19_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR2_SQ19_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR2_SQ19_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR2_SQ19_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR2_SQ19_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR2_SQ20 ((uint32_t)0x000003E0) /*!< SQ20[4:0] bits (20th conversion in regular sequence) */ +#define ADC_SQR2_SQ20_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR2_SQ20_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR2_SQ20_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR2_SQ20_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR2_SQ20_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR2_SQ21 ((uint32_t)0x00007C00) /*!< SQ21[4:0] bits (21th conversion in regular sequence) */ +#define ADC_SQR2_SQ21_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR2_SQ21_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR2_SQ21_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR2_SQ21_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR2_SQ21_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ22 ((uint32_t)0x000F8000) /*!< SQ22[4:0] bits (22th conversion in regular sequence) */ +#define ADC_SQR2_SQ22_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR2_SQ22_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR2_SQ22_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR2_SQ22_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR2_SQ22_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ23 ((uint32_t)0x01F00000) /*!< SQ23[4:0] bits (23th conversion in regular sequence) */ +#define ADC_SQR2_SQ23_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR2_SQ23_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR2_SQ23_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR2_SQ23_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR2_SQ23_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR2_SQ24 ((uint32_t)0x3E000000) /*!< SQ24[4:0] bits (24th conversion in regular sequence) */ +#define ADC_SQR2_SQ24_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR2_SQ24_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR2_SQ24_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR2_SQ24_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR2_SQ24_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR3 register *******************/ +#define ADC_SQR3_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQR3_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR3_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR3_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR3_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR3_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR3_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQR3_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR3_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR3_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR3_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR3_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR3_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQR3_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR3_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR3_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR3_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR3_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQR3_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR3_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR3_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR3_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR3_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ17 ((uint32_t)0x01F00000) /*!< SQ17[4:0] bits (17th conversion in regular sequence) */ +#define ADC_SQR3_SQ17_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR3_SQ17_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR3_SQ17_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR3_SQ17_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR3_SQ17_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR3_SQ18 ((uint32_t)0x3E000000) /*!< SQ18[4:0] bits (18th conversion in regular sequence) */ +#define ADC_SQR3_SQ18_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR3_SQ18_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR3_SQ18_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR3_SQ18_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR3_SQ18_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR4 register *******************/ +#define ADC_SQR4_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQR4_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR4_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR4_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR4_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR4_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR4_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQR4_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR4_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR4_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR4_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR4_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR4_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQR4_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR4_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR4_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR4_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR4_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR4_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQR4_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR4_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR4_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR4_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR4_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR4_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQR4_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR4_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR4_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR4_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR4_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR4_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQR4_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR4_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR4_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR4_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR4_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + +/******************* Bit definition for ADC_SQR5 register *******************/ +#define ADC_SQR5_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQR5_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SQR5_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SQR5_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_SQR5_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_SQR5_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_SQR5_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQR5_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_SQR5_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_SQR5_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_SQR5_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_SQR5_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_SQR5_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQR5_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_SQR5_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_SQR5_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_SQR5_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_SQR5_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_SQR5_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQR5_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_SQR5_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_SQR5_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_SQR5_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_SQR5_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_SQR5_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQR5_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_SQR5_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ +#define ADC_SQR5_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ +#define ADC_SQR5_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ +#define ADC_SQR5_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ + +#define ADC_SQR5_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQR5_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ +#define ADC_SQR5_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ +#define ADC_SQR5_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ +#define ADC_SQR5_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ +#define ADC_SQR5_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ + + +/******************* Bit definition for ADC_JSQR register *******************/ +#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ +#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ +#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ +#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ +#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ +#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ +#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ +#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ + +#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ +#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ +#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ +#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ +#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ + +#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ +#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ +#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ + +/******************* Bit definition for ADC_JDR1 register *******************/ +#define ADC_JDR1_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR2 register *******************/ +#define ADC_JDR2_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR3 register *******************/ +#define ADC_JDR3_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ + +/******************* Bit definition for ADC_JDR4 register *******************/ +#define ADC_JDR4_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ + +/******************** Bit definition for ADC_DR register ********************/ +#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ + +/****************** Bit definition for ADC_SMPR0 register *******************/ +#define ADC_SMPR3_SMP30 ((uint32_t)0x00000007) /*!< SMP30[2:0] bits (Channel 30 Sample time selection) */ +#define ADC_SMPR3_SMP30_0 ((uint32_t)0x00000001) /*!< Bit 0 */ +#define ADC_SMPR3_SMP30_1 ((uint32_t)0x00000002) /*!< Bit 1 */ +#define ADC_SMPR3_SMP30_2 ((uint32_t)0x00000004) /*!< Bit 2 */ + +#define ADC_SMPR3_SMP31 ((uint32_t)0x00000038) /*!< SMP31[2:0] bits (Channel 31 Sample time selection) */ +#define ADC_SMPR3_SMP31_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define ADC_SMPR3_SMP31_1 ((uint32_t)0x00000010) /*!< Bit 1 */ +#define ADC_SMPR3_SMP31_2 ((uint32_t)0x00000020) /*!< Bit 2 */ + +/******************* Bit definition for ADC_CSR register ********************/ +#define ADC_CSR_AWD1 ((uint32_t)0x00000001) /*!< ADC1 Analog watchdog flag */ +#define ADC_CSR_EOC1 ((uint32_t)0x00000002) /*!< ADC1 End of conversion */ +#define ADC_CSR_JEOC1 ((uint32_t)0x00000004) /*!< ADC1 Injected channel end of conversion */ +#define ADC_CSR_JSTRT1 ((uint32_t)0x00000008) /*!< ADC1 Injected channel Start flag */ +#define ADC_CSR_STRT1 ((uint32_t)0x00000010) /*!< ADC1 Regular channel Start flag */ +#define ADC_CSR_OVR1 ((uint32_t)0x00000020) /*!< ADC1 overrun flag */ +#define ADC_CSR_ADONS1 ((uint32_t)0x00000040) /*!< ADON status of ADC1 */ + +/******************* Bit definition for ADC_CCR register ********************/ +#define ADC_CCR_ADCPRE ((uint32_t)0x00030000) /*!< ADC prescaler*/ +#define ADC_CCR_ADCPRE_0 ((uint32_t)0x00010000) /*!< Bit 0 */ +#define ADC_CCR_ADCPRE_1 ((uint32_t)0x00020000) /*!< Bit 1 */ +#define ADC_CCR_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ + +/******************************************************************************/ +/* */ +/* Advanced Encryption Standard (AES) */ +/* */ +/******************************************************************************/ +/******************* Bit definition for AES_CR register *********************/ +#define AES_CR_EN ((uint32_t)0x00000001) /*!< AES Enable */ +#define AES_CR_DATATYPE ((uint32_t)0x00000006) /*!< Data type selection */ +#define AES_CR_DATATYPE_0 ((uint32_t)0x00000002) /*!< Bit 0 */ +#define AES_CR_DATATYPE_1 ((uint32_t)0x00000004) /*!< Bit 1 */ + +#define AES_CR_MODE ((uint32_t)0x00000018) /*!< AES Mode Of Operation */ +#define AES_CR_MODE_0 ((uint32_t)0x00000008) /*!< Bit 0 */ +#define AES_CR_MODE_1 ((uint32_t)0x00000010) /*!< Bit 1 */ + +#define AES_CR_CHMOD ((uint32_t)0x00000060) /*!< AES Chaining Mode */ +#define AES_CR_CHMOD_0 ((uint32_t)0x00000020) /*!< Bit 0 */ +#define AES_CR_CHMOD_1 ((uint32_t)0x00000040) /*!< Bit 1 */ + +#define AES_CR_CCFC ((uint32_t)0x00000080) /*!< Computation Complete Flag Clear */ +#define AES_CR_ERRC ((uint32_t)0x00000100) /*!< Error Clear */ +#define AES_CR_CCIE ((uint32_t)0x00000200) /*!< Computation Complete Interrupt Enable */ +#define AES_CR_ERRIE ((uint32_t)0x00000400) /*!< Error Interrupt Enable */ +#define AES_CR_DMAINEN ((uint32_t)0x00000800) /*!< DMA ENable managing the data input phase */ +#define AES_CR_DMAOUTEN ((uint32_t)0x00001000) /*!< DMA Enable managing the data output phase */ + +/******************* Bit definition for AES_SR register *********************/ +#define AES_SR_CCF ((uint32_t)0x00000001) /*!< Computation Complete Flag */ +#define AES_SR_RDERR ((uint32_t)0x00000002) /*!< Read Error Flag */ +#define AES_SR_WRERR ((uint32_t)0x00000004) /*!< Write Error Flag */ + +/******************* Bit definition for AES_DINR register *******************/ +#define AES_DINR ((uint32_t)0x0000FFFF) /*!< AES Data Input Register */ + +/******************* Bit definition for AES_DOUTR register ******************/ +#define AES_DOUTR ((uint32_t)0x0000FFFF) /*!< AES Data Output Register */ + +/******************* Bit definition for AES_KEYR0 register ******************/ +#define AES_KEYR0 ((uint32_t)0x0000FFFF) /*!< AES Key Register 0 */ + +/******************* Bit definition for AES_KEYR1 register ******************/ +#define AES_KEYR1 ((uint32_t)0x0000FFFF) /*!< AES Key Register 1 */ + +/******************* Bit definition for AES_KEYR2 register ******************/ +#define AES_KEYR2 ((uint32_t)0x0000FFFF) /*!< AES Key Register 2 */ + +/******************* Bit definition for AES_KEYR3 register ******************/ +#define AES_KEYR3 ((uint32_t)0x0000FFFF) /*!< AES Key Register 3 */ + +/******************* Bit definition for AES_IVR0 register *******************/ +#define AES_IVR0 ((uint32_t)0x0000FFFF) /*!< AES Initialization Vector Register 0 */ + +/******************* Bit definition for AES_IVR1 register *******************/ +#define AES_IVR1 ((uint32_t)0x0000FFFF) /*!< AES Initialization Vector Register 1 */ + +/******************* Bit definition for AES_IVR2 register *******************/ +#define AES_IVR2 ((uint32_t)0x0000FFFF) /*!< AES Initialization Vector Register 2 */ + +/******************* Bit definition for AES_IVR3 register *******************/ +#define AES_IVR3 ((uint32_t)0x0000FFFF) /*!< AES Initialization Vector Register 3 */ + +/******************************************************************************/ +/* */ +/* Analog Comparators (COMP) */ +/* */ +/******************************************************************************/ + +/****************** Bit definition for COMP_CSR register ********************/ +#define COMP_CSR_10KPU ((uint32_t)0x00000001) /*!< 10K pull-up resistor */ +#define COMP_CSR_400KPU ((uint32_t)0x00000002) /*!< 400K pull-up resistor */ +#define COMP_CSR_10KPD ((uint32_t)0x00000004) /*!< 10K pull-down resistor */ +#define COMP_CSR_400KPD ((uint32_t)0x00000008) /*!< 400K pull-down resistor */ + +#define COMP_CSR_CMP1EN ((uint32_t)0x00000010) /*!< Comparator 1 enable */ +#define COMP_CSR_SW1 ((uint32_t)0x00000020) /*!< SW1 analog switch enable */ +#define COMP_CSR_CMP1OUT ((uint32_t)0x00000080) /*!< Comparator 1 output */ + +#define COMP_CSR_SPEED ((uint32_t)0x00001000) /*!< Comparator 2 speed */ +#define COMP_CSR_CMP2OUT ((uint32_t)0x00002000) /*!< Comparator 2 ouput */ + +#define COMP_CSR_VREFOUTEN ((uint32_t)0x00010000) /*!< Comparator Vref Enable */ +#define COMP_CSR_WNDWE ((uint32_t)0x00020000) /*!< Window mode enable */ + +#define COMP_CSR_INSEL ((uint32_t)0x001C0000) /*!< INSEL[2:0] Inversion input Selection */ +#define COMP_CSR_INSEL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ +#define COMP_CSR_INSEL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ +#define COMP_CSR_INSEL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ + +#define COMP_CSR_OUTSEL ((uint32_t)0x00E00000) /*!< OUTSEL[2:0] comparator 2 output redirection */ +#define COMP_CSR_OUTSEL_0 ((uint32_t)0x00200000) /*!< Bit 0 */ +#define COMP_CSR_OUTSEL_1 ((uint32_t)0x00400000) /*!< Bit 1 */ +#define COMP_CSR_OUTSEL_2 ((uint32_t)0x00800000) /*!< Bit 2 */ + +#define COMP_CSR_FCH3 ((uint32_t)0x04000000) /*!< Bit 26 */ +#define COMP_CSR_FCH8 ((uint32_t)0x08000000) /*!< Bit 27 */ +#define COMP_CSR_RCH13 ((uint32_t)0x10000000) /*!< Bit 28 */ + +#define COMP_CSR_CAIE ((uint32_t)0x20000000) /*!< Bit 29 */ +#define COMP_CSR_CAIF ((uint32_t)0x40000000) /*!< Bit 30 */ +#define COMP_CSR_TSUSP ((uint32_t)0x80000000) /*!< Bit 31 */ + +/******************************************************************************/ +/* */ +/* Operational Amplifier (OPAMP) */ +/* */ +/******************************************************************************/ +/******************* Bit definition for OPAMP_CSR register ******************/ +#define OPAMP_CSR_OPA1PD ((uint32_t)0x00000001) /*!< OPAMP1 disable */ +#define OPAMP_CSR_S3SEL1 ((uint32_t)0x00000002) /*!< Switch 3 for OPAMP1 Enable */ +#define OPAMP_CSR_S4SEL1 ((uint32_t)0x00000004) /*!< Switch 4 for OPAMP1 Enable */ +#define OPAMP_CSR_S5SEL1 ((uint32_t)0x00000008) /*!< Switch 5 for OPAMP1 Enable */ +#define OPAMP_CSR_S6SEL1 ((uint32_t)0x00000010) /*!< Switch 6 for OPAMP1 Enable */ +#define OPAMP_CSR_OPA1CAL_L ((uint32_t)0x00000020) /*!< OPAMP1 Offset calibration for P differential pair */ +#define OPAMP_CSR_OPA1CAL_H ((uint32_t)0x00000040) /*!< OPAMP1 Offset calibration for N differential pair */ +#define OPAMP_CSR_OPA1LPM ((uint32_t)0x00000080) /*!< OPAMP1 Low power enable */ +#define OPAMP_CSR_OPA2PD ((uint32_t)0x00000100) /*!< OPAMP2 disable */ +#define OPAMP_CSR_S3SEL2 ((uint32_t)0x00000200) /*!< Switch 3 for OPAMP2 Enable */ +#define OPAMP_CSR_S4SEL2 ((uint32_t)0x00000400) /*!< Switch 4 for OPAMP2 Enable */ +#define OPAMP_CSR_S5SEL2 ((uint32_t)0x00000800) /*!< Switch 5 for OPAMP2 Enable */ +#define OPAMP_CSR_S6SEL2 ((uint32_t)0x00001000) /*!< Switch 6 for OPAMP2 Enable */ +#define OPAMP_CSR_OPA2CAL_L ((uint32_t)0x00002000) /*!< OPAMP2 Offset calibration for P differential pair */ +#define OPAMP_CSR_OPA2CAL_H ((uint32_t)0x00004000) /*!< OPAMP2 Offset calibration for N differential pair */ +#define OPAMP_CSR_OPA2LPM ((uint32_t)0x00008000) /*!< OPAMP2 Low power enable */ +#define OPAMP_CSR_OPA3PD ((uint32_t)0x00010000) /*!< OPAMP3 disable */ +#define OPAMP_CSR_S3SEL3 ((uint32_t)0x00020000) /*!< Switch 3 for OPAMP3 Enable */ +#define OPAMP_CSR_S4SEL3 ((uint32_t)0x00040000) /*!< Switch 4 for OPAMP3 Enable */ +#define OPAMP_CSR_S5SEL3 ((uint32_t)0x00080000) /*!< Switch 5 for OPAMP3 Enable */ +#define OPAMP_CSR_S6SEL3 ((uint32_t)0x00100000) /*!< Switch 6 for OPAMP3 Enable */ +#define OPAMP_CSR_OPA3CAL_L ((uint32_t)0x00200000) /*!< OPAMP3 Offset calibration for P differential pair */ +#define OPAMP_CSR_OPA3CAL_H ((uint32_t)0x00400000) /*!< OPAMP3 Offset calibration for N differential pair */ +#define OPAMP_CSR_OPA3LPM ((uint32_t)0x00800000) /*!< OPAMP3 Low power enable */ +#define OPAMP_CSR_ANAWSEL1 ((uint32_t)0x01000000) /*!< Switch ANA Enable for OPAMP1 */ +#define OPAMP_CSR_ANAWSEL2 ((uint32_t)0x02000000) /*!< Switch ANA Enable for OPAMP2 */ +#define OPAMP_CSR_ANAWSEL3 ((uint32_t)0x04000000) /*!< Switch ANA Enable for OPAMP3 */ +#define OPAMP_CSR_S7SEL2 ((uint32_t)0x08000000) /*!< Switch 7 for OPAMP2 Enable */ +#define OPAMP_CSR_AOP_RANGE ((uint32_t)0x10000000) /*!< Power range selection */ +#define OPAMP_CSR_OPA1CALOUT ((uint32_t)0x20000000) /*!< OPAMP1 calibration output */ +#define OPAMP_CSR_OPA2CALOUT ((uint32_t)0x40000000) /*!< OPAMP2 calibration output */ +#define OPAMP_CSR_OPA3CALOUT ((uint32_t)0x80000000) /*!< OPAMP3 calibration output */ + +/******************* Bit definition for OPAMP_OTR register ******************/ +#define OPAMP_OTR_AO1_OPT_OFFSET_TRIM ((uint32_t)0x000003FF) /*!< Offset trim for OPAMP1 */ +#define OPAMP_OTR_AO2_OPT_OFFSET_TRIM ((uint32_t)0x000FFC00) /*!< Offset trim for OPAMP2 */ +#define OPAMP_OTR_AO3_OPT_OFFSET_TRIM ((uint32_t)0x3FF00000) /*!< Offset trim for OPAMP2 */ +#define OPAMP_OTR_OT_USER ((uint32_t)0x80000000) /*!< Switch to OPAMP offset user trimmed values */ + +/******************* Bit definition for OPAMP_LPOTR register ****************/ +#define OPAMP_LP_OTR_AO1_OPT_OFFSET_TRIM_LP ((uint32_t)0x000003FF) /*!< Offset trim in low power for OPAMP1 */ +#define OPAMP_LP_OTR_AO2_OPT_OFFSET_TRIM_LP ((uint32_t)0x000FFC00) /*!< Offset trim in low power for OPAMP2 */ +#define OPAMP_LP_OTR_AO3_OPT_OFFSET_TRIM_LP ((uint32_t)0x3FF00000) /*!< Offset trim in low power for OPAMP3 */ + +/******************************************************************************/ +/* */ +/* CRC calculation unit (CRC) */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET ((uint32_t)0x00000001) /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Digital to Analog Converter (DAC) */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for DAC_CR register ********************/ +#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!
© COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l1xx_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32L1XX_H +#define __SYSTEM_STM32L1XX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32L1xx_System_Includes + * @{ + */ + +/** + * @} + */ + + +/** @addtogroup STM32L1xx_System_Exported_types + * @{ + */ + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32L1XX_H */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Release_Notes.html b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Release_Notes.html new file mode 100644 index 0000000..0735f01 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Release_Notes.html @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + +Release Notes for STM32L1xx CMSIS + + + + + +
+


+

+
+ + + + + + +
+ + + + + + +
+ +

Release +Notes for STM32L1xx CMSIS
+

+

Copyright +© 2013 STMicroelectronics

+

+
+

 

+ + + + + + +
+

Contents

+
    +
  1. STM32L1xx CMSIS update history
  2. +
  3. License
  4. +
+

STM32L1xx CMSIS update history


+

V1.2.0 / 22-February-2013

+ + +

Main +Changes

+ + + +
    +
  • stm32l1xx.h
  • +
      +
    • List of supported devices: add reference to STM32L100xx Ultra Low Power Value Line devices
    • +
    +
      +
    • Add SPRMOD bit definition in FLASH_OBR register
    • +
    • Add RDERR bit definition in FLASH_SR register
    • + +
    +
      +
    • Rename FLASH_OBR_nRST_BFB2 to FLASH_OBR_BFB2
    • +
    +
      +
    • Delete FLASH_OBR_USER define (useless)
      +
    • +
    +
+ +

V1.1.1 / 05-March-2012

+

Main +Changes

+ +
  • All source files: license disclaimer text update and add link to the License file on ST Internet.

V1.1.0 / 24-January-2012

+

Main +Changes

+ +
    +
  • Alpha version for STM32L1xx High-density and Medium-density Plus devices.
  • +
  • Add support for STM32L1xx High-density and Medium-density Plus devices:
  • +
      +
    • Add new product define: "#define STM32L1XX_MDP"
    • +
    • Add new product define: "#define STM32L1XX_HD"
    • + +
    + +
      +
    • Change the library version to V1.1.0
      +
    • +
    +
      +
    • Add new IRQ to support STM32L1XX_HD and STM32L1XX_MDP vector table
    • +
    +
      +
    • Add new and update some Typedef to support new peripherals (AES, SDIO, OPAMP, FSMC, I2S)
    • +
    +
      +
    • Add new peripherals address mapping
    • +
    +
      +
    • Update bits definition
    • +
    +
  • Add new startup file "startup_stm32l1xx_mdp.s" for all toolchains
  • +
  • Add new startup file "startup_stm32l1xx_hd.s" for all toolchains
  • +
  • Change the RTC "CAL" register name to "CALR"
  • +
  • Update registers bits definitions.
    + +
  • +
+ + +

V1.0.0 / 31-December-2010

Main +Changes

+
  • 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/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TASKING/cstart_thumb2.asm b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TASKING/cstart_thumb2.asm new file mode 100644 index 0000000..85626cd --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TASKING/cstart_thumb2.asm @@ -0,0 +1,140 @@ + + +;; NOTE: To allow the use of this file for both ARMv6M and ARMv7M, +;; we will only use 16-bit Thumb intructions. + + .extern _lc_ub_stack ; usr/sys mode stack pointer + .extern _lc_ue_stack ; symbol required by debugger + .extern _lc_ub_table ; ROM to RAM copy table + .extern main + .extern _Exit + .extern exit + .weak exit + .global __get_argcv + .weak __get_argcv + .extern __argcvbuf + .weak __argcvbuf + ;;.extern __init_hardware + .extern SystemInit + + .if @defined('__PROF_ENABLE__') + .extern __prof_init + .endif + .if @defined('__POSIX__') + .extern posix_main + .extern _posix_boot_stack_top + .endif + + .global _START + + .section .text.cstart + + .thumb +_START: + ;; anticipate possible ROM/RAM remapping + ;; by loading the 'real' program address + ldr r1,=_Next + bx r1 +_Next: + ;; initialize the stack pointer + ldr r1,=_lc_ub_stack ; TODO: make this part of the vector table + mov sp,r1 + + ;; call a user function which initializes function. + bl SystemInit + + ;; copy initialized sections from ROM to RAM + ;; and clear uninitialized data sections in RAM + + ldr r3,=_lc_ub_table + movs r0,#0 +cploop: + ldr r4,[r3,#0] ; load type + ldr r5,[r3,#4] ; dst address + ldr r6,[r3,#8] ; src address + ldr r7,[r3,#12] ; size + + cmp r4,#1 + beq copy + cmp r4,#2 + beq clear + b done + +copy: + subs r7,r7,#1 + ldrb r1,[r6,r7] + strb r1,[r5,r7] + bne copy + + adds r3,r3,#16 + b cploop + +clear: + subs r7,r7,#1 + strb r0,[r5,r7] + bne clear + + adds r3,r3,#16 + b cploop + +done: + + .if @defined('__POSIX__') + + ;; posix stack buffer for system upbringing + ldr r0,=_posix_boot_stack_top + ldr r0, [r0] + mov sp,r0 + + .else + + ;; load r10 with end of USR/SYS stack, which is + ;; needed in case stack overflow checking is on + ;; NOTE: use 16-bit instructions only, for ARMv6M + ldr r0,=_lc_ue_stack + mov r10,r0 + + .endif + + .if @defined('__PROF_ENABLE__') + bl __prof_init + .endif + + .if @defined('__POSIX__') + ;; call posix_main with no arguments + bl posix_main + .else + ;; retrieve argc and argv (default argv[0]==NULL & argc==0) + bl __get_argcv + ldr r1,=__argcvbuf + ;; call main + bl main + .endif + + ;; call exit using the return value from main() + ;; Note. Calling exit will also run all functions + ;; that were supplied through atexit(). + bl exit + +__get_argcv: ; weak definition + movs r0,#0 + bx lr + + .ltorg + .endsec + + .calls '_START', ' ' + .calls '_START','__init_vector_table' + .if @defined('__PROF_ENABLE__') + .calls '_START','__prof_init' + .endif + .if @defined('__POSIX__') + .calls '_START','posix_main' + .else + .calls '_START','__get_argcv' + .calls '_START','main' + .endif + .calls '_START','exit' + .calls '_START','',0 + + .end diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_hd.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_hd.s new file mode 100644 index 0000000..e54a224 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_hd.s @@ -0,0 +1,424 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_hd.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power High-density Devices vector table for + * Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word AES_IRQHandler + .word COMP_ACQ_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power High-density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak COMP_ACQ_IRQHandler + .thumb_set COMP_ACQ_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_md.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_md.s new file mode 100644 index 0000000..697d259 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_md.s @@ -0,0 +1,376 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_md.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power Medium-density Devices vector table for + * Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power Medium-density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_mdp.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_mdp.s new file mode 100644 index 0000000..72540bc --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/startup_stm32l1xx_mdp.s @@ -0,0 +1,415 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_mdp.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power Medium-density Plus Devices vector table + * for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word 0 + .word 0 + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word AES_IRQHandler + .word COMP_ACQ_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power Medium-density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak COMP_ACQ_IRQHandler + .thumb_set COMP_ACQ_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_hd.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_hd.s new file mode 100644 index 0000000..d6a3617 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_hd.s @@ -0,0 +1,356 @@ +;******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_hd.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power High-density Devices vector +;* table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; +; 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. +; +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD AES_IRQHandler ; AES + DCD COMP_ACQ_IRQHandler ; Comparator Channel Acquisition + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT USB_HP_IRQHandler [WEAK] + EXPORT USB_LP_IRQHandler [WEAK] + EXPORT DAC_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT TIM9_IRQHandler [WEAK] + EXPORT TIM10_IRQHandler [WEAK] + EXPORT TIM11_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USB_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT COMP_ACQ_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +USB_HP_IRQHandler +USB_LP_IRQHandler +DAC_IRQHandler +COMP_IRQHandler +EXTI9_5_IRQHandler +LCD_IRQHandler +TIM9_IRQHandler +TIM10_IRQHandler +TIM11_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +USB_FS_WKUP_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +SDIO_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +AES_IRQHandler +COMP_ACQ_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_md.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_md.s new file mode 100644 index 0000000..3deea1a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_md.s @@ -0,0 +1,319 @@ +;******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_md.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power Medium-density Devices vector +;* table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; +; 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. +; +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT USB_HP_IRQHandler [WEAK] + EXPORT USB_LP_IRQHandler [WEAK] + EXPORT DAC_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT TIM9_IRQHandler [WEAK] + EXPORT TIM10_IRQHandler [WEAK] + EXPORT TIM11_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USB_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +USB_HP_IRQHandler +USB_LP_IRQHandler +DAC_IRQHandler +COMP_IRQHandler +EXTI9_5_IRQHandler +LCD_IRQHandler +TIM9_IRQHandler +TIM10_IRQHandler +TIM11_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +USB_FS_WKUP_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_mdp.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_mdp.s new file mode 100644 index 0000000..f46bebb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/arm/startup_stm32l1xx_mdp.s @@ -0,0 +1,350 @@ +;******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_mdp.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power Medium-density Plus Devices vector +;* table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; +; 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. +; +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD AES_IRQHandler ; AES + DCD COMP_ACQ_IRQHandler ; Comparator Channel Acquisition + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT USB_HP_IRQHandler [WEAK] + EXPORT USB_LP_IRQHandler [WEAK] + EXPORT DAC_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT TIM9_IRQHandler [WEAK] + EXPORT TIM10_IRQHandler [WEAK] + EXPORT TIM11_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USB_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT COMP_ACQ_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMPER_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +USB_HP_IRQHandler +USB_LP_IRQHandler +DAC_IRQHandler +COMP_IRQHandler +EXTI9_5_IRQHandler +LCD_IRQHandler +TIM9_IRQHandler +TIM10_IRQHandler +TIM11_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +USB_FS_WKUP_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +AES_IRQHandler +COMP_ACQ_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_hd.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_hd.s new file mode 100644 index 0000000..926aad7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_hd.s @@ -0,0 +1,419 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_hd.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power High-density Devices vector table for + * RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/******************************************************************************* +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word SDIO_IRQHandler + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word AES_IRQHandler + .word COMP_ACQ_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power High-density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak COMP_ACQ_IRQHandler + .thumb_set COMP_ACQ_IRQHandler,Default_Handler + +/************************* (C) COPYRIGHT STMicroelectronics *****END OF FILE***/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_md.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_md.s new file mode 100644 index 0000000..77a7f90 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_md.s @@ -0,0 +1,371 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_md.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power Medium-density Devices vector table for + * RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/******************************************************************************* +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power Medium-density devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + +/************************* (C) COPYRIGHT STMicroelectronics *****END OF FILE***/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_mdp.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_mdp.s new file mode 100644 index 0000000..e77df29 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7/startup_stm32l1xx_mdp.s @@ -0,0 +1,410 @@ +/** + ****************************************************************************** + * @file startup_stm32l1xx_mdp.s + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief STM32L1xx Ultra Low Power Medium-density Plus Devices vector table + * for RIDE7 toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF108F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/******************************************************************************* +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_IRQHandler + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word DAC_IRQHandler + .word COMP_IRQHandler + .word EXTI9_5_IRQHandler + .word LCD_IRQHandler + .word TIM9_IRQHandler + .word TIM10_IRQHandler + .word TIM11_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USB_FS_WKUP_IRQHandler + .word TIM6_IRQHandler + .word TIM7_IRQHandler + .word 0 + .word TIM5_IRQHandler + .word SPI3_IRQHandler + .word 0 + .word 0 + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word AES_IRQHandler + .word COMP_ACQ_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32L15x ULtra Low Power Medium-density Plus devices. */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_STAMP_IRQHandler + .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak COMP_IRQHandler + .thumb_set COMP_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak LCD_IRQHandler + .thumb_set LCD_IRQHandler,Default_Handler + + .weak TIM9_IRQHandler + .thumb_set TIM9_IRQHandler,Default_Handler + + .weak TIM10_IRQHandler + .thumb_set TIM10_IRQHandler,Default_Handler + + .weak TIM11_IRQHandler + .thumb_set TIM11_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USB_FS_WKUP_IRQHandler + .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM6_IRQHandler + .thumb_set TIM6_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak COMP_ACQ_IRQHandler + .thumb_set COMP_ACQ_IRQHandler,Default_Handler + +/************************* (C) COPYRIGHT STMicroelectronics *****END OF FILE***/ + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_hd.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_hd.s new file mode 100644 index 0000000..1623c24 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_hd.s @@ -0,0 +1,544 @@ +;/******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_hd.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power High-density Devices vector +;* table for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* +;* 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. +;* +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD SDIO_IRQHandler ; SDIO + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD AES_IRQHandler ; AES + DCD COMP_ACQ_IRQHandler ; Comparator Channel Acquisition + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + + PUBWEAK TAMPER_STAMP_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_STAMP_IRQHandler + B TAMPER_STAMP_IRQHandler + + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + + PUBWEAK USB_HP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_IRQHandler + B USB_HP_IRQHandler + + + PUBWEAK USB_LP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_IRQHandler + B USB_LP_IRQHandler + + + PUBWEAK DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +DAC_IRQHandler + B DAC_IRQHandler + + + PUBWEAK COMP_IRQHandler + SECTION .text:CODE:REORDER(1) +COMP_IRQHandler + B COMP_IRQHandler + + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + + PUBWEAK LCD_IRQHandler + SECTION .text:CODE:REORDER(1) +LCD_IRQHandler + B LCD_IRQHandler + + + PUBWEAK TIM9_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM9_IRQHandler + B TIM9_IRQHandler + + + PUBWEAK TIM10_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM10_IRQHandler + B TIM10_IRQHandler + + + PUBWEAK TIM11_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM11_IRQHandler + B TIM11_IRQHandler + + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + + PUBWEAK USB_FS_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_FS_WKUP_IRQHandler + B USB_FS_WKUP_IRQHandler + + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + + PUBWEAK DMA2_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + + PUBWEAK AES_IRQHandler + SECTION .text:CODE:REORDER(1) +AES_IRQHandler + B AES_IRQHandler + + + PUBWEAK COMP_ACQ_IRQHandler + SECTION .text:CODE:REORDER(1) +COMP_ACQ_IRQHandler + B COMP_ACQ_IRQHandler + + END +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_md.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_md.s new file mode 100644 index 0000000..0345e77 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_md.s @@ -0,0 +1,463 @@ +;/******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_md.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power Medium-density Devices vector +;* table for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* +;* 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. +;* +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + + PUBWEAK TAMPER_STAMP_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_STAMP_IRQHandler + B TAMPER_STAMP_IRQHandler + + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + + PUBWEAK USB_HP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_IRQHandler + B USB_HP_IRQHandler + + + PUBWEAK USB_LP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_IRQHandler + B USB_LP_IRQHandler + + + PUBWEAK DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +DAC_IRQHandler + B DAC_IRQHandler + + + PUBWEAK COMP_IRQHandler + SECTION .text:CODE:REORDER(1) +COMP_IRQHandler + B COMP_IRQHandler + + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + + PUBWEAK LCD_IRQHandler + SECTION .text:CODE:REORDER(1) +LCD_IRQHandler + B LCD_IRQHandler + + + PUBWEAK TIM9_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM9_IRQHandler + B TIM9_IRQHandler + + + PUBWEAK TIM10_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM10_IRQHandler + B TIM10_IRQHandler + + + PUBWEAK TIM11_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM11_IRQHandler + B TIM11_IRQHandler + + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + + PUBWEAK USB_FS_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_FS_WKUP_IRQHandler + B USB_FS_WKUP_IRQHandler + + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + END +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_mdp.s b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_mdp.s new file mode 100644 index 0000000..1dda076 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/iar/startup_stm32l1xx_mdp.s @@ -0,0 +1,520 @@ +;/******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** +;* File Name : startup_stm32l1xx_mdp.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 22-February-2013 +;* Description : STM32L1xx Ultra Low Power Medium-density Plus Devices vector +;* table for EWARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == __iar_program_start, +;* - Set the vector table entries with the exceptions ISR +;* address. +;* After Reset the Cortex-M3 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;******************************************************************************** +;* +;* 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. +;* +;*******************************************************************************/ +; +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EXTI Line detect + DCD TAMPER_STAMP_IRQHandler ; Tamper and Time Stamp + DCD RTC_WKUP_IRQHandler ; RTC Wakeup + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line 0 + DCD EXTI1_IRQHandler ; EXTI Line 1 + DCD EXTI2_IRQHandler ; EXTI Line 2 + DCD EXTI3_IRQHandler ; EXTI Line 3 + DCD EXTI4_IRQHandler ; EXTI Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD USB_HP_IRQHandler ; USB High Priority + DCD USB_LP_IRQHandler ; USB Low Priority + DCD DAC_IRQHandler ; DAC + DCD COMP_IRQHandler ; COMP through EXTI Line + DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 + DCD LCD_IRQHandler ; LCD + DCD TIM9_IRQHandler ; TIM9 + DCD TIM10_IRQHandler ; TIM10 + DCD TIM11_IRQHandler ; TIM11 + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 + DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line + DCD USB_FS_WKUP_IRQHandler ; USB FS Wakeup from suspend + DCD TIM6_IRQHandler ; TIM6 + DCD TIM7_IRQHandler ; TIM7 + DCD 0 ; Reserved + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD AES_IRQHandler ; AES + DCD COMP_ACQ_IRQHandler ; Comparator Channel Acquisition + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER(1) +HardFault_Handler + B HardFault_Handler + + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER(1) +MemManage_Handler + B MemManage_Handler + + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER(1) +BusFault_Handler + B BusFault_Handler + + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER(1) +SVC_Handler + B SVC_Handler + + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER(1) +PendSV_Handler + B PendSV_Handler + + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER(1) +SysTick_Handler + B SysTick_Handler + + + PUBWEAK WWDG_IRQHandler + SECTION .text:CODE:REORDER(1) +WWDG_IRQHandler + B WWDG_IRQHandler + + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER(1) +PVD_IRQHandler + B PVD_IRQHandler + + + PUBWEAK TAMPER_STAMP_IRQHandler + SECTION .text:CODE:REORDER(1) +TAMPER_STAMP_IRQHandler + B TAMPER_STAMP_IRQHandler + + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER(1) +RCC_IRQHandler + B RCC_IRQHandler + + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + + PUBWEAK USB_HP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_HP_IRQHandler + B USB_HP_IRQHandler + + + PUBWEAK USB_LP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_LP_IRQHandler + B USB_LP_IRQHandler + + + PUBWEAK DAC_IRQHandler + SECTION .text:CODE:REORDER(1) +DAC_IRQHandler + B DAC_IRQHandler + + + PUBWEAK COMP_IRQHandler + SECTION .text:CODE:REORDER(1) +COMP_IRQHandler + B COMP_IRQHandler + + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + + PUBWEAK LCD_IRQHandler + SECTION .text:CODE:REORDER(1) +LCD_IRQHandler + B LCD_IRQHandler + + + PUBWEAK TIM9_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM9_IRQHandler + B TIM9_IRQHandler + + + PUBWEAK TIM10_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM10_IRQHandler + B TIM10_IRQHandler + + + PUBWEAK TIM11_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM11_IRQHandler + B TIM11_IRQHandler + + + PUBWEAK TIM2_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM2_IRQHandler + B TIM2_IRQHandler + + + PUBWEAK TIM3_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM3_IRQHandler + B TIM3_IRQHandler + + + PUBWEAK TIM4_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM4_IRQHandler + B TIM4_IRQHandler + + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER(1) +USART3_IRQHandler + B USART3_IRQHandler + + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + + PUBWEAK USB_FS_WKUP_IRQHandler + SECTION .text:CODE:REORDER(1) +USB_FS_WKUP_IRQHandler + B USB_FS_WKUP_IRQHandler + + + PUBWEAK TIM6_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM6_IRQHandler + B TIM6_IRQHandler + + + PUBWEAK TIM7_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM7_IRQHandler + B TIM7_IRQHandler + + PUBWEAK TIM5_IRQHandler + SECTION .text:CODE:REORDER(1) +TIM5_IRQHandler + B TIM5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK AES_IRQHandler + SECTION .text:CODE:REORDER(1) +AES_IRQHandler + B AES_IRQHandler + + PUBWEAK COMP_ACQ_IRQHandler + SECTION .text:CODE:REORDER(1) +COMP_ACQ_IRQHandler + B COMP_ACQ_IRQHandler + + END +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c new file mode 100644 index 0000000..6f2c2d7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c @@ -0,0 +1,533 @@ +/** + ****************************************************************************** + * @file system_stm32l1xx.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32L1xx Ultra + * Low Power devices, and is generated by the clock configuration + * tool "STM32L1xx_Clock_Configuration_V1.1.0.xls". + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * and Divider factors, AHB/APBx prescalers and Flash settings), + * depending on the configuration made in the clock xls tool. + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l1xx_xx.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. + * + * 2. After each device reset the MSI (2.1 MHz Range) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l1xx_xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and MSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 8MHz, refer to "HSE_VALUE" define + * in "stm32l1xx.h" file. When HSE is used as system clock source, directly or + * through PLL, and you are using different crystal you have to adapt the HSE + * value to your own configuration. + * + * 5. This file configures the system clock as follows: + *============================================================================= + * System Clock Configuration + *============================================================================= + * System Clock source | PLL(HSE) + *----------------------------------------------------------------------------- + * SYSCLK | 32000000 Hz + *----------------------------------------------------------------------------- + * HCLK | 32000000 Hz + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * HSE Frequency | 8000000 Hz + *----------------------------------------------------------------------------- + * PLL DIV | 3 + *----------------------------------------------------------------------------- + * PLL MUL | 12 + *----------------------------------------------------------------------------- + * VDD | 3.3 V + *----------------------------------------------------------------------------- + * Vcore | 1.8 V (Range 1) + *----------------------------------------------------------------------------- + * Flash Latency | 1 WS + *----------------------------------------------------------------------------- + * SDIO clock (SDIOCLK) | 48000000 Hz + *----------------------------------------------------------------------------- + * Require 48MHz for USB clock | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT 2013 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l1xx_system + * @{ + */ + +/** @addtogroup STM32L1xx_System_Private_Includes + * @{ + */ + +#include "stm32l1xx.h" + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Defines + * @{ + */ + +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM32L152D_EVAL board as data memory */ +/* #define DATA_IN_ExtSRAM */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Variables + * @{ + */ +uint32_t SystemCoreClock = 32000000; +__I uint8_t PLLMulTable[9] = {3, 4, 6, 8, 12, 16, 24, 32, 48}; +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /*!< Set MSION bit */ + RCC->CR |= (uint32_t)0x00000100; + + /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */ + RCC->CFGR &= (uint32_t)0x88FFC00C; + + /*!< Reset HSION, HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xEEFEFFFE; + + /*!< Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ + RCC->CFGR &= (uint32_t)0xFF02FFFF; + + /*!< Disable all interrupts */ + RCC->CIR = 0x00000000; + +#ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM */ + + /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */ + SetSysClock(); + +#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 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 MSI, SystemCoreClock will contain the MSI + * value as defined by the MSI range. + * + * - 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 stm32l1xx.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 stm32l1xx.h file (default value + * 8 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. + * + * - 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, pllmul = 0, plldiv = 0, pllsource = 0, msirange = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; + SystemCoreClock = (32768 * (1 << (msirange + 1))); + break; + case 0x04: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x08: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x0C: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; + pllmul = PLLMulTable[(pllmul >> 18)]; + plldiv = (plldiv >> 22) + 1; + + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + + if (pllsource == 0x00) + { + /* HSI oscillator clock selected as PLL clock entry */ + SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv); + } + else + { + /* HSE selected as PLL clock entry */ + SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv); + } + break; + default: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; + SystemCoreClock = (32768 * (1 << (msirange + 1))); + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @brief Configures the System clock frequency, AHB/APBx prescalers and Flash + * settings. + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ +static void SetSysClock(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable 64-bit access */ + FLASH->ACR |= FLASH_ACR_ACC64; + + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTEN; + + /* Flash 1 wait state */ + FLASH->ACR |= FLASH_ACR_LATENCY; + + /* Power enable */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + + /* Select the Voltage Range 1 (1.8 V) */ + PWR->CR = PWR_CR_VOS_0; + + /* Wait Until the Voltage Regulator is ready */ + while((PWR->CSR & PWR_CSR_VOSF) != RESET) + { + } + + /* HCLK = SYSCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* PLL configuration */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL | + RCC_CFGR_PLLDIV)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL12 | RCC_CFGR_PLLDIV3); + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)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 */ + } +} + +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in SystemInit() function before jump to main. + * This function configures the external SRAM mounted on STM32L152D_EVAL board + * This SRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ +/*-- GPIOs Configuration -----------------------------------------------------*/ +/* + +-------------------+--------------------+------------------+------------------+ + + SRAM pins assignment + + +-------------------+--------------------+------------------+------------------+ + | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | + | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | + | PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | + | PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | + | PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | + | PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | + | PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 | PF12 <-> FSMC_A6 | PG10<-> FSMC_NE2 | + | PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9 | PF13 <-> FSMC_A7 |------------------+ + | PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10 | PF14 <-> FSMC_A8 | + | PD13 <-> FSMC_A18 | PE14 <-> FSMC_D11 | PF15 <-> FSMC_A9 | + | PD14 <-> FSMC_D0 | PE15 <-> FSMC_D12 |------------------+ + | PD15 <-> FSMC_D1 |--------------------+ + +-------------------+ +*/ + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHBENR = 0x000080D8; + + /* Connect PDx pins to FSMC Alternate function */ + GPIOD->AFR[0] = 0x00CC00CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A0A; + /* Configure PDx pins speed to 40 MHz */ + GPIOD->OSPEEDR = 0xFFFF0F0F; + /* 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 FSMC 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 40 MHz */ + GPIOE->OSPEEDR = 0xFFFFC00F; + /* 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 FSMC 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 40 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 FSMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x00000C00; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00200AAA; + /* Configure PGx pins speed to 40 MHz */ + GPIOG->OSPEEDR = 0x00300FFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FSMC Configuration ------------------------------------------------------*/ + /* Enable the FSMC interface clock */ + RCC->AHBENR = 0x400080D8; + + /* Configure and enable Bank1_SRAM3 */ + FSMC_Bank1->BTCR[4] = 0x00001011; + FSMC_Bank1->BTCR[5] = 0x00000300; + FSMC_Bank1E->BWTR[4] = 0x0FFFFFFF; +/* + Bank1_SRAM3 is configured as follow: + + p.FSMC_AddressSetupTime = 0; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 3; + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); +*/ + +} +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_CAN.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_CAN.c new file mode 100644 index 0000000..b0643b4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_CAN.c @@ -0,0 +1,303 @@ +#include "Driver_CAN.h" + +#define ARM_CAN_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) // CAN driver version + +// Driver Version +static const ARM_DRIVER_VERSION can_driver_version = { ARM_CAN_API_VERSION, ARM_CAN_DRV_VERSION }; + +// Driver Capabilities +static const ARM_CAN_CAPABILITIES can_driver_capabilities = { + 32U, // Number of CAN Objects available + 1U, // Supports reentrant calls to ARM_CAN_MessageSend, ARM_CAN_MessageRead, ARM_CAN_ObjectConfigure and abort message sending used by ARM_CAN_Control. + 0U, // Does not support CAN with Flexible Data-rate mode (CAN_FD) + 0U, // Does not support restricted operation mode + 1U, // Supports bus monitoring mode + 1U, // Supports internal loopback mode + 1U, // Supports external loopback mode +}; + +// Object Capabilities +static const ARM_CAN_OBJ_CAPABILITIES can_object_capabilities = { + 1U, // Object supports transmission + 1U, // Object supports reception + 0U, // Object does not support RTR reception and automatic Data transmission + 0U, // Object does not support RTR transmission and automatic Data reception + 1U, // Object allows assignment of multiple filters to it + 1U, // Object supports exact identifier filtering + 0U, // Object does not support range identifier filtering + 1U, // Object supports mask identifier filtering + 3U // Object can buffer 3 messages +}; + +static uint8_t can_driver_powered = 0U; +static uint8_t can_driver_initialized = 0U; +static ARM_CAN_SignalUnitEvent_t CAN_SignalUnitEvent = NULL; +static ARM_CAN_SignalObjectEvent_t CAN_SignalObjectEvent = NULL; + +// +// Functions +// + +static ARM_DRIVER_VERSION CAN_GetVersion (void) { + // Return driver version + return can_driver_version; +} + +static ARM_CAN_CAPABILITIES CAN_GetCapabilities (void) { + // Return driver capabilities + return can_driver_capabilities; +} + +static int32_t CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event) { + + if (can_driver_initialized != 0U) { return ARM_DRIVER_OK; } + + CAN_SignalUnitEvent = cb_unit_event; + CAN_SignalObjectEvent = cb_object_event; + + // Add code for pin, memory, RTX objects initialization + // .. + + can_driver_initialized = 1U; + + return ARM_DRIVER_OK; +} + +static int32_t CAN_Uninitialize (void) { + + // Add code for pin, memory, RTX objects de-initialization + // .. + + can_driver_initialized = 0U; + + return ARM_DRIVER_OK; +} + +static int32_t CAN_PowerControl (ARM_POWER_STATE state) { + switch (state) { + case ARM_POWER_OFF: + can_driver_powered = 0U; + // Add code to disable interrupts and put peripheral into reset mode, + // and if possible disable clock + // .. + + case ARM_POWER_FULL: + if (can_driver_initialized == 0U) { return ARM_DRIVER_ERROR; } + if (can_driver_powered != 0U) { return ARM_DRIVER_OK; } + + // Add code to enable clocks, reset variables enable interrupts + // and put peripheral into operational + // .. + + can_driver_powered = 1U; + break; + + default: + // Other states are not supported + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +uint32_t CAN_GetClock (void) { + + // Add code to return peripheral clock frequency + // .. +} + +static int32_t CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to setup peripheral parameters to generate specified bitrate + // with specified bit segments + // .. + + return ARM_DRIVER_OK; +} + +static int32_t CAN_SetMode (ARM_CAN_MODE mode) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (mode) { + case ARM_CAN_MODE_INITIALIZATION: + // Add code to put peripheral into initialization mode + // .. + break; + case ARM_CAN_MODE_NORMAL: + // Add code to put peripheral into normal operation mode + // .. + break; + case ARM_CAN_MODE_RESTRICTED: + // Add code to put peripheral into restricted operation mode + // .. + break; + case ARM_CAN_MODE_MONITOR: + // Add code to put peripheral into bus monitoring mode + // .. + break; + case ARM_CAN_MODE_LOOPBACK_INTERNAL: + // Add code to put peripheral into internal loopback mode + // .. + break; + case ARM_CAN_MODE_LOOPBACK_EXTERNAL: + // Add code to put peripheral into external loopback mode + // .. + break; + default: + // Handle unknown mode code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +ARM_CAN_OBJ_CAPABILITIES CAN_ObjectGetCapabilities (uint32_t obj_idx) { + // Return object capabilities + return can_object_capabilities; +} + +static int32_t CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (operation) { + case ARM_CAN_FILTER_ID_EXACT_ADD: + // Add code to setup peripheral to receive messages with specified exact ID + break; + case ARM_CAN_FILTER_ID_MASKABLE_ADD: + // Add code to setup peripheral to receive messages with specified maskable ID + break; + case ARM_CAN_FILTER_ID_RANGE_ADD: + // Add code to setup peripheral to receive messages within specified range of IDs + break; + case ARM_CAN_FILTER_ID_EXACT_REMOVE: + // Add code to remove specified exact ID from being received by peripheral + break; + case ARM_CAN_FILTER_ID_MASKABLE_REMOVE: + // Add code to remove specified maskable ID from being received by peripheral + break; + case ARM_CAN_FILTER_ID_RANGE_REMOVE: + // Add code to remove specified range of IDs from being received by peripheral + break; + default: + // Handle unknown operation code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static int32_t CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (obj_cfg) { + case ARM_CAN_OBJ_INACTIVE: + // Deactivate object + // .. + break; + case ARM_CAN_OBJ_RX_RTR_TX_DATA: + // Setup object to automatically return data when RTR with it's ID is received + // .. + break; + case ARM_CAN_OBJ_TX_RTR_RX_DATA: + // Setup object to send RTR and receive data response + // .. + break; + case ARM_CAN_OBJ_TX: + // Setup object to be used for sending messages + // .. + break; + case ARM_CAN_OBJ_RX: + // Setup object to be used for receiving messages + // .. + break; + default: + // Handle unknown object configuration code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static int32_t CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to send requested message + // .. + + return ((int32_t)size); +} + +static int32_t CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to read previously received message + // (reception was started when object was configured for reception) + // .. + + return ((int32_t)size); +} + +static int32_t CAN_Control (uint32_t control, uint32_t arg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (control & ARM_CAN_CONTROL_Msk) { + case ARM_CAN_ABORT_MESSAGE_SEND: + // Add code to abort message pending to be sent + // .. + break; + case ARM_CAN_SET_FD_MODE: + // Add code to enable Flexible Data-rate mode + // .. + break; + case ARM_CAN_SET_TRANSCEIVER_DELAY: + // Add code to set transceiver delay + // .. + break; + default: + // Handle unknown control code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static ARM_CAN_STATUS CAN_GetStatus (void) { + + // Add code to return device bus and error status + // .. +} + + +// IRQ handlers +// Add interrupt routines to handle transmission, reception, error and status interrupts +// .. + +// CAN driver functions structure + +ARM_DRIVER_CAN Driver_CAN = { + CAN_GetVersion, + CAN_GetCapabilities, + CAN_Initialize, + CAN_Uninitialize, + CAN_PowerControl, + CAN_GetClock, + CAN_SetBitrate, + CAN_SetMode, + CAN_ObjectGetCapabilities, + CAN_ObjectSetFilter, + CAN_ObjectConfigure, + CAN_MessageSend, + CAN_MessageRead, + CAN_Control, + CAN_GetStatus +}; + diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c new file mode 100644 index 0000000..4fdb494 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c @@ -0,0 +1,210 @@ +#include "Driver_ETH_MAC.h" + +#define ARM_ETH_MAC_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_ETH_MAC_API_VERSION, + ARM_ETH_MAC_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_ETH_MAC_CAPABILITIES DriverCapabilities = { + 0, /* 1 = IPv4 header checksum verified on receive */ + 0, /* 1 = IPv6 checksum verification supported on receive */ + 0, /* 1 = UDP payload checksum verified on receive */ + 0, /* 1 = TCP payload checksum verified on receive */ + 0, /* 1 = ICMP payload checksum verified on receive */ + 0, /* 1 = IPv4 header checksum generated on transmit */ + 0, /* 1 = IPv6 checksum generation supported on transmit */ + 0, /* 1 = UDP payload checksum generated on transmit */ + 0, /* 1 = TCP payload checksum generated on transmit */ + 0, /* 1 = ICMP payload checksum generated on transmit */ + 0, /* Ethernet Media Interface type */ + 0, /* 1 = driver provides initial valid MAC address */ + 0, /* 1 = callback event \ref ARM_ETH_MAC_EVENT_RX_FRAME generated */ + 0, /* 1 = callback event \ref ARM_ETH_MAC_EVENT_TX_FRAME generated */ + 0, /* 1 = wakeup event \ref ARM_ETH_MAC_EVENT_WAKEUP generated */ + 0 /* 1 = Precision Timer supported */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion(void) +{ +} + +ARM_ETH_MAC_CAPABILITIES ARM_ETH_MAC_GetCapabilities(void) +{ +} + +int32_t ARM_ETH_MAC_Initialize(ARM_ETH_MAC_SignalEvent_t cb_event) +{ +} + +int32_t ARM_ETH_MAC_Uninitialize(void) +{ +} + +int32_t ARM_ETH_MAC_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_MAC_GetMacAddress(ARM_ETH_MAC_ADDR *ptr_addr) +{ +} + +int32_t ARM_ETH_MAC_SetMacAddress(const ARM_ETH_MAC_ADDR *ptr_addr) +{ +} + +int32_t ARM_ETH_MAC_SetAddressFilter(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr) +{ +} + +int32_t ARM_ETH_MAC_SendFrame(const uint8_t *frame, uint32_t len, uint32_t flags) +{ +} + +int32_t ARM_ETH_MAC_ReadFrame(uint8_t *frame, uint32_t len) +{ +} + +uint32_t ARM_ETH_MAC_GetRxFrameSize(void) +{ +} + +int32_t ARM_ETH_MAC_GetRxFrameTime(ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_GetTxFrameTime(ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_ETH_MAC_CONFIGURE: + + switch (arg & ARM_ETH_MAC_SPEED_Msk) + { + case ARM_ETH_MAC_SPEED_10M: + break; + case ARM_ETH_SPEED_100M: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + switch (arg & ARM_ETH_MAC_DUPLEX_Msk) + { + case ARM_ETH_MAC_DUPLEX_FULL: + break; + } + + if (arg & ARM_ETH_MAC_LOOPBACK) + { + } + + if ((arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) || + (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX)) + { + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + if (!(arg & ARM_ETH_MAC_ADDRESS_BROADCAST)) + { + } + + if (arg & ARM_ETH_MAC_ADDRESS_MULTICAST) + { + } + + if (arg & ARM_ETH_MAC_ADDRESS_ALL) + { + } + + break; + + case ARM_ETH_MAC_CONTROL_TX: + break; + + case ARM_ETH_MAC_CONTROL_RX: + break; + + case ARM_ETH_MAC_FLUSH: + if (arg & ARM_ETH_MAC_FLUSH_RX) + { + } + if (arg & ARM_ETH_MAC_FLUSH_TX) + { + } + break; + + case ARM_ETH_MAC_SLEEP: + break; + + case ARM_ETH_MAC_VLAN_FILTER: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_MAC_ControlTimer(uint32_t control, ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_PHY_Read(uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) +{ +} + +int32_t ARM_ETH_MAC_PHY_Write(uint8_t phy_addr, uint8_t reg_addr, uint16_t data) +{ +} + +void ARM_ETH_MAC_SignalEvent(uint32_t event) +{ +} + +// End ETH MAC Interface + +ARM_DRIVER_ETH_MAC Driver_ETH_MAC = +{ + ARM_ETH_MAC_GetVersion, + ARM_ETH_MAC_GetCapabilities, + ARM_ETH_MAC_Initialize, + ARM_ETH_MAC_Uninitialize, + ARM_ETH_MAC_PowerControl, + ARM_ETH_MAC_GetMacAddress, + ARM_ETH_MAC_SetMacAddress, + ARM_ETH_MAC_SetAddressFilter, + ARM_ETH_MAC_SendFrame, + ARM_ETH_MAC_ReadFrame, + ARM_ETH_MAC_GetRxFrameSize, + ARM_ETH_MAC_GetRxFrameTime, + ARM_ETH_MAC_GetTxFrameTime, + ARM_ETH_MAC_ControlTimer, + ARM_ETH_MAC_Control, + ARM_ETH_MAC_PHY_Read, + ARM_ETH_MAC_PHY_Write +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c new file mode 100644 index 0000000..01a633f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c @@ -0,0 +1,109 @@ +#include "Driver_ETH_PHY.h" + +#define ARM_ETH_PHY_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_ETH_PHY_API_VERSION, + ARM_ETH_PHY_DRV_VERSION +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_ETH_PHY_GetVersion(void) +{ +} + +int32_t ARM_ETH_PHY_Initialize(ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) +{ +} + +int32_t ARM_ETH_PHY_Uninitialize(void) +{ +} + +int32_t ARM_ETH_PHY_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_PHY_SetInterface(uint32_t interface) +{ + switch (interface) + { + case ARM_ETH_INTERFACE_MII: + break; + case ARM_ETH_INTERFACE_RMII: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_PHY_SetMode(uint32_t mode) +{ + switch (mode & ARM_ETH_PHY_SPEED_Msk) + { + case ARM_ETH_PHY_SPEED_10M: + break; + case ARM_ETH_PHY_SPEED_100M: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + switch (mode & ARM_ETH_PHY_DUPLEX_Msk) + { + case ARM_ETH_PHY_DUPLEX_HALF: + break; + case ARM_ETH_PHY_DUPLEX_FULL: + break; + } + + if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) + { + } + + if (mode & ARM_ETH_PHY_LOOPBACK) + { + } + + if (mode & ARM_ETH_PHY_ISOLATE) + { + } +} + +ARM_ETH_LINK_STATE ARM_ETH_PHY_GetLinkState(void) +{ +} + +ARM_ETH_LINK_INFO ARM_ETH_PHY_GetLinkInfo(void) +{ +} + +ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM) = +{ + ARM_ETH_PHY_GetVersion, + ARM_ETH_PHY_Initialize, + ARM_ETH_PHY_Uninitialize, + ARM_ETH_PHY_PowerControl, + ARM_ETH_PHY_SetInterface, + ARM_ETH_PHY_SetMode, + ARM_ETH_PHY_GetLinkState, + ARM_ETH_PHY_GetLinkInfo, +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_Flash.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_Flash.c new file mode 100644 index 0000000..e148354 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_Flash.c @@ -0,0 +1,104 @@ +#include "Driver_Flash.h" + +#define ARM_FLASH_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0) /* driver version */ + +/* Sector Information */ +#ifdef FLASH_SECTORS +static ARM_FLASH_SECTOR FLASH_SECTOR_INFO[FLASH_SECTOR_COUNT] = { + FLASH_SECTORS +}; +#else +#define FLASH_SECTOR_INFO NULL +#endif + +/* Flash Information */ +static ARM_FLASH_INFO FlashInfo = { + 0, /* FLASH_SECTOR_INFO */ + 0, /* FLASH_SECTOR_COUNT */ + 0, /* FLASH_SECTOR_SIZE */ + 0, /* FLASH_PAGE_SIZE */ + 0, /* FLASH_PROGRAM_UNIT */ + 0 /* FLASH_ERASED_VALUE */ +}; + +/* Flash Status */ +static ARM_FLASH_STATUS FlashStatus; + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_FLASH_API_VERSION, + ARM_FLASH_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_FLASH_CAPABILITIES DriverCapabilities = { + 0, /* event_ready */ + 0, /* data_width = 0:8-bit, 1:16-bit, 2:32-bit */ + 0 /* erase_chip */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_Flash_GetVersion(void) +{ +} + +ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities(void) +{ +} + +int32_t ARM_Flash_Initialize(ARM_Flash_SignalEvent_t cb_event) +{ +} + +int32_t ARM_Flash_Uninitialize(void) +{ +} + +int32_t ARM_Flash_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_Flash_ReadData(uint32_t addr, void *data, uint32_t cnt) +{ +} + +int32_t ARM_Flash_ProgramData(uint32_t addr, const void *data, uint32_t cnt) +{ +} + +int32_t ARM_Flash_EraseSector(uint32_t addr) +{ +} + +int32_t ARM_Flash_EraseChip(void) +{ +} + +ARM_FLASH_STATUS ARM_Flash_GetStatus(void) +{ +} + +ARM_FLASH_INFO * ARM_Flash_GetInfo(void) +{ +} + +void ARM_Flash_SignalEvent(uint32_t event) +{ +} diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_I2C.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_I2C.c new file mode 100644 index 0000000..3fb830f --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_I2C.c @@ -0,0 +1,130 @@ +#include "Driver_I2C.h" + +#define ARM_I2C_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_I2C_API_VERSION, + ARM_I2C_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_I2C_CAPABILITIES DriverCapabilities = { + 0 /* supports 10-bit addressing */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_I2C_GetVersion(void) +{ +} + +ARM_I2C_CAPABILITIES ARM_I2C_GetCapabilities(void) +{ +} + +int32_t ARM_I2C_Initialize(ARM_I2C_SignalEvent_t cb_event) +{ +} + +int32_t ARM_I2C_Uninitialize(void) +{ +} + +int32_t ARM_I2C_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_I2C_MasterTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending) +{ +} + +int32_t ARM_I2C_MasterReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending) +{ +} + +int32_t ARM_I2C_SlaveTransmit(const uint8_t *data, uint32_t num) +{ +} + +int32_t ARM_I2C_SlaveReceive(uint8_t *data, uint32_t num) +{ +} + +int32_t ARM_I2C_GetDataCount(void) +{ +} + +int32_t ARM_I2C_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_I2C_OWN_ADDRESS: + break; + + case ARM_I2C_BUS_SPEED: + switch (arg) + { + case ARM_I2C_BUS_SPEED_STANDARD: + break; + case ARM_I2C_BUS_SPEED_FAST: + break; + case ARM_I2C_BUS_SPEED_FAST_PLUS: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_I2C_BUS_CLEAR: + break; + + case ARM_I2C_ABORT_TRANSFER: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +ARM_I2C_STATUS ARM_I2C_GetStatus(void) +{ +} + +void ARM_I2C_SignalEvent(uint32_t event) +{ + // function body +} + +// End I2C Interface + +ARM_DRIVER_I2C Driver_I2C = { + ARM_I2C_GetVersion, + ARM_I2C_GetCapabilities, + ARM_I2C_Initialize, + ARM_I2C_Uninitialize, + ARM_I2C_PowerControl, + ARM_I2C_MasterTransmit, + ARM_I2C_MasterReceive, + ARM_I2C_SlaveTransmit, + ARM_I2C_SlaveReceive, + ARM_I2C_GetDataCount, + ARM_I2C_Control, + ARM_I2C_GetStatus +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_MCI.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_MCI.c new file mode 100644 index 0000000..edd6d9e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_MCI.c @@ -0,0 +1,201 @@ +#include "Driver_MCI.h" + +#define ARM_MCI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_MCI_API_VERSION, + ARM_MCI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_MCI_CAPABILITIES DriverCapabilities = { + 0, /* cd_state */ + 0, /* cd_event */ + 0, /* vdd */ + 0, /* vdd_1v8 */ + 0, /* vccq */ + 0, /* vccq_1v8 */ + 0, /* vccq_1v2 */ + 1, /* data_width_4 */ + 1, /* data_width_8 */ + 0, /* data_width_4_ddr */ + 0, /* data_width_8_ddr */ + 0, /* high_speed */ + 0, /* uhs_signaling */ + 0, /* uhs_tuning */ + 0, /* uhs_sdr50 */ + 0, /* uhs_sdr104 */ + 0, /* uhs_ddr50 */ + 0, /* uhs_driver_type_a */ + 0, /* uhs_driver_type_c */ + 0, /* uhs_driver_type_d */ + 1, /* sdio_interrupt */ + 1, /* read_wait */ + 0, /* suspend_resume */ + 0, /* mmc_interrupt */ + 0, /* mmc_boot */ + 0, /* ccs */ + 0 /* ccs_timeout */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_MCI_GetVersion(void) +{ +} + +ARM_MCI_CAPABILITIES ARM_MCI_GetCapabilities(void) +{ +} + +int32_t ARM_MCI_Initialize(ARM_MCI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_MCI_Uninitialize(void) +{ +} + +int32_t ARM_MCI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_MCI_CardPower(uint32_t voltage) +{ + switch (voltage & ARM_MCI_POWER_VDD_Msk) + { + case ARM_MCI_POWER_VDD_OFF: + return ARM_DRIVER_OK; + + case ARM_MCI_POWER_VDD_3V3: + return ARM_DRIVER_OK; + + default: + break; + } +} + +int32_t ARM_MCI_ReadCD(void) +{ +} + +int32_t ARM_MCI_ReadWP(void) +{ +} + +int32_t ARM_MCI_SendCommand(uint32_t cmd, uint32_t arg, uint32_t flags, uint32_t *response) +{ +} + +int32_t ARM_MCI_SetupTransfer(uint8_t *data, uint32_t block_count, uint32_t block_size, uint32_t mode) +{ +} + +int32_t ARM_MCI_AbortTransfer(void) +{ +} + +int32_t ARM_MCI_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_MCI_BUS_SPEED: + break; + + case ARM_MCI_BUS_SPEED_MODE: + break; + + case ARM_MCI_BUS_CMD_MODE: + /* Implement external pull-up control to support MMC cards in open-drain mode */ + /* Default mode is push-pull and is configured in Driver_MCI0.Initialize() */ + if (arg == ARM_MCI_BUS_CMD_PUSH_PULL) + { + /* Configure external circuit to work in push-pull mode */ + } + else if (arg == ARM_MCI_BUS_CMD_OPEN_DRAIN) + { + /* Configure external circuit to work in open-drain mode */ + } + else + { + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_MCI_BUS_DATA_WIDTH: + switch (arg) + { + case ARM_MCI_BUS_DATA_WIDTH_1: + break; + case ARM_MCI_BUS_DATA_WIDTH_4: + break; + case ARM_MCI_BUS_DATA_WIDTH_8: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_MCI_CONTROL_RESET: + break; + + case ARM_MCI_CONTROL_CLOCK_IDLE: + break; + + case ARM_MCI_DATA_TIMEOUT: + break; + + case ARM_MCI_MONITOR_SDIO_INTERRUPT: + break; + + case ARM_MCI_CONTROL_READ_WAIT: + break; + + case ARM_MCI_DRIVER_STRENGTH: + default: return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +ARM_MCI_STATUS ARM_MCI_GetStatus(void) +{ +} + +void ARM_MCI_SignalEvent(uint32_t event) +{ + // function body +} + +// End MCI Interface + +ARM_DRIVER_MCI Driver_MCI = { + ARM_MCI_GetVersion, + ARM_MCI_GetCapabilities, + ARM_MCI_Initialize, + ARM_MCI_Uninitialize, + ARM_MCI_PowerControl, + ARM_MCI_CardPower, + ARM_MCI_ReadCD, + ARM_MCI_ReadWP, + ARM_MCI_SendCommand, + ARM_MCI_SetupTransfer, + ARM_MCI_AbortTransfer, + ARM_MCI_Control, + ARM_MCI_GetStatus +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SAI.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SAI.c new file mode 100644 index 0000000..f36c2c7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SAI.c @@ -0,0 +1,107 @@ +#include "Driver_SAI.h" + +#define ARM_SAI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_SAI_API_VERSION, + ARM_SAI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_SAI_CAPABILITIES DriverCapabilities = { + 1, /* supports asynchronous Transmit/Receive */ + 0, /* supports synchronous Transmit/Receive */ + 0, /* supports user defined Protocol */ + 1, /* supports I2S Protocol */ + 0, /* supports MSB/LSB justified Protocol */ + 0, /* supports PCM short/long frame Protocol */ + 0, /* supports AC'97 Protocol */ + 0, /* supports Mono mode */ + 0, /* supports Companding */ + 0, /* supports MCLK (Master Clock) pin */ + 0 /* supports Frame error event: \ref ARM_SAI_EVENT_FRAME_ERROR */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_SAI_GetVersion (void) +{ +} + +ARM_SAI_CAPABILITIES ARM_SAI_GetCapabilities (void) +{ +} + +int32_t ARM_SAI_Initialize (ARM_SAI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_SAI_Uninitialize (void) +{ +} + +int32_t ARM_SAI_PowerControl (ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_SAI_Send (const void *data, uint32_t num) +{ +} + +int32_t ARM_SAI_Receive (void *data, uint32_t num) +{ +} + +uint32_t ARM_SAI_GetTxCount (void) +{ +} + +uint32_t ARM_SAI_GetRxCount (void) +{ +} + +int32_t ARM_SAI_Control (uint32_t control, uint32_t arg1, uint32_t arg2) +{ +} + +ARM_SAI_STATUS ARM_SAI_GetStatus (void) +{ +} + +void ARM_SAI_SignalEvent(uint32_t event) +{ + // function body +} + +// End SAI Interface + +ARM_DRIVER_SAI Driver_SAI = { + ARM_SAI_GetVersion, + ARM_SAI_GetCapabilities, + ARM_SAI_Initialize, + ARM_SAI_Uninitialize, + ARM_SAI_PowerControl, + ARM_SAI_Send, + ARM_SAI_Receive, + ARM_SAI_GetTxCount, + ARM_SAI_GetRxCount, + ARM_SAI_Control, + ARM_SAI_GetStatus +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SPI.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SPI.c new file mode 100644 index 0000000..108b556 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_SPI.c @@ -0,0 +1,133 @@ +#include "Driver_SPI.h" + +#define ARM_SPI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_SPI_API_VERSION, + ARM_SPI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_SPI_CAPABILITIES DriverCapabilities = { + 1, /* Simplex Mode (Master and Slave) */ + 1, /* TI Synchronous Serial Interface */ + 1, /* Microwire Interface */ + 0 /* Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_SPI_GetVersion(void) +{ +} + +ARM_SPI_CAPABILITIES ARM_SPI_GetCapabilities(void) +{ +} + +int32_t ARM_SPI_Initialize(ARM_SPI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_SPI_Uninitialize(void) +{ +} + +int32_t ARM_SPI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_SPI_Send(const void *data, uint32_t num) +{ +} + +int32_t ARM_SPI_Receive(void *data, uint32_t num) +{ +} + +int32_t ARM_SPI_Transfer(const void *data_out, void *data_in, uint32_t num) +{ +} + +uint32_t ARM_SPI_GetDataCount(void) +{ +} + +int32_t ARM_SPI_Control(uint32_t control, uint32_t arg) +{ + switch (control & ARM_SPI_CONTROL_Msk) + { + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + + case ARM_SPI_MODE_INACTIVE: // SPI Inactive + return ARM_DRIVER_OK; + + case ARM_SPI_MODE_MASTER: // SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps + break; + + case ARM_SPI_MODE_SLAVE: // SPI Slave (Output on MISO, Input on MOSI) + break; + + case ARM_SPI_MODE_MASTER_SIMPLEX: // SPI Master (Output/Input on MOSI); arg = Bus Speed in bps + case ARM_SPI_MODE_SLAVE_SIMPLEX: // SPI Slave (Output/Input on MISO) + return ARM_SPI_ERROR_MODE; + + case ARM_SPI_SET_BUS_SPEED: // Set Bus Speed in bps; arg = value + break; + + case ARM_SPI_GET_BUS_SPEED: // Get Bus Speed in bps + break; + + case ARM_SPI_SET_DEFAULT_TX_VALUE: // Set default Transmit value; arg = value + break; + + case ARM_SPI_CONTROL_SS: // Control Slave Select; arg = 0:inactive, 1:active + break; + + case ARM_SPI_ABORT_TRANSFER: // Abort current data transfer + break; + } +} + +ARM_SPI_STATUS ARM_SPI_GetStatus(void) +{ +} + +void ARM_SPI_SignalEvent(uint32_t event) +{ + // function body +} + +// End SPI Interface + +ARM_DRIVER_SPI Driver_SPI = { + ARM_SPI_GetVersion, + ARM_SPI_GetCapabilities, + ARM_SPI_Initialize, + ARM_SPI_Uninitialize, + ARM_SPI_PowerControl, + ARM_SPI_Send, + ARM_SPI_Receive, + ARM_SPI_Transfer, + ARM_SPI_GetDataCount, + ARM_SPI_Control, + ARM_SPI_GetStatus +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USART.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USART.c new file mode 100644 index 0000000..c81a904 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USART.c @@ -0,0 +1,132 @@ +#include "Driver_USART.h" + +#define ARM_USART_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_USART_API_VERSION, + ARM_USART_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USART_CAPABILITIES DriverCapabilities = { + 1, /* supports UART (Asynchronous) mode */ + 0, /* supports Synchronous Master mode */ + 0, /* supports Synchronous Slave mode */ + 0, /* supports UART Single-wire mode */ + 0, /* supports UART IrDA mode */ + 0, /* supports UART Smart Card mode */ + 0, /* Smart Card Clock generator available */ + 0, /* RTS Flow Control available */ + 0, /* CTS Flow Control available */ + 0, /* Transmit completed event: \ref ARM_USART_EVENT_TX_COMPLETE */ + 0, /* Signal receive character timeout event: \ref ARM_USART_EVENT_RX_TIMEOUT */ + 0, /* RTS Line: 0=not available, 1=available */ + 0, /* CTS Line: 0=not available, 1=available */ + 0, /* DTR Line: 0=not available, 1=available */ + 0, /* DSR Line: 0=not available, 1=available */ + 0, /* DCD Line: 0=not available, 1=available */ + 0, /* RI Line: 0=not available, 1=available */ + 0, /* Signal CTS change event: \ref ARM_USART_EVENT_CTS */ + 0, /* Signal DSR change event: \ref ARM_USART_EVENT_DSR */ + 0, /* Signal DCD change event: \ref ARM_USART_EVENT_DCD */ + 0 /* Signal RI change event: \ref ARM_USART_EVENT_RI */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USART_GetVersion(void) +{ +} + +ARM_USART_CAPABILITIES ARM_USART_GetCapabilities(void) +{ +} + +int32_t ARM_USART_Initialize(ARM_USART_SignalEvent_t cb_event) +{ +} + +int32_t ARM_USART_Uninitialize(void) +{ +} + +int32_t ARM_USART_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USART_Send(const void *data, uint32_t num) +{ +} + +int32_t ARM_USART_Receive(void *data, uint32_t num) +{ +} + +int32_t ARM_USART_Transfer(const void *data_out, void *data_in, uint32_t num) +{ +} + +uint32_t ARM_USART_GetTxCount(void) +{ +} + +uint32_t ARM_USART_GetRxCount(void) +{ +} + +int32_t ARM_USART_Control(uint32_t control, uint32_t arg) +{ +} + +ARM_USART_STATUS ARM_USART_GetStatus(void) +{ +} + +int32_t ARM_USART_SetModemControl(ARM_USART_MODEM_CONTROL control) +{ +} + +ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus(void) +{ +} + +void ARM_USART_SignalEvent(uint32_t event) +{ + // function body +} + +// End USART Interface + +ARM_DRIVER_USART Driver_USART = { + ARM_USART_GetVersion, + ARM_USART_GetCapabilities, + ARM_USART_Initialize, + ARM_USART_Uninitialize, + ARM_USART_PowerControl, + ARM_USART_Send, + ARM_USART_Receive, + ARM_USART_Transfer, + ARM_USART_GetTxCount, + ARM_USART_GetRxCount, + ARM_USART_Control, + ARM_USART_GetStatus, + ARM_USART_SetModemControl, + ARM_USART_GetModemStatus +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBD.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBD.c new file mode 100644 index 0000000..bcb0062 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBD.c @@ -0,0 +1,142 @@ +#include "Driver_USBD.h" + +#define ARM_USBD_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbd_driver_version = { + ARM_USBD_API_VERSION, + ARM_USBD_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBD_CAPABILITIES usbd_driver_capabilities = { + 0, /* vbus_detection */ + 0, /* event_vbus_on */ + 0 /* event_vbus_off */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBD_GetVersion(void) +{ +} + +ARM_USBD_CAPABILITIES ARM_USBD_GetCapabilities(void) +{ +} + +int32_t ARM_USBD_Initialize(ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) +{ +} + +int32_t ARM_USBD_Uninitialize(void) +{ +} + +int32_t ARM_USBD_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBD_DeviceConnect(void) +{ +} + +int32_t ARM_USBD_DeviceDisconnect(void) +{ +} + +ARM_USBD_STATE ARM_USBD_DeviceGetState(void) +{ +} + +int32_t ARM_USBD_DeviceRemoteWakeup(void) +{ +} + +int32_t ARM_USBD_DeviceSetAddress(uint8_t dev_addr) +{ +} + +int32_t ARM_USBD_ReadSetupPacket(uint8_t *setup) +{ +} + +int32_t ARM_USBD_EndpointConfigure(uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size) +{ +} + +int32_t ARM_USBD_EndpointUnconfigure(uint8_t ep_addr) +{ +} + +int32_t ARM_USBD_EndpointStall(uint8_t ep_addr, bool stall) +{ +} + +int32_t ARM_USBD_EndpointTransfer(uint8_t ep_addr, uint8_t *data, uint32_t num) +{ +} + +uint32_t ARM_USBD_EndpointTransferGetResult(uint8_t ep_addr) +{ +} + +int32_t ARM_USBD_EndpointTransferAbort(uint8_t ep_addr) +{ +} + +uint16_t ARM_USBD_GetFrameNumber(void) +{ +} + +void ARM_USBD_SignalDeviceEvent(uint32_t event) +{ + // function body +} + +void ARM_USBD_SignalEndpointEvent(uint8_t ep_addr, uint32_t ep_event) +{ + // function body +} + +// End USBD Interface + +ARM_DRIVER_USBD Driver_USBD = +{ + ARM_USBD_GetVersion, + ARM_USBD_GetCapabilities, + ARM_USBD_Initialize, + ARM_USBD_Uninitialize, + ARM_USBD_PowerControl, + ARM_USBD_DeviceConnect, + ARM_USBD_DeviceDisconnect, + ARM_USBD_DeviceGetState, + ARM_USBD_DeviceRemoteWakeup, + ARM_USBD_DeviceSetAddress, + ARM_USBD_EndpointConfigure, + ARM_USBD_EndpointUnconfigure, + ARM_USBD_EndpointStall, + ARM_USBD_EndpointTransfer, + ARM_USBD_EndpointTransferGetResult, + ARM_USBD_EndpointTransferAbort, + ARM_USBD_GetFrameNumber +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBH.c b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBH.c new file mode 100644 index 0000000..36e6fd0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/DriverTemplates/Driver_USBH.c @@ -0,0 +1,209 @@ +#include "Driver_USBH.h" + +/* USB Host Driver */ + +#define ARM_USBH_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbh_driver_version = { + ARM_USBH_API_VERSION, + ARM_USBH_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBD_CAPABILITIES usbd_driver_capabilities = { + 0x0001, /* Root HUB available Ports Mask */ + 0, /* Automatic SPLIT packet handling */ + 0, /* Signal Connect event */ + 0, /* Signal Disconnect event */ + 0 /* Signal Overcurrent event */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBH_GetVersion(void) +{ +} + +ARM_USBH_CAPABILITIES ARM_USBH_GetCapabilities(void) +{ +} + +int32_t ARM_USBH_Initialize(ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalEndpointEvent_t cb_endpoint_event) +{ +} + +int32_t ARM_USBH_Uninitialize(void) +{ +} + +int32_t ARM_USBH_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBH_PortVbusOnOff(uint8_t port, bool vbus) +{ +} + +int32_t ARM_USBH_PortReset(uint8_t port) +{ +} + +int32_t ARM_USBH_PortSuspend(uint8_t port) +{ +} + +int32_t ARM_USBH_PortResume(uint8_t port) +{ +} + +ARM_USBH_PORT_STATE ARM_USBH_PortGetState(uint8_t port) +{ +} + +ARM_USBH_EP_HANDLE ARM_USBH_EndpointCreate(uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval) +{ +} + +int32_t ARM_USBH_EndpointModify(ARM_USBH_EP_HANDLE ep_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size) +{ +} + +int32_t ARM_USBH_EndpointDelete(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointReset(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointTransfer(ARM_USBH_EP_HANDLE ep_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num) +{ +} + +uint32_t ARM_USBH_EndpointTransferGetResult(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointTransferAbort(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +uint16_t ARM_USBH_GetFrameNumber(void) +{ +} + +void ARM_USBH_SignalPortEvent(uint8_t port, uint32_t event) +{ + // function body +} + +void ARM_USBH_SignalEndpointEvent(ARM_USBH_EP_HANDLE ep_hndl, uint32_t event) +{ + // function body +} + +/* USB Host HCI (OHCI/EHCI) Driver */ + +#define ARM_USBH_HCI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbh_hci_driver_version = { + ARM_USBH_HCI_API_VERSION, + ARM_USBH_HCI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBD_CAPABILITIES usbh_hci_driver_capabilities = { + 0x0001 /* Root HUB available Ports Mask */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBH_HCI_GetVersion(void) +{ +} + +ARM_USBH_HCI_CAPABILITIES ARM_USBH_HCI_GetCapabilities(void) +{ +} + +int32_t ARM_USBH_HCI_Initialize(ARM_USBH_HCI_Interrupt_t *cb_interrupt) +{ +} + +int32_t ARM_USBH_HCI_Uninitialize(void) +{ +} + +int32_t ARM_USBH_HCI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBH_HCI_PortVbusOnOff(uint8_t port, bool vbus) +{ +} + +void ARM_USBH_HCI_Interrupt(void) +{ + // function body +} + +// End USBH Interface + +ARM_DRIVER_USBH_HCI Driver_USBH_HCI = { + ARM_USBH_HCI_GetVersion, + ARM_USBH_HCI_GetCapabilities, + ARM_USBH_HCI_Initialize, + ARM_USBH_HCI_Uninitialize, + ARM_USBH_HCI_PowerControl, + ARM_USBH_HCI_PortVbusOnOff +}; diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_CAN.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_CAN.h new file mode 100644 index 0000000..2c22219 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_CAN.h @@ -0,0 +1,361 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2015 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 9. September 2015 + * $Revision: V1.00 + * + * Project: CAN (Controller Area Network) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_CAN_H +#define __DRIVER_CAN_H + +#include "Driver_Common.h" + +#define ARM_CAN_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0)/* API version */ + + +/****** CAN Bitrate selection codes *****/ +typedef enum _ARM_CAN_BITRATE_SELECT { + ARM_CAN_BITRATE_NOMINAL, ///< Select nominal (flexible data-rate arbitration) bitrate + ARM_CAN_BITRATE_FD_DATA ///< Select flexible data-rate data bitrate +} ARM_CAN_BITRATE_SELECT; + +/****** CAN Bit Propagation Segment codes (PROP_SEG) *****/ +#define ARM_CAN_BIT_PROP_SEG_Pos 0UL ///< bits 7..0 +#define ARM_CAN_BIT_PROP_SEG_Msk (0xFFUL << ARM_CAN_BIT_PROP_SEG_Pos) +#define ARM_CAN_BIT_PROP_SEG(x) (((x) << ARM_CAN_BIT_PROP_SEG_Pos) & ARM_CAN_BIT_PROP_SEG_Msk) + +/****** CAN Bit Phase Buffer Segment 1 (PHASE_SEG1) codes *****/ +#define ARM_CAN_BIT_PHASE_SEG1_Pos 8UL ///< bits 15..8 +#define ARM_CAN_BIT_PHASE_SEG1_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG1_Pos) +#define ARM_CAN_BIT_PHASE_SEG1(x) (((x) << ARM_CAN_BIT_PHASE_SEG1_Pos) & ARM_CAN_BIT_PHASE_SEG1_Msk) + +/****** CAN Bit Phase Buffer Segment 2 (PHASE_SEG2) codes *****/ +#define ARM_CAN_BIT_PHASE_SEG2_Pos 16UL ///< bits 23..16 +#define ARM_CAN_BIT_PHASE_SEG2_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG2_Pos) +#define ARM_CAN_BIT_PHASE_SEG2(x) (((x) << ARM_CAN_BIT_PHASE_SEG2_Pos) & ARM_CAN_BIT_PHASE_SEG2_Msk) + +/****** CAN Bit (Re)Synchronization Jump Width Segment (SJW) *****/ +#define ARM_CAN_BIT_SJW_Pos 24UL ///< bits 28..24 +#define ARM_CAN_BIT_SJW_Msk (0x1FUL << ARM_CAN_BIT_SJW_Pos) +#define ARM_CAN_BIT_SJW(x) (((x) << ARM_CAN_BIT_SJW_Pos) & ARM_CAN_BIT_SJW_Msk) + +/****** CAN Mode codes *****/ +typedef enum _ARM_CAN_MODE { + ARM_CAN_MODE_INITIALIZATION, ///< Initialization mode + ARM_CAN_MODE_NORMAL, ///< Normal operation mode + ARM_CAN_MODE_RESTRICTED, ///< Restricted operation mode + ARM_CAN_MODE_MONITOR, ///< Bus monitoring mode + ARM_CAN_MODE_LOOPBACK_INTERNAL, ///< Loopback internal mode + ARM_CAN_MODE_LOOPBACK_EXTERNAL ///< Loopback external mode +} ARM_CAN_MODE; + +/****** CAN Filter Operation codes *****/ +typedef enum _ARM_CAN_FILTER_OPERATION { + ARM_CAN_FILTER_ID_EXACT_ADD, ///< Add exact id filter + ARM_CAN_FILTER_ID_EXACT_REMOVE, ///< Remove exact id filter + ARM_CAN_FILTER_ID_RANGE_ADD, ///< Add range id filter + ARM_CAN_FILTER_ID_RANGE_REMOVE, ///< Remove range id filter + ARM_CAN_FILTER_ID_MASKABLE_ADD, ///< Add maskable id filter + ARM_CAN_FILTER_ID_MASKABLE_REMOVE ///< Remove maskable id filter +} ARM_CAN_FILTER_OPERATION; + +/****** CAN Object Configuration codes *****/ +typedef enum _ARM_CAN_OBJ_CONFIG { + ARM_CAN_OBJ_INACTIVE, ///< CAN object inactive + ARM_CAN_OBJ_TX, ///< CAN transmit object + ARM_CAN_OBJ_RX, ///< CAN receive object + ARM_CAN_OBJ_RX_RTR_TX_DATA, ///< CAN object that on RTR reception automatically transmits Data Frame + ARM_CAN_OBJ_TX_RTR_RX_DATA ///< CAN object that transmits RTR and automatically receives Data Frame +} ARM_CAN_OBJ_CONFIG; + +/** +\brief CAN Object Capabilities +*/ +typedef struct _ARM_CAN_OBJ_CAPABILITIES { + uint32_t tx : 1; ///< Object supports transmission + uint32_t rx : 1; ///< Object supports reception + uint32_t rx_rtr_tx_data : 1; ///< Object supports RTR reception and automatic Data Frame transmission + uint32_t tx_rtr_rx_data : 1; ///< Object supports RTR transmission and automatic Data Frame reception + uint32_t multiple_filters : 1; ///< Object allows assignment of multiple filters to it + uint32_t exact_filtering : 1; ///< Object supports exact identifier filtering + uint32_t range_filtering : 1; ///< Object supports range identifier filtering + uint32_t mask_filtering : 1; ///< Object supports mask identifier filtering + uint32_t message_depth : 8; ///< Number of messages buffers (FIFO) for that object +} ARM_CAN_OBJ_CAPABILITIES; + +/****** CAN Control Function Operation codes *****/ +#define ARM_CAN_CONTROL_Pos 0UL +#define ARM_CAN_CONTROL_Msk (0xFFUL << ARM_CAN_CONTROL_Pos) +#define ARM_CAN_SET_FD_MODE (1UL << ARM_CAN_CONTROL_Pos) ///< Set FD operation mode; arg: 0 = disable, 1 = enable +#define ARM_CAN_ABORT_MESSAGE_SEND (2UL << ARM_CAN_CONTROL_Pos) ///< Abort sending of CAN message; arg = object +#define ARM_CAN_CONTROL_RETRANSMISSION (3UL << ARM_CAN_CONTROL_Pos) ///< Enable/disable automatic retransmission; arg: 0 = disable, 1 = enable (default state) +#define ARM_CAN_SET_TRANSCEIVER_DELAY (4UL << ARM_CAN_CONTROL_Pos) ///< Set transceiver delay; arg = delay in time quanta + +/****** CAN ID Frame Format codes *****/ +#define ARM_CAN_ID_IDE_Pos 31UL +#define ARM_CAN_ID_IDE_Msk (1UL << ARM_CAN_ID_IDE_Pos) + +/****** CAN Identifier encoding *****/ +#define ARM_CAN_STANDARD_ID(id) (id & 0x000007FFUL) ///< CAN identifier in standard format (11-bits) +#define ARM_CAN_EXTENDED_ID(id) ((id & 0x1FFFFFFFUL) | ARM_CAN_ID_IDE_Msk)///< CAN identifier in extended format (29-bits) + +/** +\brief CAN Message Information +*/ +typedef struct _ARM_CAN_MSG_INFO { + uint32_t id; ///< CAN identifier with frame format specifier (bit 31) + uint32_t rtr : 1; ///< Remote transmission request frame + uint32_t edl : 1; ///< Flexible data-rate format extended data length + uint32_t brs : 1; ///< Flexible data-rate format with bitrate switch + uint32_t esi : 1; ///< Flexible data-rate format error state indicator + uint32_t dlc : 4; ///< Data length code +} ARM_CAN_MSG_INFO; + +/****** CAN specific error code *****/ +#define ARM_CAN_INVALID_BITRATE_SELECT (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Bitrate selection not supported +#define ARM_CAN_INVALID_BITRATE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Requested bitrate not supported +#define ARM_CAN_INVALID_BIT_PROP_SEG (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Propagation segment value not supported +#define ARM_CAN_INVALID_BIT_PHASE_SEG1 (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Phase segment 1 value not supported +#define ARM_CAN_INVALID_BIT_PHASE_SEG2 (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Phase segment 2 value not supported +#define ARM_CAN_INVALID_BIT_SJW (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< SJW value not supported +#define ARM_CAN_NO_MESSAGE_AVAILABLE (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Message is not available + +/****** CAN Status codes *****/ +#define ARM_CAN_UNIT_STATE_INACTIVE (0U) ///< Unit state: Not active on bus (initialize or error bus off) +#define ARM_CAN_UNIT_STATE_ACTIVE (1U) ///< Unit state: Active on bus (can generate active error frame) +#define ARM_CAN_UNIT_STATE_PASSIVE (2U) ///< Unit state: Error passive (can not generate active error frame) +#define ARM_CAN_LEC_NO_ERROR (0U) ///< Last error code: No error +#define ARM_CAN_LEC_BIT_ERROR (1U) ///< Last error code: Bit error +#define ARM_CAN_LEC_STUFF_ERROR (2U) ///< Last error code: Bit stuffing error +#define ARM_CAN_LEC_CRC_ERROR (3U) ///< Last error code: CRC error +#define ARM_CAN_LEC_FORM_ERROR (4U) ///< Last error code: Illegal fixed-form bit +#define ARM_CAN_LEC_ACK_ERROR (5U) ///< Last error code: Acknowledgement error + +/** +\brief CAN Status +*/ +typedef struct _ARM_CAN_STATUS { + uint32_t unit_state : 4; ///< Unit bus state + uint32_t last_error_code : 4; ///< Last error code + uint32_t tx_error_count : 8; ///< Transmitter error count + uint32_t rx_error_count : 8; ///< Receiver error count +} ARM_CAN_STATUS; + + +/****** CAN Unit Event *****/ +#define ARM_CAN_EVENT_UNIT_ACTIVE (1U) ///< Unit entered Error Active state +#define ARM_CAN_EVENT_UNIT_WARNING (2U) ///< Unit entered Error Warning state (one or both error counters >= 96) +#define ARM_CAN_EVENT_UNIT_PASSIVE (3U) ///< Unit entered Error Passive state +#define ARM_CAN_EVENT_UNIT_BUS_OFF (4U) ///< Unit entered bus off state + +/****** CAN Send/Receive Event *****/ +#define ARM_CAN_EVENT_SEND_COMPLETE (1UL << 0) ///< Send complete +#define ARM_CAN_EVENT_RECEIVE (1UL << 1) ///< Message received +#define ARM_CAN_EVENT_RECEIVE_OVERRUN (1UL << 2) ///< Received message overrun + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_CAN_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_CAN_CAPABILITIES ARM_CAN_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_CAN_CAPABILITIES + + \fn int32_t ARM_CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event) + \brief Initialize CAN interface and register signal (callback) functions. + \param[in] cb_unit_event Pointer to \ref ARM_CAN_SignalUnitEvent callback function + \param[in] cb_object_event Pointer to \ref ARM_CAN_SignalObjectEvent callback function + \return \ref execution_status + + \fn int32_t ARM_CAN_Uninitialize (void) + \brief De-initialize CAN interface. + \return \ref execution_status + + \fn int32_t ARM_CAN_PowerControl (ARM_POWER_STATE state) + \brief Control CAN interface power. + \param[in] state Power state + - \ref ARM_POWER_OFF : power off: no operation possible + - \ref ARM_POWER_LOW : low power mode: retain state, detect and signal wake-up events + - \ref ARM_POWER_FULL : power on: full operation at maximum performance + \return \ref execution_status + + \fn uint32_t ARM_CAN_GetClock (void) + \brief Retrieve CAN base clock frequency. + \return base clock frequency + + \fn int32_t ARM_CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) + \brief Set bitrate for CAN interface. + \param[in] select Bitrate selection + - \ref ARM_CAN_BITRATE_NOMINAL : nominal (flexible data-rate arbitration) bitrate + - \ref ARM_CAN_BITRATE_FD_DATA : flexible data-rate data bitrate + \param[in] bitrate Bitrate + \param[in] bit_segments Segment time quanta for signal sampling + \return \ref execution_status + + \fn int32_t ARM_CAN_SetMode (ARM_CAN_MODE mode) + \brief Set operating mode for CAN interface. + \param[in] mode Operating mode + - \ref ARM_CAN_MODE_INITIALIZATION : initialization mode + - \ref ARM_CAN_MODE_NORMAL : normal operation mode + - \ref ARM_CAN_MODE_RESTRICTED : restricted operation mode + - \ref ARM_CAN_MODE_MONITOR : bus monitoring mode + - \ref ARM_CAN_MODE_LOOPBACK_INTERNAL : loopback internal mode + - \ref ARM_CAN_MODE_LOOPBACK_EXTERNAL : loopback external mode + \return \ref execution_status + + \fn ARM_CAN_OBJ_CAPABILITIES ARM_CAN_ObjectGetCapabilities (uint32_t obj_idx) + \brief Retrieve capabilities of an object. + \param[in] obj_idx Object index + \return \ref ARM_CAN_OBJ_CAPABILITIES + + \fn int32_t ARM_CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) + \brief Add or remove filter for message reception. + \param[in] obj_idx Object index of object that filter should be or is assigned to + \param[in] operation Operation on filter + - \ref ARM_CAN_FILTER_ID_EXACT_ADD : add exact id filter + - \ref ARM_CAN_FILTER_ID_EXACT_REMOVE : remove exact id filter + - \ref ARM_CAN_FILTER_ID_RANGE_ADD : add range id filter + - \ref ARM_CAN_FILTER_ID_RANGE_REMOVE : remove range id filter + - \ref ARM_CAN_FILTER_ID_MASKABLE_ADD : add maskable id filter + - \ref ARM_CAN_FILTER_ID_MASKABLE_REMOVE : remove maskable id filter + \param[in] id ID or start of ID range (depending on filter type) + \param[in] arg Mask or end of ID range (depending on filter type) + \return \ref execution_status + + \fn int32_t ARM_CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) + \brief Configure object. + \param[in] obj_idx Object index + \param[in] obj_cfg Object configuration state + - \ref ARM_CAN_OBJ_INACTIVE : deactivate object + - \ref ARM_CAN_OBJ_RX : configure object for reception + - \ref ARM_CAN_OBJ_TX : configure object for transmission + - \ref ARM_CAN_OBJ_RX_RTR_TX_DATA : configure object that on RTR reception automatically transmits Data Frame + - \ref ARM_CAN_OBJ_TX_RTR_RX_DATA : configure object that transmits RTR and automatically receives Data Frame + \return \ref execution_status + + \fn int32_t ARM_CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) + \brief Send message on CAN bus. + \param[in] obj_idx Object index + \param[in] msg_info Pointer to CAN message information + \param[in] data Pointer to data buffer + \param[in] size Number of data bytes to send + \return value >= 0 number of data bytes accepted to send + \return value < 0 \ref execution_status + + \fn int32_t ARM_CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) + \brief Read message received on CAN bus. + \param[in] obj_idx Object index + \param[out] msg_info Pointer to read CAN message information + \param[out] data Pointer to data buffer for read data + \param[in] size Maximum number of data bytes to read + \return value >= 0 number of data bytes read + \return value < 0 \ref execution_status + + \fn int32_t ARM_CAN_Control (uint32_t control, uint32_t arg) + \brief Control CAN interface. + \param[in] control Operation + - \ref ARM_CAN_SET_FD_MODE : set FD operation mode + - \ref ARM_CAN_ABORT_MESSAGE_SEND : abort sending of CAN message + - \ref ARM_CAN_CONTROL_RETRANSMISSION : enable/disable automatic retransmission + - \ref ARM_CAN_SET_TRANSCEIVER_DELAY : set transceiver delay + \param[in] arg Argument of operation + \return \ref execution_status + + \fn ARM_CAN_STATUS ARM_CAN_GetStatus (void) + \brief Get CAN status. + \return CAN status \ref ARM_CAN_STATUS + + \fn void ARM_CAN_SignalUnitEvent (uint32_t event) + \brief Signal CAN unit event. + \param[in] event \ref CAN_unit_events + \return none + + \fn void ARM_CAN_SignalObjectEvent (uint32_t obj_idx, uint32_t event) + \brief Signal CAN object event. + \param[in] obj_idx Object index + \param[in] event \ref CAN_events + \return none +*/ + +typedef void (*ARM_CAN_SignalUnitEvent_t) (uint32_t event); ///< Pointer to \ref ARM_CAN_SignalUnitEvent : Signal CAN Unit Event. +typedef void (*ARM_CAN_SignalObjectEvent_t) (uint32_t obj_idx, uint32_t event); ///< Pointer to \ref ARM_CAN_SignalObjectEvent : Signal CAN Object Event. + + +/** +\brief CAN Device Driver Capabilities. +*/ +typedef struct _ARM_CAN_CAPABILITIES { + uint32_t num_objects : 8; ///< Number of \ref can_objects available + uint32_t reentrant_operation : 1; ///< Support for reentrant calls to \ref ARM_CAN_MessageSend, \ref ARM_CAN_MessageRead, \ref ARM_CAN_ObjectConfigure and abort message sending used by \ref ARM_CAN_Control + uint32_t fd_mode : 1; ///< Support for CAN with flexible data-rate mode (CAN_FD) (set by \ref ARM_CAN_Control) + uint32_t restricted_mode : 1; ///< Support for restricted operation mode (set by \ref ARM_CAN_SetMode) + uint32_t monitor_mode : 1; ///< Support for bus monitoring mode (set by \ref ARM_CAN_SetMode) + uint32_t internal_loopback : 1; ///< Support for internal loopback mode (set by \ref ARM_CAN_SetMode) + uint32_t external_loopback : 1; ///< Support for external loopback mode (set by \ref ARM_CAN_SetMode) +} ARM_CAN_CAPABILITIES; + + +/** +\brief Access structure of the CAN Driver. +*/ +typedef struct _ARM_DRIVER_CAN { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_CAN_GetVersion : Get driver version. + ARM_CAN_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_CAN_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event); ///< Pointer to \ref ARM_CAN_Initialize : Initialize CAN interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_CAN_Uninitialize : De-initialize CAN interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_CAN_PowerControl : Control CAN interface power. + uint32_t (*GetClock) (void); ///< Pointer to \ref ARM_CAN_GetClock : Retrieve CAN base clock frequency. + int32_t (*SetBitrate) (ARM_CAN_BITRATE_SELECT select, + uint32_t bitrate, + uint32_t bit_segments); ///< Pointer to \ref ARM_CAN_SetBitrate : Set bitrate for CAN interface. + int32_t (*SetMode) (ARM_CAN_MODE mode); ///< Pointer to \ref ARM_CAN_SetMode : Set operating mode for CAN interface. + ARM_CAN_OBJ_CAPABILITIES (*ObjectGetCapabilities) (uint32_t obj_idx); ///< Pointer to \ref ARM_CAN_ObjectGetCapabilities : Retrieve capabilities of an object. + int32_t (*ObjectSetFilter) (uint32_t obj_idx, + ARM_CAN_FILTER_OPERATION operation, + uint32_t id, + uint32_t arg); ///< Pointer to \ref ARM_CAN_ObjectSetFilter : Add or remove filter for message reception. + int32_t (*ObjectConfigure) (uint32_t obj_idx, + ARM_CAN_OBJ_CONFIG obj_cfg); ///< Pointer to \ref ARM_CAN_ObjectConfigure : Configure object. + int32_t (*MessageSend) (uint32_t obj_idx, + ARM_CAN_MSG_INFO *msg_info, + const uint8_t *data, + uint8_t size); ///< Pointer to \ref ARM_CAN_MessageSend : Send message on CAN bus. + int32_t (*MessageRead) (uint32_t obj_idx, + ARM_CAN_MSG_INFO *msg_info, + uint8_t *data, + uint8_t size); ///< Pointer to \ref ARM_CAN_MessageRead : Read message received on CAN bus. + int32_t (*Control) (uint32_t control, + uint32_t arg); ///< Pointer to \ref ARM_CAN_Control : Control CAN interface. + ARM_CAN_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_CAN_GetStatus : Get CAN status. +} const ARM_DRIVER_CAN; + +#endif /* __DRIVER_CAN_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Common.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Common.h new file mode 100644 index 0000000..b11a115 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Common.h @@ -0,0 +1,72 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 2. Jan 2014 + * $Revision: V2.00 + * + * Project: Common Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Added General return codes definitions + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_COMMON_H +#define __DRIVER_COMMON_H + +#include +#include +#include + +#define ARM_DRIVER_VERSION_MAJOR_MINOR(major,minor) (((major) << 8) | (minor)) + +/** +\brief Driver Version +*/ +typedef struct _ARM_DRIVER_VERSION { + uint16_t api; ///< API version + uint16_t drv; ///< Driver version +} ARM_DRIVER_VERSION; + +/* General return codes */ +#define ARM_DRIVER_OK 0 ///< Operation succeeded +#define ARM_DRIVER_ERROR -1 ///< Unspecified error +#define ARM_DRIVER_ERROR_BUSY -2 ///< Driver is busy +#define ARM_DRIVER_ERROR_TIMEOUT -3 ///< Timeout occurred +#define ARM_DRIVER_ERROR_UNSUPPORTED -4 ///< Operation not supported +#define ARM_DRIVER_ERROR_PARAMETER -5 ///< Parameter error +#define ARM_DRIVER_ERROR_SPECIFIC -6 ///< Start of driver specific errors + +/** +\brief General power states +*/ +typedef enum _ARM_POWER_STATE { + ARM_POWER_OFF, ///< Power off: no operation possible + ARM_POWER_LOW, ///< Low Power mode: retain state, detect and signal wake-up events + ARM_POWER_FULL ///< Power on: full operation at maximum performance +} ARM_POWER_STATE; + +#endif /* __DRIVER_COMMON_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH.h new file mode 100644 index 0000000..ca087b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH.h @@ -0,0 +1,85 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 7. Mar 2014 + * $Revision: V2.00 + * + * Project: Ethernet PHY and MAC Driver common definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * Removed ARM_ETH_STATUS enumerator + * Removed ARM_ETH_MODE enumerator + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_ETH_H +#define __DRIVER_ETH_H + +#include "Driver_Common.h" + +/** +\brief Ethernet Media Interface type +*/ +#define ARM_ETH_INTERFACE_MII 0 ///< Media Independent Interface (MII) +#define ARM_ETH_INTERFACE_RMII 1 ///< Reduced Media Independent Interface (RMII) +#define ARM_ETH_INTERFACE_SMII 2 ///< Serial Media Independent Interface (SMII) + +/** +\brief Ethernet link speed +*/ +#define ARM_ETH_SPEED_10M 0 ///< 10 Mbps link speed +#define ARM_ETH_SPEED_100M 1 ///< 100 Mbps link speed +#define ARM_ETH_SPEED_1G 2 ///< 1 Gpbs link speed + +/** +\brief Ethernet duplex mode +*/ +#define ARM_ETH_DUPLEX_HALF 0 ///< Half duplex link +#define ARM_ETH_DUPLEX_FULL 1 ///< Full duplex link + +/** +\brief Ethernet link state +*/ +typedef enum _ARM_ETH_LINK_STATE { + ARM_ETH_LINK_DOWN, ///< Link is down + ARM_ETH_LINK_UP ///< Link is up +} ARM_ETH_LINK_STATE; + +/** +\brief Ethernet link information +*/ +typedef struct _ARM_ETH_LINK_INFO { + uint32_t speed : 2; ///< Link speed: 0= 10 MBit, 1= 100 MBit, 2= 1 GBit + uint32_t duplex : 1; ///< Duplex mode: 0= Half, 1= Full +} ARM_ETH_LINK_INFO; + +/** +\brief Ethernet MAC Address +*/ +typedef struct _ARM_ETH_MAC_ADDR { + uint8_t b[6]; ///< MAC Address (6 bytes), MSB first +} ARM_ETH_MAC_ADDR; + +#endif /* __DRIVER_ETH_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_MAC.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_MAC.h new file mode 100644 index 0000000..e215f09 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_MAC.h @@ -0,0 +1,301 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 30. May 2014 + * $Revision: V2.01 + * + * Project: Ethernet MAC (Media Access Control) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.01 + * Added ARM_ETH_MAC_SLEEP Control + * Version 2.00 + * Changed MAC Address handling: + * moved from ARM_ETH_MAC_Initialize + * to new functions ARM_ETH_MAC_GetMacAddress and ARM_ETH_MAC_SetMacAddress + * Replaced ARM_ETH_MAC_SetMulticastAddr function with ARM_ETH_MAC_SetAddressFilter + * Extended ARM_ETH_MAC_SendFrame function with flags + * Added ARM_ETH_MAC_Control function: + * more control options (Broadcast, Multicast, Checksum offload, VLAN, ...) + * replaces ARM_ETH_MAC_SetMode + * replaces ARM_ETH_MAC_EnableTx, ARM_ETH_MAC_EnableRx + * Added optional event on transmitted frame + * Added support for PTP (Precision Time Protocol) through new functions: + * ARM_ETH_MAC_ControlTimer + * ARM_ETH_MAC_GetRxFrameTime + * ARM_ETH_MAC_GetTxFrameTime + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Name space prefix ARM_ added + * Version 1.01 + * Renamed capabilities items for checksum offload + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_ETH_MAC_H +#define __DRIVER_ETH_MAC_H + +#include "Driver_ETH.h" + +#define ARM_ETH_MAC_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ + + +#define _ARM_Driver_ETH_MAC_(n) Driver_ETH_MAC##n +#define ARM_Driver_ETH_MAC_(n) _ARM_Driver_ETH_MAC_(n) + + +/****** Ethernet MAC Control Codes *****/ + +#define ARM_ETH_MAC_CONFIGURE (0x01) ///< Configure MAC; arg = configuration +#define ARM_ETH_MAC_CONTROL_TX (0x02) ///< Transmitter; arg: 0=disabled (default), 1=enabled +#define ARM_ETH_MAC_CONTROL_RX (0x03) ///< Receiver; arg: 0=disabled (default), 1=enabled +#define ARM_ETH_MAC_FLUSH (0x04) ///< Flush buffer; arg = ARM_ETH_MAC_FLUSH_... +#define ARM_ETH_MAC_SLEEP (0x05) ///< Sleep mode; arg: 1=enter and wait for Magic packet, 0=exit +#define ARM_ETH_MAC_VLAN_FILTER (0x06) ///< VLAN Filter for received frames; arg15..0: VLAN Tag; arg16: optional ARM_ETH_MAC_VLAN_FILTER_ID_ONLY; 0=disabled (default) + +/*----- Ethernet MAC Configuration -----*/ +#define ARM_ETH_MAC_SPEED_Pos 0 +#define ARM_ETH_MAC_SPEED_Msk (3UL << ARM_ETH_MAC_SPEED_Pos) +#define ARM_ETH_MAC_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_MAC_SPEED_Pos) ///< 10 Mbps link speed +#define ARM_ETH_MAC_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_MAC_SPEED_Pos) ///< 100 Mbps link speed +#define ARM_ETH_MAC_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_MAC_SPEED_Pos) ///< 1 Gpbs link speed +#define ARM_ETH_MAC_DUPLEX_Pos 2 +#define ARM_ETH_MAC_DUPLEX_Msk (1UL << ARM_ETH_MAC_DUPLEX_Pos) +#define ARM_ETH_MAC_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_MAC_DUPLEX_Pos) ///< Half duplex link +#define ARM_ETH_MAC_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_MAC_DUPLEX_Pos) ///< Full duplex link +#define ARM_ETH_MAC_LOOPBACK (1UL << 4) ///< Loop-back test mode +#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX (1UL << 5) ///< Receiver Checksum offload +#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX (1UL << 6) ///< Transmitter Checksum offload +#define ARM_ETH_MAC_ADDRESS_BROADCAST (1UL << 7) ///< Accept frames with Broadcast address +#define ARM_ETH_MAC_ADDRESS_MULTICAST (1UL << 8) ///< Accept frames with any Multicast address +#define ARM_ETH_MAC_ADDRESS_ALL (1UL << 9) ///< Accept frames with any address (Promiscuous Mode) + +/*----- Ethernet MAC Flush Flags -----*/ +#define ARM_ETH_MAC_FLUSH_RX (1UL << 0) ///< Flush Receive buffer +#define ARM_ETH_MAC_FLUSH_TX (1UL << 1) ///< Flush Transmit buffer + +/*----- Ethernet MAC VLAN Filter Flag -----*/ +#define ARM_ETH_MAC_VLAN_FILTER_ID_ONLY (1UL << 16) ///< Compare only the VLAN Identifier (12-bit) + + +/****** Ethernet MAC Frame Transmit Flags *****/ +#define ARM_ETH_MAC_TX_FRAME_FRAGMENT (1UL << 0) ///< Indicate frame fragment +#define ARM_ETH_MAC_TX_FRAME_EVENT (1UL << 1) ///< Generate event when frame is transmitted +#define ARM_ETH_MAC_TX_FRAME_TIMESTAMP (1UL << 2) ///< Capture frame time stamp + + +/****** Ethernet MAC Timer Control Codes *****/ +#define ARM_ETH_MAC_TIMER_GET_TIME (0x01) ///< Get current time +#define ARM_ETH_MAC_TIMER_SET_TIME (0x02) ///< Set new time +#define ARM_ETH_MAC_TIMER_INC_TIME (0x03) ///< Increment current time +#define ARM_ETH_MAC_TIMER_DEC_TIME (0x04) ///< Decrement current time +#define ARM_ETH_MAC_TIMER_SET_ALARM (0x05) ///< Set alarm time +#define ARM_ETH_MAC_TIMER_ADJUST_CLOCK (0x06) ///< Adjust clock frequency; time->ns: correction factor * 2^31 + + +/** +\brief Ethernet MAC Time +*/ +typedef struct _ARM_ETH_MAC_TIME { + uint32_t ns; ///< Nano seconds + uint32_t sec; ///< Seconds +} ARM_ETH_MAC_TIME; + + +/****** Ethernet MAC Event *****/ +#define ARM_ETH_MAC_EVENT_RX_FRAME (1UL << 0) ///< Frame Received +#define ARM_ETH_MAC_EVENT_TX_FRAME (1UL << 1) ///< Frame Transmitted +#define ARM_ETH_MAC_EVENT_WAKEUP (1UL << 2) ///< Wake-up (on Magic Packet) +#define ARM_ETH_MAC_EVENT_TIMER_ALARM (1UL << 3) ///< Timer Alarm + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_ETH_MAC_CAPABILITIES ARM_ETH_MAC_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_ETH_MAC_CAPABILITIES +*/ +/** + \fn int32_t ARM_ETH_MAC_Initialize (ARM_ETH_MAC_SignalEvent_t cb_event) + \brief Initialize Ethernet MAC Device. + \param[in] cb_event Pointer to \ref ARM_ETH_MAC_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_Uninitialize (void) + \brief De-initialize Ethernet MAC Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PowerControl (ARM_POWER_STATE state) + \brief Control Ethernet MAC Device Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) + \brief Get Ethernet MAC Address. + \param[in] ptr_addr Pointer to address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) + \brief Set Ethernet MAC Address. + \param[in] ptr_addr Pointer to address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, + uint32_t num_addr) + \brief Configure Address Filter. + \param[in] ptr_addr Pointer to addresses + \param[in] num_addr Number of addresses to configure + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) + \brief Send Ethernet frame. + \param[in] frame Pointer to frame buffer with data to send + \param[in] len Frame buffer length in bytes + \param[in] flags Frame transmit flags (see ARM_ETH_MAC_TX_FRAME_...) + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_ReadFrame (uint8_t *frame, uint32_t len) + \brief Read data of received Ethernet frame. + \param[in] frame Pointer to frame buffer for data to read into + \param[in] len Frame buffer length in bytes + \return number of data bytes read or execution status + - value >= 0: number of data bytes read + - value < 0: error occurred, value is execution status as defined with \ref execution_status +*/ +/** + \fn uint32_t ARM_ETH_MAC_GetRxFrameSize (void) + \brief Get size of received Ethernet frame. + \return number of bytes in received frame +*/ +/** + \fn int32_t ARM_ETH_MAC_GetRxFrameTime (ARM_ETH_MAC_TIME *time) + \brief Get time of received Ethernet frame. + \param[in] time Pointer to time structure for data to read into + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_GetTxFrameTime (ARM_ETH_MAC_TIME *time) + \brief Get time of transmitted Ethernet frame. + \param[in] time Pointer to time structure for data to read into + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_Control (uint32_t control, uint32_t arg) + \brief Control Ethernet Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) + \brief Control Precision Timer. + \param[in] control Operation + \param[in] time Pointer to time structure + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) + \brief Read Ethernet PHY Register through Management Interface. + \param[in] phy_addr 5-bit device address + \param[in] reg_addr 5-bit register address + \param[out] data Pointer where the result is written to + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) + \brief Write Ethernet PHY Register through Management Interface. + \param[in] phy_addr 5-bit device address + \param[in] reg_addr 5-bit register address + \param[in] data 16-bit data to write + \return \ref execution_status +*/ + +/** + \fn void ARM_ETH_MAC_SignalEvent (uint32_t event) + \brief Callback function that signals a Ethernet Event. + \param[in] event event notification mask + \return none +*/ + +typedef void (*ARM_ETH_MAC_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_ETH_MAC_SignalEvent : Signal Ethernet Event. + + +/** +\brief Ethernet MAC Capabilities +*/ +typedef struct _ARM_ETH_MAC_CAPABILITIES { + uint32_t checksum_offload_rx_ip4 : 1; ///< 1 = IPv4 header checksum verified on receive + uint32_t checksum_offload_rx_ip6 : 1; ///< 1 = IPv6 checksum verification supported on receive + uint32_t checksum_offload_rx_udp : 1; ///< 1 = UDP payload checksum verified on receive + uint32_t checksum_offload_rx_tcp : 1; ///< 1 = TCP payload checksum verified on receive + uint32_t checksum_offload_rx_icmp : 1; ///< 1 = ICMP payload checksum verified on receive + uint32_t checksum_offload_tx_ip4 : 1; ///< 1 = IPv4 header checksum generated on transmit + uint32_t checksum_offload_tx_ip6 : 1; ///< 1 = IPv6 checksum generation supported on transmit + uint32_t checksum_offload_tx_udp : 1; ///< 1 = UDP payload checksum generated on transmit + uint32_t checksum_offload_tx_tcp : 1; ///< 1 = TCP payload checksum generated on transmit + uint32_t checksum_offload_tx_icmp : 1; ///< 1 = ICMP payload checksum generated on transmit + uint32_t media_interface : 2; ///< Ethernet Media Interface type + uint32_t mac_address : 1; ///< 1 = driver provides initial valid MAC address + uint32_t event_rx_frame : 1; ///< 1 = callback event \ref ARM_ETH_MAC_EVENT_RX_FRAME generated + uint32_t event_tx_frame : 1; ///< 1 = callback event \ref ARM_ETH_MAC_EVENT_TX_FRAME generated + uint32_t event_wakeup : 1; ///< 1 = wakeup event \ref ARM_ETH_MAC_EVENT_WAKEUP generated + uint32_t precision_timer : 1; ///< 1 = Precision Timer supported +} ARM_ETH_MAC_CAPABILITIES; + + +/** +\brief Access structure of the Ethernet MAC Driver +*/ +typedef struct _ARM_DRIVER_ETH_MAC { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_MAC_GetVersion : Get driver version. + ARM_ETH_MAC_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_ETH_MAC_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_ETH_MAC_SignalEvent_t cb_event); ///< Pointer to \ref ARM_ETH_MAC_Initialize : Initialize Ethernet MAC Device. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_MAC_Uninitialize : De-initialize Ethernet MAC Device. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_MAC_PowerControl : Control Ethernet MAC Device Power. + int32_t (*GetMacAddress) ( ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_GetMacAddress : Get Ethernet MAC Address. + int32_t (*SetMacAddress) (const ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_SetMacAddress : Set Ethernet MAC Address. + int32_t (*SetAddressFilter)(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr); ///< Pointer to \ref ARM_ETH_MAC_SetAddressFilter : Configure Address Filter. + int32_t (*SendFrame) (const uint8_t *frame, uint32_t len, uint32_t flags); ///< Pointer to \ref ARM_ETH_MAC_SendFrame : Send Ethernet frame. + int32_t (*ReadFrame) ( uint8_t *frame, uint32_t len); ///< Pointer to \ref ARM_ETH_MAC_ReadFrame : Read data of received Ethernet frame. + uint32_t (*GetRxFrameSize) (void); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameSize : Get size of received Ethernet frame. + int32_t (*GetRxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameTime : Get time of received Ethernet frame. + int32_t (*GetTxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetTxFrameTime : Get time of transmitted Ethernet frame. + int32_t (*ControlTimer) (uint32_t control, ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_ControlTimer : Control Precision Timer. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_ETH_MAC_Control : Control Ethernet Interface. + int32_t (*PHY_Read) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register through Management Interface. + int32_t (*PHY_Write) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register through Management Interface. +} const ARM_DRIVER_ETH_MAC; + +#endif /* __DRIVER_ETH_MAC_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_PHY.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_PHY.h new file mode 100644 index 0000000..4066e1c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_ETH_PHY.h @@ -0,0 +1,133 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 7. Mar 2014 + * $Revision: V2.00 + * + * Project: Ethernet PHY (Physical Transceiver) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * changed parameter "mode" in function ARM_ETH_PHY_SetMode + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_ETH_PHY_H +#define __DRIVER_ETH_PHY_H + +#include "Driver_ETH.h" + +#define ARM_ETH_PHY_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,00) /* API version */ + + +#define _ARM_Driver_ETH_PHY_(n) Driver_ETH_PHY##n +#define ARM_Driver_ETH_PHY_(n) _ARM_Driver_ETH_PHY_(n) + + +/****** Ethernet PHY Mode *****/ +#define ARM_ETH_PHY_SPEED_Pos 0 +#define ARM_ETH_PHY_SPEED_Msk (3UL << ARM_ETH_PHY_SPEED_Pos) +#define ARM_ETH_PHY_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_PHY_SPEED_Pos) ///< 10 Mbps link speed +#define ARM_ETH_PHY_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_PHY_SPEED_Pos) ///< 100 Mbps link speed +#define ARM_ETH_PHY_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_PHY_SPEED_Pos) ///< 1 Gpbs link speed +#define ARM_ETH_PHY_DUPLEX_Pos 2 +#define ARM_ETH_PHY_DUPLEX_Msk (1UL << ARM_ETH_PHY_DUPLEX_Pos) +#define ARM_ETH_PHY_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_PHY_DUPLEX_Pos) ///< Half duplex link +#define ARM_ETH_PHY_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_PHY_DUPLEX_Pos) ///< Full duplex link +#define ARM_ETH_PHY_AUTO_NEGOTIATE (1UL << 3) ///< Auto Negotiation mode +#define ARM_ETH_PHY_LOOPBACK (1UL << 4) ///< Loop-back test mode +#define ARM_ETH_PHY_ISOLATE (1UL << 5) ///< Isolate PHY from MII/RMII interface + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_ETH_PHY_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn int32_t ARM_ETH_PHY_Initialize (ARM_ETH_PHY_Read_t fn_read, + ARM_ETH_PHY_Write_t fn_write) + \brief Initialize Ethernet PHY Device. + \param[in] fn_read Pointer to \ref ARM_ETH_MAC_PHY_Read + \param[in] fn_write Pointer to \ref ARM_ETH_MAC_PHY_Write + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_Uninitialize (void) + \brief De-initialize Ethernet PHY Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_PowerControl (ARM_POWER_STATE state) + \brief Control Ethernet PHY Device Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_SetInterface (uint32_t interface) + \brief Set Ethernet Media Interface. + \param[in] interface Media Interface type + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_SetMode (uint32_t mode) + \brief Set Ethernet PHY Device Operation mode. + \param[in] mode Operation Mode + \return \ref execution_status +*/ +/** + \fn ARM_ETH_LINK_STATE ARM_ETH_PHY_GetLinkState (void) + \brief Get Ethernet PHY Device Link state. + \return current link status \ref ARM_ETH_LINK_STATE +*/ +/** + \fn ARM_ETH_LINK_INFO ARM_ETH_PHY_GetLinkInfo (void) + \brief Get Ethernet PHY Device Link information. + \return current link parameters \ref ARM_ETH_LINK_INFO +*/ + + +typedef int32_t (*ARM_ETH_PHY_Read_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register. +typedef int32_t (*ARM_ETH_PHY_Write_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register. + + +/** +\brief Access structure of the Ethernet PHY Driver +*/ +typedef struct _ARM_DRIVER_ETH_PHY { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_PHY_GetVersion : Get driver version. + int32_t (*Initialize) (ARM_ETH_PHY_Read_t fn_read, + ARM_ETH_PHY_Write_t fn_write); ///< Pointer to \ref ARM_ETH_PHY_Initialize : Initialize PHY Device. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_PHY_Uninitialize : De-initialize PHY Device. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_PHY_PowerControl : Control PHY Device Power. + int32_t (*SetInterface) (uint32_t interface); ///< Pointer to \ref ARM_ETH_PHY_SetInterface : Set Ethernet Media Interface. + int32_t (*SetMode) (uint32_t mode); ///< Pointer to \ref ARM_ETH_PHY_SetMode : Set Ethernet PHY Device Operation mode. + ARM_ETH_LINK_STATE (*GetLinkState) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkState : Get Ethernet PHY Device Link state. + ARM_ETH_LINK_INFO (*GetLinkInfo) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkInfo : Get Ethernet PHY Device Link information. +} const ARM_DRIVER_ETH_PHY; + +#endif /* __DRIVER_ETH_PHY_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Flash.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Flash.h new file mode 100644 index 0000000..0223299 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_Flash.h @@ -0,0 +1,194 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 31. Mar 2014 + * $Revision: V2.00 + * + * Project: Flash Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * Renamed driver NOR -> Flash (more generic) + * Non-blocking operation + * Added Events, Status and Capabilities + * Linked Flash information (GetInfo) + * Version 1.11 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_FLASH_H +#define __DRIVER_FLASH_H + +#include "Driver_Common.h" + +#define ARM_FLASH_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,00) /* API version */ + + +#define _ARM_Driver_Flash_(n) Driver_Flash##n +#define ARM_Driver_Flash_(n) _ARM_Driver_Flash_(n) + + +#define ARM_FLASH_SECTOR_INFO(addr,size) { (addr), (addr)+(size)-1 } + +/** +\brief Flash Sector information +*/ +typedef struct _ARM_FLASH_SECTOR { + uint32_t start; ///< Sector Start address + uint32_t end; ///< Sector End address (start+size-1) +} const ARM_FLASH_SECTOR; + +/** +\brief Flash information +*/ +typedef struct _ARM_FLASH_INFO { + ARM_FLASH_SECTOR *sector_info; ///< Sector layout information (NULL=Uniform sectors) + uint32_t sector_count; ///< Number of sectors + uint32_t sector_size; ///< Uniform sector size in bytes (0=sector_info used) + uint32_t page_size; ///< Optimal programming page size in bytes + uint32_t program_unit; ///< Smallest programmable unit in bytes + uint8_t erased_value; ///< Contents of erased memory (usually 0xFF) +} const ARM_FLASH_INFO; + + +/** +\brief Flash Status +*/ +typedef struct _ARM_FLASH_STATUS { + uint32_t busy : 1; ///< Flash busy flag + uint32_t error : 1; ///< Read/Program/Erase error flag (cleared on start of next operation) +} ARM_FLASH_STATUS; + + +/****** Flash Event *****/ +#define ARM_FLASH_EVENT_READY (1UL << 0) ///< Flash Ready +#define ARM_FLASH_EVENT_ERROR (1UL << 1) ///< Read/Program/Erase Error + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_Flash_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_FLASH_CAPABILITIES +*/ +/** + \fn int32_t ARM_Flash_Initialize (ARM_Flash_SignalEvent_t cb_event) + \brief Initialize the Flash Interface. + \param[in] cb_event Pointer to \ref ARM_Flash_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_Uninitialize (void) + \brief De-initialize the Flash Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_PowerControl (ARM_POWER_STATE state) + \brief Control the Flash interface power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_ReadData (uint32_t addr, void *data, uint32_t cnt) + \brief Read data from Flash. + \param[in] addr Data address. + \param[out] data Pointer to a buffer storing the data read from Flash. + \param[in] cnt Number of data items to read. + \return number of data items read or \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_ProgramData (uint32_t addr, const void *data, uint32_t cnt) + \brief Program data to Flash. + \param[in] addr Data address. + \param[in] data Pointer to a buffer containing the data to be programmed to Flash. + \param[in] cnt Number of data items to program. + \return number of data items programmed or \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_EraseSector (uint32_t addr) + \brief Erase Flash Sector. + \param[in] addr Sector address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_EraseChip (void) + \brief Erase complete Flash. + Optional function for faster full chip erase. + \return \ref execution_status +*/ +/** + \fn ARM_FLASH_STATUS ARM_Flash_GetStatus (void) + \brief Get Flash status. + \return Flash status \ref ARM_FLASH_STATUS +*/ +/** + \fn ARM_FLASH_INFO * ARM_Flash_GetInfo (void) + \brief Get Flash information. + \return Pointer to Flash information \ref ARM_FLASH_INFO +*/ + +/** + \fn void ARM_Flash_SignalEvent (uint32_t event) + \brief Signal Flash event. + \param[in] event Event notification mask + \return none +*/ + +typedef void (*ARM_Flash_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_Flash_SignalEvent : Signal Flash Event. + + +/** +\brief Flash Driver Capabilities. +*/ +typedef struct _ARM_FLASH_CAPABILITIES { + uint32_t event_ready : 1; ///< Signal Flash Ready event + uint32_t data_width : 2; ///< Data width: 0=8-bit, 1=16-bit, 2=32-bit + uint32_t erase_chip : 1; ///< Supports EraseChip operation +} ARM_FLASH_CAPABILITIES; + + +/** +\brief Access structure of the Flash Driver +*/ +typedef struct _ARM_DRIVER_FLASH { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_Flash_GetVersion : Get driver version. + ARM_FLASH_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_Flash_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_Flash_SignalEvent_t cb_event); ///< Pointer to \ref ARM_Flash_Initialize : Initialize Flash Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_Flash_Uninitialize : De-initialize Flash Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_Flash_PowerControl : Control Flash Interface Power. + int32_t (*ReadData) (uint32_t addr, void *data, uint32_t cnt); ///< Pointer to \ref ARM_Flash_ReadData : Read data from Flash. + int32_t (*ProgramData) (uint32_t addr, const void *data, uint32_t cnt); ///< Pointer to \ref ARM_Flash_ProgramData : Program data to Flash. + int32_t (*EraseSector) (uint32_t addr); ///< Pointer to \ref ARM_Flash_EraseSector : Erase Flash Sector. + int32_t (*EraseChip) (void); ///< Pointer to \ref ARM_Flash_EraseChip : Erase complete Flash. + ARM_FLASH_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_Flash_GetStatus : Get Flash status. + ARM_FLASH_INFO * (*GetInfo) (void); ///< Pointer to \ref ARM_Flash_GetInfo : Get Flash information. +} const ARM_DRIVER_FLASH; + +#endif /* __DRIVER_FLASH_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_I2C.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_I2C.h new file mode 100644 index 0000000..da05f98 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_I2C.h @@ -0,0 +1,207 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 9. May 2014 + * $Revision: V2.02 + * + * Project: I2C (Inter-Integrated Circuit) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.02 + * Removed function ARM_I2C_MasterTransfer in order to simplify drivers + * and added back parameter "xfer_pending" to functions + * ARM_I2C_MasterTransmit and ARM_I2C_MasterReceive + * Version 2.01 + * Added function ARM_I2C_MasterTransfer and removed parameter "xfer_pending" + * from functions ARM_I2C_MasterTransmit and ARM_I2C_MasterReceive + * Added function ARM_I2C_GetDataCount + * Removed flag "address_nack" from ARM_I2C_STATUS + * Replaced events ARM_I2C_EVENT_MASTER_DONE and ARM_I2C_EVENT_SLAVE_DONE + * with event ARM_I2C_EVENT_TRANSFER_DONE + * Added event ARM_I2C_EVENT_TRANSFER_INCOMPLETE + * Removed parameter "arg" from function ARM_I2C_SignalEvent + * Version 2.00 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * Added: + * Slave Mode + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_I2C_H +#define __DRIVER_I2C_H + +#include "Driver_Common.h" + +#define ARM_I2C_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,02) /* API version */ + + +/****** I2C Control Codes *****/ + +#define ARM_I2C_OWN_ADDRESS (0x01) ///< Set Own Slave Address; arg = address +#define ARM_I2C_BUS_SPEED (0x02) ///< Set Bus Speed; arg = speed +#define ARM_I2C_BUS_CLEAR (0x03) ///< Execute Bus clear: send nine clock pulses +#define ARM_I2C_ABORT_TRANSFER (0x04) ///< Abort Master/Slave Transmit/Receive + +/*----- I2C Bus Speed -----*/ +#define ARM_I2C_BUS_SPEED_STANDARD (0x01) ///< Standard Speed (100kHz) +#define ARM_I2C_BUS_SPEED_FAST (0x02) ///< Fast Speed (400kHz) +#define ARM_I2C_BUS_SPEED_FAST_PLUS (0x03) ///< Fast+ Speed ( 1MHz) +#define ARM_I2C_BUS_SPEED_HIGH (0x04) ///< High Speed (3.4MHz) + + +/****** I2C Address Flags *****/ + +#define ARM_I2C_ADDRESS_10BIT 0x0400 ///< 10-bit address flag +#define ARM_I2C_ADDRESS_GC 0x8000 ///< General Call flag + + +/** +\brief I2C Status +*/ +typedef struct _ARM_I2C_STATUS { + uint32_t busy : 1; ///< Busy flag + uint32_t mode : 1; ///< Mode: 0=Slave, 1=Master + uint32_t direction : 1; ///< Direction: 0=Transmitter, 1=Receiver + uint32_t general_call : 1; ///< General Call indication (cleared on start of next Slave operation) + uint32_t arbitration_lost : 1; ///< Master lost arbitration (cleared on start of next Master operation) + uint32_t bus_error : 1; ///< Bus error detected (cleared on start of next Master/Slave operation) +} ARM_I2C_STATUS; + + +/****** I2C Event *****/ +#define ARM_I2C_EVENT_TRANSFER_DONE (1UL << 0) ///< Master/Slave Transmit/Receive finished +#define ARM_I2C_EVENT_TRANSFER_INCOMPLETE (1UL << 1) ///< Master/Slave Transmit/Receive incomplete transfer +#define ARM_I2C_EVENT_SLAVE_TRANSMIT (1UL << 2) ///< Slave Transmit operation requested +#define ARM_I2C_EVENT_SLAVE_RECEIVE (1UL << 3) ///< Slave Receive operation requested +#define ARM_I2C_EVENT_ADDRESS_NACK (1UL << 4) ///< Address not acknowledged from Slave +#define ARM_I2C_EVENT_GENERAL_CALL (1UL << 5) ///< General Call indication +#define ARM_I2C_EVENT_ARBITRATION_LOST (1UL << 6) ///< Master lost arbitration +#define ARM_I2C_EVENT_BUS_ERROR (1UL << 7) ///< Bus error detected (START/STOP at illegal position) +#define ARM_I2C_EVENT_BUS_CLEAR (1UL << 8) ///< Bus clear finished + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_I2C_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_I2C_CAPABILITIES ARM_I2C_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_I2C_CAPABILITIES + + \fn int32_t ARM_I2C_Initialize (ARM_I2C_SignalEvent_t cb_event) + \brief Initialize I2C Interface. + \param[in] cb_event Pointer to \ref ARM_I2C_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_I2C_Uninitialize (void) + \brief De-initialize I2C Interface. + \return \ref execution_status + + \fn int32_t ARM_I2C_PowerControl (ARM_POWER_STATE state) + \brief Control I2C Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_I2C_MasterTransmit (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending) + \brief Start transmitting data as I2C Master. + \param[in] addr Slave address (7-bit or 10-bit) + \param[in] data Pointer to buffer with data to transmit to I2C Slave + \param[in] num Number of data bytes to transmit + \param[in] xfer_pending Transfer operation is pending - Stop condition will not be generated + \return \ref execution_status + + \fn int32_t ARM_I2C_MasterReceive (uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending) + \brief Start receiving data as I2C Master. + \param[in] addr Slave address (7-bit or 10-bit) + \param[out] data Pointer to buffer for data to receive from I2C Slave + \param[in] num Number of data bytes to receive + \param[in] xfer_pending Transfer operation is pending - Stop condition will not be generated + \return \ref execution_status + + \fn int32_t ARM_I2C_SlaveTransmit (const uint8_t *data, uint32_t num) + \brief Start transmitting data as I2C Slave. + \param[in] data Pointer to buffer with data to transmit to I2C Master + \param[in] num Number of data bytes to transmit + \return \ref execution_status + + \fn int32_t ARM_I2C_SlaveReceive (uint8_t *data, uint32_t num) + \brief Start receiving data as I2C Slave. + \param[out] data Pointer to buffer for data to receive from I2C Master + \param[in] num Number of data bytes to receive + \return \ref execution_status + + \fn int32_t ARM_I2C_GetDataCount (void) + \brief Get transferred data count. + \return number of data bytes transferred; -1 when Slave is not addressed by Master + + \fn int32_t ARM_I2C_Control (uint32_t control, uint32_t arg) + \brief Control I2C Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status + + \fn ARM_I2C_STATUS ARM_I2C_GetStatus (void) + \brief Get I2C status. + \return I2C status \ref ARM_I2C_STATUS + + \fn void ARM_I2C_SignalEvent (uint32_t event) + \brief Signal I2C Events. + \param[in] event \ref I2C_events notification mask +*/ + +typedef void (*ARM_I2C_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_I2C_SignalEvent : Signal I2C Event. + + +/** +\brief I2C Driver Capabilities. +*/ +typedef struct _ARM_I2C_CAPABILITIES { + uint32_t address_10_bit : 1; ///< supports 10-bit addressing +} ARM_I2C_CAPABILITIES; + + +/** +\brief Access structure of the I2C Driver. +*/ +typedef struct _ARM_DRIVER_I2C { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_I2C_GetVersion : Get driver version. + ARM_I2C_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_I2C_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_I2C_SignalEvent_t cb_event); ///< Pointer to \ref ARM_I2C_Initialize : Initialize I2C Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_I2C_Uninitialize : De-initialize I2C Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_I2C_PowerControl : Control I2C Interface Power. + int32_t (*MasterTransmit) (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to \ref ARM_I2C_MasterTransmit : Start transmitting data as I2C Master. + int32_t (*MasterReceive) (uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to \ref ARM_I2C_MasterReceive : Start receiving data as I2C Master. + int32_t (*SlaveTransmit) ( const uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_I2C_SlaveTransmit : Start transmitting data as I2C Slave. + int32_t (*SlaveReceive) ( uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_I2C_SlaveReceive : Start receiving data as I2C Slave. + int32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_I2C_GetDataCount : Get transferred data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_I2C_Control : Control I2C Interface. + ARM_I2C_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_I2C_GetStatus : Get I2C status. +} const ARM_DRIVER_I2C; + +#endif /* __DRIVER_I2C_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_MCI.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_MCI.h new file mode 100644 index 0000000..93375d0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_MCI.h @@ -0,0 +1,350 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 16. May 2014 + * $Revision: V2.02 + * + * Project: MCI (Memory Card Interface) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.02 + * Added timeout and error flags to ARM_MCI_STATUS + * Added support for controlling optional RST_n pin (eMMC) + * Removed explicit Clock Control (ARM_MCI_CONTROL_CLOCK) + * Removed event ARM_MCI_EVENT_BOOT_ACK_TIMEOUT + * Version 2.01 + * Decoupled SPI mode from MCI driver + * Replaced function ARM_MCI_CardSwitchRead with ARM_MCI_ReadCD and ARM_MCI_ReadWP + * Version 2.00 + * Added support for: + * SD UHS-I (Ultra High Speed) + * SD I/O Interrupt + * Read Wait (SD I/O) + * Suspend/Resume (SD I/O) + * MMC Interrupt + * MMC Boot + * Stream Data transfer (MMC) + * VCCQ Power Supply Control (eMMC) + * Command Completion Signal (CCS) for CE-ATA + * Added ARM_MCI_Control function + * Added ARM_MCI_GetStatus function + * Removed ARM_MCI_BusMode, ARM_MCI_BusDataWidth, ARM_MCI_BusSingaling functions + * (replaced by ARM_MCI_Control) + * Changed ARM_MCI_CardPower function (voltage parameter) + * Changed ARM_MCI_SendCommnad function (flags parameter) + * Changed ARM_MCI_SetupTransfer function (mode parameter) + * Removed ARM_MCI_ReadTransfer and ARM_MCI_WriteTransfer functions + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_MCI_H +#define __DRIVER_MCI_H + +#include "Driver_Common.h" + +#define ARM_MCI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,02) /* API version */ + + +/****** MCI Send Command Flags *****/ +#define ARM_MCI_RESPONSE_Pos 0 +#define ARM_MCI_RESPONSE_Msk (3UL << ARM_MCI_RESPONSE_Pos) +#define ARM_MCI_RESPONSE_NONE (0UL << ARM_MCI_RESPONSE_Pos) ///< No response expected (default) +#define ARM_MCI_RESPONSE_SHORT (1UL << ARM_MCI_RESPONSE_Pos) ///< Short response (48-bit) +#define ARM_MCI_RESPONSE_SHORT_BUSY (2UL << ARM_MCI_RESPONSE_Pos) ///< Short response with busy signal (48-bit) +#define ARM_MCI_RESPONSE_LONG (3UL << ARM_MCI_RESPONSE_Pos) ///< Long response (136-bit) + +#define ARM_MCI_RESPONSE_INDEX (1UL << 2) ///< Check command index in response +#define ARM_MCI_RESPONSE_CRC (1UL << 3) ///< Check CRC in response + +#define ARM_MCI_WAIT_BUSY (1UL << 4) ///< Wait until busy before sending the command + +#define ARM_MCI_TRANSFER_DATA (1UL << 5) ///< Activate Data transfer + +#define ARM_MCI_CARD_INITIALIZE (1UL << 6) ///< Execute Memory Card initialization sequence + +#define ARM_MCI_INTERRUPT_COMMAND (1UL << 7) ///< Send Interrupt command (CMD40 - MMC only) +#define ARM_MCI_INTERRUPT_RESPONSE (1UL << 8) ///< Send Interrupt response (CMD40 - MMC only) + +#define ARM_MCI_BOOT_OPERATION (1UL << 9) ///< Execute Boot operation (MMC only) +#define ARM_MCI_BOOT_ALTERNATIVE (1UL << 10) ///< Execute Alternative Boot operation (MMC only) +#define ARM_MCI_BOOT_ACK (1UL << 11) ///< Expect Boot Acknowledge (MMC only) + +#define ARM_MCI_CCSD (1UL << 12) ///< Send Command Completion Signal Disable (CCSD) for CE-ATA device +#define ARM_MCI_CCS (1UL << 13) ///< Expect Command Completion Signal (CCS) for CE-ATA device + + +/****** MCI Setup Transfer Mode *****/ +#define ARM_MCI_TRANSFER_READ (0UL << 0) ///< Data Read Transfer (from MCI) +#define ARM_MCI_TRANSFER_WRITE (1UL << 0) ///< Data Write Transfer (to MCI) +#define ARM_MCI_TRANSFER_BLOCK (0UL << 1) ///< Block Data transfer (default) +#define ARM_MCI_TRANSFER_STREAM (1UL << 1) ///< Stream Data transfer (MMC only) + + +/****** MCI Control Codes *****/ +#define ARM_MCI_BUS_SPEED (0x01) ///< Set Bus Speed; arg = requested speed in bits/s; returns configured speed in bits/s +#define ARM_MCI_BUS_SPEED_MODE (0x02) ///< Set Bus Speed Mode as specified with arg +#define ARM_MCI_BUS_CMD_MODE (0x03) ///< Set CMD Line Mode as specified with arg +#define ARM_MCI_BUS_DATA_WIDTH (0x04) ///< Set Bus Data Width as specified with arg +#define ARM_MCI_DRIVER_STRENGTH (0x05) ///< Set SD UHS-I Driver Strength as specified with arg +#define ARM_MCI_CONTROL_RESET (0x06) ///< Control optional RST_n Pin (eMMC); arg: 0=inactive, 1=active +#define ARM_MCI_CONTROL_CLOCK_IDLE (0x07) ///< Control Clock generation on CLK Pin when idle; arg: 0=disabled, 1=enabled +#define ARM_MCI_UHS_TUNING_OPERATION (0x08) ///< Sampling clock Tuning operation (SD UHS-I); arg: 0=reset, 1=execute +#define ARM_MCI_UHS_TUNING_RESULT (0x09) ///< Sampling clock Tuning result (SD UHS-I); returns: 0=done, 1=in progress, -1=error +#define ARM_MCI_DATA_TIMEOUT (0x0A) ///< Set Data timeout; arg = timeout in bus cycles +#define ARM_MCI_CSS_TIMEOUT (0x0B) ///< Set Command Completion Signal (CCS) timeout; arg = timeout in bus cycles +#define ARM_MCI_MONITOR_SDIO_INTERRUPT (0x0C) ///< Monitor SD I/O interrupt: arg: 0=disabled, 1=enabled +#define ARM_MCI_CONTROL_READ_WAIT (0x0D) ///< Control Read/Wait for SD I/O; arg: 0=disabled, 1=enabled +#define ARM_MCI_SUSPEND_TRANSFER (0x0E) ///< Suspend Data transfer (SD I/O); returns number of remaining bytes to transfer +#define ARM_MCI_RESUME_TRANSFER (0x0F) ///< Resume Data transfer (SD I/O) + +/*----- MCI Bus Speed Mode -----*/ +#define ARM_MCI_BUS_DEFAULT_SPEED (0x00) ///< SD/MMC: Default Speed mode up to 25/26MHz +#define ARM_MCI_BUS_HIGH_SPEED (0x01) ///< SD/MMC: High Speed mode up to 50/52MHz +#define ARM_MCI_BUS_UHS_SDR12 (0x02) ///< SD: SDR12 (Single Data Rate) up to 25MHz, 12.5MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR25 (0x03) ///< SD: SDR25 (Single Data Rate) up to 50MHz, 25 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR50 (0x04) ///< SD: SDR50 (Single Data Rate) up to 100MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR104 (0x05) ///< SD: SDR104 (Single Data Rate) up to 208MHz, 104 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_DDR50 (0x06) ///< SD: DDR50 (Dual Data Rate) up to 50MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling + +/*----- MCI CMD Line Mode -----*/ +#define ARM_MCI_BUS_CMD_PUSH_PULL (0x00) ///< Push-Pull CMD line (default) +#define ARM_MCI_BUS_CMD_OPEN_DRAIN (0x01) ///< Open Drain CMD line (MMC only) + +/*----- MCI Bus Data Width -----*/ +#define ARM_MCI_BUS_DATA_WIDTH_1 (0x00) ///< Bus data width: 1 bit (default) +#define ARM_MCI_BUS_DATA_WIDTH_4 (0x01) ///< Bus data width: 4 bits +#define ARM_MCI_BUS_DATA_WIDTH_8 (0x02) ///< Bus data width: 8 bits +#define ARM_MCI_BUS_DATA_WIDTH_4_DDR (0x03) ///< Bus data width: 4 bits, DDR (Dual Data Rate) - MMC only +#define ARM_MCI_BUS_DATA_WIDTH_8_DDR (0x04) ///< Bus data width: 8 bits, DDR (Dual Data Rate) - MMC only + +/*----- MCI Driver Strength -----*/ +#define ARM_MCI_DRIVER_TYPE_A (0x01) ///< SD UHS-I Driver Type A +#define ARM_MCI_DRIVER_TYPE_B (0x00) ///< SD UHS-I Driver Type B (default) +#define ARM_MCI_DRIVER_TYPE_C (0x02) ///< SD UHS-I Driver Type C +#define ARM_MCI_DRIVER_TYPE_D (0x03) ///< SD UHS-I Driver Type D + + +/****** MCI Card Power *****/ +#define ARM_MCI_POWER_VDD_Pos 0 +#define ARM_MCI_POWER_VDD_Msk (0x0FUL << ARM_MCI_POWER_VDD_Pos) +#define ARM_MCI_POWER_VDD_OFF (0x01UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) turned off +#define ARM_MCI_POWER_VDD_3V3 (0x02UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 3.3V +#define ARM_MCI_POWER_VDD_1V8 (0x03UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 1.8V +#define ARM_MCI_POWER_VCCQ_Pos 4 +#define ARM_MCI_POWER_VCCQ_Msk (0x0FUL << ARM_MCI_POWER_VCCQ_Pos) +#define ARM_MCI_POWER_VCCQ_OFF (0x01UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ turned off +#define ARM_MCI_POWER_VCCQ_3V3 (0x02UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 3.3V +#define ARM_MCI_POWER_VCCQ_1V8 (0x03UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.8V +#define ARM_MCI_POWER_VCCQ_1V2 (0x04UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.2V + + +/** +\brief MCI Status +*/ +typedef struct _ARM_MCI_STATUS { + uint32_t command_active : 1; ///< Command active flag + uint32_t command_timeout : 1; ///< Command timeout flag (cleared on start of next command) + uint32_t command_error : 1; ///< Command error flag (cleared on start of next command) + uint32_t transfer_active : 1; ///< Transfer active flag + uint32_t transfer_timeout : 1; ///< Transfer timeout flag (cleared on start of next command) + uint32_t transfer_error : 1; ///< Transfer error flag (cleared on start of next command) + uint32_t sdio_interrupt : 1; ///< SD I/O Interrupt flag (cleared on start of monitoring) + uint32_t ccs : 1; ///< CCS flag (cleared on start of next command) +} ARM_MCI_STATUS; + + +/****** MCI Card Event *****/ +#define ARM_MCI_EVENT_CARD_INSERTED (1UL << 0) ///< Memory Card inserted +#define ARM_MCI_EVENT_CARD_REMOVED (1UL << 1) ///< Memory Card removed +#define ARM_MCI_EVENT_COMMAND_COMPLETE (1UL << 2) ///< Command completed +#define ARM_MCI_EVENT_COMMAND_TIMEOUT (1UL << 3) ///< Command timeout +#define ARM_MCI_EVENT_COMMAND_ERROR (1UL << 4) ///< Command response error (CRC error or invalid response) +#define ARM_MCI_EVENT_TRANSFER_COMPLETE (1UL << 5) ///< Data transfer completed +#define ARM_MCI_EVENT_TRANSFER_TIMEOUT (1UL << 6) ///< Data transfer timeout +#define ARM_MCI_EVENT_TRANSFER_ERROR (1UL << 7) ///< Data transfer CRC failed +#define ARM_MCI_EVENT_SDIO_INTERRUPT (1UL << 8) ///< SD I/O Interrupt +#define ARM_MCI_EVENT_CCS (1UL << 9) ///< Command Completion Signal (CCS) +#define ARM_MCI_EVENT_CCS_TIMEOUT (1UL << 10) ///< Command Completion Signal (CCS) Timeout + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_MCI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_MCI_CAPABILITIES ARM_MCI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_MCI_CAPABILITIES +*/ +/** + \fn int32_t ARM_MCI_Initialize (ARM_MCI_SignalEvent_t cb_event) + \brief Initialize the Memory Card Interface + \param[in] cb_event Pointer to \ref ARM_MCI_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_Uninitialize (void) + \brief De-initialize Memory Card Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_PowerControl (ARM_POWER_STATE state) + \brief Control Memory Card Interface Power. + \param[in] state Power state \ref ARM_POWER_STATE + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_CardPower (uint32_t voltage) + \brief Set Memory Card Power supply voltage. + \param[in] voltage Memory Card Power supply voltage + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_ReadCD (void) + \brief Read Card Detect (CD) state. + \return 1:card detected, 0:card not detected, or error +*/ +/** + \fn int32_t ARM_MCI_ReadWP (void) + \brief Read Write Protect (WP) state. + \return 1:write protected, 0:not write protected, or error +*/ +/** + \fn int32_t ARM_MCI_SendCommand (uint32_t cmd, + uint32_t arg, + uint32_t flags, + uint32_t *response) + \brief Send Command to card and get the response. + \param[in] cmd Memory Card command + \param[in] arg Command argument + \param[in] flags Command flags + \param[out] response Pointer to buffer for response + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_SetupTransfer (uint8_t *data, + uint32_t block_count, + uint32_t block_size, + uint32_t mode) + \brief Setup read or write transfer operation. + \param[in,out] data Pointer to data block(s) to be written or read + \param[in] block_count Number of blocks + \param[in] block_size Size of a block in bytes + \param[in] mode Transfer mode + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_AbortTransfer (void) + \brief Abort current read/write data transfer. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_Control (uint32_t control, uint32_t arg) + \brief Control MCI Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status +*/ +/** + \fn ARM_MCI_STATUS ARM_MCI_GetStatus (void) + \brief Get MCI status. + \return MCI status \ref ARM_MCI_STATUS +*/ + +/** + \fn void ARM_MCI_SignalEvent (uint32_t event) + \brief Callback function that signals a MCI Card Event. + \param[in] event \ref mci_event_gr + \return none +*/ + +typedef void (*ARM_MCI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_MCI_SignalEvent : Signal MCI Card Event. + + +/** +\brief MCI Driver Capabilities. +*/ +typedef struct _ARM_MCI_CAPABILITIES { + uint32_t cd_state : 1; ///< Card Detect State available + uint32_t cd_event : 1; ///< Signal Card Detect change event + uint32_t wp_state : 1; ///< Write Protect State available + uint32_t vdd : 1; ///< Supports VDD Card Power Supply Control + uint32_t vdd_1v8 : 1; ///< Supports 1.8 VDD Card Power Supply + uint32_t vccq : 1; ///< Supports VCCQ Card Power Supply Control (eMMC) + uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ Card Power Supply (eMMC) + uint32_t vccq_1v2 : 1; ///< Supports 1.2 VCCQ Card Power Supply (eMMC) + uint32_t data_width_4 : 1; ///< Supports 4-bit data + uint32_t data_width_8 : 1; ///< Supports 8-bit data + uint32_t data_width_4_ddr : 1; ///< Supports 4-bit data, DDR (Dual Data Rate) - MMC only + uint32_t data_width_8_ddr : 1; ///< Supports 8-bit data, DDR (Dual Data Rate) - MMC only + uint32_t high_speed : 1; ///< Supports SD/MMC High Speed Mode + uint32_t uhs_signaling : 1; ///< Supports SD UHS-I (Ultra High Speed) 1.8V signaling + uint32_t uhs_tuning : 1; ///< Supports SD UHS-I tuning + uint32_t uhs_sdr50 : 1; ///< Supports SD UHS-I SDR50 (Single Data Rate) up to 50MB/s + uint32_t uhs_sdr104 : 1; ///< Supports SD UHS-I SDR104 (Single Data Rate) up to 104MB/s + uint32_t uhs_ddr50 : 1; ///< Supports SD UHS-I DDR50 (Dual Data Rate) up to 50MB/s + uint32_t uhs_driver_type_a : 1; ///< Supports SD UHS-I Driver Type A + uint32_t uhs_driver_type_c : 1; ///< Supports SD UHS-I Driver Type C + uint32_t uhs_driver_type_d : 1; ///< Supports SD UHS-I Driver Type D + uint32_t sdio_interrupt : 1; ///< Supports SD I/O Interrupt + uint32_t read_wait : 1; ///< Supports Read Wait (SD I/O) + uint32_t suspend_resume : 1; ///< Supports Suspend/Resume (SD I/O) + uint32_t mmc_interrupt : 1; ///< Supports MMC Interrupt + uint32_t mmc_boot : 1; ///< Supports MMC Boot + uint32_t rst_n : 1; ///< Supports RST_n Pin Control (eMMC) + uint32_t ccs : 1; ///< Supports Command Completion Signal (CCS) for CE-ATA + uint32_t ccs_timeout : 1; ///< Supports Command Completion Signal (CCS) timeout for CE-ATA +} ARM_MCI_CAPABILITIES; + + +/** +\brief Access structure of the MCI Driver. +*/ +typedef struct _ARM_DRIVER_MCI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_MCI_GetVersion : Get driver version. + ARM_MCI_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_MCI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_MCI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_MCI_Initialize : Initialize MCI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_MCI_Uninitialize : De-initialize MCI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_MCI_PowerControl : Control MCI Interface Power. + int32_t (*CardPower) (uint32_t voltage); ///< Pointer to \ref ARM_MCI_CardPower : Set card power supply voltage. + int32_t (*ReadCD) (void); ///< Pointer to \ref ARM_MCI_ReadCD : Read Card Detect (CD) state. + int32_t (*ReadWP) (void); ///< Pointer to \ref ARM_MCI_ReadWP : Read Write Protect (WP) state. + int32_t (*SendCommand) (uint32_t cmd, + uint32_t arg, + uint32_t flags, + uint32_t *response); ///< Pointer to \ref ARM_MCI_SendCommand : Send Command to card and get the response. + int32_t (*SetupTransfer) (uint8_t *data, + uint32_t block_count, + uint32_t block_size, + uint32_t mode); ///< Pointer to \ref ARM_MCI_SetupTransfer : Setup data transfer operation. + int32_t (*AbortTransfer) (void); ///< Pointer to \ref ARM_MCI_AbortTransfer : Abort current data transfer. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_MCI_Control : Control MCI Interface. + ARM_MCI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_MCI_GetStatus : Get MCI status. +} const ARM_DRIVER_MCI; + +#endif /* __DRIVER_MCI_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_NAND.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_NAND.h new file mode 100644 index 0000000..a11a1ed --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_NAND.h @@ -0,0 +1,403 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 30. May 2014 + * $Revision: V2.01 + * + * Project: NAND Flash Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.01 + * Updated ARM_NAND_ECC_INFO structure and ARM_NAND_ECC_xxx definitions + * Version 2.00 + * New simplified driver: + * complexity moved to upper layer (command agnostic) + * Added support for: + * NV-DDR & NV-DDR2 Interface (ONFI specification) + * VCC, VCCQ and VPP Power Supply Control + * WP (Write Protect) Control + * Version 1.11 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_NAND_H +#define __DRIVER_NAND_H + +#include "Driver_Common.h" + +#define ARM_NAND_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ + + +/****** NAND Device Power *****/ +#define ARM_NAND_POWER_VCC_Pos 0 +#define ARM_NAND_POWER_VCC_Msk (0x07UL << ARM_NAND_POWER_VCC_Pos) +#define ARM_NAND_POWER_VCC_OFF (0x01UL << ARM_NAND_POWER_VCC_Pos) ///< VCC Power off +#define ARM_NAND_POWER_VCC_3V3 (0x02UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 3.3V +#define ARM_NAND_POWER_VCC_1V8 (0x03UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 1.8V +#define ARM_NAND_POWER_VCCQ_Pos 3 +#define ARM_NAND_POWER_VCCQ_Msk (0x07UL << ARM_NAND_POWER_VCCQ_Pos) +#define ARM_NAND_POWER_VCCQ_OFF (0x01UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ I/O Power off +#define ARM_NAND_POWER_VCCQ_3V3 (0x02UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 3.3V +#define ARM_NAND_POWER_VCCQ_1V8 (0x03UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 1.8V +#define ARM_NAND_POWER_VPP_OFF (1UL << 6) ///< VPP off +#define ARM_NAND_POWER_VPP_ON (1Ul << 7) ///< VPP on + + +/****** NAND Control Codes *****/ +#define ARM_NAND_BUS_MODE (0x01) ///< Set Bus Mode as specified with arg +#define ARM_NAND_BUS_DATA_WIDTH (0x02) ///< Set Bus Data Width as specified with arg +#define ARM_NAND_DRIVER_STRENGTH (0x03) ///< Set Driver Strength as specified with arg +#define ARM_NAND_DEVICE_READY_EVENT (0x04) ///< Generate \ref ARM_NAND_EVENT_DEVICE_READY; arg: 0=disabled (default), 1=enabled +#define ARM_NAND_DRIVER_READY_EVENT (0x05) ///< Generate \ref ARM_NAND_EVENT_DRIVER_READY; arg: 0=disabled (default), 1=enabled + +/*----- NAND Bus Mode (ONFI - Open NAND Flash Interface) -----*/ +#define ARM_NAND_BUS_INTERFACE_Pos 4 +#define ARM_NAND_BUS_INTERFACE_Msk (0x03UL << ARM_NAND_BUS_INTERFACE_Pos) +#define ARM_NAND_BUS_SDR (0x00UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: SDR (Single Data Rate) - Traditional interface (default) +#define ARM_NAND_BUS_DDR (0x01UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR (Double Data Rate) +#define ARM_NAND_BUS_DDR2 (0x02UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR2 (Double Data Rate) +#define ARM_NAND_BUS_TIMING_MODE_Pos 0 +#define ARM_NAND_BUS_TIMING_MODE_Msk (0x0FUL << ARM_NAND_BUS_TIMING_MODE_Pos) +#define ARM_NAND_BUS_TIMING_MODE_0 (0x00UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 0 (default) +#define ARM_NAND_BUS_TIMING_MODE_1 (0x01UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 1 +#define ARM_NAND_BUS_TIMING_MODE_2 (0x02UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 2 +#define ARM_NAND_BUS_TIMING_MODE_3 (0x03UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 3 +#define ARM_NAND_BUS_TIMING_MODE_4 (0x04UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 4 (SDR EDO capable) +#define ARM_NAND_BUS_TIMING_MODE_5 (0x05UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 5 (SDR EDO capable) +#define ARM_NAND_BUS_TIMING_MODE_6 (0x06UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 6 (NV-DDR2 only) +#define ARM_NAND_BUS_TIMING_MODE_7 (0x07UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 7 (NV-DDR2 only) +#define ARM_NAND_BUS_DDR2_DO_WCYC_Pos 8 +#define ARM_NAND_BUS_DDR2_DO_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) +#define ARM_NAND_BUS_DDR2_DO_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 0 (default) +#define ARM_NAND_BUS_DDR2_DO_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 1 +#define ARM_NAND_BUS_DDR2_DO_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 2 +#define ARM_NAND_BUS_DDR2_DO_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 4 +#define ARM_NAND_BUS_DDR2_DI_WCYC_Pos 12 +#define ARM_NAND_BUS_DDR2_DI_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) +#define ARM_NAND_BUS_DDR2_DI_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 0 (default) +#define ARM_NAND_BUS_DDR2_DI_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 1 +#define ARM_NAND_BUS_DDR2_DI_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 2 +#define ARM_NAND_BUS_DDR2_DI_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 4 +#define ARM_NAND_BUS_DDR2_VEN (1UL << 16) ///< DDR2 Enable external VREFQ as reference +#define ARM_NAND_BUS_DDR2_CMPD (1UL << 17) ///< DDR2 Enable complementary DQS (DQS_c) signal +#define ARM_NAND_BUS_DDR2_CMPR (1UL << 18) ///< DDR2 Enable complementary RE_n (RE_c) signal + +/*----- NAND Data Bus Width -----*/ +#define ARM_NAND_BUS_DATA_WIDTH_8 (0x00) ///< Bus Data Width: 8 bit (default) +#define ARM_NAND_BUS_DATA_WIDTH_16 (0x01) ///< Bus Data Width: 16 bit + +/*----- NAND Driver Strength (ONFI - Open NAND Flash Interface) -----*/ +#define ARM_NAND_DRIVER_STRENGTH_18 (0x00) ///< Driver Strength 2.0x = 18 Ohms +#define ARM_NAND_DRIVER_STRENGTH_25 (0x01) ///< Driver Strength 1.4x = 25 Ohms +#define ARM_NAND_DRIVER_STRENGTH_35 (0x02) ///< Driver Strength 1.0x = 35 Ohms (default) +#define ARM_NAND_DRIVER_STRENGTH_50 (0x03) ///< Driver Strength 0.7x = 50 Ohms + + +/****** NAND ECC for Read/Write Data Mode and Sequence Execution Code *****/ +#define ARM_NAND_ECC_INDEX_Pos 0 +#define ARM_NAND_ECC_INDEX_Msk (0xFFUL << ARM_NAND_ECC_INDEX_Pos) +#define ARM_NAND_ECC(n) ((n) & ARM_NAND_ECC_INDEX_Msk) ///< Select ECC +#define ARM_NAND_ECC0 (1UL << 8) ///< Use ECC0 of selected ECC +#define ARM_NAND_ECC1 (1UL << 9) ///< Use ECC1 of selected ECC + +/****** NAND Flag for Read/Write Data Mode and Sequence Execution Code *****/ +#define ARM_NAND_DRIVER_DONE_EVENT (1UL << 16) ///< Generate \ref ARM_NAND_EVENT_DRIVER_DONE + +/****** NAND Sequence Execution Code *****/ +#define ARM_NAND_CODE_SEND_CMD1 (1UL << 17) ///< Send Command 1 +#define ARM_NAND_CODE_SEND_ADDR_COL1 (1UL << 18) ///< Send Column Address 1 +#define ARM_NAND_CODE_SEND_ADDR_COL2 (1UL << 19) ///< Send Column Address 2 +#define ARM_NAND_CODE_SEND_ADDR_ROW1 (1UL << 20) ///< Send Row Address 1 +#define ARM_NAND_CODE_SEND_ADDR_ROW2 (1UL << 21) ///< Send Row Address 2 +#define ARM_NAND_CODE_SEND_ADDR_ROW3 (1UL << 22) ///< Send Row Address 3 +#define ARM_NAND_CODE_INC_ADDR_ROW (1UL << 23) ///< Auto-increment Row Address +#define ARM_NAND_CODE_WRITE_DATA (1UL << 24) ///< Write Data +#define ARM_NAND_CODE_SEND_CMD2 (1UL << 25) ///< Send Command 2 +#define ARM_NAND_CODE_WAIT_BUSY (1UL << 26) ///< Wait while R/Bn busy +#define ARM_NAND_CODE_READ_DATA (1UL << 27) ///< Read Data +#define ARM_NAND_CODE_SEND_CMD3 (1UL << 28) ///< Send Command 3 +#define ARM_NAND_CODE_READ_STATUS (1UL << 29) ///< Read Status byte and check FAIL bit (bit 0) + +/*----- NAND Sequence Execution Code: Command -----*/ +#define ARM_NAND_CODE_CMD1_Pos 0 +#define ARM_NAND_CODE_CMD1_Msk (0xFFUL << ARM_NAND_CODE_CMD1_Pos) +#define ARM_NAND_CODE_CMD2_Pos 8 +#define ARM_NAND_CODE_CMD2_Msk (0xFFUL << ARM_NAND_CODE_CMD2_Pos) +#define ARM_NAND_CODE_CMD3_Pos 16 +#define ARM_NAND_CODE_CMD3_Msk (0xFFUL << ARM_NAND_CODE_CMD3_Pos) + +/*----- NAND Sequence Execution Code: Column Address -----*/ +#define ARM_NAND_CODE_ADDR_COL1_Pos 0 +#define ARM_NAND_CODE_ADDR_COL1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL1_Pos) +#define ARM_NAND_CODE_ADDR_COL2_Pos 8 +#define ARM_NAND_CODE_ADDR_COL2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL2_Pos) + +/*----- NAND Sequence Execution Code: Row Address -----*/ +#define ARM_NAND_CODE_ADDR_ROW1_Pos 0 +#define ARM_NAND_CODE_ADDR_ROW1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW1_Pos) +#define ARM_NAND_CODE_ADDR_ROW2_Pos 8 +#define ARM_NAND_CODE_ADDR_ROW2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW2_Pos) +#define ARM_NAND_CODE_ADDR_ROW3_Pos 16 +#define ARM_NAND_CODE_ADDR_ROW3_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW3_Pos) + + +/****** NAND specific error codes *****/ +#define ARM_NAND_ERROR_ECC (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< ECC generation/correction failed + + +/** +\brief NAND ECC (Error Correction Code) Information +*/ +typedef struct _ARM_NAND_ECC_INFO { + uint32_t type : 2; ///< Type: 1=ECC0 over Data, 2=ECC0 over Data+Spare, 3=ECC0 over Data and ECC1 over Spare + uint32_t page_layout : 1; ///< Page layout: 0=|Data0|Spare0|...|DataN-1|SpareN-1|, 1=|Data0|...|DataN-1|Spare0|...|SpareN-1| + uint32_t page_count : 3; ///< Number of virtual pages: N = 2 ^ page_count + uint32_t page_size : 4; ///< Virtual Page size (Data+Spare): 0=512+16, 1=1k+32, 2=2k+64, 3=4k+128, 4=8k+256, 8=512+28, 9=1k+56, 10=2k+112, 11=4k+224, 12=8k+448 + uint32_t reserved : 14; ///< Reserved (must be zero) + uint32_t correctable_bits : 8; ///< Number of correctable bits (based on 512 byte codeword size) + uint16_t codeword_size [2]; ///< Number of bytes over which ECC is calculated + uint16_t ecc_size [2]; ///< ECC size in bytes (rounded up) + uint16_t ecc_offset [2]; ///< ECC offset in bytes (where ECC starts in Spare area) +} ARM_NAND_ECC_INFO; + + +/** +\brief NAND Status +*/ +typedef struct _ARM_NAND_STATUS { + uint32_t busy : 1; ///< Driver busy flag + uint32_t ecc_error : 1; ///< ECC error detected (cleared on next Read/WriteData or ExecuteSequence) +} ARM_NAND_STATUS; + + +/****** NAND Event *****/ +#define ARM_NAND_EVENT_DEVICE_READY (1UL << 0) ///< Device Ready: R/Bn rising edge +#define ARM_NAND_EVENT_DRIVER_READY (1UL << 1) ///< Driver Ready +#define ARM_NAND_EVENT_DRIVER_DONE (1UL << 2) ///< Driver operation done +#define ARM_NAND_EVENT_ECC_ERROR (1UL << 3) ///< ECC could not correct data + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_NAND_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_NAND_CAPABILITIES +*/ +/** + \fn int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event) + \brief Initialize the NAND Interface. + \param[in] cb_event Pointer to \ref ARM_NAND_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_Uninitialize (void) + \brief De-initialize the NAND Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state) + \brief Control the NAND interface power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_DevicePower (uint32_t voltage) + \brief Set device power supply voltage. + \param[in] voltage NAND Device supply voltage + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable) + \brief Control WPn (Write Protect). + \param[in] dev_num Device number + \param[in] enable + - \b false Write Protect off + - \b true Write Protect on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable) + \brief Control CEn (Chip Enable). + \param[in] dev_num Device number + \param[in] enable + - \b false Chip Enable off + - \b true Chip Enable on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num) + \brief Get Device Busy pin state. + \param[in] dev_num Device number + \return 1=busy, 0=not busy, or error +*/ +/** + \fn int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd) + \brief Send command to NAND device. + \param[in] dev_num Device number + \param[in] cmd Command + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr) + \brief Send address to NAND device. + \param[in] dev_num Device number + \param[in] addr Address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode) + \brief Read data from NAND device. + \param[in] dev_num Device number + \param[out] data Pointer to buffer for data to read from NAND device + \param[in] cnt Number of data items to read + \param[in] mode Operation mode + \return number of data items read or \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode) + \brief Write data to NAND device. + \param[in] dev_num Device number + \param[out] data Pointer to buffer with data to write to NAND device + \param[in] cnt Number of data items to write + \param[in] mode Operation mode + \return number of data items written or \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd, + uint32_t addr_col, uint32_t addr_row, + void *data, uint32_t data_cnt, + uint8_t *status, uint32_t *count) + \brief Execute sequence of operations. + \param[in] dev_num Device number + \param[in] code Sequence code + \param[in] cmd Command(s) + \param[in] addr_col Column address + \param[in] addr_row Row address + \param[in,out] data Pointer to data to be written or read + \param[in] data_cnt Number of data items in one iteration + \param[out] status Pointer to status read + \param[in,out] count Number of iterations + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_AbortSequence (uint32_t dev_num) + \brief Abort sequence execution. + \param[in] dev_num Device number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg) + \brief Control NAND Interface. + \param[in] dev_num Device number + \param[in] control Operation + \param[in] arg Argument of operation + \return \ref execution_status +*/ +/** + \fn ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num) + \brief Get NAND status. + \param[in] dev_num Device number + \return NAND status \ref ARM_NAND_STATUS +*/ +/** + \fn int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info) + \brief Inquire about available ECC. + \param[in] index Device number + \param[out] info Pointer to ECC information \ref ARM_NAND_ECC_INFO retrieved + \return \ref execution_status +*/ + +/** + \fn void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event) + \brief Signal NAND event. + \param[in] dev_num Device number + \param[in] event Event notification mask + \return none +*/ + +typedef void (*ARM_NAND_SignalEvent_t) (uint32_t dev_num, uint32_t event); ///< Pointer to \ref ARM_NAND_SignalEvent : Signal NAND Event. + + +/** +\brief NAND Driver Capabilities. +*/ +typedef struct _ARM_NAND_CAPABILITIES { + uint32_t event_device_ready : 1; ///< Signal Device Ready event (R/Bn rising edge) + uint32_t reentrant_operation : 1; ///< Supports re-entrant operation (SendCommand/Address, Read/WriteData) + uint32_t sequence_operation : 1; ///< Supports Sequence operation (ExecuteSequence, AbortSequence) + uint32_t vcc : 1; ///< Supports VCC Power Supply Control + uint32_t vcc_1v8 : 1; ///< Supports 1.8 VCC Power Supply + uint32_t vccq : 1; ///< Supports VCCQ I/O Power Supply Control + uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ I/O Power Supply + uint32_t vpp : 1; ///< Supports VPP High Voltage Power Supply Control + uint32_t wp : 1; ///< Supports WPn (Write Protect) Control + uint32_t ce_lines : 4; ///< Number of CEn (Chip Enable) lines: ce_lines + 1 + uint32_t ce_manual : 1; ///< Supports manual CEn (Chip Enable) Control + uint32_t rb_monitor : 1; ///< Supports R/Bn (Ready/Busy) Monitoring + uint32_t data_width_16 : 1; ///< Supports 16-bit data + uint32_t ddr : 1; ///< Supports NV-DDR Data Interface (ONFI) + uint32_t ddr2 : 1; ///< Supports NV-DDR2 Data Interface (ONFI) + uint32_t sdr_timing_mode : 3; ///< Fastest (highest) SDR Timing Mode supported (ONFI) + uint32_t ddr_timing_mode : 3; ///< Fastest (highest) NV_DDR Timing Mode supported (ONFI) + uint32_t ddr2_timing_mode : 3; ///< Fastest (highest) NV_DDR2 Timing Mode supported (ONFI) + uint32_t driver_strength_18 : 1; ///< Supports Driver Strength 2.0x = 18 Ohms + uint32_t driver_strength_25 : 1; ///< Supports Driver Strength 1.4x = 25 Ohms + uint32_t driver_strength_50 : 1; ///< Supports Driver Strength 0.7x = 50 Ohms +} ARM_NAND_CAPABILITIES; + + +/** +\brief Access structure of the NAND Driver. +*/ +typedef struct _ARM_DRIVER_NAND { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_NAND_GetVersion : Get driver version. + ARM_NAND_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_NAND_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_NAND_SignalEvent_t cb_event); ///< Pointer to \ref ARM_NAND_Initialize : Initialize NAND Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_NAND_Uninitialize : De-initialize NAND Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_NAND_PowerControl : Control NAND Interface Power. + int32_t (*DevicePower) (uint32_t voltage); ///< Pointer to \ref ARM_NAND_DevicePower : Set device power supply voltage. + int32_t (*WriteProtect) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_WriteProtect : Control WPn (Write Protect). + int32_t (*ChipEnable) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_ChipEnable : Control CEn (Chip Enable). + int32_t (*GetDeviceBusy) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetDeviceBusy : Get Device Busy pin state. + int32_t (*SendCommand) (uint32_t dev_num, uint8_t cmd); ///< Pointer to \ref ARM_NAND_SendCommand : Send command to NAND device. + int32_t (*SendAddress) (uint32_t dev_num, uint8_t addr); ///< Pointer to \ref ARM_NAND_SendAddress : Send address to NAND device. + int32_t (*ReadData) (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_ReadData : Read data from NAND device. + int32_t (*WriteData) (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_WriteData : Write data to NAND device. + int32_t (*ExecuteSequence)(uint32_t dev_num, uint32_t code, uint32_t cmd, + uint32_t addr_col, uint32_t addr_row, + void *data, uint32_t data_cnt, + uint8_t *status, uint32_t *count); ///< Pointer to \ref ARM_NAND_ExecuteSequence : Execute sequence of operations. + int32_t (*AbortSequence) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_AbortSequence : Abort sequence execution. + int32_t (*Control) (uint32_t dev_num, uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_NAND_Control : Control NAND Interface. + ARM_NAND_STATUS (*GetStatus) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetStatus : Get NAND status. + int32_t (*InquireECC) ( int32_t index, ARM_NAND_ECC_INFO *info); ///< Pointer to \ref ARM_NAND_InquireECC : Inquire about available ECC. +} const ARM_DRIVER_NAND; + +#endif /* __DRIVER_NAND_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SAI.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SAI.h new file mode 100644 index 0000000..52c54d5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SAI.h @@ -0,0 +1,298 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 9. Dec 2014 + * $Revision: V1.00 + * + * Project: SAI (Serial Audio Interface) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_SAI_H +#define __DRIVER_SAI_H + +#include "Driver_Common.h" + +#define ARM_SAI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,00) /* API version */ + + +/****** SAI Control Codes *****/ + +#define ARM_SAI_CONTROL_Msk (0xFFU) +#define ARM_SAI_CONFIGURE_TX (0x01U) ///< Configure Transmitter; arg1 and arg2 provide additional configuration +#define ARM_SAI_CONFIGURE_RX (0x02U) ///< Configure Receiver; arg1 and arg2 provide additional configuration +#define ARM_SAI_CONTROL_TX (0x03U) ///< Control Transmitter; arg1.0: 0=disable (default), 1=enable; arg1.1: mute +#define ARM_SAI_CONTROL_RX (0x04U) ///< Control Receiver; arg1.0: 0=disable (default), 1=enable +#define ARM_SAI_MASK_SLOTS_TX (0x05U) ///< Mask Transmitter slots; arg1 = mask (bit: 0=active, 1=inactive); all configured slots are active by default +#define ARM_SAI_MASK_SLOTS_RX (0x06U) ///< Mask Receiver slots; arg1 = mask (bit: 0=active, 1=inactive); all configured slots are active by default +#define ARM_SAI_ABORT_SEND (0x07U) ///< Abort \ref ARM_SAI_Send +#define ARM_SAI_ABORT_RECEIVE (0x08U) ///< Abort \ref ARM_SAI_Receive + +/*----- SAI Control Codes: Configuration Parameters: Mode -----*/ +#define ARM_SAI_MODE_Pos 8 +#define ARM_SAI_MODE_Msk (1U << ARM_SAI_MODE_Pos) +#define ARM_SAI_MODE_MASTER (1U << ARM_SAI_MODE_Pos) ///< Master Mode +#define ARM_SAI_MODE_SLAVE (0U << ARM_SAI_MODE_Pos) ///< Slave Mode (default) + +/*----- SAI Control Codes: Configuration Parameters: Synchronization -----*/ +#define ARM_SAI_SYNCHRONIZATION_Pos 9 +#define ARM_SAI_SYNCHRONIZATION_Msk (1U << ARM_SAI_SYNCHRONIZATION_Pos) +#define ARM_SAI_ASYNCHRONOUS (0U << ARM_SAI_SYNCHRONIZATION_Pos) ///< Asynchronous (default) +#define ARM_SAI_SYNCHRONOUS (1U << ARM_SAI_SYNCHRONIZATION_Pos) ///< Synchronous + +/*----- SAI Control Codes: Configuration Parameters: Protocol -----*/ +#define ARM_SAI_PROTOCOL_Pos 10 +#define ARM_SAI_PROTOCOL_Msk (7U << ARM_SAI_PROTOCOL_Pos) +#define ARM_SAI_PROTOCOL_USER (0U << ARM_SAI_PROTOCOL_Pos) ///< User defined (default) +#define ARM_SAI_PROTOCOL_I2S (1U << ARM_SAI_PROTOCOL_Pos) ///< I2S +#define ARM_SAI_PROTOCOL_MSB_JUSTIFIED (2U << ARM_SAI_PROTOCOL_Pos) ///< MSB (left) justified +#define ARM_SAI_PROTOCOL_LSB_JUSTIFIED (3U << ARM_SAI_PROTOCOL_Pos) ///< LSB (right) justified +#define ARM_SAI_PROTOCOL_PCM_SHORT (4U << ARM_SAI_PROTOCOL_Pos) ///< PCM with short frame +#define ARM_SAI_PROTOCOL_PCM_LONG (5U << ARM_SAI_PROTOCOL_Pos) ///< PCM with long frame +#define ARM_SAI_PROTOCOL_AC97 (6U << ARM_SAI_PROTOCOL_Pos) ///< AC'97 + +/*----- SAI Control Codes: Configuration Parameters: Data Size -----*/ +#define ARM_SAI_DATA_SIZE_Pos 13 +#define ARM_SAI_DATA_SIZE_Msk (0x1FU << ARM_SAI_DATA_SIZE_Pos) +#define ARM_SAI_DATA_SIZE(n) ((((n)-1)&0x1FU) << ARM_SAI_DATA_SIZE_Pos) ///< Data size in bits (8..32) + +/*----- SAI Control Codes: Configuration Parameters: Bit Order -----*/ +#define ARM_SAI_BIT_ORDER_Pos 18 +#define ARM_SAI_BIT_ORDER_Msk (1U << ARM_SAI_BIT_ORDER_Pos) +#define ARM_SAI_MSB_FIRST (0U << ARM_SAI_BIT_ORDER_Pos) ///< Data is transferred with MSB first (default) +#define ARM_SAI_LSB_FIRST (1U << ARM_SAI_BIT_ORDER_Pos) ///< Data is transferred with LSB first; User Protocol only (ignored otherwise) + +/*----- SAI Control Codes: Configuration Parameters: Mono Mode -----*/ +#define ARM_SAI_MONO_MODE (1U << 19) ///< Mono Mode (only for I2S, MSB/LSB justified) + +/*----- SAI Control Codes:Configuration Parameters: Companding -----*/ +#define ARM_SAI_COMPANDING_Pos 20 +#define ARM_SAI_COMPANDING_Msk (3U << ARM_SAI_COMPANDING_Pos) +#define ARM_SAI_COMPANDING_NONE (0U << ARM_SAI_COMPANDING_Pos) ///< No compading (default) +#define ARM_SAI_COMPANDING_A_LAW (2U << ARM_SAI_COMPANDING_Pos) ///< A-Law companding +#define ARM_SAI_COMPANDING_U_LAW (3U << ARM_SAI_COMPANDING_Pos) ///< u-Law companding + +/*----- SAI Control Codes: Configuration Parameters: Clock Polarity -----*/ +#define ARM_SAI_CLOCK_POLARITY_Pos 23 +#define ARM_SAI_CLOCK_POLARITY_Msk (1U << ARM_SAI_CLOCK_POLARITY_Pos) +#define ARM_SAI_CLOCK_POLARITY_0 (0U << ARM_SAI_CLOCK_POLARITY_Pos) ///< Drive on falling edge, Capture on rising edge (default) +#define ARM_SAI_CLOCK_POLARITY_1 (1U << ARM_SAI_CLOCK_POLARITY_Pos) ///< Drive on rising edge, Capture on falling edge + +/*----- SAI Control Codes: Configuration Parameters: Master Clock Pin -----*/ +#define ARM_SAI_MCLK_PIN_Pos 24 +#define ARM_SAI_MCLK_PIN_Msk (3U << ARM_SAI_MCLK_PIN_Pos) +#define ARM_SAI_MCLK_PIN_INACTIVE (0U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK not used (default) +#define ARM_SAI_MCLK_PIN_OUTPUT (1U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK is output (Master only) +#define ARM_SAI_MCLK_PIN_INPUT (2U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK is input (Master only) + + +/****** SAI Configuration (arg1) *****/ + +/*----- SAI Configuration (arg1): Frame Length -----*/ +#define ARM_SAI_FRAME_LENGTH_Pos 0 +#define ARM_SAI_FRAME_LENGTH_Msk (0x3FFU << ARM_SAI_FRAME_LENGTH_Pos) +#define ARM_SAI_FRAME_LENGTH(n) ((((n)-1)&0x3FFU) << ARM_SAI_FRAME_LENGTH_Pos) ///< Frame length in bits (8..1024); default depends on protocol and data + +/*----- SAI Configuration (arg1): Frame Sync Width -----*/ +#define ARM_SAI_FRAME_SYNC_WIDTH_Pos 10 +#define ARM_SAI_FRAME_SYNC_WIDTH_Msk (0xFFU << ARM_SAI_FRAME_SYNC_WIDTH_Pos) +#define ARM_SAI_FRAME_SYNC_WIDTH(n) ((((n)-1)&0xFFU) << ARM_SAI_FRAME_SYNC_WIDTH_Pos) ///< Frame Sync width in bits (1..256); default=1; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Frame Sync Polarity -----*/ +#define ARM_SAI_FRAME_SYNC_POLARITY_Pos 18 +#define ARM_SAI_FRAME_SYNC_POLARITY_Msk (1U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) +#define ARM_SAI_FRAME_SYNC_POLARITY_HIGH (0U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) ///< Frame Sync is active high (default); User Protocol only (ignored otherwise) +#define ARM_SAI_FRAME_SYNC_POLARITY_LOW (1U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) ///< Frame Sync is active low; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Frame Sync Early -----*/ +#define ARM_SAI_FRAME_SYNC_EARLY (1U << 19) ///< Frame Sync one bit before the first bit of the frame; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Count -----*/ +#define ARM_SAI_SLOT_COUNT_Pos 20 +#define ARM_SAI_SLOT_COUNT_Msk (0x1FU << ARM_SAI_SLOT_COUNT_Pos) +#define ARM_SAI_SLOT_COUNT(n) ((((n)-1)&0x1FU) << ARM_SAI_SLOT_COUNT_Pos) ///< Number of slots in frame (1..32); default=1; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Size -----*/ +#define ARM_SAI_SLOT_SIZE_Pos 25 +#define ARM_SAI_SLOT_SIZE_Msk (3U << ARM_SAI_SLOT_SIZE_Pos) +#define ARM_SAI_SLOT_SIZE_DEFAULT (0U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size is equal to data size (default) +#define ARM_SAI_SLOT_SIZE_16 (1U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size = 16 bits; User Protocol only (ignored otherwise) +#define ARM_SAI_SLOT_SIZE_32 (3U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size = 32 bits; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Offset -----*/ +#define ARM_SAI_SLOT_OFFSET_Pos 27 +#define ARM_SAI_SLOT_OFFSET_Msk (0x1FU << ARM_SAI_SLOT_OFFSET_Pos) +#define ARM_SAI_SLOT_OFFSET(n) (((n)&0x1FU) << ARM_SAI_SLOT_OFFSET_Pos) ///< Offset of first data bit in slot (0..31); default=0; User Protocol only (ignored otherwise) + +/****** SAI Configuration (arg2) *****/ + +/*----- SAI Control Codes: Configuration Parameters: Audio Frequency (Master only) -----*/ +#define ARM_SAI_AUDIO_FREQ_Msk (0x0FFFFFU) ///< Audio frequency mask + +/*----- SAI Control Codes: Configuration Parameters: Master Clock Prescaler (Master only and MCLK Pin) -----*/ +#define ARM_SAI_MCLK_PRESCALER_Pos 20 +#define ARM_SAI_MCLK_PRESCALER_Msk (0xFFFU << ARM_SAI_MCLK_PRESCALER_Pos) +#define ARM_SAI_MCLK_PRESCALER(n) ((((n)-1)&0xFFFU) << ARM_SAI_MCLK_PRESCALER_Pos) ///< MCLK prescaler; Audio_frequency = MCLK/n; n = 1..4096 (default=1) + + +/****** SAI specific error codes *****/ +#define ARM_SAI_ERROR_SYNCHRONIZATION (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Synchronization not supported +#define ARM_SAI_ERROR_PROTOCOL (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified Protocol not supported +#define ARM_SAI_ERROR_DATA_SIZE (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified Data size not supported +#define ARM_SAI_ERROR_BIT_ORDER (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Bit order not supported +#define ARM_SAI_ERROR_MONO_MODE (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified Mono mode not supported +#define ARM_SAI_ERROR_COMPANDING (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< Specified Companding not supported +#define ARM_SAI_ERROR_CLOCK_POLARITY (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Specified Clock polarity not supported +#define ARM_SAI_ERROR_AUDIO_FREQ (ARM_DRIVER_ERROR_SPECIFIC - 8) ///< Specified Audio frequency not supported +#define ARM_SAI_ERROR_MCLK_PIN (ARM_DRIVER_ERROR_SPECIFIC - 9) ///< Specified MCLK Pin setting not supported +#define ARM_SAI_ERROR_MCLK_PRESCALER (ARM_DRIVER_ERROR_SPECIFIC - 10) ///< Specified MCLK Prescaler not supported +#define ARM_SAI_ERROR_FRAME_LENGHT (ARM_DRIVER_ERROR_SPECIFIC - 11) ///< Specified Frame length not supported +#define ARM_SAI_ERROR_FRAME_SYNC_WIDTH (ARM_DRIVER_ERROR_SPECIFIC - 12) ///< Specified Frame Sync width not supported +#define ARM_SAI_ERROR_FRAME_SYNC_POLARITY (ARM_DRIVER_ERROR_SPECIFIC - 13) ///< Specified Frame Sync polarity not supported +#define ARM_SAI_ERROR_FRAME_SYNC_EARLY (ARM_DRIVER_ERROR_SPECIFIC - 14) ///< Specified Frame Sync early not supported +#define ARM_SAI_ERROR_SLOT_COUNT (ARM_DRIVER_ERROR_SPECIFIC - 15) ///< Specified Slot count not supported +#define ARM_SAI_ERROR_SLOT_SIZE (ARM_DRIVER_ERROR_SPECIFIC - 16) ///< Specified Slot size not supported +#define ARM_SAI_ERROR_SLOT_OFFESET (ARM_DRIVER_ERROR_SPECIFIC - 17) ///< Specified Slot offset not supported + + +/** +\brief SAI Status +*/ +typedef struct _ARM_SAI_STATUS { + uint32_t tx_busy : 1; ///< Transmitter busy flag + uint32_t rx_busy : 1; ///< Receiver busy flag + uint32_t tx_underflow : 1; ///< Transmit data underflow detected (cleared on start of next send operation) + uint32_t rx_overflow : 1; ///< Receive data overflow detected (cleared on start of next receive operation) + uint32_t frame_error : 1; ///< Sync Frame error detected (cleared on start of next send/receive operation) +} ARM_SAI_STATUS; + + +/****** SAI Event *****/ +#define ARM_SAI_EVENT_SEND_COMPLETE (1U << 0) ///< Send completed +#define ARM_SAI_EVENT_RECEIVE_COMPLETE (1U << 1) ///< Receive completed +#define ARM_SAI_EVENT_TX_UNDERFLOW (1U << 2) ///< Transmit data not available +#define ARM_SAI_EVENT_RX_OVERFLOW (1U << 3) ///< Receive data overflow +#define ARM_SAI_EVENT_FRAME_ERROR (1U << 4) ///< Sync Frame error in Slave mode (optional) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_SAI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_SAI_CAPABILITIES ARM_SAI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_SAI_CAPABILITIES + + \fn int32_t ARM_SAI_Initialize (ARM_SAI_SignalEvent_t cb_event) + \brief Initialize SAI Interface. + \param[in] cb_event Pointer to \ref ARM_SAI_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_SAI_Uninitialize (void) + \brief De-initialize SAI Interface. + \return \ref execution_status + + \fn int32_t ARM_SAI_PowerControl (ARM_POWER_STATE state) + \brief Control SAI Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_SAI_Send (const void *data, uint32_t num) + \brief Start sending data to SAI transmitter. + \param[in] data Pointer to buffer with data to send to SAI transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_SAI_Receive (void *data, uint32_t num) + \brief Start receiving data from SAI receiver. + \param[out] data Pointer to buffer for data to receive from SAI receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn uint32_t ARM_SAI_GetTxCount (void) + \brief Get transmitted data count. + \return number of data items transmitted + + \fn uint32_t ARM_SAI_GetRxCount (void) + \brief Get received data count. + \return number of data items received + + \fn int32_t ARM_SAI_Control (uint32_t control, uint32_t arg1, uint32_t arg2) + \brief Control SAI Interface. + \param[in] control Operation + \param[in] arg1 Argument 1 of operation (optional) + \param[in] arg2 Argument 2 of operation (optional) + \return common \ref execution_status and driver specific \ref sai_execution_status + + \fn ARM_SAI_STATUS ARM_SAI_GetStatus (void) + \brief Get SAI status. + \return SAI status \ref ARM_SAI_STATUS + + \fn void ARM_SAI_SignalEvent (uint32_t event) + \brief Signal SAI Events. + \param[in] event \ref SAI_events notification mask + \return none +*/ + +typedef void (*ARM_SAI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_SAI_SignalEvent : Signal SAI Event. + + +/** +\brief SAI Driver Capabilities. +*/ +typedef struct _ARM_SAI_CAPABILITIES { + uint32_t asynchronous : 1; ///< supports asynchronous Transmit/Receive + uint32_t synchronous : 1; ///< supports synchronous Transmit/Receive + uint32_t protocol_user : 1; ///< supports user defined Protocol + uint32_t protocol_i2s : 1; ///< supports I2S Protocol + uint32_t protocol_justified : 1; ///< supports MSB/LSB justified Protocol + uint32_t protocol_pcm : 1; ///< supports PCM short/long frame Protocol + uint32_t protocol_ac97 : 1; ///< supports AC'97 Protocol + uint32_t mono_mode : 1; ///< supports Mono mode + uint32_t companding : 1; ///< supports Companding + uint32_t mclk_pin : 1; ///< supports MCLK (Master Clock) pin + uint32_t event_frame_error : 1; ///< supports Frame error event: \ref ARM_SAI_EVENT_FRAME_ERROR +} ARM_SAI_CAPABILITIES; + + +/** +\brief Access structure of the SAI Driver. +*/ +typedef struct _ARM_DRIVER_SAI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SAI_GetVersion : Get driver version. + ARM_SAI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SAI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_SAI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SAI_Initialize : Initialize SAI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SAI_Uninitialize : De-initialize SAI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SAI_PowerControl : Control SAI Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SAI_Send : Start sending data to SAI Interface. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SAI_Receive : Start receiving data from SAI Interface. + uint32_t (*GetTxCount) (void); ///< Pointer to \ref ARM_SAI_GetTxCount : Get transmitted data count. + uint32_t (*GetRxCount) (void); ///< Pointer to \ref ARM_SAI_GetRxCount : Get received data count. + int32_t (*Control) (uint32_t control, uint32_t arg1, uint32_t arg2); ///< Pointer to \ref ARM_SAI_Control : Control SAI Interface. + ARM_SAI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SAI_GetStatus : Get SAI status. +} const ARM_DRIVER_SAI; + +#endif /* __DRIVER_SAI_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SPI.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SPI.h new file mode 100644 index 0000000..28bd10a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_SPI.h @@ -0,0 +1,237 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 17. Apr 2014 + * $Revision: V2.01 + * + * Project: SPI (Serial Peripheral Interface) Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.01 + * Renamed status flag "tx_rx_busy" to "busy" + * Version 2.00 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * Added: + * Slave Mode + * Half-duplex Modes + * Configurable number of data bits + * Support for TI Mode and Microwire + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added "send_done_event" to Capabilities + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_SPI_H +#define __DRIVER_SPI_H + +#include "Driver_Common.h" + +#define ARM_SPI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,00) /* API version */ + + +/****** SPI Control Codes *****/ + +#define ARM_SPI_CONTROL_Pos 0 +#define ARM_SPI_CONTROL_Msk (0xFFUL << ARM_SPI_CONTROL_Pos) + +/*----- SPI Control Codes: Mode -----*/ +#define ARM_SPI_MODE_INACTIVE (0x00UL << ARM_SPI_CONTROL_Pos) ///< SPI Inactive +#define ARM_SPI_MODE_MASTER (0x01UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps +#define ARM_SPI_MODE_SLAVE (0x02UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output on MISO, Input on MOSI) +#define ARM_SPI_MODE_MASTER_SIMPLEX (0x03UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output/Input on MOSI); arg = Bus Speed in bps +#define ARM_SPI_MODE_SLAVE_SIMPLEX (0x04UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output/Input on MISO) + +/*----- SPI Control Codes: Mode Parameters: Frame Format -----*/ +#define ARM_SPI_FRAME_FORMAT_Pos 8 +#define ARM_SPI_FRAME_FORMAT_Msk (7UL << ARM_SPI_FRAME_FORMAT_Pos) +#define ARM_SPI_CPOL0_CPHA0 (0UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 0 (default) +#define ARM_SPI_CPOL0_CPHA1 (1UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 1 +#define ARM_SPI_CPOL1_CPHA0 (2UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 0 +#define ARM_SPI_CPOL1_CPHA1 (3UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 1 +#define ARM_SPI_TI_SSI (4UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Texas Instruments Frame Format +#define ARM_SPI_MICROWIRE (5UL << ARM_SPI_FRAME_FORMAT_Pos) ///< National Microwire Frame Format + +/*----- SPI Control Codes: Mode Parameters: Data Bits -----*/ +#define ARM_SPI_DATA_BITS_Pos 12 +#define ARM_SPI_DATA_BITS_Msk (0x3FUL << ARM_SPI_DATA_BITS_Pos) +#define ARM_SPI_DATA_BITS(n) (((n) & 0x3F) << ARM_SPI_DATA_BITS_Pos) ///< Number of Data bits + +/*----- SPI Control Codes: Mode Parameters: Bit Order -----*/ +#define ARM_SPI_BIT_ORDER_Pos 18 +#define ARM_SPI_BIT_ORDER_Msk (1UL << ARM_SPI_BIT_ORDER_Pos) +#define ARM_SPI_MSB_LSB (0UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from MSB to LSB (default) +#define ARM_SPI_LSB_MSB (1UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from LSB to MSB + +/*----- SPI Control Codes: Mode Parameters: Slave Select Mode -----*/ +#define ARM_SPI_SS_MASTER_MODE_Pos 19 +#define ARM_SPI_SS_MASTER_MODE_Msk (3UL << ARM_SPI_SS_MASTER_MODE_Pos) +#define ARM_SPI_SS_MASTER_UNUSED (0UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Not used (default) +#define ARM_SPI_SS_MASTER_SW (1UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Software controlled +#define ARM_SPI_SS_MASTER_HW_OUTPUT (2UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware controlled Output +#define ARM_SPI_SS_MASTER_HW_INPUT (3UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware monitored Input +#define ARM_SPI_SS_SLAVE_MODE_Pos 21 +#define ARM_SPI_SS_SLAVE_MODE_Msk (1UL << ARM_SPI_SS_SLAVE_MODE_Pos) +#define ARM_SPI_SS_SLAVE_HW (0UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Hardware monitored (default) +#define ARM_SPI_SS_SLAVE_SW (1UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Software controlled + + +/*----- SPI Control Codes: Miscellaneous Controls -----*/ +#define ARM_SPI_SET_BUS_SPEED (0x10UL << ARM_SPI_CONTROL_Pos) ///< Set Bus Speed in bps; arg = value +#define ARM_SPI_GET_BUS_SPEED (0x11UL << ARM_SPI_CONTROL_Pos) ///< Get Bus Speed in bps +#define ARM_SPI_SET_DEFAULT_TX_VALUE (0x12UL << ARM_SPI_CONTROL_Pos) ///< Set default Transmit value; arg = value +#define ARM_SPI_CONTROL_SS (0x13UL << ARM_SPI_CONTROL_Pos) ///< Control Slave Select; arg: 0=inactive, 1=active +#define ARM_SPI_ABORT_TRANSFER (0x14UL << ARM_SPI_CONTROL_Pos) ///< Abort current data transfer + + +/****** SPI Slave Select Signal definitions *****/ +#define ARM_SPI_SS_INACTIVE 0 ///< SPI Slave Select Signal Inactive +#define ARM_SPI_SS_ACTIVE 1 ///< SPI Slave Select Signal Active + + +/****** SPI specific error codes *****/ +#define ARM_SPI_ERROR_MODE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Mode not supported +#define ARM_SPI_ERROR_FRAME_FORMAT (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified Frame Format not supported +#define ARM_SPI_ERROR_DATA_BITS (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified number of Data bits not supported +#define ARM_SPI_ERROR_BIT_ORDER (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Bit order not supported +#define ARM_SPI_ERROR_SS_MODE (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified Slave Select Mode not supported + + +/** +\brief SPI Status +*/ +typedef struct _ARM_SPI_STATUS { + uint32_t busy : 1; ///< Transmitter/Receiver busy flag + uint32_t data_lost : 1; ///< Data lost: Receive overflow / Transmit underflow (cleared on start of transfer operation) + uint32_t mode_fault : 1; ///< Mode fault detected; optional (cleared on start of transfer operation) +} ARM_SPI_STATUS; + + +/****** SPI Event *****/ +#define ARM_SPI_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Data Transfer completed +#define ARM_SPI_EVENT_DATA_LOST (1UL << 1) ///< Data lost: Receive overflow / Transmit underflow +#define ARM_SPI_EVENT_MODE_FAULT (1UL << 2) ///< Master Mode Fault (SS deactivated when Master) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_SPI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_SPI_CAPABILITIES ARM_SPI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_SPI_CAPABILITIES + + \fn int32_t ARM_SPI_Initialize (ARM_SPI_SignalEvent_t cb_event) + \brief Initialize SPI Interface. + \param[in] cb_event Pointer to \ref ARM_SPI_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_SPI_Uninitialize (void) + \brief De-initialize SPI Interface. + \return \ref execution_status + + \fn int32_t ARM_SPI_PowerControl (ARM_POWER_STATE state) + \brief Control SPI Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_SPI_Send (const void *data, uint32_t num) + \brief Start sending data to SPI transmitter. + \param[in] data Pointer to buffer with data to send to SPI transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_SPI_Receive (void *data, uint32_t num) + \brief Start receiving data from SPI receiver. + \param[out] data Pointer to buffer for data to receive from SPI receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn int32_t ARM_SPI_Transfer (const void *data_out, + void *data_in, + uint32_t num) + \brief Start sending/receiving data to/from SPI transmitter/receiver. + \param[in] data_out Pointer to buffer with data to send to SPI transmitter + \param[out] data_in Pointer to buffer for data to receive from SPI receiver + \param[in] num Number of data items to transfer + \return \ref execution_status + + \fn uint32_t ARM_SPI_GetDataCount (void) + \brief Get transferred data count. + \return number of data items transferred + + \fn int32_t ARM_SPI_Control (uint32_t control, uint32_t arg) + \brief Control SPI Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return common \ref execution_status and driver specific \ref spi_execution_status + + \fn ARM_SPI_STATUS ARM_SPI_GetStatus (void) + \brief Get SPI status. + \return SPI status \ref ARM_SPI_STATUS + + \fn void ARM_SPI_SignalEvent (uint32_t event) + \brief Signal SPI Events. + \param[in] event \ref SPI_events notification mask + \return none +*/ + +typedef void (*ARM_SPI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_SPI_SignalEvent : Signal SPI Event. + + +/** +\brief SPI Driver Capabilities. +*/ +typedef struct _ARM_SPI_CAPABILITIES { + uint32_t simplex : 1; ///< supports Simplex Mode (Master and Slave) + uint32_t ti_ssi : 1; ///< supports TI Synchronous Serial Interface + uint32_t microwire : 1; ///< supports Microwire Interface + uint32_t event_mode_fault : 1; ///< Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT +} ARM_SPI_CAPABILITIES; + + +/** +\brief Access structure of the SPI Driver. +*/ +typedef struct _ARM_DRIVER_SPI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SPI_GetVersion : Get driver version. + ARM_SPI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SPI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_SPI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SPI_Initialize : Initialize SPI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SPI_Uninitialize : De-initialize SPI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SPI_PowerControl : Control SPI Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Send : Start sending data to SPI Interface. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Receive : Start receiving data from SPI Interface. + int32_t (*Transfer) (const void *data_out, + void *data_in, + uint32_t num); ///< Pointer to \ref ARM_SPI_Transfer : Start sending/receiving data to/from SPI. + uint32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_SPI_GetDataCount : Get transferred data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_SPI_Control : Control SPI Interface. + ARM_SPI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SPI_GetStatus : Get SPI status. +} const ARM_DRIVER_SPI; + +#endif /* __DRIVER_SPI_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USART.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USART.h new file mode 100644 index 0000000..63e88e2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USART.h @@ -0,0 +1,330 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 24. Nov 2014 + * $Revision: V2.02 + * + * Project: USART (Universal Synchronous Asynchronous Receiver Transmitter) + * Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.02 + * Corrected ARM_USART_CPOL_Pos and ARM_USART_CPHA_Pos definitions + * Version 2.01 + * Removed optional argument parameter from Signal Event + * Version 2.00 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * renamed driver UART -> USART (Asynchronous & Synchronous) + * Added modes: + * Synchronous + * Single-wire + * IrDA + * Smart Card + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added events: + * ARM_UART_EVENT_TX_EMPTY, ARM_UART_EVENT_RX_TIMEOUT + * ARM_UART_EVENT_TX_THRESHOLD, ARM_UART_EVENT_RX_THRESHOLD + * Added functions: SetTxThreshold, SetRxThreshold + * Added "rx_timeout_event" to capabilities + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_USART_H +#define __DRIVER_USART_H + +#include "Driver_Common.h" + +#define ARM_USART_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,02) /* API version */ + + +/****** USART Control Codes *****/ + +#define ARM_USART_CONTROL_Pos 0 +#define ARM_USART_CONTROL_Msk (0xFFUL << ARM_USART_CONTROL_Pos) + +/*----- USART Control Codes: Mode -----*/ +#define ARM_USART_MODE_ASYNCHRONOUS (0x01UL << ARM_USART_CONTROL_Pos) ///< UART (Asynchronous); arg = Baudrate +#define ARM_USART_MODE_SYNCHRONOUS_MASTER (0x02UL << ARM_USART_CONTROL_Pos) ///< Synchronous Master (generates clock signal); arg = Baudrate +#define ARM_USART_MODE_SYNCHRONOUS_SLAVE (0x03UL << ARM_USART_CONTROL_Pos) ///< Synchronous Slave (external clock signal) +#define ARM_USART_MODE_SINGLE_WIRE (0x04UL << ARM_USART_CONTROL_Pos) ///< UART Single-wire (half-duplex); arg = Baudrate +#define ARM_USART_MODE_IRDA (0x05UL << ARM_USART_CONTROL_Pos) ///< UART IrDA; arg = Baudrate +#define ARM_USART_MODE_SMART_CARD (0x06UL << ARM_USART_CONTROL_Pos) ///< UART Smart Card; arg = Baudrate + +/*----- USART Control Codes: Mode Parameters: Data Bits -----*/ +#define ARM_USART_DATA_BITS_Pos 8 +#define ARM_USART_DATA_BITS_Msk (7UL << ARM_USART_DATA_BITS_Pos) +#define ARM_USART_DATA_BITS_5 (5UL << ARM_USART_DATA_BITS_Pos) ///< 5 Data bits +#define ARM_USART_DATA_BITS_6 (6UL << ARM_USART_DATA_BITS_Pos) ///< 6 Data bit +#define ARM_USART_DATA_BITS_7 (7UL << ARM_USART_DATA_BITS_Pos) ///< 7 Data bits +#define ARM_USART_DATA_BITS_8 (0UL << ARM_USART_DATA_BITS_Pos) ///< 8 Data bits (default) +#define ARM_USART_DATA_BITS_9 (1UL << ARM_USART_DATA_BITS_Pos) ///< 9 Data bits + +/*----- USART Control Codes: Mode Parameters: Parity -----*/ +#define ARM_USART_PARITY_Pos 12 +#define ARM_USART_PARITY_Msk (3UL << ARM_USART_PARITY_Pos) +#define ARM_USART_PARITY_NONE (0UL << ARM_USART_PARITY_Pos) ///< No Parity (default) +#define ARM_USART_PARITY_EVEN (1UL << ARM_USART_PARITY_Pos) ///< Even Parity +#define ARM_USART_PARITY_ODD (2UL << ARM_USART_PARITY_Pos) ///< Odd Parity + +/*----- USART Control Codes: Mode Parameters: Stop Bits -----*/ +#define ARM_USART_STOP_BITS_Pos 14 +#define ARM_USART_STOP_BITS_Msk (3UL << ARM_USART_STOP_BITS_Pos) +#define ARM_USART_STOP_BITS_1 (0UL << ARM_USART_STOP_BITS_Pos) ///< 1 Stop bit (default) +#define ARM_USART_STOP_BITS_2 (1UL << ARM_USART_STOP_BITS_Pos) ///< 2 Stop bits +#define ARM_USART_STOP_BITS_1_5 (2UL << ARM_USART_STOP_BITS_Pos) ///< 1.5 Stop bits +#define ARM_USART_STOP_BITS_0_5 (3UL << ARM_USART_STOP_BITS_Pos) ///< 0.5 Stop bits + +/*----- USART Control Codes: Mode Parameters: Flow Control -----*/ +#define ARM_USART_FLOW_CONTROL_Pos 16 +#define ARM_USART_FLOW_CONTROL_Msk (3UL << ARM_USART_FLOW_CONTROL_Pos) +#define ARM_USART_FLOW_CONTROL_NONE (0UL << ARM_USART_FLOW_CONTROL_Pos) ///< No Flow Control (default) +#define ARM_USART_FLOW_CONTROL_RTS (1UL << ARM_USART_FLOW_CONTROL_Pos) ///< RTS Flow Control +#define ARM_USART_FLOW_CONTROL_CTS (2UL << ARM_USART_FLOW_CONTROL_Pos) ///< CTS Flow Control +#define ARM_USART_FLOW_CONTROL_RTS_CTS (3UL << ARM_USART_FLOW_CONTROL_Pos) ///< RTS/CTS Flow Control + +/*----- USART Control Codes: Mode Parameters: Clock Polarity (Synchronous mode) -----*/ +#define ARM_USART_CPOL_Pos 18 +#define ARM_USART_CPOL_Msk (1UL << ARM_USART_CPOL_Pos) +#define ARM_USART_CPOL0 (0UL << ARM_USART_CPOL_Pos) ///< CPOL = 0 (default) +#define ARM_USART_CPOL1 (1UL << ARM_USART_CPOL_Pos) ///< CPOL = 1 + +/*----- USART Control Codes: Mode Parameters: Clock Phase (Synchronous mode) -----*/ +#define ARM_USART_CPHA_Pos 19 +#define ARM_USART_CPHA_Msk (1UL << ARM_USART_CPHA_Pos) +#define ARM_USART_CPHA0 (0UL << ARM_USART_CPHA_Pos) ///< CPHA = 0 (default) +#define ARM_USART_CPHA1 (1UL << ARM_USART_CPHA_Pos) ///< CPHA = 1 + + +/*----- USART Control Codes: Miscellaneous Controls -----*/ +#define ARM_USART_SET_DEFAULT_TX_VALUE (0x10UL << ARM_USART_CONTROL_Pos) ///< Set default Transmit value (Synchronous Receive only); arg = value +#define ARM_USART_SET_IRDA_PULSE (0x11UL << ARM_USART_CONTROL_Pos) ///< Set IrDA Pulse in ns; arg: 0=3/16 of bit period +#define ARM_USART_SET_SMART_CARD_GUARD_TIME (0x12UL << ARM_USART_CONTROL_Pos) ///< Set Smart Card Guard Time; arg = number of bit periods +#define ARM_USART_SET_SMART_CARD_CLOCK (0x13UL << ARM_USART_CONTROL_Pos) ///< Set Smart Card Clock in Hz; arg: 0=Clock not generated +#define ARM_USART_CONTROL_SMART_CARD_NACK (0x14UL << ARM_USART_CONTROL_Pos) ///< Smart Card NACK generation; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_TX (0x15UL << ARM_USART_CONTROL_Pos) ///< Transmitter; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_RX (0x16UL << ARM_USART_CONTROL_Pos) ///< Receiver; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_BREAK (0x17UL << ARM_USART_CONTROL_Pos) ///< Continuous Break transmission; arg: 0=disabled, 1=enabled +#define ARM_USART_ABORT_SEND (0x18UL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Send +#define ARM_USART_ABORT_RECEIVE (0x19UL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Receive +#define ARM_USART_ABORT_TRANSFER (0x1AUL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Transfer + + + +/****** USART specific error codes *****/ +#define ARM_USART_ERROR_MODE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Mode not supported +#define ARM_USART_ERROR_BAUDRATE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified baudrate not supported +#define ARM_USART_ERROR_DATA_BITS (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified number of Data bits not supported +#define ARM_USART_ERROR_PARITY (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Parity not supported +#define ARM_USART_ERROR_STOP_BITS (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified number of Stop bits not supported +#define ARM_USART_ERROR_FLOW_CONTROL (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< Specified Flow Control not supported +#define ARM_USART_ERROR_CPOL (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Specified Clock Polarity not supported +#define ARM_USART_ERROR_CPHA (ARM_DRIVER_ERROR_SPECIFIC - 8) ///< Specified Clock Phase not supported + + +/** +\brief USART Status +*/ +typedef struct _ARM_USART_STATUS { + uint32_t tx_busy : 1; ///< Transmitter busy flag + uint32_t rx_busy : 1; ///< Receiver busy flag + uint32_t tx_underflow : 1; ///< Transmit data underflow detected (cleared on start of next send operation) + uint32_t rx_overflow : 1; ///< Receive data overflow detected (cleared on start of next receive operation) + uint32_t rx_break : 1; ///< Break detected on receive (cleared on start of next receive operation) + uint32_t rx_framing_error : 1; ///< Framing error detected on receive (cleared on start of next receive operation) + uint32_t rx_parity_error : 1; ///< Parity error detected on receive (cleared on start of next receive operation) +} ARM_USART_STATUS; + +/** +\brief USART Modem Control +*/ +typedef enum _ARM_USART_MODEM_CONTROL { + ARM_USART_RTS_CLEAR, ///< Deactivate RTS + ARM_USART_RTS_SET, ///< Activate RTS + ARM_USART_DTR_CLEAR, ///< Deactivate DTR + ARM_USART_DTR_SET ///< Activate DTR +} ARM_USART_MODEM_CONTROL; + +/** +\brief USART Modem Status +*/ +typedef struct _ARM_USART_MODEM_STATUS { + uint32_t cts : 1; ///< CTS state: 1=Active, 0=Inactive + uint32_t dsr : 1; ///< DSR state: 1=Active, 0=Inactive + uint32_t dcd : 1; ///< DCD state: 1=Active, 0=Inactive + uint32_t ri : 1; ///< RI state: 1=Active, 0=Inactive +} ARM_USART_MODEM_STATUS; + + +/****** USART Event *****/ +#define ARM_USART_EVENT_SEND_COMPLETE (1UL << 0) ///< Send completed; however USART may still transmit data +#define ARM_USART_EVENT_RECEIVE_COMPLETE (1UL << 1) ///< Receive completed +#define ARM_USART_EVENT_TRANSFER_COMPLETE (1UL << 2) ///< Transfer completed +#define ARM_USART_EVENT_TX_COMPLETE (1UL << 3) ///< Transmit completed (optional) +#define ARM_USART_EVENT_TX_UNDERFLOW (1UL << 4) ///< Transmit data not available (Synchronous Slave) +#define ARM_USART_EVENT_RX_OVERFLOW (1UL << 5) ///< Receive data overflow +#define ARM_USART_EVENT_RX_TIMEOUT (1UL << 6) ///< Receive character timeout (optional) +#define ARM_USART_EVENT_RX_BREAK (1UL << 7) ///< Break detected on receive +#define ARM_USART_EVENT_RX_FRAMING_ERROR (1UL << 8) ///< Framing error detected on receive +#define ARM_USART_EVENT_RX_PARITY_ERROR (1UL << 9) ///< Parity error detected on receive +#define ARM_USART_EVENT_CTS (1UL << 10) ///< CTS state changed (optional) +#define ARM_USART_EVENT_DSR (1UL << 11) ///< DSR state changed (optional) +#define ARM_USART_EVENT_DCD (1UL << 12) ///< DCD state changed (optional) +#define ARM_USART_EVENT_RI (1UL << 13) ///< RI state changed (optional) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USART_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_USART_CAPABILITIES ARM_USART_GetCapabilities (void) + \brief Get driver capabilities + \return \ref ARM_USART_CAPABILITIES + + \fn int32_t ARM_USART_Initialize (ARM_USART_SignalEvent_t cb_event) + \brief Initialize USART Interface. + \param[in] cb_event Pointer to \ref ARM_USART_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_USART_Uninitialize (void) + \brief De-initialize USART Interface. + \return \ref execution_status + + \fn int32_t ARM_USART_PowerControl (ARM_POWER_STATE state) + \brief Control USART Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_USART_Send (const void *data, uint32_t num) + \brief Start sending data to USART transmitter. + \param[in] data Pointer to buffer with data to send to USART transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_USART_Receive (void *data, uint32_t num) + \brief Start receiving data from USART receiver. + \param[out] data Pointer to buffer for data to receive from USART receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn int32_t ARM_USART_Transfer (const void *data_out, + void *data_in, + uint32_t num) + \brief Start sending/receiving data to/from USART transmitter/receiver. + \param[in] data_out Pointer to buffer with data to send to USART transmitter + \param[out] data_in Pointer to buffer for data to receive from USART receiver + \param[in] num Number of data items to transfer + \return \ref execution_status + + \fn uint32_t ARM_USART_GetTxCount (void) + \brief Get transmitted data count. + \return number of data items transmitted + + \fn uint32_t ARM_USART_GetRxCount (void) + \brief Get received data count. + \return number of data items received + + \fn int32_t ARM_USART_Control (uint32_t control, uint32_t arg) + \brief Control USART Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return common \ref execution_status and driver specific \ref usart_execution_status + + \fn ARM_USART_STATUS ARM_USART_GetStatus (void) + \brief Get USART status. + \return USART status \ref ARM_USART_STATUS + + \fn int32_t ARM_USART_SetModemControl (ARM_USART_MODEM_CONTROL control) + \brief Set USART Modem Control line state. + \param[in] control \ref ARM_USART_MODEM_CONTROL + \return \ref execution_status + + \fn ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus (void) + \brief Get USART Modem Status lines state. + \return modem status \ref ARM_USART_MODEM_STATUS + + \fn void ARM_USART_SignalEvent (uint32_t event) + \brief Signal USART Events. + \param[in] event \ref USART_events notification mask + \return none +*/ + +typedef void (*ARM_USART_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_USART_SignalEvent : Signal USART Event. + + +/** +\brief USART Device Driver Capabilities. +*/ +typedef struct _ARM_USART_CAPABILITIES { + uint32_t asynchronous : 1; ///< supports UART (Asynchronous) mode + uint32_t synchronous_master : 1; ///< supports Synchronous Master mode + uint32_t synchronous_slave : 1; ///< supports Synchronous Slave mode + uint32_t single_wire : 1; ///< supports UART Single-wire mode + uint32_t irda : 1; ///< supports UART IrDA mode + uint32_t smart_card : 1; ///< supports UART Smart Card mode + uint32_t smart_card_clock : 1; ///< Smart Card Clock generator available + uint32_t flow_control_rts : 1; ///< RTS Flow Control available + uint32_t flow_control_cts : 1; ///< CTS Flow Control available + uint32_t event_tx_complete : 1; ///< Transmit completed event: \ref ARM_USART_EVENT_TX_COMPLETE + uint32_t event_rx_timeout : 1; ///< Signal receive character timeout event: \ref ARM_USART_EVENT_RX_TIMEOUT + uint32_t rts : 1; ///< RTS Line: 0=not available, 1=available + uint32_t cts : 1; ///< CTS Line: 0=not available, 1=available + uint32_t dtr : 1; ///< DTR Line: 0=not available, 1=available + uint32_t dsr : 1; ///< DSR Line: 0=not available, 1=available + uint32_t dcd : 1; ///< DCD Line: 0=not available, 1=available + uint32_t ri : 1; ///< RI Line: 0=not available, 1=available + uint32_t event_cts : 1; ///< Signal CTS change event: \ref ARM_USART_EVENT_CTS + uint32_t event_dsr : 1; ///< Signal DSR change event: \ref ARM_USART_EVENT_DSR + uint32_t event_dcd : 1; ///< Signal DCD change event: \ref ARM_USART_EVENT_DCD + uint32_t event_ri : 1; ///< Signal RI change event: \ref ARM_USART_EVENT_RI +} ARM_USART_CAPABILITIES; + + +/** +\brief Access structure of the USART Driver. +*/ +typedef struct _ARM_DRIVER_USART { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USART_GetVersion : Get driver version. + ARM_USART_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USART_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USART_SignalEvent_t cb_event); ///< Pointer to \ref ARM_USART_Initialize : Initialize USART Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USART_Uninitialize : De-initialize USART Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USART_PowerControl : Control USART Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_USART_Send : Start sending data to USART transmitter. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_USART_Receive : Start receiving data from USART receiver. + int32_t (*Transfer) (const void *data_out, + void *data_in, + uint32_t num); ///< Pointer to \ref ARM_USART_Transfer : Start sending/receiving data to/from USART. + uint32_t (*GetTxCount) (void); ///< Pointer to \ref ARM_USART_GetTxCount : Get transmitted data count. + uint32_t (*GetRxCount) (void); ///< Pointer to \ref ARM_USART_GetRxCount : Get received data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_USART_Control : Control USART Interface. + ARM_USART_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_USART_GetStatus : Get USART status. + int32_t (*SetModemControl) (ARM_USART_MODEM_CONTROL control); ///< Pointer to \ref ARM_USART_SetModemControl : Set USART Modem Control line state. + ARM_USART_MODEM_STATUS (*GetModemStatus) (void); ///< Pointer to \ref ARM_USART_GetModemStatus : Get USART Modem Status lines state. +} const ARM_DRIVER_USART; + +#endif /* __DRIVER_USART_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USB.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USB.h new file mode 100644 index 0000000..4f3a1b8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USB.h @@ -0,0 +1,95 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 20. May 2014 + * $Revision: V2.00 + * + * Project: USB Driver common definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.00 + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added PID Types + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_USB_H +#define __DRIVER_USB_H + +#include "Driver_Common.h" + +/* USB Role */ +#define ARM_USB_ROLE_NONE 0 +#define ARM_USB_ROLE_HOST 1 +#define ARM_USB_ROLE_DEVICE 2 + +/* USB Pins */ +#define ARM_USB_PIN_DP (1 << 0) ///< USB D+ pin +#define ARM_USB_PIN_DM (1 << 1) ///< USB D- pin +#define ARM_USB_PIN_VBUS (1 << 2) ///< USB VBUS pin +#define ARM_USB_PIN_OC (1 << 3) ///< USB OverCurrent pin +#define ARM_USB_PIN_ID (1 << 4) ///< USB ID pin + +/* USB Speed */ +#define ARM_USB_SPEED_LOW 0 ///< Low-speed USB +#define ARM_USB_SPEED_FULL 1 ///< Full-speed USB +#define ARM_USB_SPEED_HIGH 2 ///< High-speed USB + +/* USB PID Types */ +#define ARM_USB_PID_OUT 1 +#define ARM_USB_PID_IN 9 +#define ARM_USB_PID_SOF 5 +#define ARM_USB_PID_SETUP 13 +#define ARM_USB_PID_DATA0 3 +#define ARM_USB_PID_DATA1 11 +#define ARM_USB_PID_DATA2 7 +#define ARM_USB_PID_MDATA 15 +#define ARM_USB_PID_ACK 2 +#define ARM_USB_PID_NAK 10 +#define ARM_USB_PID_STALL 14 +#define ARM_USB_PID_NYET 6 +#define ARM_USB_PID_PRE 12 +#define ARM_USB_PID_ERR 12 +#define ARM_USB_PID_SPLIT 8 +#define ARM_USB_PID_PING 4 +#define ARM_USB_PID_RESERVED 0 + +/* USB Endpoint Address (bEndpointAddress) */ +#define ARM_USB_ENDPOINT_NUMBER_MASK 0x0F +#define ARM_USB_ENDPOINT_DIRECTION_MASK 0x80 + +/* USB Endpoint Type */ +#define ARM_USB_ENDPOINT_CONTROL 0 ///< Control Endpoint +#define ARM_USB_ENDPOINT_ISOCHRONOUS 1 ///< Isochronous Endpoint +#define ARM_USB_ENDPOINT_BULK 2 ///< Bulk Endpoint +#define ARM_USB_ENDPOINT_INTERRUPT 3 ///< Interrupt Endpoint + +/* USB Endpoint Maximum Packet Size (wMaxPacketSize) */ +#define ARM_USB_ENDPOINT_MAX_PACKET_SIZE_MASK 0x07FF +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_MASK 0x1800 +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_1 0x0000 +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_2 0x0800 +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_3 0x1000 + +#endif /* __DRIVER_USB_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBD.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBD.h new file mode 100644 index 0000000..286e109 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBD.h @@ -0,0 +1,263 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 3. Jun 2014 + * $Revision: V2.01 + * + * Project: USB Device Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.01 + * Added ARM_USBD_ReadSetupPacket function + * Version 2.00 + * Removed ARM_USBD_DeviceConfigure function + * Removed ARM_USBD_SET_ADDRESS_STAGE parameter from ARM_USBD_DeviceSetAddress function + * Removed ARM_USBD_EndpointReadStart function + * Replaced ARM_USBD_EndpointRead and ARM_USBD_EndpointWrite functions with ARM_USBD_EndpointTransfer + * Added ARM_USBD_EndpointTransferGetResult function + * Renamed ARM_USBD_EndpointAbort function to ARM_USBD_EndpointTransferAbort + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_USBD_H +#define __DRIVER_USBD_H + +#include "Driver_USB.h" + +#define ARM_USBD_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ + + +/** +\brief USB Device State +*/ +typedef struct _ARM_USBD_STATE { + uint32_t vbus : 1; ///< USB Device VBUS flag + uint32_t speed : 2; ///< USB Device speed setting (ARM_USB_SPEED_xxx) + uint32_t active : 1; ///< USB Device active flag +} ARM_USBD_STATE; + + +/****** USB Device Event *****/ +#define ARM_USBD_EVENT_VBUS_ON (1UL << 0) ///< USB Device VBUS On +#define ARM_USBD_EVENT_VBUS_OFF (1UL << 1) ///< USB Device VBUS Off +#define ARM_USBD_EVENT_RESET (1UL << 2) ///< USB Reset occurred +#define ARM_USBD_EVENT_HIGH_SPEED (1UL << 3) ///< USB switch to High Speed occurred +#define ARM_USBD_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred +#define ARM_USBD_EVENT_RESUME (1UL << 5) ///< USB Resume occurred + +/****** USB Endpoint Event *****/ +#define ARM_USBD_EVENT_SETUP (1UL << 0) ///< SETUP Packet +#define ARM_USBD_EVENT_OUT (1UL << 1) ///< OUT Packet(s) +#define ARM_USBD_EVENT_IN (1UL << 2) ///< IN Packet(s) + + +#ifndef __DOXYGEN_MW__ // exclude from middleware documentation + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBD_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBD_CAPABILITIES ARM_USBD_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBD_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBD_Initialize (ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) + \brief Initialize USB Device Interface. + \param[in] cb_device_event Pointer to \ref ARM_USBD_SignalDeviceEvent + \param[in] cb_endpoint_event Pointer to \ref ARM_USBD_SignalEndpointEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_Uninitialize (void) + \brief De-initialize USB Device Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_PowerControl (ARM_POWER_STATE state) + \brief Control USB Device Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceConnect (void) + \brief Connect USB Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceDisconnect (void) + \brief Disconnect USB Device. + \return \ref execution_status +*/ +/** + \fn ARM_USBD_STATE ARM_USBD_DeviceGetState (void) + \brief Get current USB Device State. + \return Device State \ref ARM_USBD_STATE +*/ +/** + \fn int32_t ARM_USBD_DeviceRemoteWakeup (void) + \brief Trigger USB Remote Wakeup. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceSetAddress (uint8_t dev_addr) + \brief Set USB Device Address. + \param[in] dev_addr Device Address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_ReadSetupPacket (uint8_t *setup) + \brief Read setup packet received over Control Endpoint. + \param[out] setup Pointer to buffer for setup packet + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointConfigure (uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size) + \brief Configure USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointUnconfigure (uint8_t ep_addr) + \brief Unconfigure USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointStall (uint8_t ep_addr, bool stall) + \brief Set/Clear Stall for USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] stall Operation + - \b false Clear + - \b true Set + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointTransfer (uint8_t ep_addr, uint8_t *data, uint32_t num) + \brief Read data from or Write data to USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[out] data Pointer to buffer for data to read or with data to write + \param[in] num Number of data bytes to transfer + \return \ref execution_status +*/ +/** + \fn uint32_t ARM_USBD_EndpointTransferGetResult (uint8_t ep_addr) + \brief Get result of USB Endpoint transfer. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return number of successfully transferred data bytes +*/ +/** + \fn int32_t ARM_USBD_EndpointTransferAbort (uint8_t ep_addr) + \brief Abort current USB Endpoint transfer. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return \ref execution_status +*/ +/** + \fn uint16_t ARM_USBD_GetFrameNumber (void) + \brief Get current USB Frame Number. + \return Frame Number +*/ + +/** + \fn void ARM_USBD_SignalDeviceEvent (uint32_t event) + \brief Signal USB Device Event. + \param[in] event \ref USBD_dev_events + \return none +*/ +/** + \fn void ARM_USBD_SignalEndpointEvent (uint8_t ep_addr, uint32_t event) + \brief Signal USB Endpoint Event. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] event \ref USBD_ep_events + \return none +*/ + +typedef void (*ARM_USBD_SignalDeviceEvent_t) (uint32_t event); ///< Pointer to \ref ARM_USBD_SignalDeviceEvent : Signal USB Device Event. +typedef void (*ARM_USBD_SignalEndpointEvent_t) (uint8_t ep_addr, uint32_t event); ///< Pointer to \ref ARM_USBD_SignalEndpointEvent : Signal USB Endpoint Event. + + +/** +\brief USB Device Driver Capabilities. +*/ +typedef struct _ARM_USBD_CAPABILITIES { + uint32_t vbus_detection : 1; ///< VBUS detection + uint32_t event_vbus_on : 1; ///< Signal VBUS On event + uint32_t event_vbus_off : 1; ///< Signal VBUS Off event +} ARM_USBD_CAPABILITIES; + + +/** +\brief Access structure of the USB Device Driver. +*/ +typedef struct _ARM_DRIVER_USBD { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBD_GetVersion : Get driver version. + ARM_USBD_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBD_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event); ///< Pointer to \ref ARM_USBD_Initialize : Initialize USB Device Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBD_Uninitialize : De-initialize USB Device Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBD_PowerControl : Control USB Device Interface Power. + int32_t (*DeviceConnect) (void); ///< Pointer to \ref ARM_USBD_DeviceConnect : Connect USB Device. + int32_t (*DeviceDisconnect) (void); ///< Pointer to \ref ARM_USBD_DeviceDisconnect : Disconnect USB Device. + ARM_USBD_STATE (*DeviceGetState) (void); ///< Pointer to \ref ARM_USBD_DeviceGetState : Get current USB Device State. + int32_t (*DeviceRemoteWakeup) (void); ///< Pointer to \ref ARM_USBD_DeviceRemoteWakeup : Trigger USB Remote Wakeup. + int32_t (*DeviceSetAddress) (uint8_t dev_addr); ///< Pointer to \ref ARM_USBD_DeviceSetAddress : Set USB Device Address. + int32_t (*ReadSetupPacket) (uint8_t *setup); ///< Pointer to \ref ARM_USBD_ReadSetupPacket : Read setup packet received over Control Endpoint. + int32_t (*EndpointConfigure) (uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBD_EndpointConfigure : Configure USB Endpoint. + int32_t (*EndpointUnconfigure) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointUnconfigure : Unconfigure USB Endpoint. + int32_t (*EndpointStall) (uint8_t ep_addr, bool stall); ///< Pointer to \ref ARM_USBD_EndpointStall : Set/Clear Stall for USB Endpoint. + int32_t (*EndpointTransfer) (uint8_t ep_addr, uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_USBD_EndpointTransfer : Read data from or Write data to USB Endpoint. + uint32_t (*EndpointTransferGetResult) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferGetResult : Get result of USB Endpoint transfer. + int32_t (*EndpointTransferAbort) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferAbort : Abort current USB Endpoint transfer. + uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBD_GetFrameNumber : Get current USB Frame Number. +} const ARM_DRIVER_USBD; + +#endif /* __DOXYGEN_MW__ */ + +#endif /* __DRIVER_USBD_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBH.h b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBH.h new file mode 100644 index 0000000..9973e7c --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Driver/Include/Driver_USBH.h @@ -0,0 +1,406 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2014 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * + * $Date: 3. September 2014 + * $Revision: V2.01 + * + * Project: USB Host Driver definitions + * -------------------------------------------------------------------------- */ + +/* History: + * Version 2.01 + * Renamed structure ARM_USBH_EP_HANDLE to ARM_USBH_PIPE_HANDLE + * Renamed functions ARM_USBH_Endpoint... to ARM_USBH_Pipe... + * Renamed function ARM_USBH_SignalEndpointEvent to ARM_USBH_SignalPipeEvent + * Version 2.00 + * Replaced function ARM_USBH_PortPowerOnOff with ARM_USBH_PortVbusOnOff + * Changed function ARM_USBH_EndpointCreate parameters + * Replaced function ARM_USBH_EndpointConfigure with ARM_USBH_EndpointModify + * Replaced function ARM_USBH_EndpointClearHalt with ARM_USBH_EndpointReset + * Replaced function ARM_USBH_URB_Submit with ARM_USBH_EndpointTransfer + * Replaced function ARM_USBH_URB_Abort with ARM_USBH_EndpointTransferAbort + * Added function ARM_USBH_EndpointTransferGetResult + * Added function ARM_USBH_GetFrameNumber + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.20 + * Added API for OHCI/EHCI Host Controller Interface (HCI) + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef __DRIVER_USBH_H +#define __DRIVER_USBH_H + +#include "Driver_USB.h" + +#define ARM_USBH_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */ + + +/** +\brief USB Host Port State +*/ +typedef struct _ARM_USBH_PORT_STATE { + uint32_t connected : 1; ///< USB Host Port connected flag + uint32_t overcurrent : 1; ///< USB Host Port overcurrent flag + uint32_t speed : 2; ///< USB Host Port speed setting (ARM_USB_SPEED_xxx) +} ARM_USBH_PORT_STATE; + +/** +\brief USB Host Pipe Handle +*/ +typedef uint32_t ARM_USBH_PIPE_HANDLE; +#define ARM_USBH_EP_HANDLE ARM_USBH_PIPE_HANDLE /* Legacy name */ + + +/****** USB Host Packet Information *****/ +#define ARM_USBH_PACKET_TOKEN_Pos 0 +#define ARM_USBH_PACKET_TOKEN_Msk (0x0FUL << ARM_USBH_PACKET_TOKEN_Pos) +#define ARM_USBH_PACKET_SETUP (0x01UL << ARM_USBH_PACKET_TOKEN_Pos) ///< SETUP Packet +#define ARM_USBH_PACKET_OUT (0x02UL << ARM_USBH_PACKET_TOKEN_Pos) ///< OUT Packet +#define ARM_USBH_PACKET_IN (0x03UL << ARM_USBH_PACKET_TOKEN_Pos) ///< IN Packet +#define ARM_USBH_PACKET_PING (0x04UL << ARM_USBH_PACKET_TOKEN_Pos) ///< PING Packet + +#define ARM_USBH_PACKET_DATA_Pos 4 +#define ARM_USBH_PACKET_DATA_Msk (0x0FUL << ARM_USBH_PACKET_DATA_Pos) +#define ARM_USBH_PACKET_DATA0 (0x01UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA0 PID +#define ARM_USBH_PACKET_DATA1 (0x02UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA1 PID + +#define ARM_USBH_PACKET_SPLIT_Pos 8 +#define ARM_USBH_PACKET_SPLIT_Msk (0x0FUL << ARM_USBH_PACKET_SPLIT_Pos) +#define ARM_USBH_PACKET_SSPLIT (0x08UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet +#define ARM_USBH_PACKET_SSPLIT_S (0x09UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data Start +#define ARM_USBH_PACKET_SSPLIT_E (0x0AUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data End +#define ARM_USBH_PACKET_SSPLIT_S_E (0x0BUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data All +#define ARM_USBH_PACKET_CSPLIT (0x0CUL << ARM_USBH_PACKET_SPLIT_Pos) ///< CSPLIT Packet + +#define ARM_USBH_PACKET_PRE (1UL << 12) ///< PRE Token + + +/****** USB Host Port Event *****/ +#define ARM_USBH_EVENT_CONNECT (1UL << 0) ///< USB Device Connected to Port +#define ARM_USBH_EVENT_DISCONNECT (1UL << 1) ///< USB Device Disconnected from Port +#define ARM_USBH_EVENT_OVERCURRENT (1UL << 2) ///< USB Device caused Overcurrent +#define ARM_USBH_EVENT_RESET (1UL << 3) ///< USB Reset completed +#define ARM_USBH_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred +#define ARM_USBH_EVENT_RESUME (1UL << 5) ///< USB Resume occurred +#define ARM_USBH_EVENT_REMOTE_WAKEUP (1UL << 6) ///< USB Device activated Remote Wakeup + +/****** USB Host Pipe Event *****/ +#define ARM_USBH_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Transfer completed +#define ARM_USBH_EVENT_HANDSHAKE_NAK (1UL << 1) ///< NAK Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_NYET (1UL << 2) ///< NYET Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_MDATA (1UL << 3) ///< MDATA Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_STALL (1UL << 4) ///< STALL Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_ERR (1UL << 5) ///< ERR Handshake received +#define ARM_USBH_EVENT_BUS_ERROR (1UL << 6) ///< Bus Error detected + + +#ifndef __DOXYGEN_MW__ // exclude from middleware documentation + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBH_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBH_CAPABILITIES ARM_USBH_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBH_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBH_Initialize (ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalPipeEvent_t cb_pipe_event) + \brief Initialize USB Host Interface. + \param[in] cb_port_event Pointer to \ref ARM_USBH_SignalPortEvent + \param[in] cb_pipe_event Pointer to \ref ARM_USBH_SignalPipeEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_Uninitialize (void) + \brief De-initialize USB Host Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PowerControl (ARM_POWER_STATE state) + \brief Control USB Host Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortVbusOnOff (uint8_t port, bool vbus) + \brief Root HUB Port VBUS on/off. + \param[in] port Root HUB Port Number + \param[in] vbus + - \b false VBUS off + - \b true VBUS on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortReset (uint8_t port) + \brief Do Root HUB Port Reset. + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortSuspend (uint8_t port) + \brief Suspend Root HUB Port (stop generating SOFs). + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortResume (uint8_t port) + \brief Resume Root HUB Port (start generating SOFs). + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn ARM_USBH_PORT_STATE ARM_USBH_PortGetState (uint8_t port) + \brief Get current Root HUB Port State. + \param[in] port Root HUB Port Number + \return Port State \ref ARM_USBH_PORT_STATE +*/ +/** + \fn ARM_USBH_PIPE_HANDLE ARM_USBH_PipeCreate (uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval) + \brief Create Pipe in System. + \param[in] dev_addr Device Address + \param[in] dev_speed Device Speed + \param[in] hub_addr Hub Address + \param[in] hub_port Hub Port + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \param[in] ep_interval Endpoint Polling Interval + \return Pipe Handle \ref ARM_USBH_PIPE_HANDLE +*/ +/** + \fn int32_t ARM_USBH_PipeModify (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size) + \brief Modify Pipe in System. + \param[in] pipe_hndl Pipe Handle + \param[in] dev_addr Device Address + \param[in] dev_speed Device Speed + \param[in] hub_addr Hub Address + \param[in] hub_port Hub Port + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeDelete (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Delete Pipe from System. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeReset (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Reset Pipe. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeTransfer (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num) + \brief Transfer packets through USB Pipe. + \param[in] pipe_hndl Pipe Handle + \param[in] packet Packet information + \param[in] data Pointer to buffer with data to send or for data to receive + \param[in] num Number of data bytes to transfer + \return \ref execution_status +*/ +/** + \fn uint32_t ARM_USBH_PipeTransferGetResult (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Get result of USB Pipe transfer. + \param[in] pipe_hndl Pipe Handle + \return number of successfully transferred data bytes +*/ +/** + \fn int32_t ARM_USBH_PipeTransferAbort (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Abort current USB Pipe transfer. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn uint16_t ARM_USBH_GetFrameNumber (void) + \brief Get current USB Frame Number. + \return Frame Number +*/ + +/** + \fn void ARM_USBH_SignalPortEvent (uint8_t port, uint32_t event) + \brief Signal Root HUB Port Event. + \param[in] port Root HUB Port Number + \param[in] event \ref USBH_port_events + \return none +*/ +/** + \fn void ARM_USBH_SignalPipeEvent (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event) + \brief Signal Pipe Event. + \param[in] pipe_hndl Pipe Handle + \param[in] event \ref USBH_pipe_events + \return none +*/ + +typedef void (*ARM_USBH_SignalPortEvent_t) (uint8_t port, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPortEvent : Signal Root HUB Port Event. +typedef void (*ARM_USBH_SignalPipeEvent_t) (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPipeEvent : Signal Pipe Event. +#define ARM_USBH_SignalEndpointEvent_t ARM_USBH_SignalPipeEvent_t /* Legacy name */ + + +/** +\brief USB Host Driver Capabilities. +*/ +typedef struct _ARM_USBH_CAPABILITIES { + uint32_t port_mask : 15; ///< Root HUB available Ports Mask + uint32_t auto_split : 1; ///< Automatic SPLIT packet handling + uint32_t event_connect : 1; ///< Signal Connect event + uint32_t event_disconnect : 1; ///< Signal Disconnect event + uint32_t event_overcurrent : 1; ///< Signal Overcurrent event +} ARM_USBH_CAPABILITIES; + + +/** +\brief Access structure of USB Host Driver. +*/ +typedef struct _ARM_DRIVER_USBH { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_GetVersion : Get driver version. + ARM_USBH_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalPipeEvent_t cb_pipe_event); ///< Pointer to \ref ARM_USBH_Initialize : Initialize USB Host Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_Uninitialize : De-initialize USB Host Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_PowerControl : Control USB Host Interface Power. + int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_PortVbusOnOff : Root HUB Port VBUS on/off. + int32_t (*PortReset) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortReset : Do Root HUB Port Reset. + int32_t (*PortSuspend) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortSuspend : Suspend Root HUB Port (stop generating SOFs). + int32_t (*PortResume) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortResume : Resume Root HUB Port (start generating SOFs). + ARM_USBH_PORT_STATE (*PortGetState) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortGetState : Get current Root HUB Port State. + ARM_USBH_PIPE_HANDLE (*PipeCreate) (uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval); ///< Pointer to \ref ARM_USBH_PipeCreate : Create Pipe in System. + int32_t (*PipeModify) (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBH_PipeModify : Modify Pipe in System. + int32_t (*PipeDelete) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeDelete : Delete Pipe from System. + int32_t (*PipeReset) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeReset : Reset Pipe. + int32_t (*PipeTransfer) (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num); ///< Pointer to \ref ARM_USBH_PipeTransfer : Transfer packets through USB Pipe. + uint32_t (*PipeTransferGetResult) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferGetResult : Get result of USB Pipe transfer. + int32_t (*PipeTransferAbort) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferAbort : Abort current USB Pipe transfer. + uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBH_GetFrameNumber : Get current USB Frame Number. +} const ARM_DRIVER_USBH; + + +// HCI (OHCI/EHCI) + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBH_HCI_GetVersion (void) + \brief Get USB Host HCI (OHCI/EHCI) driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBH_HCI_CAPABILITIES ARM_USBH_HCI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBH_HCI_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBH_HCI_Initialize (ARM_USBH_HCI_Interrupt_t *cb_interrupt) + \brief Initialize USB Host HCI (OHCI/EHCI) Interface. + \param[in] cb_interrupt Pointer to Interrupt Handler Routine + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_Uninitialize (void) + \brief De-initialize USB Host HCI (OHCI/EHCI) Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_PowerControl (ARM_POWER_STATE state) + \brief Control USB Host HCI (OHCI/EHCI) Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_PortVbusOnOff (uint8_t port, bool vbus) + \brief USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. + \param[in] port Root HUB Port Number + \param[in] vbus + - \b false VBUS off + - \b true VBUS on + \return \ref execution_status +*/ + +/** + \fn void ARM_USBH_HCI_Interrupt (void) + \brief USB Host HCI Interrupt Handler. + \return none +*/ + +typedef void (*ARM_USBH_HCI_Interrupt_t) (void); ///< Pointer to Interrupt Handler Routine. + + +/** +\brief USB Host HCI (OHCI/EHCI) Driver Capabilities. +*/ +typedef struct _ARM_USBH_HCI_CAPABILITIES { + uint32_t port_mask : 15; ///< Root HUB available Ports Mask +} ARM_USBH_HCI_CAPABILITIES; + + +/** + \brief Access structure of USB Host HCI (OHCI/EHCI) Driver. +*/ +typedef struct _ARM_DRIVER_USBH_HCI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_HCI_GetVersion : Get USB Host HCI (OHCI/EHCI) driver version. + ARM_USBH_HCI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_HCI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBH_HCI_Interrupt_t cb_interrupt); ///< Pointer to \ref ARM_USBH_HCI_Initialize : Initialize USB Host HCI (OHCI/EHCI) Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_HCI_Uninitialize : De-initialize USB Host HCI (OHCI/EHCI) Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_HCI_PowerControl : Control USB Host HCI (OHCI/EHCI) Interface Power. + int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_HCI_PortVbusOnOff : USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. +} const ARM_DRIVER_USBH_HCI; + +#endif /* __DOXYGEN_MW__ */ + +#endif /* __DRIVER_USBH_H */ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Include/arm_common_tables.h b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_common_tables.h new file mode 100644 index 0000000..8742a56 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_common_tables.h @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/Include/arm_const_structs.h b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_const_structs.h new file mode 100644 index 0000000..726d06e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_const_structs.h @@ -0,0 +1,79 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/Include/arm_math.h b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_math.h new file mode 100644 index 0000000..d33f8a9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/arm_math.h @@ -0,0 +1,7154 @@ +/* ---------------------------------------------------------------------- +* 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/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc.h b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 0000000..74c49c6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,734 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc_V6.h b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc_V6.h new file mode 100644 index 0000000..cd13240 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_armcc_V6.h @@ -0,0 +1,1800 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_gcc.h b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000..bb89fbb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,1373 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000..711dad5 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0.h @@ -0,0 +1,798 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0plus.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000..b04aa39 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,914 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm3.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000..b4ac4c7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm3.h @@ -0,0 +1,1763 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm4.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm4.h new file mode 100644 index 0000000..dc840eb --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm4.h @@ -0,0 +1,1937 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm7.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm7.h new file mode 100644 index 0000000..3b7530a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cm7.h @@ -0,0 +1,2512 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmFunc.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmFunc.h new file mode 100644 index 0000000..652a48a --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmFunc.h @@ -0,0 +1,87 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmInstr.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmInstr.h new file mode 100644 index 0000000..f474b0e --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmInstr.h @@ -0,0 +1,87 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmSimd.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmSimd.h new file mode 100644 index 0000000..66bf5c2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_cmSimd.h @@ -0,0 +1,96 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc000.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc000.h new file mode 100644 index 0000000..514dbd8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc000.h @@ -0,0 +1,926 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc300.h b/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc300.h new file mode 100644 index 0000000..8bd18aa --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Include/core_sc300.h @@ -0,0 +1,1745 @@ +/**************************************************************************//** + * @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/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3b_math.lib b/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3b_math.lib new file mode 100644 index 0000000..fe69feb Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3b_math.lib differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3l_math.lib b/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3l_math.lib new file mode 100644 index 0000000..2bbd9e8 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/ARM/arm_cortexM3l_math.lib differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM0l_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM0l_math.a new file mode 100644 index 0000000..b1159d7 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM0l_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM3l_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM3l_math.a new file mode 100644 index 0000000..755d769 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM3l_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4l_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4l_math.a new file mode 100644 index 0000000..b1d6da7 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4l_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a new file mode 100644 index 0000000..1ad5280 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7l_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7l_math.a new file mode 100644 index 0000000..75aac26 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7l_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfdp_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfdp_math.a new file mode 100644 index 0000000..777cb04 Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfdp_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfsp_math.a b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfsp_math.a new file mode 100644 index 0000000..0f4894e Binary files /dev/null and b/Firmware/WIMU3/Libraries/CMSIS/Lib/GCC/libarm_cortexM7lfsp_math.a differ diff --git a/Firmware/WIMU3/Libraries/CMSIS/Lib/license.txt b/Firmware/WIMU3/Libraries/CMSIS/Lib/license.txt new file mode 100644 index 0000000..139c1ff --- /dev/null +++ b/Firmware/WIMU3/Libraries/CMSIS/Lib/license.txt @@ -0,0 +1,28 @@ +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/Firmware/WIMU3/Libraries/FatFs/src/00history.txt b/Firmware/WIMU3/Libraries/FatFs/src/00history.txt new file mode 100644 index 0000000..464850b --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/00history.txt @@ -0,0 +1,254 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + First stable version. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + + +R0.12 (April 12, 2016) + + Added support of exFAT file system. (_FS_EXFAT) + Added f_expand(). (_USE_EXPAND) + Changed some members in FINFO structure and behavior of f_readdir(). + Added an option _USE_CHMOD and removed an option _WORD_ACCESS. + Fixed errors in the case conversion teble of Unicode (cc*.c). + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/00readme.txt b/Firmware/WIMU3/Libraries/FatFs/src/00readme.txt new file mode 100644 index 0000000..bd04d18 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/00readme.txt @@ -0,0 +1,21 @@ +FatFs Module Source Files R0.12 + + +FILES + + 00readme.txt This file. + history.txt Revision history. + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + integer.h Integer type definitions for FatFs. + option Optional external functions. + + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control the target storage device. + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/diskio.h b/Firmware/WIMU3/Libraries/FatFs/src/diskio.h new file mode 100644 index 0000000..20ebde9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/diskio.h @@ -0,0 +1,80 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Firmware/WIMU3/Libraries/FatFs/src/ff.c b/Firmware/WIMU3/Libraries/FatFs/src/ff.c new file mode 100644 index 0000000..7d63de4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/ff.c @@ -0,0 +1,5776 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.12 (C)ChaN, 2016 / +/-----------------------------------------------------------------------------/ +/ FatFs module is a free software that opened under license policy of +/ following conditions. +/ +/ Copyright (C) 2016, ChaN, all right reserved. +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of disk I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 88100 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Reentrancy related */ +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res +#endif + +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Definitions of sector size */ +#if (_MAX_SS < _MIN_SS) || (_MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096) || (_MIN_SS != 512 && _MIN_SS != 1024 && _MIN_SS != 2048 && _MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if _MAX_SS == _MIN_SS +#define SS(fs) ((UINT)_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if _FS_NORTC == 1 +#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 +#error Invalid _FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if _FS_LOCK != 0 +#if _FS_READONLY +#error _FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, directory (0:root) */ + DWORD ofs; /* Object ID 3, directory offset */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + + +/* DBCS code ranges and SBCS upper conversion tables */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 771 /* KBL */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Latin 1 */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 860 /* Portuguese */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 861 /* Icelandic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 863 /* Canadian-French */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 864 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 865 /* Nordic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 869 /* Greek 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#if _USE_LFN != 0 +#error Cannot enable LFN without valid code page. +#endif +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + +/* Character code support macros */ +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S != 0 /* Code page is DBCS */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* Code page is SBCS */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + +/* Name status flags */ +#define NSFLAG 11 /* Index of name status byte in fn[] */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* Limits and Boundaries (Differ from specs but correct for real DOS/Windows) */ +#define MIN_FAT16 4086U /* Minimum number of clusters of FAT16 */ +#define MIN_FAT32 65526U /* Minimum number of clusters of FAT32 */ +#define MAX_DIR 0x200000 /* Maximum size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Maximum size of exFAT directory */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure members because the structure is not binary compatible between +/ different platforms */ + +#define BS_jmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT12/16 [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Track size for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* Error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* File system type string (8-byte) */ +#define BPB_FATSz32 36 /* FAT size (32-bit) [sector] (DWORD) */ +#define BPB_ExtFlags 40 /* Extended flags (WORD) */ + +#define BPB_FSVer32 42 /* FAT32: File system version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: File system type string (8-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: Must be zero (35-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: File system version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (BYTE) */ +#define BPB_ActFatEx 107 /* exFAT: Active FAT flags (BYTE) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Partition table offset */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ + +#define BS_55AA 510 /* Signature word (WORD) */ + +#define DIR_Name 0 /* Short file name (11) */ +#define DIR_Attr 11 /* Attribute (1) */ +#define DIR_NTres 12 /* Lower case flag (1) */ +#define DIR_CrtTime10 13 /* Created time sub-second (1) */ +#define DIR_CrtTime 14 /* Created time (2) */ +#define DIR_CrtDate 16 /* Created date (2) */ +#define DIR_LstAccDate 18 /* Last accessed date (2) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_WrtTime 22 /* Modified time (2) */ +#define DIR_WrtDate 24 /* Modified date (2) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN entry order and LLE flag (1) */ +#define LDIR_Attr 11 /* LFN attribute (1) */ +#define LDIR_Type 12 /* LFN type (1) */ +#define LDIR_Chksum 13 /* Checksum of the SFN entry */ +#define LDIR_FstClusLO 26 /* Must be zero (WORD) */ +#define XDIR_Type 0 /* Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* File attribute (WORD) */ +#define XDIR_CrtTime 8 /* Created time (4) */ +#define XDIR_ModTime 12 /* Modified time (4) */ +#define XDIR_AccTime 16 /* Last accessed time (4) */ +#define XDIR_CrtTime10 20 /* Created time subsecond (1) */ +#define XDIR_ModTime10 21 /* Modified time subsecond (1) */ +#define XDIR_CrtTZ 22 /* Created timezone (1) */ +#define XDIR_ModTZ 23 /* Modified timezone (1) */ +#define XDIR_AccTZ 24 /* Last accessed timezone (1) */ +#define XDIR_GenFlags 33 /* Gneral flags (1) */ +#define XDIR_NumName 35 /* Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* First cluster of the File/Directory (DWORD) */ +#define XDIR_FileSize 56 /* File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDEM 0xE5 /* Deleted directory entry mark at DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ + + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ + +/* Remark: Variables here without initial value shall be guaranteed zero/null +/ at start-up. If not, either the linker or start-up routine being used is +/ not compliance with C standard. */ + +#if _VOLUMES < 1 || _VOLUMES > 9 +#error Wrong _VOLUMES setting +#endif +static FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +static WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH != 0 && _VOLUMES >= 2 +static BYTE CurrVol; /* Current drive */ +#endif + +#if _FS_LOCK != 0 +static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if _USE_LFN == 0 /* Non-LFN configuration */ +#define DEF_NAMBUF BYTE sfn[12] +#define INIT_NAMBUF(dobj) (dobj).fn = sfn +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#else +#if _MAX_LFN < 12 || _MAX_LFN > 255 +#error Wrong _MAX_LFN setting +#endif + +#if _USE_LFN == 1 /* LFN enabled with static working buffer */ +#if _FS_EXFAT +static BYTE DirBuf[SZDIRE*19]; /* Directory entry block scratchpad buffer (19 entries in size) */ +#endif +static WCHAR LfnBuf[_MAX_LFN+1]; /* LFN enabled with static working buffer */ +#define DEF_NAMBUF BYTE sfn[12] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = LfnBuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() + +#elif _USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if _FS_EXFAT +#define DEF_NAMBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1]; BYTE dbuf[SZDIRE*19] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = lbuf; (dj).obj.fs->dirbuf = dbuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF BYTE dbuf[SZDIRE*19] +#define INIT_DIRBUF(fs) fs->dirbuf = dbuf +#define FREE_DIRBUF() +#else +#define DEF_NAMBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = lbuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#endif + +#elif _USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if _FS_EXFAT +#define DEF_NAMBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_NAMBUF(dj) { lfn = ff_memalloc((_MAX_LFN+1)*2 + SZDIRE*19); if (!lfn) LEAVE_FF((dj).obj.fs, FR_NOT_ENOUGH_CORE); (dj).fn = sfn; (dj).lfn = lfn; (dj).obj.fs->dirbuf = (BYTE*)(lfn+_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#define DEF_DIRBUF BYTE *dirb +#define INIT_DIRBUF(fs) { dirb = ff_memalloc(SZDIRE*19); if (!dirb) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); fs->dirbuf = dirb; } +#define FREE_DIRBUF() ff_memfree(dirb) +#else +#define DEF_NAMBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_NAMBUF(dj) { lfn = ff_memalloc((_MAX_LFN+1)*2); if (!lfn) LEAVE_FF((dj).obj.fs, FR_NOT_ENOUGH_CORE); (dj).fn = sfn; (dj).lfn = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#endif + +#else +#error Wrong _USE_LFN setting +#endif +#endif + +#ifdef _EXCVT +static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for SBCS extended characters */ +#endif + + + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static +WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static +DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if _FS_EXFAT +static +QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !_FS_READONLY +static +void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static +void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if _FS_EXFAT +static +void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) { + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt) { + do *d++ = *s++; while (--cnt); + } +} + +/* Fill memory block */ +static +void mem_set (void* dst, int val, UINT cnt) { + BYTE *d = (BYTE*)dst; + + do *d++ = (BYTE)val; while (--cnt); +} + +/* Compare memory block */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) { /* ZR:same, NZ:different */ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { /* NZ:contained, ZR:not contained */ + while (*str && *str != chr) str++; + return *str; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT +static +int lock_fs ( + FATFS* fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS* fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ +#if _FS_LOCK != 0 + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i, be; + + /* Search file semaphore table */ + for (i = be = 0; i < _FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matched with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == _FS_LOCK) { /* The object is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new object? */ + } + + /* The object has been opened. Reject any open against writing file and all write mode open */ + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + return (i == _FS_LOCK) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < _FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == _FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + if (i == _FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; +} + + +static +FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < _FS_LOCK) { /* Shift index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the file system object */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs /* File system object */ +) +{ + DWORD wsect; + UINT nf; + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Write back the sector if it is dirty */ + wsect = fs->winsect; /* Current sector number */ + if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fs->wflag = 0; + if (wsect - fs->fatbase < fs->fsize) { /* Is it in the FAT area? */ + for (nf = fs->n_fats; nf >= 2; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->fsize; + disk_write(fs->drv, fs->win, wsect, 1); + } + } + } + } + return res; +} +#endif + + +static +FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if data is not reliable */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize file system and strage device */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_fs ( /* FR_OK:succeeded, !=0:error */ + FATFS* fs /* File system object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { + /* Create FSInfo structure */ + mem_set(fs->win, 0, SS(fs)); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->drv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clust2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= fs->n_fatent - 2) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; + val = clst & 1 ? wc >> 4 : (wc & 0xFFF); + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(&fs->win[clst * 2 % SS(fs)]); + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0x0FFFFFFF; + break; +#if _FS_EXFAT + case FS_EXFAT : + if (obj->objsize) { + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2) { /* Is there no valid chain on the FAT? */ + if (cofs <= clen) { + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* Generate the value */ + break; + } + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the contiguous part? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0x7FFFFFFF; + break; + } + } + /* Go default */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +#if !_FS_READONLY +static +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : /* Bitfield items */ + bc = (UINT)clst; bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc++ % SS(fs)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + fs->wflag = 1; + break; + + case FS_FAT16 : /* WORD aligned items */ + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(&fs->win[clst * 2 % SS(fs)], (WORD)val); + fs->wflag = 1; + break; + + case FS_FAT32 : /* DWORD aligned items */ +#if _FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0xF0000000); + } + st_dword(&fs->win[clst * 4 % SS(fs)], val); + fs->wflag = 1; + break; + } + } + return res; +} +#endif /* !_FS_READONLY */ + + + + +#if _FS_EXFAT && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* exFAT: Find a contiguous free cluster block */ +/*---------------------------------------------*/ +static +DWORD find_bitmap ( /* 0:No free cluster, 2..:Free cluster found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; + i = val / 8 & (SS(fs) - 1); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = 4096; + } + if (!bv) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check run length */ + } else { + scl = val; ctr = 0; /* Encountered a live cluster, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm); + bm = 1; + } while (++i < SS(fs)); + } +} + +/*------------------------------------*/ +/* exFAT: Set/Clear a block of bitmap */ +/*------------------------------------*/ +static +FRESULT change_bitmap ( + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->database + clst / 8 / SS(fs); /* Sector address */ + i = clst / 8 & (SS(fs) - 1); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + } +} + + +/*---------------------------------------------*/ +/* Complement contiguous part of the FAT chain */ +/*---------------------------------------------*/ +static +FRESULT fill_fat_chain ( + _FDID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + if (obj->stat == 3) { /* Has the object got fragmented? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + _FDID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0:an entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if _FS_EXFAT || _USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if _USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst && (!_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst != 0xFFFFFFFF) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if _FS_EXFAT || _USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if _USE_TRIM + rt[0] = clust2sect(fs, scl); /* Start sector */ + rt[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_TRIM, rt); /* Inform device the block can be erased */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Does object have no chain? */ + obj->stat = 0; /* Change the object status 'initial' */ + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Did the chain got contiguous? */ + obj->stat = 2; /* Change the object status 'contiguous' */ + } + } + } +#endif + return FR_OK; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Get suggested cluster to start at */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch current chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Invalid value */ + if (cs == 0xFFFFFFFF) return cs; /* A disk error occurred */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; + } + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous chain' */ + } else { /* This is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + } else +#endif + { /* At the FAT12/16/32 */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* An error occurred */ + if (ncl == scl) return 0; /* No free cluster */ + } + } + + if (_FS_EXFAT && fs->fs_type == FS_EXFAT && obj->stat == 2) { /* Is it a contiguous chain? */ + res = FR_OK; /* FAT does not need to be written */ + } else { + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst < fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Create error status */ + } + + return ncl; /* Return new cluster number or error status */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +#if _USE_FASTSEEK +static +DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + DWORD ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = ofs / SS(fs) / fs->csize; /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} +#endif /* _USE_FASTSEEK */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory in FAT12/16) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory in FAT32+) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clust2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (!dp->sect) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; +#if !_FS_READONLY + UINT n; +#endif + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (!dp->sect || ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE; /* Report EOT when offset has reached max value */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (!dp->clust) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* Reached end of dynamic table */ +#if !_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + /* Clean-up the stretched table */ + if (_FS_EXFAT) dp->obj.stat |= 4; /* The directory needs to be updated */ + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + mem_set(fs->win, 0, SS(fs)); /* Clear window buffer */ + for (n = 0, fs->winsect = clust2sect(fs, clst); n < fs->csize; n++, fs->winsect++) { /* Fill the new cluster with 0 */ + fs->wflag = 1; + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; + } + fs->winsect -= n; /* Restore window offset */ +#else + if (!stretch) dp->sect = 0; /* If no stretch, report EOT (this is to suppress warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clust2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = &fs->win[ofs % SS(fs)]; /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +#if !_FS_READONLY +static +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !_FS_READONLY +static +void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + + +/*------------------------------------------------------------------------*/ +/* FAT-LFN: LFN handling */ +/*------------------------------------------------------------------------*/ +#if _USE_LFN != 0 +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN characters in the directory entry */ + +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ +static +int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + + +#if _FS_MINIMIZE <= 1 || _FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ +static +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + +#if !_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ +static +void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN != 0 && !_FS_READONLY +static +void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (seq % 16) + '0'; + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN != 0 +static +BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +#if _FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Directory handling - Load/Store a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static +WORD xdir_sum ( /* Get checksum of the directoly block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static +WORD xname_sum ( /* Get check sum (to be used as hash) of the name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = ff_wtoupper(chr); /* File name needs to be ignored case */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ +static +void get_xdir_info ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + UINT di, si, nc; + WCHAR w; + + /* Get file name */ +#if _LFN_UNICODE + if (dirb[XDIR_NumName] <= _MAX_LFN) { + for (si = SZDIRE * 2, di = 0; di < dirb[XDIR_NumName]; si += 2, di++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + fno->fname[di] = w; /* Store it */ + } + } else { + di = 0; /* Buffer overflow and inaccessible object */ + } +#else + for (si = SZDIRE * 2, di = nc = 0; nc < dirb[XDIR_NumName]; si += 2, nc++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { di = 0; break; } /* Could not be converted and inaccessible object */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[di++] = (char)(w >> 8); + } + if (di >= _MAX_LFN) { di = 0; break; } /* Buffer overflow and inaccessible object */ + fno->fname[di++] = (char)w; + } +#endif + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object? */ + fno->fname[di] = 0; /* Terminate file name */ + + fno->altname[0] = 0; /* No SFN */ + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ +static +FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Pointer to the reading direcotry object pointing the 85 entry */ +) +{ + FRESULT res; + UINT i, nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load 85 entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0x85) return FR_INT_ERR; + mem_cpy(&dirb[0], dp->dir, SZDIRE); + nent = dirb[XDIR_NumSec] + 1; + + /* Load C0 entry */ + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC0) return FR_INT_ERR; + mem_cpy(dirb + SZDIRE, dp->dir, SZDIRE); + + /* Load C1 entries */ + if (nent < 3 || nent > 19) return FR_NO_FILE; + i = SZDIRE * 2; nent *= SZDIRE; + do { + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC1) return FR_INT_ERR; + mem_cpy(dirb + i, dp->dir, SZDIRE); + i += SZDIRE; + } while (i < nent); + + /* Sanity check */ + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + + return FR_OK; +} + + +#if !_FS_READONLY || _FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ +static +FRESULT load_obj_dir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const _FDID* obj /* Object with containing directory information */ +) +{ + FRESULT res; + + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto the block location */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !_FS_READONLY +/*-----------------------------------------------*/ +/* exFAT: Store the directory block to the media */ +/*-----------------------------------------------*/ +static +FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + WORD sum; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + sum = xdir_sum(dirb); + st_word(dirb + XDIR_SetSum, sum); + nent = dirb[XDIR_NumSec] + 1; + + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK && (res = move_window(dp->obj.fs, dp->sect)) == FR_OK) { + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ +static +void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the nul terminated file name */ +) +{ + UINT i; + BYTE nb, nc; + WCHAR chr; + WORD hash; + + + mem_set(dirb, 0, 2 * SZDIRE); /* Initialize 85+C0 entry */ + dirb[XDIR_Type] = 0x85; + dirb[XDIR_Type + SZDIRE] = 0xC0; + hash = xname_sum(lfn); + st_word(dirb + XDIR_NameHash, hash); /* Set name hash */ + + i = SZDIRE * 2; /* C1 offset */ + nc = 0; nb = 1; chr = 1; + do { + dirb[i++] = 0xC1; dirb[i++] = 0; /* Entry type C1 */ + do { /* Fill name field */ + if (chr && (chr = lfn[nc]) != 0) nc++; /* Get a character if exist */ + st_word(dirb + i, chr); i += 2; /* Store it */ + } while (i % SZDIRE); + nb++; + } while (lfn[nc]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nc; /* Set name length */ + dirb[XDIR_NumSec] = nb; /* Set number of C0+C1s */ +} +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 || _USE_LABEL || _FS_EXFAT +static +FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE a, c; +#if _USE_LFN != 0 + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; /* Test for the entry type */ + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of the directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + if (_USE_LABEL && vol) { + if (c == 0x83) break; /* Volume label entry? */ + } else { + if (c == 0x85) { /* Start of the entry block? */ + dp->blk_ofs = dp->dptr; /* Set location of block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* At the FAT12/16/32 */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if _USE_LFN != 0 /* LFN configuration */ + if (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= ~LLEF; ord = c; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(dp->lfn, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} +#endif /* _FS_MINIMIZE <= 1 || _USE_LABEL || _FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if _USE_LFN != 0 + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(dp->lfn); /* Hash value of the name to find */ + + while ((res = dir_read(dp, 0)) == FR_OK) { /* Read an item */ + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip the comparison if hash value mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(dp->lfn[ni])) break; + } + if (nc == 0 && !dp->lfn[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* At the FAT12/16/32 */ +#if _USE_LFN != 0 + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN != 0 /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dp->lfn) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= ~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(dp->lfn, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dp->fn; lfn = dp->lfn; + if (fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; lfn[nlen]; nlen++) ; /* Get lfn length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + DIR dj; + + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set block position */ + + if (dp->obj.stat & 4) { /* Has the sub-directory been stretched? */ + dp->obj.stat &= 3; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase object size by cluster size */ + res = fill_fat_chain(&dp->obj); /* Complement FAT chain if needed */ + if (res != FR_OK) return res; + res = load_obj_dir(&dj, &dp->obj); + if (res != FR_OK) return res; /* Load the object status */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + + create_xdir(fs->dirbuf, lfn); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* At the FAT12/16/32 */ + mem_cpy(sn, fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NSFLAG] = 0; dp->lfn = 0; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NSFLAG] = sn[NSFLAG]; dp->lfn = lfn; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(dp->lfn, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if _USE_LFN != 0 + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + DWORD last = dp->dptr; + + res = dp->blk_ofs == 0xFFFFFFFF ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + /* Mark an entry 'deleted' */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* At the exFAT */ + dp->dir[XDIR_Type] &= 0x7F; + } else { /* At the FAT12/16/32 */ + dp->dir[DIR_Name] = DDEM; + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; + fs->wflag = 1; + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 +static +void get_fileinfo ( /* No return code */ + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT i, j; + TCHAR c; +#if _USE_LFN != 0 + WCHAR w, *lfn; + WCHAR lfv; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (!dp->sect) return; /* Exit if read pointer has reached end of directory */ + +#if _USE_LFN != 0 /* LFN configuration */ +#if _FS_EXFAT + if (dp->obj.fs->fs_type == FS_EXFAT) { /* At the exFAT */ + get_xdir_info(dp->obj.fs->dirbuf, fno); + return; + } else +#endif + { /* At the FAT12/16/32 */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + i = 0; lfn = dp->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN character */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { i = 0; break; } /* No LFN if it could not be converted */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[i++] = (char)(w >> 8); + } +#endif + if (i >= _MAX_LFN) { i = 0; break; } /* No LFN if buffer overflow */ + fno->fname[i++] = (char)w; + } + fno->fname[i] = 0; /* Terminate the LFN */ + } + } + + i = j = 0; + lfv = fno->fname[i]; /* LFN is exist if non-zero */ + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) { /* Insert a . if extension is exist */ + if (!lfv) fno->fname[j] = '.'; + fno->altname[j++] = '.'; + } +#if _LFN_UNICODE + if (IsDBCS1(c) && i != 8 && i != 11 && IsDBCS2(dp->dir[i])) { + c = c << 8 | dp->dir[i++]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif + fno->altname[j] = c; + if (!lfv) { + if (IsUpper(c) && (dp->dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY))) { + c += 0x20; /* To lower */ + } + fno->fname[j] = c; + } + j++; + } + if (!lfv) { + fno->fname[j] = 0; + if (!dp->dir[DIR_NTres]) j = 0; /* Altname is no longer needed if neither LFN nor case info is exist. */ + } + fno->altname[j] = 0; /* Terminate the SFN */ + +#else /* Non-LFN configuration */ + i = j = 0; + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) fno->fname[j++] = '.'; /* Insert a . if extension is exist */ + fno->fname[j++] = c; + } + fno->fname[j] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->fdate = ld_word(dp->dir + DIR_WrtDate); /* Date */ + fno->ftime = ld_word(dp->dir + DIR_WrtTime); /* Time */ +} +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ +#if _USE_FIND && _FS_MINIMIZE <= 1 +static +WCHAR get_achar ( /* Get a character and advances ptr 1 or 2 */ + const TCHAR** ptr /* Pointer to pointer to the SBCS/DBCS/Unicode string */ +) +{ +#if !_LFN_UNICODE + WCHAR chr; + + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#ifdef _EXCVT + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#else + if (IsDBCS1(chr) && IsDBCS2(**ptr)) { /* Get DBC 2nd byte if needed */ + chr = chr << 8 | (BYTE)*(*ptr)++; + } +#endif + return chr; +#else + return ff_wtoupper(*(*ptr)++); /* Get a word and to upper */ +#endif +} + + +static +int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + WCHAR pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (!*pat && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard chars */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recursions upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} +#endif /* _USE_FIND && _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if _USE_LFN != 0 /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + UINT i, ni, si, di; + const TCHAR *p; + + /* Create LFN in Unicode */ + p = *path; lfn = dp->lfn; si = di = 0; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') { /* Break on end of segment */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator */ + break; + } + if (di >= _MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + w = (w << 8) + b; /* Create a DBC */ + if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ + } + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + lfn[di++] = w; /* Store the Unicode character */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created */ + if (di == 0) return FR_INVALID_NAME; /* Reject nul name */ + + /* Create SFN in directory form */ + mem_set(dp->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN character */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII character */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = ExCvt[w - 0x80]; /* Convert extended character to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Is this DBC? (always false at SBCS cfg) */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dp->fn[i++] = (BYTE)(w >> 8); + } else { /* SBC */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal characters for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dp->fn[i++] = (BYTE)w; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* Create LFN entry when there are composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; +#if _FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; + if (c <= ' ' || c == '/' || c == '\\') { /* Break on end of segment */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator */ + break; + } + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended character? */ + b |= 3; /* Eliminate NT flag */ +#ifdef _EXCVT + c = ExCvt[c - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else +#if !_DF1S + return FR_INVALID_NAME; /* Reject extended characters (ASCII cfg) */ +#endif +#endif + } + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false at SBCS cfg.) */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* When first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Name body has only small capital) */ + + sfn[NSFLAG] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + _FDID *obj = &dp->obj; + FATFS *fs = obj->fs; + + +#if _FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + obj->sclust = fs->cdir; /* Start from the current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + obj->sclust = 0; /* Start from the root directory */ + } +#if _FS_EXFAT && _FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && obj->sclust) { /* Retrieve the sub-directory status if needed */ + DIR dj; + + obj->c_scl = fs->cdc_scl; + obj->c_size = fs->cdc_size; + obj->c_ofs = fs->cdc_ofs; + res = load_obj_dir(&dj, obj); + if (res != FR_OK) return res; + obj->objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(obj->attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory information for next dir */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Open next directory */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + } else +#endif + { + obj->sclust = ld_clust(fs, &fs->win[dp->dptr % SS(fs)]); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static +int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + UINT i; + int vol = -1; +#if _STR_VOLUME_ID /* Find string drive id */ + static const char* const str[] = {_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif + + + if (*path) { /* If the pointer is not a null */ + for (tt = *path; (UINT)*tt >= (_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find ':' in the path */ + if (*tt == ':') { /* If a ':' is exist in the path name */ + tp = *path; + i = *tp++ - '0'; + if (i < 10 && tp == tt) { /* Is there a numeric drive id? */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = ++tt; + } + } +#if _STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ + i = 0; tt++; + do { + sp = str[i]; tp = *path; + do { /* Compare a string drive id with path name */ + c = *sp++; tc = *tp++; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < _VOLUMES); /* Repeat for each id until pattern match */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = tt; + } + } +#endif + return vol; + } +#if _FS_RPATH != 0 && _VOLUMES >= 2 + vol = CurrVol; /* Current drive */ +#else + vol = 0; /* Drive 0 */ +#endif + } + return vol; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT boot sector */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(&fs->win[BS_55AA]) != 0xAA55) return 3; /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */ + + if ((ld_dword(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) return 0; /* Check "FAT" string */ + if ((ld_dword(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) return 0; /* Check "FAT" string */ +#if _FS_EXFAT + if (!mem_cmp(&fs->win[BS_OEMName], "EXFAT ", 8)) return 1; +#endif + return 2; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Find logical drive and check if the volume is mounted */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found file system object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number from the path name */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the file system object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock the volume */ + *rfs = fs; /* Return pointer to the file system object */ + + mode &= ~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type) { /* If the volume has been mounted */ + stat = disk_status(fs->drv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The file system object is valid */ + } + } + + /* The file system object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if _MAX_SS != _MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) < _MIN_SS || SS(fs) > _MAX_SS) return FR_DISK_ERR; +#endif + /* Find an FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol))) { /* Not an FAT boot sector or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + MBR_Table + i * SZ_PTE; + br[i] = pt[4] ? ld_dword(&pt[8]) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (!LD2PT(vol) && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found. Following code initializes the file system object */ + +#if _FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && !fs->win[i]; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT revision (Must be 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Number of sectors on the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Must be 1) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + fs->n_fatent = nclst + 2; + if (fs->n_fatent >= 0x80000000) return FR_NO_FILESYSTEM; /* (Must be <= 0x7FFFFFFF) */ + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Check if bitmap location is in assumption (at the first cluster) */ + if (move_window(fs, clust2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR; + for (i = 0; i < SS(fs); i += SZDIRE) { + if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */ + } + if (i == SS(fs)) return FR_NO_FILESYSTEM; +#if !_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif +#if _USE_LFN == 1 + fs->dirbuf = DirBuf; /* Static directory block working buuffer */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = FS_FAT12; + if (nclst >= MIN_FAT16) fmt = FS_FAT16; + if (nclst >= MIN_FAT32) fmt = FS_FAT32; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM;/* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !_FS_READONLY + /* Initialize cluster allocation information */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; + + /* Get FSINFO if available */ + fs->fsi_flag = 0x80; +#if (_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSINFO data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif +#endif + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* File system mount ID */ +#if _FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if _FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + void* dfp, /* Pointer to the FIL/DIR object to check validity */ + FATFS** fs /* Pointer to pointer to the owner file system object to return */ +) +{ + _FDID *obj = (_FDID*)dfp; /* Assuming .obj in the FIL/DIR is the first member */ + FRESULT res; + + + if (!dfp || !obj->fs || !obj->fs->fs_type || obj->fs->id != obj->id || (disk_status(obj->fs->drv) & STA_NOINIT)) { + *fs = 0; /* The object is invalid */ + res = FR_INVALID_OBJECT; + } else { + *fs = obj->fs; /* Owner file sytem object */ + ENTER_FF(obj->fs); /* Lock file system */ + res = FR_OK; + } + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if _FS_LOCK != 0 + clear_lock(cfs); +#endif +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (!fs || opt != 1) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !_FS_READONLY + DWORD dw, cl; +#endif + DEF_NAMBUF; + + + if (!fp) return FR_INVALID_OBJECT; + fp->obj.fs = 0; /* Clear file object */ + + /* Get logical drive number */ + mode &= _FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ +#if !_FS_READONLY /* R/W configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if _FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ +#if _FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ + dw = GET_FATTIME(); +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_CrtTime, dw); /* Set created time */ + fs->dirbuf[XDIR_CrtTime10] = 0; + st_dword(fs->dirbuf + XDIR_ModTime, dw); /* Set modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + fs->dirbuf[XDIR_Attr] = AM_ARC; /* Reset attribute */ + st_dword(fs->dirbuf + XDIR_FstClus, 0); /* Reset file allocation info */ + st_qword(fs->dirbuf + XDIR_FileSize, 0); + st_qword(fs->dirbuf + XDIR_ValidFileSize, 0); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Clean directory info */ + st_dword(dj.dir + DIR_CrtTime, dw); /* Set created time */ + st_dword(dj.dir + DIR_WrtTime, dw); /* Set modified time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + cl = ld_clust(fs, dj.dir); /* Get cluster chain */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + + if (cl) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Following succeeded */ + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* R/O violation */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= _FA_MODIFIED; + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if _FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + if (!fp->obj.lockid) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get allocation info */ + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + fp->obj.c_scl = dj.obj.sclust; + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if _USE_FASTSEEK + fp->cltbl = 0; /* Normal seek mode */ +#endif + fp->err = 0; /* Clear error flag */ + fp->fptr = 0; /* Set file pointer */ + fp->sect = 0; /* Invalidate current data sector */ + fp->flag = mode; /* File access mode */ + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + } + + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(fp, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data read */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->drv, rbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if _FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & _FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) { /* Fill sector cache */ + ABORT(fs, FR_DISK_ERR); + } + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - ((UINT)fp->fptr % SS(fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + mem_cpy(rbuff, &fs->win[fp->fptr % SS(fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(fp, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot exceed the limit on each FAT specs) */ + if ((_FS_EXFAT && fs->fs_type == FS_EXFAT && fp->fptr + btw < fp->fptr) + || (DWORD)fp->fptr + btw < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if _FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) { /* Write-back sector cache */ + ABORT(fs, FR_DISK_ERR); + } +#else + if (fp->flag & _FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->drv, wbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#if _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= ~_FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling at growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ + if (fp->fptr < fp->obj.objsize && + disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - ((UINT)fp->fptr % SS(fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + mem_cpy(&fs->win[fp->fptr % SS(fs)], wbuff, wcnt); /* Fit partial sector */ + fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= _FA_DIRTY; +#endif + } + + fp->flag |= _FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + DEF_DIRBUF; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & _FA_MODIFIED) { /* Is there any change to the file? */ +#if !_FS_TINY + if (fp->flag & _FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + LEAVE_FF(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_fat_chain(&fp->obj); /* Create FAT chain if needed */ + if (res == FR_OK) { + DIR dj; + + INIT_DIRBUF(fs); + res = load_obj_dir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive bit */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation info */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= ~_FA_MODIFIED; + } + } + FREE_DIRBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation info */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_WrtTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= ~_FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(fp, &fs); /* Lock volume */ + if (res == FR_OK) { +#if _FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) +#endif + { + fp->obj.fs = 0; /* Invalidate file object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH >= 1 +#if _VOLUMES >= 2 +FRESULT f_chdrive ( + const TCHAR* path /* Drive number */ +) +{ + int vol; + + + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + + CurrVol = (BYTE)vol; + + return FR_OK; +} +#endif + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { + fs->cdir = dj.obj.sclust; /* It is the start directory itself */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(fs, res); +} + + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMBUF; + + + *buff = 0; + /* Get logical drive number */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + i = len; /* Bottom of buffer (directory stack base) */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = dir_read(&dj, 0); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; + buff[--i] = '/'; + } + } + tp = buff; + if (res == FR_OK) { +#if _VOLUMES >= 2 + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; +#endif + if (i == len) { /* Root-directory */ + *tp++ = '/'; + } else { /* Sub-directroy */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if _USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ +#if _USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->sclust; /* Top of the chain */ + if (cl) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(fs, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->fsize) { /* Clip offset at the file size */ + ofs = fp->fsize; + } + fp->fptr = ofs; /* Set file pointer */ + if (ofs) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clust2sect(fs, fp->clust); + if (!dsc) ABORT(fs, FR_INT_ERR); + dsc += (ofs - 1) / SS(fs) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fp, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, dsc, 1) != RES_OK) { /* Load current sector */ + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { + if (ofs > fp->obj.objsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->obj.objsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(&fp->obj, clst); /* Force stretch if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clust2sect(fs, clst); /* Current sector */ + if (!nsect) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, nsect, 1) != RES_OK) { /* Fill sector cache */ + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= _FA_MODIFIED; + } +#endif + } + + LEAVE_FF(fs, res); +} + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + _FDID *obj; + DEF_NAMBUF; + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive number */ + obj = &dp->obj; + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + obj->fs = fs; + INIT_NAMBUF(*dp); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (obj->attr & AM_DIR) { /* This object is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory inforamation */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get object location and status */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + obj->sclust = ld_clust(fs, dp->dir); /* Get object location */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + obj->id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if _FS_LOCK != 0 + if (res == FR_OK) { + if (obj->sclust) { + obj->lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!obj->lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + obj->lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) obj->fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(dp, &fs); + if (res == FR_OK) { +#if _FS_LOCK != 0 + if (dp->obj.lockid) { /* Decrement sub-directory open counter */ + res = dec_lock(dp->obj.lockid); + } + if (res == FR_OK) +#endif + { + dp->obj.fs = 0; /* Invalidate directory object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF; + + + res = validate(dp, &fs); /* Check validity of the object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(*dp); + res = dir_read(dp, 0); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if _USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if _USE_LFN != 0 && _USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* _USE_FIND */ + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Path name of the logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding file system object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + BYTE *p; + _FDID obj; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full cluster scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Get number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Sector unalighed FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan bitmap table */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; + sect = fs->database; + i = 0; + do { + if (i == 0 && (res = move_window(fs, sect++)) != FR_OK) break; + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) & (SS(fs) - 1); + } while (clst); + } else +#endif + { /* FAT16/32: Sector alighed FAT entries */ + clst = fs->n_fatent; sect = fs->fatbase; + i = 0; p = 0; + do { + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + p = fs->win; + i = SS(fs); + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(p) == 0) nfree++; + p += 2; i -= 2; + } else { + if ((ld_dword(p) & 0x0FFFFFFF) == 0) nfree++; + p += 4; i -= 4; + } + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->obj.objsize > fp->fptr) { + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= _FA_MODIFIED; +#if !_FS_TINY + if (res == FR_OK && (fp->flag & _FA_DIRTY)) { + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= ~_FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if _FS_EXFAT + _FDID obj; +#endif + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if _FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + obj.sclust = dclst = ld_dword(fs->dirbuf + XDIR_FstClus); + obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory ? */ +#if _FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst) { /* Remove the cluster chain if exist */ +#if _FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE *dir; + UINT n; + DWORD dsc, dcl, pcl, tm; + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(&dj.obj, 0); /* Allocate a cluster for the new directory table */ + dj.obj.objsize = (DWORD)fs->csize * SS(fs); + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) res = sync_window(fs); /* Flush FAT */ + tm = GET_FATTIME(); + if (res == FR_OK) { /* Initialize the new directory table */ + dsc = clust2sect(fs, dcl); + dir = fs->win; + mem_set(dir, 0, SS(fs)); + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + st_dword(dir + DIR_WrtTime, tm); + st_clust(fs, dir, dcl); + mem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create ".." entry */ + dir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + if (fs->fs_type == FS_FAT32 && pcl == fs->dirbase) + pcl = 0; + st_clust(fs, dir + SZDIRE, pcl); + } + for (n = fs->csize; n; n--) { /* Write dot entries and clear following sectors */ + fs->winsect = dsc++; + fs->wflag = 1; + res = sync_window(fs); + if (res != FR_OK) break; + mem_set(dir, 0, SS(fs)); + } + } + if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, tm); + st_dword(fs->dirbuf + XDIR_FstClus, dcl); + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)dj.obj.objsize); + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize); + fs->dirbuf[XDIR_GenFlags] = 3; + fs->dirbuf[XDIR_Attr] = AM_DIR; + res = store_xdir(&dj); + } else +#endif + { + dir = dj.dir; + st_dword(dir + DIR_WrtTime, tm); /* Created time */ + st_clust(fs, dir, dcl); /* Table start cluster */ + dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + res = sync_fs(fs); + } else { + remove_chain(&dj.obj, dcl, 0); /* Could not register, remove cluster chain */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[_FS_EXFAT ? SZDIRE * 2 : 24], *dir; + DWORD dw; + DEF_NAMBUF; + + + get_ldnumber(&path_new); /* Ignore drive number of new name */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive number of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(djo); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&djo, 2); +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) res = FR_EXIST; /* Is new name already in use? */ + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); +/* Start of critical section where any interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT12/FAT16/FAT32 */ + mem_cpy(buf, djo.dir + DIR_Attr, 21); /* Save information about the object except name */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) res = FR_EXIST; /* Is new name already in use? */ + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy information about object except name */ + mem_cpy(dir + 13, buf + 2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clust2sect(fs, ld_clust(fs, dir)); + if (!dw) { + res = FR_INT_ERR; + } else { +/* Start of critical section where any interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +#if _USE_CHMOD && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive number */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the time stamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive number */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_word(fs->dirbuf + XDIR_ModTime, fno->ftime); + st_word(fs->dirbuf + XDIR_ModTime + 2, fno->fdate); + res = store_xdir(&dj); + } else +#endif + { + st_word(dj.dir + DIR_WrtTime, fno->ftime); + st_word(dj.dir + DIR_WrtDate, fno->fdate); + fs->wflag = 1; + } + if (res == FR_OK) res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_CHMOD && !_FS_READONLY */ + + + +#if _USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Path name of the logical drive number */ + TCHAR* label, /* Pointer to a buffer to return the volume label */ + DWORD* vsn /* Pointer to a variable to return the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; +#if _LFN_UNICODE || _FS_EXFAT + WCHAR w; +#endif + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Find a volume label entry */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + for (si = di = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + w = ld_word(dj.dir + XDIR_Label + si * 2); +#if _LFN_UNICODE + label[di++] = w; +#else + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) w = '?'; /* Replace wrong character */ + if (_DF1S && w >= 0x100) label[di++] = (char)(w >> 8); + label[di++] = (char)w; +#endif + } + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry with code comversion */ + do { +#if _LFN_UNICODE + w = (si < 11) ? dj.dir[si++] : ' '; + if (IsDBCS1(w) && si < 11 && IsDBCS2(dj.dir[si])) { + w = w << 8 | dj.dir[si++]; + } + label[di++] = ff_convert(w, 1); /* OEM -> Unicode */ +#else + label[di++] = dj.dir[si++]; +#endif + } while (di < 11); + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: di = BPB_VolIDEx; break; + case FS_FAT32: di = BS_VolID32; break; + default: di = BS_VolID; + } + *vsn = ld_dword(&fs->win[di]); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Pointer to the volume label to set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT i, j, slen; + WCHAR w; + static const char badchr[] = "\"*+,.:;<=>\?[]|\x7F"; + + + /* Get logical drive number */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + dj.obj.fs = fs; + + /* Get length of given volume label */ + for (slen = 0; (UINT)label[slen] >= ' '; slen++) ; /* Get name length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + for (i = j = 0; i < slen; ) { /* Create volume label in directory form */ + w = label[i++]; +#if !_LFN_UNICODE + if (IsDBCS1(w)) { + w = (i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } + w = ff_convert(w, 1); +#endif + if (w == 0 || chk_chr(badchr, w) || j == 22) { /* Check validity check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + j, w); j += 2; + } + slen = j; + } else +#endif + { /* At the FAT12/16/32 */ + for ( ; slen && label[slen - 1] == ' '; slen--) ; /* Remove trailing spaces */ + if (slen) { /* Is there a volume label to be set? */ + dirvn[0] = 0; i = j = 0; /* Create volume label in directory form */ + do { +#if _LFN_UNICODE + w = ff_convert(ff_wtoupper(label[i++]), 0); +#else + w = (BYTE)label[i++]; + if (IsDBCS1(w)) { + w = (j < 10 && i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } +#if _USE_LFN != 0 + w = ff_convert(ff_wtoupper(ff_convert(w, 1)), 0); +#else + if (IsLower(w)) w -= 0x20; /* To upper ASCII characters */ +#ifdef _EXCVT + if (w >= 0x80) w = ExCvt[w - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else + if (!_DF1S && w >= 0x80) w = 0; /* Reject extended characters (ASCII cfg) */ +#endif +#endif +#endif + if (w == 0 || chk_chr(badchr, w) || j >= (UINT)((w >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (w >= 0x100) dirvn[j++] = (BYTE)(w >> 8); + dirvn[j++] = (BYTE)w; + } while (i < slen); + while (j < 11) dirvn[j++] = ' '; /* Fill remaining name field */ + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + } + } + + /* Set volume label */ + dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Get volume label entry */ + if (res == FR_OK) { + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = slen / 2; /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + if (slen) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry is found or error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (slen) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clear the entry */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = 0x83; /* Create 83 entry */ + dj.dir[XDIR_NumLabel] = slen / 2; + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_LABEL */ + + + +#if _USE_EXPAND && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD val, clst, csz, stcl, scl, ncl, tcl; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if _FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + csz = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / csz) + ((fsz & (csz - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 1) res = FR_INT_ERR; + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { + if (opt) { + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + fs->last_clst = scl + tcl - 1; + } else { + fs->last_clst = scl - 1; /* Set suggested cluster to start next */ + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + val = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (val == 1) { res = FR_INT_ERR; break; } + if (val == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (val == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block was found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* All cluster scanned? */ + } + if (res == FR_OK) { + if (opt) { + for (clst = scl; tcl; clst++, tcl--) { /* Create a cluster chain on the FAT */ + val = (tcl == 1) ? 0xFFFFFFFF : clst + 1; + res = put_fat(fs, clst, val); + if (res != FR_OK) break; + fs->last_clst = clst; + } + } else { + fs->last_clst = scl - 1; /* Set suggested cluster to start next */ + } + } + } + + if (opt && res == FR_OK) { + fp->obj.sclust = scl; /* Update allocation information */ + fp->obj.objsize = fsz; + if (_FS_EXFAT) fp->obj.stat = 2; + fp->flag |= _FA_MODIFIED; + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_EXPAND && !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (available on only tiny cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->fsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->sclust : get_fat(fs, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clust2sect(fs, fp->clust); /* Get current data sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + if (move_window(fs, sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + fp->sect = sect; + rcnt = SS(fs) - (WORD)(fp->fptr % SS(fs)); /* Forward data from sector window */ + if (rcnt > btf) rcnt = btf; + rcnt = (*func)(&fs->win[(WORD)fp->fptr % SS(fs)], rcnt); + if (!rcnt) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create file system on the logical drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Number of root directory entries for FAT12/16 */ +#define N_FATS 1 /* Number of FATs (1 or 2) */ + + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE sfd, /* Partitioning rule 0:FDISK, 1:SFD */ + UINT au /* Size of allocation unit in unit of byte or sector */ +) +{ + static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0}; + static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512}; + int vol; + BYTE fmt, md, sys, *tbl, pdrv, part; + DWORD n_clst, vs, n, wsect; + UINT i; + DWORD b_vol, b_fat, b_dir, b_data; /* LBA */ + DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ + FATFS *fs; + DSTATUS stat; +#if _USE_TRIM + DWORD eb[2]; +#endif + + + /* Check mounted drive and clear work area */ + if (sfd > 1) return FR_INVALID_PARAMETER; + vol = get_ldnumber(&path); /* Get target volume */ + if (vol < 0) return FR_INVALID_DRIVE; + fs = FatFs[vol]; /* Check if the volume has work area */ + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:auto detect, 1-4:get from partition table)*/ + + /* Get disk statics */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != _MIN_SS /* Get disk sector size */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS || SS(fs) < _MIN_SS) { + return FR_DISK_ERR; + } +#endif + if (_MULTI_PARTITION && part) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; + if (ld_word(fs->win + BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + if (!tbl[4]) return FR_MKFS_ABORTED; /* No partition? */ + b_vol = ld_dword(tbl + 8); /* Volume start sector */ + n_vol = ld_dword(tbl + 12); /* Volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) { + return FR_DISK_ERR; + } + b_vol = (sfd) ? 0 : 63; /* Volume start sector */ + n_vol -= b_vol; /* Volume size */ + } + + if (au & (au - 1)) au = 0; + if (!au) { /* AU auto selection */ + vs = n_vol / (2000 / (SS(fs) / 512)); + for (i = 0; vs < vst[i]; i++) ; + au = cst[i]; + } + if (au >= _MIN_SS) au /= SS(fs); /* Number of sectors per cluster */ + if (!au) au = 1; + if (au > 128) au = 128; + + /* Pre-compute number of clusters and FAT sub-type */ + n_clst = n_vol / au; + fmt = FS_FAT12; + if (n_clst >= MIN_FAT16) fmt = FS_FAT16; + if (n_clst >= MIN_FAT32) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + if (fmt == FS_FAT32) { + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 32; + n_dir = 0; + } else { + n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; + n_fat = (n_fat + SS(fs) - 1) / SS(fs); + n_rsv = 1; + n_dir = (DWORD)N_ROOTDIR * SZDIRE / SS(fs); + } + b_fat = b_vol + n_rsv; /* FAT area start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ + b_data = b_dir + n_dir; /* Data area start sector */ + if (n_vol < b_data + au - b_vol) return FR_MKFS_ABORTED; /* Too small volume */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &n) != RES_OK || !n || n > 32768) n = 1; + n = (b_data + n - 1) & ~(n - 1); /* Next nearest erase block from current data start */ + n = (n - b_data) / N_FATS; + if (fmt == FS_FAT32) { /* FAT32: Move FAT offset */ + n_rsv += n; + b_fat += n; + } else { /* FAT12/16: Expand FAT size */ + n_fat += n; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; + if ( (fmt == FS_FAT16 && n_clst < MIN_FAT16) + || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) { + return FR_MKFS_ABORTED; + } + + /* Determine system ID in the partition table */ + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (fmt == FS_FAT12 && n_vol < 0x10000) { + sys = 0x01; /* FAT12(<65536) */ + } else { + sys = (n_vol < 0x10000) ? 0x04 : 0x06; /* FAT16(<65536) : FAT12/16(>=65536) */ + } + } + + if (_MULTI_PARTITION && part) { + /* Update system ID in the partition table */ + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + tbl[4] = sys; + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) { /* Write it to teh MBR */ + return FR_DISK_ERR; + } + md = 0xF8; + } else { + if (sfd) { /* No partition table (SFD) */ + md = 0xF0; + } else { /* Create partition table (FDISK) */ + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win + MBR_Table; /* Create partition table for single partition in the drive */ + tbl[1] = 1; /* Partition start head */ + tbl[2] = 1; /* Partition start sector */ + tbl[3] = 0; /* Partition start cylinder */ + tbl[4] = sys; /* System type */ + tbl[5] = 254; /* Partition end head */ + n = (b_vol + n_vol) / 63 / 255; + tbl[6] = (BYTE)(n >> 2 | 63); /* Partition end sector */ + tbl[7] = (BYTE)n; /* End cylinder */ + st_dword(tbl + 8, 63); /* Partition start in LBA */ + st_dword(tbl + 12, n_vol); /* Partition size in LBA */ + st_word(fs->win + BS_55AA, 0xAA55); /* MBR signature */ + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) { /* Write it to the MBR */ + return FR_DISK_ERR; + } + md = 0xF8; + } + } + + /* Create BPB in the VBR */ + tbl = fs->win; /* Clear sector */ + mem_set(tbl, 0, SS(fs)); + mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code, OEM name */ + i = SS(fs); /* Sector size */ + st_word(tbl + BPB_BytsPerSec, (WORD)i); + tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ + st_word(tbl + BPB_RsvdSecCnt, (WORD)n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of root directory entries */ + st_word(tbl + BPB_RootEntCnt, (WORD)i); + if (n_vol < 0x10000) { /* Number of total sectors */ + st_word(tbl + BPB_TotSec16, (WORD)n_vol); + } else { + st_dword(tbl + BPB_TotSec32, (WORD)n_vol); + } + tbl[BPB_Media] = md; /* Media descriptor */ + st_word(tbl + BPB_SecPerTrk, 63); /* Number of sectors per track */ + st_word(tbl + BPB_NumHeads, 255); /* Number of heads */ + st_dword(tbl + BPB_HiddSec, b_vol); /* Volume offset */ + n = GET_FATTIME(); /* Use current time as VSN */ + if (fmt == FS_FAT32) { + st_dword(tbl + BS_VolID32, n); /* VSN */ + st_dword(tbl + BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + st_dword(tbl + BPB_RootClus32, 2); /* Root directory start cluster (2) */ + st_word(tbl + BPB_FSInfo32, 1); /* FSINFO record offset (VBR + 1) */ + st_word(tbl + BPB_BkBootSec32, 6); /* Backup boot record offset (VBR + 6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(tbl + BS_VolID, n); /* VSN */ + st_word(tbl + BPB_FATSz16, (WORD)n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(tbl + BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, tbl, b_vol, 1) != RES_OK) { /* Write it to the VBR sector */ + return FR_DISK_ERR; + } + if (fmt == FS_FAT32) { /* Write it to the backup VBR if needed (VBR + 6) */ + disk_write(pdrv, tbl, b_vol + 6, 1); + } + + /* Initialize FAT area */ + wsect = b_fat; + for (i = 0; i < N_FATS; i++) { /* Initialize each FAT copy */ + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + n = md; /* Media descriptor byte */ + if (fmt != FS_FAT32) { + n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + st_dword(tbl + 0, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + n |= 0xFFFFFF00; + st_dword(tbl + 0, n); /* Reserve cluster #0-1 (FAT32) */ + st_dword(tbl + 4, 0xFFFFFFFF); + st_dword(tbl + 8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ + } + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ + for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector writes */ + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + } + } + + /* Initialize root directory */ + i = (fmt == FS_FAT32) ? au : (UINT)n_dir; + do { + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + } while (--i); + +#if _USE_TRIM /* Erase data area if needed */ + { + eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; + disk_ioctl(pdrv, CTRL_TRIM, eb); + } +#endif + + /* Create FSINFO if needed */ + if (fmt == FS_FAT32) { + st_dword(tbl + FSI_LeadSig, 0x41615252); + st_dword(tbl + FSI_StrucSig, 0x61417272); + st_dword(tbl + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(tbl + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(tbl + BS_55AA, 0xAA55); + disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR + 1) */ + disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR + 7) */ + } + + return (disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + + + +#if _MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create partition table on the physical drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD szt[], /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + /* Determine CHS in the table regardless of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = n - 1; + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, _MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; + if (!p_cyl) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; + if (e_cyl >= tot_cyl) return FR_INVALID_PARAMETER; + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)((b_cyl >> 2) + 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x06; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Partition size */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); + + /* Write it to the MBR */ + return (disk_write(pdrv, buf, 0, 1) != RES_OK || disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) ? FR_DISK_ERR : FR_OK; +} + + +#endif /* _MULTI_PARTITION */ +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + FIL* fp /* Pointer to the file object */ +) +{ + int n = 0; + TCHAR c, *p = buff; + BYTE s[2]; + UINT rc; + + + while (n < len - 1) { /* Read characters until buffer gets filled */ +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (c >= 0x80) { + if (c < 0xC0) continue; /* Skip stray trailer */ + if (c < 0xE0) { /* Two-byte sequence */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c & 0x1F) << 6 | (s[0] & 0x3F); + if (c < 0x80) c = '?'; + } else { + if (c < 0xF0) { /* Three-byte sequence */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = c << 12 | (s[0] & 0x3F) << 6 | (s[1] & 0x3F); + if (c < 0x800) c = '?'; + } else { /* Reject four-byte sequence */ + c = '?'; + } + } + } +#elif _STRF_ENCODE == 2 /* Read a character in UTF-16BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[1] + (s[0] << 8); +#elif _STRF_ENCODE == 1 /* Read a character in UTF-16LE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[0] + (s[1] << 8); +#else /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (IsDBCS1(c)) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c << 8) + s[0]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif +#else /* Read a character without conversion */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; +#endif + if (_USE_STRFUNC == 2 && c == '\r') continue; /* Strip '\r' */ + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ + +typedef struct { + FIL* fp; + int idx, nchr; + BYTE buf[64]; +} putbuff; + + +static +void putc_bfd ( + putbuff* pb, + TCHAR c +) +{ + UINT bw; + int i; + + + if (_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Buffer write index (-1:error) */ + if (i < 0) return; + +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Write a character in UTF-8 */ + if (c < 0x80) { /* 7-bit */ + pb->buf[i++] = (BYTE)c; + } else { + if (c < 0x800) { /* 11-bit */ + pb->buf[i++] = (BYTE)(0xC0 | c >> 6); + } else { /* 16-bit */ + pb->buf[i++] = (BYTE)(0xE0 | c >> 12); + pb->buf[i++] = (BYTE)(0x80 | (c >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (c & 0x3F)); + } +#elif _STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#elif _STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + pb->buf[i++] = (BYTE)c; + pb->buf[i++] = (BYTE)(c >> 8); +#else /* Write a character in ANSI/OEM */ + c = ff_convert(c, 0); /* Unicode -> OEM */ + if (!c) c = '?'; + if (c >= 0x100) + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#endif +#else /* Write a character without conversion */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 3) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &bw); + i = (bw == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr++; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + UINT nw; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + putc_bfd(&pb, c); /* Put a character */ + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + UINT nw; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + while (*str) /* Put the string */ + putc_bfd(&pb, *str++); + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + BYTE f, r; + UINT nw, i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + putbuff pb; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + while (IsDigit(c)) { /* Precision */ + w = w * 10 + c - '0'; + c = *fmt++; + } + if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (!c) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, ' '); + } + while (*p) putc_bfd(&pb, *p++); + while (j++ < w) putc_bfd(&pb, ' '); + continue; + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + case 'B' : /* Binary */ + r = 2; break; + case 'O' : /* Octal */ + r = 8; break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + case 'X' : /* Hexdecimal */ + r = 16; break; + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof str[0]); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + while (!(f & 2) && j++ < w) putc_bfd(&pb, d); + do putc_bfd(&pb, str[--i]); while (i); + while (j++ < w) putc_bfd(&pb, d); + } + + va_end(arp); + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/Firmware/WIMU3/Libraries/FatFs/src/ff.c.bak b/Firmware/WIMU3/Libraries/FatFs/src/ff.c.bak new file mode 100644 index 0000000..7d63de4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/ff.c.bak @@ -0,0 +1,5776 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.12 (C)ChaN, 2016 / +/-----------------------------------------------------------------------------/ +/ FatFs module is a free software that opened under license policy of +/ following conditions. +/ +/ Copyright (C) 2016, ChaN, all right reserved. +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of disk I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 88100 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Reentrancy related */ +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res +#endif + +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Definitions of sector size */ +#if (_MAX_SS < _MIN_SS) || (_MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096) || (_MIN_SS != 512 && _MIN_SS != 1024 && _MIN_SS != 2048 && _MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if _MAX_SS == _MIN_SS +#define SS(fs) ((UINT)_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if _FS_NORTC == 1 +#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 +#error Invalid _FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if _FS_LOCK != 0 +#if _FS_READONLY +#error _FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, directory (0:root) */ + DWORD ofs; /* Object ID 3, directory offset */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + + +/* DBCS code ranges and SBCS upper conversion tables */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 771 /* KBL */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Latin 1 */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 860 /* Portuguese */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 861 /* Icelandic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 863 /* Canadian-French */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 864 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 865 /* Nordic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 869 /* Greek 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#if _USE_LFN != 0 +#error Cannot enable LFN without valid code page. +#endif +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + +/* Character code support macros */ +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S != 0 /* Code page is DBCS */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* Code page is SBCS */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + +/* Name status flags */ +#define NSFLAG 11 /* Index of name status byte in fn[] */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* Limits and Boundaries (Differ from specs but correct for real DOS/Windows) */ +#define MIN_FAT16 4086U /* Minimum number of clusters of FAT16 */ +#define MIN_FAT32 65526U /* Minimum number of clusters of FAT32 */ +#define MAX_DIR 0x200000 /* Maximum size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Maximum size of exFAT directory */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure members because the structure is not binary compatible between +/ different platforms */ + +#define BS_jmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT12/16 [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Track size for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* Error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* File system type string (8-byte) */ +#define BPB_FATSz32 36 /* FAT size (32-bit) [sector] (DWORD) */ +#define BPB_ExtFlags 40 /* Extended flags (WORD) */ + +#define BPB_FSVer32 42 /* FAT32: File system version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: File system type string (8-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: Must be zero (35-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: File system version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (BYTE) */ +#define BPB_ActFatEx 107 /* exFAT: Active FAT flags (BYTE) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Partition table offset */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ + +#define BS_55AA 510 /* Signature word (WORD) */ + +#define DIR_Name 0 /* Short file name (11) */ +#define DIR_Attr 11 /* Attribute (1) */ +#define DIR_NTres 12 /* Lower case flag (1) */ +#define DIR_CrtTime10 13 /* Created time sub-second (1) */ +#define DIR_CrtTime 14 /* Created time (2) */ +#define DIR_CrtDate 16 /* Created date (2) */ +#define DIR_LstAccDate 18 /* Last accessed date (2) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_WrtTime 22 /* Modified time (2) */ +#define DIR_WrtDate 24 /* Modified date (2) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN entry order and LLE flag (1) */ +#define LDIR_Attr 11 /* LFN attribute (1) */ +#define LDIR_Type 12 /* LFN type (1) */ +#define LDIR_Chksum 13 /* Checksum of the SFN entry */ +#define LDIR_FstClusLO 26 /* Must be zero (WORD) */ +#define XDIR_Type 0 /* Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* File attribute (WORD) */ +#define XDIR_CrtTime 8 /* Created time (4) */ +#define XDIR_ModTime 12 /* Modified time (4) */ +#define XDIR_AccTime 16 /* Last accessed time (4) */ +#define XDIR_CrtTime10 20 /* Created time subsecond (1) */ +#define XDIR_ModTime10 21 /* Modified time subsecond (1) */ +#define XDIR_CrtTZ 22 /* Created timezone (1) */ +#define XDIR_ModTZ 23 /* Modified timezone (1) */ +#define XDIR_AccTZ 24 /* Last accessed timezone (1) */ +#define XDIR_GenFlags 33 /* Gneral flags (1) */ +#define XDIR_NumName 35 /* Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* First cluster of the File/Directory (DWORD) */ +#define XDIR_FileSize 56 /* File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDEM 0xE5 /* Deleted directory entry mark at DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ + + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ + +/* Remark: Variables here without initial value shall be guaranteed zero/null +/ at start-up. If not, either the linker or start-up routine being used is +/ not compliance with C standard. */ + +#if _VOLUMES < 1 || _VOLUMES > 9 +#error Wrong _VOLUMES setting +#endif +static FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +static WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH != 0 && _VOLUMES >= 2 +static BYTE CurrVol; /* Current drive */ +#endif + +#if _FS_LOCK != 0 +static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if _USE_LFN == 0 /* Non-LFN configuration */ +#define DEF_NAMBUF BYTE sfn[12] +#define INIT_NAMBUF(dobj) (dobj).fn = sfn +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#else +#if _MAX_LFN < 12 || _MAX_LFN > 255 +#error Wrong _MAX_LFN setting +#endif + +#if _USE_LFN == 1 /* LFN enabled with static working buffer */ +#if _FS_EXFAT +static BYTE DirBuf[SZDIRE*19]; /* Directory entry block scratchpad buffer (19 entries in size) */ +#endif +static WCHAR LfnBuf[_MAX_LFN+1]; /* LFN enabled with static working buffer */ +#define DEF_NAMBUF BYTE sfn[12] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = LfnBuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() + +#elif _USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if _FS_EXFAT +#define DEF_NAMBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1]; BYTE dbuf[SZDIRE*19] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = lbuf; (dj).obj.fs->dirbuf = dbuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF BYTE dbuf[SZDIRE*19] +#define INIT_DIRBUF(fs) fs->dirbuf = dbuf +#define FREE_DIRBUF() +#else +#define DEF_NAMBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define INIT_NAMBUF(dj) { (dj).fn = sfn; (dj).lfn = lbuf; } +#define FREE_NAMBUF() +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#endif + +#elif _USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if _FS_EXFAT +#define DEF_NAMBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_NAMBUF(dj) { lfn = ff_memalloc((_MAX_LFN+1)*2 + SZDIRE*19); if (!lfn) LEAVE_FF((dj).obj.fs, FR_NOT_ENOUGH_CORE); (dj).fn = sfn; (dj).lfn = lfn; (dj).obj.fs->dirbuf = (BYTE*)(lfn+_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#define DEF_DIRBUF BYTE *dirb +#define INIT_DIRBUF(fs) { dirb = ff_memalloc(SZDIRE*19); if (!dirb) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); fs->dirbuf = dirb; } +#define FREE_DIRBUF() ff_memfree(dirb) +#else +#define DEF_NAMBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_NAMBUF(dj) { lfn = ff_memalloc((_MAX_LFN+1)*2); if (!lfn) LEAVE_FF((dj).obj.fs, FR_NOT_ENOUGH_CORE); (dj).fn = sfn; (dj).lfn = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#define DEF_DIRBUF +#define INIT_DIRBUF(fs) +#define FREE_DIRBUF() +#endif + +#else +#error Wrong _USE_LFN setting +#endif +#endif + +#ifdef _EXCVT +static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for SBCS extended characters */ +#endif + + + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static +WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static +DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if _FS_EXFAT +static +QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !_FS_READONLY +static +void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static +void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if _FS_EXFAT +static +void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) { + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt) { + do *d++ = *s++; while (--cnt); + } +} + +/* Fill memory block */ +static +void mem_set (void* dst, int val, UINT cnt) { + BYTE *d = (BYTE*)dst; + + do *d++ = (BYTE)val; while (--cnt); +} + +/* Compare memory block */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) { /* ZR:same, NZ:different */ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { /* NZ:contained, ZR:not contained */ + while (*str && *str != chr) str++; + return *str; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT +static +int lock_fs ( + FATFS* fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS* fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ +#if _FS_LOCK != 0 + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i, be; + + /* Search file semaphore table */ + for (i = be = 0; i < _FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matched with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == _FS_LOCK) { /* The object is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new object? */ + } + + /* The object has been opened. Reject any open against writing file and all write mode open */ + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + return (i == _FS_LOCK) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < _FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == _FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + if (i == _FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; +} + + +static +FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < _FS_LOCK) { /* Shift index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the file system object */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs /* File system object */ +) +{ + DWORD wsect; + UINT nf; + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Write back the sector if it is dirty */ + wsect = fs->winsect; /* Current sector number */ + if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fs->wflag = 0; + if (wsect - fs->fatbase < fs->fsize) { /* Is it in the FAT area? */ + for (nf = fs->n_fats; nf >= 2; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->fsize; + disk_write(fs->drv, fs->win, wsect, 1); + } + } + } + } + return res; +} +#endif + + +static +FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if data is not reliable */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize file system and strage device */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_fs ( /* FR_OK:succeeded, !=0:error */ + FATFS* fs /* File system object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { + /* Create FSInfo structure */ + mem_set(fs->win, 0, SS(fs)); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->drv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clust2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= fs->n_fatent - 2) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; + val = clst & 1 ? wc >> 4 : (wc & 0xFFF); + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(&fs->win[clst * 2 % SS(fs)]); + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0x0FFFFFFF; + break; +#if _FS_EXFAT + case FS_EXFAT : + if (obj->objsize) { + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2) { /* Is there no valid chain on the FAT? */ + if (cofs <= clen) { + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* Generate the value */ + break; + } + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the contiguous part? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0x7FFFFFFF; + break; + } + } + /* Go default */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +#if !_FS_READONLY +static +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : /* Bitfield items */ + bc = (UINT)clst; bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc++ % SS(fs)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + fs->wflag = 1; + break; + + case FS_FAT16 : /* WORD aligned items */ + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(&fs->win[clst * 2 % SS(fs)], (WORD)val); + fs->wflag = 1; + break; + + case FS_FAT32 : /* DWORD aligned items */ +#if _FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(&fs->win[clst * 4 % SS(fs)]) & 0xF0000000); + } + st_dword(&fs->win[clst * 4 % SS(fs)], val); + fs->wflag = 1; + break; + } + } + return res; +} +#endif /* !_FS_READONLY */ + + + + +#if _FS_EXFAT && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* exFAT: Find a contiguous free cluster block */ +/*---------------------------------------------*/ +static +DWORD find_bitmap ( /* 0:No free cluster, 2..:Free cluster found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; + i = val / 8 & (SS(fs) - 1); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = 4096; + } + if (!bv) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check run length */ + } else { + scl = val; ctr = 0; /* Encountered a live cluster, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm); + bm = 1; + } while (++i < SS(fs)); + } +} + +/*------------------------------------*/ +/* exFAT: Set/Clear a block of bitmap */ +/*------------------------------------*/ +static +FRESULT change_bitmap ( + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->database + clst / 8 / SS(fs); /* Sector address */ + i = clst / 8 & (SS(fs) - 1); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + } +} + + +/*---------------------------------------------*/ +/* Complement contiguous part of the FAT chain */ +/*---------------------------------------------*/ +static +FRESULT fill_fat_chain ( + _FDID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + if (obj->stat == 3) { /* Has the object got fragmented? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + _FDID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0:an entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if _FS_EXFAT || _USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if _USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst && (!_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst != 0xFFFFFFFF) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if _FS_EXFAT || _USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if _USE_TRIM + rt[0] = clust2sect(fs, scl); /* Start sector */ + rt[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_TRIM, rt); /* Inform device the block can be erased */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Does object have no chain? */ + obj->stat = 0; /* Change the object status 'initial' */ + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Did the chain got contiguous? */ + obj->stat = 2; /* Change the object status 'contiguous' */ + } + } + } +#endif + return FR_OK; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Get suggested cluster to start at */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch current chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Invalid value */ + if (cs == 0xFFFFFFFF) return cs; /* A disk error occurred */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; + } + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous chain' */ + } else { /* This is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + } else +#endif + { /* At the FAT12/16/32 */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* An error occurred */ + if (ncl == scl) return 0; /* No free cluster */ + } + } + + if (_FS_EXFAT && fs->fs_type == FS_EXFAT && obj->stat == 2) { /* Is it a contiguous chain? */ + res = FR_OK; /* FAT does not need to be written */ + } else { + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst < fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Create error status */ + } + + return ncl; /* Return new cluster number or error status */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +#if _USE_FASTSEEK +static +DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + DWORD ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = ofs / SS(fs) / fs->csize; /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} +#endif /* _USE_FASTSEEK */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory in FAT12/16) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory in FAT32+) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clust2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (!dp->sect) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; +#if !_FS_READONLY + UINT n; +#endif + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (!dp->sect || ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE; /* Report EOT when offset has reached max value */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (!dp->clust) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* Reached end of dynamic table */ +#if !_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + /* Clean-up the stretched table */ + if (_FS_EXFAT) dp->obj.stat |= 4; /* The directory needs to be updated */ + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + mem_set(fs->win, 0, SS(fs)); /* Clear window buffer */ + for (n = 0, fs->winsect = clust2sect(fs, clst); n < fs->csize; n++, fs->winsect++) { /* Fill the new cluster with 0 */ + fs->wflag = 1; + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; + } + fs->winsect -= n; /* Restore window offset */ +#else + if (!stretch) dp->sect = 0; /* If no stretch, report EOT (this is to suppress warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clust2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = &fs->win[ofs % SS(fs)]; /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +#if !_FS_READONLY +static +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !_FS_READONLY +static +void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + + +/*------------------------------------------------------------------------*/ +/* FAT-LFN: LFN handling */ +/*------------------------------------------------------------------------*/ +#if _USE_LFN != 0 +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN characters in the directory entry */ + +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ +static +int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + + +#if _FS_MINIMIZE <= 1 || _FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ +static +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + +#if !_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ +static +void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN != 0 && !_FS_READONLY +static +void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (seq % 16) + '0'; + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN != 0 +static +BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +#if _FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Directory handling - Load/Store a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static +WORD xdir_sum ( /* Get checksum of the directoly block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static +WORD xname_sum ( /* Get check sum (to be used as hash) of the name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = ff_wtoupper(chr); /* File name needs to be ignored case */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ +static +void get_xdir_info ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + UINT di, si, nc; + WCHAR w; + + /* Get file name */ +#if _LFN_UNICODE + if (dirb[XDIR_NumName] <= _MAX_LFN) { + for (si = SZDIRE * 2, di = 0; di < dirb[XDIR_NumName]; si += 2, di++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + fno->fname[di] = w; /* Store it */ + } + } else { + di = 0; /* Buffer overflow and inaccessible object */ + } +#else + for (si = SZDIRE * 2, di = nc = 0; nc < dirb[XDIR_NumName]; si += 2, nc++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { di = 0; break; } /* Could not be converted and inaccessible object */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[di++] = (char)(w >> 8); + } + if (di >= _MAX_LFN) { di = 0; break; } /* Buffer overflow and inaccessible object */ + fno->fname[di++] = (char)w; + } +#endif + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object? */ + fno->fname[di] = 0; /* Terminate file name */ + + fno->altname[0] = 0; /* No SFN */ + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ +static +FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Pointer to the reading direcotry object pointing the 85 entry */ +) +{ + FRESULT res; + UINT i, nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load 85 entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0x85) return FR_INT_ERR; + mem_cpy(&dirb[0], dp->dir, SZDIRE); + nent = dirb[XDIR_NumSec] + 1; + + /* Load C0 entry */ + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC0) return FR_INT_ERR; + mem_cpy(dirb + SZDIRE, dp->dir, SZDIRE); + + /* Load C1 entries */ + if (nent < 3 || nent > 19) return FR_NO_FILE; + i = SZDIRE * 2; nent *= SZDIRE; + do { + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC1) return FR_INT_ERR; + mem_cpy(dirb + i, dp->dir, SZDIRE); + i += SZDIRE; + } while (i < nent); + + /* Sanity check */ + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + + return FR_OK; +} + + +#if !_FS_READONLY || _FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ +static +FRESULT load_obj_dir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const _FDID* obj /* Object with containing directory information */ +) +{ + FRESULT res; + + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto the block location */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !_FS_READONLY +/*-----------------------------------------------*/ +/* exFAT: Store the directory block to the media */ +/*-----------------------------------------------*/ +static +FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + WORD sum; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + sum = xdir_sum(dirb); + st_word(dirb + XDIR_SetSum, sum); + nent = dirb[XDIR_NumSec] + 1; + + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK && (res = move_window(dp->obj.fs, dp->sect)) == FR_OK) { + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ +static +void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the nul terminated file name */ +) +{ + UINT i; + BYTE nb, nc; + WCHAR chr; + WORD hash; + + + mem_set(dirb, 0, 2 * SZDIRE); /* Initialize 85+C0 entry */ + dirb[XDIR_Type] = 0x85; + dirb[XDIR_Type + SZDIRE] = 0xC0; + hash = xname_sum(lfn); + st_word(dirb + XDIR_NameHash, hash); /* Set name hash */ + + i = SZDIRE * 2; /* C1 offset */ + nc = 0; nb = 1; chr = 1; + do { + dirb[i++] = 0xC1; dirb[i++] = 0; /* Entry type C1 */ + do { /* Fill name field */ + if (chr && (chr = lfn[nc]) != 0) nc++; /* Get a character if exist */ + st_word(dirb + i, chr); i += 2; /* Store it */ + } while (i % SZDIRE); + nb++; + } while (lfn[nc]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nc; /* Set name length */ + dirb[XDIR_NumSec] = nb; /* Set number of C0+C1s */ +} +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 || _USE_LABEL || _FS_EXFAT +static +FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE a, c; +#if _USE_LFN != 0 + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; /* Test for the entry type */ + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of the directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + if (_USE_LABEL && vol) { + if (c == 0x83) break; /* Volume label entry? */ + } else { + if (c == 0x85) { /* Start of the entry block? */ + dp->blk_ofs = dp->dptr; /* Set location of block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* At the FAT12/16/32 */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if _USE_LFN != 0 /* LFN configuration */ + if (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= ~LLEF; ord = c; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(dp->lfn, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} +#endif /* _FS_MINIMIZE <= 1 || _USE_LABEL || _FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if _USE_LFN != 0 + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(dp->lfn); /* Hash value of the name to find */ + + while ((res = dir_read(dp, 0)) == FR_OK) { /* Read an item */ + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip the comparison if hash value mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(dp->lfn[ni])) break; + } + if (nc == 0 && !dp->lfn[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* At the FAT12/16/32 */ +#if _USE_LFN != 0 + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN != 0 /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dp->lfn) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= ~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(dp->lfn, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dp->fn; lfn = dp->lfn; + if (fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; lfn[nlen]; nlen++) ; /* Get lfn length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + DIR dj; + + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set block position */ + + if (dp->obj.stat & 4) { /* Has the sub-directory been stretched? */ + dp->obj.stat &= 3; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase object size by cluster size */ + res = fill_fat_chain(&dp->obj); /* Complement FAT chain if needed */ + if (res != FR_OK) return res; + res = load_obj_dir(&dj, &dp->obj); + if (res != FR_OK) return res; /* Load the object status */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + + create_xdir(fs->dirbuf, lfn); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* At the FAT12/16/32 */ + mem_cpy(sn, fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NSFLAG] = 0; dp->lfn = 0; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NSFLAG] = sn[NSFLAG]; dp->lfn = lfn; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(dp->lfn, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if _USE_LFN != 0 + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + DWORD last = dp->dptr; + + res = dp->blk_ofs == 0xFFFFFFFF ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + /* Mark an entry 'deleted' */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* At the exFAT */ + dp->dir[XDIR_Type] &= 0x7F; + } else { /* At the FAT12/16/32 */ + dp->dir[DIR_Name] = DDEM; + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; + fs->wflag = 1; + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 +static +void get_fileinfo ( /* No return code */ + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT i, j; + TCHAR c; +#if _USE_LFN != 0 + WCHAR w, *lfn; + WCHAR lfv; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (!dp->sect) return; /* Exit if read pointer has reached end of directory */ + +#if _USE_LFN != 0 /* LFN configuration */ +#if _FS_EXFAT + if (dp->obj.fs->fs_type == FS_EXFAT) { /* At the exFAT */ + get_xdir_info(dp->obj.fs->dirbuf, fno); + return; + } else +#endif + { /* At the FAT12/16/32 */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + i = 0; lfn = dp->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN character */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { i = 0; break; } /* No LFN if it could not be converted */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[i++] = (char)(w >> 8); + } +#endif + if (i >= _MAX_LFN) { i = 0; break; } /* No LFN if buffer overflow */ + fno->fname[i++] = (char)w; + } + fno->fname[i] = 0; /* Terminate the LFN */ + } + } + + i = j = 0; + lfv = fno->fname[i]; /* LFN is exist if non-zero */ + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) { /* Insert a . if extension is exist */ + if (!lfv) fno->fname[j] = '.'; + fno->altname[j++] = '.'; + } +#if _LFN_UNICODE + if (IsDBCS1(c) && i != 8 && i != 11 && IsDBCS2(dp->dir[i])) { + c = c << 8 | dp->dir[i++]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif + fno->altname[j] = c; + if (!lfv) { + if (IsUpper(c) && (dp->dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY))) { + c += 0x20; /* To lower */ + } + fno->fname[j] = c; + } + j++; + } + if (!lfv) { + fno->fname[j] = 0; + if (!dp->dir[DIR_NTres]) j = 0; /* Altname is no longer needed if neither LFN nor case info is exist. */ + } + fno->altname[j] = 0; /* Terminate the SFN */ + +#else /* Non-LFN configuration */ + i = j = 0; + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) fno->fname[j++] = '.'; /* Insert a . if extension is exist */ + fno->fname[j++] = c; + } + fno->fname[j] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->fdate = ld_word(dp->dir + DIR_WrtDate); /* Date */ + fno->ftime = ld_word(dp->dir + DIR_WrtTime); /* Time */ +} +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ +#if _USE_FIND && _FS_MINIMIZE <= 1 +static +WCHAR get_achar ( /* Get a character and advances ptr 1 or 2 */ + const TCHAR** ptr /* Pointer to pointer to the SBCS/DBCS/Unicode string */ +) +{ +#if !_LFN_UNICODE + WCHAR chr; + + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#ifdef _EXCVT + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#else + if (IsDBCS1(chr) && IsDBCS2(**ptr)) { /* Get DBC 2nd byte if needed */ + chr = chr << 8 | (BYTE)*(*ptr)++; + } +#endif + return chr; +#else + return ff_wtoupper(*(*ptr)++); /* Get a word and to upper */ +#endif +} + + +static +int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + WCHAR pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (!*pat && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard chars */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recursions upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} +#endif /* _USE_FIND && _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if _USE_LFN != 0 /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + UINT i, ni, si, di; + const TCHAR *p; + + /* Create LFN in Unicode */ + p = *path; lfn = dp->lfn; si = di = 0; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') { /* Break on end of segment */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator */ + break; + } + if (di >= _MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + w = (w << 8) + b; /* Create a DBC */ + if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ + } + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + lfn[di++] = w; /* Store the Unicode character */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created */ + if (di == 0) return FR_INVALID_NAME; /* Reject nul name */ + + /* Create SFN in directory form */ + mem_set(dp->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN character */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII character */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = ExCvt[w - 0x80]; /* Convert extended character to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Is this DBC? (always false at SBCS cfg) */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dp->fn[i++] = (BYTE)(w >> 8); + } else { /* SBC */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal characters for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dp->fn[i++] = (BYTE)w; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* Create LFN entry when there are composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; +#if _FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; + if (c <= ' ' || c == '/' || c == '\\') { /* Break on end of segment */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator */ + break; + } + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended character? */ + b |= 3; /* Eliminate NT flag */ +#ifdef _EXCVT + c = ExCvt[c - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else +#if !_DF1S + return FR_INVALID_NAME; /* Reject extended characters (ASCII cfg) */ +#endif +#endif + } + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false at SBCS cfg.) */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* When first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Name body has only small capital) */ + + sfn[NSFLAG] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + _FDID *obj = &dp->obj; + FATFS *fs = obj->fs; + + +#if _FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + obj->sclust = fs->cdir; /* Start from the current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + obj->sclust = 0; /* Start from the root directory */ + } +#if _FS_EXFAT && _FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && obj->sclust) { /* Retrieve the sub-directory status if needed */ + DIR dj; + + obj->c_scl = fs->cdc_scl; + obj->c_size = fs->cdc_size; + obj->c_ofs = fs->cdc_ofs; + res = load_obj_dir(&dj, obj); + if (res != FR_OK) return res; + obj->objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(obj->attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory information for next dir */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Open next directory */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + } else +#endif + { + obj->sclust = ld_clust(fs, &fs->win[dp->dptr % SS(fs)]); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static +int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + UINT i; + int vol = -1; +#if _STR_VOLUME_ID /* Find string drive id */ + static const char* const str[] = {_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif + + + if (*path) { /* If the pointer is not a null */ + for (tt = *path; (UINT)*tt >= (_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find ':' in the path */ + if (*tt == ':') { /* If a ':' is exist in the path name */ + tp = *path; + i = *tp++ - '0'; + if (i < 10 && tp == tt) { /* Is there a numeric drive id? */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = ++tt; + } + } +#if _STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ + i = 0; tt++; + do { + sp = str[i]; tp = *path; + do { /* Compare a string drive id with path name */ + c = *sp++; tc = *tp++; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < _VOLUMES); /* Repeat for each id until pattern match */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = tt; + } + } +#endif + return vol; + } +#if _FS_RPATH != 0 && _VOLUMES >= 2 + vol = CurrVol; /* Current drive */ +#else + vol = 0; /* Drive 0 */ +#endif + } + return vol; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT boot sector */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(&fs->win[BS_55AA]) != 0xAA55) return 3; /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */ + + if ((ld_dword(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) return 0; /* Check "FAT" string */ + if ((ld_dword(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) return 0; /* Check "FAT" string */ +#if _FS_EXFAT + if (!mem_cmp(&fs->win[BS_OEMName], "EXFAT ", 8)) return 1; +#endif + return 2; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Find logical drive and check if the volume is mounted */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found file system object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number from the path name */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the file system object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock the volume */ + *rfs = fs; /* Return pointer to the file system object */ + + mode &= ~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type) { /* If the volume has been mounted */ + stat = disk_status(fs->drv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The file system object is valid */ + } + } + + /* The file system object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if _MAX_SS != _MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) < _MIN_SS || SS(fs) > _MAX_SS) return FR_DISK_ERR; +#endif + /* Find an FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol))) { /* Not an FAT boot sector or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + MBR_Table + i * SZ_PTE; + br[i] = pt[4] ? ld_dword(&pt[8]) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (!LD2PT(vol) && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found. Following code initializes the file system object */ + +#if _FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && !fs->win[i]; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT revision (Must be 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Number of sectors on the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Must be 1) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + fs->n_fatent = nclst + 2; + if (fs->n_fatent >= 0x80000000) return FR_NO_FILESYSTEM; /* (Must be <= 0x7FFFFFFF) */ + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Check if bitmap location is in assumption (at the first cluster) */ + if (move_window(fs, clust2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR; + for (i = 0; i < SS(fs); i += SZDIRE) { + if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */ + } + if (i == SS(fs)) return FR_NO_FILESYSTEM; +#if !_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif +#if _USE_LFN == 1 + fs->dirbuf = DirBuf; /* Static directory block working buuffer */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = FS_FAT12; + if (nclst >= MIN_FAT16) fmt = FS_FAT16; + if (nclst >= MIN_FAT32) fmt = FS_FAT32; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM;/* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !_FS_READONLY + /* Initialize cluster allocation information */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; + + /* Get FSINFO if available */ + fs->fsi_flag = 0x80; +#if (_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSINFO data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif +#endif + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* File system mount ID */ +#if _FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if _FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + void* dfp, /* Pointer to the FIL/DIR object to check validity */ + FATFS** fs /* Pointer to pointer to the owner file system object to return */ +) +{ + _FDID *obj = (_FDID*)dfp; /* Assuming .obj in the FIL/DIR is the first member */ + FRESULT res; + + + if (!dfp || !obj->fs || !obj->fs->fs_type || obj->fs->id != obj->id || (disk_status(obj->fs->drv) & STA_NOINIT)) { + *fs = 0; /* The object is invalid */ + res = FR_INVALID_OBJECT; + } else { + *fs = obj->fs; /* Owner file sytem object */ + ENTER_FF(obj->fs); /* Lock file system */ + res = FR_OK; + } + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if _FS_LOCK != 0 + clear_lock(cfs); +#endif +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (!fs || opt != 1) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !_FS_READONLY + DWORD dw, cl; +#endif + DEF_NAMBUF; + + + if (!fp) return FR_INVALID_OBJECT; + fp->obj.fs = 0; /* Clear file object */ + + /* Get logical drive number */ + mode &= _FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ +#if !_FS_READONLY /* R/W configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if _FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ +#if _FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ + dw = GET_FATTIME(); +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_CrtTime, dw); /* Set created time */ + fs->dirbuf[XDIR_CrtTime10] = 0; + st_dword(fs->dirbuf + XDIR_ModTime, dw); /* Set modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + fs->dirbuf[XDIR_Attr] = AM_ARC; /* Reset attribute */ + st_dword(fs->dirbuf + XDIR_FstClus, 0); /* Reset file allocation info */ + st_qword(fs->dirbuf + XDIR_FileSize, 0); + st_qword(fs->dirbuf + XDIR_ValidFileSize, 0); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Clean directory info */ + st_dword(dj.dir + DIR_CrtTime, dw); /* Set created time */ + st_dword(dj.dir + DIR_WrtTime, dw); /* Set modified time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + cl = ld_clust(fs, dj.dir); /* Get cluster chain */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + + if (cl) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Following succeeded */ + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* R/O violation */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= _FA_MODIFIED; + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if _FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + if (!fp->obj.lockid) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get allocation info */ + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + fp->obj.c_scl = dj.obj.sclust; + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if _USE_FASTSEEK + fp->cltbl = 0; /* Normal seek mode */ +#endif + fp->err = 0; /* Clear error flag */ + fp->fptr = 0; /* Set file pointer */ + fp->sect = 0; /* Invalidate current data sector */ + fp->flag = mode; /* File access mode */ + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + } + + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(fp, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data read */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->drv, rbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if _FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & _FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) { /* Fill sector cache */ + ABORT(fs, FR_DISK_ERR); + } + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - ((UINT)fp->fptr % SS(fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + mem_cpy(rbuff, &fs->win[fp->fptr % SS(fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(fp, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot exceed the limit on each FAT specs) */ + if ((_FS_EXFAT && fs->fs_type == FS_EXFAT && fp->fptr + btw < fp->fptr) + || (DWORD)fp->fptr + btw < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if _FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) { /* Write-back sector cache */ + ABORT(fs, FR_DISK_ERR); + } +#else + if (fp->flag & _FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->drv, wbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#if _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= ~_FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling at growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ + if (fp->fptr < fp->obj.objsize && + disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - ((UINT)fp->fptr % SS(fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + mem_cpy(&fs->win[fp->fptr % SS(fs)], wbuff, wcnt); /* Fit partial sector */ + fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= _FA_DIRTY; +#endif + } + + fp->flag |= _FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + DEF_DIRBUF; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & _FA_MODIFIED) { /* Is there any change to the file? */ +#if !_FS_TINY + if (fp->flag & _FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + LEAVE_FF(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_fat_chain(&fp->obj); /* Create FAT chain if needed */ + if (res == FR_OK) { + DIR dj; + + INIT_DIRBUF(fs); + res = load_obj_dir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive bit */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation info */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= ~_FA_MODIFIED; + } + } + FREE_DIRBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation info */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_WrtTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= ~_FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(fp, &fs); /* Lock volume */ + if (res == FR_OK) { +#if _FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) +#endif + { + fp->obj.fs = 0; /* Invalidate file object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH >= 1 +#if _VOLUMES >= 2 +FRESULT f_chdrive ( + const TCHAR* path /* Drive number */ +) +{ + int vol; + + + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + + CurrVol = (BYTE)vol; + + return FR_OK; +} +#endif + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { + fs->cdir = dj.obj.sclust; /* It is the start directory itself */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(fs, res); +} + + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMBUF; + + + *buff = 0; + /* Get logical drive number */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(dj); + i = len; /* Bottom of buffer (directory stack base) */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = dir_read(&dj, 0); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; + buff[--i] = '/'; + } + } + tp = buff; + if (res == FR_OK) { +#if _VOLUMES >= 2 + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; +#endif + if (i == len) { /* Root-directory */ + *tp++ = '/'; + } else { /* Sub-directroy */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if _USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ +#if _USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->sclust; /* Top of the chain */ + if (cl) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(fs, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->fsize) { /* Clip offset at the file size */ + ofs = fp->fsize; + } + fp->fptr = ofs; /* Set file pointer */ + if (ofs) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clust2sect(fs, fp->clust); + if (!dsc) ABORT(fs, FR_INT_ERR); + dsc += (ofs - 1) / SS(fs) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fp, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, dsc, 1) != RES_OK) { /* Load current sector */ + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { + if (ofs > fp->obj.objsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->obj.objsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(&fp->obj, clst); /* Force stretch if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clust2sect(fs, clst); /* Current sector */ + if (!nsect) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & _FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= ~_FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, nsect, 1) != RES_OK) { /* Fill sector cache */ + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= _FA_MODIFIED; + } +#endif + } + + LEAVE_FF(fs, res); +} + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + _FDID *obj; + DEF_NAMBUF; + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive number */ + obj = &dp->obj; + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + obj->fs = fs; + INIT_NAMBUF(*dp); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (obj->attr & AM_DIR) { /* This object is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory inforamation */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get object location and status */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + obj->sclust = ld_clust(fs, dp->dir); /* Get object location */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + obj->id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if _FS_LOCK != 0 + if (res == FR_OK) { + if (obj->sclust) { + obj->lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!obj->lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + obj->lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) obj->fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(dp, &fs); + if (res == FR_OK) { +#if _FS_LOCK != 0 + if (dp->obj.lockid) { /* Decrement sub-directory open counter */ + res = dec_lock(dp->obj.lockid); + } + if (res == FR_OK) +#endif + { + dp->obj.fs = 0; /* Invalidate directory object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF; + + + res = validate(dp, &fs); /* Check validity of the object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(*dp); + res = dir_read(dp, 0); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if _USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if _USE_LFN != 0 && _USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* _USE_FIND */ + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Path name of the logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding file system object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + BYTE *p; + _FDID obj; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full cluster scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Get number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Sector unalighed FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan bitmap table */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; + sect = fs->database; + i = 0; + do { + if (i == 0 && (res = move_window(fs, sect++)) != FR_OK) break; + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) & (SS(fs) - 1); + } while (clst); + } else +#endif + { /* FAT16/32: Sector alighed FAT entries */ + clst = fs->n_fatent; sect = fs->fatbase; + i = 0; p = 0; + do { + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + p = fs->win; + i = SS(fs); + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(p) == 0) nfree++; + p += 2; i -= 2; + } else { + if ((ld_dword(p) & 0x0FFFFFFF) == 0) nfree++; + p += 4; i -= 4; + } + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->obj.objsize > fp->fptr) { + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= _FA_MODIFIED; +#if !_FS_TINY + if (res == FR_OK && (fp->flag & _FA_DIRTY)) { + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= ~_FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if _FS_EXFAT + _FDID obj; +#endif + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if _FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + obj.sclust = dclst = ld_dword(fs->dirbuf + XDIR_FstClus); + obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory ? */ +#if _FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst) { /* Remove the cluster chain if exist */ +#if _FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE *dir; + UINT n; + DWORD dsc, dcl, pcl, tm; + DEF_NAMBUF; + + + /* Get logical drive number */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(&dj.obj, 0); /* Allocate a cluster for the new directory table */ + dj.obj.objsize = (DWORD)fs->csize * SS(fs); + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) res = sync_window(fs); /* Flush FAT */ + tm = GET_FATTIME(); + if (res == FR_OK) { /* Initialize the new directory table */ + dsc = clust2sect(fs, dcl); + dir = fs->win; + mem_set(dir, 0, SS(fs)); + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + st_dword(dir + DIR_WrtTime, tm); + st_clust(fs, dir, dcl); + mem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create ".." entry */ + dir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + if (fs->fs_type == FS_FAT32 && pcl == fs->dirbase) + pcl = 0; + st_clust(fs, dir + SZDIRE, pcl); + } + for (n = fs->csize; n; n--) { /* Write dot entries and clear following sectors */ + fs->winsect = dsc++; + fs->wflag = 1; + res = sync_window(fs); + if (res != FR_OK) break; + mem_set(dir, 0, SS(fs)); + } + } + if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, tm); + st_dword(fs->dirbuf + XDIR_FstClus, dcl); + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)dj.obj.objsize); + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize); + fs->dirbuf[XDIR_GenFlags] = 3; + fs->dirbuf[XDIR_Attr] = AM_DIR; + res = store_xdir(&dj); + } else +#endif + { + dir = dj.dir; + st_dword(dir + DIR_WrtTime, tm); /* Created time */ + st_clust(fs, dir, dcl); /* Table start cluster */ + dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + res = sync_fs(fs); + } else { + remove_chain(&dj.obj, dcl, 0); /* Could not register, remove cluster chain */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[_FS_EXFAT ? SZDIRE * 2 : 24], *dir; + DWORD dw; + DEF_NAMBUF; + + + get_ldnumber(&path_new); /* Ignore drive number of new name */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive number of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(djo); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&djo, 2); +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) res = FR_EXIST; /* Is new name already in use? */ + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); +/* Start of critical section where any interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT12/FAT16/FAT32 */ + mem_cpy(buf, djo.dir + DIR_Attr, 21); /* Save information about the object except name */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) res = FR_EXIST; /* Is new name already in use? */ + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy information about object except name */ + mem_cpy(dir + 13, buf + 2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clust2sect(fs, ld_clust(fs, dir)); + if (!dw) { + res = FR_INT_ERR; + } else { +/* Start of critical section where any interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +#if _USE_CHMOD && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive number */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the time stamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF; + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive number */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_word(fs->dirbuf + XDIR_ModTime, fno->ftime); + st_word(fs->dirbuf + XDIR_ModTime + 2, fno->fdate); + res = store_xdir(&dj); + } else +#endif + { + st_word(dj.dir + DIR_WrtTime, fno->ftime); + st_word(dj.dir + DIR_WrtDate, fno->fdate); + fs->wflag = 1; + } + if (res == FR_OK) res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_CHMOD && !_FS_READONLY */ + + + +#if _USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Path name of the logical drive number */ + TCHAR* label, /* Pointer to a buffer to return the volume label */ + DWORD* vsn /* Pointer to a variable to return the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; +#if _LFN_UNICODE || _FS_EXFAT + WCHAR w; +#endif + + /* Get logical drive number */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Find a volume label entry */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + for (si = di = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + w = ld_word(dj.dir + XDIR_Label + si * 2); +#if _LFN_UNICODE + label[di++] = w; +#else + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) w = '?'; /* Replace wrong character */ + if (_DF1S && w >= 0x100) label[di++] = (char)(w >> 8); + label[di++] = (char)w; +#endif + } + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry with code comversion */ + do { +#if _LFN_UNICODE + w = (si < 11) ? dj.dir[si++] : ' '; + if (IsDBCS1(w) && si < 11 && IsDBCS2(dj.dir[si])) { + w = w << 8 | dj.dir[si++]; + } + label[di++] = ff_convert(w, 1); /* OEM -> Unicode */ +#else + label[di++] = dj.dir[si++]; +#endif + } while (di < 11); + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: di = BPB_VolIDEx; break; + case FS_FAT32: di = BS_VolID32; break; + default: di = BS_VolID; + } + *vsn = ld_dword(&fs->win[di]); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Pointer to the volume label to set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT i, j, slen; + WCHAR w; + static const char badchr[] = "\"*+,.:;<=>\?[]|\x7F"; + + + /* Get logical drive number */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + dj.obj.fs = fs; + + /* Get length of given volume label */ + for (slen = 0; (UINT)label[slen] >= ' '; slen++) ; /* Get name length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At the exFAT */ + for (i = j = 0; i < slen; ) { /* Create volume label in directory form */ + w = label[i++]; +#if !_LFN_UNICODE + if (IsDBCS1(w)) { + w = (i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } + w = ff_convert(w, 1); +#endif + if (w == 0 || chk_chr(badchr, w) || j == 22) { /* Check validity check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + j, w); j += 2; + } + slen = j; + } else +#endif + { /* At the FAT12/16/32 */ + for ( ; slen && label[slen - 1] == ' '; slen--) ; /* Remove trailing spaces */ + if (slen) { /* Is there a volume label to be set? */ + dirvn[0] = 0; i = j = 0; /* Create volume label in directory form */ + do { +#if _LFN_UNICODE + w = ff_convert(ff_wtoupper(label[i++]), 0); +#else + w = (BYTE)label[i++]; + if (IsDBCS1(w)) { + w = (j < 10 && i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } +#if _USE_LFN != 0 + w = ff_convert(ff_wtoupper(ff_convert(w, 1)), 0); +#else + if (IsLower(w)) w -= 0x20; /* To upper ASCII characters */ +#ifdef _EXCVT + if (w >= 0x80) w = ExCvt[w - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else + if (!_DF1S && w >= 0x80) w = 0; /* Reject extended characters (ASCII cfg) */ +#endif +#endif +#endif + if (w == 0 || chk_chr(badchr, w) || j >= (UINT)((w >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (w >= 0x100) dirvn[j++] = (BYTE)(w >> 8); + dirvn[j++] = (BYTE)w; + } while (i < slen); + while (j < 11) dirvn[j++] = ' '; /* Fill remaining name field */ + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + } + } + + /* Set volume label */ + dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Get volume label entry */ + if (res == FR_OK) { + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = slen / 2; /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + if (slen) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry is found or error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (slen) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clear the entry */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = 0x83; /* Create 83 entry */ + dj.dir[XDIR_NumLabel] = slen / 2; + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_LABEL */ + + + +#if _USE_EXPAND && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD val, clst, csz, stcl, scl, ncl, tcl; + + + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if _FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + csz = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / csz) + ((fsz & (csz - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 1) res = FR_INT_ERR; + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { + if (opt) { + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + fs->last_clst = scl + tcl - 1; + } else { + fs->last_clst = scl - 1; /* Set suggested cluster to start next */ + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + val = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (val == 1) { res = FR_INT_ERR; break; } + if (val == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (val == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block was found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* All cluster scanned? */ + } + if (res == FR_OK) { + if (opt) { + for (clst = scl; tcl; clst++, tcl--) { /* Create a cluster chain on the FAT */ + val = (tcl == 1) ? 0xFFFFFFFF : clst + 1; + res = put_fat(fs, clst, val); + if (res != FR_OK) break; + fs->last_clst = clst; + } + } else { + fs->last_clst = scl - 1; /* Set suggested cluster to start next */ + } + } + } + + if (opt && res == FR_OK) { + fp->obj.sclust = scl; /* Update allocation information */ + fp->obj.objsize = fsz; + if (_FS_EXFAT) fp->obj.stat = 2; + fp->flag |= _FA_MODIFIED; + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_EXPAND && !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (available on only tiny cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(fp, &fs); /* Check validity of the object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->fsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if ((fp->fptr % SS(fs)) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->sclust : get_fat(fs, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clust2sect(fs, fp->clust); /* Get current data sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + if (move_window(fs, sect) != FR_OK) { /* Move sector window */ + ABORT(fs, FR_DISK_ERR); + } + fp->sect = sect; + rcnt = SS(fs) - (WORD)(fp->fptr % SS(fs)); /* Forward data from sector window */ + if (rcnt > btf) rcnt = btf; + rcnt = (*func)(&fs->win[(WORD)fp->fptr % SS(fs)], rcnt); + if (!rcnt) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create file system on the logical drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Number of root directory entries for FAT12/16 */ +#define N_FATS 1 /* Number of FATs (1 or 2) */ + + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE sfd, /* Partitioning rule 0:FDISK, 1:SFD */ + UINT au /* Size of allocation unit in unit of byte or sector */ +) +{ + static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0}; + static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512}; + int vol; + BYTE fmt, md, sys, *tbl, pdrv, part; + DWORD n_clst, vs, n, wsect; + UINT i; + DWORD b_vol, b_fat, b_dir, b_data; /* LBA */ + DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ + FATFS *fs; + DSTATUS stat; +#if _USE_TRIM + DWORD eb[2]; +#endif + + + /* Check mounted drive and clear work area */ + if (sfd > 1) return FR_INVALID_PARAMETER; + vol = get_ldnumber(&path); /* Get target volume */ + if (vol < 0) return FR_INVALID_DRIVE; + fs = FatFs[vol]; /* Check if the volume has work area */ + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:auto detect, 1-4:get from partition table)*/ + + /* Get disk statics */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != _MIN_SS /* Get disk sector size */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS || SS(fs) < _MIN_SS) { + return FR_DISK_ERR; + } +#endif + if (_MULTI_PARTITION && part) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; + if (ld_word(fs->win + BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + if (!tbl[4]) return FR_MKFS_ABORTED; /* No partition? */ + b_vol = ld_dword(tbl + 8); /* Volume start sector */ + n_vol = ld_dword(tbl + 12); /* Volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) { + return FR_DISK_ERR; + } + b_vol = (sfd) ? 0 : 63; /* Volume start sector */ + n_vol -= b_vol; /* Volume size */ + } + + if (au & (au - 1)) au = 0; + if (!au) { /* AU auto selection */ + vs = n_vol / (2000 / (SS(fs) / 512)); + for (i = 0; vs < vst[i]; i++) ; + au = cst[i]; + } + if (au >= _MIN_SS) au /= SS(fs); /* Number of sectors per cluster */ + if (!au) au = 1; + if (au > 128) au = 128; + + /* Pre-compute number of clusters and FAT sub-type */ + n_clst = n_vol / au; + fmt = FS_FAT12; + if (n_clst >= MIN_FAT16) fmt = FS_FAT16; + if (n_clst >= MIN_FAT32) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + if (fmt == FS_FAT32) { + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 32; + n_dir = 0; + } else { + n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; + n_fat = (n_fat + SS(fs) - 1) / SS(fs); + n_rsv = 1; + n_dir = (DWORD)N_ROOTDIR * SZDIRE / SS(fs); + } + b_fat = b_vol + n_rsv; /* FAT area start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ + b_data = b_dir + n_dir; /* Data area start sector */ + if (n_vol < b_data + au - b_vol) return FR_MKFS_ABORTED; /* Too small volume */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &n) != RES_OK || !n || n > 32768) n = 1; + n = (b_data + n - 1) & ~(n - 1); /* Next nearest erase block from current data start */ + n = (n - b_data) / N_FATS; + if (fmt == FS_FAT32) { /* FAT32: Move FAT offset */ + n_rsv += n; + b_fat += n; + } else { /* FAT12/16: Expand FAT size */ + n_fat += n; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; + if ( (fmt == FS_FAT16 && n_clst < MIN_FAT16) + || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) { + return FR_MKFS_ABORTED; + } + + /* Determine system ID in the partition table */ + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (fmt == FS_FAT12 && n_vol < 0x10000) { + sys = 0x01; /* FAT12(<65536) */ + } else { + sys = (n_vol < 0x10000) ? 0x04 : 0x06; /* FAT16(<65536) : FAT12/16(>=65536) */ + } + } + + if (_MULTI_PARTITION && part) { + /* Update system ID in the partition table */ + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + tbl[4] = sys; + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) { /* Write it to teh MBR */ + return FR_DISK_ERR; + } + md = 0xF8; + } else { + if (sfd) { /* No partition table (SFD) */ + md = 0xF0; + } else { /* Create partition table (FDISK) */ + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win + MBR_Table; /* Create partition table for single partition in the drive */ + tbl[1] = 1; /* Partition start head */ + tbl[2] = 1; /* Partition start sector */ + tbl[3] = 0; /* Partition start cylinder */ + tbl[4] = sys; /* System type */ + tbl[5] = 254; /* Partition end head */ + n = (b_vol + n_vol) / 63 / 255; + tbl[6] = (BYTE)(n >> 2 | 63); /* Partition end sector */ + tbl[7] = (BYTE)n; /* End cylinder */ + st_dword(tbl + 8, 63); /* Partition start in LBA */ + st_dword(tbl + 12, n_vol); /* Partition size in LBA */ + st_word(fs->win + BS_55AA, 0xAA55); /* MBR signature */ + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) { /* Write it to the MBR */ + return FR_DISK_ERR; + } + md = 0xF8; + } + } + + /* Create BPB in the VBR */ + tbl = fs->win; /* Clear sector */ + mem_set(tbl, 0, SS(fs)); + mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code, OEM name */ + i = SS(fs); /* Sector size */ + st_word(tbl + BPB_BytsPerSec, (WORD)i); + tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ + st_word(tbl + BPB_RsvdSecCnt, (WORD)n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of root directory entries */ + st_word(tbl + BPB_RootEntCnt, (WORD)i); + if (n_vol < 0x10000) { /* Number of total sectors */ + st_word(tbl + BPB_TotSec16, (WORD)n_vol); + } else { + st_dword(tbl + BPB_TotSec32, (WORD)n_vol); + } + tbl[BPB_Media] = md; /* Media descriptor */ + st_word(tbl + BPB_SecPerTrk, 63); /* Number of sectors per track */ + st_word(tbl + BPB_NumHeads, 255); /* Number of heads */ + st_dword(tbl + BPB_HiddSec, b_vol); /* Volume offset */ + n = GET_FATTIME(); /* Use current time as VSN */ + if (fmt == FS_FAT32) { + st_dword(tbl + BS_VolID32, n); /* VSN */ + st_dword(tbl + BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + st_dword(tbl + BPB_RootClus32, 2); /* Root directory start cluster (2) */ + st_word(tbl + BPB_FSInfo32, 1); /* FSINFO record offset (VBR + 1) */ + st_word(tbl + BPB_BkBootSec32, 6); /* Backup boot record offset (VBR + 6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(tbl + BS_VolID, n); /* VSN */ + st_word(tbl + BPB_FATSz16, (WORD)n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(tbl + BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, tbl, b_vol, 1) != RES_OK) { /* Write it to the VBR sector */ + return FR_DISK_ERR; + } + if (fmt == FS_FAT32) { /* Write it to the backup VBR if needed (VBR + 6) */ + disk_write(pdrv, tbl, b_vol + 6, 1); + } + + /* Initialize FAT area */ + wsect = b_fat; + for (i = 0; i < N_FATS; i++) { /* Initialize each FAT copy */ + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + n = md; /* Media descriptor byte */ + if (fmt != FS_FAT32) { + n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + st_dword(tbl + 0, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + n |= 0xFFFFFF00; + st_dword(tbl + 0, n); /* Reserve cluster #0-1 (FAT32) */ + st_dword(tbl + 4, 0xFFFFFFFF); + st_dword(tbl + 8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ + } + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ + for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector writes */ + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + } + } + + /* Initialize root directory */ + i = (fmt == FS_FAT32) ? au : (UINT)n_dir; + do { + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) { + return FR_DISK_ERR; + } + } while (--i); + +#if _USE_TRIM /* Erase data area if needed */ + { + eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; + disk_ioctl(pdrv, CTRL_TRIM, eb); + } +#endif + + /* Create FSINFO if needed */ + if (fmt == FS_FAT32) { + st_dword(tbl + FSI_LeadSig, 0x41615252); + st_dword(tbl + FSI_StrucSig, 0x61417272); + st_dword(tbl + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(tbl + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(tbl + BS_55AA, 0xAA55); + disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR + 1) */ + disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR + 7) */ + } + + return (disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + + + +#if _MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create partition table on the physical drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD szt[], /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + /* Determine CHS in the table regardless of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = n - 1; + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, _MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; + if (!p_cyl) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; + if (e_cyl >= tot_cyl) return FR_INVALID_PARAMETER; + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)((b_cyl >> 2) + 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x06; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Partition size */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); + + /* Write it to the MBR */ + return (disk_write(pdrv, buf, 0, 1) != RES_OK || disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) ? FR_DISK_ERR : FR_OK; +} + + +#endif /* _MULTI_PARTITION */ +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + FIL* fp /* Pointer to the file object */ +) +{ + int n = 0; + TCHAR c, *p = buff; + BYTE s[2]; + UINT rc; + + + while (n < len - 1) { /* Read characters until buffer gets filled */ +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (c >= 0x80) { + if (c < 0xC0) continue; /* Skip stray trailer */ + if (c < 0xE0) { /* Two-byte sequence */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c & 0x1F) << 6 | (s[0] & 0x3F); + if (c < 0x80) c = '?'; + } else { + if (c < 0xF0) { /* Three-byte sequence */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = c << 12 | (s[0] & 0x3F) << 6 | (s[1] & 0x3F); + if (c < 0x800) c = '?'; + } else { /* Reject four-byte sequence */ + c = '?'; + } + } + } +#elif _STRF_ENCODE == 2 /* Read a character in UTF-16BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[1] + (s[0] << 8); +#elif _STRF_ENCODE == 1 /* Read a character in UTF-16LE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[0] + (s[1] << 8); +#else /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (IsDBCS1(c)) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c << 8) + s[0]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif +#else /* Read a character without conversion */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; +#endif + if (_USE_STRFUNC == 2 && c == '\r') continue; /* Strip '\r' */ + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ + +typedef struct { + FIL* fp; + int idx, nchr; + BYTE buf[64]; +} putbuff; + + +static +void putc_bfd ( + putbuff* pb, + TCHAR c +) +{ + UINT bw; + int i; + + + if (_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Buffer write index (-1:error) */ + if (i < 0) return; + +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Write a character in UTF-8 */ + if (c < 0x80) { /* 7-bit */ + pb->buf[i++] = (BYTE)c; + } else { + if (c < 0x800) { /* 11-bit */ + pb->buf[i++] = (BYTE)(0xC0 | c >> 6); + } else { /* 16-bit */ + pb->buf[i++] = (BYTE)(0xE0 | c >> 12); + pb->buf[i++] = (BYTE)(0x80 | (c >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (c & 0x3F)); + } +#elif _STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#elif _STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + pb->buf[i++] = (BYTE)c; + pb->buf[i++] = (BYTE)(c >> 8); +#else /* Write a character in ANSI/OEM */ + c = ff_convert(c, 0); /* Unicode -> OEM */ + if (!c) c = '?'; + if (c >= 0x100) + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#endif +#else /* Write a character without conversion */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 3) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &bw); + i = (bw == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr++; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + UINT nw; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + putc_bfd(&pb, c); /* Put a character */ + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + UINT nw; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + while (*str) /* Put the string */ + putc_bfd(&pb, *str++); + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + BYTE f, r; + UINT nw, i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + putbuff pb; + + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + while (IsDigit(c)) { /* Precision */ + w = w * 10 + c - '0'; + c = *fmt++; + } + if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (!c) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, ' '); + } + while (*p) putc_bfd(&pb, *p++); + while (j++ < w) putc_bfd(&pb, ' '); + continue; + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + case 'B' : /* Binary */ + r = 2; break; + case 'O' : /* Octal */ + r = 8; break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + case 'X' : /* Hexdecimal */ + r = 16; break; + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof str[0]); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + while (!(f & 2) && j++ < w) putc_bfd(&pb, d); + do putc_bfd(&pb, str[--i]); while (i); + while (j++ < w) putc_bfd(&pb, d); + } + + va_end(arp); + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb.fp, pb.buf, (UINT)pb.idx, &nw) == FR_OK + && (UINT)pb.idx == nw) return pb.nchr; + return EOF; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/Firmware/WIMU3/Libraries/FatFs/src/ff.h b/Firmware/WIMU3/Libraries/FatFs/src/ff.h new file mode 100644 index 0000000..6a94693 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/ff.h @@ -0,0 +1,366 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include R0.12 (C)ChaN, 2016 +/----------------------------------------------------------------------------/ +/ FatFs module is a free software that opened under license policy of +/ following conditions. +/ +/ Copyright (C) 2016, ChaN, all right reserved. +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/---------------------------------------------------------------------------*/ + + +#ifndef _FATFS +#define _FATFS 88100 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ +#if _FATFS != _FFCONF +#error Wrong configuration file (ffconf.h). +#endif + + + +/* Definitions of volume management */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */ +#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */ + +#else /* Single partition configuration */ +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Find first valid partition or in SFD */ + +#endif + + + +/* Type of path name strings on FatFs API */ + +#if _LFN_UNICODE /* Unicode string */ +#if _USE_LFN == 0 +#error _LFN_UNICODE must be 0 at non-LFN cfg. +#endif +#ifndef _INC_TCHAR +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#endif + +#else /* ANSI/OEM string */ +#ifndef _INC_TCHAR +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* File system object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* File system type (0:N/A) */ + BYTE drv; /* Physical drive number */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if _MAX_SS != _MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if _FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer */ +#endif +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if _FS_RPATH != 0 + DWORD cdir; /* Current directory start cluster (0:root) */ +#if _FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + DWORD volbase; /* Volume base sector */ + DWORD fatbase; /* FAT base sector */ + DWORD dirbase; /* Root directory base sector/cluster */ + DWORD database; /* Data base sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Type of file size variables and object identifier */ + +#if _FS_EXFAT +#if _USE_LFN == 0 +#error LFN must be enabled when enable exFAT +#endif +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* Object ID and allocation information (_FDID) */ + +typedef struct { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous (no data on FAT), =3:got flagmented, b2:sub-directory stretched) */ + DWORD sclust; /* Object start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if _FS_EXFAT + DWORD n_cont; /* Size of coutiguous part, clusters - 1 (valid when stat == 3) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when sclust != 0) */ +#endif +#if _FS_LOCK != 0 + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} _FDID; + + + +/* File object structure (FIL) */ + +typedef struct { + _FDID obj; /* Object identifier */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (not valid when fprt is 0) */ + DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector number containing the directory entry */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] */ +#endif +#if _USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (Nulled on file open) */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + _FDID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {body[8],ext[3],status[1]} */ +#if _USE_LFN != 0 + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ + WCHAR* lfn; /* Pointer to the LFN working buffer */ +#endif +#if _USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if _USE_LFN != 0 + TCHAR altname[13]; /* Altenative file name */ + TCHAR fname[_MAX_LFN + 1]; /* Primary file name */ +#else + TCHAR fname[13]; /* File name */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from a file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to a file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of a file object */ +FRESULT f_truncate (FIL* fp); /* Truncate file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of a writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of the file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of the file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au); /* Create a file system on the volume */ +FRESULT f_fdisk (BYTE pdrv, const DWORD szt[], void* work); /* Divide a physical drive into some partitions */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !_FS_READONLY && !_FS_NORTC +DWORD get_fattime (void); +#endif + +/* Unicode support functions */ +#if _USE_LFN != 0 /* Unicode - OEM code conversion */ +WCHAR ff_convert (WCHAR chr, UINT dir); /* OEM-Unicode bidirectional conversion */ +WCHAR ff_wtoupper (WCHAR chr); /* Unicode upper-case conversion */ +#if _USE_LFN == 3 /* Memory functions */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif +#endif + +/* Sync functions */ +#if _FS_REENTRANT +int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define _FA_MODIFIED 0x20 +#define _FA_DIRTY 0x40 + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Fast seek controls */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + + +#ifdef __cplusplus +} +#endif + +#endif /* _FATFS */ diff --git a/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h b/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h new file mode 100644 index 0000000..39e6bab --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h @@ -0,0 +1,266 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.12 (C)ChaN, 2016 +/---------------------------------------------------------------------------*/ + +#define _FFCONF 88100 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define _FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: All basic functions are enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define _USE_STRFUNC 0 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define _USE_FIND 2 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define _USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define _USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define _USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ + + +#define _USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define _USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be 1. */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define _CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ + + +#define _USE_LFN 0 +#define _MAX_LFN 255 +/* The _USE_LFN switches the support of long file name (LFN). +/ +/ 0: Disable support of LFN. _MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, Unicode handling functions (option/unicode.c) must be added +/ to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and +/ additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. +/ It should be set 255 to support full featured LFN operations. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree(), must be added to the project. */ + + +#define _LFN_UNICODE 0 +/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) +/ To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. +/ This option also affects behavior of string I/O functions. */ + + +#define _STRF_ENCODE 3 +/* When _LFN_UNICODE == 1, this option selects the character encoding on the file to +/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). +/ +/ 0: ANSI/OEM +/ 1: UTF-16LE +/ 2: UTF-16BE +/ 3: UTF-8 +/ +/ This option has no effect when _LFN_UNICODE == 0. */ + + +#define _FS_RPATH 2 +/* This option configures support of relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _STR_VOLUME_ID 0 +#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" +/* _STR_VOLUME_ID switches string support of volume ID. +/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. _VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define _MULTI_PARTITION 0 +/* This option switches support of multi-partition on a physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When multi-partition is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define _MIN_SS 512 +#define _MAX_SS 512 +/* These options configure the range of sector size to be supported. (512, 1024, +/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured +/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the +/ disk_ioctl() function. */ + + +#define _USE_TRIM 0 +/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define _FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the file system object (FATFS) is used for the file data transfer. */ + + +#define _FS_EXFAT 0 +/* This option switches support of exFAT file system in addition to the traditional +/ FAT file system. (0:Disable or 1:Enable) To enable exFAT, also LFN must be enabled. +/ Note that enabling exFAT discards C89 compatibility. */ + + +#define _FS_NORTC 0 +#define _NORTC_MON 3 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2016 +/* The option _FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable +/ the timestamp function. All objects modified by FatFs will have a fixed timestamp +/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. +/ To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to get current time form real-time clock. _NORTC_MON, +/ _NORTC_MDAY and _NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (_FS_READONLY = 1). */ + + +#define _FS_LOCK 0 +/* The option _FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when _FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +#define _FS_REENTRANT 0 +#define _FS_TIMEOUT 1000 +#define _SYNC_t HANDLE +/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The _FS_TIMEOUT defines timeout period in unit of time tick. +/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ + + +/*--- End of configuration options ---*/ diff --git a/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h.bak b/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h.bak new file mode 100644 index 0000000..6eddb47 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/ffconf.h.bak @@ -0,0 +1,266 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.12 (C)ChaN, 2016 +/---------------------------------------------------------------------------*/ + +#define _FFCONF 88100 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define _FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: All basic functions are enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define _USE_STRFUNC 0 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define _USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define _USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define _USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define _USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ + + +#define _USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define _USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be 1. */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define _CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ + + +#define _USE_LFN 0 +#define _MAX_LFN 255 +/* The _USE_LFN switches the support of long file name (LFN). +/ +/ 0: Disable support of LFN. _MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, Unicode handling functions (option/unicode.c) must be added +/ to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and +/ additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. +/ It should be set 255 to support full featured LFN operations. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree(), must be added to the project. */ + + +#define _LFN_UNICODE 0 +/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) +/ To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. +/ This option also affects behavior of string I/O functions. */ + + +#define _STRF_ENCODE 3 +/* When _LFN_UNICODE == 1, this option selects the character encoding on the file to +/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). +/ +/ 0: ANSI/OEM +/ 1: UTF-16LE +/ 2: UTF-16BE +/ 3: UTF-8 +/ +/ This option has no effect when _LFN_UNICODE == 0. */ + + +#define _FS_RPATH 2 +/* This option configures support of relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _STR_VOLUME_ID 0 +#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" +/* _STR_VOLUME_ID switches string support of volume ID. +/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. _VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define _MULTI_PARTITION 0 +/* This option switches support of multi-partition on a physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When multi-partition is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define _MIN_SS 512 +#define _MAX_SS 512 +/* These options configure the range of sector size to be supported. (512, 1024, +/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured +/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the +/ disk_ioctl() function. */ + + +#define _USE_TRIM 0 +/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define _FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the file system object (FATFS) is used for the file data transfer. */ + + +#define _FS_EXFAT 0 +/* This option switches support of exFAT file system in addition to the traditional +/ FAT file system. (0:Disable or 1:Enable) To enable exFAT, also LFN must be enabled. +/ Note that enabling exFAT discards C89 compatibility. */ + + +#define _FS_NORTC 0 +#define _NORTC_MON 3 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2016 +/* The option _FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable +/ the timestamp function. All objects modified by FatFs will have a fixed timestamp +/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. +/ To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to get current time form real-time clock. _NORTC_MON, +/ _NORTC_MDAY and _NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (_FS_READONLY = 1). */ + + +#define _FS_LOCK 0 +/* The option _FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when _FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +#define _FS_REENTRANT 0 +#define _FS_TIMEOUT 1000 +#define _SYNC_t HANDLE +/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The _FS_TIMEOUT defines timeout period in unit of time tick. +/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ + + +/*--- End of configuration options ---*/ diff --git a/Firmware/WIMU3/Libraries/FatFs/src/integer.h b/Firmware/WIMU3/Libraries/FatFs/src/integer.h new file mode 100644 index 0000000..5dd8ec3 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/integer.h @@ -0,0 +1,38 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _FF_INTEGER +#define _FF_INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include +#include +typedef unsigned __int64 QWORD; + + +#else /* Embedded platform */ + +/* These types MUST be 16-bit or 32-bit */ +typedef int INT; +typedef unsigned int UINT; + +/* This type MUST be 8-bit */ +typedef unsigned char BYTE; + +/* These types MUST be 16-bit */ +typedef short SHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types MUST be 32-bit */ +typedef long LONG; +typedef unsigned long DWORD; + +/* This type MUST be 64-bit (Remove this for C89 compatibility) */ +typedef unsigned long long QWORD; + +#endif + +#endif diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/cc932.c b/Firmware/WIMU3/Libraries/FatFs/src/option/cc932.c new file mode 100644 index 0000000..9515c12 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/cc932.c @@ -0,0 +1,3870 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ +/* CP932 (Japanese Shift-JIS) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + +#define _TINY_TABLE 0 + +#if !_USE_LFN || _CODE_PAGE != 932 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2sjis[] = { +/* Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, + 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, + 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, + 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, + 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, + 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, + 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, + 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, + 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, + 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, + 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, + 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, + 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, + 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, + 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, + 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, + 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, + 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, + 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, + 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, + 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, + 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, + 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, + 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, + 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, + 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, + 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, + 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, + 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, + 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, + 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, + 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, + 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, + 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, + 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, + 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, + 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, + 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, + 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, + 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, + 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, + 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, + 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, + 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, + 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, + 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, + 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, + 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, + 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, + 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, + 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, + 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, + 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, + 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, + 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, + 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, + 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, + 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, + 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, + 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, + 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, + 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, + 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, + 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, + 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, + 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, + 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, + 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, + 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, + 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, + 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, + 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, + 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, + 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, + 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, + 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, + 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, + 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, + 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, + 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, + 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, + 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, + 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, + 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, + 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, + 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, + 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, + 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, + 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, + 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, + 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, + 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, + 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, + 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, + 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, + 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, + 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, + 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, + 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, + 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, + 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, + 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, + 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, + 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, + 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, + 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, + 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, + 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, + 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, + 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, + 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, + 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, + 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, + 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, + 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, + 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, + 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, + 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, + 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, + 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, + 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, + 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, + 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, + 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, + 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, + 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, + 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, + 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, + 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, + 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, + 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, + 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, + 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, + 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, + 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, + 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, + 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, + 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, + 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, + 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, + 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, + 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, + 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, + 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, + 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, + 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, + 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, + 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, + 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, + 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, + 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, + 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, + 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, + 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, + 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, + 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, + 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, + 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, + 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, + 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, + 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, + 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, + 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, + 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, + 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, + 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, + 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, + 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, + 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, + 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, + 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, + 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, + 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, + 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, + 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, + 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, + 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, + 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, + 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, + 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, + 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, + 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, + 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, + 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, + 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, + 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, + 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, + 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, + 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, + 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, + 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, + 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, + 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, + 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, + 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, + 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, + 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, + 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, + 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, + 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, + 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, + 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, + 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, + 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, + 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, + 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, + 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, + 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, + 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, + 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, + 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, + 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, + 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, + 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, + 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, + 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, + 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, + 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, + 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, + 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, + 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, + 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, + 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, + 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, + 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, + 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, + 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, + 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, + 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, + 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, + 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, + 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, + 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, + 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, + 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, + 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, + 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, + 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, + 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, + 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, + 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, + 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, + 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, + 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, + 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, + 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, + 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, + 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, + 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, + 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, + 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, + 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, + 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, + 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, + 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, + 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, + 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, + 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, + 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, + 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, + 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, + 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, + 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, + 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, + 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, + 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, + 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, + 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, + 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, + 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, + 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, + 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, + 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, + 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, + 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, + 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, + 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, + 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, + 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, + 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, + 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, + 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, + 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, + 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, + 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, + 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, + 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, + 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, + 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, + 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, + 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, + 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, + 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, + 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, + 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, + 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, + 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, + 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, + 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, + 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, + 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, + 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, + 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, + 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, + 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, + 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, + 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, + 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, + 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, + 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, + 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, + 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, + 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, + 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, + 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, + 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, + 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, + 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, + 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, + 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, + 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, + 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, + 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, + 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, + 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, + 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, + 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, + 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, + 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, + 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, + 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, + 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, + 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, + 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, + 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, + 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, + 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, + 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, + 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, + 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, + 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, + 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, + 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, + 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, + 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, + 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, + 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, + 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, + 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, + 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, + 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, + 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, + 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, + 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, + 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, + 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, + 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, + 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, + 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, + 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, + 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, + 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, + 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, + 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, + 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, + 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, + 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, + 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, + 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, + 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, + 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, + 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, + 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, + 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, + 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, + 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, + 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, + 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, + 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, + 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, + 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, + 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, + 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, + 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, + 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, + 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, + 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, + 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, + 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, + 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, + 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, + 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, + 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, + 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, + 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, + 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, + 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, + 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, + 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, + 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, + 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, + 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, + 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, + 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, + 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, + 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, + 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, + 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, + 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, + 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, + 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, + 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, + 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, + 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, + 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, + 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, + 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, + 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, + 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, + 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, + 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, + 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, + 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, + 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, + 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, + 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, + 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, + 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, + 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, + 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, + 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, + 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, + 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, + 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, + 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, + 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, + 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, + 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, + 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, + 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, + 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, + 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, + 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, + 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, + 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, + 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, + 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, + 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, + 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, + 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, + 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, + 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, + 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, + 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, + 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, + 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, + 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, + 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, + 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, + 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, + 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, + 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, + 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, + 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, + 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, + 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, + 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, + 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, + 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, + 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, + 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, + 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, + 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, + 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, + 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, + 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, + 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, + 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, + 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, + 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, + 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, + 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, + 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, + 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, + 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, + 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, + 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, + 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, + 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, + 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, + 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, + 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, + 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, + 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, + 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, + 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, + 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, + 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, + 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, + 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, + 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, + 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, + 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, + 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, + 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, + 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, + 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, + 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, + 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, + 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, + 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, + 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, + 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, + 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, + 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, + 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, + 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, + 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, + 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, + 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, + 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, + 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, + 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, + 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, + 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, + 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, + 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, + 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, + 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, + 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, + 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, + 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, + 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, + 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, + 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, + 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, + 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, + 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, + 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, + 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, + 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, + 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, + 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, + 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, + 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, + 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, + 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, + 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, + 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, + 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, + 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, + 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, + 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, + 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, + 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, + 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, + 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, + 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, + 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, + 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, + 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, + 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, + 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, + 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, + 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, + 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, + 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, + 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, + 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, + 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, + 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, + 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, + 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, + 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, + 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, + 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, + 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, + 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, + 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, + 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, + 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, + 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, + 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, + 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, + 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, + 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, + 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, + 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, + 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, + 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, + 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, + 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, + 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, + 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, + 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, + 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, + 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, + 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, + 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, + 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, + 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, + 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, + 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, + 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, + 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, + 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, + 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, + 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, + 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, + 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, + 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, + 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, + 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, + 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, + 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, + 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, + 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, + 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, + 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, + 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, + 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, + 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, + 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, + 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, + 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, + 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, + 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, + 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, + 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, + 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, + 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, + 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, + 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, + 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, + 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, + 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, + 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, + 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, + 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, + 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, + 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, + 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, + 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, + 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, + 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, + 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, + 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, + 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, + 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, + 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, + 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, + 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, + 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, + 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, + 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, + 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, + 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, + 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, + 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, + 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, + 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, + 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, + 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, + 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, + 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, + 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, + 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, + 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, + 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, + 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, + 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, + 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, + 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, + 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, + 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, + 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, + 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, + 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, + 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, + 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, + 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, + 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, + 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, + 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, + 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, + 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, + 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, + 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, + 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, + 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, + 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, + 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, + 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, + 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, + 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, + 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, + 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, + 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, + 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, + 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, + 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, + 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, + 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, + 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, + 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, + 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, + 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, + 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, + 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, + 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, + 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, + 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, + 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, + 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, + 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, + 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, + 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, + 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, + 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, + 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, + 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, + 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, + 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, + 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, + 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, + 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, + 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, + 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, + 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, + 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, + 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, + 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, + 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, + 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, + 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, + 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, + 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, + 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, + 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, + 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, + 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, + 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, + 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, + 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, + 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, + 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, + 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, + 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, + 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, + 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, + 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, + 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, + 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, + 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, + 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, + 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, + 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, + 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, + 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, + 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, + 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, + 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, + 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, + 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, + 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, + 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, + 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, + 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, + 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, + 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, + 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, + 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, + 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, + 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, + 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, + 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, + 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, + 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, + 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, + 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, + 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, + 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, + 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, + 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, + 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, + 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, + 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, + 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, + 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, + 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, + 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, + 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, + 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, + 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, + 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, + 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, + 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, + 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, + 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, + 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, + 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, + 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, + 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, + 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, + 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, + 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, + 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, + 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, + 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, + 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, + 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, + 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, + 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, + 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, + 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, + 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, + 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, + 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, + 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, + 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, + 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, + 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, + 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, + 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, + 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, + 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, + 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, + 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, + 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, + 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, + 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, + 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, + 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, + 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, + 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, + 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, + 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, + 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, + 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, + 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, + 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, + 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, + 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, + 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, + 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, + 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, + 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, + 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, + 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, + 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, + 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, + 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, + 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, + 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, + 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, + 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, + 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, + 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, + 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, + 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, + 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, + 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, + 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, + 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, + 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, + 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, + 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, + 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, + 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, + 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, + 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, + 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, + 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, + 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, + 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, + 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, + 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, + 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, + 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, + 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, + 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, + 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, + 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, + 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, + 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, + 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, + 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, + 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, + 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, + 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, + 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, + 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, + 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, + 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, + 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, + 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, + 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, + 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, + 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, + 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, + 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, + 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, + 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, + 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, + 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, + 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, + 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, + 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, + 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, + 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, + 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, + 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, + 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, + 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, + 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, + 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, + 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, + 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, + 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, + 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, + 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, + 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, + 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, + 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, + 0xFFE5, 0x818F, 0, 0 +}; + +#if !_TINY_TABLE +static +const WCHAR sjis2uni[] = { +/* SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, + 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, + 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, + 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, + 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, + 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, + 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, + 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, + 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, + 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, + 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, + 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, + 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, + 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, + 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, + 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, + 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, + 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, + 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, + 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, + 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, + 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, + 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, + 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, + 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, + 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, + 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, + 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, + 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, + 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, + 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, + 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, + 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, + 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, + 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, + 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, + 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, + 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, + 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, + 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, + 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, + 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, + 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, + 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, + 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, + 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, + 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, + 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, + 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, + 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, + 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, + 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, + 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, + 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, + 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, + 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, + 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, + 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, + 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, + 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, + 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, + 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, + 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, + 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, + 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, + 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, + 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, + 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, + 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, + 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, + 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, + 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, + 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, + 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, + 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, + 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, + 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, + 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, + 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, + 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, + 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, + 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, + 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, + 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, + 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, + 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, + 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, + 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, + 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, + 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, + 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, + 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, + 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, + 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, + 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, + 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, + 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, + 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, + 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, + 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, + 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, + 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, + 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, + 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, + 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, + 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, + 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, + 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, + 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, + 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, + 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, + 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, + 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, + 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, + 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, + 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, + 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, + 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, + 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, + 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, + 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, + 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, + 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, + 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, + 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, + 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, + 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, + 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, + 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, + 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, + 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, + 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, + 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, + 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, + 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, + 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, + 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, + 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, + 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, + 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, + 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, + 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, + 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, + 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, + 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, + 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, + 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, + 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, + 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, + 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, + 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, + 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, + 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, + 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, + 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, + 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, + 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, + 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, + 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, + 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, + 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, + 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, + 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, + 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, + 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, + 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, + 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, + 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, + 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, + 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, + 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, + 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, + 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, + 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, + 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, + 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, + 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, + 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, + 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, + 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, + 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, + 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, + 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, + 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, + 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, + 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, + 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, + 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, + 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, + 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, + 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, + 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, + 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, + 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, + 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, + 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, + 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, + 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, + 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, + 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, + 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, + 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, + 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, + 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, + 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, + 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, + 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, + 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, + 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, + 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, + 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, + 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, + 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, + 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, + 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, + 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, + 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, + 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, + 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, + 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, + 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, + 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, + 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, + 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, + 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, + 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, + 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, + 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, + 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, + 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, + 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, + 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, + 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, + 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, + 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, + 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, + 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, + 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, + 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, + 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, + 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, + 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, + 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, + 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, + 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, + 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, + 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, + 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, + 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, + 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, + 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, + 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, + 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, + 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, + 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, + 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, + 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, + 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, + 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, + 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, + 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, + 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, + 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, + 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, + 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, + 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, + 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, + 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, + 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, + 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, + 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, + 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, + 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, + 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, + 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, + 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, + 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, + 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, + 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, + 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, + 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, + 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, + 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, + 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, + 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, + 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, + 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, + 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, + 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, + 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, + 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, + 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, + 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, + 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, + 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, + 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, + 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, + 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, + 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, + 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, + 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, + 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, + 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, + 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, + 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, + 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, + 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, + 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, + 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, + 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, + 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, + 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, + 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, + 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, + 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, + 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, + 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, + 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, + 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, + 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, + 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, + 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, + 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, + 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, + 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, + 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, + 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, + 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, + 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, + 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, + 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, + 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, + 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, + 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, + 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, + 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, + 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, + 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, + 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, + 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, + 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, + 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, + 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, + 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, + 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, + 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, + 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, + 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, + 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, + 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, + 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, + 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, + 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, + 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, + 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, + 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, + 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, + 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, + 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, + 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, + 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, + 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, + 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, + 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, + 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, + 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, + 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, + 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, + 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, + 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, + 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, + 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, + 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, + 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, + 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, + 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, + 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, + 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, + 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, + 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, + 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, + 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, + 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, + 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, + 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, + 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, + 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, + 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, + 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, + 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, + 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, + 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, + 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, + 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, + 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, + 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, + 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, + 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, + 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, + 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, + 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, + 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, + 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, + 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, + 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, + 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, + 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, + 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, + 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, + 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, + 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, + 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, + 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, + 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, + 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, + 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, + 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, + 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, + 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, + 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, + 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, + 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, + 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, + 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, + 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, + 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, + 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, + 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, + 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, + 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, + 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, + 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, + 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, + 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, + 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, + 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, + 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, + 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, + 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, + 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, + 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, + 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, + 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, + 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, + 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, + 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, + 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, + 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, + 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, + 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, + 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, + 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, + 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, + 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, + 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, + 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, + 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, + 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, + 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, + 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, + 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, + 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, + 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, + 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, + 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, + 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, + 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, + 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, + 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, + 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, + 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, + 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, + 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, + 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, + 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, + 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, + 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, + 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, + 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, + 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, + 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, + 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, + 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, + 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, + 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, + 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, + 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, + 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, + 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, + 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, + 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, + 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, + 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, + 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, + 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, + 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, + 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, + 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, + 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, + 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, + 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, + 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, + 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, + 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, + 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, + 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, + 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, + 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, + 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, + 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, + 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, + 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, + 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, + 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, + 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, + 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, + 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, + 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, + 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, + 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, + 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, + 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, + 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, + 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, + 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, + 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, + 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, + 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, + 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, + 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, + 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, + 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, + 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, + 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, + 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, + 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, + 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, + 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, + 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, + 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, + 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, + 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, + 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, + 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, + 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, + 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, + 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, + 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, + 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, + 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, + 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, + 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, + 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, + 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, + 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, + 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, + 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, + 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, + 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, + 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, + 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, + 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, + 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, + 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, + 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, + 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, + 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, + 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, + 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, + 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, + 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, + 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, + 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, + 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, + 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, + 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, + 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, + 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, + 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, + 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, + 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, + 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, + 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, + 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, + 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, + 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, + 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, + 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, + 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, + 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, + 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, + 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, + 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, + 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, + 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, + 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, + 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, + 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, + 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, + 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, + 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, + 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, + 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, + 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, + 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, + 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, + 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, + 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, + 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, + 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, + 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, + 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, + 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, + 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, + 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, + 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, + 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, + 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, + 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, + 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, + 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, + 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, + 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, + 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, + 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, + 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, + 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, + 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, + 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, + 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, + 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, + 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, + 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, + 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, + 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, + 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, + 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, + 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, + 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, + 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, + 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, + 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, + 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, + 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, + 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, + 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, + 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, + 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, + 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, + 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, + 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, + 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, + 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, + 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, + 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, + 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, + 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, + 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, + 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, + 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, + 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, + 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, + 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, + 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, + 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, + 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, + 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, + 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, + 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, + 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, + 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, + 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, + 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, + 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, + 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, + 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, + 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, + 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, + 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, + 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, + 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, + 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, + 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, + 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, + 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, + 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, + 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, + 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, + 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, + 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, + 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, + 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, + 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, + 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, + 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, + 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, + 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, + 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, + 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, + 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, + 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, + 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, + 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, + 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, + 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, + 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, + 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, + 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, + 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, + 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, + 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, + 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, + 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, + 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, + 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, + 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, + 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, + 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, + 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, + 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, + 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, + 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, + 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, + 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, + 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, + 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, + 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, + 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, + 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, + 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, + 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, + 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, + 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, + 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, + 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, + 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, + 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, + 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, + 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, + 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, + 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, + 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, + 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, + 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, + 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, + 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, + 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, + 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, + 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, + 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, + 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, + 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, + 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, + 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, + 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, + 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, + 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, + 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, + 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, + 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, + 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, + 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, + 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, + 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, + 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, + 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, + 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, + 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, + 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, + 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, + 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, + 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, + 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, + 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, + 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, + 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, + 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, + 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, + 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, + 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, + 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, + 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, + 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, + 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, + 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, + 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, + 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, + 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, + 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, + 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, + 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, + 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, + 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, + 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, + 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, + 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, + 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, + 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, + 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, + 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, + 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, + 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, + 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, + 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, + 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, + 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, + 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, + 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, + 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, + 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, + 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, + 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, + 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, + 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, + 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, + 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, + 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, + 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, + 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, + 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, + 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, + 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, + 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, + 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, + 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, + 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, + 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, + 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, + 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, + 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, + 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, + 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, + 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, + 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, + 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, + 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, + 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, + 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, + 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, + 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, + 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, + 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, + 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, + 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, + 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, + 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, + 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, + 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, + 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, + 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, + 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, + 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, + 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, + 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, + 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, + 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, + 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, + 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, + 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, + 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, + 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, + 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, + 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, + 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, + 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, + 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, + 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, + 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, + 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, + 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, + 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, + 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, + 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, + 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, + 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, + 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, + 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, + 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, + 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, + 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, + 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, + 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, + 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, + 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, + 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, + 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, + 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, + 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, + 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, + 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, + 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, + 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, + 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, + 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, + 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, + 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, + 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, + 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, + 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, + 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, + 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, + 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, + 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, + 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, + 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, + 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, + 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, + 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, + 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, + 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, + 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, + 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, + 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, + 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, + 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, + 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, + 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, + 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, + 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, + 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, + 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, + 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, + 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, + 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr <= 0x80) { /* ASCII */ + c = chr; + } else { +#if !_TINY_TABLE + if (dir) { /* OEM code to unicode */ + p = sjis2uni; + hi = sizeof sjis2uni / 4 - 1; + } else { /* Unicode to OEM code */ + p = uni2sjis; + hi = sizeof uni2sjis / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; +#else + if (dir) { /* OEM code to unicode (Incremental search)*/ + p = &uni2sjis[1]; + do { + c = *p; + p += 2; + } while (c && c != chr); + p -= 3; + c = *p; + } else { /* Unicode to OEM code */ + li = 0; hi = sizeof uni2sjis / 4 - 1; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == uni2sjis[i * 2]) break; + if (chr > uni2sjis[i * 2]) + li = i; + else + hi = i; + } + c = n ? uni2sjis[i * 2 + 1] : 0; + } +#endif + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted (BMP only) */ +) +{ + /* Compressed upper conversion table */ + static const WCHAR cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WCHAR cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF2,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WCHAR *p; + WCHAR bc, nc, cmd; + + + p = chr < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || chr < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (chr < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: chr = p[chr - bc]; break; /* Table conversion */ + case 1: chr -= (chr - bc) & 1; break; /* Case pairs */ + case 2: chr -= 16; break; /* Shift -16 */ + case 3: chr -= 32; break; /* Shift -32 */ + case 4: chr -= 48; break; /* Shift -48 */ + case 5: chr -= 26; break; /* Shift -26 */ + case 6: chr += 8; break; /* Shift +8 */ + case 7: chr -= 80; break; /* Shift -80 */ + case 8: chr -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + + return chr; +} + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/cc936.c b/Firmware/WIMU3/Libraries/FatFs/src/option/cc936.c new file mode 100644 index 0000000..ec9e886 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/cc936.c @@ -0,0 +1,11045 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ +/* CP936 (Simplified Chinese GBK) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 936 +#error This file is not needed in current configuration. Remove from the project. +#endif + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, + 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, + 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, + 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, + 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, + 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, + 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, + 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, + 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, + 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, + 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, + 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, + 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, + 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, + 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, + 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, + 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, + 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, + 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, + 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, + 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, + 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, + 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, + 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, + 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, + 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, + 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, + 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, + 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, + 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, + 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, + 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, + 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, + 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, + 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, + 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, + 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, + 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, + 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, + 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, + 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, + 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, + 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, + 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, + 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, + 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, + 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, + 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, + 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, + 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, + 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, + 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, + 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, + 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, + 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, + 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, + 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, + 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, + 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, + 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, + 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, + 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, + 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, + 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, + 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, + 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, + 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, + 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, + 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, + 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, + 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, + 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, + 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, + 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, + 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, + 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, + 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, + 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, + 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, + 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, + 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, + 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, + 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, + 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, + 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, + 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, + 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, + 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, + 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, + 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, + 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, + 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, + 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, + 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, + 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, + 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, + 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, + 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, + 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, + 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, + 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, + 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, + 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, + 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, + 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, + 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, + 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, + 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, + 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, + 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, + 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, + 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, + 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, + 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, + 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, + 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, + 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, + 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, + 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, + 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, + 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, + 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, + 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, + 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, + 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, + 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, + 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, + 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, + 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, + 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, + 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, + 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, + 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, + 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, + 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, + 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, + 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, + 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, + 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, + 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, + 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, + 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, + 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, + 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, + 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, + 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, + 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, + 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, + 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, + 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, + 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, + 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, + 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, + 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, + 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, + 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, + 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, + 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, + 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, + 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, + 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, + 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, + 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, + 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, + 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, + 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, + 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, + 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, + 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, + 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, + 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, + 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, + 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, + 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, + 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, + 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, + 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, + 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, + 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, + 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, + 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, + 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, + 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, + 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, + 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, + 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, + 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, + 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, + 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, + 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, + 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, + 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, + 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, + 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, + 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, + 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, + 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, + 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, + 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, + 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, + 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, + 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, + 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, + 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, + 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, + 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, + 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, + 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, + 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, + 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, + 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, + 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, + 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, + 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, + 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, + 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, + 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, + 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, + 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, + 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, + 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, + 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, + 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, + 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, + 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, + 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, + 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, + 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, + 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, + 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, + 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, + 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, + 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, + 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, + 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, + 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, + 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, + 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, + 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, + 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, + 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, + 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, + 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, + 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, + 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, + 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, + 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, + 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, + 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, + 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, + 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, + 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, + 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, + 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, + 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, + 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, + 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, + 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, + 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, + 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, + 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, + 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, + 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, + 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, + 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, + 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, + 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, + 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, + 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, + 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, + 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, + 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, + 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, + 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, + 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, + 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, + 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, + 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, + 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, + 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, + 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, + 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, + 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, + 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, + 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, + 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, + 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, + 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, + 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, + 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, + 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, + 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, + 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, + 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, + 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, + 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, + 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, + 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, + 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, + 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, + 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, + 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, + 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, + 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, + 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, + 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, + 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, + 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, + 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, + 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, + 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, + 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, + 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, + 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, + 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, + 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, + 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, + 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, + 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, + 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, + 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, + 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, + 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, + 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, + 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, + 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, + 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, + 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, + 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, + 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, + 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, + 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, + 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, + 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, + 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, + 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, + 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, + 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, + 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, + 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, + 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, + 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, + 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, + 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, + 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, + 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, + 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, + 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, + 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, + 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, + 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, + 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, + 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, + 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, + 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, + 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, + 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, + 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, + 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, + 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, + 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, + 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, + 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, + 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, + 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, + 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, + 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, + 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, + 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, + 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, + 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, + 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, + 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, + 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, + 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, + 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, + 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, + 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, + 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, + 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, + 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, + 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, + 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, + 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, + 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, + 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, + 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, + 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, + 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, + 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, + 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, + 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, + 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, + 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, + 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, + 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, + 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, + 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, + 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, + 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, + 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, + 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, + 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, + 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, + 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, + 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, + 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, + 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, + 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, + 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, + 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, + 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, + 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, + 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, + 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, + 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, + 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, + 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, + 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, + 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, + 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, + 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, + 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, + 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, + 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, + 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, + 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, + 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, + 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, + 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, + 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, + 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, + 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, + 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, + 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, + 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, + 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, + 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, + 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, + 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, + 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, + 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, + 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, + 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, + 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, + 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, + 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, + 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, + 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, + 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, + 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, + 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, + 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, + 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, + 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, + 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, + 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, + 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, + 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, + 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, + 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, + 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, + 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, + 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, + 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, + 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, + 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, + 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, + 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, + 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, + 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, + 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, + 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, + 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, + 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, + 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, + 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, + 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, + 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, + 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, + 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, + 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, + 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, + 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, + 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, + 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, + 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, + 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, + 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, + 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, + 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, + 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, + 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, + 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, + 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, + 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, + 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, + 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, + 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, + 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, + 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, + 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, + 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, + 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, + 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, + 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, + 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, + 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, + 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, + 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, + 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, + 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, + 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, + 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, + 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, + 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, + 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, + 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, + 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, + 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, + 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, + 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, + 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, + 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, + 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, + 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, + 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, + 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, + 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, + 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, + 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, + 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, + 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, + 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, + 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, + 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, + 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, + 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, + 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, + 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, + 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, + 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, + 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, + 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, + 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, + 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, + 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, + 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, + 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, + 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, + 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, + 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, + 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, + 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, + 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, + 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, + 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, + 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, + 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, + 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, + 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, + 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, + 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, + 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, + 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, + 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, + 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, + 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, + 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, + 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, + 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, + 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, + 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, + 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, + 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, + 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, + 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, + 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, + 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, + 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, + 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, + 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, + 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, + 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, + 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, + 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, + 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, + 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, + 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, + 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, + 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, + 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, + 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, + 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, + 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, + 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, + 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, + 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, + 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, + 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, + 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, + 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, + 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, + 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, + 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, + 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, + 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, + 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, + 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, + 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, + 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, + 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, + 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, + 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, + 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, + 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, + 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, + 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, + 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, + 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, + 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, + 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, + 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, + 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, + 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, + 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, + 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, + 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, + 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, + 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, + 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, + 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, + 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, + 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, + 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, + 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, + 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, + 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, + 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, + 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, + 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, + 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, + 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, + 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, + 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, + 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, + 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, + 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, + 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, + 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, + 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, + 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, + 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, + 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, + 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, + 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, + 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, + 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, + 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, + 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, + 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, + 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, + 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, + 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, + 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, + 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, + 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, + 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, + 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, + 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, + 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, + 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, + 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, + 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, + 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, + 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, + 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, + 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, + 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, + 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, + 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, + 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, + 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, + 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, + 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, + 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, + 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, + 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, + 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, + 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, + 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, + 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, + 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, + 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, + 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, + 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, + 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, + 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, + 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, + 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, + 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, + 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, + 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, + 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, + 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, + 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, + 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, + 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, + 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, + 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, + 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, + 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, + 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, + 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, + 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, + 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, + 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, + 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, + 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, + 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, + 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, + 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, + 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, + 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, + 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, + 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, + 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, + 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, + 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, + 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, + 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, + 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, + 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, + 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, + 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, + 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, + 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, + 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, + 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, + 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, + 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, + 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, + 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, + 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, + 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, + 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, + 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, + 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, + 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, + 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, + 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, + 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, + 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, + 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, + 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, + 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, + 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, + 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, + 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, + 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, + 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, + 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, + 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, + 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, + 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, + 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, + 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, + 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, + 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, + 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, + 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, + 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, + 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, + 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, + 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, + 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, + 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, + 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, + 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, + 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, + 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, + 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, + 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, + 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, + 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, + 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, + 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, + 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, + 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, + 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, + 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, + 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, + 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, + 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, + 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, + 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, + 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, + 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, + 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, + 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, + 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, + 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, + 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, + 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, + 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, + 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, + 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, + 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, + 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, + 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, + 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, + 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, + 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, + 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, + 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, + 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, + 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, + 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, + 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, + 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, + 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, + 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, + 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, + 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, + 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, + 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, + 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, + 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, + 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, + 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, + 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, + 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, + 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, + 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, + 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, + 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, + 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, + 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, + 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, + 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, + 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, + 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, + 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, + 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, + 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, + 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, + 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, + 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, + 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, + 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, + 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, + 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, + 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, + 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, + 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, + 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, + 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, + 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, + 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, + 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, + 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, + 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, + 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, + 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, + 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, + 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, + 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, + 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, + 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, + 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, + 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, + 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, + 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, + 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, + 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, + 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, + 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, + 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, + 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, + 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, + 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, + 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, + 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, + 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, + 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, + 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, + 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, + 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, + 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, + 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, + 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, + 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, + 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, + 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, + 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, + 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, + 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, + 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, + 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, + 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, + 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, + 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, + 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, + 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, + 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, + 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, + 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, + 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, + 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, + 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, + 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, + 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, + 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, + 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, + 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, + 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, + 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, + 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, + 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, + 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, + 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, + 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, + 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, + 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, + 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, + 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, + 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, + 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, + 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, + 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, + 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, + 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, + 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, + 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, + 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, + 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, + 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, + 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, + 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, + 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, + 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, + 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, + 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, + 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, + 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, + 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, + 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, + 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, + 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, + 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, + 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, + 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, + 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, + 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, + 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, + 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, + 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, + 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, + 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, + 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, + 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, + 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, + 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, + 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, + 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, + 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, + 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, + 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, + 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, + 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, + 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, + 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, + 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, + 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, + 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, + 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, + 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, + 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, + 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, + 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, + 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, + 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, + 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, + 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, + 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, + 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, + 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, + 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, + 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, + 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, + 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, + 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, + 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, + 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, + 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, + 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, + 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, + 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, + 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, + 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, + 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, + 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, + 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, + 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, + 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, + 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, + 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, + 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, + 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, + 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, + 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, + 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, + 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, + 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, + 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, + 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, + 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, + 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, + 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, + 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, + 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, + 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, + 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, + 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, + 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, + 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, + 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, + 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, + 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, + 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, + 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, + 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, + 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, + 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, + 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, + 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, + 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, + 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, + 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, + 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, + 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, + 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, + 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, + 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, + 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, + 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, + 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, + 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, + 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, + 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, + 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, + 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, + 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, + 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, + 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, + 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, + 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, + 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, + 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, + 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, + 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, + 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, + 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, + 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, + 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, + 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, + 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, + 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, + 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, + 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, + 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, + 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, + 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, + 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, + 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, + 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, + 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, + 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, + 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, + 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, + 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, + 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, + 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, + 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, + 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, + 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, + 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, + 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, + 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, + 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, + 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, + 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, + 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, + 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, + 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, + 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, + 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, + 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, + 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, + 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, + 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, + 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, + 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, + 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, + 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, + 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, + 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, + 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, + 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, + 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, + 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, + 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, + 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, + 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, + 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, + 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, + 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, + 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, + 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, + 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, + 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, + 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, + 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, + 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, + 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, + 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, + 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, + 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, + 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, + 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, + 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, + 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, + 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, + 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, + 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, + 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, + 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, + 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, + 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, + 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, + 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, + 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, + 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, + 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, + 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, + 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, + 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, + 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, + 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, + 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, + 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, + 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, + 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, + 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, + 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, + 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, + 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, + 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, + 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, + 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, + 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, + 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, + 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, + 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, + 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, + 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, + 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, + 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, + 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, + 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, + 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, + 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, + 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, + 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, + 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, + 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, + 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, + 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, + 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, + 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, + 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, + 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, + 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, + 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, + 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, + 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, + 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, + 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, + 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, + 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, + 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, + 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, + 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, + 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, + 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, + 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, + 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, + 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, + 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, + 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, + 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, + 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, + 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, + 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, + 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, + 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, + 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, + 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, + 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, + 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, + 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, + 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, + 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, + 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, + 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, + 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, + 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, + 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, + 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, + 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, + 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, + 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, + 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, + 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, + 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, + 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, + 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, + 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, + 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, + 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, + 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, + 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, + 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, + 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, + 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, + 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, + 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, + 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, + 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, + 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, + 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, + 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, + 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, + 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, + 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, + 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, + 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, + 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, + 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, + 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, + 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, + 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, + 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, + 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, + 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, + 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, + 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, + 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, + 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, + 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, + 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, + 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, + 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, + 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, + 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, + 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, + 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, + 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, + 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, + 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, + 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, + 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, + 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, + 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, + 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, + 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, + 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, + 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, + 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, + 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, + 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, + 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, + 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, + 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, + 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, + 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, + 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, + 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, + 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, + 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, + 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, + 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, + 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, + 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, + 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, + 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, + 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, + 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, + 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, + 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, + 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, + 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, + 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, + 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, + 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, + 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, + 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, + 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, + 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, + 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, + 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, + 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, + 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, + 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, + 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, + 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, + 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, + 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, + 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, + 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, + 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, + 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, + 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, + 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, + 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, + 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, + 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, + 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, + 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, + 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, + 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, + 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, + 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, + 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, + 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, + 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, + 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, + 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, + 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, + 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, + 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, + 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, + 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, + 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, + 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, + 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, + 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, + 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, + 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, + 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, + 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, + 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, + 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, + 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, + 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, + 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, + 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, + 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, + 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, + 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, + 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, + 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, + 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, + 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, + 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, + 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, + 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, + 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, + 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, + 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, + 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, + 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, + 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, + 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, + 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, + 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, + 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, + 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, + 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, + 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, + 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, + 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, + 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, + 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, + 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, + 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, + 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, + 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, + 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, + 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, + 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, + 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, + 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, + 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, + 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, + 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, + 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, + 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, + 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, + 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, + 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, + 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, + 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, + 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, + 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, + 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, + 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, + 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, + 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, + 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, + 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, + 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, + 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, + 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, + 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, + 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, + 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, + 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, + 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, + 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, + 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, + 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, + 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, + 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, + 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, + 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, + 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, + 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, + 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, + 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, + 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, + 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, + 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, + 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, + 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, + 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, + 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, + 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, + 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, + 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, + 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, + 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, + 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, + 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, + 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, + 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, + 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, + 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, + 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, + 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, + 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, + 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, + 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, + 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, + 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, + 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, + 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, + 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, + 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, + 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, + 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, + 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, + 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, + 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, + 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, + 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, + 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, + 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, + 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, + 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, + 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, + 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, + 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, + 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, + 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, + 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, + 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, + 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, + 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, + 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, + 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, + 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, + 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, + 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, + 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, + 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, + 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, + 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, + 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, + 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, + 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, + 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, + 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, + 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, + 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, + 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, + 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, + 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, + 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, + 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, + 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, + 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, + 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, + 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, + 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, + 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, + 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, + 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, + 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, + 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, + 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, + 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, + 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, + 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, + 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, + 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, + 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, + 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, + 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, + 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, + 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, + 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, + 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, + 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, + 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, + 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, + 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, + 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, + 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, + 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, + 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, + 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, + 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, + 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, + 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, + 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, + 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, + 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, + 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, + 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, + 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, + 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, + 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, + 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, + 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, + 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, + 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, + 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, + 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, + 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, + 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, + 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, + 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, + 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, + 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, + 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, + 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, + 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, + 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, + 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, + 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, + 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, + 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, + 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, + 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, + 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, + 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, + 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, + 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, + 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, + 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, + 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, + 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, + 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, + 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, + 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, + 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, + 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, + 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, + 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, + 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, + 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, + 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, + 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, + 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, + 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, + 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, + 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, + 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, + 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, + 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, + 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, + 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, + 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, + 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, + 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, + 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, + 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, + 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, + 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, + 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, + 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, + 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, + 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, + 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, + 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, + 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, + 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, + 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, + 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, + 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, + 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, + 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, + 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, + 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, + 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, + 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, + 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, + 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, + 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, + 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, + 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, + 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, + 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, + 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, + 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, + 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, + 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, + 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, + 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, + 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, + 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, + 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, + 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, + 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, + 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, + 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, + 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, + 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, + 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, + 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, + 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, + 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, + 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, + 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, + 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, + 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, + 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, + 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, + 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, + 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, + 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, + 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, + 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, + 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, + 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, + 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, + 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, + 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, + 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, + 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, + 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, + 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, + 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, + 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, + 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, + 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, + 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, + 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, + 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, + 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, + 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, + 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, + 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, + 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, + 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, + 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, + 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, + 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, + 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, + 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, + 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, + 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, + 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, + 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, + 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, + 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, + 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, + 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, + 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, + 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, + 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, + 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, + 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, + 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, + 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, + 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, + 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, + 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, + 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, + 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, + 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, + 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, + 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, + 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, + 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, + 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, + 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, + 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, + 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, + 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, + 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, + 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, + 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, + 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, + 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, + 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, + 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, + 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, + 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, + 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, + 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, + 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, + 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, + 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, + 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, + 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, + 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, + 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, + 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, + 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, + 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, + 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, + 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, + 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, + 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, + 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, + 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, + 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, + 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, + 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, + 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, + 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, + 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, + 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, + 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, + 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, + 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, + 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, + 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, + 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, + 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, + 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, + 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, + 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, + 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, + 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, + 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, + 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, + 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, + 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, + 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, + 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, + 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, + 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, + 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, + 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, + 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, + 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, + 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, + 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, + 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, + 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, + 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, + 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, + 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, + 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, + 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, + 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, + 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, + 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, + 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, + 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, + 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, + 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, + 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, + 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, + 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, + 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, + 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, + 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, + 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, + 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, + 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, + 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, + 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, + 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, + 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, + 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, + 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, + 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, + 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, + 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, + 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, + 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, + 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, + 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, + 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, + 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, + 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, + 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, + 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, + 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, + 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, + 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, + 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, + 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, + 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, + 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, + 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, + 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, + 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, + 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, + 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, + 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, + 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, + 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, + 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, + 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, + 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, + 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, + 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, + 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, + 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, + 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, + 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, + 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, + 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, + 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, + 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, + 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, + 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, + 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, + 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, + 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, + 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, + 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, + 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, + 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, + 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, + 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, + 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, + 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, + 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, + 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, + 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, + 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, + 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, + 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, + 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, + 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, + 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, + 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, + 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, + 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, + 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, + 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, + 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, + 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, + 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, + 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, + 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, + 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, + 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, + 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, + 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, + 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, + 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, + 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, + 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, + 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, + 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, + 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, + 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, + 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, + 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, + 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, + 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, + 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, + 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, + 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, + 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, + 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, + 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, + 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, + 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, + 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, + 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, + 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, + 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, + 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, + 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, + 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, + 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, + 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, + 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, + 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, + 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, + 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, + 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, + 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, + 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, + 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, + 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, + 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, + 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, + 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, + 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, + 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, + 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, + 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, + 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, + 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, + 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, + 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, + 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, + 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, + 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, + 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, + 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, + 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, + 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, + 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, + 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, + 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, + 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, + 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, + 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, + 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, + 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, + 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, + 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, + 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, + 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, + 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, + 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, + 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, + 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, + 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, + 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, + 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, + 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, + 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, + 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, + 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, + 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, + 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, + 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, + 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, + 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, + 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, + 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, + 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, + 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, + 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, + 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, + 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, + 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, + 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, + 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, + 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, + 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, + 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, + 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, + 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, + 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, + 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, + 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, + 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, + 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, + 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, + 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, + 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, + 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, + 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, + 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, + 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, + 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, + 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, + 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, + 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, + 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, + 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, + 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, + 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, + 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, + 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, + 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, + 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, + 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, + 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, + 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, + 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, + 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, + 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, + 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, + 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, + 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, + 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, + 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, + 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, + 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, + 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, + 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, + 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, + 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, + 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, + 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, + 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, + 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, + 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, + 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, + 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, + 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, + 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, + 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, + 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, + 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, + 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, + 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, + 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, + 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, + 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, + 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, + 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, + 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, + 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, + 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, + 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, + 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, + 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, + 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, + 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, + 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, + 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, + 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, + 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, + 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, + 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, + 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, + 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, + 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, + 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, + 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, + 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, + 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, + 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, + 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, + 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, + 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, + 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, + 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, + 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, + 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, + 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, + 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, + 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, + 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, + 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, + 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, + 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, + 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, + 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, + 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, + 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, + 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, + 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, + 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, + 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, + 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, + 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, + 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, + 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, + 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, + 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, + 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, + 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, + 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, + 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, + 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, + 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, + 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, + 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, + 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, + 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, + 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, + 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, + 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, + 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, + 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, + 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, + 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, + 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, + 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, + 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, + 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, + 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, + 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, + 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, + 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, + 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, + 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, + 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, + 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, + 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, + 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, + 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, + 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, + 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, + 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, + 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, + 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, + 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, + 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, + 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, + 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, + 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, + 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, + 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, + 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, + 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, + 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, + 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, + 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, + 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, + 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, + 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, + 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, + 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, + 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, + 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, + 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, + 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, + 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, + 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, + 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, + 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, + 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, + 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, + 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, + 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, + 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, + 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, + 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, + 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, + 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, + 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, + 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, + 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, + 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, + 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, + 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, + 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, + 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, + 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, + 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, + 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, + 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, + 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, + 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, + 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, + 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, + 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, + 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, + 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, + 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, + 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, + 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, + 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, + 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, + 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, + 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, + 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, + 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, + 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, + 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, + 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, + 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, + 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, + 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, + 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, + 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, + 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, + 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, + 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, + 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, + 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, + 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, + 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, + 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, + 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, + 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, + 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, + 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, + 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, + 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, + 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, + 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, + 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, + 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, + 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, + 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, + 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, + 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, + 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, + 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, + 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, + 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, + 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, + 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, + 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, + 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, + 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, + 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, + 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, + 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, + 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, + 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, + 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, + 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, + 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, + 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, + 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, + 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, + 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, + 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, + 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, + 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, + 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, + 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, + 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, + 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, + 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, + 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, + 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, + 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, + 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, + 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, + 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, + 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, + 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, + 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, + 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, + 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, + 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, + 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, + 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, + 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, + 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, + 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, + 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, + 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, + 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, + 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, + 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, + 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, + 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, + 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, + 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, + 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, + 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, + 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, + 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, + 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, + 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, + 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, + 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, + 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, + 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, + 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, + 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, + 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, + 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, + 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, + 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, + 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, + 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, + 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, + 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, + 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, + 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, + 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, + 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, + 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, + 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, + 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, + 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, + 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, + 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, + 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, + 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, + 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, + 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, + 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, + 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, + 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, + 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, + 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, + 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, + 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, + 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, + 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, + 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, + 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, + 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, + 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, + 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, + 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, + 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, + 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, + 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, + 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, + 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, + 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, + 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, + 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, + 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, + 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, + 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, + 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, + 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, + 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, + 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, + 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, + 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, + 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, + 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, + 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, + 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, + 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, + 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, + 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, + 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, + 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, + 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, + 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, + 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, + 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, + 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, + 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, + 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, + 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, + 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, + 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, + 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, + 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, + 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, + 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, + 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, + 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, + 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, + 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, + 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, + 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, + 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, + 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, + 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, + 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, + 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, + 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, + 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, + 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, + 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, + 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, + 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, + 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, + 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, + 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, + 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, + 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, + 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, + 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, + 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, + 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, + 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, + 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, + 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, + 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, + 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, + 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, + 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, + 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, + 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, + 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, + 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, + 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, + 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, + 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, + 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, + 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, + 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, + 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, + 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, + 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, + 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, + 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, + 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, + 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, + 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, + 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, + 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, + 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, + 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, + 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, + 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, + 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, + 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, + 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, + 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, + 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, + 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, + 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, + 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, + 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, + 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, + 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, + 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, + 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, + 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, + 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, + 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, + 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, + 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, + 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, + 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, + 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, + 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, + 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, + 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, + 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, + 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, + 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, + 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, + 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, + 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, + 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, + 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, + 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, + 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, + 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, + 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, + 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, + 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, + 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, + 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, + 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, + 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, + 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, + 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, + 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, + 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, + 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, + 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, + 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, + 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, + 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, + 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, + 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, + 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, + 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, + 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, + 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, + 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, + 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, + 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, + 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, + 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, + 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, + 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, + 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, + 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, + 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, + 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, + 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, + 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, + 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, + 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, + 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, + 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, + 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, + 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, + 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, + 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, + 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, + 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, + 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, + 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, + 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, + 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, + 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, + 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, + 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, + 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, + 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, + 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, + 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, + 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, + 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, + 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, + 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, + 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, + 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, + 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, + 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, + 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, + 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, + 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, + 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, + 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, + 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, + 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, + 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, + 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, + 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, + 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, + 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, + 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, + 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, + 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, + 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, + 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, + 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, + 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, + 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, + 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, + 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, + 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, + 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, + 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, + 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, + 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, + 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, + 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, + 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, + 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, + 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, + 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, + 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, + 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, + 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, + 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, + 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, + 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, + 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, + 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, + 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, + 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, + 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, + 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, + 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, + 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, + 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, + 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, + 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, + 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, + 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, + 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, + 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, + 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, + 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, + 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, + 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, + 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, + 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, + 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, + 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, + 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, + 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, + 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, + 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, + 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, + 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, + 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, + 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, + 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, + 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, + 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, + 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, + 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, + 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, + 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, + 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, + 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, + 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, + 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, + 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, + 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, + 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, + 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, + 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, + 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, + 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, + 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, + 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, + 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, + 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, + 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, + 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, + 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, + 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, + 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, + 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, + 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, + 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, + 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, + 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, + 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, + 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, + 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, + 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, + 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, + 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, + 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, + 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, + 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, + 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, + 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, + 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, + 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, + 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, + 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, + 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, + 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, + 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, + 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, + 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, + 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, + 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, + 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, + 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, + 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, + 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, + 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, + 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, + 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, + 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, + 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, + 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, + 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, + 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, + 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, + 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, + 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, + 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, + 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, + 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, + 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, + 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, + 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, + 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, + 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, + 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, + 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, + 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, + 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, + 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, + 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, + 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, + 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, + 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, + 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, + 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, + 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, + 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, + 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, + 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, + 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, + 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, + 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, + 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, + 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, + 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, + 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, + 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, + 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, + 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, + 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, + 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, + 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, + 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, + 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, + 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, + 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, + 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, + 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, + 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, + 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, + 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, + 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, + 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, + 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, + 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, + 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, + 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, + 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, + 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, + 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, + 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, + 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, + 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, + 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, + 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, + 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, + 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, + 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, + 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, + 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, + 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, + 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, + 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, + 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, + 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, + 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, + 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, + 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, + 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, + 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, + 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, + 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, + 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, + 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, + 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, + 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, + 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, + 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, + 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, + 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, + 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, + 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, + 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, + 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, + 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, + 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, + 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, + 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, + 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, + 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, + 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, + 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, + 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, + 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, + 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, + 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, + 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, + 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, + 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, + 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, + 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, + 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, + 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, + 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, + 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, + 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, + 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, + 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, + 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, + 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, + 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, + 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, + 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, + 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, + 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, + 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, + 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, + 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, + 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, + 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, + 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, + 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, + 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, + 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, + 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, + 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, + 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, + 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, + 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, + 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, + 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, + 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, + 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, + 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, + 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, + 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, + 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, + 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, + 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, + 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, + 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, + 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, + 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, + 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, + 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, + 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, + 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, + 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, + 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, + 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, + 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, + 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, + 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, + 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, + 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, + 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, + 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, + 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, + 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, + 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, + 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, + 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, + 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, + 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, + 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, + 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, + 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, + 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, + 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, + 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, + 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, + 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, + 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, + 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, + 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, + 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, + 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, + 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, + 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, + 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, + 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, + 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, + 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, + 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, + 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, + 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, + 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, + 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, + 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, + 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, + 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, + 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, + 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, + 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, + 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, + 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, + 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, + 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, + 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, + 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, + 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, + 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, + 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, + 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, + 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, + 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, + 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, + 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, + 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, + 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, + 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, + 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, + 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, + 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, + 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, + 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, + 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, + 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, + 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, + 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, + 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, + 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, + 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, + 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, + 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, + 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, + 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, + 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, + 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, + 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, + 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, + 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, + 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, + 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, + 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, + 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, + 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, + 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, + 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, + 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, + 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, + 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, + 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, + 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, + 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, + 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, + 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, + 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, + 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, + 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, + 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, + 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, + 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, + 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, + 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, + 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, + 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, + 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, + 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, + 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, + 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, + 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, + 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, + 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, + 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, + 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, + 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, + 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, + 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, + 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, + 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, + 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, + 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, + 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, + 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, + 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, + 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, + 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, + 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, + 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, + 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, + 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, + 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, + 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, + 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, + 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, + 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, + 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, + 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, + 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, + 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, + 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, + 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, + 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, + 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, + 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, + 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, + 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, + 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, + 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, + 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, + 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, + 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, + 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, + 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, + 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, + 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, + 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, + 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, + 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, + 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, + 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, + 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, + 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, + 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, + 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, + 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, + 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, + 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, + 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, + 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, + 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, + 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, + 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, + 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, + 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, + 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, + 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, + 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, + 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, + 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, + 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, + 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, + 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, + 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, + 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, + 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, + 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, + 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, + 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, + 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, + 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, + 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, + 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, + 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, + 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, + 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, + 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, + 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, + 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, + 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, + 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, + 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, + 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, + 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, + 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, + 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, + 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, + 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, + 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, + 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, + 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, + 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, + 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, + 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, + 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, + 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, + 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, + 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, + 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, + 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, + 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, + 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, + 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, + 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, + 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, + 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, + 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, + 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, + 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, + 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, + 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, + 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, + 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, + 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, + 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, + 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, + 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, + 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, + 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, + 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, + 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, + 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, + 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, + 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, + 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, + 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, + 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, + 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, + 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, + 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, + 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, + 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, + 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, + 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, + 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, + 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, + 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, + 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, + 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, + 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, + 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, + 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, + 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, + 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, + 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, + 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, + 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, + 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, + 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, + 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, + 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, + 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, + 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, + 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, + 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, + 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, + 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, + 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, + 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, + 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, + 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, + 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, + 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, + 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, + 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, + 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, + 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, + 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, + 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, + 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, + 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, + 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, + 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, + 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, + 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, + 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, + 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, + 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, + 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, + 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, + 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, + 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, + 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, + 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, + 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, + 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, + 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, + 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, + 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, + 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, + 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, + 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, + 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, + 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, + 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, + 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, + 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, + 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, + 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, + 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, + 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, + 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, + 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, + 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, + 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, + 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, + 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, + 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, + 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, + 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, + 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, + 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, + 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, + 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, + 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, + 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, + 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, + 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, + 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, + 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, + 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, + 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, + 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, + 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, + 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, + 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, + 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, + 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, + 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, + 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, + 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, + 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, + 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, + 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, + 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, + 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, + 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, + 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, + 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, + 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, + 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, + 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, + 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, + 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, + 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, + 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, + 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, + 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, + 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, + 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, + 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, + 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, + 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, + 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, + 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, + 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, + 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, + 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, + 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, + 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, + 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, + 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, + 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, + 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, + 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, + 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, + 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, + 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, + 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, + 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, + 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, + 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, + 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, + 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, + 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, + 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, + 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, + 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, + 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, + 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, + 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, + 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, + 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, + 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, + 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, + 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, + 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, + 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, + 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, + 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, + 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, + 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, + 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, + 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, + 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, + 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, + 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, + 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, + 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, + 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, + 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, + 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, + 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, + 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, + 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, + 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, + 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, + 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, + 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, + 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, + 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, + 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, + 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, + 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, + 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, + 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, + 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, + 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, + 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, + 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, + 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, + 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, + 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, + 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, + 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, + 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, + 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, + 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, + 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, + 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, + 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, + 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, + 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, + 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, + 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, + 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, + 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, + 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, + 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, + 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, + 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, + 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, + 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, + 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, + 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, + 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, + 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, + 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, + 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, + 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, + 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, + 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, + 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, + 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, + 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, + 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, + 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, + 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, + 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, + 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, + 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, + 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, + 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, + 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, + 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, + 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, + 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, + 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, + 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, + 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, + 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, + 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, + 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, + 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, + 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, + 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, + 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, + 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, + 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, + 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, + 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, + 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, + 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, + 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, + 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, + 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, + 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, + 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, + 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, + 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, + 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, + 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, + 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, + 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, + 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, + 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, + 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, + 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, + 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, + 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, + 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, + 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, + 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, + 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, + 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, + 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, + 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, + 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, + 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, + 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, + 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, + 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, + 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, + 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, + 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, + 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, + 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, + 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, + 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, + 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, + 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, + 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, + 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, + 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, + 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, + 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, + 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, + 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, + 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, + 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, + 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, + 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, + 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, + 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, + 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, + 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, + 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, + 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, + 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, + 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, + 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, + 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, + 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, + 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, + 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, + 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, + 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, + 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, + 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, + 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, + 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, + 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, + 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, + 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, + 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, + 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, + 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, + 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, + 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, + 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, + 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, + 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, + 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, + 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, + 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, + 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, + 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, + 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, + 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, + 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, + 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, + 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, + 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, + 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, + 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, + 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, + 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, + 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, + 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, + 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, + 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, + 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, + 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, + 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, + 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, + 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, + 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, + 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, + 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, + 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, + 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, + 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, + 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, + 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, + 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, + 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, + 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, + 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, + 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, + 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, + 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, + 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, + 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, + 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, + 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, + 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, + 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, + 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, + 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, + 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, + 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, + 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, + 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, + 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, + 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, + 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, + 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, + 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, + 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, + 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, + 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, + 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, + 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, + 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, + 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, + 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, + 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, + 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, + 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, + 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, + 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, + 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, + 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, + 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, + 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, + 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, + 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, + 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, + 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, + 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, + 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, + 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, + 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, + 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, + 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, + 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, + 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, + 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, + 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, + 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, + 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, + 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, + 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, + 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, + 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, + 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, + 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, + 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, + 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, + 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, + 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, + 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, + 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, + 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, + 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, + 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, + 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, + 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, + 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, + 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, + 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, + 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, + 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, + 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, + 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, + 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, + 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, + 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, + 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, + 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, + 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, + 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, + 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, + 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, + 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, + 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, + 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, + 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, + 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, + 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, + 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, + 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, + 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, + 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, + 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, + 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, + 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, + 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, + 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, + 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, + 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, + 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, + 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, + 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, + 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, + 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, + 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, + 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, + 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, + 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, + 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, + 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, + 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, + 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, + 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, + 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, + 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, + 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, + 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, + 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, + 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, + 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, + 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, + 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, + 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, + 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, + 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, + 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, + 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, + 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, + 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, + 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, + 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, + 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, + 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, + 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, + 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, + 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, + 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, + 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, + 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, + 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, + 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, + 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, + 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, + 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, + 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, + 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, + 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, + 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, + 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, + 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, + 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, + 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, + 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, + 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, + 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, + 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, + 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, + 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, + 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, + 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, + 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, + 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, + 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, + 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, + 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, + 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, + 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, + 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, + 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, + 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, + 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, + 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, + 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, + 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, + 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, + 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, + 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, + 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, + 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, + 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, + 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, + 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, + 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, + 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, + 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, + 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, + 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, + 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, + 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, + 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, + 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, + 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, + 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, + 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, + 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, + 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, + 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, + 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, + 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, + 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, + 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, + 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, + 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, + 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, + 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, + 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, + 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, + 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, + 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, + 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, + 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, + 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, + 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, + 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, + 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, + 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, + 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, + 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, + 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, + 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, + 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, + 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, + 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, + 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, + 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, + 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, + 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, + 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, + 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, + 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, + 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, + 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, + 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, + 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, + 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, + 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, + 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, + 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, + 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, + 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, + 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, + 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, + 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, + 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, + 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, + 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, + 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, + 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, + 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, + 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, + 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, + 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, + 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, + 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, + 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, + 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, + 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, + 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, + 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, + 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, + 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, + 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, + 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, + 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, + 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, + 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, + 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, + 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, + 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, + 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, + 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, + 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, + 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, + 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, + 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, + 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, + 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, + 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, + 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, + 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, + 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, + 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, + 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, + 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, + 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, + 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, + 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, + 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, + 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, + 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, + 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, + 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, + 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, + 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, + 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, + 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, + 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, + 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, + 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, + 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, + 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, + 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, + 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, + 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, + 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, + 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, + 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, + 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, + 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, + 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, + 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, + 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, + 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, + 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, + 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, + 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, + 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, + 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, + 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, + 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, + 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, + 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, + 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, + 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, + 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, + 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, + 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, + 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, + 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, + 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, + 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, + 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, + 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, + 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, + 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, + 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, + 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, + 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, + 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, + 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, + 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, + 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, + 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, + 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, + 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, + 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, + 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, + 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, + 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, + 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, + 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, + 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, + 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, + 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, + 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, + 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, + 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, + 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, + 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, + 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, + 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, + 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, + 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, + 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, + 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, + 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, + 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, + 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, + 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, + 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, + 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, + 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, + 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, + 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, + 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, + 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, + 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, + 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, + 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, + 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, + 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, + 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, + 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, + 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, + 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, + 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, + 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, + 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, + 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, + 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, + 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, + 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, + 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, + 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, + 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, + 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, + 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, + 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, + 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, + 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, + 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, + 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, + 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, + 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, + 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, + 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, + 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, + 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, + 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, + 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, + 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, + 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, + 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, + 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, + 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, + 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, + 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, + 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, + 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, + 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, + 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, + 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, + 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, + 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, + 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, + 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, + 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, + 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, + 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, + 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, + 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, + 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, + 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, + 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, + 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, + 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, + 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, + 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, + 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, + 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, + 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, + 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, + 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, + 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, + 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, + 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, + 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, + 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, + 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, + 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, + 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, + 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, + 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, + 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, + 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, + 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, + 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, + 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, + 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, + 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, + 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, + 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, + 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, + 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, + 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, + 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, + 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, + 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, + 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, + 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, + 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, + 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, + 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, + 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, + 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, + 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, + 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, + 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, + 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, + 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, + 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, + 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, + 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, + 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, + 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, + 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, + 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, + 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, + 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, + 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, + 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, + 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, + 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, + 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, + 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, + 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, + 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, + 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, + 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, + 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, + 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, + 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, + 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, + 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, + 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, + 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, + 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, + 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, + 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, + 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, + 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, + 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, + 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, + 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, + 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, + 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, + 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, + 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, + 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, + 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, + 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, + 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, + 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, + 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, + 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, + 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, + 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, + 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, + 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, + 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, + 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, + 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, + 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, + 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, + 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, + 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, + 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, + 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, + 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, + 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, + 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, + 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, + 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, + 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, + 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, + 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, + 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, + 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, + 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, + 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, + 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, + 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, + 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, + 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, + 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, + 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, + 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, + 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, + 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, + 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, + 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, + 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, + 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, + 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, + 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, + 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, + 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, + 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, + 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, + 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, + 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, + 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, + 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, + 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, + 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, + 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, + 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, + 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, + 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, + 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, + 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, + 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, + 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, + 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, + 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, + 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, + 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, + 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, + 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, + 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, + 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, + 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, + 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, + 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, + 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, + 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, + 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, + 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, + 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, + 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, + 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, + 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, + 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, + 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, + 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, + 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, + 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, + 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, + 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, + 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, + 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, + 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, + 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, + 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, + 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, + 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, + 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, + 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, + 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, + 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, + 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, + 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, + 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, + 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, + 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, + 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, + 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, + 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, + 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, + 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, + 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, + 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, + 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, + 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, + 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, + 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, + 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, + 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, + 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, + 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, + 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, + 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, + 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, + 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, + 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, + 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, + 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, + 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, + 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, + 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, + 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, + 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, + 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, + 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, + 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, + 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, + 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, + 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, + 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, + 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, + 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, + 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, + 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, + 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, + 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, + 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, + 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, + 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, + 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, + 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, + 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, + 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, + 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, + 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, + 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, + 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, + 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, + 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, + 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, + 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, + 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, + 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, + 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, + 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, + 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, + 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, + 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, + 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, + 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, + 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, + 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, + 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, + 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, + 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, + 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, + 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, + 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, + 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, + 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, + 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, + 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, + 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, + 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, + 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, + 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, + 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, + 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, + 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, + 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, + 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, + 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, + 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, + 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, + 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, + 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, + 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, + 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, + 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, + 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, + 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, + 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, + 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, + 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, + 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, + 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, + 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, + 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, + 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, + 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, + 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, + 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, + 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, + 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, + 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, + 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, + 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, + 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, + 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, + 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, + 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, + 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, + 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, + 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, + 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, + 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, + 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, + 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, + 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, + 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, + 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, + 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, + 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, + 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, + 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, + 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, + 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, + 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, + 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, + 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, + 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, + 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, + 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, + 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, + 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, + 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, + 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, + 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, + 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, + 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, + 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, + 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, + 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, + 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, + 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, + 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, + 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, + 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, + 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, + 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, + 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, + 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, + 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, + 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, + 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, + 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, + 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, + 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, + 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, + 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, + 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, + 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, + 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, + 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, + 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, + 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, + 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, + 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, + 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, + 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, + 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, + 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, + 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, + 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, + 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, + 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, + 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, + 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, + 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, + 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, + 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, + 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, + 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, + 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, + 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, + 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, + 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, + 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, + 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, + 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, + 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, + 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, + 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, + 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, + 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, + 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, + 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, + 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, + 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, + 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, + 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, + 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, + 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, + 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, + 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, + 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, + 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, + 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, + 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, + 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, + 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, + 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, + 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, + 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, + 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, + 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, + 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, + 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, + 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, + 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, + 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, + 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, + 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, + 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, + 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, + 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, + 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, + 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, + 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, + 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, + 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, + 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, + 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, + 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, + 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, + 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, + 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, + 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, + 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, + 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, + 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, + 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, + 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, + 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, + 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, + 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, + 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, + 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, + 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, + 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, + 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, + 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, + 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, + 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, + 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, + 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, + 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, + 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, + 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, + 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, + 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, + 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, + 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, + 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, + 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, + 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, + 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, + 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, + 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, + 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, + 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, + 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, + 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, + 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, + 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, + 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, + 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, + 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, + 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, + 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, + 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, + 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, + 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, + 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, + 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, + 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, + 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, + 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, + 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, + 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, + 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, + 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, + 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, + 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, + 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, + 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, + 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, + 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, + 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, + 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, + 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, + 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, + 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, + 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, + 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, + 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, + 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, + 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, + 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, + 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, + 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, + 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, + 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, + 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, + 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, + 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, + 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, + 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, + 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, + 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, + 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, + 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, + 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, + 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, + 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, + 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, + 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, + 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, + 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, + 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, + 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, + 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, + 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, + 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, + 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, + 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, + 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, + 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, + 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, + 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, + 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, + 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, + 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, + 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, + 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, + 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, + 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, + 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, + 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, + 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, + 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, + 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, + 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, + 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, + 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, + 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, + 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, + 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, + 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, + 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, + 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, + 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, + 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, + 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, + 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, + 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, + 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, + 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, + 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, + 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, + 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, + 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, + 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, + 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, + 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, + 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, + 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, + 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, + 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, + 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, + 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, + 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, + 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, + 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, + 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, + 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, + 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, + 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, + 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, + 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, + 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, + 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, + 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, + 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, + 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, + 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, + 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, + 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, + 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, + 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, + 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, + 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, + 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, + 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, + 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, + 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, + 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, + 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, + 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, + 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, + 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, + 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, + 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, + 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, + 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, + 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, + 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, + 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, + 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, + 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, + 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, + 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, + 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, + 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, + 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, + 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, + 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, + 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, + 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, + 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, + 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, + 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, + 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, + 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, + 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, + 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, + 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, + 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, + 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, + 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, + 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, + 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, + 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, + 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, + 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, + 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, + 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, + 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, + 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, + 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, + 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, + 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, + 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, + 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, + 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, + 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, + 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, + 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, + 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, + 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, + 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, + 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, + 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, + 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, + 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, + 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, + 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, + 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, + 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, + 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, + 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, + 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, + 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, + 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, + 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, + 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, + 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, + 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, + 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, + 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, + 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, + 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, + 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, + 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, + 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, + 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, + 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, + 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, + 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, + 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, + 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, + 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, + 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, + 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, + 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, + 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, + 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, + 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, + 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, + 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, + 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, + 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, + 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, + 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, + 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, + 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, + 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, + 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, + 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, + 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, + 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, + 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, + 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, + 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, + 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, + 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, + 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, + 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, + 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, + 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, + 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, + 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, + 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, + 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, + 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, + 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, + 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, + 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, + 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, + 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, + 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, + 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, + 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, + 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, + 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, + 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, + 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, + 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, + 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, + 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, + 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, + 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, + 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, + 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, + 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, + 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, + 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, + 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, + 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, + 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, + 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, + 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, + 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, + 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, + 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, + 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, + 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, + 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, + 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, + 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, + 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, + 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, + 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, + 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, + 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, + 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, + 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, + 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, + 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, + 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, + 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, + 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, + 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, + 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, + 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, + 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, + 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, + 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, + 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, + 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, + 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, + 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, + 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, + 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, + 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, + 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, + 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, + 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, + 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, + 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, + 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, + 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, + 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, + 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, + 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, + 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, + 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, + 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, + 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, + 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, + 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, + 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, + 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, + 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, + 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, + 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, + 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, + 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, + 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, + 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, + 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, + 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, + 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, + 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, + 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, + 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, + 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, + 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, + 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, + 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, + 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, + 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, + 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, + 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, + 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, + 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, + 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, + 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, + 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, + 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, + 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, + 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, + 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, + 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, + 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, + 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, + 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, + 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, + 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, + 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, + 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, + 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, + 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, + 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, + 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, + 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, + 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, + 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, + 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, + 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, + 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, + 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, + 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, + 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, + 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, + 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, + 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, + 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, + 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, + 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, + 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, + 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, + 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, + 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, + 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, + 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, + 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, + 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, + 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, + 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, + 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, + 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, + 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, + 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, + 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, + 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, + 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, + 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, + 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, + 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, + 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, + 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, + 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, + 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, + 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, + 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, + 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, + 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, + 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, + 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, + 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, + 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, + 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, + 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, + 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, + 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, + 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, + 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, + 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, + 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, + 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, + 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, + 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, + 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, + 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, + 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, + 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, + 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, + 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, + 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, + 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, + 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, + 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, + 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, + 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, + 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, + 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, + 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, + 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, + 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, + 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, + 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, + 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, + 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, + 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, + 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, + 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, + 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, + 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, + 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, + 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, + 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, + 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, + 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, + 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, + 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, + 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, + 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, + 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, + 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, + 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, + 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, + 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, + 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, + 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, + 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, + 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, + 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, + 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, + 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, + 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, + 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, + 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, + 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, + 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, + 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, + 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, + 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, + 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, + 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, + 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, + 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, + 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, + 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, + 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, + 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, + 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, + 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, + 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, + 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, + 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, + 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, + 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, + 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, + 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, + 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, + 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, + 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, + 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, + 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, + 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, + 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, + 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, + 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, + 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, + 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, + 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, + 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, + 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, + 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, + 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, + 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, + 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, + 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, + 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, + 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, + 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, + 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, + 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, + 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, + 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, + 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, + 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, + 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, + 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, + 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, + 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, + 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, + 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, + 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, + 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, + 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, + 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, + 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, + 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, + 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, + 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, + 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, + 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, + 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, + 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, + 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, + 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, + 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, + 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, + 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, + 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, + 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, + 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, + 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, + 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, + 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, + 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, + 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, + 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, + 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, + 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, + 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, + 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, + 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, + 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, + 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, + 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, + 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, + 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, + 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, + 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, + 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, + 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, + 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, + 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, + 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, + 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, + 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, + 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, + 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, + 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, + 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, + 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, + 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, + 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, + 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, + 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, + 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, + 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, + 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, + 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, + 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, + 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, + 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, + 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, + 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, + 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, + 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, + 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, + 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, + 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, + 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, + 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, + 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, + 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, + 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, + 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, + 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, + 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, + 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, + 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, + 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, + 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, + 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, + 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, + 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, + 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, + 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, + 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, + 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, + 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, + 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, + 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, + 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, + 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, + 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, + 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, + 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, + 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, + 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, + 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, + 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, + 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, + 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, + 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, + 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, + 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, + 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, + 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, + 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, + 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, + 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, + 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, + 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, + 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, + 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, + 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, + 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, + 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, + 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, + 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, + 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, + 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, + 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, + 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, + 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, + 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, + 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, + 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, + 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, + 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, + 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, + 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, + 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, + 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, + 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, + 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, + 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, + 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, + 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, + 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, + 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, + 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, + 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, + 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, + 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, + 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, + 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, + 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, + 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, + 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, + 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, + 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, + 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, + 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, + 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, + 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, + 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, + 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, + 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, + 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, + 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, + 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, + 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, + 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, + 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, + 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, + 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, + 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, + 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, + 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, + 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, + 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, + 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, + 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, + 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, + 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, + 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, + 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, + 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, + 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, + 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, + 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, + 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, + 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, + 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, + 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, + 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, + 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, + 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, + 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, + 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, + 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, + 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, + 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, + 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, + 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, + 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, + 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, + 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, + 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, + 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, + 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, + 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, + 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, + 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, + 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, + 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, + 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, + 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, + 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, + 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, + 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, + 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, + 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, + 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, + 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, + 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, + 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, + 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, + 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, + 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, + 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, + 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, + 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, + 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, + 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, + 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, + 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, + 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, + 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, + 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, + 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, + 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, + 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, + 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, + 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, + 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, + 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, + 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, + 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, + 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, + 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, + 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, + 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, + 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEM code to unicode */ + p = oem2uni; + hi = sizeof oem2uni / 4 - 1; + } else { /* Unicode to OEM code */ + p = uni2oem; + hi = sizeof uni2oem / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted (BMP only) */ +) +{ + /* Compressed upper conversion table */ + static const WCHAR cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WCHAR cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF2,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WCHAR *p; + WCHAR bc, nc, cmd; + + + p = chr < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || chr < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (chr < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: chr = p[chr - bc]; break; /* Table conversion */ + case 1: chr -= (chr - bc) & 1; break; /* Case pairs */ + case 2: chr -= 16; break; /* Shift -16 */ + case 3: chr -= 32; break; /* Shift -32 */ + case 4: chr -= 48; break; /* Shift -48 */ + case 5: chr -= 26; break; /* Shift -26 */ + case 6: chr += 8; break; /* Shift +8 */ + case 7: chr -= 80; break; /* Shift -80 */ + case 8: chr -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + + return chr; +} + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/cc949.c b/Firmware/WIMU3/Libraries/FatFs/src/option/cc949.c new file mode 100644 index 0000000..c3aa7c7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/cc949.c @@ -0,0 +1,8674 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ +/* CP949 (Korean EUC-KR) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 949 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, + 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, + 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, + 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, + 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, + 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, + 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, + 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, + 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, + 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, + 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, + 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, + 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, + 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, + 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, + 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, + 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, + 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, + 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, + 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, + 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, + 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, + 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, + 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, + 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, + 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, + 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, + 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, + 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, + 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, + 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, + 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, + 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, + 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, + 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, + 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, + 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, + 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, + 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, + 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, + 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, + 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, + 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, + 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, + 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, + 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, + 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, + 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, + 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, + 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, + 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, + 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, + 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, + 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, + 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, + 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, + 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, + 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, + 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, + 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, + 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, + 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, + 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, + 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, + 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, + 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, + 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, + 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, + 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, + 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, + 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, + 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, + 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, + 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, + 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, + 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, + 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, + 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, + 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, + 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, + 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, + 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, + 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, + 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, + 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, + 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, + 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, + 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, + 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, + 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, + 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, + 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, + 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, + 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, + 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, + 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, + 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, + 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, + 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, + 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, + 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, + 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, + 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, + 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, + 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, + 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, + 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, + 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, + 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, + 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, + 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, + 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, + 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, + 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, + 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, + 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, + 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, + 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, + 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, + 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, + 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, + 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, + 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, + 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, + 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, + 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, + 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, + 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, + 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, + 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, + 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, + 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, + 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, + 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, + 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, + 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, + 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, + 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, + 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, + 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, + 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, + 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, + 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, + 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, + 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, + 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, + 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, + 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, + 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, + 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, + 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, + 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, + 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, + 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, + 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, + 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, + 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, + 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, + 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, + 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, + 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, + 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, + 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, + 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, + 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, + 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, + 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, + 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, + 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, + 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, + 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, + 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, + 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, + 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, + 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, + 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, + 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, + 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, + 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, + 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, + 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, + 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, + 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, + 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, + 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, + 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, + 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, + 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, + 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, + 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, + 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, + 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, + 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, + 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, + 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, + 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, + 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, + 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, + 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, + 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, + 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, + 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, + 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, + 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, + 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, + 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, + 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, + 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, + 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, + 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, + 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, + 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, + 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, + 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, + 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, + 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, + 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, + 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, + 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, + 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, + 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, + 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, + 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, + 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, + 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, + 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, + 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, + 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, + 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, + 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, + 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, + 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, + 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, + 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, + 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, + 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, + 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, + 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, + 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, + 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, + 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, + 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, + 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, + 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, + 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, + 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, + 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, + 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, + 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, + 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, + 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, + 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, + 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, + 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, + 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, + 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, + 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, + 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, + 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, + 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, + 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, + 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, + 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, + 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, + 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, + 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, + 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, + 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, + 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, + 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, + 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, + 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, + 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, + 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, + 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, + 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, + 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, + 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, + 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, + 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, + 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, + 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, + 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, + 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, + 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, + 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, + 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, + 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, + 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, + 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, + 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, + 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, + 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, + 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, + 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, + 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, + 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, + 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, + 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, + 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, + 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, + 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, + 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, + 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, + 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, + 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, + 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, + 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, + 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, + 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, + 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, + 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, + 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, + 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, + 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, + 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, + 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, + 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, + 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, + 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, + 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, + 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, + 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, + 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, + 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, + 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, + 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, + 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, + 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, + 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, + 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, + 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, + 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, + 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, + 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, + 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, + 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, + 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, + 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, + 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, + 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, + 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, + 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, + 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, + 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, + 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, + 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, + 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, + 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, + 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, + 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, + 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, + 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, + 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, + 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, + 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, + 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, + 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, + 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, + 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, + 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, + 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, + 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, + 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, + 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, + 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, + 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, + 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, + 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, + 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, + 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, + 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, + 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, + 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, + 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, + 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, + 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, + 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, + 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, + 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, + 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, + 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, + 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, + 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, + 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, + 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, + 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, + 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, + 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, + 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, + 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, + 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, + 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, + 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, + 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, + 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, + 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, + 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, + 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, + 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, + 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, + 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, + 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, + 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, + 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, + 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, + 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, + 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, + 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, + 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, + 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, + 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, + 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, + 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, + 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, + 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, + 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, + 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, + 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, + 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, + 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, + 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, + 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, + 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, + 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, + 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, + 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, + 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, + 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, + 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, + 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, + 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, + 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, + 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, + 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, + 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, + 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, + 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, + 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, + 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, + 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, + 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, + 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, + 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, + 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, + 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, + 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, + 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, + 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, + 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, + 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, + 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, + 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, + 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, + 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, + 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, + 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, + 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, + 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, + 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, + 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, + 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, + 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, + 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, + 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, + 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, + 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, + 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, + 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, + 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, + 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, + 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, + 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, + 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, + 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, + 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, + 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, + 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, + 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, + 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, + 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, + 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, + 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, + 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, + 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, + 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, + 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, + 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, + 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, + 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, + 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, + 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, + 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, + 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, + 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, + 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, + 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, + 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, + 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, + 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, + 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, + 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, + 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, + 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, + 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, + 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, + 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, + 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, + 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, + 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, + 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, + 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, + 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, + 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, + 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, + 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, + 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, + 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, + 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, + 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, + 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, + 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, + 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, + 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, + 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, + 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, + 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, + 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, + 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, + 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, + 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, + 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, + 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, + 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, + 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, + 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, + 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, + 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, + 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, + 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, + 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, + 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, + 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, + 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, + 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, + 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, + 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, + 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, + 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, + 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, + 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, + 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, + 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, + 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, + 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, + 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, + 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, + 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, + 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, + 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, + 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, + 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, + 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, + 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, + 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, + 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, + 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, + 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, + 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, + 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, + 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, + 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, + 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, + 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, + 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, + 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, + 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, + 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, + 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, + 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, + 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, + 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, + 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, + 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, + 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, + 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, + 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, + 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, + 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, + 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, + 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, + 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, + 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, + 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, + 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, + 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, + 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, + 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, + 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, + 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, + 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, + 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, + 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, + 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, + 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, + 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, + 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, + 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, + 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, + 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, + 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, + 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, + 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, + 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, + 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, + 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, + 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, + 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, + 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, + 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, + 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, + 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, + 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, + 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, + 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, + 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, + 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, + 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, + 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, + 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, + 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, + 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, + 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, + 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, + 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, + 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, + 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, + 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, + 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, + 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, + 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, + 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, + 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, + 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, + 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, + 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, + 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, + 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, + 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, + 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, + 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, + 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, + 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, + 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, + 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, + 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, + 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, + 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, + 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, + 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, + 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, + 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, + 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, + 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, + 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, + 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, + 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, + 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, + 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, + 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, + 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, + 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, + 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, + 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, + 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, + 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, + 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, + 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, + 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, + 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, + 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, + 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, + 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, + 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, + 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, + 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, + 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, + 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, + 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, + 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, + 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, + 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, + 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, + 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, + 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, + 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, + 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, + 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, + 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, + 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, + 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, + 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, + 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, + 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, + 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, + 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, + 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, + 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, + 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, + 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, + 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, + 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, + 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, + 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, + 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, + 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, + 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, + 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, + 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, + 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, + 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, + 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, + 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, + 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, + 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, + 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, + 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, + 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, + 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, + 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, + 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, + 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, + 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, + 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, + 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, + 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, + 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, + 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, + 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, + 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, + 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, + 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, + 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, + 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, + 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, + 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, + 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, + 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, + 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, + 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, + 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, + 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, + 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, + 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, + 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, + 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, + 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, + 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, + 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, + 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, + 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, + 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, + 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, + 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, + 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, + 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, + 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, + 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, + 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, + 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, + 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, + 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, + 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, + 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, + 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, + 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, + 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, + 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, + 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, + 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, + 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, + 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, + 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, + 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, + 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, + 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, + 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, + 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, + 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, + 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, + 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, + 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, + 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, + 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, + 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, + 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, + 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, + 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, + 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, + 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, + 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, + 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, + 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, + 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, + 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, + 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, + 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, + 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, + 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, + 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, + 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, + 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, + 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, + 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, + 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, + 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, + 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, + 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, + 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, + 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, + 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, + 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, + 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, + 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, + 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, + 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, + 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, + 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, + 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, + 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, + 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, + 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, + 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, + 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, + 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, + 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, + 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, + 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, + 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, + 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, + 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, + 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, + 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, + 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, + 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, + 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, + 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, + 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, + 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, + 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, + 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, + 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, + 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, + 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, + 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, + 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, + 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, + 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, + 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, + 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, + 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, + 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, + 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, + 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, + 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, + 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, + 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, + 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, + 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, + 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, + 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, + 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, + 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, + 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, + 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, + 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, + 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, + 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, + 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, + 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, + 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, + 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, + 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, + 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, + 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, + 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, + 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, + 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, + 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, + 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, + 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, + 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, + 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, + 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, + 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, + 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, + 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, + 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, + 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, + 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, + 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, + 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, + 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, + 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, + 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, + 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, + 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, + 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, + 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, + 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, + 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, + 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, + 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, + 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, + 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, + 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, + 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, + 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, + 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, + 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, + 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, + 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, + 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, + 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, + 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, + 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, + 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, + 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, + 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, + 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, + 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, + 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, + 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, + 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, + 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, + 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, + 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, + 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, + 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, + 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, + 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, + 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, + 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, + 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, + 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, + 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, + 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, + 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, + 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, + 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, + 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, + 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, + 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, + 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, + 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, + 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, + 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, + 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, + 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, + 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, + 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, + 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, + 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, + 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, + 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, + 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, + 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, + 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, + 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, + 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, + 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, + 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, + 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, + 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, + 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, + 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, + 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, + 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, + 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, + 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, + 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, + 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, + 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, + 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, + 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, + 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, + 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, + 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, + 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, + 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, + 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, + 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, + 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, + 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, + 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, + 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, + 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, + 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, + 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, + 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, + 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, + 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, + 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, + 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, + 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, + 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, + 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, + 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, + 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, + 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, + 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, + 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, + 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, + 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, + 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, + 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, + 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, + 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, + 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, + 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, + 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, + 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, + 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, + 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, + 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, + 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, + 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, + 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, + 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, + 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, + 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, + 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, + 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, + 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, + 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, + 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, + 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, + 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, + 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, + 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, + 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, + 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, + 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, + 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, + 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, + 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, + 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, + 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, + 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, + 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, + 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, + 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, + 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, + 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, + 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, + 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, + 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, + 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, + 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, + 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, + 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, + 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, + 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, + 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, + 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, + 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, + 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, + 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, + 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, + 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, + 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, + 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, + 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, + 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, + 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, + 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, + 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, + 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, + 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, + 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, + 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, + 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, + 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, + 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, + 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, + 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, + 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, + 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, + 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, + 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, + 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, + 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, + 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, + 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, + 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, + 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, + 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, + 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, + 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, + 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, + 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, + 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, + 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, + 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, + 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, + 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, + 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, + 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, + 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, + 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, + 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, + 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, + 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, + 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, + 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, + 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, + 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, + 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, + 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, + 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, + 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, + 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, + 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, + 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, + 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, + 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, + 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, + 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, + 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, + 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, + 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, + 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, + 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, + 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, + 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, + 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, + 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, + 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, + 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, + 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, + 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, + 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, + 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, + 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, + 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, + 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, + 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, + 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, + 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, + 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, + 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, + 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, + 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, + 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, + 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, + 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, + 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, + 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, + 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, + 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, + 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, + 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, + 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, + 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, + 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, + 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, + 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, + 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, + 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, + 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, + 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, + 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, + 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, + 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, + 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, + 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, + 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, + 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, + 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, + 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, + 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, + 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, + 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, + 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, + 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, + 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, + 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, + 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, + 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, + 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, + 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, + 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, + 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, + 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, + 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, + 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, + 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, + 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, + 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, + 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, + 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, + 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, + 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, + 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, + 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, + 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, + 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, + 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, + 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, + 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, + 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, + 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, + 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, + 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, + 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, + 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, + 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, + 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, + 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, + 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, + 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, + 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, + 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, + 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, + 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, + 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, + 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, + 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, + 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, + 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, + 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, + 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, + 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, + 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, + 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, + 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, + 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, + 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, + 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, + 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, + 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, + 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, + 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, + 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, + 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, + 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, + 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, + 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, + 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, + 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, + 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, + 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, + 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, + 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, + 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, + 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, + 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, + 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, + 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, + 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, + 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, + 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, + 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, + 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, + 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, + 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, + 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, + 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, + 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, + 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, + 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, + 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, + 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, + 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, + 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, + 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, + 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, + 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, + 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, + 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, + 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, + 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, + 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, + 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, + 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, + 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, + 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, + 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, + 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, + 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, + 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, + 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, + 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, + 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, + 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, + 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, + 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, + 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, + 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, + 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, + 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, + 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, + 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, + 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, + 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, + 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, + 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, + 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, + 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, + 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, + 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, + 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, + 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, + 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, + 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, + 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, + 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, + 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, + 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, + 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, + 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, + 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, + 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, + 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, + 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, + 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, + 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, + 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, + 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, + 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, + 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, + 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, + 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, + 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, + 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, + 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, + 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, + 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, + 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, + 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, + 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, + 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, + 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, + 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, + 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, + 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, + 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, + 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, + 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, + 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, + 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, + 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, + 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, + 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, + 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, + 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, + 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, + 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, + 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, + 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, + 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, + 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, + 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, + 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, + 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, + 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, + 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, + 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, + 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, + 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, + 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, + 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, + 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, + 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, + 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, + 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, + 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, + 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, + 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, + 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, + 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, + 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, + 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, + 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, + 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, + 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, + 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, + 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, + 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, + 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, + 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, + 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, + 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, + 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, + 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, + 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, + 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, + 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, + 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, + 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, + 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, + 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, + 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, + 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, + 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, + 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, + 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, + 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, + 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, + 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, + 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, + 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, + 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, + 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, + 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, + 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, + 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, + 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, + 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, + 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, + 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, + 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, + 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, + 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, + 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, + 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, + 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, + 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, + 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, + 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, + 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, + 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, + 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, + 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, + 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, + 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, + 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, + 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, + 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, + 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, + 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, + 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, + 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, + 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, + 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, + 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, + 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, + 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, + 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, + 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, + 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, + 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, + 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, + 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, + 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, + 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, + 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, + 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, + 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, + 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, + 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, + 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, + 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, + 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, + 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, + 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, + 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, + 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, + 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, + 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, + 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, + 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, + 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, + 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, + 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, + 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, + 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, + 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, + 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, + 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, + 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, + 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, + 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, + 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, + 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, + 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, + 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, + 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, + 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, + 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, + 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, + 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, + 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, + 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, + 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, + 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, + 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, + 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, + 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, + 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, + 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, + 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, + 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, + 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, + 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, + 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, + 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, + 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, + 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, + 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, + 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, + 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, + 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, + 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, + 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, + 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, + 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, + 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, + 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, + 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, + 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, + 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, + 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, + 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, + 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, + 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, + 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, + 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, + 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, + 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, + 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, + 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, + 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, + 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, + 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, + 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, + 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, + 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, + 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, + 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, + 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, + 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, + 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, + 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, + 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, + 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, + 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, + 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, + 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, + 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, + 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, + 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, + 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, + 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, + 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, + 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, + 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, + 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, + 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, + 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, + 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, + 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, + 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, + 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, + 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, + 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, + 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, + 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, + 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, + 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, + 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, + 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, + 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, + 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, + 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, + 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, + 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, + 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, + 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, + 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, + 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, + 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, + 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, + 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, + 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, + 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, + 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, + 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, + 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, + 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, + 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, + 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, + 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, + 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, + 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, + 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, + 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, + 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, + 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, + 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, + 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, + 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, + 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, + 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, + 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, + 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, + 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, + 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, + 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, + 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, + 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, + 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, + 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, + 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, + 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, + 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, + 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, + 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, + 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, + 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, + 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, + 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, + 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, + 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, + 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, + 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, + 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, + 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, + 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, + 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, + 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, + 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, + 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, + 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, + 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, + 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, + 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, + 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, + 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, + 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, + 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, + 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, + 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, + 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, + 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, + 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, + 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, + 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, + 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, + 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, + 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, + 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, + 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, + 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, + 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, + 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, + 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, + 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, + 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, + 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, + 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, + 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, + 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, + 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, + 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, + 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, + 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, + 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, + 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, + 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, + 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, + 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, + 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, + 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, + 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, + 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, + 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, + 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, + 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, + 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, + 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, + 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, + 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, + 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, + 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, + 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, + 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, + 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, + 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, + 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, + 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, + 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, + 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, + 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, + 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, + 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, + 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, + 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, + 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, + 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, + 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, + 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, + 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, + 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, + 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, + 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, + 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, + 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, + 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, + 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, + 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, + 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, + 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, + 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, + 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, + 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, + 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, + 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, + 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, + 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, + 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, + 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, + 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, + 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, + 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, + 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, + 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, + 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, + 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, + 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, + 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, + 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, + 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, + 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, + 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, + 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, + 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, + 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, + 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, + 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, + 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, + 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, + 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, + 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, + 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, + 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, + 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, + 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, + 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, + 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, + 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, + 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, + 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, + 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, + 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, + 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, + 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, + 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, + 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, + 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, + 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, + 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, + 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, + 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, + 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, + 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, + 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, + 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, + 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, + 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, + 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, + 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, + 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, + 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, + 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, + 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, + 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, + 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, + 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, + 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, + 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, + 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, + 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, + 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, + 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, + 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, + 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, + 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, + 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, + 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, + 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, + 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, + 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, + 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, + 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, + 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, + 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, + 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, + 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, + 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, + 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, + 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, + 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, + 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, + 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, + 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, + 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, + 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, + 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, + 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, + 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, + 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, + 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, + 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, + 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, + 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, + 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, + 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, + 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, + 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, + 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, + 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, + 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, + 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, + 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, + 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, + 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, + 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, + 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, + 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, + 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, + 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, + 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, + 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, + 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, + 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, + 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, + 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, + 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, + 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, + 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, + 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, + 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, + 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, + 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, + 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, + 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, + 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, + 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, + 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, + 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, + 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, + 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, + 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, + 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, + 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, + 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, + 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, + 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, + 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, + 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, + 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, + 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, + 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, + 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, + 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, + 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, + 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, + 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, + 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, + 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, + 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, + 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, + 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, + 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, + 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, + 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, + 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, + 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, + 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, + 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, + 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, + 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, + 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, + 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, + 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, + 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, + 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, + 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, + 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, + 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, + 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, + 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, + 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, + 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, + 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, + 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, + 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, + 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, + 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, + 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, + 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, + 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, + 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, + 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, + 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, + 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, + 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, + 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, + 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, + 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, + 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, + 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, + 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, + 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, + 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, + 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, + 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, + 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, + 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, + 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, + 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, + 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, + 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, + 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, + 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, + 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, + 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, + 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, + 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, + 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, + 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, + 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, + 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, + 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, + 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, + 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, + 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, + 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, + 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, + 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, + 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, + 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, + 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, + 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, + 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, + 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, + 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, + 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, + 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, + 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, + 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, + 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, + 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, + 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, + 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, + 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, + 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, + 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, + 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, + 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, + 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, + 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, + 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, + 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, + 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, + 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, + 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, + 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, + 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, + 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, + 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, + 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, + 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, + 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, + 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, + 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, + 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, + 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, + 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, + 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, + 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, + 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, + 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, + 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, + 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, + 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, + 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, + 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, + 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, + 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, + 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, + 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, + 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, + 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, + 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, + 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, + 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, + 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, + 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, + 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, + 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, + 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, + 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, + 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, + 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, + 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, + 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, + 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, + 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, + 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, + 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, + 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, + 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, + 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, + 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, + 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, + 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, + 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, + 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, + 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, + 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, + 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, + 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, + 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, + 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, + 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, + 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, + 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, + 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, + 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, + 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, + 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, + 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, + 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, + 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, + 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, + 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, + 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, + 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, + 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, + 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, + 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, + 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, + 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, + 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, + 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, + 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, + 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, + 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, + 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, + 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, + 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, + 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, + 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, + 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, + 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, + 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, + 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, + 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, + 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, + 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, + 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, + 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, + 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, + 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, + 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, + 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, + 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, + 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, + 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, + 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, + 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, + 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, + 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, + 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, + 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, + 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, + 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, + 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, + 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, + 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, + 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, + 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, + 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, + 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, + 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, + 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, + 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, + 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, + 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, + 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, + 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, + 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, + 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, + 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, + 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, + 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, + 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, + 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, + 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, + 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, + 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, + 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, + 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, + 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, + 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, + 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, + 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, + 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, + 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, + 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, + 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, + 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, + 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, + 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, + 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, + 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, + 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, + 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, + 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, + 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, + 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, + 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, + 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, + 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, + 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, + 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, + 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, + 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, + 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, + 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, + 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, + 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, + 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, + 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, + 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, + 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, + 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, + 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, + 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, + 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, + 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, + 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, + 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, + 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, + 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, + 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, + 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, + 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, + 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, + 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, + 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, + 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, + 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, + 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, + 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, + 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, + 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, + 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, + 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, + 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, + 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, + 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, + 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, + 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, + 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, + 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, + 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, + 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, + 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, + 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, + 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, + 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, + 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, + 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, + 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, + 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, + 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, + 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, + 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, + 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, + 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, + 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, + 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, + 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, + 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, + 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, + 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, + 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, + 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, + 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, + 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, + 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, + 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, + 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, + 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, + 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, + 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, + 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, + 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, + 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, + 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, + 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, + 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, + 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, + 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, + 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, + 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, + 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, + 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, + 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, + 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, + 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, + 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, + 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, + 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, + 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, + 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, + 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, + 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, + 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, + 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, + 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, + 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, + 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, + 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, + 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, + 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, + 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, + 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, + 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, + 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, + 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, + 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, + 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, + 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, + 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, + 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, + 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, + 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, + 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, + 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, + 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, + 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, + 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, + 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, + 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, + 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, + 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, + 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, + 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, + 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, + 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, + 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, + 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, + 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, + 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, + 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, + 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, + 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, + 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, + 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, + 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, + 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, + 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, + 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, + 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, + 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, + 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, + 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, + 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, + 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, + 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, + 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, + 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, + 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, + 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, + 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, + 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, + 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, + 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, + 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, + 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, + 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, + 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, + 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, + 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, + 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, + 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, + 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, + 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, + 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, + 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, + 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, + 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, + 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, + 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, + 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, + 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, + 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, + 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, + 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, + 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, + 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, + 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, + 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, + 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, + 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, + 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, + 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, + 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, + 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, + 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, + 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, + 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, + 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, + 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, + 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, + 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, + 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, + 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, + 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, + 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, + 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, + 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, + 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, + 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, + 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, + 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, + 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, + 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, + 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, + 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, + 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, + 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, + 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, + 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, + 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, + 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, + 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, + 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, + 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, + 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, + 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, + 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, + 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, + 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, + 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, + 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, + 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, + 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, + 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, + 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, + 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, + 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, + 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, + 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, + 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, + 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, + 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, + 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, + 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, + 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, + 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, + 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, + 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, + 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, + 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, + 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, + 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, + 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, + 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, + 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, + 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, + 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, + 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, + 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, + 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, + 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, + 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, + 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, + 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, + 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, + 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, + 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, + 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, + 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, + 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, + 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, + 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, + 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, + 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, + 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, + 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, + 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, + 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, + 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, + 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, + 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, + 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, + 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, + 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, + 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, + 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, + 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, + 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, + 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, + 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, + 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, + 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, + 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, + 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, + 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, + 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, + 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, + 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, + 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, + 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, + 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, + 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, + 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, + 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, + 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, + 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, + 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, + 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, + 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, + 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, + 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, + 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, + 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, + 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, + 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, + 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, + 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, + 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, + 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, + 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, + 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, + 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, + 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, + 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, + 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, + 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, + 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, + 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, + 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, + 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, + 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, + 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, + 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, + 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, + 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, + 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, + 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, + 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, + 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, + 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, + 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, + 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, + 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, + 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, + 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, + 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, + 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, + 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, + 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, + 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, + 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, + 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, + 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, + 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, + 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, + 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, + 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, + 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, + 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, + 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, + 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, + 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, + 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, + 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, + 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, + 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, + 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, + 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, + 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, + 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, + 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, + 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, + 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, + 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, + 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, + 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, + 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, + 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, + 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, + 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, + 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, + 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, + 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, + 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, + 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, + 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, + 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, + 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, + 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, + 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, + 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, + 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, + 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, + 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, + 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, + 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, + 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, + 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, + 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, + 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, + 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, + 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, + 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, + 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, + 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, + 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, + 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, + 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, + 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, + 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, + 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, + 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, + 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, + 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, + 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, + 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, + 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, + 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, + 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, + 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, + 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, + 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, + 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, + 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, + 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, + 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, + 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, + 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, + 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, + 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, + 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, + 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, + 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, + 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, + 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, + 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, + 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, + 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, + 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, + 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, + 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, + 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, + 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, + 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, + 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, + 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, + 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, + 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, + 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, + 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, + 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, + 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, + 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, + 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, + 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, + 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, + 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, + 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, + 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, + 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, + 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, + 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, + 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, + 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, + 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, + 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, + 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, + 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, + 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, + 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, + 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, + 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, + 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, + 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, + 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, + 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, + 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, + 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, + 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, + 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, + 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, + 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, + 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, + 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, + 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, + 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, + 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, + 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, + 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, + 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, + 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, + 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, + 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, + 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, + 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, + 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, + 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, + 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, + 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, + 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, + 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, + 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, + 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, + 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, + 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, + 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, + 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, + 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, + 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, + 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, + 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, + 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, + 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, + 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, + 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, + 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, + 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, + 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, + 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, + 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, + 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, + 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, + 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, + 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, + 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, + 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, + 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, + 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, + 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, + 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, + 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, + 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, + 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, + 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, + 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, + 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, + 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, + 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, + 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, + 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, + 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, + 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, + 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, + 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, + 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, + 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, + 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, + 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, + 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, + 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, + 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, + 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, + 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, + 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, + 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, + 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, + 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, + 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, + 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, + 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, + 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, + 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, + 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, + 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, + 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, + 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, + 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, + 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, + 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, + 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, + 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, + 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, + 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, + 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, + 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, + 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, + 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, + 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, + 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, + 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, + 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, + 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, + 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, + 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, + 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, + 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, + 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, + 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, + 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, + 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, + 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, + 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, + 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, + 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, + 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, + 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, + 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, + 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, + 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, + 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, + 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, + 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, + 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, + 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, + 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, + 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, + 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, + 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, + 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, + 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, + 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, + 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, + 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, + 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, + 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, + 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, + 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, + 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, + 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, + 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, + 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, + 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, + 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, + 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, + 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, + 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, + 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, + 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, + 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, + 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, + 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, + 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, + 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, + 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, + 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, + 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, + 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, + 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, + 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, + 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, + 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, + 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, + 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, + 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, + 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, + 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, + 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, + 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, + 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, + 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, + 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, + 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, + 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, + 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, + 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, + 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, + 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, + 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, + 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, + 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, + 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, + 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, + 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, + 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, + 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, + 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, + 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, + 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, + 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, + 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, + 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, + 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, + 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, + 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, + 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, + 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, + 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, + 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, + 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, + 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, + 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, + 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, + 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, + 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, + 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, + 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, + 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, + 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, + 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, + 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, + 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, + 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, + 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, + 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, + 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, + 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, + 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, + 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, + 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, + 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, + 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, + 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, + 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, + 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, + 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, + 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, + 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, + 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, + 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, + 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, + 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, + 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, + 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, + 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, + 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, + 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, + 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, + 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, + 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, + 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, + 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, + 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, + 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, + 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, + 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, + 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, + 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, + 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, + 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, + 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, + 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, + 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, + 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, + 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, + 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, + 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, + 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, + 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, + 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, + 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, + 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, + 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, + 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, + 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, + 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, + 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, + 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, + 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, + 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, + 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, + 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, + 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, + 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, + 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, + 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, + 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, + 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, + 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, + 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, + 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, + 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, + 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, + 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, + 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, + 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, + 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, + 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, + 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, + 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, + 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, + 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, + 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, + 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, + 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, + 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, + 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, + 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, + 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, + 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, + 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, + 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, + 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, + 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, + 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, + 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, + 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, + 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, + 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, + 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, + 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, + 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, + 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, + 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, + 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, + 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, + 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, + 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, + 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, + 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, + 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, + 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, + 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, + 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, + 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, + 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, + 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, + 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, + 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, + 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, + 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, + 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, + 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, + 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, + 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, + 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, + 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, + 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, + 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, + 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, + 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, + 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, + 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, + 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, + 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, + 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, + 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, + 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, + 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, + 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, + 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, + 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, + 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, + 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, + 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, + 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, + 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, + 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, + 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, + 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, + 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, + 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, + 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, + 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, + 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, + 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, + 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, + 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, + 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, + 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, + 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, + 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, + 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, + 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, + 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, + 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, + 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, + 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, + 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, + 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, + 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, + 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, + 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, + 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, + 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, + 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, + 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, + 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, + 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, + 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, + 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, + 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, + 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, + 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, + 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, + 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, + 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, + 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, + 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, + 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, + 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, + 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, + 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, + 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, + 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, + 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, + 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, + 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, + 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, + 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, + 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, + 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, + 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, + 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, + 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, + 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, + 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, + 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, + 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, + 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, + 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, + 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, + 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, + 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, + 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, + 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, + 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, + 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, + 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, + 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, + 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, + 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, + 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, + 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, + 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, + 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, + 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, + 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, + 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, + 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, + 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, + 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, + 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, + 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, + 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, + 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, + 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, + 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, + 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, + 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, + 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, + 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, + 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, + 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, + 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, + 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, + 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, + 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, + 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, + 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, + 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, + 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, + 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, + 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, + 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, + 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, + 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, + 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, + 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, + 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, + 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, + 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, + 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, + 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, + 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, + 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, + 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, + 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, + 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, + 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, + 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, + 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, + 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, + 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, + 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, + 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, + 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, + 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, + 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, + 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, + 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, + 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, + 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, + 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, + 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, + 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, + 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, + 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, + 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, + 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, + 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, + 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, + 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, + 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, + 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, + 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, + 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, + 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, + 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, + 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, + 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, + 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, + 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, + 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, + 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, + 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, + 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, + 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, + 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, + 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, + 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, + 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, + 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, + 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, + 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, + 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, + 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, + 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, + 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, + 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, + 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, + 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, + 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, + 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, + 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, + 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, + 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, + 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, + 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, + 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, + 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, + 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, + 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, + 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, + 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, + 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, + 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, + 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, + 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, + 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, + 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, + 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, + 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, + 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, + 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, + 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, + 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, + 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, + 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, + 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, + 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, + 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, + 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, + 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, + 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, + 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, + 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, + 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, + 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, + 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, + 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, + 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, + 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, + 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, + 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, + 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, + 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, + 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, + 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, + 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, + 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, + 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, + 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, + 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, + 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, + 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, + 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, + 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, + 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, + 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, + 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, + 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, + 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, + 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, + 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, + 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, + 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, + 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, + 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, + 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, + 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, + 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, + 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, + 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, + 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, + 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, + 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, + 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, + 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, + 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, + 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, + 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, + 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, + 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, + 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, + 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, + 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, + 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, + 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, + 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, + 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, + 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, + 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, + 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, + 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, + 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, + 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, + 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, + 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, + 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, + 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, + 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, + 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, + 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, + 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, + 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, + 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, + 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, + 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, + 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, + 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, + 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, + 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, + 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, + 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, + 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, + 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, + 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, + 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, + 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, + 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, + 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, + 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, + 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, + 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, + 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, + 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, + 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, + 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, + 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, + 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, + 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, + 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, + 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, + 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, + 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, + 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, + 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, + 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, + 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, + 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, + 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, + 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, + 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, + 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, + 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, + 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, + 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, + 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, + 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, + 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, + 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, + 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, + 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, + 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, + 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, + 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, + 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, + 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, + 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, + 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, + 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, + 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, + 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, + 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, + 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, + 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, + 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, + 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, + 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, + 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, + 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, + 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, + 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, + 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, + 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, + 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, + 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, + 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, + 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, + 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, + 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, + 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, + 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, + 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, + 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, + 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, + 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, + 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, + 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, + 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, + 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, + 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, + 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, + 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, + 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, + 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, + 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, + 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, + 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, + 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, + 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, + 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, + 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, + 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, + 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, + 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, + 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, + 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, + 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, + 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, + 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, + 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, + 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, + 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, + 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, + 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, + 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, + 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, + 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, + 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, + 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, + 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, + 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, + 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, + 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, + 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, + 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, + 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, + 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, + 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, + 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, + 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, + 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, + 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, + 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, + 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, + 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, + 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, + 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, + 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, + 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, + 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, + 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, + 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, + 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, + 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, + 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, + 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, + 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, + 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, + 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, + 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, + 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, + 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, + 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, + 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, + 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, + 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, + 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, + 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, + 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, + 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, + 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, + 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, + 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, + 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, + 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, + 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, + 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, + 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, + 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, + 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, + 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, + 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, + 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, + 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, + 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, + 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, + 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, + 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, + 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, + 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, + 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, + 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, + 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, + 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, + 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, + 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, + 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, + 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, + 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, + 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, + 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, + 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, + 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, + 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, + 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, + 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, + 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, + 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, + 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, + 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, + 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, + 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, + 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, + 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, + 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, + 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, + 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, + 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, + 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, + 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, + 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, + 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, + 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, + 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, + 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, + 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, + 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, + 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, + 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, + 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, + 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, + 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, + 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, + 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, + 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, + 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, + 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, + 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, + 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, + 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, + 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, + 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, + 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, + 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, + 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, + 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, + 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, + 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, + 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, + 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, + 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, + 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, + 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, + 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, + 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, + 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, + 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, + 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, + 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, + 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, + 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, + 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, + 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, + 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, + 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, + 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, + 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, + 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, + 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, + 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, + 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, + 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, + 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, + 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, + 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, + 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, + 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, + 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, + 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, + 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, + 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, + 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, + 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, + 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, + 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, + 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, + 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, + 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, + 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, + 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, + 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, + 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, + 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, + 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, + 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, + 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, + 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, + 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, + 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, + 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, + 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, + 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, + 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, + 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, + 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, + 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, + 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, + 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, + 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, + 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, + 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, + 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, + 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, + 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, + 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, + 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, + 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, + 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, + 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, + 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, + 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, + 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, + 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, + 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, + 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, + 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, + 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, + 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, + 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, + 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, + 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, + 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, + 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, + 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, + 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, + 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, + 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, + 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, + 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, + 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, + 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, + 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, + 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, + 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, + 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, + 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, + 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, + 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, + 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, + 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, + 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, + 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, + 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, + 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, + 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, + 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, + 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, + 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, + 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, + 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, + 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, + 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, + 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, + 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, + 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, + 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, + 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, + 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, + 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, + 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, + 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, + 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, + 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, + 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, + 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, + 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, + 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, + 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, + 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, + 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, + 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, + 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, + 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, + 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, + 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, + 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, + 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, + 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, + 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, + 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, + 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, + 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, + 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, + 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, + 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, + 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, + 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, + 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, + 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, + 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, + 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, + 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, + 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, + 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, + 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, + 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, + 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, + 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, + 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, + 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, + 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, + 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, + 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, + 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, + 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, + 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, + 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, + 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, + 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, + 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, + 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, + 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, + 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, + 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, + 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, + 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, + 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, + 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, + 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, + 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, + 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, + 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, + 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, + 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, + 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, + 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, + 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, + 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, + 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, + 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, + 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, + 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, + 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, + 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, + 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, + 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, + 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, + 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, + 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, + 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, + 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, + 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, + 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, + 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, + 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, + 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, + 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, + 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, + 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, + 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, + 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, + 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, + 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, + 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, + 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, + 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, + 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, + 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, + 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, + 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, + 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, + 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, + 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, + 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, + 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, + 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, + 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, + 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, + 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, + 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, + 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, + 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, + 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, + 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, + 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, + 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, + 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, + 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, + 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, + 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, + 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, + 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, + 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, + 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, + 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, + 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, + 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, + 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, + 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, + 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, + 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, + 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, + 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, + 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, + 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, + 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, + 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, + 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, + 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, + 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, + 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, + 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, + 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, + 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, + 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, + 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, + 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, + 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, + 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, + 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, + 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, + 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, + 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, + 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, + 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, + 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, + 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, + 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, + 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, + 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, + 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, + 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, + 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, + 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, + 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, + 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, + 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, + 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, + 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, + 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, + 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, + 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, + 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, + 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, + 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, + 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, + 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, + 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, + 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, + 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, + 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, + 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, + 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, + 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, + 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, + 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, + 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, + 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, + 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, + 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, + 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, + 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, + 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, + 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, + 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, + 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, + 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, + 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, + 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, + 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, + 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, + 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, + 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, + 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, + 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, + 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, + 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, + 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, + 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, + 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, + 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, + 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, + 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, + 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, + 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, + 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, + 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, + 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, + 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, + 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, + 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, + 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, + 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, + 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, + 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, + 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, + 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, + 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, + 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, + 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, + 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, + 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, + 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, + 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, + 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, + 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, + 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, + 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, + 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, + 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, + 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, + 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, + 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, + 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, + 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, + 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, + 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, + 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, + 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, + 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, + 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, + 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, + 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, + 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, + 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, + 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, + 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, + 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, + 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, + 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, + 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, + 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, + 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, + 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, + 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, + 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, + 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, + 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, + 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, + 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, + 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, + 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, + 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, + 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, + 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, + 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, + 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, + 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, + 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, + 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, + 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, + 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, + 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, + 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, + 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, + 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, + 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, + 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, + 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, + 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, + 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, + 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, + 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, + 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, + 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, + 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, + 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, + 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, + 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, + 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, + 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, + 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, + 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, + 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, + 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, + 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, + 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, + 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, + 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, + 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, + 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, + 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, + 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, + 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, + 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, + 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, + 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, + 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, + 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, + 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, + 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, + 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, + 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, + 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, + 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, + 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, + 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, + 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, + 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, + 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, + 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, + 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, + 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, + 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, + 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, + 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, + 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, + 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, + 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, + 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, + 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, + 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, + 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, + 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, + 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, + 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, + 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, + 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, + 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, + 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, + 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, + 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, + 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, + 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, + 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, + 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, + 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, + 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, + 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, + 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, + 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, + 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, + 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, + 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, + 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, + 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, + 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, + 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, + 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, + 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, + 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, + 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, + 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, + 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, + 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, + 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, + 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, + 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, + 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, + 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, + 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, + 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, + 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, + 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, + 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, + 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, + 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, + 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, + 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, + 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, + 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, + 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, + 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, + 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, + 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, + 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, + 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, + 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, + 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, + 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, + 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, + 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, + 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, + 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, + 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, + 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, + 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, + 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, + 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, + 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, + 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, + 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, + 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, + 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, + 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, + 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, + 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, + 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, + 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, + 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, + 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, + 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, + 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, + 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, + 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, + 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, + 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, + 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, + 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, + 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, + 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, + 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, + 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, + 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, + 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, + 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, + 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, + 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, + 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, + 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, + 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, + 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, + 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, + 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, + 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, + 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, + 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, + 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, + 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, + 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, + 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, + 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, + 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, + 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, + 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, + 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, + 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, + 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, + 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, + 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, + 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, + 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, + 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, + 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, + 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, + 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, + 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, + 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, + 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, + 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, + 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, + 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, + 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, + 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, + 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, + 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, + 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, + 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, + 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, + 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, + 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, + 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, + 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, + 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, + 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, + 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, + 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, + 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, + 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, + 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, + 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, + 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, + 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, + 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, + 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, + 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, + 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, + 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, + 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, + 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, + 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, + 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, + 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, + 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, + 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, + 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, + 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, + 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, + 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, + 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, + 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, + 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, + 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, + 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, + 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, + 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, + 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, + 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, + 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, + 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, + 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, + 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, + 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, + 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, + 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, + 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, + 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, + 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, + 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, + 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, + 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, + 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, + 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, + 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, + 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, + 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, + 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, + 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, + 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, + 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, + 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, + 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, + 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, + 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, + 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, + 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, + 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, + 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, + 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, + 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, + 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, + 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, + 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, + 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, + 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, + 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, + 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, + 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, + 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, + 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, + 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, + 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, + 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, + 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, + 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, + 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, + 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, + 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, + 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, + 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, + 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, + 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, + 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, + 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, + 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, + 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, + 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, + 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, + 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, + 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, + 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, + 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, + 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, + 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, + 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, + 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, + 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, + 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, + 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, + 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, + 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, + 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, + 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, + 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, + 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, + 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, + 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, + 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, + 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, + 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, + 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, + 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, + 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, + 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, + 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, + 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, + 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, + 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, + 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, + 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, + 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, + 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, + 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, + 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, + 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, + 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, + 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, + 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, + 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, + 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, + 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, + 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, + 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, + 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, + 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, + 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, + 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, + 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, + 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, + 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, + 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, + 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, + 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, + 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, + 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, + 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, + 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, + 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, + 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, + 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, + 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, + 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, + 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, + 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, + 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, + 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, + 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEM code to unicode */ + p = oem2uni; + hi = sizeof oem2uni / 4 - 1; + } else { /* Unicode to OEM code */ + p = uni2oem; + hi = sizeof uni2oem / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted (BMP only) */ +) +{ + /* Compressed upper conversion table */ + static const WCHAR cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WCHAR cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF2,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WCHAR *p; + WCHAR bc, nc, cmd; + + + p = chr < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || chr < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (chr < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: chr = p[chr - bc]; break; /* Table conversion */ + case 1: chr -= (chr - bc) & 1; break; /* Case pairs */ + case 2: chr -= 16; break; /* Shift -16 */ + case 3: chr -= 32; break; /* Shift -32 */ + case 4: chr -= 48; break; /* Shift -48 */ + case 5: chr -= 26; break; /* Shift -26 */ + case 6: chr += 8; break; /* Shift +8 */ + case 7: chr -= 80; break; /* Shift -80 */ + case 8: chr -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + + return chr; +} + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/cc950.c b/Firmware/WIMU3/Libraries/FatFs/src/option/cc950.c new file mode 100644 index 0000000..deac542 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/cc950.c @@ -0,0 +1,6900 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ +/* CP950 (Traditional Chinese Big5) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 950 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, + 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, + 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, + 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, + 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, + 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, + 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, + 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, + 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, + 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, + 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, + 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, + 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, + 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, + 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, + 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, + 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, + 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, + 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, + 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, + 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, + 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, + 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, + 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, + 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, + 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, + 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, + 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, + 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, + 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, + 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, + 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, + 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, + 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, + 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, + 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, + 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, + 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, + 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, + 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, + 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, + 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, + 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, + 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, + 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, + 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, + 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, + 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, + 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, + 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, + 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, + 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, + 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, + 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, + 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, + 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, + 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, + 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, + 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, + 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, + 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, + 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, + 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, + 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, + 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, + 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, + 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, + 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, + 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, + 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, + 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, + 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, + 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, + 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, + 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, + 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, + 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, + 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, + 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, + 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, + 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, + 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, + 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, + 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, + 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, + 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, + 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, + 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, + 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, + 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, + 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, + 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, + 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, + 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, + 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, + 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, + 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, + 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, + 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, + 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, + 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, + 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, + 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, + 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, + 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, + 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, + 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, + 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, + 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, + 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, + 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, + 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, + 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, + 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, + 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, + 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, + 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, + 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, + 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, + 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, + 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, + 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, + 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, + 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, + 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, + 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, + 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, + 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, + 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, + 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, + 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, + 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, + 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, + 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, + 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, + 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, + 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, + 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, + 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, + 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, + 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, + 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, + 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, + 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, + 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, + 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, + 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, + 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, + 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, + 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, + 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, + 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, + 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, + 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, + 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, + 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, + 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, + 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, + 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, + 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, + 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, + 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, + 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, + 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, + 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, + 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, + 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, + 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, + 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, + 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, + 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, + 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, + 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, + 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, + 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, + 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, + 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, + 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, + 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, + 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, + 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, + 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, + 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, + 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, + 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, + 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, + 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, + 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, + 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, + 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, + 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, + 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, + 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, + 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, + 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, + 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, + 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, + 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, + 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, + 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, + 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, + 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, + 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, + 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, + 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, + 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, + 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, + 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, + 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, + 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, + 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, + 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, + 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, + 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, + 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, + 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, + 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, + 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, + 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, + 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, + 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, + 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, + 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, + 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, + 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, + 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, + 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, + 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, + 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, + 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, + 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, + 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, + 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, + 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, + 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, + 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, + 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, + 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, + 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, + 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, + 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, + 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, + 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, + 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, + 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, + 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, + 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, + 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, + 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, + 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, + 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, + 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, + 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, + 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, + 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, + 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, + 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, + 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, + 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, + 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, + 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, + 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, + 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, + 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, + 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, + 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, + 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, + 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, + 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, + 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, + 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, + 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, + 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, + 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, + 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, + 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, + 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, + 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, + 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, + 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, + 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, + 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, + 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, + 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, + 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, + 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, + 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, + 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, + 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, + 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, + 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, + 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, + 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, + 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, + 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, + 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, + 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, + 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, + 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, + 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, + 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, + 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, + 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, + 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, + 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, + 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, + 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, + 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, + 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, + 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, + 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, + 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, + 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, + 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, + 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, + 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, + 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, + 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, + 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, + 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, + 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, + 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, + 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, + 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, + 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, + 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, + 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, + 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, + 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, + 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, + 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, + 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, + 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, + 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, + 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, + 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, + 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, + 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, + 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, + 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, + 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, + 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, + 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, + 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, + 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, + 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, + 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, + 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, + 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, + 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, + 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, + 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, + 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, + 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, + 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, + 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, + 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, + 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, + 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, + 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, + 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, + 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, + 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, + 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, + 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, + 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, + 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, + 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, + 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, + 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, + 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, + 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, + 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, + 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, + 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, + 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, + 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, + 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, + 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, + 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, + 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, + 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, + 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, + 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, + 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, + 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, + 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, + 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, + 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, + 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, + 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, + 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, + 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, + 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, + 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, + 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, + 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, + 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, + 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, + 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, + 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, + 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, + 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, + 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, + 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, + 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, + 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, + 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, + 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, + 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, + 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, + 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, + 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, + 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, + 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, + 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, + 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, + 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, + 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, + 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, + 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, + 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, + 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, + 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, + 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, + 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, + 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, + 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, + 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, + 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, + 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, + 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, + 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, + 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, + 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, + 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, + 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, + 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, + 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, + 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, + 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, + 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, + 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, + 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, + 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, + 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, + 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, + 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, + 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, + 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, + 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, + 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, + 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, + 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, + 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, + 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, + 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, + 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, + 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, + 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, + 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, + 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, + 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, + 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, + 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, + 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, + 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, + 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, + 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, + 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, + 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, + 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, + 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, + 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, + 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, + 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, + 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, + 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, + 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, + 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, + 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, + 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, + 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, + 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, + 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, + 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, + 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, + 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, + 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, + 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, + 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, + 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, + 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, + 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, + 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, + 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, + 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, + 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, + 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, + 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, + 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, + 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, + 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, + 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, + 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, + 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, + 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, + 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, + 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, + 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, + 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, + 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, + 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, + 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, + 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, + 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, + 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, + 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, + 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, + 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, + 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, + 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, + 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, + 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, + 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, + 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, + 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, + 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, + 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, + 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, + 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, + 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, + 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, + 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, + 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, + 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, + 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, + 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, + 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, + 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, + 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, + 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, + 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, + 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, + 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, + 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, + 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, + 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, + 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, + 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, + 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, + 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, + 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, + 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, + 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, + 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, + 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, + 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, + 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, + 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, + 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, + 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, + 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, + 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, + 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, + 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, + 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, + 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, + 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, + 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, + 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, + 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, + 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, + 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, + 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, + 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, + 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, + 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, + 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, + 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, + 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, + 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, + 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, + 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, + 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, + 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, + 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, + 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, + 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, + 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, + 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, + 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, + 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, + 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, + 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, + 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, + 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, + 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, + 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, + 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, + 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, + 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, + 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, + 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, + 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, + 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, + 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, + 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, + 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, + 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, + 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, + 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, + 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, + 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, + 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, + 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, + 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, + 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, + 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, + 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, + 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, + 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, + 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, + 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, + 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, + 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, + 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, + 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, + 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, + 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, + 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, + 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, + 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, + 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, + 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, + 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, + 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, + 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, + 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, + 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, + 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, + 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, + 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, + 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, + 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, + 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, + 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, + 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, + 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, + 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, + 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, + 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, + 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, + 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, + 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, + 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, + 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, + 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, + 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, + 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, + 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, + 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, + 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, + 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, + 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, + 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, + 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, + 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, + 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, + 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, + 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, + 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, + 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, + 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, + 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, + 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, + 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, + 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, + 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, + 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, + 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, + 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, + 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, + 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, + 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, + 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, + 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, + 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, + 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, + 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, + 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, + 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, + 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, + 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, + 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, + 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, + 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, + 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, + 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, + 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, + 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, + 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, + 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, + 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, + 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, + 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, + 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, + 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, + 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, + 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, + 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, + 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, + 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, + 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, + 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, + 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, + 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, + 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, + 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, + 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, + 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, + 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, + 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, + 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, + 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, + 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, + 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, + 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, + 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, + 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, + 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, + 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, + 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, + 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, + 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, + 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, + 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, + 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, + 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, + 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, + 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, + 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, + 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, + 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, + 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, + 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, + 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, + 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, + 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, + 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, + 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, + 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, + 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, + 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, + 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, + 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, + 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, + 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, + 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, + 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, + 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, + 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, + 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, + 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, + 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, + 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, + 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, + 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, + 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, + 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, + 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, + 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, + 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, + 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, + 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, + 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, + 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, + 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, + 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, + 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, + 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, + 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, + 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, + 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, + 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, + 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, + 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, + 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, + 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, + 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, + 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, + 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, + 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, + 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, + 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, + 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, + 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, + 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, + 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, + 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, + 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, + 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, + 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, + 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, + 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, + 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, + 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, + 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, + 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, + 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, + 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, + 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, + 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, + 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, + 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, + 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, + 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, + 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, + 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, + 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, + 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, + 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, + 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, + 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, + 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, + 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, + 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, + 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, + 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, + 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, + 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, + 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, + 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, + 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, + 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, + 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, + 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, + 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, + 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, + 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, + 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, + 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, + 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, + 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, + 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, + 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, + 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, + 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, + 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, + 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, + 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, + 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, + 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, + 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, + 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, + 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, + 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, + 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, + 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, + 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, + 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, + 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, + 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, + 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, + 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, + 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, + 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, + 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, + 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, + 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, + 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, + 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, + 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, + 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, + 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, + 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, + 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, + 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, + 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, + 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, + 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, + 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, + 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, + 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, + 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, + 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, + 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, + 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, + 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, + 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, + 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, + 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, + 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, + 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, + 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, + 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, + 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, + 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, + 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, + 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, + 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, + 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, + 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, + 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, + 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, + 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, + 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, + 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, + 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, + 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, + 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, + 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, + 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, + 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, + 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, + 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, + 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, + 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, + 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, + 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, + 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, + 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, + 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, + 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, + 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, + 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, + 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, + 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, + 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, + 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, + 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, + 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, + 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, + 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, + 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, + 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, + 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, + 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, + 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, + 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, + 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, + 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, + 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, + 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, + 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, + 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, + 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, + 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, + 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, + 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, + 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, + 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, + 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, + 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, + 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, + 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, + 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, + 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, + 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, + 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, + 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, + 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, + 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, + 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, + 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, + 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, + 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, + 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, + 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, + 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, + 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, + 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, + 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, + 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, + 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, + 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, + 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, + 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, + 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, + 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, + 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, + 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, + 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, + 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, + 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, + 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, + 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, + 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, + 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, + 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, + 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, + 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, + 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, + 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, + 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, + 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, + 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, + 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, + 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, + 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, + 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, + 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, + 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, + 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, + 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, + 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, + 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, + 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, + 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, + 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, + 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, + 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, + 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, + 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, + 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, + 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, + 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, + 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, + 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, + 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, + 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, + 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, + 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, + 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, + 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, + 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, + 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, + 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, + 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, + 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, + 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, + 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, + 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, + 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, + 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, + 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, + 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, + 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, + 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, + 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, + 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, + 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, + 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, + 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, + 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, + 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, + 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, + 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, + 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, + 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, + 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, + 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, + 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, + 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, + 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, + 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, + 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, + 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, + 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, + 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, + 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, + 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, + 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, + 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, + 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, + 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, + 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, + 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, + 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, + 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, + 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, + 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, + 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, + 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, + 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, + 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, + 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, + 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, + 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, + 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, + 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, + 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, + 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, + 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, + 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, + 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, + 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, + 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, + 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, + 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, + 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, + 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, + 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, + 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, + 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, + 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, + 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, + 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, + 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, + 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, + 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, + 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, + 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, + 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, + 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, + 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, + 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, + 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, + 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, + 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, + 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, + 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, + 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, + 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, + 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, + 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, + 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, + 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, + 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, + 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, + 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, + 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, + 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, + 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, + 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, + 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, + 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, + 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, + 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, + 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, + 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, + 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, + 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, + 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, + 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, + 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, + 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, + 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, + 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, + 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, + 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, + 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, + 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, + 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, + 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, + 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, + 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, + 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, + 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, + 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, + 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, + 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, + 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, + 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, + 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, + 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, + 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, + 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, + 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, + 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, + 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, + 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, + 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, + 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, + 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, + 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, + 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, + 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, + 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, + 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, + 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, + 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, + 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, + 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, + 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, + 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, + 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, + 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, + 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, + 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, + 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, + 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, + 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, + 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, + 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, + 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, + 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, + 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, + 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, + 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, + 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, + 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, + 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, + 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, + 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, + 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, + 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, + 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, + 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, + 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, + 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, + 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, + 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, + 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, + 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, + 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, + 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, + 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, + 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, + 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, + 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, + 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, + 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, + 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, + 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, + 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, + 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, + 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, + 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, + 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, + 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, + 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, + 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, + 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, + 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, + 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, + 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, + 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, + 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, + 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, + 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, + 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, + 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, + 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, + 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, + 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, + 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, + 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, + 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, + 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, + 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, + 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, + 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, + 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, + 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, + 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, + 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, + 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, + 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, + 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, + 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, + 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, + 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, + 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, + 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, + 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, + 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, + 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, + 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, + 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, + 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, + 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, + 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, + 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, + 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, + 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, + 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, + 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, + 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, + 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, + 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, + 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, + 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, + 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, + 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, + 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, + 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, + 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, + 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, + 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, + 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, + 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, + 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, + 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, + 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, + 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, + 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, + 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, + 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, + 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, + 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, + 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, + 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, + 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, + 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, + 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, + 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, + 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, + 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, + 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, + 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, + 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, + 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, + 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, + 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, + 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, + 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, + 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, + 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, + 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, + 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, + 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, + 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, + 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, + 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, + 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, + 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, + 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, + 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, + 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, + 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, + 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, + 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, + 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, + 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, + 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, + 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, + 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, + 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, + 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, + 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, + 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, + 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, + 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, + 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, + 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, + 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, + 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, + 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, + 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, + 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, + 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, + 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, + 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, + 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, + 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, + 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, + 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, + 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, + 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, + 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, + 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, + 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, + 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, + 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, + 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, + 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, + 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, + 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, + 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, + 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, + 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, + 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, + 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, + 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, + 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, + 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, + 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, + 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, + 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, + 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, + 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, + 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, + 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, + 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, + 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, + 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, + 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, + 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, + 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, + 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, + 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, + 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, + 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, + 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, + 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, + 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, + 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, + 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, + 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, + 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, + 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, + 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, + 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, + 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, + 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, + 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, + 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, + 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, + 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, + 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, + 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, + 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, + 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, + 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, + 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, + 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, + 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, + 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, + 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, + 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, + 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, + 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, + 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, + 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, + 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, + 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, + 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, + 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, + 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, + 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, + 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, + 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, + 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, + 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, + 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, + 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, + 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, + 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, + 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, + 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, + 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, + 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, + 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, + 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, + 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, + 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, + 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, + 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, + 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, + 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, + 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, + 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, + 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, + 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, + 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, + 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, + 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, + 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, + 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, + 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, + 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, + 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, + 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, + 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, + 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, + 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, + 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, + 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, + 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, + 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, + 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, + 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, + 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, + 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, + 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, + 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, + 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, + 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, + 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, + 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, + 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, + 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, + 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, + 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, + 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, + 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, + 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, + 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, + 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, + 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, + 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, + 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, + 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, + 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, + 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, + 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, + 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, + 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, + 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, + 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, + 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, + 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, + 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, + 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, + 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, + 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, + 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, + 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, + 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, + 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, + 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, + 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, + 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, + 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, + 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, + 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, + 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, + 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, + 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, + 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, + 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, + 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, + 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, + 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, + 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, + 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, + 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, + 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, + 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, + 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, + 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, + 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, + 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, + 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, + 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, + 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, + 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, + 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, + 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, + 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, + 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, + 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, + 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, + 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, + 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, + 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, + 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, + 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, + 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, + 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, + 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, + 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, + 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, + 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, + 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, + 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, + 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, + 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, + 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, + 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, + 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, + 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, + 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, + 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, + 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, + 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, + 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, + 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, + 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, + 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, + 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, + 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, + 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, + 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, + 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, + 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, + 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, + 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, + 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, + 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, + 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, + 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, + 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, + 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, + 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, + 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, + 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, + 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, + 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, + 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, + 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, + 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, + 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, + 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, + 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, + 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, + 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, + 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, + 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, + 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, + 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, + 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, + 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, + 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, + 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, + 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, + 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, + 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, + 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, + 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, + 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, + 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, + 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, + 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, + 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, + 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, + 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, + 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, + 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, + 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, + 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, + 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, + 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, + 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, + 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, + 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, + 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, + 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, + 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, + 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, + 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, + 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, + 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, + 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, + 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, + 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, + 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, + 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, + 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, + 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, + 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, + 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, + 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, + 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, + 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, + 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, + 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, + 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, + 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, + 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, + 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, + 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, + 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, + 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, + 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, + 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, + 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, + 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, + 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, + 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, + 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, + 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, + 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, + 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, + 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, + 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, + 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, + 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, + 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, + 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, + 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, + 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, + 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, + 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, + 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, + 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, + 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, + 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, + 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, + 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, + 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, + 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, + 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, + 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, + 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, + 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, + 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, + 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, + 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, + 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, + 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, + 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, + 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, + 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, + 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, + 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, + 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, + 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, + 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, + 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, + 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, + 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, + 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, + 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, + 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, + 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, + 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, + 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, + 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, + 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, + 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, + 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, + 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, + 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, + 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, + 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, + 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, + 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, + 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, + 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, + 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, + 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, + 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, + 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, + 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, + 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, + 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, + 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, + 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, + 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, + 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, + 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, + 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, + 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, + 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, + 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, + 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, + 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, + 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, + 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, + 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, + 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, + 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, + 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, + 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, + 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, + 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, + 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, + 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, + 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, + 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, + 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, + 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, + 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, + 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, + 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, + 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, + 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, + 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, + 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, + 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, + 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, + 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, + 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, + 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, + 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, + 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, + 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, + 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, + 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, + 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, + 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, + 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, + 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, + 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, + 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, + 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, + 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, + 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, + 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, + 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, + 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, + 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, + 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, + 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, + 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, + 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, + 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, + 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, + 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, + 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, + 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, + 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, + 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, + 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, + 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, + 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, + 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, + 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, + 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, + 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, + 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, + 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, + 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, + 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, + 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, + 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, + 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, + 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, + 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, + 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, + 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, + 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, + 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, + 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, + 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, + 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, + 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, + 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, + 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, + 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, + 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, + 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, + 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, + 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, + 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, + 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, + 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, + 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, + 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, + 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, + 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, + 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, + 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, + 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, + 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, + 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, + 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, + 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, + 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, + 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, + 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, + 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, + 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, + 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, + 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, + 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, + 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, + 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, + 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, + 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, + 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, + 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, + 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, + 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, + 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, + 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, + 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, + 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, + 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, + 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, + 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, + 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, + 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, + 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, + 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, + 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, + 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, + 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, + 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, + 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, + 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, + 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, + 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, + 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, + 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, + 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, + 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, + 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, + 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, + 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, + 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, + 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, + 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, + 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, + 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, + 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, + 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, + 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, + 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, + 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, + 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, + 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, + 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, + 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, + 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, + 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, + 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, + 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, + 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, + 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, + 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, + 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, + 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, + 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, + 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, + 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, + 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, + 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, + 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, + 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, + 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, + 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, + 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, + 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, + 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, + 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, + 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, + 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, + 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, + 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, + 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, + 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, + 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, + 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, + 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, + 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, + 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, + 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, + 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, + 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, + 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, + 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, + 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, + 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, + 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, + 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, + 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, + 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, + 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, + 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, + 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, + 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, + 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, + 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, + 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, + 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, + 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, + 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, + 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, + 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, + 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, + 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, + 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, + 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, + 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, + 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, + 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, + 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, + 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, + 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, + 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, + 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, + 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, + 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, + 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, + 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, + 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, + 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, + 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, + 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, + 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, + 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, + 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, + 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, + 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, + 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, + 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, + 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, + 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, + 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, + 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, + 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, + 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, + 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, + 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, + 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, + 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, + 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, + 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, + 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, + 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, + 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, + 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, + 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, + 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, + 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, + 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, + 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, + 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, + 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, + 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, + 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, + 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, + 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, + 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, + 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, + 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, + 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, + 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, + 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, + 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, + 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, + 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, + 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, + 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, + 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, + 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, + 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, + 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, + 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, + 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, + 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, + 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, + 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, + 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, + 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, + 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, + 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, + 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, + 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, + 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, + 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, + 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, + 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, + 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, + 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, + 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, + 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, + 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, + 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, + 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, + 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, + 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, + 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, + 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, + 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, + 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, + 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, + 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, + 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, + 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, + 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, + 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, + 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, + 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, + 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, + 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, + 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, + 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, + 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, + 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, + 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, + 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, + 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, + 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, + 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, + 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, + 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, + 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, + 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, + 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, + 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, + 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, + 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, + 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, + 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, + 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, + 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, + 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, + 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, + 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, + 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, + 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, + 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, + 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, + 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, + 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, + 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, + 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, + 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, + 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, + 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, + 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, + 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, + 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, + 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, + 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, + 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, + 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, + 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, + 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, + 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, + 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, + 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, + 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, + 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, + 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, + 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, + 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, + 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, + 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, + 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, + 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, + 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, + 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, + 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, + 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, + 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, + 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, + 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, + 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, + 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, + 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, + 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, + 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, + 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, + 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, + 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, + 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, + 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, + 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, + 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, + 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, + 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, + 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, + 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, + 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, + 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, + 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, + 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, + 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, + 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, + 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, + 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, + 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, + 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, + 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, + 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, + 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, + 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, + 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, + 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, + 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, + 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, + 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, + 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, + 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, + 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, + 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, + 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, + 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, + 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, + 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, + 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, + 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, + 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, + 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, + 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, + 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, + 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, + 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, + 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, + 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, + 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, + 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, + 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, + 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, + 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, + 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, + 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, + 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, + 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, + 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, + 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, + 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, + 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, + 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, + 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, + 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, + 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, + 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, + 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, + 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, + 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, + 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, + 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, + 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, + 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, + 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, + 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, + 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, + 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, + 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, + 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, + 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, + 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, + 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, + 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, + 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, + 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, + 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, + 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, + 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, + 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, + 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, + 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, + 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, + 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, + 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, + 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, + 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, + 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, + 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, + 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, + 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, + 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, + 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, + 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, + 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, + 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, + 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, + 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, + 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, + 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, + 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, + 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, + 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, + 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, + 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, + 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, + 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, + 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, + 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, + 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, + 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, + 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, + 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, + 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, + 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, + 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, + 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, + 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, + 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, + 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, + 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, + 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, + 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, + 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, + 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, + 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, + 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, + 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, + 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, + 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, + 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, + 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, + 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, + 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, + 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, + 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, + 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, + 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, + 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, + 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, + 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, + 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, + 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, + 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, + 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, + 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, + 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, + 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, + 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, + 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, + 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, + 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, + 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, + 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, + 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, + 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, + 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, + 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, + 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, + 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, + 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, + 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, + 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, + 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, + 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, + 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, + 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, + 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, + 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, + 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, + 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, + 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, + 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, + 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, + 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, + 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, + 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, + 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, + 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, + 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, + 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, + 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, + 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, + 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, + 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, + 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, + 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, + 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, + 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, + 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, + 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, + 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, + 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, + 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, + 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, + 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, + 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, + 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, + 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, + 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, + 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, + 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, + 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, + 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, + 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, + 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, + 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, + 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, + 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, + 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, + 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, + 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, + 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, + 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, + 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, + 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, + 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, + 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, + 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, + 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, + 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, + 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, + 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, + 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, + 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, + 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, + 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, + 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, + 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, + 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, + 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, + 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, + 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, + 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, + 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, + 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, + 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, + 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, + 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, + 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, + 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, + 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, + 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, + 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, + 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, + 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, + 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, + 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, + 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, + 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, + 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, + 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, + 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, + 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, + 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, + 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, + 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, + 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, + 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, + 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, + 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, + 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, + 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, + 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, + 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, + 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, + 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, + 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, + 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, + 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, + 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, + 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, + 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, + 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, + 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, + 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, + 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, + 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, + 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, + 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, + 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, + 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, + 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, + 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, + 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, + 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, + 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, + 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, + 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, + 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, + 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, + 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, + 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, + 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, + 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, + 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, + 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, + 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, + 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, + 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, + 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, + 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, + 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, + 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, + 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, + 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, + 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, + 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, + 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, + 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, + 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, + 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, + 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, + 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, + 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, + 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, + 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, + 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, + 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, + 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, + 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, + 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, + 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, + 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, + 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, + 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, + 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, + 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, + 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, + 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, + 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, + 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, + 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, + 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, + 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, + 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, + 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, + 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, + 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, + 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, + 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, + 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, + 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, + 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, + 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, + 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, + 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, + 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, + 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, + 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, + 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, + 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, + 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, + 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, + 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, + 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, + 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, + 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, + 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, + 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, + 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, + 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, + 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, + 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, + 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, + 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, + 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, + 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, + 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, + 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, + 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, + 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, + 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, + 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, + 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, + 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, + 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, + 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, + 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, + 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, + 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, + 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, + 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, + 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, + 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, + 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, + 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, + 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, + 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, + 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, + 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, + 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, + 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, + 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, + 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, + 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, + 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, + 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, + 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, + 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, + 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, + 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, + 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, + 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, + 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, + 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, + 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, + 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, + 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, + 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, + 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, + 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, + 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, + 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, + 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, + 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, + 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, + 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, + 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, + 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, + 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, + 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, + 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, + 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, + 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, + 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, + 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, + 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, + 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, + 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, + 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, + 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, + 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, + 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, + 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, + 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, + 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, + 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, + 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, + 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, + 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, + 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, + 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, + 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, + 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, + 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, + 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, + 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, + 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, + 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, + 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, + 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, + 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, + 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, + 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, + 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, + 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, + 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, + 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, + 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, + 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, + 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, + 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, + 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, + 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, + 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, + 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, + 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, + 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, + 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, + 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, + 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, + 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, + 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, + 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, + 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, + 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, + 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, + 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, + 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, + 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, + 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, + 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, + 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, + 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, + 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, + 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, + 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, + 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, + 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, + 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, + 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, + 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, + 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, + 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, + 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, + 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, + 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, + 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, + 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, + 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, + 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, + 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, + 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, + 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, + 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, + 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, + 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, + 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, + 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, + 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, + 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, + 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, + 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, + 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, + 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, + 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, + 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, + 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, + 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, + 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, + 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, + 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, + 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, + 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, + 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, + 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, + 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, + 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, + 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, + 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, + 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, + 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, + 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, + 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, + 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, + 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, + 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, + 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, + 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, + 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, + 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, + 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, + 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, + 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, + 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, + 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, + 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, + 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, + 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, + 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, + 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, + 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, + 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, + 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, + 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, + 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, + 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, + 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, + 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, + 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, + 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, + 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, + 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, + 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, + 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, + 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, + 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, + 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, + 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, + 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, + 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, + 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, + 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, + 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, + 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, + 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, + 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, + 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, + 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, + 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, + 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, + 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, + 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, + 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, + 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, + 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, + 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, + 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, + 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, + 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, + 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, + 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, + 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, + 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, + 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, + 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, + 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, + 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, + 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, + 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, + 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, + 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, + 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, + 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, + 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, + 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, + 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, + 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, + 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, + 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, + 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, + 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, + 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, + 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, + 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, + 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, + 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, + 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, + 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, + 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, + 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, + 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, + 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, + 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, + 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, + 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, + 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, + 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, + 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, + 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, + 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, + 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, + 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, + 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, + 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, + 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, + 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, + 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, + 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, + 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, + 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, + 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, + 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, + 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, + 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, + 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, + 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, + 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, + 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, + 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, + 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, + 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, + 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, + 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, + 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, + 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, + 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, + 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, + 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, + 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, + 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, + 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, + 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, + 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, + 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, + 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, + 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, + 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, + 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, + 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, + 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, + 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, + 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, + 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, + 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, + 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, + 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, + 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, + 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, + 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, + 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, + 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, + 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, + 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, + 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, + 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, + 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, + 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, + 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, + 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, + 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, + 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, + 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, + 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, + 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, + 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, + 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, + 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, + 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, + 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, + 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, + 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, + 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, + 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, + 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, + 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, + 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, + 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, + 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, + 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, + 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, + 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, + 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, + 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, + 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, + 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, + 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, + 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, + 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, + 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, + 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, + 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, + 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, + 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, + 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, + 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, + 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, + 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, + 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, + 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, + 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, + 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, + 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, + 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, + 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, + 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, + 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, + 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, + 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, + 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, + 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, + 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, + 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, + 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, + 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, + 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, + 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, + 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, + 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, + 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, + 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, + 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, + 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, + 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, + 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, + 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, + 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, + 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, + 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, + 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, + 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, + 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, + 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, + 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, + 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, + 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, + 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, + 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, + 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, + 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, + 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, + 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, + 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, + 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, + 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, + 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, + 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, + 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, + 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, + 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, + 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, + 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, + 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, + 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, + 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, + 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, + 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, + 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, + 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, + 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, + 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, + 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, + 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, + 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, + 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, + 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, + 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, + 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, + 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, + 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, + 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, + 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, + 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, + 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, + 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, + 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, + 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, + 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, + 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, + 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, + 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, + 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, + 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, + 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, + 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, + 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, + 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, + 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, + 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, + 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, + 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, + 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, + 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, + 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, + 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, + 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, + 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, + 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, + 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, + 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, + 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, + 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, + 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, + 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, + 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, + 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, + 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, + 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, + 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, + 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, + 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, + 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, + 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, + 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, + 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, + 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, + 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, + 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, + 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, + 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, + 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, + 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, + 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, + 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, + 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, + 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, + 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, + 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, + 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, + 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, + 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, + 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, + 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, + 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, + 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, + 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, + 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, + 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, + 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, + 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, + 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, + 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, + 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, + 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, + 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, + 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, + 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, + 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, + 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, + 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, + 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, + 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, + 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, + 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, + 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, + 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, + 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, + 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, + 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, + 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, + 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, + 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, + 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, + 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, + 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, + 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, + 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, + 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, + 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, + 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, + 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, + 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, + 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, + 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, + 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, + 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, + 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, + 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, + 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, + 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, + 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, + 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, + 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, + 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, + 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, + 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, + 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, + 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, + 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, + 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, + 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, + 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, + 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, + 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, + 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, + 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, + 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, + 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, + 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, + 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, + 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, + 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, + 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, + 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, + 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, + 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, + 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, + 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, + 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, + 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, + 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, + 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, + 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, + 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, + 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, + 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, + 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, + 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, + 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, + 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, + 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, + 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, + 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, + 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, + 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, + 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, + 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, + 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, + 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, + 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, + 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, + 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, + 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, + 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, + 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, + 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, + 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, + 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, + 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, + 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, + 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, + 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, + 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, + 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, + 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, + 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, + 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, + 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, + 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, + 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, + 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, + 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, + 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, + 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, + 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, + 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, + 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, + 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, + 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, + 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, + 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, + 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, + 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, + 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, + 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, + 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, + 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, + 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, + 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, + 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, + 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, + 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, + 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, + 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, + 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, + 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, + 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, + 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, + 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, + 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, + 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, + 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, + 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, + 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, + 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, + 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, + 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, + 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, + 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, + 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, + 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, + 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, + 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, + 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, + 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, + 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, + 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, + 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, + 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, + 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, + 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, + 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, + 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, + 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, + 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, + 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, + 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, + 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, + 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, + 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, + 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, + 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, + 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, + 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, + 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, + 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, + 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, + 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, + 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, + 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, + 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, + 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, + 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, + 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, + 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, + 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, + 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, + 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, + 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, + 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, + 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, + 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, + 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, + 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, + 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, + 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, + 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, + 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, + 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, + 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, + 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, + 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, + 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, + 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, + 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, + 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, + 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, + 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, + 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, + 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, + 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, + 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, + 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, + 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, + 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, + 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, + 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, + 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, + 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, + 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, + 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, + 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, + 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, + 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, + 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, + 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, + 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, + 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, + 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, + 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, + 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, + 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, + 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, + 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, + 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, + 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, + 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, + 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, + 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, + 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, + 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, + 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, + 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, + 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, + 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, + 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, + 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, + 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, + 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, + 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, + 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, + 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, + 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, + 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, + 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, + 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, + 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, + 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, + 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, + 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, + 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, + 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, + 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, + 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, + 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, + 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, + 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, + 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, + 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, + 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, + 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, + 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, + 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, + 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, + 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, + 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, + 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, + 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, + 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, + 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, + 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, + 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, + 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, + 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, + 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, + 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, + 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, + 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, + 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, + 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, + 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, + 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, + 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, + 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, + 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, + 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, + 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, + 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, + 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, + 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, + 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, + 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, + 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, + 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, + 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, + 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, + 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, + 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, + 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, + 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, + 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, + 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, + 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, + 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, + 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, + 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, + 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, + 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, + 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, + 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, + 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, + 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, + 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, + 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, + 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, + 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, + 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, + 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, + 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, + 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, + 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, + 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, + 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, + 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, + 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, + 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, + 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, + 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, + 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, + 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, + 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, + 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, + 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, + 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, + 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, + 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, + 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, + 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, + 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, + 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, + 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, + 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, + 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, + 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, + 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, + 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, + 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, + 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, + 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, + 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, + 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, + 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, + 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, + 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, + 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, + 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, + 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, + 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, + 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, + 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, + 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, + 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, + 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, + 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, + 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, + 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, + 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, + 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, + 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, + 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEM code to unicode */ + p = oem2uni; + hi = sizeof oem2uni / 4 - 1; + } else { /* Unicode to OEM code */ + p = uni2oem; + hi = sizeof uni2oem / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted (BMP only) */ +) +{ + /* Compressed upper conversion table */ + static const WCHAR cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WCHAR cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF2,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WCHAR *p; + WCHAR bc, nc, cmd; + + + p = chr < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || chr < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (chr < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: chr = p[chr - bc]; break; /* Table conversion */ + case 1: chr -= (chr - bc) & 1; break; /* Case pairs */ + case 2: chr -= 16; break; /* Shift -16 */ + case 3: chr -= 32; break; /* Shift -32 */ + case 4: chr -= 48; break; /* Shift -48 */ + case 5: chr -= 26; break; /* Shift -26 */ + case 6: chr += 8; break; /* Shift +8 */ + case 7: chr -= 80; break; /* Shift -80 */ + case 8: chr -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + + return chr; +} + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/ccsbcs.c b/Firmware/WIMU3/Libraries/FatFs/src/option/ccsbcs.c new file mode 100644 index 0000000..e2762dc --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/ccsbcs.c @@ -0,0 +1,388 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2015 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. +/ 720 Arabic +/ 737 Greek +/ 771 KBL +/ 775 Baltic +/ 850 Latin 1 +/ 852 Latin 2 +/ 855 Cyrillic +/ 857 Turkish +/ 860 Portuguese +/ 861 Icelandic +/ 862 Hebrew +/ 863 Canadian French +/ 864 Arabic +/ 865 Nordic +/ 866 Russian +/ 869 Greek 2 +*/ + +#include "../ff.h" + + +#if _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 771 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP771(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 860 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP860(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 861 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP861(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 863 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP863(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 864 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP864(0x80-0xFF) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; + +#elif _CODE_PAGE == 865 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP865(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 869 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP869(0x80-0xFF) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 +}; + +#endif + + +#if !_TBLDEF || !_USE_LFN +#error This file is not needed at current configuration. Remove from the project. +#endif + + + + +WCHAR ff_convert ( /* Converted character, Returns zero on error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ +) +{ + WCHAR c; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + + } else { + if (dir) { /* OEM code to Unicode */ + c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; + + } else { /* Unicode to OEM code */ + for (c = 0; c < 0x80; c++) { + if (chr == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted (BMP only) */ +) +{ + /* Compressed upper conversion table */ + static const WCHAR cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WCHAR cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF2,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WCHAR *p; + WCHAR bc, nc, cmd; + + + p = chr < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || chr < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (chr < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: chr = p[chr - bc]; break; /* Table conversion */ + case 1: chr -= (chr - bc) & 1; break; /* Case pairs */ + case 2: chr -= 16; break; /* Shift -16 */ + case 3: chr -= 32; break; /* Shift -32 */ + case 4: chr -= 48; break; /* Shift -48 */ + case 5: chr -= 26; break; /* Shift -26 */ + case 6: chr += 8; break; /* Shift +8 */ + case 7: chr -= 80; break; /* Shift -80 */ + case 8: chr -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + + return chr; +} + diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/syscall.c b/Firmware/WIMU3/Libraries/FatFs/src/option/syscall.c new file mode 100644 index 0000000..4fed617 --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/syscall.c @@ -0,0 +1,151 @@ +/*------------------------------------------------------------------------*/ +/* Sample code of OS dependent controls for FatFs */ +/* (C)ChaN, 2014 */ +/*------------------------------------------------------------------------*/ + + +#include "../ff.h" + + +#if _FS_REENTRANT +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to create a new +/ synchronization object, such as semaphore and mutex. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ + BYTE vol, /* Corresponding volume (logical drive number) */ + _SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + int ret; + + + *sobj = CreateMutex(NULL, FALSE, NULL); /* Win32 */ + ret = (int)(*sobj != INVALID_HANDLE_VALUE); + +// *sobj = SyncObjects[vol]; /* uITRON (give a static sync object) */ +// ret = 1; /* The initial value of the semaphore must be 1. */ + +// *sobj = OSMutexCreate(0, &err); /* uC/OS-II */ +// ret = (int)(err == OS_NO_ERR); + +// *sobj = xSemaphoreCreateMutex(); /* FreeRTOS */ +// ret = (int)(*sobj != NULL); + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to delete a synchronization +/ object that created with ff_cre_syncobj() function. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to any error */ + _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + int ret; + + + ret = CloseHandle(sobj); /* Win32 */ + +// ret = 1; /* uITRON (nothing to do) */ + +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); /* uC/OS-II */ +// ret = (int)(err == OS_NO_ERR); + +// vSemaphoreDelete(sobj); /* FreeRTOS */ +// ret = 1; + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a 0 is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ + _SYNC_t sobj /* Sync object to wait */ +) +{ + int ret; + + ret = (int)(WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0); /* Win32 */ + +// ret = (int)(wai_sem(sobj) == E_OK); /* uITRON */ + +// OSMutexPend(sobj, _FS_TIMEOUT, &err)); /* uC/OS-II */ +// ret = (int)(err == OS_NO_ERR); + +// ret = (int)(xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE); /* FreeRTOS */ + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + _SYNC_t sobj /* Sync object to be signaled */ +) +{ + ReleaseMutex(sobj); /* Win32 */ + +// sig_sem(sobj); /* uITRON */ + +// OSMutexPost(sobj); /* uC/OS-II */ + +// xSemaphoreGive(sobj); /* FreeRTOS */ +} + +#endif + + + + +#if _USE_LFN == 3 /* LFN with a working buffer on the heap */ +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ +/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE. +*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); /* Allocate a new memory block with POSIX API */ +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free */ +) +{ + free(mblock); /* Discard the memory block with POSIX API */ +} + +#endif diff --git a/Firmware/WIMU3/Libraries/FatFs/src/option/unicode.c b/Firmware/WIMU3/Libraries/FatFs/src/option/unicode.c new file mode 100644 index 0000000..0afe13e --- /dev/null +++ b/Firmware/WIMU3/Libraries/FatFs/src/option/unicode.c @@ -0,0 +1,17 @@ +#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/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/Release_Notes.html b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/Release_Notes.html new file mode 100644 index 0000000..0673791 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/Release_Notes.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + +Release Notes for STM32L1xx Standard Peripherals Library Drivers + + + + + +
    +


    +

    +
    + + + + + + +
    + + + + + + +
    + +

    Release +Notes for STM32L1xx Standard Peripherals Library Drivers
    +

    +

    Copyright +© 2013 STMicroelectronics

    +

    +
    +

     

    + + + + + + +
    +

    Contents

    +
      +
    1. STM32L1xx Standard Peripherals Library Drivers update history
    2. +
    3. License
    4. +
    +

    STM32L1xx Standard Peripherals Library Drivers update history


    +

    V1.2.0 / 22-February-2013

    + + + + +

    Main +Changes

    +
      +
    • stm32l1xx_flash.c/.h: add functions to manage the Proprietary code Read Out Protection (PcROP) feature (available only in STM32L1XX_MDP devices):
      +
    • +
        +
      • FLASH_Status FLASH_OB_PCROPConfig(uint32_t OB_WRP, FunctionalState NewState);
      • +
      • FLASH_Status FLASH_OB_PCROP1Config(uint32_t OB_WRP1, FunctionalState NewState);
      • +
      • FLASH_Status FLASH_OB_PCROPSelectionConfig(uint16_t OB_PCROP);
      • +
      • FlagStatus FLASH_OB_GetSPRMOD(void);
      • +
      • Add new define FLASH_FLAG_RDERR for Read protected error flag
      • +
      • For more details on how to activate this feature, please refer to the procedure provided in stm32l1xx_flash.c file starting from line 971.
      • +
      +
    • stm32l1xx_exti.c
    • +
        +
      • EXTI_GetITStatus() updated to remove test on IMR register to avoid corner case limitation
        +
      • +
      + +
    + + + +

    V1.1.1 / 05-March-2012

    +

    Main +Changes

    + +
    • All source files: license disclaimer text update and add link to the License file on ST Internet.

    V1.1.0 / 24-January-2012

    +

    Main +Changes

    + +
      +
    • Official version for STM32L1xx High-density and Medium-density Plus devices.
      +
    • +
    • Add new drivers for new peripherals on STM32L1xx High-density and Medium-density Plus devices:
    • +
        +
      • stm32l1xx_aes.h/.c
      • +
      • stm32l1xx_fsmc.h/.c
      • +
      • stm32l1xx_opamp.h/.c
      • +
      • stm32l1xx_sdio.h/.c
      • +
      +
    • stm32l1xx_adc.h/.c
    • +
        +
      • Add new channel for ADC Bank B
      • +
      • Add new function to select between Bank A and Bank B: void ADC_BankSelection(ADC_TypeDef* ADCx, uint8_t ADC_BankSelection);
      • +
      • Update ADC_InjectedChannelConfig() and ADC_RegularChannelConfig() to support new ADC channels.
        +
      • +
      +
    • stm32l1xx_comp.h/.c
    • +
        +
      • Add new function: void COMP_SW1SwitchConfig(FunctionalState NewState);
        +
      • +
      +
    • stm32l1xx_dbgmcu.h/.c
    • +
        +
      • Add new parameter for TIM5
        +
      • +
      +
    • stm32l1xx_dma.h/.c
    • +
        +
      • Add DMA2 support
        +
      • +
      +
    • stm32l1xx_exti.h/.c
    • +
        +
      • Add new EXTI Line 23 connected to TS channel acquisition event
        +
      • +
      +
    • stm32l1xx_flash.h/.c
    • +
        +
      • Add new pages definitions for Write protection
      • +
      • Add new flag FLASH_FLAG_OPTVERRUSR
      • +
      • Add +new functions: FLASH_OB_WRP1Config(), FLASH_OB_WRP2Config(), +FLASH_OB_BootConfig(), FLASH_OB_GetWRP1(), FLASH_OB_GetWRP2(), +FLASH_EraseParallelPage() and FLASH_ProgramParallelHalfPage().
      • +
      • Update +functions to avoid STM32L1XX_MD workaround on Data EEPROM (FAST) +halfword/byte erase: DATA_EEPROM_FastProgramByte(), +DATA_EEPROM_FastProgramHalfWord(), DATA_EEPROM_ProgramByte() and +DATA_EEPROM_ProgramHalfWord().
      • +
      +
    • stm32l1xx_flash_ramfunc.c
    • +
        +
      • Add new functions: FLASH_EraseParallelPage() and FLASH_ProgramParallelHalfPage().
      • +
      • Update +FLASH_ProgramHalfPage(), FLASH_ProgramParallelHalfPage(), +DATA_EEPROM_EraseDoubleWord() and DATA_EEPROM_ProgramDoubleWord() +functions.
      • + +
      +
    • stm32l1xx_gpio.h/.c
    • +
        +
      • Add new GPIO port definition.
      • +
      • Add new alternate functions for new peripherals.
        +
      • +
      +
    • stm32l1xx_i2c.h/.c
    • +
        +
      • Add new function: void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition)
        +
      • +
      +
    • stm32l1xx_rcc.h/.c
    • +
        +
      • Add new interrupt for RCC_IT_LSECSS
      • +
      • Add new definitions for new peripherals
      • +
      • Add new function: RCC_LSEClockSecuritySystemCmd()
        +
      • +
      +
    • stm32l1xx_rtc.h/.c
    • +
        +
      • SYNCH_PREDIV max value changed to 0x7FFF
      • +
      • Add new definitions for RTC Alarm Sub Second "RTC_Alarm_Sub_Seconds_Masks" and Alarm Sub Second max value (0x7FFF)
      • +
      • Add +new definitions for: RTC_Calib_Output_selection, +RTC_Smooth_calib_period, RTC_Smooth_calib_Plus_pulses, +RTC_Smooth_calib_Minus_pulses.
      • +
      • Add new definitions: RTC_TamperTrigger_LowLevel and RTC_TamperTrigger_HighLevel.
      • +
      • Add +new definitions for RTC_Tamper_Filter, RTC_Tamper_Sampling_Frequencies, +RTC_Tamper_Pin_Precharge_Duration, RTC_Tamper_2 and RTC_Tamper_3.
      • +
      • Add new  RTC_Add_1_Second_Parameter and RTC_Substract_Fraction_Of_Second_Value defintions.
      • +
      • Add new Backup registers definitions from RTC_BKP_DR20 to RTC_BKP_DR31.
      • +
      • Add new flags: RTC_FLAG_RECALPF, RTC_FLAG_TAMP3F and RTC_FLAG_TAMP2F
      • +
      • Add new interrupts definitions RTC_IT_TAMP2 and RTC_IT_TAMP3
      • +
      • Add new functions: RTC_BypassShadowCmd(), +RTC_GetSubSecond(), RTC_AlarmSubSecondConfig(), +RTC_GetAlarmSubSecond(), RTC_CalibOutputConfig(), +RTC_SmoothCalibConfig(), RTC_GetTimeStampSubSecond(), +RTC_TamperFilterConfig(), RTC_TamperSamplingFreqConfig(), +RTC_TamperPinsPrechargeDuration(), RTC_TimeStampOnTamperDetectionCmd(), +RTC_TamperPullUpCmd(), RTC_SynchroShiftConfig().
        +
      • +
      +
    • stm32l1xx_spi.h/.c
    • +
        +
      • Add support for I2S
      • +
      • Add new structure "I2S_InitTypeDef"
      • +
      • Add new parameter: I2S_Mode, I2S_Standard, I2S_Data_Format, I2S_MCLK_Output, I2S_Audio_Frequency and I2S_Clock_Polarity.
      • +
      • Add 2 interrupts: I2S_IT_UDR and SPI_I2S_IT_FRE
      • +
      • Add new flags: I2S_FLAG_CHSIDE, I2S_FLAG_UDR and SPI_I2S_FLAG_FRE
      • +
      • Add new functions: I2S_Init(), I2S_StructInit() and I2S_Cmd()
        +
      • +
      +
    • stm32l1xx_syscfg.h/.c
    • +
        +
      •  Add support for new port: EXTI_PortSourceGPIOF and EXTI_PortSourceGPIOG
      • +
      • Add new remap for FSMC: SYSCFG_MemoryRemap_FSMC
      • +
      • Add new RI Channels and new RI IOSwitch
      • +
      • Add new functions: SYSCFG_GetBootMode() and SYSCFG_RIChannelSpeedConfig()
        +
      • +
      +
    • stm32l1xx_tim.h/.c
    • +
        +
      • Update to support TIM 32-bit
      • +
      • Change TIM_Period and TIM_Pulse to be declared as 32-bit
      • +
      • Remove the "TIM_DMABase_RCR": the RCR register is not present on STM32L1xx family.
        +
      • +
      • Add new parameter: TIM_DMABase_OR
        +
      • +
      • Change "TIM_DMABurstLength_1Byte" to "TIM_DMABurstLength_1Transfer"
      • +
      • Add +new TIM_Remap: TIM2_TIM10_OC, TIM2_TIM5_TRGO, TIM3_TIM11_OC, +TIM3_TIM5_TRGO, TIM10_ETR_LSE, TIM10_ETR_TIM9_TRGO, TIM11_ETR_LSE and +TIM11_ETR_TIM9_TRGO.
      • +
      • Update TIM_RemapConfig() function coding.
      • +
      • Update all functions header comments to support TIM5.
        +
      • +
      +
    • stm32l1xx_usart.h/.c
    • +
        +
      • Update to support UART4 and UART5
      • +
      • Update all functions header comment
        +
      • +
      +
    +


    +

    + +

    V1.0.0 / 31-December-2010

    Main +Changes

    +
    • 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/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/misc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/misc.h new file mode 100644 index 0000000..74d7b29 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/misc.h @@ -0,0 +1,202 @@ +/** + ****************************************************************************** + * @file misc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the miscellaneous + * firmware library functions (add-on to CMSIS functions). + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __MISC_H +#define __MISC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup MISC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief NVIC Init Structure definition + */ + +typedef struct +{ + uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. + This parameter can be a value of @ref IRQn_Type + (For the complete STM32 Devices IRQ Channels list, please + refer to stm32l1xx.h file) */ + + uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel + specified in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified + in NVIC_IRQChannel. This parameter can be a value + between 0 and 15 as described in the table @ref NVIC_Priority_Table */ + + FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel + will be enabled or disabled. + This parameter can be set either to ENABLE or DISABLE */ +} NVIC_InitTypeDef; + +/** + * +@verbatim + The table below gives the allowed values of the pre-emption priority and subpriority according + to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function + ============================================================================================================================ + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ============================================================================================================================ + NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority + | | | 4 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority + | | | 3 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority + | | | 2 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority + | | | 1 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority + | | | 0 bits for subpriority + ============================================================================================================================ +@endverbatim +*/ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup MISC_Exported_Constants + * @{ + */ + +/** @defgroup Vector_Table_Base + * @{ + */ + +#define NVIC_VectTab_RAM ((uint32_t)0x20000000) +#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) +#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ + ((VECTTAB) == NVIC_VectTab_FLASH)) +/** + * @} + */ + +/** @defgroup System_Low_Power + * @{ + */ + +#define NVIC_LP_SEVONPEND ((uint8_t)0x10) +#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) +#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) +#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ + ((LP) == NVIC_LP_SLEEPDEEP) || \ + ((LP) == NVIC_LP_SLEEPONEXIT)) +/** + * @} + */ + +/** @defgroup Preemption_Priority_Group + * @{ + */ + +#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ + +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ + ((GROUP) == NVIC_PriorityGroup_1) || \ + ((GROUP) == NVIC_PriorityGroup_2) || \ + ((GROUP) == NVIC_PriorityGroup_3) || \ + ((GROUP) == NVIC_PriorityGroup_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) + +#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x0005FFFF) + +/** + * @} + */ + +/** @defgroup SysTick_clock_source + * @{ + */ + +#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) +#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) +#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ + ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); + +#ifdef __cplusplus +} +#endif + +#endif /* __MISC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_adc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_adc.h new file mode 100644 index 0000000..6b1fc4c --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_adc.h @@ -0,0 +1,650 @@ +/** + ****************************************************************************** + * @file stm32l1xx_adc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the ADC firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_ADC_H +#define __STM32L1xx_ADC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief ADC Init structure definition + */ + +typedef struct +{ + uint32_t ADC_Resolution; /*!< Selects the resolution of the conversion. + This parameter can be a value of @ref ADC_Resolution */ + + FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed in + Scan (multichannel) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in + Continuous or Single mode. + This parameter can be set to ENABLE or DISABLE. */ + + uint32_t ADC_ExternalTrigConvEdge; /*!< Selects the external trigger Edge and enables the + trigger of a regular group. This parameter can be a value + of @ref ADC_external_trigger_edge_for_regular_channels_conversion */ + + uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog + to digital conversion of regular channels. This parameter + can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ + + uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right. + This parameter can be a value of @ref ADC_data_align */ + + uint8_t ADC_NbrOfConversion; /*!< Specifies the number of ADC conversions that will be done + using the sequencer for regular channel group. + This parameter must range from 1 to 27. */ +}ADC_InitTypeDef; + +typedef struct +{ + uint32_t ADC_Prescaler; /*!< Selects the ADC prescaler. + This parameter can be a value + of @ref ADC_Prescaler */ +}ADC_CommonInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup ADC_Exported_Constants + * @{ + */ +#define IS_ADC_ALL_PERIPH(PERIPH) ((PERIPH) == ADC1) +#define IS_ADC_DMA_PERIPH(PERIPH) ((PERIPH) == ADC1) + +/** @defgroup ADC_Power_down_during_Idle_and_or_Delay_phase + * @{ + */ +#define ADC_PowerDown_Delay ((uint32_t)0x00010000) +#define ADC_PowerDown_Idle ((uint32_t)0x00020000) +#define ADC_PowerDown_Idle_Delay ((uint32_t)0x00030000) + +#define IS_ADC_POWER_DOWN(DWON) (((DWON) == ADC_PowerDown_Delay) || \ + ((DWON) == ADC_PowerDown_Idle) || \ + ((DWON) == ADC_PowerDown_Idle_Delay)) +/** + * @} + */ + + +/** @defgroup ADC_Prescaler + * @{ + */ +#define ADC_Prescaler_Div1 ((uint32_t)0x00000000) +#define ADC_Prescaler_Div2 ((uint32_t)0x00010000) +#define ADC_Prescaler_Div4 ((uint32_t)0x00020000) + +#define IS_ADC_PRESCALER(PRESCALER) (((PRESCALER) == ADC_Prescaler_Div1) || \ + ((PRESCALER) == ADC_Prescaler_Div2) || \ + ((PRESCALER) == ADC_Prescaler_Div4)) +/** + * @} + */ + + + +/** @defgroup ADC_Resolution + * @{ + */ +#define ADC_Resolution_12b ((uint32_t)0x00000000) +#define ADC_Resolution_10b ((uint32_t)0x01000000) +#define ADC_Resolution_8b ((uint32_t)0x02000000) +#define ADC_Resolution_6b ((uint32_t)0x03000000) + +#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_Resolution_12b) || \ + ((RESOLUTION) == ADC_Resolution_10b) || \ + ((RESOLUTION) == ADC_Resolution_8b) || \ + ((RESOLUTION) == ADC_Resolution_6b)) + +/** + * @} + */ + +/** @defgroup ADC_external_trigger_edge_for_regular_channels_conversion + * @{ + */ +#define ADC_ExternalTrigConvEdge_None ((uint32_t)0x00000000) +#define ADC_ExternalTrigConvEdge_Rising ((uint32_t)0x10000000) +#define ADC_ExternalTrigConvEdge_Falling ((uint32_t)0x20000000) +#define ADC_ExternalTrigConvEdge_RisingFalling ((uint32_t)0x30000000) + +#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigConvEdge_None) || \ + ((EDGE) == ADC_ExternalTrigConvEdge_Rising) || \ + ((EDGE) == ADC_ExternalTrigConvEdge_Falling) || \ + ((EDGE) == ADC_ExternalTrigConvEdge_RisingFalling)) +/** + * @} + */ + +/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion + * @{ + */ + +/* TIM2 */ +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x02000000) +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x03000000) +#define ADC_ExternalTrigConv_T2_TRGO ((uint32_t)0x06000000) + +/* TIM3 */ +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x07000000) +#define ADC_ExternalTrigConv_T3_CC3 ((uint32_t)0x08000000) +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x04000000) + +/* TIM4 */ +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x05000000) +#define ADC_ExternalTrigConv_T4_TRGO ((uint32_t)0x09000000) + +/* TIM6 */ +#define ADC_ExternalTrigConv_T6_TRGO ((uint32_t)0x0A000000) + +/* TIM9 */ +#define ADC_ExternalTrigConv_T9_CC2 ((uint32_t)0x00000000) +#define ADC_ExternalTrigConv_T9_TRGO ((uint32_t)0x01000000) + +/* EXTI */ +#define ADC_ExternalTrigConv_Ext_IT11 ((uint32_t)0x0F000000) + +#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T9_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T9_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T2_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T3_CC3) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T4_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_T6_TRGO) || \ + ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11)) +/** + * @} + */ + +/** @defgroup ADC_data_align + * @{ + */ + +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) + +#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ + ((ALIGN) == ADC_DataAlign_Left)) +/** + * @} + */ + +/** @defgroup ADC_channels + * @{ + */ +/* ADC Bank A Channels -------------------------------------------------------*/ +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) + +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) + + +/* ADC Bank B Channels -------------------------------------------------------*/ +#define ADC_Channel_0b ADC_Channel_0 +#define ADC_Channel_1b ADC_Channel_1 +#define ADC_Channel_2b ADC_Channel_2 +#define ADC_Channel_3b ADC_Channel_3 + +#define ADC_Channel_6b ADC_Channel_6 +#define ADC_Channel_7b ADC_Channel_7 +#define ADC_Channel_8b ADC_Channel_8 +#define ADC_Channel_9b ADC_Channel_9 +#define ADC_Channel_10b ADC_Channel_10 +#define ADC_Channel_11b ADC_Channel_11 +#define ADC_Channel_12b ADC_Channel_12 + +/* ADC Common Channels (ADC Bank A and B) ------------------------------------*/ +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) + +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) +#define ADC_Channel_18 ((uint8_t)0x12) +#define ADC_Channel_19 ((uint8_t)0x13) +#define ADC_Channel_20 ((uint8_t)0x14) +#define ADC_Channel_21 ((uint8_t)0x15) +#define ADC_Channel_22 ((uint8_t)0x16) +#define ADC_Channel_23 ((uint8_t)0x17) +#define ADC_Channel_24 ((uint8_t)0x18) +#define ADC_Channel_25 ((uint8_t)0x19) + +#define ADC_Channel_27 ((uint8_t)0x1B) +#define ADC_Channel_28 ((uint8_t)0x1C) +#define ADC_Channel_29 ((uint8_t)0x1D) +#define ADC_Channel_30 ((uint8_t)0x1E) +#define ADC_Channel_31 ((uint8_t)0x1F) + +#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) +#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \ + ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \ + ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \ + ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \ + ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \ + ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \ + ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \ + ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \ + ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17) || \ + ((CHANNEL) == ADC_Channel_18) || ((CHANNEL) == ADC_Channel_19) || \ + ((CHANNEL) == ADC_Channel_20) || ((CHANNEL) == ADC_Channel_21) || \ + ((CHANNEL) == ADC_Channel_22) || ((CHANNEL) == ADC_Channel_23) || \ + ((CHANNEL) == ADC_Channel_24) || ((CHANNEL) == ADC_Channel_25) || \ + ((CHANNEL) == ADC_Channel_27) || ((CHANNEL) == ADC_Channel_28) || \ + ((CHANNEL) == ADC_Channel_29) || ((CHANNEL) == ADC_Channel_30) || \ + ((CHANNEL) == ADC_Channel_31)) +/** + * @} + */ + +/** @defgroup ADC_sampling_times + * @{ + */ + +#define ADC_SampleTime_4Cycles ((uint8_t)0x00) +#define ADC_SampleTime_9Cycles ((uint8_t)0x01) +#define ADC_SampleTime_16Cycles ((uint8_t)0x02) +#define ADC_SampleTime_24Cycles ((uint8_t)0x03) +#define ADC_SampleTime_48Cycles ((uint8_t)0x04) +#define ADC_SampleTime_96Cycles ((uint8_t)0x05) +#define ADC_SampleTime_192Cycles ((uint8_t)0x06) +#define ADC_SampleTime_384Cycles ((uint8_t)0x07) + +#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_4Cycles) || \ + ((TIME) == ADC_SampleTime_9Cycles) || \ + ((TIME) == ADC_SampleTime_16Cycles) || \ + ((TIME) == ADC_SampleTime_24Cycles) || \ + ((TIME) == ADC_SampleTime_48Cycles) || \ + ((TIME) == ADC_SampleTime_96Cycles) || \ + ((TIME) == ADC_SampleTime_192Cycles) || \ + ((TIME) == ADC_SampleTime_384Cycles)) +/** + * @} + */ + +/** @defgroup ADC_Delay_length + * @{ + */ + +#define ADC_DelayLength_None ((uint8_t)0x00) +#define ADC_DelayLength_Freeze ((uint8_t)0x10) +#define ADC_DelayLength_7Cycles ((uint8_t)0x20) +#define ADC_DelayLength_15Cycles ((uint8_t)0x30) +#define ADC_DelayLength_31Cycles ((uint8_t)0x40) +#define ADC_DelayLength_63Cycles ((uint8_t)0x50) +#define ADC_DelayLength_127Cycles ((uint8_t)0x60) +#define ADC_DelayLength_255Cycles ((uint8_t)0x70) + +#define IS_ADC_DELAY_LENGTH(LENGTH) (((LENGTH) == ADC_DelayLength_None) || \ + ((LENGTH) == ADC_DelayLength_Freeze) || \ + ((LENGTH) == ADC_DelayLength_7Cycles) || \ + ((LENGTH) == ADC_DelayLength_15Cycles) || \ + ((LENGTH) == ADC_DelayLength_31Cycles) || \ + ((LENGTH) == ADC_DelayLength_63Cycles) || \ + ((LENGTH) == ADC_DelayLength_127Cycles) || \ + ((LENGTH) == ADC_DelayLength_255Cycles)) + +/** + * @} + */ + +/** @defgroup ADC_external_trigger_edge_for_injected_channels_conversion + * @{ + */ +#define ADC_ExternalTrigInjecConvEdge_None ((uint32_t)0x00000000) +#define ADC_ExternalTrigInjecConvEdge_Rising ((uint32_t)0x00100000) +#define ADC_ExternalTrigInjecConvEdge_Falling ((uint32_t)0x00200000) +#define ADC_ExternalTrigInjecConvEdge_RisingFalling ((uint32_t)0x00300000) + +#define IS_ADC_EXT_INJEC_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigInjecConvEdge_None) || \ + ((EDGE) == ADC_ExternalTrigInjecConvEdge_Rising) || \ + ((EDGE) == ADC_ExternalTrigInjecConvEdge_Falling) || \ + ((EDGE) == ADC_ExternalTrigInjecConvEdge_RisingFalling)) +/** + * @} + */ + + +/** @defgroup ADC_external_trigger_sources_for_injected_channels_conversion + * @{ + */ + + +/* TIM2 */ +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00020000) +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00030000) + +/* TIM3 */ +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00040000) + +/* TIM4 */ +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00050000) +#define ADC_ExternalTrigInjecConv_T4_CC1 ((uint32_t)0x00060000) +#define ADC_ExternalTrigInjecConv_T4_CC2 ((uint32_t)0x00070000) +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00080000) + +/* TIM7 */ +#define ADC_ExternalTrigInjecConv_T7_TRGO ((uint32_t)0x000A0000) + +/* TIM9 */ +#define ADC_ExternalTrigInjecConv_T9_CC1 ((uint32_t)0x00000000) +#define ADC_ExternalTrigInjecConv_T9_TRGO ((uint32_t)0x00010000) + +/* TIM10 */ +#define ADC_ExternalTrigInjecConv_T10_CC1 ((uint32_t)0x00090000) + +/* EXTI */ +#define ADC_ExternalTrigInjecConv_Ext_IT15 ((uint32_t)0x000F0000) + +#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T9_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T9_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC2) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T10_CC1) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_T7_TRGO) || \ + ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15)) +/** + * @} + */ + +/** @defgroup ADC_injected_channel_selection + * @{ + */ +#define ADC_InjectedChannel_1 ((uint8_t)0x18) +#define ADC_InjectedChannel_2 ((uint8_t)0x1C) +#define ADC_InjectedChannel_3 ((uint8_t)0x20) +#define ADC_InjectedChannel_4 ((uint8_t)0x24) + +#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ + ((CHANNEL) == ADC_InjectedChannel_2) || \ + ((CHANNEL) == ADC_InjectedChannel_3) || \ + ((CHANNEL) == ADC_InjectedChannel_4)) +/** + * @} + */ + +/** @defgroup ADC_analog_watchdog_selection + * @{ + */ + +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ + ((WATCHDOG) == ADC_AnalogWatchdog_None)) +/** + * @} + */ + +/** @defgroup ADC_interrupts_definition + * @{ + */ + +#define ADC_IT_AWD ((uint16_t)0x0106) +#define ADC_IT_EOC ((uint16_t)0x0205) +#define ADC_IT_JEOC ((uint16_t)0x0407) +#define ADC_IT_OVR ((uint16_t)0x201A) + +#define IS_ADC_IT(IT) (((IT) == ADC_IT_AWD) || ((IT) == ADC_IT_EOC) || \ + ((IT) == ADC_IT_JEOC)|| ((IT) == ADC_IT_OVR)) +/** + * @} + */ + +/** @defgroup ADC_flags_definition + * @{ + */ + +#define ADC_FLAG_AWD ((uint16_t)0x0001) +#define ADC_FLAG_EOC ((uint16_t)0x0002) +#define ADC_FLAG_JEOC ((uint16_t)0x0004) +#define ADC_FLAG_JSTRT ((uint16_t)0x0008) +#define ADC_FLAG_STRT ((uint16_t)0x0010) +#define ADC_FLAG_OVR ((uint16_t)0x0020) +#define ADC_FLAG_ADONS ((uint16_t)0x0040) +#define ADC_FLAG_RCNR ((uint16_t)0x0100) +#define ADC_FLAG_JCNR ((uint16_t)0x0200) + +#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFC0) == 0x00) && ((FLAG) != 0x00)) + +#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_EOC) || \ + ((FLAG) == ADC_FLAG_JEOC) || ((FLAG)== ADC_FLAG_JSTRT) || \ + ((FLAG) == ADC_FLAG_STRT) || ((FLAG)== ADC_FLAG_OVR) || \ + ((FLAG) == ADC_FLAG_ADONS) || ((FLAG)== ADC_FLAG_RCNR) || \ + ((FLAG) == ADC_FLAG_JCNR)) +/** + * @} + */ + +/** @defgroup ADC_thresholds + * @{ + */ + +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_offset + * @{ + */ + +#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) + +/** + * @} + */ + +/** @defgroup ADC_injected_length + * @{ + */ + +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) + +/** + * @} + */ + +/** @defgroup ADC_injected_rank + * @{ + */ + +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) + +/** + * @} + */ + +/** @defgroup ADC_regular_length + * @{ + */ + +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 28)) + +/** + * @} + */ + +/** @defgroup ADC_regular_rank + * @{ + */ + +#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 1) && ((RANK) <= 28)) + +/** + * @} + */ + +/** @defgroup ADC_regular_discontinuous_mode_number + * @{ + */ + +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) + +/** + * @} + */ + +/** @defgroup ADC_Bank_Selection + * @{ + */ +#define ADC_Bank_A ((uint8_t)0x00) +#define ADC_Bank_B ((uint8_t)0x01) +#define IS_ADC_BANK(BANK) (((BANK) == ADC_Bank_A) || ((BANK) == ADC_Bank_B)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the ADC configuration to the default reset state *****/ +void ADC_DeInit(ADC_TypeDef* ADCx); + +/* Initialization and Configuration functions *********************************/ +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); +void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct); +void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct); +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_BankSelection(ADC_TypeDef* ADCx, uint8_t ADC_Bank); + +/* Power saving functions *****************************************************/ +void ADC_PowerDownCmd(ADC_TypeDef* ADCx, uint32_t ADC_PowerDown, FunctionalState NewState); +void ADC_DelaySelectionConfig(ADC_TypeDef* ADCx, uint8_t ADC_DelayLength); + +/* Analog Watchdog configuration functions ************************************/ +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); + +/* Temperature Sensor & Vrefint (Voltage Reference internal) management function */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState); + +/* Regular Channels Configuration functions ***********************************/ +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_SoftwareStartConv(ADC_TypeDef* ADCx); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); +void ADC_EOCOnEachRegularChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); + +/* Regular Channels DMA Configuration functions *******************************/ +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx, FunctionalState NewState); + +/* Injected channels Configuration functions **********************************/ +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvEdgeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConvEdge); +void ADC_SoftwareStartInjectedConv(ADC_TypeDef* ADCx); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); + +/* Interrupts and flags management functions **********************************/ +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint16_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint16_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_ADC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_aes.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_aes.h new file mode 100644 index 0000000..27792ac --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_aes.h @@ -0,0 +1,236 @@ +/** + ****************************************************************************** + * @file stm32l1xx_aes.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the AES firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_AES_H +#define __STM32L1xx_AES_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup AES + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief AES Init structure definition + */ +typedef struct +{ + uint32_t AES_Operation; /*!< Specifies the AES mode of operation. + This parameter can be a value of @ref AES_possible_Operation_modes */ + uint32_t AES_Chaining; /*!< Specifies the AES Chaining modes: ECB, CBC or CTR. + This parameter can be a value of @ref AES_possible_chaining_modes */ + uint32_t AES_DataType; /*!< Specifies the AES data swapping: 32-bit, 16-bit, 8-bit or 1-bit. + This parameter can be a value of @ref AES_Data_Types */ +}AES_InitTypeDef; + +/** + * @brief AES Key(s) structure definition + */ +typedef struct +{ + uint32_t AES_Key0; /*!< Key[31:0] */ + uint32_t AES_Key1; /*!< Key[63:32] */ + uint32_t AES_Key2; /*!< Key[95:64] */ + uint32_t AES_Key3; /*!< Key[127:96] */ +}AES_KeyInitTypeDef; + +/** + * @brief AES Initialization Vectors (IV) structure definition + */ +typedef struct +{ + uint32_t AES_IV0; /*!< Init Vector IV[31:0] */ + uint32_t AES_IV1; /*!< Init Vector IV[63:32] */ + uint32_t AES_IV2; /*!< Init Vector IV[95:64] */ + uint32_t AES_IV3; /*!< Init Vector IV[127:96] */ +}AES_IVInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup AES_Exported_Constants + * @{ + */ + +/** @defgroup AES_possible_Operation_modes + * @{ + */ +#define AES_Operation_Encryp ((uint32_t)0x00000000) /*!< AES in Encryption mode */ +#define AES_Operation_KeyDeriv AES_CR_MODE_0 /*!< AES in Key Derivation mode */ +#define AES_Operation_Decryp AES_CR_MODE_1 /*!< AES in Decryption mode */ +#define AES_Operation_KeyDerivAndDecryp AES_CR_MODE /*!< AES in Key Derivation and Decryption mode */ + +#define IS_AES_MODE(OPERATION) (((OPERATION) == AES_Operation_Encryp) || \ + ((OPERATION) == AES_Operation_KeyDeriv) || \ + ((OPERATION) == AES_Operation_Decryp) || \ + ((OPERATION) == AES_Operation_KeyDerivAndDecryp)) + +/** + * @} + */ + +/** @defgroup AES_possible_chaining_modes + * @{ + */ +#define AES_Chaining_ECB ((uint32_t)0x00000000) /*!< AES in ECB chaining mode */ +#define AES_Chaining_CBC AES_CR_CHMOD_0 /*!< AES in CBC chaining mode */ +#define AES_Chaining_CTR AES_CR_CHMOD_1 /*!< AES in CTR chaining mode */ + +#define IS_AES_CHAINING(CHAINING) (((CHAINING) == AES_Chaining_ECB) || \ + ((CHAINING) == AES_Chaining_CBC) || \ + ((CHAINING) == AES_Chaining_CTR)) +/** + * @} + */ + +/** @defgroup AES_Data_Types + * @{ + */ +#define AES_DataType_32b ((uint32_t)0x00000000) /*!< 32-bit data. No swapping */ +#define AES_DataType_16b AES_CR_DATATYPE_0 /*!< 16-bit data. Each half word is swapped */ +#define AES_DataType_8b AES_CR_DATATYPE_1 /*!< 8-bit data. All bytes are swapped */ +#define AES_DataType_1b AES_CR_DATATYPE /*!< 1-bit data. In the word all bits are swapped */ + +#define IS_AES_DATATYPE(DATATYPE) (((DATATYPE) == AES_DataType_32b) || \ + ((DATATYPE) == AES_DataType_16b)|| \ + ((DATATYPE) == AES_DataType_8b) || \ + ((DATATYPE) == AES_DataType_1b)) +/** + * @} + */ + +/** @defgroup AES_Flags + * @{ + */ +#define AES_FLAG_CCF AES_SR_CCF /*!< Computation Complete Flag */ +#define AES_FLAG_RDERR AES_SR_RDERR /*!< Read Error Flag */ +#define AES_FLAG_WRERR AES_SR_WRERR /*!< Write Error Flag */ + +#define IS_AES_FLAG(FLAG) (((FLAG) == AES_FLAG_CCF) || \ + ((FLAG) == AES_FLAG_RDERR) || \ + ((FLAG) == AES_FLAG_WRERR)) +/** + * @} + */ + +/** @defgroup AES_Interrupts + * @{ + */ +#define AES_IT_CC AES_CR_CCIE /*!< Computation Complete interrupt */ +#define AES_IT_ERR AES_CR_ERRIE /*!< Error interrupt */ + +#define IS_AES_IT(IT) ((((IT) & (uint32_t)0xFFFFF9FF) == 0x00) && ((IT) != 0x00)) +#define IS_AES_GET_IT(IT) (((IT) == AES_IT_CC) || ((IT) == AES_IT_ERR)) + +/** + * @} + */ + +/** @defgroup AES_DMA_Transfer_modes + * @{ + */ +#define AES_DMATransfer_In AES_CR_DMAINEN /*!< DMA requests enabled for input transfer phase */ +#define AES_DMATransfer_Out AES_CR_DMAOUTEN /*!< DMA requests enabled for input transfer phase */ +#define AES_DMATransfer_InOut (AES_CR_DMAINEN | AES_CR_DMAOUTEN) /*!< DMA requests enabled for both input and output phases */ + +#define IS_AES_DMA_TRANSFER(TRANSFER) (((TRANSFER) == AES_DMATransfer_In) || \ + ((TRANSFER) == AES_DMATransfer_Out) || \ + ((TRANSFER) == AES_DMATransfer_InOut)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Initialization and configuration functions *********************************/ +void AES_DeInit(void); +void AES_Init(AES_InitTypeDef* AES_InitStruct); +void AES_KeyInit(AES_KeyInitTypeDef* AES_KeyInitStruct); +void AES_IVInit(AES_IVInitTypeDef* AES_IVInitStruct); +void AES_Cmd(FunctionalState NewState); + +/* Structures initialization functions ****************************************/ +void AES_StructInit(AES_InitTypeDef* AES_InitStruct); +void AES_KeyStructInit(AES_KeyInitTypeDef* AES_KeyInitStruct); +void AES_IVStructInit(AES_IVInitTypeDef* AES_IVInitStruct); + +/* AES Read and Write functions **********************************************/ +void AES_WriteSubData(uint32_t Data); +uint32_t AES_ReadSubData(void); +void AES_ReadKey(AES_KeyInitTypeDef* AES_KeyInitStruct); +void AES_ReadIV(AES_IVInitTypeDef* AES_IVInitStruct); + +/* DMA transfers management function ******************************************/ +void AES_DMAConfig(uint32_t AES_DMATransfer, FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void AES_ITConfig(uint32_t AES_IT, FunctionalState NewState); +FlagStatus AES_GetFlagStatus(uint32_t AES_FLAG); +void AES_ClearFlag(uint32_t AES_FLAG); +ITStatus AES_GetITStatus(uint32_t AES_IT); +void AES_ClearITPendingBit(uint32_t AES_IT); + +/* High Level AES functions **************************************************/ +ErrorStatus AES_ECB_Encrypt(uint8_t* Key, uint8_t* Input, uint32_t Ilength, uint8_t* Output); +ErrorStatus AES_ECB_Decrypt(uint8_t* Key, uint8_t* Input, uint32_t Ilength, uint8_t* Output); +ErrorStatus AES_CBC_Encrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output); +ErrorStatus AES_CBC_Decrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output); +ErrorStatus AES_CTR_Encrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output); +ErrorStatus AES_CTR_Decrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_AES_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_comp.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_comp.h new file mode 100644 index 0000000..c36d56a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_comp.h @@ -0,0 +1,187 @@ +/** + ****************************************************************************** + * @file stm32l1xx_comp.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the COMP firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_COMP_H +#define __STM32L1xx_COMP_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup COMP + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief COMP Init structure definition + */ + +typedef struct +{ + uint32_t COMP_Speed; /*!< Defines the speed of comparator 2. + This parameter can be a value of @ref COMP_Speed */ + uint32_t COMP_InvertingInput; /*!< Selects the inverting input of the comparator 2. + This parameter can be a value of @ref COMP_InvertingInput */ + uint32_t COMP_OutputSelect; /*!< Selects the output redirection of the comparator 2. + This parameter can be a value of @ref COMP_OutputSelect */ + +}COMP_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup COMP_Exported_Constants + * @{ + */ + +#define COMP_OutputLevel_High ((uint32_t)0x00000001) +#define COMP_OutputLevel_Low ((uint32_t)0x00000000) + +/** @defgroup COMP_Selection + * @{ + */ + +#define COMP_Selection_COMP1 ((uint32_t)0x00000001) +#define COMP_Selection_COMP2 ((uint32_t)0x00000002) + +#define IS_COMP_ALL_PERIPH(PERIPH) (((PERIPH) == COMP_Selection_COMP1) || \ + ((PERIPH) == COMP_Selection_COMP2)) + +/** + * @} + */ + +/** @defgroup COMP_InvertingInput + * @{ + */ + +#define COMP_InvertingInput_None ((uint32_t)0x00000000) /* COMP2 is disabled when this parameter is selected */ +#define COMP_InvertingInput_IO ((uint32_t)0x00040000) +#define COMP_InvertingInput_VREFINT ((uint32_t)0x00080000) +#define COMP_InvertingInput_3_4VREFINT ((uint32_t)0x000C0000) +#define COMP_InvertingInput_1_2VREFINT ((uint32_t)0x00100000) +#define COMP_InvertingInput_1_4VREFINT ((uint32_t)0x00140000) +#define COMP_InvertingInput_DAC1 ((uint32_t)0x00180000) +#define COMP_InvertingInput_DAC2 ((uint32_t)0x001C0000) + +#define IS_COMP_INVERTING_INPUT(INPUT) (((INPUT) == COMP_InvertingInput_None) || \ + ((INPUT) == COMP_InvertingInput_IO) || \ + ((INPUT) == COMP_InvertingInput_VREFINT) || \ + ((INPUT) == COMP_InvertingInput_3_4VREFINT) || \ + ((INPUT) == COMP_InvertingInput_1_2VREFINT) || \ + ((INPUT) == COMP_InvertingInput_1_4VREFINT) || \ + ((INPUT) == COMP_InvertingInput_DAC1) || \ + ((INPUT) == COMP_InvertingInput_DAC2)) +/** + * @} + */ + +/** @defgroup COMP_OutputSelect + * @{ + */ + +#define COMP_OutputSelect_TIM2IC4 ((uint32_t)0x00000000) +#define COMP_OutputSelect_TIM2OCREFCLR ((uint32_t)0x00200000) +#define COMP_OutputSelect_TIM3IC4 ((uint32_t)0x00400000) +#define COMP_OutputSelect_TIM3OCREFCLR ((uint32_t)0x00600000) +#define COMP_OutputSelect_TIM4IC4 ((uint32_t)0x00800000) +#define COMP_OutputSelect_TIM4OCREFCLR ((uint32_t)0x00A00000) +#define COMP_OutputSelect_TIM10IC1 ((uint32_t)0x00C00000) +#define COMP_OutputSelect_None ((uint32_t)0x00E00000) + +#define IS_COMP_OUTPUT(OUTPUT) (((OUTPUT) == COMP_OutputSelect_TIM2IC4) || \ + ((OUTPUT) == COMP_OutputSelect_TIM2OCREFCLR) || \ + ((OUTPUT) == COMP_OutputSelect_TIM3IC4) || \ + ((OUTPUT) == COMP_OutputSelect_TIM3OCREFCLR) || \ + ((OUTPUT) == COMP_OutputSelect_TIM4IC4) || \ + ((OUTPUT) == COMP_OutputSelect_TIM4OCREFCLR) || \ + ((OUTPUT) == COMP_OutputSelect_TIM10IC1) || \ + ((OUTPUT) == COMP_OutputSelect_None)) +/** + * @} + */ + +/** @defgroup COMP_Speed + * @{ + */ + +#define COMP_Speed_Slow ((uint32_t)0x00000000) +#define COMP_Speed_Fast ((uint32_t)0x00001000) + +#define IS_COMP_SPEED(SPEED) (((SPEED) == COMP_Speed_Slow) || \ + ((SPEED) == COMP_Speed_Fast)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the COMP configuration to the default reset state ****/ +void COMP_DeInit(void); + +/* Initialization and Configuration functions *********************************/ +void COMP_Init(COMP_InitTypeDef* COMP_InitStruct); +void COMP_Cmd(FunctionalState NewState); +uint8_t COMP_GetOutputLevel(uint32_t COMP_Selection); +void COMP_SW1SwitchConfig(FunctionalState NewState); + +/* Window mode control function ***********************************************/ +void COMP_WindowCmd(FunctionalState NewState); + +/* Internal Reference Voltage (VREFINT) output function ***********************/ +void COMP_VrefintOutputCmd(FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_COMP_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_crc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_crc.h new file mode 100644 index 0000000..38d1390 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_crc.h @@ -0,0 +1,83 @@ +/** + ****************************************************************************** + * @file stm32l1xx_crc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the CRC firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_CRC_H +#define __STM32L1xx_CRC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup CRC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CRC_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_CRC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dac.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dac.h new file mode 100644 index 0000000..2dddd74 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dac.h @@ -0,0 +1,305 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dac.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the DAC firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_DAC_H +#define __STM32L1xx_DAC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DAC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief DAC Init structure definition + */ + +typedef struct +{ + uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. + This parameter can be a value of @ref DAC_trigger_selection */ + + uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves + are generated, or whether no wave is generated. + This parameter can be a value of @ref DAC_wave_generation */ + + uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or + the maximum amplitude triangle generation for the DAC channel. + This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ + + uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. + This parameter can be a value of @ref DAC_output_buffer */ +}DAC_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DAC_Exported_Constants + * @{ + */ + +/** @defgroup DAC_trigger_selection + * @{ + */ + +#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register + has been loaded, and not by external trigger */ +#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T9_TRGO ((uint32_t)0x0000001C) /*!< TIM9 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ + +#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ + ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T9_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ + ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ + ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ + ((TRIGGER) == DAC_Trigger_Software)) + +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_WaveGeneration_None ((uint32_t)0x00000000) +#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) +#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) +#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ + ((WAVE) == DAC_WaveGeneration_Noise) || \ + ((WAVE) == DAC_WaveGeneration_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_lfsrunmask_triangleamplitude + * @{ + */ + +#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ +#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ +#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ +#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ +#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ +#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ +#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ +#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ +#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ +#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ +#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ +#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ + +#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ + ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ + ((VALUE) == DAC_TriangleAmplitude_1) || \ + ((VALUE) == DAC_TriangleAmplitude_3) || \ + ((VALUE) == DAC_TriangleAmplitude_7) || \ + ((VALUE) == DAC_TriangleAmplitude_15) || \ + ((VALUE) == DAC_TriangleAmplitude_31) || \ + ((VALUE) == DAC_TriangleAmplitude_63) || \ + ((VALUE) == DAC_TriangleAmplitude_127) || \ + ((VALUE) == DAC_TriangleAmplitude_255) || \ + ((VALUE) == DAC_TriangleAmplitude_511) || \ + ((VALUE) == DAC_TriangleAmplitude_1023) || \ + ((VALUE) == DAC_TriangleAmplitude_2047) || \ + ((VALUE) == DAC_TriangleAmplitude_4095)) +/** + * @} + */ + +/** @defgroup DAC_output_buffer + * @{ + */ + +#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) +#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) +#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ + ((STATE) == DAC_OutputBuffer_Disable)) +/** + * @} + */ + +/** @defgroup DAC_Channel_selection + * @{ + */ + +#define DAC_Channel_1 ((uint32_t)0x00000000) +#define DAC_Channel_2 ((uint32_t)0x00000010) +#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ + ((CHANNEL) == DAC_Channel_2)) +/** + * @} + */ + +/** @defgroup DAC_data_alignment + * @{ + */ + +#define DAC_Align_12b_R ((uint32_t)0x00000000) +#define DAC_Align_12b_L ((uint32_t)0x00000004) +#define DAC_Align_8b_R ((uint32_t)0x00000008) +#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ + ((ALIGN) == DAC_Align_12b_L) || \ + ((ALIGN) == DAC_Align_8b_R)) +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_Wave_Noise ((uint32_t)0x00000040) +#define DAC_Wave_Triangle ((uint32_t)0x00000080) +#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ + ((WAVE) == DAC_Wave_Triangle)) +/** + * @} + */ + +/** @defgroup DAC_data + * @{ + */ + +#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) + +/** + * @} + */ + +/** @defgroup DAC_interrupts_definition + * @{ + */ + +#define DAC_IT_DMAUDR ((uint32_t)0x00002000) +#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) + +/** + * @} + */ + + +/** @defgroup DAC_flags_definition + * @{ + */ + +#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) + +#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the DAC configuration to the default reset state *****/ +void DAC_DeInit(void); + +/* DAC channels configuration: trigger, output buffer, data format functions */ +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); + +/* DMA management functions ***************************************************/ +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); +FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); +void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); +ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); +void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_DAC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dbgmcu.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dbgmcu.h new file mode 100644 index 0000000..7729480 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dbgmcu.h @@ -0,0 +1,105 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dbgmcu.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the DBGMCU + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_DBGMCU_H +#define __STM32L1xx_DBGMCU_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DBGMCU + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DBGMCU_Exported_Constants + * @{ + */ + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFF8) == 0x00) && ((PERIPH) != 0x00)) + +#define DBGMCU_TIM2_STOP ((uint32_t)0x00000001) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00000002) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00000004) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00000008) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00000010) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00000020) +#define DBGMCU_RTC_STOP ((uint32_t)0x00000400) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000800) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00001000) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00200000) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00400000) +#define IS_DBGMCU_APB1PERIPH(PERIPH) ((((PERIPH) & 0xFF9FE3C0) == 0x00) && ((PERIPH) != 0x00)) + +#define DBGMCU_TIM9_STOP ((uint32_t)0x00000004) +#define DBGMCU_TIM10_STOP ((uint32_t)0x00000008) +#define DBGMCU_TIM11_STOP ((uint32_t)0x00000010) +#define IS_DBGMCU_APB2PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFE3) == 0x00) && ((PERIPH) != 0x00)) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); +void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); +void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_DBGMCU_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dma.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dma.h new file mode 100644 index 0000000..d090535 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_dma.h @@ -0,0 +1,435 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dma.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the DMA firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_DMA_H +#define __STM32L1xx_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief DMA Init structure definition + */ + +typedef struct +{ + uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ + + uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ + + uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. + This parameter can be a value of @ref DMA_data_transfer_direction */ + + uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. + The data unit is equal to the configuration set in DMA_PeripheralDataSize + or DMA_MemoryDataSize members depending in the transfer direction. */ + + uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. + This parameter can be a value of @ref DMA_peripheral_incremented_mode */ + + uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not. + This parameter can be a value of @ref DMA_memory_incremented_mode */ + + uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_peripheral_data_size */ + + uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_memory_data_size */ + + uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx. + This parameter can be a value of @ref DMA_circular_normal_mode + @note: The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Channel */ + + uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_priority_level */ + + uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer. + This parameter can be a value of @ref DMA_memory_to_memory */ +}DMA_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Constants + * @{ + */ + +#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \ + ((PERIPH) == DMA1_Channel2) || \ + ((PERIPH) == DMA1_Channel3) || \ + ((PERIPH) == DMA1_Channel4) || \ + ((PERIPH) == DMA1_Channel5) || \ + ((PERIPH) == DMA1_Channel6) || \ + ((PERIPH) == DMA1_Channel7) || \ + ((PERIPH) == DMA2_Channel1) || \ + ((PERIPH) == DMA2_Channel2) || \ + ((PERIPH) == DMA2_Channel3) || \ + ((PERIPH) == DMA2_Channel4) || \ + ((PERIPH) == DMA2_Channel5)) + +/** @defgroup DMA_data_transfer_direction + * @{ + */ + +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) +#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \ + ((DIR) == DMA_DIR_PeripheralSRC)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_incremented_mode + * @{ + */ + +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ + ((STATE) == DMA_PeripheralInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_memory_incremented_mode + * @{ + */ + +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ + ((STATE) == DMA_MemoryInc_Disable)) +/** + * @} + */ + +/** @defgroup DMA_peripheral_data_size + * @{ + */ + +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ + ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ + ((SIZE) == DMA_PeripheralDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_memory_data_size + * @{ + */ + +#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) +#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ + ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ + ((SIZE) == DMA_MemoryDataSize_Word)) +/** + * @} + */ + +/** @defgroup DMA_circular_normal_mode + * @{ + */ + +#define DMA_Mode_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) +#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Circular) || ((MODE) == DMA_Mode_Normal)) +/** + * @} + */ + +/** @defgroup DMA_priority_level + * @{ + */ + +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \ + ((PRIORITY) == DMA_Priority_High) || \ + ((PRIORITY) == DMA_Priority_Medium) || \ + ((PRIORITY) == DMA_Priority_Low)) +/** + * @} + */ + +/** @defgroup DMA_memory_to_memory + * @{ + */ + +#define DMA_M2M_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) +#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Enable) || ((STATE) == DMA_M2M_Disable)) + +/** + * @} + */ + +/** @defgroup DMA_interrupts_definition + * @{ + */ + +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) +#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) + +#define DMA2_IT_GL1 ((uint32_t)0x10000001) +#define DMA2_IT_TC1 ((uint32_t)0x10000002) +#define DMA2_IT_HT1 ((uint32_t)0x10000004) +#define DMA2_IT_TE1 ((uint32_t)0x10000008) +#define DMA2_IT_GL2 ((uint32_t)0x10000010) +#define DMA2_IT_TC2 ((uint32_t)0x10000020) +#define DMA2_IT_HT2 ((uint32_t)0x10000040) +#define DMA2_IT_TE2 ((uint32_t)0x10000080) +#define DMA2_IT_GL3 ((uint32_t)0x10000100) +#define DMA2_IT_TC3 ((uint32_t)0x10000200) +#define DMA2_IT_HT3 ((uint32_t)0x10000400) +#define DMA2_IT_TE3 ((uint32_t)0x10000800) +#define DMA2_IT_GL4 ((uint32_t)0x10001000) +#define DMA2_IT_TC4 ((uint32_t)0x10002000) +#define DMA2_IT_HT4 ((uint32_t)0x10004000) +#define DMA2_IT_TE4 ((uint32_t)0x10008000) +#define DMA2_IT_GL5 ((uint32_t)0x10010000) +#define DMA2_IT_TC5 ((uint32_t)0x10020000) +#define DMA2_IT_HT5 ((uint32_t)0x10040000) +#define DMA2_IT_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_IT(IT) (((((IT) & 0xF0000000) == 0x00) || (((IT) & 0xEFF00000) == 0x00)) && ((IT) != 0x00)) + +#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \ + ((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \ + ((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \ + ((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \ + ((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \ + ((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \ + ((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \ + ((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \ + ((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \ + ((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5) || \ + ((IT) == DMA1_IT_GL6) || ((IT) == DMA1_IT_TC6) || \ + ((IT) == DMA1_IT_HT6) || ((IT) == DMA1_IT_TE6) || \ + ((IT) == DMA1_IT_GL7) || ((IT) == DMA1_IT_TC7) || \ + ((IT) == DMA1_IT_HT7) || ((IT) == DMA1_IT_TE7) || \ + ((IT) == DMA2_IT_GL1) || ((IT) == DMA2_IT_TC1) || \ + ((IT) == DMA2_IT_HT1) || ((IT) == DMA2_IT_TE1) || \ + ((IT) == DMA2_IT_GL2) || ((IT) == DMA2_IT_TC2) || \ + ((IT) == DMA2_IT_HT2) || ((IT) == DMA2_IT_TE2) || \ + ((IT) == DMA2_IT_GL3) || ((IT) == DMA2_IT_TC3) || \ + ((IT) == DMA2_IT_HT3) || ((IT) == DMA2_IT_TE3) || \ + ((IT) == DMA2_IT_GL4) || ((IT) == DMA2_IT_TC4) || \ + ((IT) == DMA2_IT_HT4) || ((IT) == DMA2_IT_TE4) || \ + ((IT) == DMA2_IT_GL5) || ((IT) == DMA2_IT_TC5) || \ + ((IT) == DMA2_IT_HT5) || ((IT) == DMA2_IT_TE5)) +/** + * @} + */ + +/** @defgroup DMA_flags_definition + * @{ + */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) + +#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) +#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) +#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) +#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) +#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) +#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) +#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) +#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) +#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) +#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) +#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) +#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) +#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) +#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) +#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) +#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) +#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) +#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) +#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) +#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) + +#define IS_DMA_CLEAR_FLAG(FLAG) (((((FLAG) & 0xF0000000) == 0x00) || (((FLAG) & 0xEFF00000) == 0x00)) && ((FLAG) != 0x00)) + +#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \ + ((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \ + ((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \ + ((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \ + ((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \ + ((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \ + ((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \ + ((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \ + ((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \ + ((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5) || \ + ((FLAG) == DMA1_FLAG_GL6) || ((FLAG) == DMA1_FLAG_TC6) || \ + ((FLAG) == DMA1_FLAG_HT6) || ((FLAG) == DMA1_FLAG_TE6) || \ + ((FLAG) == DMA1_FLAG_GL7) || ((FLAG) == DMA1_FLAG_TC7) || \ + ((FLAG) == DMA1_FLAG_HT7) || ((FLAG) == DMA1_FLAG_TE7) || \ + ((FLAG) == DMA2_FLAG_GL1) || ((FLAG) == DMA2_FLAG_TC1) || \ + ((FLAG) == DMA2_FLAG_HT1) || ((FLAG) == DMA2_FLAG_TE1) || \ + ((FLAG) == DMA2_FLAG_GL2) || ((FLAG) == DMA2_FLAG_TC2) || \ + ((FLAG) == DMA2_FLAG_HT2) || ((FLAG) == DMA2_FLAG_TE2) || \ + ((FLAG) == DMA2_FLAG_GL3) || ((FLAG) == DMA2_FLAG_TC3) || \ + ((FLAG) == DMA2_FLAG_HT3) || ((FLAG) == DMA2_FLAG_TE3) || \ + ((FLAG) == DMA2_FLAG_GL4) || ((FLAG) == DMA2_FLAG_TC4) || \ + ((FLAG) == DMA2_FLAG_HT4) || ((FLAG) == DMA2_FLAG_TE4) || \ + ((FLAG) == DMA2_FLAG_GL5) || ((FLAG) == DMA2_FLAG_TC5) || \ + ((FLAG) == DMA2_FLAG_HT5) || ((FLAG) == DMA2_FLAG_TE5)) +/** + * @} + */ + +/** @defgroup DMA_Buffer_Size + * @{ + */ + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the DMA configuration to the default reset state *****/ +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); + +/* Initialization and Configuration functions *********************************/ +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); + +/* Data Counter functions *****************************************************/ +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); + +/* Interrupts and flags management functions **********************************/ +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); +void DMA_ClearFlag(uint32_t DMAy_FLAG); +ITStatus DMA_GetITStatus(uint32_t DMAy_IT); +void DMA_ClearITPendingBit(uint32_t DMAy_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_DMA_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_exti.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_exti.h new file mode 100644 index 0000000..1b437dc --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_exti.h @@ -0,0 +1,199 @@ +/** + ****************************************************************************** + * @file stm32l1xx_exti.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the EXTI firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_EXTI_H +#define __STM32L1xx_EXTI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief EXTI mode enumeration + */ + +typedef enum +{ + EXTI_Mode_Interrupt = 0x00, + EXTI_Mode_Event = 0x04 +}EXTIMode_TypeDef; + +#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) + +/** + * @brief EXTI Trigger enumeration + */ + +typedef enum +{ + EXTI_Trigger_Rising = 0x08, + EXTI_Trigger_Falling = 0x0C, + EXTI_Trigger_Rising_Falling = 0x10 +}EXTITrigger_TypeDef; + +#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ + ((TRIGGER) == EXTI_Trigger_Falling) || \ + ((TRIGGER) == EXTI_Trigger_Rising_Falling)) +/** + * @brief EXTI Init Structure definition + */ + +typedef struct +{ + uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. + This parameter can be any combination of @ref EXTI_Lines */ + + EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTITrigger_TypeDef */ + + FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ +}EXTI_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup EXTI_Exported_Constants + * @{ + */ + +/** @defgroup EXTI_Lines + * @{ + */ + +#define EXTI_Line0 ((uint32_t)0x00000001) /*!< External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00000002) /*!< External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00000004) /*!< External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00000008) /*!< External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00000010) /*!< External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00000020) /*!< External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00000040) /*!< External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00000080) /*!< External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00000100) /*!< External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00000200) /*!< External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00000400) /*!< External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00000800) /*!< External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x00001000) /*!< External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x00002000) /*!< External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x00004000) /*!< External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x00008000) /*!< External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x00010000) /*!< External interrupt line 16 + Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x00020000) /*!< External interrupt line 17 + Connected to the RTC Alarm + event */ +#define EXTI_Line18 ((uint32_t)0x00040000) /*!< External interrupt line 18 + Connected to the USB Device + FS Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x00080000) /*!< External interrupt line 19 + Connected to the RTC Tamper + and Time Stamp events */ +#define EXTI_Line20 ((uint32_t)0x00100000) /*!< External interrupt line 20 + Connected to the RTC Wakeup + event */ +#define EXTI_Line21 ((uint32_t)0x00200000) /*!< External interrupt line 21 + Connected to the Comparator 1 + event */ + +#define EXTI_Line22 ((uint32_t)0x00400000) /*!< External interrupt line 22 + Connected to the Comparator 2 + event */ + +#define EXTI_Line23 ((uint32_t)0x00800000) /*!< External interrupt line 23 + Comparator channel acquisition event */ + +#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFF000000) == 0x00) && ((LINE) != (uint16_t)0x00)) + +#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ + ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ + ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ + ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ + ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ + ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ + ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ + ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ + ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ + ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19) || \ + ((LINE) == EXTI_Line20) || ((LINE) == EXTI_Line21) || \ + ((LINE) == EXTI_Line22) || ((LINE) == EXTI_Line23)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* Function used to set the EXTI configuration to the default reset state *****/ +void EXTI_DeInit(void); + +/* Initialization and Configuration functions *********************************/ +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); + +/* Interrupts and flags management functions **********************************/ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); +void EXTI_ClearFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClearITPendingBit(uint32_t EXTI_Line); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_EXTI_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_flash.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_flash.h new file mode 100644 index 0000000..a0fa2ae --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_flash.h @@ -0,0 +1,482 @@ +/** + ****************************************************************************** + * @file stm32l1xx_flash.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the FLASH + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_FLASH_H +#define __STM32L1xx_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief FLASH Status + */ +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_WRP, + FLASH_ERROR_PROGRAM, + FLASH_COMPLETE, + FLASH_TIMEOUT +}FLASH_Status; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FLASH_Exported_Constants + * @{ + */ + +/** @defgroup FLASH_Latency + * @{ + */ +#define FLASH_Latency_0 ((uint8_t)0x00) /*!< FLASH Zero Latency cycle */ +#define FLASH_Latency_1 ((uint8_t)0x01) /*!< FLASH One Latency cycle */ + +#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ + ((LATENCY) == FLASH_Latency_1)) +/** + * @} + */ + +/** @defgroup FLASH_Interrupts + * @{ + */ + +#define FLASH_IT_EOP FLASH_PECR_EOPIE /*!< End of programming interrupt source */ +#define FLASH_IT_ERR FLASH_PECR_ERRIE /*!< Error interrupt source */ +#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFCFFFF) == 0x00000000) && (((IT) != 0x00000000))) +/** + * @} + */ + +/** @defgroup FLASH_Address + * @{ + */ + +#define IS_FLASH_DATA_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08080000) && ((ADDRESS) <= 0x08082FFF)) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) <= 0x0805FFFF)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_Write_Protection + * @{ + */ + +#define OB_WRP_Pages0to15 ((uint32_t)0x00000001) /* Write protection of Sector0 */ +#define OB_WRP_Pages16to31 ((uint32_t)0x00000002) /* Write protection of Sector1 */ +#define OB_WRP_Pages32to47 ((uint32_t)0x00000004) /* Write protection of Sector2 */ +#define OB_WRP_Pages48to63 ((uint32_t)0x00000008) /* Write protection of Sector3 */ +#define OB_WRP_Pages64to79 ((uint32_t)0x00000010) /* Write protection of Sector4 */ +#define OB_WRP_Pages80to95 ((uint32_t)0x00000020) /* Write protection of Sector5 */ +#define OB_WRP_Pages96to111 ((uint32_t)0x00000040) /* Write protection of Sector6 */ +#define OB_WRP_Pages112to127 ((uint32_t)0x00000080) /* Write protection of Sector7 */ +#define OB_WRP_Pages128to143 ((uint32_t)0x00000100) /* Write protection of Sector8 */ +#define OB_WRP_Pages144to159 ((uint32_t)0x00000200) /* Write protection of Sector9 */ +#define OB_WRP_Pages160to175 ((uint32_t)0x00000400) /* Write protection of Sector10 */ +#define OB_WRP_Pages176to191 ((uint32_t)0x00000800) /* Write protection of Sector11 */ +#define OB_WRP_Pages192to207 ((uint32_t)0x00001000) /* Write protection of Sector12 */ +#define OB_WRP_Pages208to223 ((uint32_t)0x00002000) /* Write protection of Sector13 */ +#define OB_WRP_Pages224to239 ((uint32_t)0x00004000) /* Write protection of Sector14 */ +#define OB_WRP_Pages240to255 ((uint32_t)0x00008000) /* Write protection of Sector15 */ +#define OB_WRP_Pages256to271 ((uint32_t)0x00010000) /* Write protection of Sector16 */ +#define OB_WRP_Pages272to287 ((uint32_t)0x00020000) /* Write protection of Sector17 */ +#define OB_WRP_Pages288to303 ((uint32_t)0x00040000) /* Write protection of Sector18 */ +#define OB_WRP_Pages304to319 ((uint32_t)0x00080000) /* Write protection of Sector19 */ +#define OB_WRP_Pages320to335 ((uint32_t)0x00100000) /* Write protection of Sector20 */ +#define OB_WRP_Pages336to351 ((uint32_t)0x00200000) /* Write protection of Sector21 */ +#define OB_WRP_Pages352to367 ((uint32_t)0x00400000) /* Write protection of Sector22 */ +#define OB_WRP_Pages368to383 ((uint32_t)0x00800000) /* Write protection of Sector23 */ +#define OB_WRP_Pages384to399 ((uint32_t)0x01000000) /* Write protection of Sector24 */ +#define OB_WRP_Pages400to415 ((uint32_t)0x02000000) /* Write protection of Sector25 */ +#define OB_WRP_Pages416to431 ((uint32_t)0x04000000) /* Write protection of Sector26 */ +#define OB_WRP_Pages432to447 ((uint32_t)0x08000000) /* Write protection of Sector27 */ +#define OB_WRP_Pages448to463 ((uint32_t)0x10000000) /* Write protection of Sector28 */ +#define OB_WRP_Pages464to479 ((uint32_t)0x20000000) /* Write protection of Sector29 */ +#define OB_WRP_Pages480to495 ((uint32_t)0x40000000) /* Write protection of Sector30 */ +#define OB_WRP_Pages496to511 ((uint32_t)0x80000000) /* Write protection of Sector31 */ + +#define OB_WRP_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Sectors */ + +#define OB_WRP1_Pages512to527 ((uint32_t)0x00000001) /* Write protection of Sector32 */ +#define OB_WRP1_Pages528to543 ((uint32_t)0x00000002) /* Write protection of Sector33 */ +#define OB_WRP1_Pages544to559 ((uint32_t)0x00000004) /* Write protection of Sector34 */ +#define OB_WRP1_Pages560to575 ((uint32_t)0x00000008) /* Write protection of Sector35 */ +#define OB_WRP1_Pages576to591 ((uint32_t)0x00000010) /* Write protection of Sector36 */ +#define OB_WRP1_Pages592to607 ((uint32_t)0x00000020) /* Write protection of Sector37 */ +#define OB_WRP1_Pages608to623 ((uint32_t)0x00000040) /* Write protection of Sector38 */ +#define OB_WRP1_Pages624to639 ((uint32_t)0x00000080) /* Write protection of Sector39 */ +#define OB_WRP1_Pages640to655 ((uint32_t)0x00000100) /* Write protection of Sector40 */ +#define OB_WRP1_Pages656to671 ((uint32_t)0x00000200) /* Write protection of Sector41 */ +#define OB_WRP1_Pages672to687 ((uint32_t)0x00000400) /* Write protection of Sector42 */ +#define OB_WRP1_Pages688to703 ((uint32_t)0x00000800) /* Write protection of Sector43 */ +#define OB_WRP1_Pages704to719 ((uint32_t)0x00001000) /* Write protection of Sector44 */ +#define OB_WRP1_Pages720to735 ((uint32_t)0x00002000) /* Write protection of Sector45 */ +#define OB_WRP1_Pages736to751 ((uint32_t)0x00004000) /* Write protection of Sector46 */ +#define OB_WRP1_Pages752to767 ((uint32_t)0x00008000) /* Write protection of Sector47 */ +#define OB_WRP1_Pages768to783 ((uint32_t)0x00010000) /* Write protection of Sector48 */ +#define OB_WRP1_Pages784to799 ((uint32_t)0x00020000) /* Write protection of Sector49 */ +#define OB_WRP1_Pages800to815 ((uint32_t)0x00040000) /* Write protection of Sector50 */ +#define OB_WRP1_Pages816to831 ((uint32_t)0x00080000) /* Write protection of Sector51 */ +#define OB_WRP1_Pages832to847 ((uint32_t)0x00100000) /* Write protection of Sector52 */ +#define OB_WRP1_Pages848to863 ((uint32_t)0x00200000) /* Write protection of Sector53 */ +#define OB_WRP1_Pages864to879 ((uint32_t)0x00400000) /* Write protection of Sector54 */ +#define OB_WRP1_Pages880to895 ((uint32_t)0x00800000) /* Write protection of Sector55 */ +#define OB_WRP1_Pages896to911 ((uint32_t)0x01000000) /* Write protection of Sector56 */ +#define OB_WRP1_Pages912to927 ((uint32_t)0x02000000) /* Write protection of Sector57 */ +#define OB_WRP1_Pages928to943 ((uint32_t)0x04000000) /* Write protection of Sector58 */ +#define OB_WRP1_Pages944to959 ((uint32_t)0x08000000) /* Write protection of Sector59 */ +#define OB_WRP1_Pages960to975 ((uint32_t)0x10000000) /* Write protection of Sector60 */ +#define OB_WRP1_Pages976to991 ((uint32_t)0x20000000) /* Write protection of Sector61 */ +#define OB_WRP1_Pages992to1007 ((uint32_t)0x40000000) /* Write protection of Sector62 */ +#define OB_WRP1_Pages1008to1023 ((uint32_t)0x80000000) /* Write protection of Sector63 */ + +#define OB_WRP1_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Sectors */ + +#define OB_WRP2_Pages1024to1039 ((uint32_t)0x00000001) /* Write protection of Sector64 */ +#define OB_WRP2_Pages1040to1055 ((uint32_t)0x00000002) /* Write protection of Sector65 */ +#define OB_WRP2_Pages1056to1071 ((uint32_t)0x00000004) /* Write protection of Sector66 */ +#define OB_WRP2_Pages1072to1087 ((uint32_t)0x00000008) /* Write protection of Sector67 */ +#define OB_WRP2_Pages1088to1103 ((uint32_t)0x00000010) /* Write protection of Sector68 */ +#define OB_WRP2_Pages1104to1119 ((uint32_t)0x00000020) /* Write protection of Sector69 */ +#define OB_WRP2_Pages1120to1135 ((uint32_t)0x00000040) /* Write protection of Sector70 */ +#define OB_WRP2_Pages1136to1151 ((uint32_t)0x00000080) /* Write protection of Sector71 */ +#define OB_WRP2_Pages1152to1167 ((uint32_t)0x00000100) /* Write protection of Sector72 */ +#define OB_WRP2_Pages1168to1183 ((uint32_t)0x00000200) /* Write protection of Sector73 */ +#define OB_WRP2_Pages1184to1199 ((uint32_t)0x00000400) /* Write protection of Sector74 */ +#define OB_WRP2_Pages1200to1215 ((uint32_t)0x00000800) /* Write protection of Sector75 */ +#define OB_WRP2_Pages1216to1231 ((uint32_t)0x00001000) /* Write protection of Sector76 */ +#define OB_WRP2_Pages1232to1247 ((uint32_t)0x00002000) /* Write protection of Sector77 */ +#define OB_WRP2_Pages1248to1263 ((uint32_t)0x00004000) /* Write protection of Sector78 */ +#define OB_WRP2_Pages1264to1279 ((uint32_t)0x00008000) /* Write protection of Sector79 */ +#define OB_WRP2_Pages1280to1295 ((uint32_t)0x00010000) /* Write protection of Sector80 */ +#define OB_WRP2_Pages1296to1311 ((uint32_t)0x00020000) /* Write protection of Sector81 */ +#define OB_WRP2_Pages1312to1327 ((uint32_t)0x00040000) /* Write protection of Sector82 */ +#define OB_WRP2_Pages1328to1343 ((uint32_t)0x00080000) /* Write protection of Sector83 */ +#define OB_WRP2_Pages1344to1359 ((uint32_t)0x00100000) /* Write protection of Sector84 */ +#define OB_WRP2_Pages1360to1375 ((uint32_t)0x00200000) /* Write protection of Sector85 */ +#define OB_WRP2_Pages1376to1391 ((uint32_t)0x00400000) /* Write protection of Sector86 */ +#define OB_WRP2_Pages1392to1407 ((uint32_t)0x00800000) /* Write protection of Sector87 */ +#define OB_WRP2_Pages1408to1423 ((uint32_t)0x01000000) /* Write protection of Sector88 */ +#define OB_WRP2_Pages1424to1439 ((uint32_t)0x02000000) /* Write protection of Sector89 */ +#define OB_WRP2_Pages1440to1455 ((uint32_t)0x04000000) /* Write protection of Sector90 */ +#define OB_WRP2_Pages1456to1471 ((uint32_t)0x08000000) /* Write protection of Sector91 */ +#define OB_WRP2_Pages1472to1487 ((uint32_t)0x10000000) /* Write protection of Sector92 */ +#define OB_WRP2_Pages1488to1503 ((uint32_t)0x20000000) /* Write protection of Sector93 */ +#define OB_WRP2_Pages1504to1519 ((uint32_t)0x40000000) /* Write protection of Sector94 */ +#define OB_WRP2_Pages1520to1535 ((uint32_t)0x80000000) /* Write protection of Sector95 */ + +#define OB_WRP2_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Sectors */ + +#define IS_OB_WRP(PAGE) (((PAGE) != 0x0000000)) + +/** + * @} + */ + + +/** @defgroup Selection_Protection_Mode + * @{ + */ +#define OB_PcROP_Enable ((uint16_t)0x0100) /*!< Disabled PcROP, nWPRi bits used for Write Protection on sector i */ +#define OB_PcROP_Disable ((uint16_t)0x0000) /*!< Enable PcROP, nWPRi bits used for PCRoP Protection on sector i */ +#define IS_OB_PCROP_SELECT(OB_PcROP) (((OB_PcROP) == OB_PcROP_Enable) || ((OB_PcROP) == OB_PcROP_Disable)) +/** + * @} + */ + + +/** @defgroup Option_Bytes_Read_Protection + * @{ + */ + +/** + * @brief Read Protection Level + */ +#define OB_RDP_Level_0 ((uint8_t)0xAA) +#define OB_RDP_Level_1 ((uint8_t)0xBB) +/*#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 */ + +#define IS_OB_RDP(LEVEL) (((LEVEL) == OB_RDP_Level_0)||\ + ((LEVEL) == OB_RDP_Level_1))/*||\ + ((LEVEL) == OB_RDP_Level_2))*/ +/** + * @} + */ + +/** @defgroup Option_Bytes_IWatchdog + * @{ + */ + +#define OB_IWDG_SW ((uint8_t)0x10) /*!< Software WDG selected */ +#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware WDG selected */ +#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STOP + * @{ + */ + +#define OB_STOP_NoRST ((uint8_t)0x20) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ +#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_nRST_STDBY + * @{ + */ + +#define OB_STDBY_NoRST ((uint8_t)0x40) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ +#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_BOOT + * @{ + */ + +#define OB_BOOT_BANK2 ((uint8_t)0x00) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank 2 + or Bank 1, depending on the activation of the bank */ +#define OB_BOOT_BANK1 ((uint8_t)0x80) /*!< At startup, if boot pins are set in boot from user Flash position + and this parameter is selected the device will boot from Bank1(Default) */ +#define IS_OB_BOOT_BANK(BANK) (((BANK) == OB_BOOT_BANK2) || ((BANK) == OB_BOOT_BANK1)) + +/** + * @} + */ + +/** @defgroup Option_Bytes_BOR_Level + * @{ + */ + +#define OB_BOR_OFF ((uint8_t)0x00) /*!< BOR is disabled at power down, the reset is asserted when the VDD + power supply reaches the PDR(Power Down Reset) threshold (1.5V) */ +#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< BOR Reset threshold levels for 1.7V - 1.8V VDD power supply */ +#define OB_BOR_LEVEL2 ((uint8_t)0x09) /*!< BOR Reset threshold levels for 1.9V - 2.0V VDD power supply */ +#define OB_BOR_LEVEL3 ((uint8_t)0x0A) /*!< BOR Reset threshold levels for 2.3V - 2.4V VDD power supply */ +#define OB_BOR_LEVEL4 ((uint8_t)0x0B) /*!< BOR Reset threshold levels for 2.55V - 2.65V VDD power supply */ +#define OB_BOR_LEVEL5 ((uint8_t)0x0C) /*!< BOR Reset threshold levels for 2.8V - 2.9V VDD power supply */ + +#define IS_OB_BOR_LEVEL(LEVEL) (((LEVEL) == OB_BOR_OFF) || \ + ((LEVEL) == OB_BOR_LEVEL1) || \ + ((LEVEL) == OB_BOR_LEVEL2) || \ + ((LEVEL) == OB_BOR_LEVEL3) || \ + ((LEVEL) == OB_BOR_LEVEL4) || \ + ((LEVEL) == OB_BOR_LEVEL5)) + +/** + * @} + */ + +/** @defgroup FLASH_Flags + * @{ + */ + +#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ +#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Programming flag */ +#define FLASH_FLAG_ENDHV FLASH_SR_ENHV /*!< FLASH End of High Voltage flag */ +#define FLASH_FLAG_READY FLASH_SR_READY /*!< FLASH Ready flag after low power mode */ +#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ +#define FLASH_FLAG_SIZERR FLASH_SR_SIZERR /*!< FLASH Size error flag */ +#define FLASH_FLAG_OPTVERR FLASH_SR_OPTVERR /*!< FLASH Option Validity error flag */ +#define FLASH_FLAG_OPTVERRUSR FLASH_SR_OPTVERRUSR /*!< FLASH Option User Validity error flag */ +#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< FLASH Read protected error flag + (available only in STM32L1XX_MDP devices) */ + +#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFC0FD) == 0x00000000) && ((FLAG) != 0x00000000)) + +#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_ENDHV) || ((FLAG) == FLASH_FLAG_READY ) || \ + ((FLAG) == FLASH_FLAG_WRPERR) || ((FLAG) == FLASH_FLAG_PGAERR ) || \ + ((FLAG) == FLASH_FLAG_SIZERR) || ((FLAG) == FLASH_FLAG_OPTVERR) || \ + ((FLAG) == FLASH_FLAG_OPTVERRUSR) || ((FLAG) == FLASH_FLAG_RDERR)) +/** + * @} + */ + +/** @defgroup FLASH_Keys + * @{ + */ + +#define FLASH_PDKEY1 ((uint32_t)0x04152637) /*!< Flash power down key1 */ +#define FLASH_PDKEY2 ((uint32_t)0xFAFBFCFD) /*!< Flash power down key2: used with FLASH_PDKEY1 + to unlock the RUN_PD bit in FLASH_ACR */ + +#define FLASH_PEKEY1 ((uint32_t)0x89ABCDEF) /*!< Flash program erase key1 */ +#define FLASH_PEKEY2 ((uint32_t)0x02030405) /*!< Flash program erase key: used with FLASH_PEKEY2 + to unlock the write access to the FLASH_PECR register and + data EEPROM */ + +#define FLASH_PRGKEY1 ((uint32_t)0x8C9DAEBF) /*!< Flash program memory key1 */ +#define FLASH_PRGKEY2 ((uint32_t)0x13141516) /*!< Flash program memory key2: used with FLASH_PRGKEY2 + to unlock the program memory */ + +#define FLASH_OPTKEY1 ((uint32_t)0xFBEAD9C8) /*!< Flash option key1 */ +#define FLASH_OPTKEY2 ((uint32_t)0x24252627) /*!< Flash option key2: used with FLASH_OPTKEY1 to + unlock the write access to the option byte block */ +/** + * @} + */ + +/** @defgroup Timeout_definition + * @{ + */ +#define FLASH_ER_PRG_TIMEOUT ((uint32_t)0x8000) + +/** + * @} + */ + +/** @defgroup CMSIS_Legacy + * @{ + */ +#if defined ( __ICCARM__ ) +#define InterruptType_ACTLR_DISMCYCINT_Msk IntType_ACTLR_DISMCYCINT_Msk +#endif +/** + * @} + */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/** + * @brief FLASH memory functions that can be executed from FLASH. + */ +/* FLASH Interface configuration functions ************************************/ +void FLASH_SetLatency(uint32_t FLASH_Latency); +void FLASH_PrefetchBufferCmd(FunctionalState NewState); +void FLASH_ReadAccess64Cmd(FunctionalState NewState); +void FLASH_SLEEPPowerDownCmd(FunctionalState NewState); + +/* FLASH Memory Programming functions *****************************************/ +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_FastProgramWord(uint32_t Address, uint32_t Data); + +/* DATA EEPROM Programming functions ******************************************/ +void DATA_EEPROM_Unlock(void); +void DATA_EEPROM_Lock(void); +void DATA_EEPROM_FixedTimeProgramCmd(FunctionalState NewState); +FLASH_Status DATA_EEPROM_EraseByte(uint32_t Address); +FLASH_Status DATA_EEPROM_EraseHalfWord(uint32_t Address); +FLASH_Status DATA_EEPROM_EraseWord(uint32_t Address); +FLASH_Status DATA_EEPROM_FastProgramByte(uint32_t Address, uint8_t Data); +FLASH_Status DATA_EEPROM_FastProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status DATA_EEPROM_FastProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status DATA_EEPROM_ProgramByte(uint32_t Address, uint8_t Data); +FLASH_Status DATA_EEPROM_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status DATA_EEPROM_ProgramWord(uint32_t Address, uint32_t Data); + +/* Option Bytes Programming functions *****************************************/ +void FLASH_OB_Unlock(void); +void FLASH_OB_Lock(void); +void FLASH_OB_Launch(void); +FLASH_Status FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState); +FLASH_Status FLASH_OB_WRP1Config(uint32_t OB_WRP1, FunctionalState NewState); +FLASH_Status FLASH_OB_WRP2Config(uint32_t OB_WRP2, FunctionalState NewState); +FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP); +FLASH_Status FLASH_OB_PCROPConfig(uint32_t OB_WRP, FunctionalState NewState); +FLASH_Status FLASH_OB_PCROP1Config(uint32_t OB_WRP1, FunctionalState NewState); +FLASH_Status FLASH_OB_PCROPSelectionConfig(uint16_t OB_PcROP); +FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); +FLASH_Status FLASH_OB_BORConfig(uint8_t OB_BOR); +FLASH_Status FLASH_OB_BootConfig(uint8_t OB_BOOT); +uint8_t FLASH_OB_GetUser(void); +uint32_t FLASH_OB_GetWRP(void); +uint32_t FLASH_OB_GetWRP1(void); +uint32_t FLASH_OB_GetWRP2(void); +FlagStatus FLASH_OB_GetRDP(void); +FlagStatus FLASH_OB_GetSPRMOD(void); +uint8_t FLASH_OB_GetBOR(void); + +/* Interrupts and flags management functions **********************************/ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); +void FLASH_ClearFlag(uint32_t FLASH_FLAG); +FLASH_Status FLASH_GetStatus(void); +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); + +/** + * @brief FLASH memory functions that should be executed from internal SRAM. + * These functions are defined inside the "stm32l1xx_flash_ramfunc.c" + * file. + */ +__RAM_FUNC FLASH_RUNPowerDownCmd(FunctionalState NewState); +__RAM_FUNC FLASH_EraseParallelPage(uint32_t Page_Address1, uint32_t Page_Address2); +__RAM_FUNC FLASH_ProgramHalfPage(uint32_t Address, uint32_t* pBuffer); +__RAM_FUNC FLASH_ProgramParallelHalfPage(uint32_t Address1, uint32_t* pBuffer1, uint32_t Address2, uint32_t* pBuffer2); +__RAM_FUNC DATA_EEPROM_EraseDoubleWord(uint32_t Address); +__RAM_FUNC DATA_EEPROM_ProgramDoubleWord(uint32_t Address, uint64_t Data); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_FLASH_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_fsmc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_fsmc.h new file mode 100644 index 0000000..39d83cb --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_fsmc.h @@ -0,0 +1,438 @@ +/** + ****************************************************************************** + * @file stm32l1xx_fsmc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the FSMC firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_FSMC_H +#define __STM32L1xx_FSMC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FSMC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief Timing parameters For NOR/SRAM Banks + */ + +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note It is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note It is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note It is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The parameter value depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don't care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + +/** + * @brief FSMC NOR/SRAM Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. + This parameter can be a value of @ref FSMC_AsynchronousWait */ + + uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. + This parameter can be a value of @ref FSMC_Wrap_Mode */ + + uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FSMC_Exported_Constants + * @{ + */ + +/** @defgroup FSMC_NORSRAM_Bank + * @{ + */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) +#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) +#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) +#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) + +#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ + ((BANK) == FSMC_Bank1_NORSRAM2) || \ + ((BANK) == FSMC_Bank1_NORSRAM3) || \ + ((BANK) == FSMC_Bank1_NORSRAM4)) +/** + * @} + */ + +/** @defgroup NOR_SRAM_Controller + * @{ + */ + +/** @defgroup FSMC_Data_Address_Bus_Multiplexing + * @{ + */ + +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) +#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ + ((MUX) == FSMC_DataAddressMux_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Memory_Type + * @{ + */ + +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) +#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ + ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ + ((MEMORY) == FSMC_MemoryType_NOR)) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Width + * @{ + */ + +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ + ((WIDTH) == FSMC_MemoryDataWidth_16b)) + +/** + * @} + */ + +/** @defgroup FSMC_Burst_Access_Mode + * @{ + */ + +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) +#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ + ((STATE) == FSMC_BurstAccessMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_AsynchronousWait + * @{ + */ +#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) +#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) +#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \ + ((STATE) == FSMC_AsynchronousWait_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal_Polarity + * @{ + */ + +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) +#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ + ((POLARITY) == FSMC_WaitSignalPolarity_High)) + +/** + * @} + */ + +/** @defgroup FSMC_Wrap_Mode + * @{ + */ + +#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) +#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) +#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ + ((MODE) == FSMC_WrapMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Timing + * @{ + */ + +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) +#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ + ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Operation + * @{ + */ + +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) +#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ + ((OPERATION) == FSMC_WriteOperation_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal + * @{ + */ + +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) +#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ + ((SIGNAL) == FSMC_WaitSignal_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Extended_Mode + * @{ + */ + +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ + ((MODE) == FSMC_ExtendedMode_Enable)) + +/** + * @} + */ + +/** @defgroup FSMC_Write_Burst + * @{ + */ + +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) +#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ + ((BURST) == FSMC_WriteBurst_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Address_Setup_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Address_Hold_Time + * @{ + */ + +#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Setup_Time + * @{ + */ + +#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) + +/** + * @} + */ + +/** @defgroup FSMC_Bus_Turn_around_Duration + * @{ + */ + +#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_CLK_Division + * @{ + */ + +#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Data_Latency + * @{ + */ + +#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) + +/** + * @} + */ + +/** @defgroup FSMC_Access_Mode + * @{ + */ + +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) +#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ + ((MODE) == FSMC_AccessMode_B) || \ + ((MODE) == FSMC_AccessMode_C) || \ + ((MODE) == FSMC_AccessMode_D)) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* NOR/SRAM Controller functions **********************************************/ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_FSMC_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_gpio.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_gpio.h new file mode 100644 index 0000000..478f9fe --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_gpio.h @@ -0,0 +1,391 @@ +/** + ****************************************************************************** + * @file stm32l1xx_gpio.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the GPIO + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_GPIO_H +#define __STM32L1xx_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ + ((PERIPH) == GPIOB) || \ + ((PERIPH) == GPIOC) || \ + ((PERIPH) == GPIOD) || \ + ((PERIPH) == GPIOE) || \ + ((PERIPH) == GPIOH) || \ + ((PERIPH) == GPIOF) || \ + ((PERIPH) == GPIOG)) + +/** @defgroup Configuration_Mode_enumeration + * @{ + */ +typedef enum +{ + GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */ + GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */ + GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */ + GPIO_Mode_AN = 0x03 /*!< GPIO Analog Mode */ +}GPIOMode_TypeDef; +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN) || ((MODE) == GPIO_Mode_OUT) || \ + ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN)) +/** + * @} + */ + +/** @defgroup Output_type_enumeration + * @{ + */ +typedef enum +{ GPIO_OType_PP = 0x00, + GPIO_OType_OD = 0x01 +}GPIOOType_TypeDef; +#define IS_GPIO_OTYPE(OTYPE) (((OTYPE) == GPIO_OType_PP) || ((OTYPE) == GPIO_OType_OD)) + +/** + * @} + */ + +/** @defgroup Output_Maximum_frequency_enumeration + * @{ + */ +typedef enum +{ + GPIO_Speed_400KHz = 0x00, /*!< Very Low Speed */ + GPIO_Speed_2MHz = 0x01, /*!< Low Speed */ + GPIO_Speed_10MHz = 0x02, /*!< Medium Speed */ + GPIO_Speed_40MHz = 0x03 /*!< High Speed */ +}GPIOSpeed_TypeDef; +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_400KHz) || ((SPEED) == GPIO_Speed_2MHz) || \ + ((SPEED) == GPIO_Speed_10MHz)|| ((SPEED) == GPIO_Speed_40MHz)) +/** + * @} + */ + +/** @defgroup Configuration_Pull-Up_Pull-Down_enumeration + * @{ + */ +typedef enum +{ GPIO_PuPd_NOPULL = 0x00, + GPIO_PuPd_UP = 0x01, + GPIO_PuPd_DOWN = 0x02 +}GPIOPuPd_TypeDef; +#define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) || \ + ((PUPD) == GPIO_PuPd_DOWN)) +/** + * @} + */ + +/** @defgroup Bit_SET_and_Bit_RESET_enumeration + * @{ + */ +typedef enum +{ Bit_RESET = 0, + Bit_SET +}BitAction; +#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) + +/** + * @} + */ + +/** + * @brief GPIO Init structure definition + */ +typedef struct +{ + uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ + + GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins. + This parameter can be a value of @ref GPIOOType_TypeDef */ + + GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins. + This parameter can be a value of @ref GPIOPuPd_TypeDef */ +}GPIO_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup GPIO_Exported_Constants + * @{ + */ + +/** @defgroup GPIO_pins_define + * @{ + */ +#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 IS_GPIO_PIN(PIN) ((PIN) != (uint16_t)0x00) +#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ + ((PIN) == GPIO_Pin_1) || \ + ((PIN) == GPIO_Pin_2) || \ + ((PIN) == GPIO_Pin_3) || \ + ((PIN) == GPIO_Pin_4) || \ + ((PIN) == GPIO_Pin_5) || \ + ((PIN) == GPIO_Pin_6) || \ + ((PIN) == GPIO_Pin_7) || \ + ((PIN) == GPIO_Pin_8) || \ + ((PIN) == GPIO_Pin_9) || \ + ((PIN) == GPIO_Pin_10) || \ + ((PIN) == GPIO_Pin_11) || \ + ((PIN) == GPIO_Pin_12) || \ + ((PIN) == GPIO_Pin_13) || \ + ((PIN) == GPIO_Pin_14) || \ + ((PIN) == GPIO_Pin_15)) +/** + * @} + */ + +/** @defgroup GPIO_Pin_sources + * @{ + */ +#define GPIO_PinSource0 ((uint8_t)0x00) +#define GPIO_PinSource1 ((uint8_t)0x01) +#define GPIO_PinSource2 ((uint8_t)0x02) +#define GPIO_PinSource3 ((uint8_t)0x03) +#define GPIO_PinSource4 ((uint8_t)0x04) +#define GPIO_PinSource5 ((uint8_t)0x05) +#define GPIO_PinSource6 ((uint8_t)0x06) +#define GPIO_PinSource7 ((uint8_t)0x07) +#define GPIO_PinSource8 ((uint8_t)0x08) +#define GPIO_PinSource9 ((uint8_t)0x09) +#define GPIO_PinSource10 ((uint8_t)0x0A) +#define GPIO_PinSource11 ((uint8_t)0x0B) +#define GPIO_PinSource12 ((uint8_t)0x0C) +#define GPIO_PinSource13 ((uint8_t)0x0D) +#define GPIO_PinSource14 ((uint8_t)0x0E) +#define GPIO_PinSource15 ((uint8_t)0x0F) + +#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ + ((PINSOURCE) == GPIO_PinSource1) || \ + ((PINSOURCE) == GPIO_PinSource2) || \ + ((PINSOURCE) == GPIO_PinSource3) || \ + ((PINSOURCE) == GPIO_PinSource4) || \ + ((PINSOURCE) == GPIO_PinSource5) || \ + ((PINSOURCE) == GPIO_PinSource6) || \ + ((PINSOURCE) == GPIO_PinSource7) || \ + ((PINSOURCE) == GPIO_PinSource8) || \ + ((PINSOURCE) == GPIO_PinSource9) || \ + ((PINSOURCE) == GPIO_PinSource10) || \ + ((PINSOURCE) == GPIO_PinSource11) || \ + ((PINSOURCE) == GPIO_PinSource12) || \ + ((PINSOURCE) == GPIO_PinSource13) || \ + ((PINSOURCE) == GPIO_PinSource14) || \ + ((PINSOURCE) == GPIO_PinSource15)) +/** + * @} + */ + +/** @defgroup GPIO_Alternat_function_selection_define + * @{ + */ + +/** + * @brief AF 0 selection + */ +#define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /*!< RTC 50/60 Hz Alternate Function mapping */ +#define GPIO_AF_MCO ((uint8_t)0x00) /*!< MCO Alternate Function mapping */ +#define GPIO_AF_RTC_AF1 ((uint8_t)0x00) /*!< RTC_AF1 Alternate Function mapping */ +#define GPIO_AF_WKUP ((uint8_t)0x00) /*!< Wakeup (WKUP1, WKUP2 and WKUP3) Alternate Function mapping */ +#define GPIO_AF_SWJ ((uint8_t)0x00) /*!< SWJ (SW and JTAG) Alternate Function mapping */ +#define GPIO_AF_TRACE ((uint8_t)0x00) /*!< TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF_TIM2 ((uint8_t)0x01) /*!< TIM2 Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF_TIM3 ((uint8_t)0x02) /*!< TIM3 Alternate Function mapping */ +#define GPIO_AF_TIM4 ((uint8_t)0x02) /*!< TIM4 Alternate Function mapping */ +#define GPIO_AF_TIM5 ((uint8_t)0x02) /*!< TIM5 Alternate Function mapping */ +/** + * @brief AF 3 selection + */ +#define GPIO_AF_TIM9 ((uint8_t)0x03) /*!< TIM9 Alternate Function mapping */ +#define GPIO_AF_TIM10 ((uint8_t)0x03) /*!< TIM10 Alternate Function mapping */ +#define GPIO_AF_TIM11 ((uint8_t)0x03) /*!< TIM11 Alternate Function mapping */ +/** + * @brief AF 4 selection + */ +#define GPIO_AF_I2C1 ((uint8_t)0x04) /*!< I2C1 Alternate Function mapping */ +#define GPIO_AF_I2C2 ((uint8_t)0x04) /*!< I2C2 Alternate Function mapping */ +/** + * @brief AF 5 selection + */ +#define GPIO_AF_SPI1 ((uint8_t)0x05) /*!< SPI1 Alternate Function mapping */ +#define GPIO_AF_SPI2 ((uint8_t)0x05) /*!< SPI2 Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF_SPI3 ((uint8_t)0x06) /*!< SPI3 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF_USART1 ((uint8_t)0x07) /*!< USART1 Alternate Function mapping */ +#define GPIO_AF_USART2 ((uint8_t)0x07) /*!< USART2 Alternate Function mapping */ +#define GPIO_AF_USART3 ((uint8_t)0x07) /*!< USART3 Alternate Function mapping */ +/** + * @brief AF 8 selection + */ +#define GPIO_AF_UART4 ((uint8_t)0x08) /*!< UART4 Alternate Function mapping */ +#define GPIO_AF_UART5 ((uint8_t)0x08) /*!< UART5 Alternate Function mapping */ +/** + * @brief AF 10 selection + */ +#define GPIO_AF_USB ((uint8_t)0xA) /*!< USB Full speed device Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF_LCD ((uint8_t)0x0B) /*!< LCD Alternate Function mapping */ +/** + * @brief AF 12 selection + */ +#define GPIO_AF_FSMC ((uint8_t)0x0C) /*!< FSMC Alternate Function mapping */ +#define GPIO_AF_SDIO ((uint8_t)0x0C) /*!< SDIO Alternate Function mapping */ +/** + * @brief AF 14 selection + */ +#define GPIO_AF_RI ((uint8_t)0x0E) /*!< RI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /*!< EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_MCO) || \ + ((AF) == GPIO_AF_RTC_AF1) || ((AF) == GPIO_AF_WKUP) || \ + ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \ + ((AF) == GPIO_AF_TIM2) || ((AF)== GPIO_AF_TIM3) || \ + ((AF) == GPIO_AF_TIM4) || ((AF)== GPIO_AF_TIM9) || \ + ((AF) == GPIO_AF_TIM10) || ((AF)== GPIO_AF_TIM11) || \ + ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \ + ((AF) == GPIO_AF_SPI1) || ((AF) == GPIO_AF_SPI2) || \ + ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \ + ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_USB) || \ + ((AF) == GPIO_AF_LCD) || ((AF) == GPIO_AF_RI) || \ + ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_SPI3) || \ + ((AF) == GPIO_AF_UART4) || ((AF) == GPIO_AF_UART5) || \ + ((AF) == GPIO_AF_FSMC) || ((AF) == GPIO_AF_SDIO) || \ + ((AF) == GPIO_AF_EVENTOUT)) + +/** + * @} + */ + +/** @defgroup GPIO_Legacy + * @{ + */ + +#define GPIO_Mode_AIN GPIO_Mode_AN + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the GPIO configuration to the default reset state ****/ +void GPIO_DeInit(GPIO_TypeDef* GPIOx); + +/* Initialization and Configuration functions *********************************/ +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); + +/* GPIO Read and Write functions **********************************************/ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); +void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); + +/* GPIO Alternate functions configuration functions ***************************/ +void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_GPIO_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_i2c.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_i2c.h new file mode 100644 index 0000000..8b52a09 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_i2c.h @@ -0,0 +1,703 @@ +/** + ****************************************************************************** + * @file stm32l1xx_i2c.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the I2C firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_I2C_H +#define __STM32L1xx_I2C_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief I2C Init structure definition + */ + +typedef struct +{ + uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /*!< Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. + This parameter can be a value of @ref I2C_acknowledged_address */ +}I2C_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + + +/** @defgroup I2C_Exported_Constants + * @{ + */ + +#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ + ((PERIPH) == I2C2)) +/** @defgroup I2C_mode + * @{ + */ + +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) +#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ + ((MODE) == I2C_Mode_SMBusDevice) || \ + ((MODE) == I2C_Mode_SMBusHost)) +/** + * @} + */ + +/** @defgroup I2C_duty_cycle_in_fast_mode + * @{ + */ + +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ +#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ + ((CYCLE) == I2C_DutyCycle_2)) +/** + * @} + */ + +/** @defgroup I2C_acknowledgement + * @{ + */ + +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) +#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ + ((STATE) == I2C_Ack_Disable)) +/** + * @} + */ + +/** @defgroup I2C_transfer_direction + * @{ + */ + +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) +#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ + ((DIRECTION) == I2C_Direction_Receiver)) +/** + * @} + */ + +/** @defgroup I2C_acknowledged_address + * @{ + */ + +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) +#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ + ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) +/** + * @} + */ + +/** @defgroup I2C_registers + * @{ + */ + +#define I2C_Register_CR1 ((uint8_t)0x00) +#define I2C_Register_CR2 ((uint8_t)0x04) +#define I2C_Register_OAR1 ((uint8_t)0x08) +#define I2C_Register_OAR2 ((uint8_t)0x0C) +#define I2C_Register_DR ((uint8_t)0x10) +#define I2C_Register_SR1 ((uint8_t)0x14) +#define I2C_Register_SR2 ((uint8_t)0x18) +#define I2C_Register_CCR ((uint8_t)0x1C) +#define I2C_Register_TRISE ((uint8_t)0x20) +#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ + ((REGISTER) == I2C_Register_CR2) || \ + ((REGISTER) == I2C_Register_OAR1) || \ + ((REGISTER) == I2C_Register_OAR2) || \ + ((REGISTER) == I2C_Register_DR) || \ + ((REGISTER) == I2C_Register_SR1) || \ + ((REGISTER) == I2C_Register_SR2) || \ + ((REGISTER) == I2C_Register_CCR) || \ + ((REGISTER) == I2C_Register_TRISE)) +/** + * @} + */ + +/** @defgroup I2C_SMBus_alert_pin_level + * @{ + */ + +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) +#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ + ((ALERT) == I2C_SMBusAlert_High)) +/** + * @} + */ + +/** @defgroup I2C_PEC_position + * @{ + */ + +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ + ((POSITION) == I2C_PECPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_NACK_position + * @{ + */ + +#define I2C_NACKPosition_Next ((uint16_t)0x0800) +#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) +#define IS_I2C_NACK_POSITION(POSITION) (((POSITION) == I2C_NACKPosition_Next) || \ + ((POSITION) == I2C_NACKPosition_Current)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) +#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) +/** + * @} + */ + +/** @defgroup I2C_interrupts_definition + * @{ + */ + +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) + +#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ + ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ + ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ + ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ + ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ + ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ + ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) +/** + * @} + */ + +/** @defgroup I2C_flags_definition + * @{ + */ + +/** + * @brief SR2 register flags + */ + +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/** + * @brief SR1 register flags + */ + +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + +#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ + ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ + ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ + ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ + ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ + ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ + ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ + ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ + ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ + ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ + ((FLAG) == I2C_FLAG_SB)) +/** + * @} + */ + +/** @defgroup I2C_Events + * @{ + */ + +/** + =============================================================================== + I2C Master Events (Events grouped in order of communication) + =============================================================================== + */ + +/** + * @brief Communication start + * + * After sending the START condition (I2C_GenerateSTART() function) the master + * has to wait for this event. It means that the Start condition has been correctly + * released on the I2C bus (the bus is free, no other devices is communicating). + * + */ +/* --EV5 */ +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ + +/** + * @brief Address Acknowledge + * + * After checking on EV5 (start condition correctly released on the bus), the + * master sends the address of the slave(s) with which it will communicate + * (I2C_Send7bitAddress() function, it also determines the direction of the communication: + * Master transmitter or Receiver). Then the master has to wait that a slave acknowledges + * his address. If an acknowledge is sent on the bus, one of the following events will + * be set: + * + * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED + * event is set. + * + * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED + * is set + * + * 3) In case of 10-Bit addressing mode, the master (just after generating the START + * and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData() + * function). Then master should wait on EV9. It means that the 10-bit addressing + * header has been correctly sent on the bus. Then master should send the second part of + * the 10-bit address (LSB) using the function I2C_Send7bitAddress(). Then master + * should wait for event EV6. + * + */ + +/* --EV6 */ +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ +/* --EV9 */ +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ + +/** + * @brief Communication events + * + * If a communication is established (START condition generated and slave address + * acknowledged) then the master has to check on one of the following events for + * communication procedures: + * + * 1) Master Receiver mode: The master has to wait on the event EV7 then to read + * the data received from the slave (I2C_ReceiveData() function). + * + * 2) Master Transmitter mode: The master has to send data (I2C_SendData() + * function) then to wait on event EV8 or EV8_2. + * These two events are similar: + * - EV8 means that the data has been written in the data register and is + * being shifted out. + * - EV8_2 means that the data has been physically shifted out and output + * on the bus. + * In most cases, using EV8 is sufficient for the application. + * Using EV8_2 leads to a slower communication but ensure more reliable test. + * EV8_2 is also more suitable than EV8 for testing on the last data transmission + * (before Stop condition generation). + * + * @note In case the user software does not guarantee that this event EV7 is + * managed before the current byte end of transfer, then user may check on EV7 + * and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Master RECEIVER mode -----------------------------*/ +/* --EV7 */ +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ + +/* Master TRANSMITTER mode --------------------------*/ +/* --EV8 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ +/* --EV8_2 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + + +/** + =============================================================================== + I2C Slave Events (Events grouped in order of communication) + =============================================================================== + */ + + +/** + * @brief Communication start events + * + * Wait on one of these events at the start of the communication. It means that + * the I2C peripheral detected a Start condition on the bus (generated by master + * device) followed by the peripheral address. The peripheral generates an ACK + * condition on the bus (if the acknowledge feature is enabled through function + * I2C_AcknowledgeConfig()) and the events listed above are set : + * + * 1) In normal case (only one address managed by the slave), when the address + * sent by the master matches the own address of the peripheral (configured by + * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set + * (where XXX could be TRANSMITTER or RECEIVER). + * + * 2) In case the address sent by the master matches the second address of the + * peripheral (configured by the function I2C_OwnAddress2Config() and enabled + * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED + * (where XXX could be TRANSMITTER or RECEIVER) are set. + * + * 3) In case the address sent by the master is General Call (address 0x00) and + * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) + * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. + * + */ + +/* --EV1 (all the events below are variants of EV1) */ +/* 1) Case of One Single Address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ + +/* 2) Case of Dual address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ + +/* 3) Case of General Call enabled for the slave */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ + +/** + * @brief Communication events + * + * Wait on one of these events when EV1 has already been checked and: + * + * - Slave RECEIVER mode: + * - EV2: When the application is expecting a data byte to be received. + * - EV4: When the application is expecting the end of the communication: master + * sends a stop condition and data transmission is stopped. + * + * - Slave Transmitter mode: + * - EV3: When a byte has been transmitted by the slave and the application is expecting + * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and + * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. The second one can optionally be + * used when the user software doesn't guarantee the EV3 is managed before the + * current byte end of transfer. + * - EV3_2: When the master sends a NACK in order to tell slave that data transmission + * shall end (before sending the STOP condition). In this case slave has to stop sending + * data bytes and expect a Stop condition on the bus. + * + * @note In case the user software does not guarantee that the event EV2 is + * managed before the current byte end of transfer, then user may check on EV2 + * and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)). + * In this case the communication may be slower. + * + */ + +/* Slave RECEIVER mode --------------------------*/ +/* --EV2 */ +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ +/* --EV4 */ +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ + +/* Slave TRANSMITTER mode -----------------------*/ +/* --EV3 */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ +/* --EV3_2 */ +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + +/* + =============================================================================== + End of Events Description + =============================================================================== + */ + +#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ + ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ + ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ + ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ + ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) +/** + * @} + */ + +/** @defgroup I2C_own_address1 + * @{ + */ + +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) +/** + * @} + */ + +/** @defgroup I2C_clock_speed + * @{ + */ + +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the I2C configuration to the default reset state *****/ +void I2C_DeInit(I2C_TypeDef* I2Cx); + +/* Initialization and Configuration functions *********************************/ +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); + +/* Data transfers functions ***************************************************/ +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); +void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition); + +/* PEC management functions ***************************************************/ +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); + +/* DMA transfers management functions *****************************************/ +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); + + +/* Interrupts, events and flags management functions **************************/ +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); + +/* + + =============================================================================== + I2C State Monitoring Functions + =============================================================================== + This I2C driver provides three different ways for I2C state monitoring + depending on the application requirements and constraints: + + + 1. Basic state monitoring (Using I2C_CheckEvent() function) + ----------------------------------------------------------- + It compares the status registers (SR1 and SR2) content to a given event + (can be the combination of one or more flags). + It returns SUCCESS if the current status includes the given flags + and returns ERROR if one or more flags are missing in the current status. + + - When to use + - This function is suitable for most applications as well as for startup + activity since the events are fully described in the product reference + manual (RM0038). + - It is also suitable for users who need to define their own events. + + - Limitations + - If an error occurs (ie. error flags are set besides to the monitored + flags), the I2C_CheckEvent() function may return SUCCESS despite + the communication hold or corrupted real state. + In this case, it is advised to use error interrupts to monitor + the error events and handle them in the interrupt IRQ handler. + + Note + For error management, it is advised to use the following functions: + - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). + - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. + Where x is the peripheral instance (I2C1, I2C2 ...) + - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the + I2Cx_ER_IRQHandler() function in order to determine which error occurred. + - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + and/or I2C_GenerateStop() in order to clear the error flag and source + and return to correct communciation status. + + + 2. Advanced state monitoring (Using the function I2C_GetLastEvent()) + -------------------------------------------------------------------- + Using the function I2C_GetLastEvent() which returns the image of both status + registers in a single word (uint32_t) (Status Register 2 value is shifted left + by 16 bits and concatenated to Status Register 1). + + - When to use + - This function is suitable for the same applications above but it + allows to overcome the mentioned limitation of I2C_GetFlagStatus() + function. + - The returned value could be compared to events already defined in + the library (stm32l1xx_i2c.h) or to custom values defined by user. + This function is suitable when multiple flags are monitored at the + same time. + - At the opposite of I2C_CheckEvent() function, this function allows + user to choose when an event is accepted (when all events flags are + set and no other flags are set or just when the needed flags are set + like I2C_CheckEvent() function. + + - Limitations + - User may need to define his own events. + - Same remark concerning the error management is applicable for this + function if user decides to check only regular communication flags + (and ignores error flags). + + + 3. Flag-based state monitoring (Using the function I2C_GetFlagStatus()) + ----------------------------------------------------------------------- + + Using the function I2C_GetFlagStatus() which simply returns the status of + one single flag (ie. I2C_FLAG_RXNE ...). + + - When to use + - This function could be used for specific applications or in debug + phase. + - It is suitable when only one flag checking is needed (most I2C + events are monitored through multiple flags). + - Limitations: + - When calling this function, the Status register is accessed. + Some flags are cleared when the status register is accessed. + So checking the status of one Flag, may clear other ones. + - Function may need to be called twice or more in order to monitor + one single event. + + For detailed description of Events, please refer to section I2C_Events in + stm32l1xx_i2c.h file. + +*/ + +/* + =============================================================================== + 1. Basic state monitoring + =============================================================================== + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); +/* + =============================================================================== + 2. Advanced state monitoring + =============================================================================== + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); +/* + =============================================================================== + 3. Flag-based state monitoring + =============================================================================== + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); + + +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_I2C_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_iwdg.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_iwdg.h new file mode 100644 index 0000000..c05617a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_iwdg.h @@ -0,0 +1,134 @@ +/** + ****************************************************************************** + * @file stm32l1xx_iwdg.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the IWDG + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_IWDG_H +#define __STM32L1xx_IWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup IWDG + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup IWDG_Exported_Constants + * @{ + */ + +/** @defgroup IWDG_WriteAccess + * @{ + */ + +#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) +#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) +#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ + ((ACCESS) == IWDG_WriteAccess_Disable)) +/** + * @} + */ + +/** @defgroup IWDG_prescaler + * @{ + */ + +#define IWDG_Prescaler_4 ((uint8_t)0x00) +#define IWDG_Prescaler_8 ((uint8_t)0x01) +#define IWDG_Prescaler_16 ((uint8_t)0x02) +#define IWDG_Prescaler_32 ((uint8_t)0x03) +#define IWDG_Prescaler_64 ((uint8_t)0x04) +#define IWDG_Prescaler_128 ((uint8_t)0x05) +#define IWDG_Prescaler_256 ((uint8_t)0x06) +#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ + ((PRESCALER) == IWDG_Prescaler_8) || \ + ((PRESCALER) == IWDG_Prescaler_16) || \ + ((PRESCALER) == IWDG_Prescaler_32) || \ + ((PRESCALER) == IWDG_Prescaler_64) || \ + ((PRESCALER) == IWDG_Prescaler_128)|| \ + ((PRESCALER) == IWDG_Prescaler_256)) +/** + * @} + */ + +/** @defgroup IWDG_Flag + * @{ + */ + +#define IWDG_FLAG_PVU ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) +#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) +#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Prescaler and Counter configuration functions ******************************/ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); +void IWDG_SetReload(uint16_t Reload); +void IWDG_ReloadCounter(void); + +/* IWDG activation function ***************************************************/ +void IWDG_Enable(void); + +/* Flag management function ***************************************************/ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_IWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_lcd.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_lcd.h new file mode 100644 index 0000000..73601b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_lcd.h @@ -0,0 +1,452 @@ +/** + ****************************************************************************** + * @file stm32l1xx_lcd.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the LCD firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_LCD_H +#define __STM32L1xx_LCD_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup LCD + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief LCD Init structure definition + */ + +typedef struct +{ + uint32_t LCD_Prescaler; /*!< Configures the LCD Prescaler. + This parameter can be one value of @ref LCD_Prescaler */ + uint32_t LCD_Divider; /*!< Configures the LCD Divider. + This parameter can be one value of @ref LCD_Divider */ + uint32_t LCD_Duty; /*!< Configures the LCD Duty. + This parameter can be one value of @ref LCD_Duty */ + uint32_t LCD_Bias; /*!< Configures the LCD Bias. + This parameter can be one value of @ref LCD_Bias */ + uint32_t LCD_VoltageSource; /*!< Selects the LCD Voltage source. + This parameter can be one value of @ref LCD_Voltage_Source */ +}LCD_InitTypeDef; + + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup LCD_Exported_Constants + * @{ + */ + +/** @defgroup LCD_Prescaler + * @{ + */ + +#define LCD_Prescaler_1 ((uint32_t)0x00000000) /*!< CLKPS = LCDCLK */ +#define LCD_Prescaler_2 ((uint32_t)0x00400000) /*!< CLKPS = LCDCLK/2 */ +#define LCD_Prescaler_4 ((uint32_t)0x00800000) /*!< CLKPS = LCDCLK/4 */ +#define LCD_Prescaler_8 ((uint32_t)0x00C00000) /*!< CLKPS = LCDCLK/8 */ +#define LCD_Prescaler_16 ((uint32_t)0x01000000) /*!< CLKPS = LCDCLK/16 */ +#define LCD_Prescaler_32 ((uint32_t)0x01400000) /*!< CLKPS = LCDCLK/32 */ +#define LCD_Prescaler_64 ((uint32_t)0x01800000) /*!< CLKPS = LCDCLK/64 */ +#define LCD_Prescaler_128 ((uint32_t)0x01C00000) /*!< CLKPS = LCDCLK/128 */ +#define LCD_Prescaler_256 ((uint32_t)0x02000000) /*!< CLKPS = LCDCLK/256 */ +#define LCD_Prescaler_512 ((uint32_t)0x02400000) /*!< CLKPS = LCDCLK/512 */ +#define LCD_Prescaler_1024 ((uint32_t)0x02800000) /*!< CLKPS = LCDCLK/1024 */ +#define LCD_Prescaler_2048 ((uint32_t)0x02C00000) /*!< CLKPS = LCDCLK/2048 */ +#define LCD_Prescaler_4096 ((uint32_t)0x03000000) /*!< CLKPS = LCDCLK/4096 */ +#define LCD_Prescaler_8192 ((uint32_t)0x03400000) /*!< CLKPS = LCDCLK/8192 */ +#define LCD_Prescaler_16384 ((uint32_t)0x03800000) /*!< CLKPS = LCDCLK/16384 */ +#define LCD_Prescaler_32768 ((uint32_t)0x03C00000) /*!< CLKPS = LCDCLK/32768 */ + +#define IS_LCD_PRESCALER(PRESCALER) (((PRESCALER) == LCD_Prescaler_1) || \ + ((PRESCALER) == LCD_Prescaler_2) || \ + ((PRESCALER) == LCD_Prescaler_4) || \ + ((PRESCALER) == LCD_Prescaler_8) || \ + ((PRESCALER) == LCD_Prescaler_16) || \ + ((PRESCALER) == LCD_Prescaler_32) || \ + ((PRESCALER) == LCD_Prescaler_64) || \ + ((PRESCALER) == LCD_Prescaler_128) || \ + ((PRESCALER) == LCD_Prescaler_256) || \ + ((PRESCALER) == LCD_Prescaler_512) || \ + ((PRESCALER) == LCD_Prescaler_1024) || \ + ((PRESCALER) == LCD_Prescaler_2048) || \ + ((PRESCALER) == LCD_Prescaler_4096) || \ + ((PRESCALER) == LCD_Prescaler_8192) || \ + ((PRESCALER) == LCD_Prescaler_16384) || \ + ((PRESCALER) == LCD_Prescaler_32768)) + +/** + * @} + */ + +/** @defgroup LCD_Divider + * @{ + */ + +#define LCD_Divider_16 ((uint32_t)0x00000000) /*!< LCD frequency = CLKPS/16 */ +#define LCD_Divider_17 ((uint32_t)0x00040000) /*!< LCD frequency = CLKPS/17 */ +#define LCD_Divider_18 ((uint32_t)0x00080000) /*!< LCD frequency = CLKPS/18 */ +#define LCD_Divider_19 ((uint32_t)0x000C0000) /*!< LCD frequency = CLKPS/19 */ +#define LCD_Divider_20 ((uint32_t)0x00100000) /*!< LCD frequency = CLKPS/20 */ +#define LCD_Divider_21 ((uint32_t)0x00140000) /*!< LCD frequency = CLKPS/21 */ +#define LCD_Divider_22 ((uint32_t)0x00180000) /*!< LCD frequency = CLKPS/22 */ +#define LCD_Divider_23 ((uint32_t)0x001C0000) /*!< LCD frequency = CLKPS/23 */ +#define LCD_Divider_24 ((uint32_t)0x00200000) /*!< LCD frequency = CLKPS/24 */ +#define LCD_Divider_25 ((uint32_t)0x00240000) /*!< LCD frequency = CLKPS/25 */ +#define LCD_Divider_26 ((uint32_t)0x00280000) /*!< LCD frequency = CLKPS/26 */ +#define LCD_Divider_27 ((uint32_t)0x002C0000) /*!< LCD frequency = CLKPS/27 */ +#define LCD_Divider_28 ((uint32_t)0x00300000) /*!< LCD frequency = CLKPS/28 */ +#define LCD_Divider_29 ((uint32_t)0x00340000) /*!< LCD frequency = CLKPS/29 */ +#define LCD_Divider_30 ((uint32_t)0x00380000) /*!< LCD frequency = CLKPS/30 */ +#define LCD_Divider_31 ((uint32_t)0x003C0000) /*!< LCD frequency = CLKPS/31 */ + +#define IS_LCD_DIVIDER(DIVIDER) (((DIVIDER) == LCD_Divider_16) || \ + ((DIVIDER) == LCD_Divider_17) || \ + ((DIVIDER) == LCD_Divider_18) || \ + ((DIVIDER) == LCD_Divider_19) || \ + ((DIVIDER) == LCD_Divider_20) || \ + ((DIVIDER) == LCD_Divider_21) || \ + ((DIVIDER) == LCD_Divider_22) || \ + ((DIVIDER) == LCD_Divider_23) || \ + ((DIVIDER) == LCD_Divider_24) || \ + ((DIVIDER) == LCD_Divider_25) || \ + ((DIVIDER) == LCD_Divider_26) || \ + ((DIVIDER) == LCD_Divider_27) || \ + ((DIVIDER) == LCD_Divider_28) || \ + ((DIVIDER) == LCD_Divider_29) || \ + ((DIVIDER) == LCD_Divider_30) || \ + ((DIVIDER) == LCD_Divider_31)) + +/** + * @} + */ + + +/** @defgroup LCD_Duty + * @{ + */ + +#define LCD_Duty_Static ((uint32_t)0x00000000) /*!< Static duty */ +#define LCD_Duty_1_2 ((uint32_t)0x00000004) /*!< 1/2 duty */ +#define LCD_Duty_1_3 ((uint32_t)0x00000008) /*!< 1/3 duty */ +#define LCD_Duty_1_4 ((uint32_t)0x0000000C) /*!< 1/4 duty */ +#define LCD_Duty_1_8 ((uint32_t)0x00000010) /*!< 1/4 duty */ + +#define IS_LCD_DUTY(DUTY) (((DUTY) == LCD_Duty_Static) || \ + ((DUTY) == LCD_Duty_1_2) || \ + ((DUTY) == LCD_Duty_1_3) || \ + ((DUTY) == LCD_Duty_1_4) || \ + ((DUTY) == LCD_Duty_1_8)) + +/** + * @} + */ + + +/** @defgroup LCD_Bias + * @{ + */ + +#define LCD_Bias_1_4 ((uint32_t)0x00000000) /*!< 1/4 Bias */ +#define LCD_Bias_1_2 LCD_CR_BIAS_0 /*!< 1/2 Bias */ +#define LCD_Bias_1_3 LCD_CR_BIAS_1 /*!< 1/3 Bias */ + +#define IS_LCD_BIAS(BIAS) (((BIAS) == LCD_Bias_1_4) || \ + ((BIAS) == LCD_Bias_1_2) || \ + ((BIAS) == LCD_Bias_1_3)) +/** + * @} + */ + +/** @defgroup LCD_Voltage_Source + * @{ + */ + +#define LCD_VoltageSource_Internal ((uint32_t)0x00000000) /*!< Internal voltage source for the LCD */ +#define LCD_VoltageSource_External LCD_CR_VSEL /*!< External voltage source for the LCD */ + +#define IS_LCD_VOLTAGE_SOURCE(SOURCE) (((SOURCE) == LCD_VoltageSource_Internal) || \ + ((SOURCE) == LCD_VoltageSource_External)) + +/** + * @} + */ + +/** @defgroup LCD_Interrupts + * @{ + */ +#define LCD_IT_SOF LCD_FCR_SOFIE +#define LCD_IT_UDD LCD_FCR_UDDIE + +#define IS_LCD_IT(IT) ((((IT) & (uint32_t)0xFFFFFFF5) == 0x00) && ((IT) != 0x00)) + +#define IS_LCD_GET_IT(IT) (((IT) == LCD_IT_SOF) || ((IT) == LCD_IT_UDD)) + +/** + * @} + */ + +/** @defgroup LCD_PulseOnDuration + * @{ + */ + +#define LCD_PulseOnDuration_0 ((uint32_t)0x00000000) /*!< Pulse ON duration = 0 pulse */ +#define LCD_PulseOnDuration_1 ((uint32_t)0x00000010) /*!< Pulse ON duration = 1/CK_PS */ +#define LCD_PulseOnDuration_2 ((uint32_t)0x00000020) /*!< Pulse ON duration = 2/CK_PS */ +#define LCD_PulseOnDuration_3 ((uint32_t)0x00000030) /*!< Pulse ON duration = 3/CK_PS */ +#define LCD_PulseOnDuration_4 ((uint32_t)0x00000040) /*!< Pulse ON duration = 4/CK_PS */ +#define LCD_PulseOnDuration_5 ((uint32_t)0x00000050) /*!< Pulse ON duration = 5/CK_PS */ +#define LCD_PulseOnDuration_6 ((uint32_t)0x00000060) /*!< Pulse ON duration = 6/CK_PS */ +#define LCD_PulseOnDuration_7 ((uint32_t)0x00000070) /*!< Pulse ON duration = 7/CK_PS */ + +#define IS_LCD_PULSE_ON_DURATION(DURATION) (((DURATION) == LCD_PulseOnDuration_0) || \ + ((DURATION) == LCD_PulseOnDuration_1) || \ + ((DURATION) == LCD_PulseOnDuration_2) || \ + ((DURATION) == LCD_PulseOnDuration_3) || \ + ((DURATION) == LCD_PulseOnDuration_4) || \ + ((DURATION) == LCD_PulseOnDuration_5) || \ + ((DURATION) == LCD_PulseOnDuration_6) || \ + ((DURATION) == LCD_PulseOnDuration_7)) +/** + * @} + */ + + +/** @defgroup LCD_DeadTime + * @{ + */ + +#define LCD_DeadTime_0 ((uint32_t)0x00000000) /*!< No dead Time */ +#define LCD_DeadTime_1 ((uint32_t)0x00000080) /*!< One Phase between different couple of Frame */ +#define LCD_DeadTime_2 ((uint32_t)0x00000100) /*!< Two Phase between different couple of Frame */ +#define LCD_DeadTime_3 ((uint32_t)0x00000180) /*!< Three Phase between different couple of Frame */ +#define LCD_DeadTime_4 ((uint32_t)0x00000200) /*!< Four Phase between different couple of Frame */ +#define LCD_DeadTime_5 ((uint32_t)0x00000280) /*!< Five Phase between different couple of Frame */ +#define LCD_DeadTime_6 ((uint32_t)0x00000300) /*!< Six Phase between different couple of Frame */ +#define LCD_DeadTime_7 ((uint32_t)0x00000380) /*!< Seven Phase between different couple of Frame */ + +#define IS_LCD_DEAD_TIME(TIME) (((TIME) == LCD_DeadTime_0) || \ + ((TIME) == LCD_DeadTime_1) || \ + ((TIME) == LCD_DeadTime_2) || \ + ((TIME) == LCD_DeadTime_3) || \ + ((TIME) == LCD_DeadTime_4) || \ + ((TIME) == LCD_DeadTime_5) || \ + ((TIME) == LCD_DeadTime_6) || \ + ((TIME) == LCD_DeadTime_7)) +/** + * @} + */ + +/** @defgroup LCD_BlinkMode + * @{ + */ + +#define LCD_BlinkMode_Off ((uint32_t)0x00000000) /*!< Blink disabled */ +#define LCD_BlinkMode_SEG0_COM0 ((uint32_t)0x00010000) /*!< Blink enabled on SEG[0], COM[0] (1 pixel) */ +#define LCD_BlinkMode_SEG0_AllCOM ((uint32_t)0x00020000) /*!< Blink enabled on SEG[0], all COM (up to + 8 pixels according to the programmed duty) */ +#define LCD_BlinkMode_AllSEG_AllCOM ((uint32_t)0x00030000) /*!< Blink enabled on all SEG and all COM (all pixels) */ + +#define IS_LCD_BLINK_MODE(MODE) (((MODE) == LCD_BlinkMode_Off) || \ + ((MODE) == LCD_BlinkMode_SEG0_COM0) || \ + ((MODE) == LCD_BlinkMode_SEG0_AllCOM) || \ + ((MODE) == LCD_BlinkMode_AllSEG_AllCOM)) +/** + * @} + */ + +/** @defgroup LCD_BlinkFrequency + * @{ + */ + +#define LCD_BlinkFrequency_Div8 ((uint32_t)0x00000000) /*!< The Blink frequency = fLCD/8 */ +#define LCD_BlinkFrequency_Div16 ((uint32_t)0x00002000) /*!< The Blink frequency = fLCD/16 */ +#define LCD_BlinkFrequency_Div32 ((uint32_t)0x00004000) /*!< The Blink frequency = fLCD/32 */ +#define LCD_BlinkFrequency_Div64 ((uint32_t)0x00006000) /*!< The Blink frequency = fLCD/64 */ +#define LCD_BlinkFrequency_Div128 ((uint32_t)0x00008000) /*!< The Blink frequency = fLCD/128 */ +#define LCD_BlinkFrequency_Div256 ((uint32_t)0x0000A000) /*!< The Blink frequency = fLCD/256 */ +#define LCD_BlinkFrequency_Div512 ((uint32_t)0x0000C000) /*!< The Blink frequency = fLCD/512 */ +#define LCD_BlinkFrequency_Div1024 ((uint32_t)0x0000E000) /*!< The Blink frequency = fLCD/1024 */ + +#define IS_LCD_BLINK_FREQUENCY(FREQUENCY) (((FREQUENCY) == LCD_BlinkFrequency_Div8) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div16) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div32) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div64) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div128) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div256) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div512) || \ + ((FREQUENCY) == LCD_BlinkFrequency_Div1024)) +/** + * @} + */ + +/** @defgroup LCD_Contrast + * @{ + */ + +#define LCD_Contrast_Level_0 ((uint32_t)0x00000000) /*!< Maximum Voltage = 2.60V */ +#define LCD_Contrast_Level_1 ((uint32_t)0x00000400) /*!< Maximum Voltage = 2.73V */ +#define LCD_Contrast_Level_2 ((uint32_t)0x00000800) /*!< Maximum Voltage = 2.86V */ +#define LCD_Contrast_Level_3 ((uint32_t)0x00000C00) /*!< Maximum Voltage = 2.99V */ +#define LCD_Contrast_Level_4 ((uint32_t)0x00001000) /*!< Maximum Voltage = 3.12V */ +#define LCD_Contrast_Level_5 ((uint32_t)0x00001400) /*!< Maximum Voltage = 3.25V */ +#define LCD_Contrast_Level_6 ((uint32_t)0x00001800) /*!< Maximum Voltage = 3.38V */ +#define LCD_Contrast_Level_7 ((uint32_t)0x00001C00) /*!< Maximum Voltage = 3.51V */ + +#define IS_LCD_CONTRAST(CONTRAST) (((CONTRAST) == LCD_Contrast_Level_0) || \ + ((CONTRAST) == LCD_Contrast_Level_1) || \ + ((CONTRAST) == LCD_Contrast_Level_2) || \ + ((CONTRAST) == LCD_Contrast_Level_3) || \ + ((CONTRAST) == LCD_Contrast_Level_4) || \ + ((CONTRAST) == LCD_Contrast_Level_5) || \ + ((CONTRAST) == LCD_Contrast_Level_6) || \ + ((CONTRAST) == LCD_Contrast_Level_7)) +/** + * @} + */ + +/** @defgroup LCD_Flag + * @{ + */ + +#define LCD_FLAG_ENS LCD_SR_ENS +#define LCD_FLAG_SOF LCD_SR_SOF +#define LCD_FLAG_UDR LCD_SR_UDR +#define LCD_FLAG_UDD LCD_SR_UDD +#define LCD_FLAG_RDY LCD_SR_RDY +#define LCD_FLAG_FCRSF LCD_SR_FCRSR + +#define IS_LCD_GET_FLAG(FLAG) (((FLAG) == LCD_FLAG_ENS) || ((FLAG) == LCD_FLAG_SOF) || \ + ((FLAG) == LCD_FLAG_UDR) || ((FLAG) == LCD_FLAG_UDD) || \ + ((FLAG) == LCD_FLAG_RDY) || ((FLAG) == LCD_FLAG_FCRSF)) + +#define IS_LCD_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF5) == 0x00) && ((FLAG) != 0x00)) +/** + * @} + */ + +/** @defgroup LCD_RAMRegister + * @{ + */ + +#define LCD_RAMRegister_0 ((uint32_t)0x00000000) /*!< LCD RAM Register 0 */ +#define LCD_RAMRegister_1 ((uint32_t)0x00000001) /*!< LCD RAM Register 1 */ +#define LCD_RAMRegister_2 ((uint32_t)0x00000002) /*!< LCD RAM Register 2 */ +#define LCD_RAMRegister_3 ((uint32_t)0x00000003) /*!< LCD RAM Register 3 */ +#define LCD_RAMRegister_4 ((uint32_t)0x00000004) /*!< LCD RAM Register 4 */ +#define LCD_RAMRegister_5 ((uint32_t)0x00000005) /*!< LCD RAM Register 5 */ +#define LCD_RAMRegister_6 ((uint32_t)0x00000006) /*!< LCD RAM Register 6 */ +#define LCD_RAMRegister_7 ((uint32_t)0x00000007) /*!< LCD RAM Register 7 */ +#define LCD_RAMRegister_8 ((uint32_t)0x00000008) /*!< LCD RAM Register 8 */ +#define LCD_RAMRegister_9 ((uint32_t)0x00000009) /*!< LCD RAM Register 9 */ +#define LCD_RAMRegister_10 ((uint32_t)0x0000000A) /*!< LCD RAM Register 10 */ +#define LCD_RAMRegister_11 ((uint32_t)0x0000000B) /*!< LCD RAM Register 11 */ +#define LCD_RAMRegister_12 ((uint32_t)0x0000000C) /*!< LCD RAM Register 12 */ +#define LCD_RAMRegister_13 ((uint32_t)0x0000000D) /*!< LCD RAM Register 13 */ +#define LCD_RAMRegister_14 ((uint32_t)0x0000000E) /*!< LCD RAM Register 14 */ +#define LCD_RAMRegister_15 ((uint32_t)0x0000000F) /*!< LCD RAM Register 15 */ + +#define IS_LCD_RAM_REGISTER(REGISTER) (((REGISTER) == LCD_RAMRegister_0) || \ + ((REGISTER) == LCD_RAMRegister_1) || \ + ((REGISTER) == LCD_RAMRegister_2) || \ + ((REGISTER) == LCD_RAMRegister_3) || \ + ((REGISTER) == LCD_RAMRegister_4) || \ + ((REGISTER) == LCD_RAMRegister_5) || \ + ((REGISTER) == LCD_RAMRegister_6) || \ + ((REGISTER) == LCD_RAMRegister_7) || \ + ((REGISTER) == LCD_RAMRegister_8) || \ + ((REGISTER) == LCD_RAMRegister_9) || \ + ((REGISTER) == LCD_RAMRegister_10) || \ + ((REGISTER) == LCD_RAMRegister_11) || \ + ((REGISTER) == LCD_RAMRegister_12) || \ + ((REGISTER) == LCD_RAMRegister_13) || \ + ((REGISTER) == LCD_RAMRegister_14) || \ + ((REGISTER) == LCD_RAMRegister_15)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the LCD configuration to the default reset state *****/ +void LCD_DeInit(void); + +/* Initialization and Configuration functions *********************************/ +void LCD_Init(LCD_InitTypeDef* LCD_InitStruct); +void LCD_StructInit(LCD_InitTypeDef* LCD_InitStruct); +void LCD_Cmd(FunctionalState NewState); +void LCD_WaitForSynchro(void); +void LCD_HighDriveCmd(FunctionalState NewState); +void LCD_MuxSegmentCmd(FunctionalState NewState); +void LCD_PulseOnDurationConfig(uint32_t LCD_PulseOnDuration); +void LCD_DeadTimeConfig(uint32_t LCD_DeadTime); +void LCD_BlinkConfig(uint32_t LCD_BlinkMode, uint32_t LCD_BlinkFrequency); +void LCD_ContrastConfig(uint32_t LCD_Contrast); + +/* LCD RAM memory write functions *********************************************/ +void LCD_Write(uint32_t LCD_RAMRegister, uint32_t LCD_Data); +void LCD_UpdateDisplayRequest(void); + +/* Interrupts and flags management functions **********************************/ +void LCD_ITConfig(uint32_t LCD_IT, FunctionalState NewState); +FlagStatus LCD_GetFlagStatus(uint32_t LCD_FLAG); +void LCD_ClearFlag(uint32_t LCD_FLAG); +ITStatus LCD_GetITStatus(uint32_t LCD_IT); +void LCD_ClearITPendingBit(uint32_t LCD_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_LCD_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_opamp.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_opamp.h new file mode 100644 index 0000000..1bff60c --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_opamp.h @@ -0,0 +1,187 @@ +/** + ****************************************************************************** + * @file stm32l1xx_opamp.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the operational + * amplifiers (opamp) firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_OPAMP_H +#define __STM32L1xx_OPAMP_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup OPAMP + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup OPAMP_Exported_Constants + * @{ + */ + +/** @defgroup OPAMP_Selection + * @{ + */ + +#define OPAMP_Selection_OPAMP1 OPAMP_CSR_OPA1PD +#define OPAMP_Selection_OPAMP2 OPAMP_CSR_OPA2PD +#define OPAMP_Selection_OPAMP3 OPAMP_CSR_OPA3PD + +#define IS_OPAMP_ALL_PERIPH(PERIPH) (((PERIPH) == OPAMP_Selection_OPAMP1) || \ + ((PERIPH) == OPAMP_Selection_OPAMP2) || \ + ((PERIPH) == OPAMP_Selection_OPAMP3)) + +/** + * @} + */ + +/** @defgroup OPAMP_Switches + * @{ + */ + +/* OPAMP1 Switches */ +#define OPAMP_OPAMP1Switch3 OPAMP_CSR_S3SEL1 /*!< OPAMP1 Switch 3 */ +#define OPAMP_OPAMP1Switch4 OPAMP_CSR_S4SEL1 /*!< OPAMP1 Switch 4 */ +#define OPAMP_OPAMP1Switch5 OPAMP_CSR_S5SEL1 /*!< OPAMP1 Switch 5 */ +#define OPAMP_OPAMP1Switch6 OPAMP_CSR_S6SEL1 /*!< OPAMP1 Switch 6 */ +#define OPAMP_OPAMP1SwitchANA OPAMP_CSR_ANAWSEL1 /*!< OPAMP1 Switch ANA */ + +/* OPAMP2 Switches */ +#define OPAMP_OPAMP2Switch3 OPAMP_CSR_S3SEL2 /*!< OPAMP2 Switch 3 */ +#define OPAMP_OPAMP2Switch4 OPAMP_CSR_S4SEL2 /*!< OPAMP2 Switch 4 */ +#define OPAMP_OPAMP2Switch5 OPAMP_CSR_S5SEL2 /*!< OPAMP2 Switch 5 */ +#define OPAMP_OPAMP2Switch6 OPAMP_CSR_S6SEL2 /*!< OPAMP2 Switch 6 */ +#define OPAMP_OPAMP2Switch7 OPAMP_CSR_S7SEL2 /*!< OPAMP2 Switch 7 */ +#define OPAMP_OPAMP2SwitchANA OPAMP_CSR_ANAWSEL2 /*!< OPAMP2 Switch ANA */ + +/* OPAMP3 Switches */ +#define OPAMP_OPAMP3Switch3 OPAMP_CSR_S3SEL3 /*!< OPAMP3 Switch 3 */ +#define OPAMP_OPAMP3Switch4 OPAMP_CSR_S4SEL3 /*!< OPAMP3 Switch 4 */ +#define OPAMP_OPAMP3Switch5 OPAMP_CSR_S5SEL3 /*!< OPAMP3 Switch 5 */ +#define OPAMP_OPAMP3Switch6 OPAMP_CSR_S6SEL3 /*!< OPAMP3 Switch 6 */ +#define OPAMP_OPAMP3SwitchANA OPAMP_CSR_ANAWSEL3 /*!< OPAMP3 Switch ANA */ + +#define IS_OPAMP_SWITCH(SWITCH) ((((SWITCH) & (uint32_t)0xF0E1E1E1) == 0x00) && ((SWITCH) != 0x00)) + +/** + * @} + */ + +/** @defgroup OPAMP_Trimming + * @{ + */ + +#define OPAMP_Trimming_Factory ((uint32_t)0x00000000) /*!< Factory trimming */ +#define OPAMP_Trimming_User OPAMP_OTR_OT_USER /*!< User trimming */ + +#define IS_OPAMP_TRIMMING(TRIMMING) (((TRIMMING) == OPAMP_Trimming_Factory) || \ + ((TRIMMING) == OPAMP_Trimming_User)) + +/** + * @} + */ + +/** @defgroup OPAMP_Input + * @{ + */ + +#define OPAMP_Input_NMOS OPAMP_CSR_OPA1CAL_H /*!< NMOS input */ +#define OPAMP_Input_PMOS OPAMP_CSR_OPA1CAL_L /*!< PMOS input */ + +#define IS_OPAMP_INPUT(INPUT) (((INPUT) == OPAMP_Input_NMOS) || \ + ((INPUT) == OPAMP_Input_PMOS)) + +/** + * @} + */ + +/** @defgroup OPAMP_TrimValue + * @{ + */ + +#define IS_OPAMP_TRIMMINGVALUE(VALUE) ((VALUE) <= 0x0000001F) /*!< Trimming value */ + +/** + * @} + */ + +/** @defgroup OPAMP_PowerRange + * @{ + */ + +#define OPAMP_PowerRange_Low ((uint32_t)0x00000000) /*!< Low power range is selected (VDDA is lower than 2.4V) */ +#define OPAMP_PowerRange_High OPAMP_CSR_AOP_RANGE /*!< High power range is selected (VDDA is higher than 2.4V) */ + +#define IS_OPAMP_RANGE(RANGE) (((RANGE) == OPAMP_PowerRange_Low) || \ + ((RANGE) == OPAMP_PowerRange_High)) + +/** + * @} + */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* Initialization and Configuration functions *********************************/ +void OPAMP_DeInit(void); +void OPAMP_SwitchCmd(uint32_t OPAMP_OPAMPxSwitchy, FunctionalState NewState); +void OPAMP_Cmd(uint32_t OPAMP_Selection, FunctionalState NewState); +void OPAMP_LowPowerCmd(uint32_t OPAMP_Selection, FunctionalState NewState); +void OPAMP_PowerRangeSelect(uint32_t OPAMP_PowerRange); + +/* Calibration functions ******************************************************/ +void OPAMP_OffsetTrimmingModeSelect(uint32_t OPAMP_Trimming); +void OPAMP_OffsetTrimConfig(uint32_t OPAMP_Selection, uint32_t OPAMP_Input, uint32_t OPAMP_TrimValue); +void OPAMP_OffsetTrimLowPowerConfig(uint32_t OPAMP_Selection, uint32_t OPAMP_Input, uint32_t OPAMP_TrimValue); +FlagStatus OPAMP_GetFlagStatus(uint32_t OPAMP_Selection); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_OPAMP_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_pwr.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_pwr.h new file mode 100644 index 0000000..fb1ed50 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_pwr.h @@ -0,0 +1,213 @@ +/** + ****************************************************************************** + * @file stm32l1xx_pwr.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the PWR firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_PWR_H +#define __STM32L1xx_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Constants + * @{ + */ + +/** @defgroup PWR_PVD_detection_level + * @{ + */ + +#define PWR_PVDLevel_0 PWR_CR_PLS_LEV0 +#define PWR_PVDLevel_1 PWR_CR_PLS_LEV1 +#define PWR_PVDLevel_2 PWR_CR_PLS_LEV2 +#define PWR_PVDLevel_3 PWR_CR_PLS_LEV3 +#define PWR_PVDLevel_4 PWR_CR_PLS_LEV4 +#define PWR_PVDLevel_5 PWR_CR_PLS_LEV5 +#define PWR_PVDLevel_6 PWR_CR_PLS_LEV6 +#define PWR_PVDLevel_7 PWR_CR_PLS_LEV7 /* External input analog voltage + (Compare internally to VREFINT) */ +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_0) || ((LEVEL) == PWR_PVDLevel_1)|| \ + ((LEVEL) == PWR_PVDLevel_2) || ((LEVEL) == PWR_PVDLevel_3)|| \ + ((LEVEL) == PWR_PVDLevel_4) || ((LEVEL) == PWR_PVDLevel_5)|| \ + ((LEVEL) == PWR_PVDLevel_6) || ((LEVEL) == PWR_PVDLevel_7)) +/** + * @} + */ + +/** @defgroup PWR_WakeUp_Pins + * @{ + */ + +#define PWR_WakeUpPin_1 ((uint32_t)0x00000000) +#define PWR_WakeUpPin_2 ((uint32_t)0x00000004) +#define PWR_WakeUpPin_3 ((uint32_t)0x00000008) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WakeUpPin_1) || \ + ((PIN) == PWR_WakeUpPin_2) || \ + ((PIN) == PWR_WakeUpPin_3)) +/** + * @} + */ + + +/** @defgroup PWR_Voltage_Scaling_Ranges + * @{ + */ + +#define PWR_VoltageScaling_Range1 PWR_CR_VOS_0 +#define PWR_VoltageScaling_Range2 PWR_CR_VOS_1 +#define PWR_VoltageScaling_Range3 PWR_CR_VOS + +#define IS_PWR_VOLTAGE_SCALING_RANGE(RANGE) (((RANGE) == PWR_VoltageScaling_Range1) || \ + ((RANGE) == PWR_VoltageScaling_Range2) || \ + ((RANGE) == PWR_VoltageScaling_Range3)) +/** + * @} + */ + +/** @defgroup PWR_Regulator_state_is_Sleep_STOP_mode + * @{ + */ + +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower PWR_CR_LPSDSR +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ + ((REGULATOR) == PWR_Regulator_LowPower)) +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry + * @{ + */ + +#define PWR_SLEEPEntry_WFI ((uint8_t)0x01) +#define PWR_SLEEPEntry_WFE ((uint8_t)0x02) +#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPEntry_WFI) || ((ENTRY) == PWR_SLEEPEntry_WFE)) + +/** + * @} + */ + +/** @defgroup PWR_STOP_mode_entry + * @{ + */ + +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) + +/** + * @} + */ + +/** @defgroup PWR_Flag + * @{ + */ + +#define PWR_FLAG_WU PWR_CSR_WUF +#define PWR_FLAG_SB PWR_CSR_SBF +#define PWR_FLAG_PVDO PWR_CSR_PVDO +#define PWR_FLAG_VREFINTRDY PWR_CSR_VREFINTRDYF +#define PWR_FLAG_VOS PWR_CSR_VOSF +#define PWR_FLAG_REGLP PWR_CSR_REGLPF + +#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ + ((FLAG) == PWR_FLAG_PVDO) || ((FLAG) == PWR_FLAG_VREFINTRDY) || \ + ((FLAG) == PWR_FLAG_VOS) || ((FLAG) == PWR_FLAG_REGLP)) + +#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the PWR configuration to the default reset state ******/ +void PWR_DeInit(void); + +/* RTC Domain Access function *************************************************/ +void PWR_RTCAccessCmd(FunctionalState NewState); + +/* PVD configuration functions ************************************************/ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_PVDCmd(FunctionalState NewState); + +/* WakeUp pins configuration functions ****************************************/ +void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState); + +/* Ultra Low Power mode configuration functions *******************************/ +void PWR_FastWakeUpCmd(FunctionalState NewState); +void PWR_UltraLowPowerCmd(FunctionalState NewState); + +/* Voltage Scaling configuration functions ************************************/ +void PWR_VoltageScalingConfig(uint32_t PWR_VoltageScaling); + +/* Low Power modes configuration functions ************************************/ +void PWR_EnterLowPowerRunMode(FunctionalState NewState); +void PWR_EnterSleepMode(uint32_t PWR_Regulator, uint8_t PWR_SLEEPEntry); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); + +/* Flags management functions *************************************************/ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_PWR_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rcc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rcc.h new file mode 100644 index 0000000..7f85fa8 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rcc.h @@ -0,0 +1,488 @@ +/** + ****************************************************************************** + * @file stm32l1xx_rcc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the RCC + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_RCC_H +#define __STM32L1xx_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +typedef struct +{ + uint32_t SYSCLK_Frequency; + uint32_t HCLK_Frequency; + uint32_t PCLK1_Frequency; + uint32_t PCLK2_Frequency; +}RCC_ClocksTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Constants + * @{ + */ + +/** @defgroup RCC_HSE_configuration + * @{ + */ + +#define RCC_HSE_OFF ((uint8_t)0x00) +#define RCC_HSE_ON ((uint8_t)0x01) +#define RCC_HSE_Bypass ((uint8_t)0x05) +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_Bypass)) + +/** + * @} + */ + +/** @defgroup RCC_MSI_Clock_Range + * @{ + */ + +#define RCC_MSIRange_0 RCC_ICSCR_MSIRANGE_0 /*!< MSI = 65.536 KHz */ +#define RCC_MSIRange_1 RCC_ICSCR_MSIRANGE_1 /*!< MSI = 131.072 KHz */ +#define RCC_MSIRange_2 RCC_ICSCR_MSIRANGE_2 /*!< MSI = 262.144 KHz */ +#define RCC_MSIRange_3 RCC_ICSCR_MSIRANGE_3 /*!< MSI = 524.288 KHz */ +#define RCC_MSIRange_4 RCC_ICSCR_MSIRANGE_4 /*!< MSI = 1.048 MHz */ +#define RCC_MSIRange_5 RCC_ICSCR_MSIRANGE_5 /*!< MSI = 2.097 MHz */ +#define RCC_MSIRange_6 RCC_ICSCR_MSIRANGE_6 /*!< MSI = 4.194 MHz */ + +#define IS_RCC_MSI_CLOCK_RANGE(RANGE) (((RANGE) == RCC_MSIRange_0) || \ + ((RANGE) == RCC_MSIRange_1) || \ + ((RANGE) == RCC_MSIRange_2) || \ + ((RANGE) == RCC_MSIRange_3) || \ + ((RANGE) == RCC_MSIRange_4) || \ + ((RANGE) == RCC_MSIRange_5) || \ + ((RANGE) == RCC_MSIRange_6)) + +/** + * @} + */ + +/** @defgroup RCC_PLL_Clock_Source + * @{ + */ + +#define RCC_PLLSource_HSI ((uint8_t)0x00) +#define RCC_PLLSource_HSE ((uint8_t)0x01) + +#define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI) || \ + ((SOURCE) == RCC_PLLSource_HSE)) +/** + * @} + */ + +/** @defgroup RCC_PLL_Multiplication_Factor + * @{ + */ + +#define RCC_PLLMul_3 ((uint8_t)0x00) +#define RCC_PLLMul_4 ((uint8_t)0x04) +#define RCC_PLLMul_6 ((uint8_t)0x08) +#define RCC_PLLMul_8 ((uint8_t)0x0C) +#define RCC_PLLMul_12 ((uint8_t)0x10) +#define RCC_PLLMul_16 ((uint8_t)0x14) +#define RCC_PLLMul_24 ((uint8_t)0x18) +#define RCC_PLLMul_32 ((uint8_t)0x1C) +#define RCC_PLLMul_48 ((uint8_t)0x20) + + +#define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_3) || ((MUL) == RCC_PLLMul_4) || \ + ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_8) || \ + ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_16) || \ + ((MUL) == RCC_PLLMul_24) || ((MUL) == RCC_PLLMul_32) || \ + ((MUL) == RCC_PLLMul_48)) +/** + * @} + */ + +/** @defgroup RCC_PLL_Divider_Factor + * @{ + */ + +#define RCC_PLLDiv_2 ((uint8_t)0x40) +#define RCC_PLLDiv_3 ((uint8_t)0x80) +#define RCC_PLLDiv_4 ((uint8_t)0xC0) + + +#define IS_RCC_PLL_DIV(DIV) (((DIV) == RCC_PLLDiv_2) || ((DIV) == RCC_PLLDiv_3) || \ + ((DIV) == RCC_PLLDiv_4)) +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source + * @{ + */ + +#define RCC_SYSCLKSource_MSI RCC_CFGR_SW_MSI +#define RCC_SYSCLKSource_HSI RCC_CFGR_SW_HSI +#define RCC_SYSCLKSource_HSE RCC_CFGR_SW_HSE +#define RCC_SYSCLKSource_PLLCLK RCC_CFGR_SW_PLL +#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_MSI) || \ + ((SOURCE) == RCC_SYSCLKSource_HSI) || \ + ((SOURCE) == RCC_SYSCLKSource_HSE) || \ + ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source + * @{ + */ + +#define RCC_SYSCLK_Div1 RCC_CFGR_HPRE_DIV1 +#define RCC_SYSCLK_Div2 RCC_CFGR_HPRE_DIV2 +#define RCC_SYSCLK_Div4 RCC_CFGR_HPRE_DIV4 +#define RCC_SYSCLK_Div8 RCC_CFGR_HPRE_DIV8 +#define RCC_SYSCLK_Div16 RCC_CFGR_HPRE_DIV16 +#define RCC_SYSCLK_Div64 RCC_CFGR_HPRE_DIV64 +#define RCC_SYSCLK_Div128 RCC_CFGR_HPRE_DIV128 +#define RCC_SYSCLK_Div256 RCC_CFGR_HPRE_DIV256 +#define RCC_SYSCLK_Div512 RCC_CFGR_HPRE_DIV512 +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ + ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ + ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ + ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ + ((HCLK) == RCC_SYSCLK_Div512)) +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source + * @{ + */ + +#define RCC_HCLK_Div1 RCC_CFGR_PPRE1_DIV1 +#define RCC_HCLK_Div2 RCC_CFGR_PPRE1_DIV2 +#define RCC_HCLK_Div4 RCC_CFGR_PPRE1_DIV4 +#define RCC_HCLK_Div8 RCC_CFGR_PPRE1_DIV8 +#define RCC_HCLK_Div16 RCC_CFGR_PPRE1_DIV16 +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ + ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ + ((PCLK) == RCC_HCLK_Div16)) +/** + * @} + */ + + +/** @defgroup RCC_Interrupt_Source + * @{ + */ + +#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_MSIRDY ((uint8_t)0x20) +#define RCC_IT_LSECSS ((uint8_t)0x40) +#define RCC_IT_CSS ((uint8_t)0x80) + +#define IS_RCC_IT(IT) ((((IT) & (uint8_t)0x80) == 0x00) && ((IT) != 0x00)) + +#define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ + ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ + ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_MSIRDY) || \ + ((IT) == RCC_IT_CSS) || ((IT) == RCC_IT_LSECSS)) + +#define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x00) == 0x00) && ((IT) != 0x00)) + +/** + * @} + */ + +/** @defgroup RCC_LSE_Configuration + * @{ + */ + +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x05) +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_Bypass)) +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source + * @{ + */ + +#define RCC_RTCCLKSource_LSE RCC_CSR_RTCSEL_LSE +#define RCC_RTCCLKSource_LSI RCC_CSR_RTCSEL_LSI +#define RCC_RTCCLKSource_HSE_Div2 RCC_CSR_RTCSEL_HSE +#define RCC_RTCCLKSource_HSE_Div4 ((uint32_t)RCC_CSR_RTCSEL_HSE | RCC_CR_RTCPRE_0) +#define RCC_RTCCLKSource_HSE_Div8 ((uint32_t)RCC_CSR_RTCSEL_HSE | RCC_CR_RTCPRE_1) +#define RCC_RTCCLKSource_HSE_Div16 ((uint32_t)RCC_CSR_RTCSEL_HSE | RCC_CR_RTCPRE) +#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ + ((SOURCE) == RCC_RTCCLKSource_LSI) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div2) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div4) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div8) || \ + ((SOURCE) == RCC_RTCCLKSource_HSE_Div16)) +/** + * @} + */ + +/** @defgroup RCC_AHB_Peripherals + * @{ + */ + +#define RCC_AHBPeriph_GPIOA RCC_AHBENR_GPIOAEN +#define RCC_AHBPeriph_GPIOB RCC_AHBENR_GPIOBEN +#define RCC_AHBPeriph_GPIOC RCC_AHBENR_GPIOCEN +#define RCC_AHBPeriph_GPIOD RCC_AHBENR_GPIODEN +#define RCC_AHBPeriph_GPIOE RCC_AHBENR_GPIOEEN +#define RCC_AHBPeriph_GPIOH RCC_AHBENR_GPIOHEN +#define RCC_AHBPeriph_GPIOF RCC_AHBENR_GPIOFEN +#define RCC_AHBPeriph_GPIOG RCC_AHBENR_GPIOGEN +#define RCC_AHBPeriph_CRC RCC_AHBENR_CRCEN +#define RCC_AHBPeriph_FLITF RCC_AHBENR_FLITFEN +#define RCC_AHBPeriph_SRAM RCC_AHBLPENR_SRAMLPEN +#define RCC_AHBPeriph_DMA1 RCC_AHBENR_DMA1EN +#define RCC_AHBPeriph_DMA2 RCC_AHBENR_DMA2EN +#define RCC_AHBPeriph_AES RCC_AHBENR_AESEN +#define RCC_AHBPeriph_FSMC RCC_AHBENR_FSMCEN + +#define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xB4FF6F00) == 0x00) && ((PERIPH) != 0x00)) +#define IS_RCC_AHB_LPMODE_PERIPH(PERIPH) ((((PERIPH) & 0xB4FF6F00) == 0x00) && ((PERIPH) != 0x00)) + +/** + * @} + */ + +/** @defgroup RCC_APB2_Peripherals + * @{ + */ + +#define RCC_APB2Periph_SYSCFG RCC_APB2ENR_SYSCFGEN +#define RCC_APB2Periph_TIM9 RCC_APB2ENR_TIM9EN +#define RCC_APB2Periph_TIM10 RCC_APB2ENR_TIM10EN +#define RCC_APB2Periph_TIM11 RCC_APB2ENR_TIM11EN +#define RCC_APB2Periph_ADC1 RCC_APB2ENR_ADC1EN +#define RCC_APB2Periph_SDIO RCC_APB2ENR_SDIOEN +#define RCC_APB2Periph_SPI1 RCC_APB2ENR_SPI1EN +#define RCC_APB2Periph_USART1 RCC_APB2ENR_USART1EN + +#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFA5E2) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Peripherals + * @{ + */ + +#define RCC_APB1Periph_TIM2 RCC_APB1ENR_TIM2EN +#define RCC_APB1Periph_TIM3 RCC_APB1ENR_TIM3EN +#define RCC_APB1Periph_TIM4 RCC_APB1ENR_TIM4EN +#define RCC_APB1Periph_TIM5 RCC_APB1ENR_TIM5EN +#define RCC_APB1Periph_TIM6 RCC_APB1ENR_TIM6EN +#define RCC_APB1Periph_TIM7 RCC_APB1ENR_TIM7EN +#define RCC_APB1Periph_LCD RCC_APB1ENR_LCDEN +#define RCC_APB1Periph_WWDG RCC_APB1ENR_WWDGEN +#define RCC_APB1Periph_SPI2 RCC_APB1ENR_SPI2EN +#define RCC_APB1Periph_SPI3 RCC_APB1ENR_SPI3EN +#define RCC_APB1Periph_USART2 RCC_APB1ENR_USART2EN +#define RCC_APB1Periph_USART3 RCC_APB1ENR_USART3EN +#define RCC_APB1Periph_UART4 RCC_APB1ENR_UART4EN +#define RCC_APB1Periph_UART5 RCC_APB1ENR_UART5EN +#define RCC_APB1Periph_I2C1 RCC_APB1ENR_I2C1EN +#define RCC_APB1Periph_I2C2 RCC_APB1ENR_I2C2EN +#define RCC_APB1Periph_USB RCC_APB1ENR_USBEN +#define RCC_APB1Periph_PWR RCC_APB1ENR_PWREN +#define RCC_APB1Periph_DAC RCC_APB1ENR_DACEN +#define RCC_APB1Periph_COMP RCC_APB1ENR_COMPEN + + +#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x4F0135C0) == 0x00) && ((PERIPH) != 0x00)) +/** + * @} + */ + +/** @defgroup RCC_MCO_Clock_Source + * @{ + */ + +#define RCC_MCOSource_NoClock ((uint8_t)0x00) +#define RCC_MCOSource_SYSCLK ((uint8_t)0x01) +#define RCC_MCOSource_HSI ((uint8_t)0x02) +#define RCC_MCOSource_MSI ((uint8_t)0x03) +#define RCC_MCOSource_HSE ((uint8_t)0x04) +#define RCC_MCOSource_PLLCLK ((uint8_t)0x05) +#define RCC_MCOSource_LSI ((uint8_t)0x06) +#define RCC_MCOSource_LSE ((uint8_t)0x07) + +#define IS_RCC_MCO_SOURCE(SOURCE) (((SOURCE) == RCC_MCOSource_NoClock) || ((SOURCE) == RCC_MCOSource_SYSCLK) || \ + ((SOURCE) == RCC_MCOSource_HSI) || ((SOURCE) == RCC_MCOSource_MSI) || \ + ((SOURCE) == RCC_MCOSource_HSE) || ((SOURCE) == RCC_MCOSource_PLLCLK) || \ + ((SOURCE) == RCC_MCOSource_LSI) || ((SOURCE) == RCC_MCOSource_LSE)) +/** + * @} + */ + +/** @defgroup RCC_MCO_Output_Divider + * @{ + */ + +#define RCC_MCODiv_1 ((uint8_t)0x00) +#define RCC_MCODiv_2 ((uint8_t)0x10) +#define RCC_MCODiv_4 ((uint8_t)0x20) +#define RCC_MCODiv_8 ((uint8_t)0x30) +#define RCC_MCODiv_16 ((uint8_t)0x40) + +#define IS_RCC_MCO_DIV(DIV) (((DIV) == RCC_MCODiv_1) || ((DIV) == RCC_MCODiv_2) || \ + ((DIV) == RCC_MCODiv_4) || ((DIV) == RCC_MCODiv_8) || \ + ((DIV) == RCC_MCODiv_16)) +/** + * @} + */ + +/** @defgroup RCC_Flag + * @{ + */ + +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_MSIRDY ((uint8_t)0x29) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x49) +#define RCC_FLAG_LSECSS ((uint8_t)0x4A) +#define RCC_FLAG_LSIRDY ((uint8_t)0x41) +#define RCC_FLAG_OBLRST ((uint8_t)0x59) +#define RCC_FLAG_PINRST ((uint8_t)0x5A) +#define RCC_FLAG_PORRST ((uint8_t)0x5B) +#define RCC_FLAG_SFTRST ((uint8_t)0x5C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x5D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x5E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x5F) + +#define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ + ((FLAG) == RCC_FLAG_MSIRDY) || ((FLAG) == RCC_FLAG_PLLRDY) || \ + ((FLAG) == RCC_FLAG_LSERDY) || ((FLAG) == RCC_FLAG_LSIRDY) || \ + ((FLAG) == RCC_FLAG_PINRST) || ((FLAG) == RCC_FLAG_PORRST) || \ + ((FLAG) == RCC_FLAG_SFTRST) || ((FLAG) == RCC_FLAG_IWDGRST)|| \ + ((FLAG) == RCC_FLAG_WWDGRST)|| ((FLAG) == RCC_FLAG_LPWRRST)|| \ + ((FLAG) == RCC_FLAG_WWDGRST)|| ((FLAG) == RCC_FLAG_LSECSS)) + +#define IS_RCC_HSI_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) +#define IS_RCC_MSI_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x3F) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the RCC clock configuration to the default reset state */ +void RCC_DeInit(void); + +/* Internal/external clocks, PLL, CSS and MCO configuration functions *********/ +void RCC_HSEConfig(uint8_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_MSIRangeConfig(uint32_t RCC_MSIRange); +void RCC_AdjustMSICalibrationValue(uint8_t MSICalibrationValue); +void RCC_MSICmd(FunctionalState NewState); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint8_t RCC_PLLSource, uint8_t RCC_PLLMul, uint8_t RCC_PLLDiv); +void RCC_PLLCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_LSEClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCOSource, uint8_t RCC_MCODiv); + +/* System, AHB and APB busses clocks configuration functions ******************/ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); + +/* Peripheral clocks configuration functions **********************************/ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_RTCResetCmd(FunctionalState NewState); + +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); + +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); + +void RCC_AHBPeriphClockLPModeCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockLPModeCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockLPModeCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); +void RCC_ClearFlag(void); +ITStatus RCC_GetITStatus(uint8_t RCC_IT); +void RCC_ClearITPendingBit(uint8_t RCC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_RCC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rtc.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rtc.h new file mode 100644 index 0000000..b1a3c86 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_rtc.h @@ -0,0 +1,896 @@ +/** + ****************************************************************************** + * @file stm32l1xx_rtc.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the RTC firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_RTC_H +#define __STM32L1xx_RTC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RTC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief RTC Init structures definition + */ +typedef struct +{ + uint32_t RTC_HourFormat; /*!< Specifies the RTC Hour Format. + This parameter can be a value of @ref RTC_Hour_Formats */ + + uint32_t RTC_AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value. + This parameter must be set to a value lower than 0x7F */ + + uint32_t RTC_SynchPrediv; /*!< Specifies the RTC Synchronous Predivider value. + This parameter must be set to a value lower than 0x7FFF */ +}RTC_InitTypeDef; + +/** + * @brief RTC Time structure definition + */ +typedef struct +{ + uint8_t RTC_Hours; /*!< Specifies the RTC Time Hour. + This parameter must be set to a value in the 0-12 range + if the RTC_HourFormat_12 is selected or 0-23 range if + the RTC_HourFormat_24 is selected. */ + + uint8_t RTC_Minutes; /*!< Specifies the RTC Time Minutes. + This parameter must be set to a value in the 0-59 range. */ + + uint8_t RTC_Seconds; /*!< Specifies the RTC Time Seconds. + This parameter must be set to a value in the 0-59 range. */ + + uint8_t RTC_H12; /*!< Specifies the RTC AM/PM Time. + This parameter can be a value of @ref RTC_AM_PM_Definitions */ +}RTC_TimeTypeDef; + +/** + * @brief RTC Date structure definition + */ +typedef struct +{ + uint8_t RTC_WeekDay; /*!< Specifies the RTC Date WeekDay. + This parameter can be a value of @ref RTC_WeekDay_Definitions */ + + uint8_t RTC_Month; /*!< Specifies the RTC Date Month (in BCD format). + This parameter can be a value of @ref RTC_Month_Date_Definitions */ + + uint8_t RTC_Date; /*!< Specifies the RTC Date. + This parameter must be set to a value in the 1-31 range. */ + + uint8_t RTC_Year; /*!< Specifies the RTC Date Year. + This parameter must be set to a value in the 0-99 range. */ +}RTC_DateTypeDef; + +/** + * @brief RTC Alarm structure definition + */ +typedef struct +{ + RTC_TimeTypeDef RTC_AlarmTime; /*!< Specifies the RTC Alarm Time members. */ + + uint32_t RTC_AlarmMask; /*!< Specifies the RTC Alarm Masks. + This parameter can be a value of @ref RTC_AlarmMask_Definitions */ + + uint32_t RTC_AlarmDateWeekDaySel; /*!< Specifies the RTC Alarm is on Date or WeekDay. + This parameter can be a value of @ref RTC_AlarmDateWeekDay_Definitions */ + + uint8_t RTC_AlarmDateWeekDay; /*!< Specifies the RTC Alarm Date/WeekDay. + If the Alarm Date is selected, this parameter + must be set to a value in the 1-31 range. + If the Alarm WeekDay is selected, this + parameter can be a value of @ref RTC_WeekDay_Definitions */ +}RTC_AlarmTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup RTC_Exported_Constants + * @{ + */ + + +/** @defgroup RTC_Hour_Formats + * @{ + */ +#define RTC_HourFormat_24 ((uint32_t)0x00000000) +#define RTC_HourFormat_12 ((uint32_t)0x00000040) +#define IS_RTC_HOUR_FORMAT(FORMAT) (((FORMAT) == RTC_HourFormat_12) || \ + ((FORMAT) == RTC_HourFormat_24)) +/** + * @} + */ + +/** @defgroup RTC_Asynchronous_Predivider + * @{ + */ +#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7F) + +/** + * @} + */ + + +/** @defgroup RTC_Synchronous_Predivider + * @{ + */ +#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFF) + +/** + * @} + */ + +/** @defgroup RTC_Time_Definitions + * @{ + */ +#define IS_RTC_HOUR12(HOUR) (((HOUR) > 0) && ((HOUR) <= 12)) +#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23) +#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59) +#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59) + +/** + * @} + */ + +/** @defgroup RTC_AM_PM_Definitions + * @{ + */ +#define RTC_H12_AM ((uint8_t)0x00) +#define RTC_H12_PM ((uint8_t)0x40) +#define IS_RTC_H12(PM) (((PM) == RTC_H12_AM) || ((PM) == RTC_H12_PM)) + +/** + * @} + */ + +/** @defgroup RTC_Year_Date_Definitions + * @{ + */ +#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99) + +/** + * @} + */ + +/** @defgroup RTC_Month_Date_Definitions + * @{ + */ + +/* Coded in BCD format */ +#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) +#define IS_RTC_MONTH(MONTH) (((MONTH) >= 1) && ((MONTH) <= 12)) +#define IS_RTC_DATE(DATE) (((DATE) >= 1) && ((DATE) <= 31)) + +/** + * @} + */ + +/** @defgroup RTC_WeekDay_Definitions + * @{ + */ + +#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) +#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ + ((WEEKDAY) == RTC_Weekday_Tuesday) || \ + ((WEEKDAY) == RTC_Weekday_Wednesday) || \ + ((WEEKDAY) == RTC_Weekday_Thursday) || \ + ((WEEKDAY) == RTC_Weekday_Friday) || \ + ((WEEKDAY) == RTC_Weekday_Saturday) || \ + ((WEEKDAY) == RTC_Weekday_Sunday)) +/** + * @} + */ + + +/** @defgroup RTC_Alarm_Definitions + * @{ + */ +#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) > 0) && ((DATE) <= 31)) +#define IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ + ((WEEKDAY) == RTC_Weekday_Tuesday) || \ + ((WEEKDAY) == RTC_Weekday_Wednesday) || \ + ((WEEKDAY) == RTC_Weekday_Thursday) || \ + ((WEEKDAY) == RTC_Weekday_Friday) || \ + ((WEEKDAY) == RTC_Weekday_Saturday) || \ + ((WEEKDAY) == RTC_Weekday_Sunday)) + +/** + * @} + */ + + +/** @defgroup RTC_AlarmDateWeekDay_Definitions + * @{ + */ +#define RTC_AlarmDateWeekDaySel_Date ((uint32_t)0x00000000) +#define RTC_AlarmDateWeekDaySel_WeekDay ((uint32_t)0x40000000) + +#define IS_RTC_ALARM_DATE_WEEKDAY_SEL(SEL) (((SEL) == RTC_AlarmDateWeekDaySel_Date) || \ + ((SEL) == RTC_AlarmDateWeekDaySel_WeekDay)) + +/** + * @} + */ + + +/** @defgroup RTC_AlarmMask_Definitions + * @{ + */ +#define RTC_AlarmMask_None ((uint32_t)0x00000000) +#define RTC_AlarmMask_DateWeekDay ((uint32_t)0x80000000) +#define RTC_AlarmMask_Hours ((uint32_t)0x00800000) +#define RTC_AlarmMask_Minutes ((uint32_t)0x00008000) +#define RTC_AlarmMask_Seconds ((uint32_t)0x00000080) +#define RTC_AlarmMask_All ((uint32_t)0x80808080) +#define IS_ALARM_MASK(MASK) (((MASK) & 0x7F7F7F7F) == (uint32_t)RESET) + +/** + * @} + */ + +/** @defgroup RTC_Alarms_Definitions + * @{ + */ +#define RTC_Alarm_A ((uint32_t)0x00000100) +#define RTC_Alarm_B ((uint32_t)0x00000200) +#define IS_RTC_ALARM(ALARM) (((ALARM) == RTC_Alarm_A) || ((ALARM) == RTC_Alarm_B)) +#define IS_RTC_CMD_ALARM(ALARM) (((ALARM) & (RTC_Alarm_A | RTC_Alarm_B)) != (uint32_t)RESET) + +/** + * @} + */ + +/** @defgroup RTC_Alarm_Sub_Seconds_Masks_Definitions + * @{ + */ +#define RTC_AlarmSubSecondMask_All ((uint32_t)0x00000000) /*!< All Alarm SS fields are masked. + There is no comparison on sub seconds + for Alarm */ +#define RTC_AlarmSubSecondMask_SS14_1 ((uint32_t)0x01000000) /*!< SS[14:1] are don't care in Alarm + comparison. Only SS[0] is compared. */ +#define RTC_AlarmSubSecondMask_SS14_2 ((uint32_t)0x02000000) /*!< SS[14:2] are don't care in Alarm + comparison. Only SS[1:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_3 ((uint32_t)0x03000000) /*!< SS[14:3] are don't care in Alarm + comparison. Only SS[2:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_4 ((uint32_t)0x04000000) /*!< SS[14:4] are don't care in Alarm + comparison. Only SS[3:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_5 ((uint32_t)0x05000000) /*!< SS[14:5] are don't care in Alarm + comparison. Only SS[4:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_6 ((uint32_t)0x06000000) /*!< SS[14:6] are don't care in Alarm + comparison. Only SS[5:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_7 ((uint32_t)0x07000000) /*!< SS[14:7] are don't care in Alarm + comparison. Only SS[6:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_8 ((uint32_t)0x08000000) /*!< SS[14:8] are don't care in Alarm + comparison. Only SS[7:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_9 ((uint32_t)0x09000000) /*!< SS[14:9] are don't care in Alarm + comparison. Only SS[8:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_10 ((uint32_t)0x0A000000) /*!< SS[14:10] are don't care in Alarm + comparison. Only SS[9:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_11 ((uint32_t)0x0B000000) /*!< SS[14:11] are don't care in Alarm + comparison. Only SS[10:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_12 ((uint32_t)0x0C000000) /*!< SS[14:12] are don't care in Alarm + comparison.Only SS[11:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14_13 ((uint32_t)0x0D000000) /*!< SS[14:13] are don't care in Alarm + comparison. Only SS[12:0] are compared */ +#define RTC_AlarmSubSecondMask_SS14 ((uint32_t)0x0E000000) /*!< SS[14] is don't care in Alarm + comparison.Only SS[13:0] are compared */ +#define RTC_AlarmSubSecondMask_None ((uint32_t)0x0F000000) /*!< SS[14:0] are compared and must match + to activate alarm. */ +#define IS_RTC_ALARM_SUB_SECOND_MASK(MASK) (((MASK) == RTC_AlarmSubSecondMask_All) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_1) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_2) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_3) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_4) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_5) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_6) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_7) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_8) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_9) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_10) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_11) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_12) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14_13) || \ + ((MASK) == RTC_AlarmSubSecondMask_SS14) || \ + ((MASK) == RTC_AlarmSubSecondMask_None)) +/** + * @} + */ + +/** @defgroup RTC_Alarm_Sub_Seconds_Value + * @{ + */ + +#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= 0x00007FFF) + +/** + * @} + */ + +/** @defgroup RTC_Wakeup_Timer_Definitions + * @{ + */ +#define RTC_WakeUpClock_RTCCLK_Div16 ((uint32_t)0x00000000) +#define RTC_WakeUpClock_RTCCLK_Div8 ((uint32_t)0x00000001) +#define RTC_WakeUpClock_RTCCLK_Div4 ((uint32_t)0x00000002) +#define RTC_WakeUpClock_RTCCLK_Div2 ((uint32_t)0x00000003) +#define RTC_WakeUpClock_CK_SPRE_16bits ((uint32_t)0x00000004) +#define RTC_WakeUpClock_CK_SPRE_17bits ((uint32_t)0x00000006) +#define IS_RTC_WAKEUP_CLOCK(CLOCK) (((CLOCK) == RTC_WakeUpClock_RTCCLK_Div16) || \ + ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div8) || \ + ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div4) || \ + ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div2) || \ + ((CLOCK) == RTC_WakeUpClock_CK_SPRE_16bits) || \ + ((CLOCK) == RTC_WakeUpClock_CK_SPRE_17bits)) +#define IS_RTC_WAKEUP_COUNTER(COUNTER) ((COUNTER) <= 0xFFFF) +/** + * @} + */ + +/** @defgroup RTC_Time_Stamp_Edges_definitions + * @{ + */ +#define RTC_TimeStampEdge_Rising ((uint32_t)0x00000000) +#define RTC_TimeStampEdge_Falling ((uint32_t)0x00000008) +#define IS_RTC_TIMESTAMP_EDGE(EDGE) (((EDGE) == RTC_TimeStampEdge_Rising) || \ + ((EDGE) == RTC_TimeStampEdge_Falling)) +/** + * @} + */ + +/** @defgroup RTC_Output_selection_Definitions + * @{ + */ +#define RTC_Output_Disable ((uint32_t)0x00000000) +#define RTC_Output_AlarmA ((uint32_t)0x00200000) +#define RTC_Output_AlarmB ((uint32_t)0x00400000) +#define RTC_Output_WakeUp ((uint32_t)0x00600000) + +#define IS_RTC_OUTPUT(OUTPUT) (((OUTPUT) == RTC_Output_Disable) || \ + ((OUTPUT) == RTC_Output_AlarmA) || \ + ((OUTPUT) == RTC_Output_AlarmB) || \ + ((OUTPUT) == RTC_Output_WakeUp)) + +/** + * @} + */ + +/** @defgroup RTC_Output_Polarity_Definitions + * @{ + */ +#define RTC_OutputPolarity_High ((uint32_t)0x00000000) +#define RTC_OutputPolarity_Low ((uint32_t)0x00100000) +#define IS_RTC_OUTPUT_POL(POL) (((POL) == RTC_OutputPolarity_High) || \ + ((POL) == RTC_OutputPolarity_Low)) +/** + * @} + */ + +/** @defgroup RTC_Coarse_Calibration_Definitions + * @{ + */ +#define RTC_CalibSign_Positive ((uint32_t)0x00000000) +#define RTC_CalibSign_Negative ((uint32_t)0x00000080) +#define IS_RTC_CALIB_SIGN(SIGN) (((SIGN) == RTC_CalibSign_Positive) || \ + ((SIGN) == RTC_CalibSign_Negative)) +#define IS_RTC_CALIB_VALUE(VALUE) ((VALUE) < 0x20) + +/** + * @} + */ + + /** @defgroup RTC_Calib_Output_selection_Definitions + * @{ + */ +#define RTC_CalibOutput_512Hz ((uint32_t)0x00000000) +#define RTC_CalibOutput_1Hz ((uint32_t)0x00080000) +#define IS_RTC_CALIB_OUTPUT(OUTPUT) (((OUTPUT) == RTC_CalibOutput_512Hz) || \ + ((OUTPUT) == RTC_CalibOutput_1Hz)) +/** + * @} + */ + +/** @defgroup RTC_Smooth_calib_period_Definitions + * @{ + */ +#define RTC_SmoothCalibPeriod_32sec ((uint32_t)0x00000000) /*!< if RTCCLK = 32768 Hz, Smooth calibation + period is 32s, else 2exp20 RTCCLK seconds */ +#define RTC_SmoothCalibPeriod_16sec ((uint32_t)0x00002000) /*!< if RTCCLK = 32768 Hz, Smooth calibation + period is 16s, else 2exp19 RTCCLK seconds */ +#define RTC_SmoothCalibPeriod_8sec ((uint32_t)0x00004000) /*!< if RTCCLK = 32768 Hz, Smooth calibation + period is 8s, else 2exp18 RTCCLK seconds */ +#define IS_RTC_SMOOTH_CALIB_PERIOD(PERIOD) (((PERIOD) == RTC_SmoothCalibPeriod_32sec) || \ + ((PERIOD) == RTC_SmoothCalibPeriod_16sec) || \ + ((PERIOD) == RTC_SmoothCalibPeriod_8sec)) + +/** + * @} + */ + +/** @defgroup RTC_Smooth_calib_Plus_pulses_Definitions + * @{ + */ +#define RTC_SmoothCalibPlusPulses_Set ((uint32_t)0x00008000) /*!< 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_SmoothCalibPlusPulses_Reset ((uint32_t)0x00000000) /*!< The number of RTCCLK pulses subbstited + during a 32-second window = CALM[8:0]. */ +#define IS_RTC_SMOOTH_CALIB_PLUS(PLUS) (((PLUS) == RTC_SmoothCalibPlusPulses_Set) || \ + ((PLUS) == RTC_SmoothCalibPlusPulses_Reset)) + +/** + * @} + */ + +/** @defgroup RTC_Smooth_calib_Minus_pulses_Definitions + * @{ + */ +#define IS_RTC_SMOOTH_CALIB_MINUS(VALUE) ((VALUE) <= 0x000001FF) + +/** + * @} + */ + +/** @defgroup RTC_DayLightSaving_Definitions + * @{ + */ +#define RTC_DayLightSaving_SUB1H ((uint32_t)0x00020000) +#define RTC_DayLightSaving_ADD1H ((uint32_t)0x00010000) +#define IS_RTC_DAYLIGHT_SAVING(SAVE) (((SAVE) == RTC_DayLightSaving_SUB1H) || \ + ((SAVE) == RTC_DayLightSaving_ADD1H)) + +#define RTC_StoreOperation_Reset ((uint32_t)0x00000000) +#define RTC_StoreOperation_Set ((uint32_t)0x00040000) +#define IS_RTC_STORE_OPERATION(OPERATION) (((OPERATION) == RTC_StoreOperation_Reset) || \ + ((OPERATION) == RTC_StoreOperation_Set)) +/** + * @} + */ + +/** @defgroup RTC_Tamper_Trigger_Definitions + * @{ + */ +#define RTC_TamperTrigger_RisingEdge ((uint32_t)0x00000000) +#define RTC_TamperTrigger_FallingEdge ((uint32_t)0x00000001) +#define RTC_TamperTrigger_LowLevel ((uint32_t)0x00000000) +#define RTC_TamperTrigger_HighLevel ((uint32_t)0x00000001) +#define IS_RTC_TAMPER_TRIGGER(TRIGGER) (((TRIGGER) == RTC_TamperTrigger_RisingEdge) || \ + ((TRIGGER) == RTC_TamperTrigger_FallingEdge) || \ + ((TRIGGER) == RTC_TamperTrigger_LowLevel) || \ + ((TRIGGER) == RTC_TamperTrigger_HighLevel)) + +/** + * @} + */ + +/** @defgroup RTC_Tamper_Filter_Definitions + * @{ + */ +#define RTC_TamperFilter_Disable ((uint32_t)0x00000000) /*!< Tamper filter is disabled */ + +#define RTC_TamperFilter_2Sample ((uint32_t)0x00000800) /*!< Tamper is activated after 2 + consecutive samples at the active level */ +#define RTC_TamperFilter_4Sample ((uint32_t)0x00001000) /*!< Tamper is activated after 4 + consecutive samples at the active level */ +#define RTC_TamperFilter_8Sample ((uint32_t)0x00001800) /*!< Tamper is activated after 8 + consecutive samples at the active leve. */ +#define IS_RTC_TAMPER_FILTER(FILTER) (((FILTER) == RTC_TamperFilter_Disable) || \ + ((FILTER) == RTC_TamperFilter_2Sample) || \ + ((FILTER) == RTC_TamperFilter_4Sample) || \ + ((FILTER) == RTC_TamperFilter_8Sample)) +/** + * @} + */ + +/** @defgroup RTC_Tamper_Sampling_Frequencies_Definitions + * @{ + */ +#define RTC_TamperSamplingFreq_RTCCLK_Div32768 ((uint32_t)0x00000000) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 32768 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div16384 ((uint32_t)0x000000100) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 16384 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div8192 ((uint32_t)0x00000200) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 8192 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div4096 ((uint32_t)0x00000300) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 4096 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div2048 ((uint32_t)0x00000400) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 2048 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div1024 ((uint32_t)0x00000500) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 1024 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div512 ((uint32_t)0x00000600) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 512 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div256 ((uint32_t)0x00000700) /*!< Each of the tamper inputs are sampled + with a frequency = RTCCLK / 256 */ +#define IS_RTC_TAMPER_SAMPLING_FREQ(FREQ) (((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div32768) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div16384) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div8192) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div4096) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div2048) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div1024) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div512) || \ + ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div256)) + +/** + * @} + */ + + /** @defgroup RTC_Tamper_Pin_Precharge_Duration_Definitions + * @{ + */ +#define RTC_TamperPrechargeDuration_1RTCCLK ((uint32_t)0x00000000) /*!< Tamper pins are pre-charged before + sampling during 1 RTCCLK cycle */ +#define RTC_TamperPrechargeDuration_2RTCCLK ((uint32_t)0x00002000) /*!< Tamper pins are pre-charged before + sampling during 2 RTCCLK cycles */ +#define RTC_TamperPrechargeDuration_4RTCCLK ((uint32_t)0x00004000) /*!< Tamper pins are pre-charged before + sampling during 4 RTCCLK cycles */ +#define RTC_TamperPrechargeDuration_8RTCCLK ((uint32_t)0x00006000) /*!< Tamper pins are pre-charged before + sampling during 8 RTCCLK cycles */ + +#define IS_RTC_TAMPER_PRECHARGE_DURATION(DURATION) (((DURATION) == RTC_TamperPrechargeDuration_1RTCCLK) || \ + ((DURATION) == RTC_TamperPrechargeDuration_2RTCCLK) || \ + ((DURATION) == RTC_TamperPrechargeDuration_4RTCCLK) || \ + ((DURATION) == RTC_TamperPrechargeDuration_8RTCCLK)) +/** + * @} + */ + +/** @defgroup RTC_Tamper_Pins_Definitions + * @{ + */ +#define RTC_Tamper_1 RTC_TAFCR_TAMP1E /*!< Tamper detection enable for + input tamper 1 */ +#define RTC_Tamper_2 RTC_TAFCR_TAMP2E /*!< Tamper detection enable for + input tamper 2 */ +#define RTC_Tamper_3 RTC_TAFCR_TAMP3E /*!< Tamper detection enable for + input tamper 3 */ + +#define IS_RTC_TAMPER(TAMPER) ((((TAMPER) & (uint32_t)0xFFFFFFD6) == 0x00) && ((TAMPER) != (uint32_t)RESET)) + + +/** + * @} + */ + +/** @defgroup RTC_Output_Type_ALARM_OUT + * @{ + */ +#define RTC_OutputType_OpenDrain ((uint32_t)0x00000000) +#define RTC_OutputType_PushPull ((uint32_t)0x00040000) +#define IS_RTC_OUTPUT_TYPE(TYPE) (((TYPE) == RTC_OutputType_OpenDrain) || \ + ((TYPE) == RTC_OutputType_PushPull)) + +/** + * @} + */ + +/** @defgroup RTC_Add_1_Second_Parameter_Definitions + * @{ + */ +#define RTC_ShiftAdd1S_Reset ((uint32_t)0x00000000) +#define RTC_ShiftAdd1S_Set ((uint32_t)0x80000000) +#define IS_RTC_SHIFT_ADD1S(SEL) (((SEL) == RTC_ShiftAdd1S_Reset) || \ + ((SEL) == RTC_ShiftAdd1S_Set)) +/** + * @} + */ + +/** @defgroup RTC_Substract_Fraction_Of_Second_Value + * @{ + */ +#define IS_RTC_SHIFT_SUBFS(FS) ((FS) <= 0x00007FFF) + +/** + * @} + */ + +/** @defgroup RTC_Backup_Registers_Definitions + * @{ + */ + +#define RTC_BKP_DR0 ((uint32_t)0x00000000) +#define RTC_BKP_DR1 ((uint32_t)0x00000001) +#define RTC_BKP_DR2 ((uint32_t)0x00000002) +#define RTC_BKP_DR3 ((uint32_t)0x00000003) +#define RTC_BKP_DR4 ((uint32_t)0x00000004) +#define RTC_BKP_DR5 ((uint32_t)0x00000005) +#define RTC_BKP_DR6 ((uint32_t)0x00000006) +#define RTC_BKP_DR7 ((uint32_t)0x00000007) +#define RTC_BKP_DR8 ((uint32_t)0x00000008) +#define RTC_BKP_DR9 ((uint32_t)0x00000009) +#define RTC_BKP_DR10 ((uint32_t)0x0000000A) +#define RTC_BKP_DR11 ((uint32_t)0x0000000B) +#define RTC_BKP_DR12 ((uint32_t)0x0000000C) +#define RTC_BKP_DR13 ((uint32_t)0x0000000D) +#define RTC_BKP_DR14 ((uint32_t)0x0000000E) +#define RTC_BKP_DR15 ((uint32_t)0x0000000F) +#define RTC_BKP_DR16 ((uint32_t)0x00000010) +#define RTC_BKP_DR17 ((uint32_t)0x00000011) +#define RTC_BKP_DR18 ((uint32_t)0x00000012) +#define RTC_BKP_DR19 ((uint32_t)0x00000013) +#define RTC_BKP_DR20 ((uint32_t)0x00000014) +#define RTC_BKP_DR21 ((uint32_t)0x00000015) +#define RTC_BKP_DR22 ((uint32_t)0x00000016) +#define RTC_BKP_DR23 ((uint32_t)0x00000017) +#define RTC_BKP_DR24 ((uint32_t)0x00000018) +#define RTC_BKP_DR25 ((uint32_t)0x00000019) +#define RTC_BKP_DR26 ((uint32_t)0x0000001A) +#define RTC_BKP_DR27 ((uint32_t)0x0000001B) +#define RTC_BKP_DR28 ((uint32_t)0x0000001C) +#define RTC_BKP_DR29 ((uint32_t)0x0000001D) +#define RTC_BKP_DR30 ((uint32_t)0x0000001E) +#define RTC_BKP_DR31 ((uint32_t)0x0000001F) +#define IS_RTC_BKP(BKP) (((BKP) == RTC_BKP_DR0) || \ + ((BKP) == RTC_BKP_DR1) || \ + ((BKP) == RTC_BKP_DR2) || \ + ((BKP) == RTC_BKP_DR3) || \ + ((BKP) == RTC_BKP_DR4) || \ + ((BKP) == RTC_BKP_DR5) || \ + ((BKP) == RTC_BKP_DR6) || \ + ((BKP) == RTC_BKP_DR7) || \ + ((BKP) == RTC_BKP_DR8) || \ + ((BKP) == RTC_BKP_DR9) || \ + ((BKP) == RTC_BKP_DR10) || \ + ((BKP) == RTC_BKP_DR11) || \ + ((BKP) == RTC_BKP_DR12) || \ + ((BKP) == RTC_BKP_DR13) || \ + ((BKP) == RTC_BKP_DR14) || \ + ((BKP) == RTC_BKP_DR15) || \ + ((BKP) == RTC_BKP_DR16) || \ + ((BKP) == RTC_BKP_DR17) || \ + ((BKP) == RTC_BKP_DR18) || \ + ((BKP) == RTC_BKP_DR19) || \ + ((BKP) == RTC_BKP_DR20) || \ + ((BKP) == RTC_BKP_DR21) || \ + ((BKP) == RTC_BKP_DR22) || \ + ((BKP) == RTC_BKP_DR23) || \ + ((BKP) == RTC_BKP_DR24) || \ + ((BKP) == RTC_BKP_DR25) || \ + ((BKP) == RTC_BKP_DR26) || \ + ((BKP) == RTC_BKP_DR27) || \ + ((BKP) == RTC_BKP_DR28) || \ + ((BKP) == RTC_BKP_DR29) || \ + ((BKP) == RTC_BKP_DR30) || \ + ((BKP) == RTC_BKP_DR31)) +/** + * @} + */ + +/** @defgroup RTC_Input_parameter_format_definitions + * @{ + */ +#define RTC_Format_BIN ((uint32_t)0x000000000) +#define RTC_Format_BCD ((uint32_t)0x000000001) +#define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_Format_BIN) || ((FORMAT) == RTC_Format_BCD)) + +/** + * @} + */ + +/** @defgroup RTC_Flags_Definitions + * @{ + */ +#define RTC_FLAG_RECALPF ((uint32_t)0x00010000) +#define RTC_FLAG_TAMP3F ((uint32_t)0x00008000) +#define RTC_FLAG_TAMP2F ((uint32_t)0x00004000) +#define RTC_FLAG_TAMP1F ((uint32_t)0x00002000) +#define RTC_FLAG_TSOVF ((uint32_t)0x00001000) +#define RTC_FLAG_TSF ((uint32_t)0x00000800) +#define RTC_FLAG_WUTF ((uint32_t)0x00000400) +#define RTC_FLAG_ALRBF ((uint32_t)0x00000200) +#define RTC_FLAG_ALRAF ((uint32_t)0x00000100) +#define RTC_FLAG_INITF ((uint32_t)0x00000040) +#define RTC_FLAG_RSF ((uint32_t)0x00000020) +#define RTC_FLAG_INITS ((uint32_t)0x00000010) +#define RTC_FLAG_SHPF ((uint32_t)0x00000008) +#define RTC_FLAG_WUTWF ((uint32_t)0x00000004) +#define RTC_FLAG_ALRBWF ((uint32_t)0x00000002) +#define RTC_FLAG_ALRAWF ((uint32_t)0x00000001) +#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_TSOVF) || ((FLAG) == RTC_FLAG_TSF) || \ + ((FLAG) == RTC_FLAG_WUTF) || ((FLAG) == RTC_FLAG_ALRBF) || \ + ((FLAG) == RTC_FLAG_ALRAF) || ((FLAG) == RTC_FLAG_INITF) || \ + ((FLAG) == RTC_FLAG_RSF) || ((FLAG) == RTC_FLAG_WUTWF) || \ + ((FLAG) == RTC_FLAG_ALRBWF) || ((FLAG) == RTC_FLAG_ALRAWF) || \ + ((FLAG) == RTC_FLAG_TAMP1F) || ((FLAG) == RTC_FLAG_TAMP2F) || \ + ((FLAG) == RTC_FLAG_TAMP3F) || ((FLAG) == RTC_FLAG_RECALPF) || \ + ((FLAG) == RTC_FLAG_SHPF)) +#define IS_RTC_CLEAR_FLAG(FLAG) (((FLAG) != (uint32_t)RESET) && (((FLAG) & 0xFFFF00DF) == (uint32_t)RESET)) + +/** + * @} + */ + +/** @defgroup RTC_Interrupts_Definitions + * @{ + */ +#define RTC_IT_TS ((uint32_t)0x00008000) +#define RTC_IT_WUT ((uint32_t)0x00004000) +#define RTC_IT_ALRB ((uint32_t)0x00002000) +#define RTC_IT_ALRA ((uint32_t)0x00001000) +#define RTC_IT_TAMP ((uint32_t)0x00000004) /* Used only to Enable the Tamper Interrupt */ +#define RTC_IT_TAMP1 ((uint32_t)0x00020000) +#define RTC_IT_TAMP2 ((uint32_t)0x00040000) +#define RTC_IT_TAMP3 ((uint32_t)0x00080000) + + +#define IS_RTC_CONFIG_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFF0FFB) == (uint32_t)RESET)) +#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_TS) || ((IT) == RTC_IT_WUT) || \ + ((IT) == RTC_IT_ALRB) || ((IT) == RTC_IT_ALRA) || \ + ((IT) == RTC_IT_TAMP1) || ((IT) == RTC_IT_TAMP2) || \ + ((IT) == RTC_IT_TAMP3)) +#define IS_RTC_CLEAR_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFF10FFF) == (uint32_t)RESET)) + +/** + * @} + */ + +/** @defgroup RTC_Legacy + * @{ + */ +#define RTC_DigitalCalibConfig RTC_CoarseCalibConfig +#define RTC_DigitalCalibCmd RTC_CoarseCalibCmd + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the RTC configuration to the default reset state *****/ +ErrorStatus RTC_DeInit(void); + + +/* Initialization and Configuration functions *********************************/ +ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct); +void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct); +void RTC_WriteProtectionCmd(FunctionalState NewState); +ErrorStatus RTC_EnterInitMode(void); +void RTC_ExitInitMode(void); +ErrorStatus RTC_WaitForSynchro(void); +ErrorStatus RTC_RefClockCmd(FunctionalState NewState); +void RTC_BypassShadowCmd(FunctionalState NewState); + +/* Time and Date configuration functions **************************************/ +ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); +void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct); +void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); +uint32_t RTC_GetSubSecond(void); +ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); +void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct); +void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); + +/* Alarms (Alarm A and Alarm B) configuration functions **********************/ +void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); +void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct); +void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); +ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState); +void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask); +uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); + +/* WakeUp Timer configuration functions ***************************************/ +void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock); +void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); +uint32_t RTC_GetWakeUpCounter(void); +ErrorStatus RTC_WakeUpCmd(FunctionalState NewState); + +/* Daylight Saving configuration functions ************************************/ +void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation); +uint32_t RTC_GetStoreOperation(void); + +/* Output pin Configuration function ******************************************/ +void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity); + +/* Coarse and Smooth Calibration configuration functions **********************/ +ErrorStatus RTC_CoarseCalibConfig(uint32_t RTC_CalibSign, uint32_t Value); +ErrorStatus RTC_CoarseCalibCmd(FunctionalState NewState); +void RTC_CalibOutputCmd(FunctionalState NewState); +void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput); +ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, + uint32_t RTC_SmoothCalibPlusPulses, + uint32_t RTC_SmouthCalibMinusPulsesValue); + +/* TimeStamp configuration functions ******************************************/ +void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState); +void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, + RTC_DateTypeDef* RTC_StampDateStruct); +uint32_t RTC_GetTimeStampSubSecond(void); + +/* Tampers configuration functions ********************************************/ +void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger); +void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState); +void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter); +void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq); +void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration); +void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState); +void RTC_TamperPullUpCmd(FunctionalState NewState); + +/* Backup Data Registers configuration functions ******************************/ +void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data); +uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR); + +/* Output Type Config configuration functions *********************************/ +void RTC_OutputTypeConfig(uint32_t RTC_OutputType); + +/* RTC_Shift_control_synchonisation_functions *********************************/ +ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS); + +/* Interrupts and flags management functions **********************************/ +void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState); +FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); +void RTC_ClearFlag(uint32_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint32_t RTC_IT); +void RTC_ClearITPendingBit(uint32_t RTC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_RTC_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_sdio.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_sdio.h new file mode 100644 index 0000000..54599fa --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_sdio.h @@ -0,0 +1,535 @@ +/** + ****************************************************************************** + * @file stm32l1xx_sdio.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the SDIO firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_SDIO_H +#define __STM32L1xx_SDIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SDIO + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +typedef struct +{ + uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref SDIO_Clock_Edge */ + + uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is + enabled or disabled. + This parameter can be a value of @ref SDIO_Clock_Bypass */ + + uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or + disabled when the bus is idle. + This parameter can be a value of @ref SDIO_Clock_Power_Save */ + + uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. + This parameter can be a value of @ref SDIO_Bus_Wide */ + + uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + + uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. + This parameter can be a value between 0x00 and 0xFF. */ + +} SDIO_InitTypeDef; + +typedef struct +{ + uint32_t SDIO_Argument; /*!< Specifies the SDIO 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 SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ + + uint32_t SDIO_Response; /*!< Specifies the SDIO response type. + This parameter can be a value of @ref SDIO_Response_Type */ + + uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. + This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + + uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_CPSM_State */ +} SDIO_CmdInitTypeDef; + +typedef struct +{ + uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ + + uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ + + uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. + This parameter can be a value of @ref SDIO_Data_Block_Size */ + + uint32_t SDIO_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 */ + + uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. + This parameter can be a value of @ref SDIO_Transfer_Type */ + + uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_DPSM_State */ +} SDIO_DataInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup SDIO_Exported_Constants + * @{ + */ + +/** @defgroup SDIO_Clock_Edge + * @{ + */ + +#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) +#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) +#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ + ((EDGE) == SDIO_ClockEdge_Falling)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Bypass + * @{ + */ + +#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) +#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ + ((BYPASS) == SDIO_ClockBypass_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Clock_Power_Save + * @{ + */ + +#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) +#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) +#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ + ((SAVE) == SDIO_ClockPowerSave_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Bus_Wide + * @{ + */ + +#define SDIO_BusWide_1b ((uint32_t)0x00000000) +#define SDIO_BusWide_4b ((uint32_t)0x00000800) +#define SDIO_BusWide_8b ((uint32_t)0x00001000) +#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ + ((WIDE) == SDIO_BusWide_8b)) + +/** + * @} + */ + +/** @defgroup SDIO_Hardware_Flow_Control + * @{ + */ + +#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) +#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) +#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ + ((CONTROL) == SDIO_HardwareFlowControl_Enable)) +/** + * @} + */ + +/** @defgroup SDIO_Power_State + * @{ + */ + +#define SDIO_PowerState_OFF ((uint32_t)0x00000000) +#define SDIO_PowerState_ON ((uint32_t)0x00000003) +#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) +/** + * @} + */ + + +/** @defgroup SDIO_Interrupt_soucres + * @{ + */ + +#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) +#define SDIO_IT_CMDREND ((uint32_t)0x00000040) +#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) +#define SDIO_IT_DATAEND ((uint32_t)0x00000100) +#define SDIO_IT_STBITERR ((uint32_t)0x00000200) +#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) +#define SDIO_IT_CMDACT ((uint32_t)0x00000800) +#define SDIO_IT_TXACT ((uint32_t)0x00001000) +#define SDIO_IT_RXACT ((uint32_t)0x00002000) +#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) +#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) +#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) +#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) +/** + * @} + */ + +/** @defgroup SDIO_Command_Index + * @{ + */ + +#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) +/** + * @} + */ + +/** @defgroup SDIO_Response_Type + * @{ + */ + +#define SDIO_Response_No ((uint32_t)0x00000000) +#define SDIO_Response_Short ((uint32_t)0x00000040) +#define SDIO_Response_Long ((uint32_t)0x000000C0) +#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ + ((RESPONSE) == SDIO_Response_Short) || \ + ((RESPONSE) == SDIO_Response_Long)) +/** + * @} + */ + +/** @defgroup SDIO_Wait_Interrupt_State + * @{ + */ + +#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ +#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ +#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ +#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ + ((WAIT) == SDIO_Wait_Pend)) +/** + * @} + */ + +/** @defgroup SDIO_CPSM_State + * @{ + */ + +#define SDIO_CPSM_Disable ((uint32_t)0x00000000) +#define SDIO_CPSM_Enable ((uint32_t)0x00000400) +#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Response_Registers + * @{ + */ + +#define SDIO_RESP1 ((uint32_t)0x00000000) +#define SDIO_RESP2 ((uint32_t)0x00000004) +#define SDIO_RESP3 ((uint32_t)0x00000008) +#define SDIO_RESP4 ((uint32_t)0x0000000C) +#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ + ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) +/** + * @} + */ + +/** @defgroup SDIO_Data_Length + * @{ + */ + +#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) +/** + * @} + */ + +/** @defgroup SDIO_Data_Block_Size + * @{ + */ + +#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) +#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) +#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) +#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) +#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) +#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) +#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) +#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) +#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) +#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) +#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) +#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) +#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) +#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) +#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) +#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ + ((SIZE) == SDIO_DataBlockSize_2b) || \ + ((SIZE) == SDIO_DataBlockSize_4b) || \ + ((SIZE) == SDIO_DataBlockSize_8b) || \ + ((SIZE) == SDIO_DataBlockSize_16b) || \ + ((SIZE) == SDIO_DataBlockSize_32b) || \ + ((SIZE) == SDIO_DataBlockSize_64b) || \ + ((SIZE) == SDIO_DataBlockSize_128b) || \ + ((SIZE) == SDIO_DataBlockSize_256b) || \ + ((SIZE) == SDIO_DataBlockSize_512b) || \ + ((SIZE) == SDIO_DataBlockSize_1024b) || \ + ((SIZE) == SDIO_DataBlockSize_2048b) || \ + ((SIZE) == SDIO_DataBlockSize_4096b) || \ + ((SIZE) == SDIO_DataBlockSize_8192b) || \ + ((SIZE) == SDIO_DataBlockSize_16384b)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Direction + * @{ + */ + +#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) +#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) +#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ + ((DIR) == SDIO_TransferDir_ToSDIO)) +/** + * @} + */ + +/** @defgroup SDIO_Transfer_Type + * @{ + */ + +#define SDIO_TransferMode_Block ((uint32_t)0x00000000) +#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) +#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ + ((MODE) == SDIO_TransferMode_Block)) +/** + * @} + */ + +/** @defgroup SDIO_DPSM_State + * @{ + */ + +#define SDIO_DPSM_Disable ((uint32_t)0x00000000) +#define SDIO_DPSM_Enable ((uint32_t)0x00000001) +#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) +/** + * @} + */ + +/** @defgroup SDIO_Flags + * @{ + */ + +#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) +#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) +#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) +#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) +#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) +#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) +#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) +#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) +#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) +#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) +#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) +#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) +#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) +#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ + ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ + ((FLAG) == SDIO_FLAG_TXUNDERR) || \ + ((FLAG) == SDIO_FLAG_RXOVERR) || \ + ((FLAG) == SDIO_FLAG_CMDREND) || \ + ((FLAG) == SDIO_FLAG_CMDSENT) || \ + ((FLAG) == SDIO_FLAG_DATAEND) || \ + ((FLAG) == SDIO_FLAG_STBITERR) || \ + ((FLAG) == SDIO_FLAG_DBCKEND) || \ + ((FLAG) == SDIO_FLAG_CMDACT) || \ + ((FLAG) == SDIO_FLAG_TXACT) || \ + ((FLAG) == SDIO_FLAG_RXACT) || \ + ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOF) || \ + ((FLAG) == SDIO_FLAG_RXFIFOF) || \ + ((FLAG) == SDIO_FLAG_TXFIFOE) || \ + ((FLAG) == SDIO_FLAG_RXFIFOE) || \ + ((FLAG) == SDIO_FLAG_TXDAVL) || \ + ((FLAG) == SDIO_FLAG_RXDAVL) || \ + ((FLAG) == SDIO_FLAG_SDIOIT) || \ + ((FLAG) == SDIO_FLAG_CEATAEND)) + +#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) + +#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ + ((IT) == SDIO_IT_DCRCFAIL) || \ + ((IT) == SDIO_IT_CTIMEOUT) || \ + ((IT) == SDIO_IT_DTIMEOUT) || \ + ((IT) == SDIO_IT_TXUNDERR) || \ + ((IT) == SDIO_IT_RXOVERR) || \ + ((IT) == SDIO_IT_CMDREND) || \ + ((IT) == SDIO_IT_CMDSENT) || \ + ((IT) == SDIO_IT_DATAEND) || \ + ((IT) == SDIO_IT_STBITERR) || \ + ((IT) == SDIO_IT_DBCKEND) || \ + ((IT) == SDIO_IT_CMDACT) || \ + ((IT) == SDIO_IT_TXACT) || \ + ((IT) == SDIO_IT_RXACT) || \ + ((IT) == SDIO_IT_TXFIFOHE) || \ + ((IT) == SDIO_IT_RXFIFOHF) || \ + ((IT) == SDIO_IT_TXFIFOF) || \ + ((IT) == SDIO_IT_RXFIFOF) || \ + ((IT) == SDIO_IT_TXFIFOE) || \ + ((IT) == SDIO_IT_RXFIFOE) || \ + ((IT) == SDIO_IT_TXDAVL) || \ + ((IT) == SDIO_IT_RXDAVL) || \ + ((IT) == SDIO_IT_SDIOIT) || \ + ((IT) == SDIO_IT_CEATAEND)) + +#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) + +/** + * @} + */ + +/** @defgroup SDIO_Read_Wait_Mode + * @{ + */ + +#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000001) +#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000000) +#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ + ((MODE) == SDIO_ReadWaitMode_DATA2)) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* Function used to set the SDIO configuration to the default reset state ****/ +void SDIO_DeInit(void); + +/* Initialization and Configuration functions *********************************/ +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_ClockCmd(FunctionalState NewState); +void SDIO_SetPowerState(uint32_t SDIO_PowerState); +uint32_t SDIO_GetPowerState(void); + +/* DMA transfers management functions *****************************************/ +void SDIO_DMACmd(FunctionalState NewState); + +/* Command path state machine (CPSM) management functions *********************/ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); +uint8_t SDIO_GetCommandResponse(void); +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); + +/* Data path state machine (DPSM) management functions ************************/ +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +uint32_t SDIO_GetDataCounter(void); +uint32_t SDIO_ReadData(void); +void SDIO_WriteData(uint32_t Data); +uint32_t SDIO_GetFIFOCount(void); + +/* SDIO IO Cards mode management functions ************************************/ +void SDIO_StartSDIOReadWait(FunctionalState NewState); +void SDIO_StopSDIOReadWait(FunctionalState NewState); +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +void SDIO_SetSDIOOperation(FunctionalState NewState); +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); + +/* CE-ATA mode management functions *******************************************/ +void SDIO_CommandCompletionCmd(FunctionalState NewState); +void SDIO_CEATAITCmd(FunctionalState NewState); +void SDIO_SendCEATACmd(FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); +void SDIO_ClearFlag(uint32_t SDIO_FLAG); +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); +void SDIO_ClearITPendingBit(uint32_t SDIO_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_SDIO_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_spi.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_spi.h new file mode 100644 index 0000000..cd205ea --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_spi.h @@ -0,0 +1,524 @@ +/** + ****************************************************************************** + * @file stm32l1xx_spi.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the SPI + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_SPI_H +#define __STM32L1xx_SPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief SPI Init structure definition + */ + +typedef struct +{ + uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_data_direction */ + + uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_mode */ + + uint16_t SPI_DataSize; /*!< Specifies the SPI data size. + This parameter can be a value of @ref SPI_data_size */ + + uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint16_t SPI_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_Slave_Select_management */ + + uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ +}SPI_InitTypeDef; + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + + uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref SPI_I2S_Mode */ + + uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref SPI_I2S_Standard */ + + uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref SPI_I2S_Data_Format */ + + uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref SPI_I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref SPI_I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref SPI_I2S_Clock_Polarity */ +}I2S_InitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup SPI_Exported_Constants + * @{ + */ + +#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) +#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) + +/** @defgroup SPI_data_direction + * @{ + */ + +#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) +#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) +#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) +#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) +#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ + ((MODE) == SPI_Direction_2Lines_RxOnly) || \ + ((MODE) == SPI_Direction_1Line_Rx) || \ + ((MODE) == SPI_Direction_1Line_Tx)) +/** + * @} + */ + +/** @defgroup SPI_mode + * @{ + */ + +#define SPI_Mode_Master ((uint16_t)0x0104) +#define SPI_Mode_Slave ((uint16_t)0x0000) +#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ + ((MODE) == SPI_Mode_Slave)) +/** + * @} + */ + +/** @defgroup SPI_data_size + * @{ + */ + +#define SPI_DataSize_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) +#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ + ((DATASIZE) == SPI_DataSize_8b)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Polarity + * @{ + */ + +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) +#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ + ((CPOL) == SPI_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_Clock_Phase + * @{ + */ + +#define SPI_CPHA_1Edge ((uint16_t)0x0000) +#define SPI_CPHA_2Edge ((uint16_t)0x0001) +#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ + ((CPHA) == SPI_CPHA_2Edge)) +/** + * @} + */ + +/** @defgroup SPI_Slave_Select_management + * @{ + */ + +#define SPI_NSS_Soft ((uint16_t)0x0200) +#define SPI_NSS_Hard ((uint16_t)0x0000) +#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ + ((NSS) == SPI_NSS_Hard)) +/** + * @} + */ + +/** @defgroup SPI_BaudRate_Prescaler + * @{ + */ + +#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) +#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) +#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) +#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) +#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) +#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) +#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) +#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) +#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ + ((PRESCALER) == SPI_BaudRatePrescaler_256)) +/** + * @} + */ + +/** @defgroup SPI_MSB_LSB_transmission + * @{ + */ + +#define SPI_FirstBit_MSB ((uint16_t)0x0000) +#define SPI_FirstBit_LSB ((uint16_t)0x0080) +#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ + ((BIT) == SPI_FirstBit_LSB)) +/** + * @} + */ + +/** @defgroup SPI_I2S_Mode + * @{ + */ + +#define I2S_Mode_SlaveTx ((uint16_t)0x0000) +#define I2S_Mode_SlaveRx ((uint16_t)0x0100) +#define I2S_Mode_MasterTx ((uint16_t)0x0200) +#define I2S_Mode_MasterRx ((uint16_t)0x0300) +#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ + ((MODE) == I2S_Mode_SlaveRx) || \ + ((MODE) == I2S_Mode_MasterTx)|| \ + ((MODE) == I2S_Mode_MasterRx)) +/** + * @} + */ + + +/** @defgroup SPI_I2S_Standard + * @{ + */ + +#define I2S_Standard_Phillips ((uint16_t)0x0000) +#define I2S_Standard_MSB ((uint16_t)0x0010) +#define I2S_Standard_LSB ((uint16_t)0x0020) +#define I2S_Standard_PCMShort ((uint16_t)0x0030) +#define I2S_Standard_PCMLong ((uint16_t)0x00B0) +#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ + ((STANDARD) == I2S_Standard_MSB) || \ + ((STANDARD) == I2S_Standard_LSB) || \ + ((STANDARD) == I2S_Standard_PCMShort) || \ + ((STANDARD) == I2S_Standard_PCMLong)) +/** + * @} + */ + +/** @defgroup SPI_I2S_Data_Format + * @{ + */ + +#define I2S_DataFormat_16b ((uint16_t)0x0000) +#define I2S_DataFormat_16bextended ((uint16_t)0x0001) +#define I2S_DataFormat_24b ((uint16_t)0x0003) +#define I2S_DataFormat_32b ((uint16_t)0x0005) +#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ + ((FORMAT) == I2S_DataFormat_16bextended) || \ + ((FORMAT) == I2S_DataFormat_24b) || \ + ((FORMAT) == I2S_DataFormat_32b)) +/** + * @} + */ + +/** @defgroup SPI_I2S_MCLK_Output + * @{ + */ + +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) +#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ + ((OUTPUT) == I2S_MCLKOutput_Disable)) +/** + * @} + */ + +/** @defgroup SPI_I2S_Audio_Frequency + * @{ + */ + +#define I2S_AudioFreq_192k ((uint32_t)192000) +#define I2S_AudioFreq_96k ((uint32_t)96000) +#define I2S_AudioFreq_48k ((uint32_t)48000) +#define I2S_AudioFreq_44k ((uint32_t)44100) +#define I2S_AudioFreq_32k ((uint32_t)32000) +#define I2S_AudioFreq_22k ((uint32_t)22050) +#define I2S_AudioFreq_16k ((uint32_t)16000) +#define I2S_AudioFreq_11k ((uint32_t)11025) +#define I2S_AudioFreq_8k ((uint32_t)8000) +#define I2S_AudioFreq_Default ((uint32_t)2) + +#define IS_I2S_AUDIO_FREQ(FREQ) ((((FREQ) >= I2S_AudioFreq_8k) && \ + ((FREQ) <= I2S_AudioFreq_192k)) || \ + ((FREQ) == I2S_AudioFreq_Default)) +/** + * @} + */ + +/** @defgroup SPI_I2S_Clock_Polarity + * @{ + */ + +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) +#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ + ((CPOL) == I2S_CPOL_High)) +/** + * @} + */ + +/** @defgroup SPI_I2S_DMA_transfer_requests + * @{ + */ + +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) +#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) +/** + * @} + */ + +/** @defgroup SPI_NSS_internal_software_management + * @{ + */ + +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) +#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ + ((INTERNAL) == SPI_NSSInternalSoft_Reset)) +/** + * @} + */ + +/** @defgroup SPI_CRC_Transmit_Receive + * @{ + */ + +#define SPI_CRC_Tx ((uint8_t)0x00) +#define SPI_CRC_Rx ((uint8_t)0x01) +#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) +/** + * @} + */ + +/** @defgroup SPI_direction_transmit_receive + * @{ + */ + +#define SPI_Direction_Rx ((uint16_t)0xBFFF) +#define SPI_Direction_Tx ((uint16_t)0x4000) +#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ + ((DIRECTION) == SPI_Direction_Tx)) +/** + * @} + */ + +/** @defgroup SPI_I2S_interrupts_definition + * @{ + */ + +#define SPI_I2S_IT_TXE ((uint8_t)0x71) +#define SPI_I2S_IT_RXNE ((uint8_t)0x60) +#define SPI_I2S_IT_ERR ((uint8_t)0x50) +#define I2S_IT_UDR ((uint8_t)0x53) +#define SPI_I2S_IT_FRE ((uint8_t)0x58) + +#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == SPI_I2S_IT_RXNE) || \ + ((IT) == SPI_I2S_IT_ERR)) + +#define SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) + +#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) + +#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ + ((IT) == SPI_IT_CRCERR) || ((IT) == SPI_IT_MODF) || \ + ((IT) == SPI_I2S_IT_OVR) || ((IT) == I2S_IT_UDR) ||\ + ((IT) == SPI_I2S_IT_FRE)) +/** + * @} + */ + +/** @defgroup SPI_I2S_flags_definition + * @{ + */ + +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) +#define SPI_I2S_FLAG_FRE ((uint16_t)0x0100) + +#define IS_SPI_I2S_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) +#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ + ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ + ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ + ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)|| \ + ((FLAG) == SPI_I2S_FLAG_FRE)) +/** + * @} + */ + +/** @defgroup SPI_CRC_polynomial + * @{ + */ + +#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) +/** + * @} + */ + +/** @defgroup SPI_I2S_Legacy + * @{ + */ + +#define SPI_DMAReq_Tx SPI_I2S_DMAReq_Tx +#define SPI_DMAReq_Rx SPI_I2S_DMAReq_Rx +#define SPI_IT_TXE SPI_I2S_IT_TXE +#define SPI_IT_RXNE SPI_I2S_IT_RXNE +#define SPI_IT_ERR SPI_I2S_IT_ERR +#define SPI_IT_OVR SPI_I2S_IT_OVR +#define SPI_FLAG_RXNE SPI_I2S_FLAG_RXNE +#define SPI_FLAG_TXE SPI_I2S_FLAG_TXE +#define SPI_FLAG_OVR SPI_I2S_FLAG_OVR +#define SPI_FLAG_BSY SPI_I2S_FLAG_BSY +#define SPI_DeInit SPI_I2S_DeInit +#define SPI_ITConfig SPI_I2S_ITConfig +#define SPI_DMACmd SPI_I2S_DMACmd +#define SPI_SendData SPI_I2S_SendData +#define SPI_ReceiveData SPI_I2S_ReceiveData +#define SPI_GetFlagStatus SPI_I2S_GetFlagStatus +#define SPI_ClearFlag SPI_I2S_ClearFlag +#define SPI_GetITStatus SPI_I2S_GetITStatus +#define SPI_ClearITPendingBit SPI_I2S_ClearITPendingBit +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the SPI configuration to the default reset state *****/ +void SPI_I2S_DeInit(SPI_TypeDef* SPIx); + +/* Initialization and Configuration functions *********************************/ +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); + +/* Data transfers functions ***************************************************/ +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); + +/* Hardware CRC Calculation functions *****************************************/ +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_TransmitCRC(SPI_TypeDef* SPIx); +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); + +/* DMA transfers management functions *****************************************/ +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_SPI_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_syscfg.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_syscfg.h new file mode 100644 index 0000000..b8d5296 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_syscfg.h @@ -0,0 +1,476 @@ +/** + ****************************************************************************** + * @file stm32l1xx_syscfg.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the SYSCFG + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_SYSCFG_H +#define __STM32L1xx_SYSCFG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*!< Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SYSCFG + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup SYSCFG_Exported_Constants + * @{ + */ + +/** @defgroup EXTI_Port_Sources + * @{ + */ +#define EXTI_PortSourceGPIOA ((uint8_t)0x00) +#define EXTI_PortSourceGPIOB ((uint8_t)0x01) +#define EXTI_PortSourceGPIOC ((uint8_t)0x02) +#define EXTI_PortSourceGPIOD ((uint8_t)0x03) +#define EXTI_PortSourceGPIOE ((uint8_t)0x04) +#define EXTI_PortSourceGPIOH ((uint8_t)0x05) +#define EXTI_PortSourceGPIOF ((uint8_t)0x06) +#define EXTI_PortSourceGPIOG ((uint8_t)0x07) + +#define IS_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == EXTI_PortSourceGPIOA) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOB) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOC) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOD) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOE) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOF) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOG) || \ + ((PORTSOURCE) == EXTI_PortSourceGPIOH)) +/** + * @} + */ + +/** @defgroup EXTI_Pin_sources + * @{ + */ +#define EXTI_PinSource0 ((uint8_t)0x00) +#define EXTI_PinSource1 ((uint8_t)0x01) +#define EXTI_PinSource2 ((uint8_t)0x02) +#define EXTI_PinSource3 ((uint8_t)0x03) +#define EXTI_PinSource4 ((uint8_t)0x04) +#define EXTI_PinSource5 ((uint8_t)0x05) +#define EXTI_PinSource6 ((uint8_t)0x06) +#define EXTI_PinSource7 ((uint8_t)0x07) +#define EXTI_PinSource8 ((uint8_t)0x08) +#define EXTI_PinSource9 ((uint8_t)0x09) +#define EXTI_PinSource10 ((uint8_t)0x0A) +#define EXTI_PinSource11 ((uint8_t)0x0B) +#define EXTI_PinSource12 ((uint8_t)0x0C) +#define EXTI_PinSource13 ((uint8_t)0x0D) +#define EXTI_PinSource14 ((uint8_t)0x0E) +#define EXTI_PinSource15 ((uint8_t)0x0F) +#define IS_EXTI_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == EXTI_PinSource0) || \ + ((PINSOURCE) == EXTI_PinSource1) || \ + ((PINSOURCE) == EXTI_PinSource2) || \ + ((PINSOURCE) == EXTI_PinSource3) || \ + ((PINSOURCE) == EXTI_PinSource4) || \ + ((PINSOURCE) == EXTI_PinSource5) || \ + ((PINSOURCE) == EXTI_PinSource6) || \ + ((PINSOURCE) == EXTI_PinSource7) || \ + ((PINSOURCE) == EXTI_PinSource8) || \ + ((PINSOURCE) == EXTI_PinSource9) || \ + ((PINSOURCE) == EXTI_PinSource10) || \ + ((PINSOURCE) == EXTI_PinSource11) || \ + ((PINSOURCE) == EXTI_PinSource12) || \ + ((PINSOURCE) == EXTI_PinSource13) || \ + ((PINSOURCE) == EXTI_PinSource14) || \ + ((PINSOURCE) == EXTI_PinSource15)) +/** + * @} + */ + +/** @defgroup SYSCFG_Memory_Remap_Config + * @{ + */ +#define SYSCFG_MemoryRemap_Flash ((uint8_t)0x00) +#define SYSCFG_MemoryRemap_SystemFlash ((uint8_t)0x01) +#define SYSCFG_MemoryRemap_FSMC ((uint8_t)0x02) +#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03) + +#define IS_SYSCFG_MEMORY_REMAP_CONFING(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \ + ((REMAP) == SYSCFG_MemoryRemap_SystemFlash) || \ + ((REMAP) == SYSCFG_MemoryRemap_FSMC) || \ + ((REMAP) == SYSCFG_MemoryRemap_SRAM)) + +/** + * @} + */ + +/** @defgroup RI_Resistor + * @{ + */ + +#define RI_Resistor_10KPU COMP_CSR_10KPU +#define RI_Resistor_400KPU COMP_CSR_400KPU +#define RI_Resistor_10KPD COMP_CSR_10KPD +#define RI_Resistor_400KPD COMP_CSR_400KPD + +#define IS_RI_RESISTOR(RESISTOR) (((RESISTOR) == COMP_CSR_10KPU) || \ + ((RESISTOR) == COMP_CSR_400KPU) || \ + ((RESISTOR) == COMP_CSR_10KPD) || \ + ((RESISTOR) == COMP_CSR_400KPD)) + +/** + * @} + */ + +/** @defgroup RI_Channel + * @{ + */ + +#define RI_Channel_3 ((uint32_t)0x04000000) +#define RI_Channel_8 ((uint32_t)0x08000000) +#define RI_Channel_13 ((uint32_t)0x10000000) + +#define IS_RI_CHANNEL(CHANNEL) (((CHANNEL) == RI_Channel_3) || \ + ((CHANNEL) == RI_Channel_8) || \ + ((CHANNEL) == RI_Channel_13)) + +/** + * @} + */ + +/** @defgroup RI_ChannelSpeed + * @{ + */ + +#define RI_ChannelSpeed_Fast ((uint32_t)0x00000000) +#define RI_ChannelSpeed_Slow ((uint32_t)0x00000001) + +#define IS_RI_CHANNELSPEED(SPEED) (((SPEED) == RI_ChannelSpeed_Fast) || \ + ((SPEED) == RI_ChannelSpeed_Slow)) + +/** + * @} + */ + +/** @defgroup RI_InputCapture + * @{ + */ + +#define RI_InputCapture_IC1 RI_ICR_IC1 /*!< Input Capture 1 */ +#define RI_InputCapture_IC2 RI_ICR_IC2 /*!< Input Capture 2 */ +#define RI_InputCapture_IC3 RI_ICR_IC3 /*!< Input Capture 3 */ +#define RI_InputCapture_IC4 RI_ICR_IC4 /*!< Input Capture 4 */ + +#define IS_RI_INPUTCAPTURE(INPUTCAPTURE) ((((INPUTCAPTURE) & (uint32_t)0xFFC2FFFF) == 0x00) && ((INPUTCAPTURE) != (uint32_t)0x00)) +/** + * @} + */ + +/** @defgroup TIM_Select + * @{ + */ + +#define TIM_Select_None ((uint32_t)0x00000000) /*!< None selected */ +#define TIM_Select_TIM2 ((uint32_t)0x00010000) /*!< Timer 2 selected */ +#define TIM_Select_TIM3 ((uint32_t)0x00020000) /*!< Timer 3 selected */ +#define TIM_Select_TIM4 ((uint32_t)0x00030000) /*!< Timer 4 selected */ + +#define IS_RI_TIM(TIM) (((TIM) == TIM_Select_None) || \ + ((TIM) == TIM_Select_TIM2) || \ + ((TIM) == TIM_Select_TIM3) || \ + ((TIM) == TIM_Select_TIM4)) + +/** + * @} + */ + +/** @defgroup RI_InputCaptureRouting + * @{ + */ + /* TIMx_IC1 TIMx_IC2 TIMx_IC3 TIMx_IC4 */ +#define RI_InputCaptureRouting_0 ((uint32_t)0x00000000) /* PA0 PA1 PA2 PA3 */ +#define RI_InputCaptureRouting_1 ((uint32_t)0x00000001) /* PA4 PA5 PA6 PA7 */ +#define RI_InputCaptureRouting_2 ((uint32_t)0x00000002) /* PA8 PA9 PA10 PA11 */ +#define RI_InputCaptureRouting_3 ((uint32_t)0x00000003) /* PA12 PA13 PA14 PA15 */ +#define RI_InputCaptureRouting_4 ((uint32_t)0x00000004) /* PC0 PC1 PC2 PC3 */ +#define RI_InputCaptureRouting_5 ((uint32_t)0x00000005) /* PC4 PC5 PC6 PC7 */ +#define RI_InputCaptureRouting_6 ((uint32_t)0x00000006) /* PC8 PC9 PC10 PC11 */ +#define RI_InputCaptureRouting_7 ((uint32_t)0x00000007) /* PC12 PC13 PC14 PC15 */ +#define RI_InputCaptureRouting_8 ((uint32_t)0x00000008) /* PD0 PD1 PD2 PD3 */ +#define RI_InputCaptureRouting_9 ((uint32_t)0x00000009) /* PD4 PD5 PD6 PD7 */ +#define RI_InputCaptureRouting_10 ((uint32_t)0x0000000A) /* PD8 PD9 PD10 PD11 */ +#define RI_InputCaptureRouting_11 ((uint32_t)0x0000000B) /* PD12 PD13 PD14 PD15 */ +#define RI_InputCaptureRouting_12 ((uint32_t)0x0000000C) /* PE0 PE1 PE2 PE3 */ +#define RI_InputCaptureRouting_13 ((uint32_t)0x0000000D) /* PE4 PE5 PE6 PE7 */ +#define RI_InputCaptureRouting_14 ((uint32_t)0x0000000E) /* PE8 PE9 PE10 PE11 */ +#define RI_InputCaptureRouting_15 ((uint32_t)0x0000000F) /* PE12 PE13 PE14 PE15 */ + +#define IS_RI_INPUTCAPTURE_ROUTING(ROUTING) (((ROUTING) == RI_InputCaptureRouting_0) || \ + ((ROUTING) == RI_InputCaptureRouting_1) || \ + ((ROUTING) == RI_InputCaptureRouting_2) || \ + ((ROUTING) == RI_InputCaptureRouting_3) || \ + ((ROUTING) == RI_InputCaptureRouting_4) || \ + ((ROUTING) == RI_InputCaptureRouting_5) || \ + ((ROUTING) == RI_InputCaptureRouting_6) || \ + ((ROUTING) == RI_InputCaptureRouting_7) || \ + ((ROUTING) == RI_InputCaptureRouting_8) || \ + ((ROUTING) == RI_InputCaptureRouting_9) || \ + ((ROUTING) == RI_InputCaptureRouting_10) || \ + ((ROUTING) == RI_InputCaptureRouting_11) || \ + ((ROUTING) == RI_InputCaptureRouting_12) || \ + ((ROUTING) == RI_InputCaptureRouting_13) || \ + ((ROUTING) == RI_InputCaptureRouting_14) || \ + ((ROUTING) == RI_InputCaptureRouting_15)) + +/** + * @} + */ + +/** @defgroup RI_IOSwitch + * @{ + */ + +/* ASCR1 I/O switch: bit 31 is set to '1' to indicate that the mask is in ASCR1 register */ +#define RI_IOSwitch_CH0 ((uint32_t)0x80000001) +#define RI_IOSwitch_CH1 ((uint32_t)0x80000002) +#define RI_IOSwitch_CH2 ((uint32_t)0x80000004) +#define RI_IOSwitch_CH3 ((uint32_t)0x80000008) +#define RI_IOSwitch_CH4 ((uint32_t)0x80000010) +#define RI_IOSwitch_CH5 ((uint32_t)0x80000020) +#define RI_IOSwitch_CH6 ((uint32_t)0x80000040) +#define RI_IOSwitch_CH7 ((uint32_t)0x80000080) +#define RI_IOSwitch_CH8 ((uint32_t)0x80000100) +#define RI_IOSwitch_CH9 ((uint32_t)0x80000200) +#define RI_IOSwitch_CH10 ((uint32_t)0x80000400) +#define RI_IOSwitch_CH11 ((uint32_t)0x80000800) +#define RI_IOSwitch_CH12 ((uint32_t)0x80001000) +#define RI_IOSwitch_CH13 ((uint32_t)0x80002000) +#define RI_IOSwitch_CH14 ((uint32_t)0x80004000) +#define RI_IOSwitch_CH15 ((uint32_t)0x80008000) +#define RI_IOSwitch_CH31 ((uint32_t)0x80010000) +#define RI_IOSwitch_CH18 ((uint32_t)0x80040000) +#define RI_IOSwitch_CH19 ((uint32_t)0x80080000) +#define RI_IOSwitch_CH20 ((uint32_t)0x80100000) +#define RI_IOSwitch_CH21 ((uint32_t)0x80200000) +#define RI_IOSwitch_CH22 ((uint32_t)0x80400000) +#define RI_IOSwitch_CH23 ((uint32_t)0x80800000) +#define RI_IOSwitch_CH24 ((uint32_t)0x81000000) +#define RI_IOSwitch_CH25 ((uint32_t)0x82000000) +#define RI_IOSwitch_VCOMP ((uint32_t)0x84000000) /* VCOMP is an internal switch used to connect + selected channel to COMP1 non inverting input */ +#define RI_IOSwitch_CH27 ((uint32_t)0x88000000) +#define RI_IOSwitch_CH28 ((uint32_t)0x90000000) +#define RI_IOSwitch_CH29 ((uint32_t)0xA0000000) +#define RI_IOSwitch_CH30 ((uint32_t)0xC0000000) + +/* ASCR2 IO switch: bit 31 is set to '0' to indicate that the mask is in ASCR2 register */ +#define RI_IOSwitch_GR10_1 ((uint32_t)0x00000001) +#define RI_IOSwitch_GR10_2 ((uint32_t)0x00000002) +#define RI_IOSwitch_GR10_3 ((uint32_t)0x00000004) +#define RI_IOSwitch_GR10_4 ((uint32_t)0x00000008) +#define RI_IOSwitch_GR6_1 ((uint32_t)0x00000010) +#define RI_IOSwitch_GR6_2 ((uint32_t)0x00000020) +#define RI_IOSwitch_GR5_1 ((uint32_t)0x00000040) +#define RI_IOSwitch_GR5_2 ((uint32_t)0x00000080) +#define RI_IOSwitch_GR5_3 ((uint32_t)0x00000100) +#define RI_IOSwitch_GR4_1 ((uint32_t)0x00000200) +#define RI_IOSwitch_GR4_2 ((uint32_t)0x00000400) +#define RI_IOSwitch_GR4_3 ((uint32_t)0x00000800) +#define RI_IOSwitch_GR4_4 ((uint32_t)0x00008000) +#define RI_IOSwitch_CH0b ((uint32_t)0x00010000) +#define RI_IOSwitch_CH1b ((uint32_t)0x00020000) +#define RI_IOSwitch_CH2b ((uint32_t)0x00040000) +#define RI_IOSwitch_CH3b ((uint32_t)0x00080000) +#define RI_IOSwitch_CH6b ((uint32_t)0x00100000) +#define RI_IOSwitch_CH7b ((uint32_t)0x00200000) +#define RI_IOSwitch_CH8b ((uint32_t)0x00400000) +#define RI_IOSwitch_CH9b ((uint32_t)0x00800000) +#define RI_IOSwitch_CH10b ((uint32_t)0x01000000) +#define RI_IOSwitch_CH11b ((uint32_t)0x02000000) +#define RI_IOSwitch_CH12b ((uint32_t)0x04000000) +#define RI_IOSwitch_GR6_3 ((uint32_t)0x08000000) +#define RI_IOSwitch_GR6_4 ((uint32_t)0x10000000) +#define RI_IOSwitch_GR5_4 ((uint32_t)0x20000000) + + +#define IS_RI_IOSWITCH(IOSWITCH) (((IOSWITCH) == RI_IOSwitch_CH0) || \ + ((IOSWITCH) == RI_IOSwitch_CH1) || \ + ((IOSWITCH) == RI_IOSwitch_CH2) || \ + ((IOSWITCH) == RI_IOSwitch_CH3) || \ + ((IOSWITCH) == RI_IOSwitch_CH4) || \ + ((IOSWITCH) == RI_IOSwitch_CH5) || \ + ((IOSWITCH) == RI_IOSwitch_CH6) || \ + ((IOSWITCH) == RI_IOSwitch_CH7) || \ + ((IOSWITCH) == RI_IOSwitch_CH8) || \ + ((IOSWITCH) == RI_IOSwitch_CH9) || \ + ((IOSWITCH) == RI_IOSwitch_CH10) || \ + ((IOSWITCH) == RI_IOSwitch_CH11) || \ + ((IOSWITCH) == RI_IOSwitch_CH12) || \ + ((IOSWITCH) == RI_IOSwitch_CH13) || \ + ((IOSWITCH) == RI_IOSwitch_CH14) || \ + ((IOSWITCH) == RI_IOSwitch_CH15) || \ + ((IOSWITCH) == RI_IOSwitch_CH18) || \ + ((IOSWITCH) == RI_IOSwitch_CH19) || \ + ((IOSWITCH) == RI_IOSwitch_CH20) || \ + ((IOSWITCH) == RI_IOSwitch_CH21) || \ + ((IOSWITCH) == RI_IOSwitch_CH22) || \ + ((IOSWITCH) == RI_IOSwitch_CH23) || \ + ((IOSWITCH) == RI_IOSwitch_CH24) || \ + ((IOSWITCH) == RI_IOSwitch_CH25) || \ + ((IOSWITCH) == RI_IOSwitch_VCOMP) || \ + ((IOSWITCH) == RI_IOSwitch_CH27) || \ + ((IOSWITCH) == RI_IOSwitch_CH28) || \ + ((IOSWITCH) == RI_IOSwitch_CH29) || \ + ((IOSWITCH) == RI_IOSwitch_CH30) || \ + ((IOSWITCH) == RI_IOSwitch_CH31) || \ + ((IOSWITCH) == RI_IOSwitch_GR10_1) || \ + ((IOSWITCH) == RI_IOSwitch_GR10_2) || \ + ((IOSWITCH) == RI_IOSwitch_GR10_3) || \ + ((IOSWITCH) == RI_IOSwitch_GR10_4) || \ + ((IOSWITCH) == RI_IOSwitch_GR6_1) || \ + ((IOSWITCH) == RI_IOSwitch_GR6_2) || \ + ((IOSWITCH) == RI_IOSwitch_GR6_3) || \ + ((IOSWITCH) == RI_IOSwitch_GR6_4) || \ + ((IOSWITCH) == RI_IOSwitch_GR5_1) || \ + ((IOSWITCH) == RI_IOSwitch_GR5_2) || \ + ((IOSWITCH) == RI_IOSwitch_GR5_3) || \ + ((IOSWITCH) == RI_IOSwitch_GR5_4) || \ + ((IOSWITCH) == RI_IOSwitch_GR4_1) || \ + ((IOSWITCH) == RI_IOSwitch_GR4_2) || \ + ((IOSWITCH) == RI_IOSwitch_GR4_3) || \ + ((IOSWITCH) == RI_IOSwitch_GR4_4) || \ + ((IOSWITCH) == RI_IOSwitch_CH0b) || \ + ((IOSWITCH) == RI_IOSwitch_CH1b) || \ + ((IOSWITCH) == RI_IOSwitch_CH2b) || \ + ((IOSWITCH) == RI_IOSwitch_CH3b) || \ + ((IOSWITCH) == RI_IOSwitch_CH6b) || \ + ((IOSWITCH) == RI_IOSwitch_CH7b) || \ + ((IOSWITCH) == RI_IOSwitch_CH8b) || \ + ((IOSWITCH) == RI_IOSwitch_CH9b) || \ + ((IOSWITCH) == RI_IOSwitch_CH10b) || \ + ((IOSWITCH) == RI_IOSwitch_CH11b) || \ + ((IOSWITCH) == RI_IOSwitch_CH12b)) + +/** + * @} + */ + +/** @defgroup RI_Port + * @{ + */ + +#define RI_PortA ((uint8_t)0x01) /*!< GPIOA selected */ +#define RI_PortB ((uint8_t)0x02) /*!< GPIOB selected */ +#define RI_PortC ((uint8_t)0x03) /*!< GPIOC selected */ +#define RI_PortD ((uint8_t)0x04) /*!< GPIOD selected */ +#define RI_PortE ((uint8_t)0x05) /*!< GPIOE selected */ +#define RI_PortF ((uint8_t)0x06) /*!< GPIOF selected */ +#define RI_PortG ((uint8_t)0x07) /*!< GPIOG selected */ + +#define IS_RI_PORT(PORT) (((PORT) == RI_PortA) || \ + ((PORT) == RI_PortB) || \ + ((PORT) == RI_PortC) || \ + ((PORT) == RI_PortD) || \ + ((PORT) == RI_PortE) || \ + ((PORT) == RI_PortF) || \ + ((PORT) == RI_PortG)) +/** + * @} + */ + +/** @defgroup RI_Pin define + * @{ + */ +#define RI_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ +#define RI_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ +#define RI_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ +#define RI_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ +#define RI_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ +#define RI_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ +#define RI_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ +#define RI_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ +#define RI_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ +#define RI_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ +#define RI_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ +#define RI_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ +#define RI_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ +#define RI_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ +#define RI_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ +#define RI_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ +#define RI_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ + +#define IS_RI_PIN(PIN) ((PIN) != (uint16_t)0x00) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the SYSCFG and RI configuration to the default reset state **/ +void SYSCFG_DeInit(void); +void SYSCFG_RIDeInit(void); + +/* SYSCFG Initialization and Configuration functions **************************/ +void SYSCFG_MemoryRemapConfig(uint8_t SYSCFG_MemoryRemap); +uint32_t SYSCFG_GetBootMode(void); +void SYSCFG_USBPuCmd(FunctionalState NewState); +void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex); + +/* RI Initialization and Configuration functions ******************************/ +void SYSCFG_RITIMSelect(uint32_t TIM_Select); +void SYSCFG_RITIMInputCaptureConfig(uint32_t RI_InputCapture, uint32_t RI_InputCaptureRouting); +void SYSCFG_RIResistorConfig(uint32_t RI_Resistor, FunctionalState NewState); +void SYSCFG_RIChannelSpeedConfig(uint32_t RI_Channel, uint32_t RI_ChannelSpeed); +void SYSCFG_RISwitchControlModeCmd(FunctionalState NewState); +void SYSCFG_RIIOSwitchConfig(uint32_t RI_IOSwitch, FunctionalState NewState); +void SYSCFG_RIHysteresisConfig(uint8_t RI_Port, uint16_t RI_Pin, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_SYSCFG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_tim.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_tim.h new file mode 100644 index 0000000..d644009 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_tim.h @@ -0,0 +1,977 @@ +/** + ****************************************************************************** + * @file stm32l1xx_tim.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the TIM firmware + * library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_TIM_H +#define __STM32L1xx_TIM_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief TIM Time Base Init structure definition + * @note This structure is used with all TIMx except for TIM6 and TIM7. + */ + +typedef struct +{ + uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint16_t TIM_ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_Clock_Division_CKD */ + +} TIM_TimeBaseInitTypeDef; + +/** + * @brief TIM Output Compare Init structure definition + */ + +typedef struct +{ + uint16_t TIM_OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_state */ + + uint32_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + +} TIM_OCInitTypeDef; + +/** + * @brief TIM Input Capture Init structure definition + */ + +typedef struct +{ + + uint16_t TIM_Channel; /*!< Specifies the TIM channel. + This parameter can be a value of @ref TIM_Channel */ + + uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint16_t TIM_ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + + +/** @defgroup TIM_Exported_constants + * @{ + */ + +#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10) || \ + ((PERIPH) == TIM11)) + +/* LIST1: TIM2, TIM3, TIM4, TIM5, TIM9, TIM10 and TIM11 */ +#define IS_TIM_LIST1_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10) || \ + ((PERIPH) == TIM11)) + +/* LIST3: TIM2, TIM3, TIM4 and TIM5 */ +#define IS_TIM_LIST3_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5)) + +/* LIST2: TIM2, TIM3, TIM4, TIM5 and TIM9 */ +#define IS_TIM_LIST2_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) || \ + ((PERIPH) == TIM9)) + +/* LIST5: TIM2, TIM3, TIM4, TIM5, TIM6, TIM7 and TIM9 */ +#define IS_TIM_LIST5_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) ||\ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7) ||\ + ((PERIPH) == TIM9)) + +/* LIST4: TIM2, TIM3, TIM4, TIM5, TIM6 and TIM7 */ +#define IS_TIM_LIST4_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM4) || \ + ((PERIPH) == TIM5) ||\ + ((PERIPH) == TIM6) || \ + ((PERIPH) == TIM7)) + +/* LIST6: TIM2, TIM3, TIM9, TIM10 and TIM11 */ +#define IS_TIM_LIST6_PERIPH(PERIPH) (((PERIPH) == TIM2) || \ + ((PERIPH) == TIM3) || \ + ((PERIPH) == TIM9) || \ + ((PERIPH) == TIM10) || \ + ((PERIPH) == TIM11)) + + + +/** @defgroup TIM_Output_Compare_and_PWM_modes + * @{ + */ + +#define TIM_OCMode_Timing ((uint16_t)0x0000) +#define TIM_OCMode_Active ((uint16_t)0x0010) +#define TIM_OCMode_Inactive ((uint16_t)0x0020) +#define TIM_OCMode_Toggle ((uint16_t)0x0030) +#define TIM_OCMode_PWM1 ((uint16_t)0x0060) +#define TIM_OCMode_PWM2 ((uint16_t)0x0070) +#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2)) +#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ + ((MODE) == TIM_OCMode_Active) || \ + ((MODE) == TIM_OCMode_Inactive) || \ + ((MODE) == TIM_OCMode_Toggle)|| \ + ((MODE) == TIM_OCMode_PWM1) || \ + ((MODE) == TIM_OCMode_PWM2) || \ + ((MODE) == TIM_ForcedAction_Active) || \ + ((MODE) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode + * @{ + */ + +#define TIM_OPMode_Single ((uint16_t)0x0008) +#define TIM_OPMode_Repetitive ((uint16_t)0x0000) +#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ + ((MODE) == TIM_OPMode_Repetitive)) +/** + * @} + */ + +/** @defgroup TIM_Channel + * @{ + */ + +#define TIM_Channel_1 ((uint16_t)0x0000) +#define TIM_Channel_2 ((uint16_t)0x0004) +#define TIM_Channel_3 ((uint16_t)0x0008) +#define TIM_Channel_4 ((uint16_t)0x000C) + +#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2) || \ + ((CHANNEL) == TIM_Channel_3) || \ + ((CHANNEL) == TIM_Channel_4)) + +#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ + ((CHANNEL) == TIM_Channel_2)) + +/** + * @} + */ + +/** @defgroup TIM_Clock_Division_CKD + * @{ + */ + +#define TIM_CKD_DIV1 ((uint16_t)0x0000) +#define TIM_CKD_DIV2 ((uint16_t)0x0100) +#define TIM_CKD_DIV4 ((uint16_t)0x0200) +#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ + ((DIV) == TIM_CKD_DIV2) || \ + ((DIV) == TIM_CKD_DIV4)) +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode + * @{ + */ + +#define TIM_CounterMode_Up ((uint16_t)0x0000) +#define TIM_CounterMode_Down ((uint16_t)0x0010) +#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) +#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) +#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) +#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ + ((MODE) == TIM_CounterMode_Down) || \ + ((MODE) == TIM_CounterMode_CenterAligned1) || \ + ((MODE) == TIM_CounterMode_CenterAligned2) || \ + ((MODE) == TIM_CounterMode_CenterAligned3)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity + * @{ + */ + +#define TIM_OCPolarity_High ((uint16_t)0x0000) +#define TIM_OCPolarity_Low ((uint16_t)0x0002) +#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ + ((POLARITY) == TIM_OCPolarity_Low)) +/** + * @} + */ + + +/** @defgroup TIM_Output_Compare_state + * @{ + */ + +#define TIM_OutputState_Disable ((uint16_t)0x0000) +#define TIM_OutputState_Enable ((uint16_t)0x0001) +#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ + ((STATE) == TIM_OutputState_Enable)) +/** + * @} + */ + + +/** @defgroup TIM_Capture_Compare_state + * @{ + */ + +#define TIM_CCx_Enable ((uint16_t)0x0001) +#define TIM_CCx_Disable ((uint16_t)0x0000) +#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ + ((CCX) == TIM_CCx_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity + * @{ + */ + +#define TIM_ICPolarity_Rising ((uint16_t)0x0000) +#define TIM_ICPolarity_Falling ((uint16_t)0x0002) +#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) +#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ + ((POLARITY) == TIM_ICPolarity_Falling)|| \ + ((POLARITY) == TIM_ICPolarity_BothEdge)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection + * @{ + */ + +#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ +#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ + ((SELECTION) == TIM_ICSelection_IndirectTI) || \ + ((SELECTION) == TIM_ICSelection_TRC)) +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler + * @{ + */ + +#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ +#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ +#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ +#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ +#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ + ((PRESCALER) == TIM_ICPSC_DIV2) || \ + ((PRESCALER) == TIM_ICPSC_DIV4) || \ + ((PRESCALER) == TIM_ICPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_interrupt_sources + * @{ + */ + +#define TIM_IT_Update ((uint16_t)0x0001) +#define TIM_IT_CC1 ((uint16_t)0x0002) +#define TIM_IT_CC2 ((uint16_t)0x0004) +#define TIM_IT_CC3 ((uint16_t)0x0008) +#define TIM_IT_CC4 ((uint16_t)0x0010) +#define TIM_IT_Trigger ((uint16_t)0x0040) +#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFFA0) == 0x0000) && ((IT) != 0x0000)) + +#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ + ((IT) == TIM_IT_CC1) || \ + ((IT) == TIM_IT_CC2) || \ + ((IT) == TIM_IT_CC3) || \ + ((IT) == TIM_IT_CC4) || \ + ((IT) == TIM_IT_Trigger)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address + * @{ + */ + +#define TIM_DMABase_CR1 ((uint16_t)0x0000) +#define TIM_DMABase_CR2 ((uint16_t)0x0001) +#define TIM_DMABase_SMCR ((uint16_t)0x0002) +#define TIM_DMABase_DIER ((uint16_t)0x0003) +#define TIM_DMABase_SR ((uint16_t)0x0004) +#define TIM_DMABase_EGR ((uint16_t)0x0005) +#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) +#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) +#define TIM_DMABase_CCER ((uint16_t)0x0008) +#define TIM_DMABase_CNT ((uint16_t)0x0009) +#define TIM_DMABase_PSC ((uint16_t)0x000A) +#define TIM_DMABase_ARR ((uint16_t)0x000B) +#define TIM_DMABase_CCR1 ((uint16_t)0x000D) +#define TIM_DMABase_CCR2 ((uint16_t)0x000E) +#define TIM_DMABase_CCR3 ((uint16_t)0x000F) +#define TIM_DMABase_CCR4 ((uint16_t)0x0010) +#define TIM_DMABase_DCR ((uint16_t)0x0012) +#define TIM_DMABase_OR ((uint16_t)0x0013) +#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ + ((BASE) == TIM_DMABase_CR2) || \ + ((BASE) == TIM_DMABase_SMCR) || \ + ((BASE) == TIM_DMABase_DIER) || \ + ((BASE) == TIM_DMABase_SR) || \ + ((BASE) == TIM_DMABase_EGR) || \ + ((BASE) == TIM_DMABase_CCMR1) || \ + ((BASE) == TIM_DMABase_CCMR2) || \ + ((BASE) == TIM_DMABase_CCER) || \ + ((BASE) == TIM_DMABase_CNT) || \ + ((BASE) == TIM_DMABase_PSC) || \ + ((BASE) == TIM_DMABase_ARR) || \ + ((BASE) == TIM_DMABase_CCR1) || \ + ((BASE) == TIM_DMABase_CCR2) || \ + ((BASE) == TIM_DMABase_CCR3) || \ + ((BASE) == TIM_DMABase_CCR4) || \ + ((BASE) == TIM_DMABase_DCR) || \ + ((BASE) == TIM_DMABase_OR)) +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length + * @{ + */ + +#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) +#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Transfer) || \ + ((LENGTH) == TIM_DMABurstLength_2Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_3Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_4Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_5Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_6Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_7Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_8Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_9Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_10Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_11Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_12Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_13Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_14Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_15Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_16Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_17Transfers) || \ + ((LENGTH) == TIM_DMABurstLength_18Transfers)) +/** + * @} + */ + +/** @defgroup TIM_DMA_sources + * @{ + */ + +#define TIM_DMA_Update ((uint16_t)0x0100) +#define TIM_DMA_CC1 ((uint16_t)0x0200) +#define TIM_DMA_CC2 ((uint16_t)0x0400) +#define TIM_DMA_CC3 ((uint16_t)0x0800) +#define TIM_DMA_CC4 ((uint16_t)0x1000) +#define TIM_DMA_Trigger ((uint16_t)0x4000) +#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xA0FF) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Prescaler + * @{ + */ + +#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) +#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) +#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) +#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) +#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ + ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) +/** + * @} + */ + +/** @defgroup TIM_Internal_Trigger_Selection + * @{ + */ + +#define TIM_TS_ITR0 ((uint16_t)0x0000) +#define TIM_TS_ITR1 ((uint16_t)0x0010) +#define TIM_TS_ITR2 ((uint16_t)0x0020) +#define TIM_TS_ITR3 ((uint16_t)0x0030) +#define TIM_TS_TI1F_ED ((uint16_t)0x0040) +#define TIM_TS_TI1FP1 ((uint16_t)0x0050) +#define TIM_TS_TI2FP2 ((uint16_t)0x0060) +#define TIM_TS_ETRF ((uint16_t)0x0070) +#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3) || \ + ((SELECTION) == TIM_TS_TI1F_ED) || \ + ((SELECTION) == TIM_TS_TI1FP1) || \ + ((SELECTION) == TIM_TS_TI2FP2) || \ + ((SELECTION) == TIM_TS_ETRF)) +#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ + ((SELECTION) == TIM_TS_ITR1) || \ + ((SELECTION) == TIM_TS_ITR2) || \ + ((SELECTION) == TIM_TS_ITR3)) +/** + * @} + */ + +/** @defgroup TIM_TIx_External_Clock_Source + * @{ + */ + +#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) +#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) +#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) + +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Polarity + * @{ + */ +#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) +#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) +#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ + ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) +/** + * @} + */ + +/** @defgroup TIM_Prescaler_Reload_Mode + * @{ + */ + +#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) +#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) +#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ + ((RELOAD) == TIM_PSCReloadMode_Immediate)) +/** + * @} + */ + +/** @defgroup TIM_Forced_Action + * @{ + */ + +#define TIM_ForcedAction_Active ((uint16_t)0x0050) +#define TIM_ForcedAction_InActive ((uint16_t)0x0040) +#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ + ((ACTION) == TIM_ForcedAction_InActive)) +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode + * @{ + */ + +#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) +#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) +#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) +#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ + ((MODE) == TIM_EncoderMode_TI2) || \ + ((MODE) == TIM_EncoderMode_TI12)) +/** + * @} + */ + + +/** @defgroup TIM_Event_Source + * @{ + */ + +#define TIM_EventSource_Update ((uint16_t)0x0001) +#define TIM_EventSource_CC1 ((uint16_t)0x0002) +#define TIM_EventSource_CC2 ((uint16_t)0x0004) +#define TIM_EventSource_CC3 ((uint16_t)0x0008) +#define TIM_EventSource_CC4 ((uint16_t)0x0010) +#define TIM_EventSource_Trigger ((uint16_t)0x0040) +#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFFA0) == 0x0000) && ((SOURCE) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_Update_Source + * @{ + */ + +#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. */ +#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ +#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ + ((SOURCE) == TIM_UpdateSource_Regular)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Preload_State + * @{ + */ + +#define TIM_OCPreload_Enable ((uint16_t)0x0008) +#define TIM_OCPreload_Disable ((uint16_t)0x0000) +#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ + ((STATE) == TIM_OCPreload_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Fast_State + * @{ + */ + +#define TIM_OCFast_Enable ((uint16_t)0x0004) +#define TIM_OCFast_Disable ((uint16_t)0x0000) +#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ + ((STATE) == TIM_OCFast_Disable)) + +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Clear_State + * @{ + */ + +#define TIM_OCClear_Enable ((uint16_t)0x0080) +#define TIM_OCClear_Disable ((uint16_t)0x0000) +#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ + ((STATE) == TIM_OCClear_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Trigger_Output_Source + * @{ + */ + +#define TIM_TRGOSource_Reset ((uint16_t)0x0000) +#define TIM_TRGOSource_Enable ((uint16_t)0x0010) +#define TIM_TRGOSource_Update ((uint16_t)0x0020) +#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) +#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) +#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) +#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) +#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) +#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ + ((SOURCE) == TIM_TRGOSource_Enable) || \ + ((SOURCE) == TIM_TRGOSource_Update) || \ + ((SOURCE) == TIM_TRGOSource_OC1) || \ + ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ + ((SOURCE) == TIM_TRGOSource_OC4Ref)) +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode + * @{ + */ + +#define TIM_SlaveMode_Reset ((uint16_t)0x0004) +#define TIM_SlaveMode_Gated ((uint16_t)0x0005) +#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) +#define TIM_SlaveMode_External1 ((uint16_t)0x0007) +#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ + ((MODE) == TIM_SlaveMode_Gated) || \ + ((MODE) == TIM_SlaveMode_Trigger) || \ + ((MODE) == TIM_SlaveMode_External1)) +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode + * @{ + */ + +#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) +#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) +#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ + ((STATE) == TIM_MasterSlaveMode_Disable)) +/** + * @} + */ + +/** @defgroup TIM_Flags + * @{ + */ + +#define TIM_FLAG_Update ((uint16_t)0x0001) +#define TIM_FLAG_CC1 ((uint16_t)0x0002) +#define TIM_FLAG_CC2 ((uint16_t)0x0004) +#define TIM_FLAG_CC3 ((uint16_t)0x0008) +#define TIM_FLAG_CC4 ((uint16_t)0x0010) +#define TIM_FLAG_Trigger ((uint16_t)0x0040) +#define TIM_FLAG_CC1OF ((uint16_t)0x0200) +#define TIM_FLAG_CC2OF ((uint16_t)0x0400) +#define TIM_FLAG_CC3OF ((uint16_t)0x0800) +#define TIM_FLAG_CC4OF ((uint16_t)0x1000) +#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ + ((FLAG) == TIM_FLAG_CC1) || \ + ((FLAG) == TIM_FLAG_CC2) || \ + ((FLAG) == TIM_FLAG_CC3) || \ + ((FLAG) == TIM_FLAG_CC4) || \ + ((FLAG) == TIM_FLAG_Trigger) || \ + ((FLAG) == TIM_FLAG_CC1OF) || \ + ((FLAG) == TIM_FLAG_CC2OF) || \ + ((FLAG) == TIM_FLAG_CC3OF) || \ + ((FLAG) == TIM_FLAG_CC4OF)) +#define IS_TIM_CLEAR_FLAG(TIM_FLAG) ((((TIM_FLAG) & (uint16_t)0xE1A0) == 0x0000) && ((TIM_FLAG) != 0x0000)) + +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Filer_Value + * @{ + */ + +#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) +/** + * @} + */ + +/** @defgroup TIM_External_Trigger_Filter + * @{ + */ + +#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) +/** + * @} + */ + +/** @defgroup TIM_OCReferenceClear + * @{ + */ +#define TIM_OCReferenceClear_ETRF ((uint16_t)0x0008) +#define TIM_OCReferenceClear_OCREFCLR ((uint16_t)0x0000) +#define TIM_OCREFERENCECECLEAR_SOURCE(SOURCE) (((SOURCE) == TIM_OCReferenceClear_ETRF) || \ + ((SOURCE) == TIM_OCReferenceClear_OCREFCLR)) + +/** + * @} + */ + +/** @defgroup TIM_Remap + * @{ + */ + +#define TIM2_TIM10_OC ((uint32_t)0xFFFE0000) +#define TIM2_TIM5_TRGO ((uint32_t)0xFFFE0001) + +#define TIM3_TIM11_OC ((uint32_t)0xFFFE0000) +#define TIM3_TIM5_TRGO ((uint32_t)0xFFFE0001) + +#define TIM9_GPIO ((uint32_t)0xFFFC0000) +#define TIM9_LSE ((uint32_t)0xFFFC0001) + +#define TIM9_TIM3_TRGO ((uint32_t)0xFFFB0000) +#define TIM9_TS_IO ((uint32_t)0xFFFB0004) + +#define TIM10_GPIO ((uint32_t)0xFFF40000) +#define TIM10_LSI ((uint32_t)0xFFF40001) +#define TIM10_LSE ((uint32_t)0xFFF40002) +#define TIM10_RTC ((uint32_t)0xFFF40003) +#define TIM10_RI ((uint32_t)0xFFF40008) + +#define TIM10_ETR_LSE ((uint32_t)0xFFFB0000) +#define TIM10_ETR_TIM9_TRGO ((uint32_t)0xFFFB0004) + +#define TIM11_GPIO ((uint32_t)0xFFF40000) +#define TIM11_MSI ((uint32_t)0xFFF40001) +#define TIM11_HSE_RTC ((uint32_t)0xFFF40002) +#define TIM11_RI ((uint32_t)0xFFF40008) + +#define TIM11_ETR_LSE ((uint32_t)0xFFFB0000) +#define TIM11_ETR_TIM9_TRGO ((uint32_t)0xFFFB0004) + +#define IS_TIM_REMAP(TIM_REMAP) (((TIM_REMAP) == TIM2_TIM10_OC)|| \ + ((TIM_REMAP) == TIM2_TIM5_TRGO)|| \ + ((TIM_REMAP) == TIM3_TIM11_OC)|| \ + ((TIM_REMAP) == TIM3_TIM5_TRGO)|| \ + ((TIM_REMAP) == TIM9_GPIO)|| \ + ((TIM_REMAP) == TIM9_LSE)|| \ + ((TIM_REMAP) == TIM9_TIM3_TRGO)|| \ + ((TIM_REMAP) == TIM9_TS_IO)|| \ + ((TIM_REMAP) == TIM10_GPIO)|| \ + ((TIM_REMAP) == TIM10_LSI)|| \ + ((TIM_REMAP) == TIM10_LSE)|| \ + ((TIM_REMAP) == TIM10_RTC)|| \ + ((TIM_REMAP) == TIM10_RI)|| \ + ((TIM_REMAP) == TIM10_ETR_LSE)|| \ + ((TIM_REMAP) == TIM10_ETR_TIM9_TRGO)|| \ + ((TIM_REMAP) == TIM11_GPIO)|| \ + ((TIM_REMAP) == TIM11_MSI)|| \ + ((TIM_REMAP) == TIM11_HSE_RTC)|| \ + ((TIM_REMAP) == TIM11_RI)|| \ + ((TIM_REMAP) == TIM11_ETR_LSE)|| \ + ((TIM_REMAP) == TIM11_ETR_TIM9_TRGO)) + +/** + * @} + */ + +/** @defgroup TIM_Legacy + * @{ + */ + +#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer +#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers +#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers +#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers +#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers +#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers +#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers +#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers +#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers +#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers +#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers +#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers +#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers +#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers +#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers +#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers +#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers +#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* TimeBase management ********************************************************/ +void TIM_DeInit(TIM_TypeDef* TIMx); +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); +void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter); +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload); +uint32_t TIM_GetCounter(TIM_TypeDef* TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); + +/* Output Compare management **************************************************/ +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1); +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2); +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3); +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4); +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_SelectOCREFClear(TIM_TypeDef* TIMx, uint16_t TIM_OCReferenceClear); +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); + +/* Input Capture management ***************************************************/ +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx); +uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx); +uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx); +uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx); +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); + +/* Interrupts, DMA and flags management ***************************************/ +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); + +/* Clocks management **********************************************************/ +void TIM_InternalClockConfig(TIM_TypeDef* TIMx); +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter); +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); + + +/* Synchronization management *************************************************/ +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); + +/* Specific interface management **********************************************/ +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); + +/* Specific remapping management **********************************************/ +void TIM_RemapConfig(TIM_TypeDef* TIMx, uint32_t TIM_Remap); + + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32L1xx_TIM_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_usart.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_usart.h new file mode 100644 index 0000000..590c1ed --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_usart.h @@ -0,0 +1,427 @@ +/** + ****************************************************************************** + * @file stm32l1xx_usart.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the USART + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_USART_H +#define __STM32L1xx_USART_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup USART + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief USART Init Structure definition + */ + +typedef struct +{ + uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (USART_InitStruct->USART_BaudRate))) + - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 + Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ + + uint16_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_Word_Length */ + + uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_t USART_Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control */ +} USART_InitTypeDef; + +/** + * @brief USART Clock Init Structure definition + */ + +typedef struct +{ + + uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /*!< Specifies the steady state of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase */ + + uint16_t USART_LastBit; /*!< 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_Last_Bit */ +} USART_ClockInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup USART_Exported_Constants + * @{ + */ + +#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3) || \ + ((PERIPH) == UART4) || \ + ((PERIPH) == UART5)) + +#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \ + ((PERIPH) == USART2) || \ + ((PERIPH) == USART3)) + +/** @defgroup USART_Word_Length + * @{ + */ + +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ + ((LENGTH) == USART_WordLength_9b)) +/** + * @} + */ + +/** @defgroup USART_Stop_Bits + * @{ + */ + +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) +#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ + ((STOPBITS) == USART_StopBits_0_5) || \ + ((STOPBITS) == USART_StopBits_2) || \ + ((STOPBITS) == USART_StopBits_1_5)) +/** + * @} + */ + +/** @defgroup USART_Parity + * @{ + */ + +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) +#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ + ((PARITY) == USART_Parity_Even) || \ + ((PARITY) == USART_Parity_Odd)) +/** + * @} + */ + +/** @defgroup USART_Mode + * @{ + */ + +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) +#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) +/** + * @} + */ + +/** @defgroup USART_Hardware_Flow_Control + * @{ + */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) +#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ + (((CONTROL) == USART_HardwareFlowControl_None) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS) || \ + ((CONTROL) == USART_HardwareFlowControl_CTS) || \ + ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) +/** + * @} + */ + +/** @defgroup USART_Clock + * @{ + */ +#define USART_Clock_Disable ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) +#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ + ((CLOCK) == USART_Clock_Enable)) +/** + * @} + */ + +/** @defgroup USART_Clock_Polarity + * @{ + */ + +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) +#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) + +/** + * @} + */ + +/** @defgroup USART_Clock_Phase + * @{ + */ + +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) +#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) + +/** + * @} + */ + +/** @defgroup USART_Last_Bit + * @{ + */ + +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) +#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ + ((LASTBIT) == USART_LastBit_Enable)) +/** + * @} + */ + +/** @defgroup USART_Interrupt_definition + * @{ + */ + +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_ORE_RX ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */ +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE_ER ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */ +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) + +/** @defgroup USART_Legacy + * @{ + */ +#define USART_IT_ORE USART_IT_ORE_ER +/** + * @} + */ + +#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR)) +#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ + ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ + ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE_RX) || \ + ((IT) == USART_IT_ORE_ER) || ((IT) == USART_IT_NE) || \ + ((IT) == USART_IT_FE)) +#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ + ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) +/** + * @} + */ + +/** @defgroup USART_DMA_Requests + * @{ + */ + +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) +#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) + +/** + * @} + */ + +/** @defgroup USART_WakeUp_methods + * @{ + */ + +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) +#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ + ((WAKEUP) == USART_WakeUp_AddressMark)) +/** + * @} + */ + +/** @defgroup USART_LIN_Break_Detection_Length + * @{ + */ + +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) +#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ + (((LENGTH) == USART_LINBreakDetectLength_10b) || \ + ((LENGTH) == USART_LINBreakDetectLength_11b)) +/** + * @} + */ + +/** @defgroup USART_IrDA_Low_Power + * @{ + */ + +#define USART_IrDAMode_LowPower ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) +#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ + ((MODE) == USART_IrDAMode_Normal)) +/** + * @} + */ + +/** @defgroup USART_Flags + * @{ + */ + +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) +#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ + ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ + ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ + ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ + ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE)) + +#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x003D0901)) +#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) +#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/* Function used to set the USART configuration to the default reset state ***/ +void USART_DeInit(USART_TypeDef* USARTx); + +/* Initialization and Configuration functions *********************************/ +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); +void USART_StructInit(USART_InitTypeDef* USART_InitStruct); +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); +void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); + +/* Data transfers functions ***************************************************/ +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef* USARTx); + +/* Multi-Processor Communication functions ************************************/ +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); + +/* LIN mode functions *********************************************************/ +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SendBreak(USART_TypeDef* USARTx); + +/* Half-duplex mode function **************************************************/ +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); + +/* Smartcard mode functions ***************************************************/ +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); + +/* IrDA mode functions ********************************************************/ +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); + +/* DMA transfers management functions *****************************************/ +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_USART_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_wwdg.h b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_wwdg.h new file mode 100644 index 0000000..a17c6e1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/inc/stm32l1xx_wwdg.h @@ -0,0 +1,110 @@ +/** + ****************************************************************************** + * @file stm32l1xx_wwdg.h + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file contains all the functions prototypes for the WWDG + * firmware library. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 __STM32L1xx_WWDG_H +#define __STM32L1xx_WWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup WWDG + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup WWDG_Exported_Constants + * @{ + */ + +/** @defgroup WWDG_Prescaler + * @{ + */ + +#define WWDG_Prescaler_1 ((uint32_t)0x00000000) +#define WWDG_Prescaler_2 ((uint32_t)0x00000080) +#define WWDG_Prescaler_4 ((uint32_t)0x00000100) +#define WWDG_Prescaler_8 ((uint32_t)0x00000180) +#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ + ((PRESCALER) == WWDG_Prescaler_2) || \ + ((PRESCALER) == WWDG_Prescaler_4) || \ + ((PRESCALER) == WWDG_Prescaler_8)) +#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) +#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* Function used to set the WWDG configuration to the default reset state ****/ +void WWDG_DeInit(void); + +/* Prescaler, Refresh window and Counter configuration functions **************/ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); + +/* WWDG activation functions **************************************************/ +void WWDG_Enable(uint8_t Counter); + +/* Interrupts and flags management functions **********************************/ +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L1xx_WWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/misc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/misc.c new file mode 100644 index 0000000..921bf1a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/misc.c @@ -0,0 +1,251 @@ +/** + ****************************************************************************** + * @file misc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides all the miscellaneous firmware functions (add-on + * to CMSIS functions). + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "misc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup MISC + * @brief MISC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup MISC_Private_Functions + * @{ + */ +/** + * +@verbatim + ******************************************************************************* + ##### Interrupts configuration functions ##### + ******************************************************************************* + [..] This section provide functions allowing to configure the NVIC interrupts + (IRQ).The Cortex-M3 exceptions are managed by CMSIS functions. + (#) Configure the NVIC Priority Grouping using NVIC_PriorityGroupConfig() + function according to the following table. + The table below gives the allowed values of the preemption priority + and subpriority according to the Priority Grouping configuration + performed by NVIC_PriorityGroupConfig function. + ============================================================================================================================ + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ============================================================================================================================ + NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for preemption priority + | | | 4 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for preemption priority + | | | 3 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for preemption priority + | | | 2 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for preemption priority + | | | 1 bits for subpriority + ---------------------------------------------------------------------------------------------------------------------------- + NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for preemption priority + | | | 0 bits for subpriority + ============================================================================================================================ + + + (#) Enable and Configure the priority of the selected IRQ Channels. + + -@- When the NVIC_PriorityGroup_0 is selected, it will no any nested interrupt, + the IRQ priority will be managed only by subpriority. + The sub-priority is only used to sort pending exception priorities, + and does not affect active exceptions. + -@- Lower priority values gives higher priority. + -@- Priority Order: + (#@) Lowest Preemption priority. + (#@) Lowest Subpriority. + (#@) Lowest hardware priority (IRQn position). + +@endverbatim +*/ + +/** + * @brief Configures the priority grouping: preemption priority and subpriority. + * @param NVIC_PriorityGroup: specifies the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PriorityGroup_0: 0 bits for preemption priority + * 4 bits for subpriority. + * @note When NVIC_PriorityGroup_0 is selected, it will no be any nested + * interrupt. This interrupts priority is managed only with subpriority. + * @arg NVIC_PriorityGroup_1: 1 bits for preemption priority. + * 3 bits for subpriority. + * @arg NVIC_PriorityGroup_2: 2 bits for preemption priority. + * 2 bits for subpriority. + * @arg NVIC_PriorityGroup_3: 3 bits for preemption priority. + * 1 bits for subpriority. + * @arg NVIC_PriorityGroup_4: 4 bits for preemption priority. + * 0 bits for subpriority. + * @retval None + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ + SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; +} + +/** + * @brief Initializes the NVIC peripheral according to the specified + * parameters in the NVIC_InitStruct. + * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + * function should be called before. + * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains + * the configuration information for the specified NVIC peripheral. + * @retval None + */ +void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) +{ + uint8_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); + assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); + + if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + /* Compute the Corresponding IRQ Priority --------------------------------*/ + tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; + tmppre = (0x4 - tmppriority); + tmpsub = tmpsub >> tmppriority; + + tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; + tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub); + tmppriority = tmppriority << 0x04; + + NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; + + /* Enable the Selected IRQ Channels --------------------------------------*/ + NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } + else + { + /* Disable the Selected IRQ Channels -------------------------------------*/ + NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = + (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } +} + +/** + * @brief Sets the vector table location and Offset. + * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. + * This parameter can be one of the following values: + * @arg NVIC_VectTab_RAM: Vector Table in internal SRAM. + * @arg NVIC_VectTab_FLASH: Vector Table in internal FLASH. + * @param Offset: Vector Table base offset field. This value must be a multiple of 0x200. + * @retval None + */ +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) +{ + /* Check the parameters */ + assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); + assert_param(IS_NVIC_OFFSET(Offset)); + + SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); +} + +/** + * @brief Selects the condition for the system to enter low power mode. + * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. + * This parameter can be one of the following values: + * @arg NVIC_LP_SEVONPEND: Low Power SEV on Pend. + * @arg NVIC_LP_SLEEPDEEP: Low Power DEEPSLEEP request. + * @arg NVIC_LP_SLEEPONEXIT: Low Power Sleep on Exit. + * @param NewState: new state of LP condition. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_NVIC_LP(LowPowerMode)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + SCB->SCR |= LowPowerMode; + } + else + { + SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); + } +} + +/** + * @brief Configures the SysTick clock source. + * @param SysTick_CLKSource: specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); + + if (SysTick_CLKSource == SysTick_CLKSource_HCLK) + { + SysTick->CTRL |= SysTick_CLKSource_HCLK; + } + else + { + SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_adc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_adc.c new file mode 100644 index 0000000..b7b3edb --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_adc.c @@ -0,0 +1,1909 @@ +/** + ****************************************************************************** + * @file stm32l1xx_adc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Analog to Digital Convertor (ADC) peripheral: + * + Initialization and Configuration + * + Power saving + * + Analog Watchdog configuration + * + Temperature Sensor & Vrefint (Voltage Reference internal) management + * + Regular Channels Configuration + * + Regular Channels DMA Configuration + * + Injected channels Configuration + * + Interrupts and flags management + * + * @verbatim +================================================================================ + ##### How to use this driver ##### +================================================================================ + [..] + (#) Configure the ADC Prescaler, conversion resolution and data alignment + using the ADC_Init() function. + (#) Activate the ADC peripheral using ADC_Cmd() function. + + *** Regular channels group configuration *** + ============================================ + [..] + (+) To configure the ADC regular channels group features, use + ADC_Init() and ADC_RegularChannelConfig() functions. + (+) To activate the continuous mode, use the ADC_continuousModeCmd() + function. + (+) To configurate and activate the Discontinuous mode, use the + ADC_DiscModeChannelCountConfig() and ADC_DiscModeCmd() functions. + (+) To read the ADC converted values, use the ADC_GetConversionValue() + function. + + *** DMA for Regular channels group features configuration *** + ============================================================= + [..] + (+) To enable the DMA mode for regular channels group, use the + ADC_DMACmd() function. + (+) To enable the generation of DMA requests continuously at the end + of the last DMA transfer, use the ADC_DMARequestAfterLastTransferCmd() + function. + + *** Injected channels group configuration *** + ============================================= + [..] + (+) To configure the ADC Injected channels group features, use + ADC_InjectedChannelConfig() and ADC_InjectedSequencerLengthConfig() + functions. + (+) To activate the continuous mode, use the ADC_continuousModeCmd() + function. + (+) To activate the Injected Discontinuous mode, use the + ADC_InjectedDiscModeCmd() function. + (+) To activate the AutoInjected mode, use the ADC_AutoInjectedConvCmd() + function. + (+) To read the ADC converted values, use the ADC_GetInjectedConversionValue() + function. + + @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_adc.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup ADC + * @brief ADC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* ADC DISCNUM mask */ +#define CR1_DISCNUM_RESET ((uint32_t)0xFFFF1FFF) + +/* ADC AWDCH mask */ +#define CR1_AWDCH_RESET ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CR1_AWDMODE_RESET ((uint32_t)0xFF3FFDFF) + +/* CR1 register Mask */ +#define CR1_CLEAR_MASK ((uint32_t)0xFCFFFEFF) + +/* ADC DELAY mask */ +#define CR2_DELS_RESET ((uint32_t)0xFFFFFF0F) + +/* ADC JEXTEN mask */ +#define CR2_JEXTEN_RESET ((uint32_t)0xFFCFFFFF) + +/* ADC JEXTSEL mask */ +#define CR2_JEXTSEL_RESET ((uint32_t)0xFFF0FFFF) + +/* CR2 register Mask */ +#define CR2_CLEAR_MASK ((uint32_t)0xC0FFF7FD) + +/* ADC SQx mask */ +#define SQR5_SQ_SET ((uint32_t)0x0000001F) +#define SQR4_SQ_SET ((uint32_t)0x0000001F) +#define SQR3_SQ_SET ((uint32_t)0x0000001F) +#define SQR2_SQ_SET ((uint32_t)0x0000001F) +#define SQR1_SQ_SET ((uint32_t)0x0000001F) + +/* ADC L Mask */ +#define SQR1_L_RESET ((uint32_t)0xFE0FFFFF) + +/* ADC JSQx mask */ +#define JSQR_JSQ_SET ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define JSQR_JL_SET ((uint32_t)0x00300000) +#define JSQR_JL_RESET ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SMPR1_SMP_SET ((uint32_t)0x00000007) +#define SMPR2_SMP_SET ((uint32_t)0x00000007) +#define SMPR3_SMP_SET ((uint32_t)0x00000007) +#define SMPR0_SMP_SET ((uint32_t)0x00000007) + +/* ADC JDRx registers offset */ +#define JDR_OFFSET ((uint8_t)0x30) + +/* ADC CCR register Mask */ +#define CR_CLEAR_MASK ((uint32_t)0xFFFCFFFF) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup ADC_Private_Functions + * @{ + */ + +/** @defgroup ADC_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 ADC Prescaler. + (+) ADC Conversion Resolution (12bit..6bit). + (+) Scan Conversion Mode (multichannel or one channel) for regular group. + (+) ADC Continuous Conversion Mode (Continuous or Single conversion) for + regular group. + (+) External trigger Edge and source of regular group. + (+) Converted data alignment (left or right). + (+) The number of ADC conversions that will be done using the sequencer + for regular channel group. + (+) Enable or disable the ADC peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes ADC1 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void ADC_DeInit(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + if(ADCx == ADC1) + { + /* Enable ADC1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); + /* Release ADC1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); + } +} + +/** + * @brief Initializes the ADCx peripheral according to the specified parameters + * in the ADC_InitStruct. + * @note This function is used to configure the global features of the ADC ( + * Resolution and Data Alignment), however, the rest of the configuration + * parameters are specific to the regular channels group (scan mode + * activation, continuous mode activation, External trigger source and + * edge, number of conversion in the regular channels group sequencer). + * @param ADCx: where x can be 1 to select the ADC peripheral. + * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains + * the configuration information for the specified ADC peripheral. + * @retval None + */ +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) +{ + uint32_t tmpreg1 = 0; + uint8_t tmpreg2 = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_RESOLUTION(ADC_InitStruct->ADC_Resolution)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); + assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); + assert_param(IS_ADC_EXT_TRIG_EDGE(ADC_InitStruct->ADC_ExternalTrigConvEdge)); + assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); + assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); + assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfConversion)); + + /*---------------------------- ADCx CR1 Configuration -----------------*/ + /* Get the ADCx CR1 value */ + tmpreg1 = ADCx->CR1; + /* Clear RES and SCAN bits */ + tmpreg1 &= CR1_CLEAR_MASK; + /* Configure ADCx: scan conversion mode and resolution */ + /* Set SCAN bit according to ADC_ScanConvMode value */ + /* Set RES bit according to ADC_Resolution value */ + tmpreg1 |= (uint32_t)(((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8) | ADC_InitStruct->ADC_Resolution); + /* Write to ADCx CR1 */ + ADCx->CR1 = tmpreg1; + + /*---------------------------- ADCx CR2 Configuration -----------------*/ + /* Get the ADCx CR2 value */ + tmpreg1 = ADCx->CR2; + /* Clear CONT, ALIGN, EXTEN and EXTSEL bits */ + tmpreg1 &= CR2_CLEAR_MASK; + /* Configure ADCx: external trigger event and edge, data alignment and continuous conversion mode */ + /* Set ALIGN bit according to ADC_DataAlign value */ + /* Set EXTEN bits according to ADC_ExternalTrigConvEdge value */ + /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ + /* Set CONT bit according to ADC_ContinuousConvMode value */ + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ADC_InitStruct->ADC_ExternalTrigConvEdge | ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + /* Write to ADCx CR2 */ + ADCx->CR2 = tmpreg1; + + /*---------------------------- ADCx SQR1 Configuration -----------------*/ + /* Get the ADCx SQR1 value */ + tmpreg1 = ADCx->SQR1; + /* Clear L bits */ + tmpreg1 &= SQR1_L_RESET; + /* Configure ADCx: regular channel sequence length */ + /* Set L bits according to ADC_NbrOfConversion value */ + tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfConversion - (uint8_t)1); + tmpreg1 |= ((uint32_t)tmpreg2 << 20); + /* Write to ADCx SQR1 */ + ADCx->SQR1 = tmpreg1; +} + +/** + * @brief Fills each ADC_InitStruct member with its default value. + * @note This function is used to initialize the global features of the ADC ( + * Resolution and Data Alignment), however, the rest of the configuration + * parameters are specific to the regular channels group (scan mode + * activation, continuous mode activation, External trigger source and + * edge, number of conversion in the regular channels group sequencer). + * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) +{ + /* Reset ADC init structure parameters values */ + /* Initialize the ADC_Resolution member */ + ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b; + + /* Initialize the ADC_ScanConvMode member */ + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + + /* Initialize the ADC_ContinuousConvMode member */ + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + + /* Initialize the ADC_ExternalTrigConvEdge member */ + ADC_InitStruct->ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; + + /* Initialize the ADC_ExternalTrigConv member */ + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; + + /* Initialize the ADC_DataAlign member */ + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + + /* Initialize the ADC_NbrOfConversion member */ + ADC_InitStruct->ADC_NbrOfConversion = 1; +} + +/** + * @brief Initializes the ADCs peripherals according to the specified parameters + * in the ADC_CommonInitStruct. + * @param ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure + * that contains the configuration information (Prescaler) for ADC1 peripheral. + * @retval None + */ +void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_PRESCALER(ADC_CommonInitStruct->ADC_Prescaler)); + + /*---------------------------- ADC CCR Configuration -----------------*/ + /* Get the ADC CCR value */ + tmpreg = ADC->CCR; + + /* Clear ADCPRE bit */ + tmpreg &= CR_CLEAR_MASK; + + /* Configure ADCx: ADC prescaler according to ADC_Prescaler */ + tmpreg |= (uint32_t)(ADC_CommonInitStruct->ADC_Prescaler); + + /* Write to ADC CCR */ + ADC->CCR = tmpreg; +} + +/** + * @brief Fills each ADC_CommonInitStruct member with its default value. + * @param ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure + * which will be initialized. + * @retval None + */ +void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct) +{ + /* Reset ADC init structure parameters values */ + /* Initialize the ADC_Prescaler member */ + ADC_CommonInitStruct->ADC_Prescaler = ADC_Prescaler_Div1; +} + +/** + * @brief Enables or disables the specified ADC peripheral. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the ADCx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the ADON bit to wake up the ADC from power down mode */ + ADCx->CR2 |= (uint32_t)ADC_CR2_ADON; + } + else + { + /* Disable the selected ADC peripheral */ + ADCx->CR2 &= (uint32_t)(~ADC_CR2_ADON); + } +} + +/** + * @brief Selects the specified ADC Channels Bank. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_Bank: ADC Channels Bank. + * @arg ADC_Bank_A: ADC Channels Bank A. + * @arg ADC_Bank_B: ADC Channels Bank B. + * @retval None + */ +void ADC_BankSelection(ADC_TypeDef* ADCx, uint8_t ADC_Bank) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_BANK(ADC_Bank)); + + if (ADC_Bank != ADC_Bank_A) + { + /* Set the ADC_CFG bit to select the ADC Bank B channels */ + ADCx->CR2 |= (uint32_t)ADC_CR2_CFG; + } + else + { + /* Reset the ADC_CFG bit to select the ADC Bank A channels */ + ADCx->CR2 &= (uint32_t)(~ADC_CR2_CFG); + } +} + +/** + * @} + */ + +/** @defgroup ADC_Group2 Power saving functions + * @brief Power saving functions + * +@verbatim + =============================================================================== + ##### Power saving functions ##### + =============================================================================== + [..] This section provides functions allowing to reduce power consumption. + [..] The two function must be combined to get the maximal benefits: + When the ADC frequency is higher than the CPU one, it is recommended to: + (#) Insert a freeze delay : + ==> using ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze). + (#) Enable the power down in Idle and Delay phases : + ==> using ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE). + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the ADC Power Down during Delay and/or Idle phase. + * @note ADC power-on and power-off can be managed by hardware to cut the + * consumption when the ADC is not converting. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_PowerDown: The ADC power down configuration. + * This parameter can be one of the following values: + * @arg ADC_PowerDown_Delay: ADC is powered down during delay phase. + * @arg ADC_PowerDown_Idle: ADC is powered down during Idle phase. + * @arg ADC_PowerDown_Idle_Delay: ADC is powered down during Delay and Idle phases. + * @note The ADC can be powered down: + * @note During the hardware delay insertion (using the ADC_PowerDown_Delay + * parameter). + * => The ADC is powered up again at the end of the delay. + * @note During the ADC is waiting for a trigger event ( using the + * ADC_PowerDown_Idle parameter). + * => The ADC is powered up at the next trigger event. + * @note During the hardware delay insertion or the ADC is waiting for a + * trigger event (using the ADC_PowerDown_Idle_Delay parameter). + * => The ADC is powered up only at the end of the delay and at the + * next trigger event. + * @param NewState: new state of the ADCx power down. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_PowerDownCmd(ADC_TypeDef* ADCx, uint32_t ADC_PowerDown, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_POWER_DOWN(ADC_PowerDown)); + + if (NewState != DISABLE) + { + /* Enable the ADC power-down during Delay and/or Idle phase */ + ADCx->CR1 |= ADC_PowerDown; + } + else + { + /* Disable The ADC power-down during Delay and/or Idle phase */ + ADCx->CR1 &= (uint32_t)~ADC_PowerDown; + } +} + +/** + * @brief Defines the length of the delay which is applied after a conversion + * or a sequence of conversion. + * @note When the CPU clock is not fast enough to manage the data rate, a + * Hardware delay can be introduced between ADC conversions to reduce + * this data rate. + * @note The Hardware delay is inserted after : + * - each regular conversion. + * - after each sequence of injected conversions. + * @note No Hardware delay is inserted between conversions of different groups. + * @note When the hardware delay is not enough, the Freeze Delay Mode can be + * selected and a new conversion can start only if all the previous data + * of the same group have been treated: + * - for a regular conversion: once the ADC conversion data register has + * been read (using ADC_GetConversionValue() function) or if the EOC + * Flag has been cleared (using ADC_ClearFlag() function). + * - for an injected conversion: when the JEOC bit has been cleared + * (using ADC_ClearFlag() function). + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_DelayLength: The length of delay which is applied after a + * conversion or a sequence of conversion. + * This parameter can be one of the following values: + * @arg ADC_DelayLength_None: No delay. + * @arg ADC_DelayLength_Freeze: Delay until the converted data has been read. + * @arg ADC_DelayLength_7Cycles: Delay length equal to 7 APB clock cycles. + * @arg ADC_DelayLength_15Cycles: Delay length equal to 15 APB clock cycles + * @arg ADC_DelayLength_31Cycles: Delay length equal to 31 APB clock cycles + * @arg ADC_DelayLength_63Cycles: Delay length equal to 63 APB clock cycles + * @arg ADC_DelayLength_127Cycles: Delay length equal to 127 APB clock cycles + * @arg ADC_DelayLength_255Cycles: Delay length equal to 255 APB clock cycles + * @retval None + */ +void ADC_DelaySelectionConfig(ADC_TypeDef* ADCx, uint8_t ADC_DelayLength) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_DELAY_LENGTH(ADC_DelayLength)); + + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old delay length */ + tmpreg &= CR2_DELS_RESET; + /* Set the delay length */ + tmpreg |= ADC_DelayLength; + /* Store the new register value */ + ADCx->CR2 = tmpreg; + +} + +/** + * @} + */ + +/** @defgroup ADC_Group3 Analog Watchdog configuration functions + * @brief Analog Watchdog configuration functions. + * +@verbatim + =============================================================================== + ##### Analog Watchdog configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to configure the Analog Watchdog + (AWD) feature in the ADC. + [..] A typical configuration Analog Watchdog is done following these steps : + (#) the ADC guarded channel(s) is (are) selected using the + ADC_AnalogWatchdogSingleChannelConfig() function. + (#) The Analog watchdog lower and higher threshold are configured using + the ADC_AnalogWatchdogThresholdsConfig() function. + (#) The Analog watchdog is enabled and configured to enable the check, + on one or more channels, using the ADC_AnalogWatchdogCmd() function. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. + * This parameter can be one of the following values: + * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single + * regular channel. + * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single + * injected channel. + * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a + * single regular or injected channel. + * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular + * channel. + * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected + * channel. + * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all + * regular and injected channels. + * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog. + * @retval None + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); + + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear AWDEN, JAWDEN and AWDSGL bits */ + tmpreg &= CR1_AWDMODE_RESET; + /* Set the analog watchdog enable mode */ + tmpreg |= ADC_AnalogWatchdog; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @brief Configures the high and low thresholds of the analog watchdog. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param HighThreshold: the ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * @param LowThreshold: the ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, + uint16_t LowThreshold) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_THRESHOLD(HighThreshold)); + assert_param(IS_ADC_THRESHOLD(LowThreshold)); + + /* Set the ADCx high threshold */ + ADCx->HTR = HighThreshold; + /* Set the ADCx low threshold */ + ADCx->LTR = LowThreshold; +} + +/** + * @brief Configures the analog watchdog guarded single channel. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_Channel: the ADC channel to configure for the analog watchdog. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @arg ADC_Channel_18: ADC Channel18 selected + * @arg ADC_Channel_19: ADC Channel19 selected + * @arg ADC_Channel_20: ADC Channel20 selected + * @arg ADC_Channel_21: ADC Channel21 selected + * @arg ADC_Channel_22: ADC Channel22 selected + * @arg ADC_Channel_23: ADC Channel23 selected + * @arg ADC_Channel_24: ADC Channel24 selected + * @arg ADC_Channel_25: ADC Channel25 selected + * @arg ADC_Channel_27: ADC Channel27 selected + * @arg ADC_Channel_28: ADC Channel28 selected + * @arg ADC_Channel_29: ADC Channel29 selected + * @arg ADC_Channel_30: ADC Channel30 selected + * @arg ADC_Channel_31: ADC Channel31 selected + * @arg ADC_Channel_0b: ADC Channel0b selected + * @arg ADC_Channel_1b: ADC Channel1b selected + * @arg ADC_Channel_2b: ADC Channel2b selected + * @arg ADC_Channel_3b: ADC Channel3b selected + * @arg ADC_Channel_6b: ADC Channel6b selected + * @arg ADC_Channel_7b: ADC Channel7b selected + * @arg ADC_Channel_8b: ADC Channel8b selected + * @arg ADC_Channel_9b: ADC Channel9b selected + * @arg ADC_Channel_10b: ADC Channel10b selected + * @arg ADC_Channel_11b: ADC Channel11b selected + * @arg ADC_Channel_12b: ADC Channel12b selected + * @retval None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + + /* Get the old register value */ + tmpreg = ADCx->CR1; + /* Clear the Analog watchdog channel select bits */ + tmpreg &= CR1_AWDCH_RESET; + /* Set the Analog watchdog channel */ + tmpreg |= ADC_Channel; + /* Store the new register value */ + ADCx->CR1 = tmpreg; +} + +/** + * @} + */ + +/** @defgroup ADC_Group4 Temperature Sensor & Vrefint (Voltage Reference internal) management function + * @brief Temperature Sensor & Vrefint (Voltage Reference internal) management function. + * +@verbatim + ========================================================================================= + ##### Temperature Sensor and Vrefint (Voltage Reference internal) management function ##### + ========================================================================================= + [..] This section provides a function allowing to enable/ disable the internal + connections between the ADC and the Temperature Sensor and the Vrefint + source. + [..] A typical configuration to get the Temperature sensor and Vrefint channels + voltages is done following these steps : + (#) Enable the internal connection of Temperature sensor and Vrefint sources + with the ADC channels using ADC_TempSensorVrefintCmd() function. + (#) select the ADC_Channel_TempSensor and/or ADC_Channel_Vrefint using + ADC_RegularChannelConfig() or ADC_InjectedChannelConfig() functions. + (#) Get the voltage values, using ADC_GetConversionValue() or + ADC_GetInjectedConversionValue(). +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the temperature sensor and Vrefint channel. + * @param NewState: new state of the temperature sensor and Vref int channels. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the temperature sensor and Vrefint channel*/ + ADC->CCR |= (uint32_t)ADC_CCR_TSVREFE; + } + else + { + /* Disable the temperature sensor and Vrefint channel*/ + ADC->CCR &= (uint32_t)(~ADC_CCR_TSVREFE); + } +} + +/** + * @} + */ + +/** @defgroup ADC_Group5 Regular Channels Configuration functions + * @brief Regular Channels Configuration functions. + * +@verbatim + =============================================================================== + ##### Regular Channels Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to manage the ADC regular channels, + it is composed of 2 sub sections : + (#) Configuration and management functions for regular channels: This + subsection provides functions allowing to configure the ADC regular + channels : + (++) Configure the rank in the regular group sequencer for each channel. + (++) Configure the sampling time for each channel. + (++) select the conversion Trigger for regular channels. + (++) select the desired EOC event behavior configuration. + (++) Activate the continuous Mode (*). + (++) Activate the Discontinuous Mode. + -@@- Please Note that the following features for regular channels are + configurated using the ADC_Init() function : + (+@@) scan mode activation. + (+@@) continuous mode activation (**). + (+@@) External trigger source. + (+@@) External trigger edge. + (+@@) number of conversion in the regular channels group sequencer. + -@@- (*) and (**) are performing the same configuration. + (#) Get the conversion data: This subsection provides an important function + in the ADC peripheral since it returns the converted data of the current + regular channel. When the Conversion value is read, the EOC Flag is + automatically cleared. +@endverbatim + * @{ + */ + +/** + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sampling time. + * @param ADCx: where x can be 1 to select the ADC peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @arg ADC_Channel_18: ADC Channel18 selected + * @arg ADC_Channel_19: ADC Channel19 selected + * @arg ADC_Channel_20: ADC Channel20 selected + * @arg ADC_Channel_21: ADC Channel21 selected + * @arg ADC_Channel_22: ADC Channel22 selected + * @arg ADC_Channel_23: ADC Channel23 selected + * @arg ADC_Channel_24: ADC Channel24 selected + * @arg ADC_Channel_25: ADC Channel25 selected + * @arg ADC_Channel_27: ADC Channel27 selected + * @arg ADC_Channel_28: ADC Channel28 selected + * @arg ADC_Channel_29: ADC Channel29 selected + * @arg ADC_Channel_30: ADC Channel30 selected + * @arg ADC_Channel_31: ADC Channel31 selected + * @arg ADC_Channel_0b: ADC Channel0b selected + * @arg ADC_Channel_1b: ADC Channel1b selected + * @arg ADC_Channel_2b: ADC Channel2b selected + * @arg ADC_Channel_3b: ADC Channel3b selected + * @arg ADC_Channel_6b: ADC Channel6b selected + * @arg ADC_Channel_7b: ADC Channel7b selected + * @arg ADC_Channel_8b: ADC Channel8b selected + * @arg ADC_Channel_9b: ADC Channel9b selected + * @arg ADC_Channel_10b: ADC Channel10b selected + * @arg ADC_Channel_11b: ADC Channel11b selected + * @arg ADC_Channel_12b: ADC Channel12b selected + * @param Rank: The rank in the regular group sequencer. This parameter + * must be between 1 to 28. + * @param ADC_SampleTime: The sample time value to be set for the selected + * channel. + * This parameter can be one of the following values: + * @arg ADC_SampleTime_4Cycles: Sample time equal to 4 cycles + * @arg ADC_SampleTime_9Cycles: Sample time equal to 9 cycles + * @arg ADC_SampleTime_16Cycles: Sample time equal to 16 cycles + * @arg ADC_SampleTime_24Cycles: Sample time equal to 24 cycles + * @arg ADC_SampleTime_48Cycles: Sample time equal to 48 cycles + * @arg ADC_SampleTime_96Cycles: Sample time equal to 96 cycles + * @arg ADC_SampleTime_192Cycles: Sample time equal to 192 cycles + * @arg ADC_SampleTime_384Cycles: Sample time equal to 384 cycles + * @retval None + */ +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_REGULAR_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + + /* If ADC_Channel_30 or ADC_Channel_31 is selected */ + if (ADC_Channel > ADC_Channel_29) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR0; + /* Calculate the mask to clear */ + tmpreg2 = SMPR0_SMP_SET << (3 * (ADC_Channel - 30)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 30)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR0 = tmpreg1; + } + /* If ADC_Channel_20 ... ADC_Channel_29 is selected */ + else if (ADC_Channel > ADC_Channel_19) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_SET << (3 * (ADC_Channel - 20)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 20)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + /* If ADC_Channel_10 ... ADC_Channel_19 is selected */ + else if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_SET << (3 * (ADC_Channel - 10)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR3; + /* Calculate the mask to clear */ + tmpreg2 = SMPR3_SMP_SET << (3 * ADC_Channel); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR3 = tmpreg1; + } + /* For Rank 1 to 6 */ + if (Rank < 7) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR5; + /* Calculate the mask to clear */ + tmpreg2 = SQR5_SQ_SET << (5 * (Rank - 1)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR5 = tmpreg1; + } + /* For Rank 7 to 12 */ + else if (Rank < 13) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR4; + /* Calculate the mask to clear */ + tmpreg2 = SQR4_SQ_SET << (5 * (Rank - 7)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR4 = tmpreg1; + } + /* For Rank 13 to 18 */ + else if (Rank < 19) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR3; + /* Calculate the mask to clear */ + tmpreg2 = SQR3_SQ_SET << (5 * (Rank - 13)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR3 = tmpreg1; + } + + /* For Rank 19 to 24 */ + else if (Rank < 25) + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR2; + /* Calculate the mask to clear */ + tmpreg2 = SQR2_SQ_SET << (5 * (Rank - 19)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 19)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR2 = tmpreg1; + } + + /* For Rank 25 to 28 */ + else + { + /* Get the old register value */ + tmpreg1 = ADCx->SQR1; + /* Calculate the mask to clear */ + tmpreg2 = SQR1_SQ_SET << (5 * (Rank - 25)); + /* Clear the old SQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 25)); + /* Set the SQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SQR1 = tmpreg1; + } +} + +/** + * @brief Enables the selected ADC software start conversion of the regular channels. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @retval None + */ +void ADC_SoftwareStartConv(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + /* Enable the selected ADC conversion for regular group */ + ADCx->CR2 |= (uint32_t)ADC_CR2_SWSTART; +} + +/** + * @brief Gets the selected ADC Software start regular conversion Status. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @retval The new state of ADC software start conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + /* Check the status of SWSTART bit */ + if ((ADCx->CR2 & ADC_CR2_SWSTART) != (uint32_t)RESET) + { + /* SWSTART bit is set */ + bitstatus = SET; + } + else + { + /* SWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the SWSTART bit status */ + return bitstatus; +} + +/** + * @brief Enables or disables the EOC on each regular channel conversion. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC EOC flag rising + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_EOCOnEachRegularChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC EOC rising on each regular channel conversion */ + ADCx->CR2 |= ADC_CR2_EOCS; + } + else + { + /* Disable the selected ADC EOC rising on each regular channel conversion */ + ADCx->CR2 &= (uint32_t)~ADC_CR2_EOCS; + } +} + +/** + * @brief Enables or disables the ADC continuous conversion mode. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC continuous conversion mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC continuous conversion mode */ + ADCx->CR2 |= (uint32_t)ADC_CR2_CONT; + } + else + { + /* Disable the selected ADC continuous conversion mode */ + ADCx->CR2 &= (uint32_t)(~ADC_CR2_CONT); + } +} + +/** + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param Number: specifies the discontinuous mode regular channel count value. + * This number must be between 1 and 8. + * @retval None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); + + /* Get the old register value */ + tmpreg1 = ADCx->CR1; + /* Clear the old discontinuous mode channel count */ + tmpreg1 &= CR1_DISCNUM_RESET; + /* Set the discontinuous mode channel count */ + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + /* Store the new register value */ + ADCx->CR1 = tmpreg1; +} + +/** + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC discontinuous mode on regular + * group channel. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC regular discontinuous mode */ + ADCx->CR1 |= (uint32_t)ADC_CR1_DISCEN; + } + else + { + /* Disable the selected ADC regular discontinuous mode */ + ADCx->CR1 &= (uint32_t)(~ADC_CR1_DISCEN); + } +} + +/** + * @brief Returns the last ADCx conversion result data for regular channel. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @retval The Data conversion value. + */ +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + /* Return the selected ADC conversion value */ + return (uint16_t) ADCx->DR; +} + +/** + * @} + */ + +/** @defgroup ADC_Group6 Regular Channels DMA Configuration functions + * @brief Regular Channels DMA Configuration functions. + * +@verbatim + =============================================================================== + ##### Regular Channels DMA Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to configure the DMA for ADC regular + channels.Since converted regular channel values are stored into a unique + data register, it is useful to use DMA for conversion of more than one + regular channel. This avoids the loss of the data already stored in the + ADC Data register. + When the DMA mode is enabled (using the ADC_DMACmd() function), after each + conversion of a regular channel, a DMA request is generated. + [..] Depending on the "DMA disable selection" configuration (using the + ADC_DMARequestAfterLastTransferCmd() function), at the end of the last DMA + transfer, two possibilities are allowed: + (+) No new DMA request is issued to the DMA controller (feature DISABLED). + (+) Requests can continue to be generated (feature ENABLED). + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified ADC DMA request. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_DMA_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC DMA request */ + ADCx->CR2 |= (uint32_t)ADC_CR2_DMA; + } + else + { + /* Disable the selected ADC DMA request */ + ADCx->CR2 &= (uint32_t)(~ADC_CR2_DMA); + } +} + + +/** + * @brief Enables or disables the ADC DMA request after last transfer (Single-ADC mode). + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC EOC flag rising + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC DMA request after last transfer */ + ADCx->CR2 |= ADC_CR2_DDS; + } + else + { + /* Disable the selected ADC DMA request after last transfer */ + ADCx->CR2 &= (uint32_t)~ADC_CR2_DDS; + } +} + +/** + * @} + */ + +/** @defgroup ADC_Group7 Injected channels Configuration functions + * @brief Injected channels Configuration functions. + * +@verbatim + =============================================================================== + ##### Injected channels Configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to configure the ADC Injected channels, + it is composed of 2 sub sections : + (#) Configuration functions for Injected channels: This subsection provides + functions allowing to configure the ADC injected channels : + (++) Configure the rank in the injected group sequencer for each channel. + (++) Configure the sampling time for each channel. + (++) Activate the Auto injected Mode. + (++) Activate the Discontinuous Mode. + (++) scan mode activation. + (++) External/software trigger source. + (++) External trigger edge. + (++) injected channels sequencer. + + (#) Get the Specified Injected channel conversion data: This subsection + provides an important function in the ADC peripheral since it returns + the converted data of the specific injected channel. + +@endverbatim + * @{ + */ + +/** + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_Channel: the ADC channel to configure. + * This parameter can be one of the following values: + * @arg ADC_Channel_0: ADC Channel0 selected + * @arg ADC_Channel_1: ADC Channel1 selected + * @arg ADC_Channel_2: ADC Channel2 selected + * @arg ADC_Channel_3: ADC Channel3 selected + * @arg ADC_Channel_4: ADC Channel4 selected + * @arg ADC_Channel_5: ADC Channel5 selected + * @arg ADC_Channel_6: ADC Channel6 selected + * @arg ADC_Channel_7: ADC Channel7 selected + * @arg ADC_Channel_8: ADC Channel8 selected + * @arg ADC_Channel_9: ADC Channel9 selected + * @arg ADC_Channel_10: ADC Channel10 selected + * @arg ADC_Channel_11: ADC Channel11 selected + * @arg ADC_Channel_12: ADC Channel12 selected + * @arg ADC_Channel_13: ADC Channel13 selected + * @arg ADC_Channel_14: ADC Channel14 selected + * @arg ADC_Channel_15: ADC Channel15 selected + * @arg ADC_Channel_16: ADC Channel16 selected + * @arg ADC_Channel_17: ADC Channel17 selected + * @arg ADC_Channel_18: ADC Channel18 selected + * @arg ADC_Channel_19: ADC Channel19 selected + * @arg ADC_Channel_20: ADC Channel20 selected + * @arg ADC_Channel_21: ADC Channel21 selected + * @arg ADC_Channel_22: ADC Channel22 selected + * @arg ADC_Channel_23: ADC Channel23 selected + * @arg ADC_Channel_24: ADC Channel24 selected + * @arg ADC_Channel_25: ADC Channel25 selected + * @arg ADC_Channel_27: ADC Channel27 selected + * @arg ADC_Channel_28: ADC Channel28 selected + * @arg ADC_Channel_29: ADC Channel29 selected + * @arg ADC_Channel_30: ADC Channel30 selected + * @arg ADC_Channel_31: ADC Channel31 selected + * @arg ADC_Channel_0b: ADC Channel0b selected + * @arg ADC_Channel_1b: ADC Channel1b selected + * @arg ADC_Channel_2b: ADC Channel2b selected + * @arg ADC_Channel_3b: ADC Channel3b selected + * @arg ADC_Channel_6b: ADC Channel6b selected + * @arg ADC_Channel_7b: ADC Channel7b selected + * @arg ADC_Channel_8b: ADC Channel8b selected + * @arg ADC_Channel_9b: ADC Channel9b selected + * @arg ADC_Channel_10b: ADC Channel10b selected + * @arg ADC_Channel_11b: ADC Channel11b selected + * @arg ADC_Channel_12b: ADC Channel12b selected + * @param Rank: The rank in the injected group sequencer. This parameter + * must be between 1 to 4. + * @param ADC_SampleTime: The sample time value to be set for the selected + * channel. This parameter can be one of the following values: + * @arg ADC_SampleTime_4Cycles: Sample time equal to 4 cycles + * @arg ADC_SampleTime_9Cycles: Sample time equal to 9 cycles + * @arg ADC_SampleTime_16Cycles: Sample time equal to 16 cycles + * @arg ADC_SampleTime_24Cycles: Sample time equal to 24 cycles + * @arg ADC_SampleTime_48Cycles: Sample time equal to 48 cycles + * @arg ADC_SampleTime_96Cycles: Sample time equal to 96 cycles + * @arg ADC_SampleTime_192Cycles: Sample time equal to 192 cycles + * @arg ADC_SampleTime_384Cycles: Sample time equal to 384 cycles + * @retval None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CHANNEL(ADC_Channel)); + assert_param(IS_ADC_INJECTED_RANK(Rank)); + assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); + + /* If ADC_Channel_30 or ADC_Channel_31 is selected */ + if (ADC_Channel > ADC_Channel_29) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR0; + /* Calculate the mask to clear */ + tmpreg2 = SMPR0_SMP_SET << (3 * (ADC_Channel - 30)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 30)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR0 = tmpreg1; + } + /* If ADC_Channel_20 ... ADC_Channel_29 is selected */ + else if (ADC_Channel > ADC_Channel_19) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR1; + /* Calculate the mask to clear */ + tmpreg2 = SMPR1_SMP_SET << (3 * (ADC_Channel - 20)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 20)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR1 = tmpreg1; + } + /* If ADC_Channel_10 ... ADC_Channel_19 is selected */ + else if (ADC_Channel > ADC_Channel_9) + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR2; + /* Calculate the mask to clear */ + tmpreg2 = SMPR2_SMP_SET << (3 * (ADC_Channel - 10)); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR2 = tmpreg1; + } + else /* ADC_Channel include in ADC_Channel_[0..9] */ + { + /* Get the old register value */ + tmpreg1 = ADCx->SMPR3; + /* Calculate the mask to clear */ + tmpreg2 = SMPR3_SMP_SET << (3 * ADC_Channel); + /* Clear the old sample time */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set */ + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + /* Set the new sample time */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->SMPR3 = tmpreg1; + } + + /* Rank configuration */ + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Get JL value: Number = JL+1 */ + tmpreg3 = (tmpreg1 & JSQR_JL_SET)>> 20; + /* Calculate the mask to clear: ((Rank-1)+(4- (JL+1))) */ + tmpreg2 = (uint32_t)(JSQR_JSQ_SET << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)))); + /* Clear the old JSQx bits for the selected rank */ + tmpreg1 &= ~tmpreg2; + /* Calculate the mask to set: ((Rank-1)+(4- (JL+1))) */ + tmpreg2 = (uint32_t)(((uint32_t)(ADC_Channel)) << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)))); + /* Set the JSQx bits for the selected rank */ + tmpreg1 |= tmpreg2; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Configures the sequencer length for injected channels. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param Length: The sequencer length. + * This parameter must be a number between 1 to 4. + * @retval None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_LENGTH(Length)); + + /* Get the old register value */ + tmpreg1 = ADCx->JSQR; + /* Clear the old injected sequence length JL bits */ + tmpreg1 &= JSQR_JL_RESET; + /* Set the injected sequence length JL bits */ + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + /* Store the new register value */ + ADCx->JSQR = tmpreg1; +} + +/** + * @brief Set the injected channels conversion value offset. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_InjectedChannel: the ADC injected channel to set its offset. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected. + * @arg ADC_InjectedChannel_2: Injected Channel2 selected. + * @arg ADC_InjectedChannel_3: Injected Channel3 selected. + * @arg ADC_InjectedChannel_4: Injected Channel4 selected. + * @param Offset: the offset value for the selected ADC injected channel + * This parameter must be a 12bit value. + * @retval None + */ +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + assert_param(IS_ADC_OFFSET(Offset)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + /* Set the selected injected channel data offset */ + *(__IO uint32_t *) tmp = (uint32_t)Offset; +} + +/** + * @brief Configures the ADCx external trigger for injected channels conversion. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected + * conversion. This parameter can be one of the following values: + * @arg ADC_ExternalTrigInjecConv_T9_CC1: Timer9 capture compare1 selected + * @arg ADC_ExternalTrigInjecConv_T9_TRGO: Timer9 TRGO event selected + * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected + * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected + * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected + * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected + * @arg ADC_ExternalTrigInjecConv_T4_CC1: Timer4 capture compare1 selected + * @arg ADC_ExternalTrigInjecConv_T4_CC2: Timer4 capture compare2 selected + * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected + * @arg ADC_ExternalTrigInjecConv_T10_CC1: Timer10 capture compare1 selected + * @arg ADC_ExternalTrigInjecConv_T7_TRGO: Timer7 TRGO event selected + * @arg ADC_ExternalTrigInjecConv_Ext_IT15: External interrupt line 15 event selected + * @retval None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); + + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old external event selection for injected group */ + tmpreg &= CR2_JEXTSEL_RESET; + /* Set the external event selection for injected group */ + tmpreg |= ADC_ExternalTrigInjecConv; + /* Store the new register value */ + ADCx->CR2 = tmpreg; +} + +/** + * @brief Configures the ADCx external trigger edge for injected channels conversion. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_ExternalTrigInjecConvEdge: specifies the ADC external trigger + * edge to start injected conversion. + * This parameter can be one of the following values: + * @arg ADC_ExternalTrigConvEdge_None: external trigger disabled for + * injected conversion. + * @arg ADC_ExternalTrigConvEdge_Rising: detection on rising edge + * @arg ADC_ExternalTrigConvEdge_Falling: detection on falling edge + * @arg ADC_ExternalTrigConvEdge_RisingFalling: detection on + * both rising and falling edge + * @retval None + */ +void ADC_ExternalTrigInjectedConvEdgeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConvEdge) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(ADC_ExternalTrigInjecConvEdge)); + + /* Get the old register value */ + tmpreg = ADCx->CR2; + /* Clear the old external trigger edge for injected group */ + tmpreg &= CR2_JEXTEN_RESET; + /* Set the new external trigger edge for injected group */ + tmpreg |= ADC_ExternalTrigInjecConvEdge; + /* Store the new register value */ + ADCx->CR2 = tmpreg; +} + +/** + * @brief Enables the selected ADC software start conversion of the injected + * channels. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @retval None + */ +void ADC_SoftwareStartInjectedConv(ADC_TypeDef* ADCx) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + /* Enable the selected ADC conversion for injected group */ + ADCx->CR2 |= (uint32_t)ADC_CR2_JSWSTART; +} + +/** + * @brief Gets the selected ADC Software start injected conversion Status. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @retval The new state of ADC software start injected conversion (SET or RESET). + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + + /* Check the status of JSWSTART bit */ + if ((ADCx->CR2 & ADC_CR2_JSWSTART) != (uint32_t)RESET) + { + /* JSWSTART bit is set */ + bitstatus = SET; + } + else + { + /* JSWSTART bit is reset */ + bitstatus = RESET; + } + /* Return the JSWSTART bit status */ + return bitstatus; +} + +/** + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC auto injected + * conversion. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC automatic injected group conversion */ + ADCx->CR1 |= (uint32_t)ADC_CR1_JAUTO; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + ADCx->CR1 &= (uint32_t)(~ADC_CR1_JAUTO); + } +} + +/** + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param NewState: new state of the selected ADC discontinuous mode + * on injected group channel. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC injected discontinuous mode */ + ADCx->CR1 |= (uint32_t)ADC_CR1_JDISCEN; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + ADCx->CR1 &= (uint32_t)(~ADC_CR1_JDISCEN); + } +} + +/** + * @brief Returns the ADC injected channel conversion result. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_InjectedChannel: the converted ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_InjectedChannel_1: Injected Channel1 selected + * @arg ADC_InjectedChannel_2: Injected Channel2 selected + * @arg ADC_InjectedChannel_3: Injected Channel3 selected + * @arg ADC_InjectedChannel_4: Injected Channel4 selected + * @retval The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + JDR_OFFSET; + + /* Returns the selected injected channel conversion data value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @} + */ + +/** @defgroup ADC_Group8 Interrupts and flags management functions + * @brief Interrupts and flags management functions. + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + [..] This section provides functions allowing to configure the ADC Interrupts + and get the status and clear flags and Interrupts pending bits. + + [..] The ADC provide 4 Interrupts sources and 9 Flags which can be divided into + 3 groups: + *** Flags and Interrupts for ADC regular channels *** + ===================================================== + [..] + (+)Flags : + (##) ADC_FLAG_OVR : Overrun detection when regular converted data are + lost. + (##) ADC_FLAG_EOC : Regular channel end of conversion + to indicate + (depending on EOCS bit, managed by ADC_EOCOnEachRegularChannelCmd() ) + the end of : + (+++) a regular CHANNEL conversion. + (+++) sequence of regular GROUP conversions. + + + (##) ADC_FLAG_STRT: Regular channel start + to indicate when regular + CHANNEL conversion starts. + (##) ADC_FLAG_RCNR: Regular channel not ready + to indicate if a new + regular conversion can be launched. + (+)Interrupts : + (##) ADC_IT_OVR : specifies the interrupt source for Overrun detection + event. + (##) ADC_IT_EOC : specifies the interrupt source for Regular channel + end of conversion event. + + *** Flags and Interrupts for ADC Injected channels *** + ====================================================== + (+)Flags : + (##) ADC_FLAG_JEOC : Injected channel end of conversion+ to indicate at + the end of injected GROUP conversion. + (##) ADC_FLAG_JSTRT: Injected channel start + to indicate hardware when + injected GROUP conversion starts. + (##) ADC_FLAG_JCNR: Injected channel not ready + to indicate if a new + injected conversion can be launched. + (+)Interrupts + (##) ADC_IT_JEOC : specifies the interrupt source for Injected channel + end of conversion event. + *** General Flags and Interrupts for the ADC *** + ================================================ + (+)Flags : + (##) ADC_FLAG_AWD: Analog watchdog + to indicate if the converted voltage + crosses the programmed thresholds values. + (##) ADC_FLAG_ADONS: ADC ON status + to indicate if the ADC is ready + to convert. + (+)Interrupts : + (##) ADC_IT_AWD : specifies the interrupt source for Analog watchdog + event. + + [..] The user should identify which mode will be used in his application to + manage the ADC controller events: Polling mode or Interrupt mode. + + [..] In the Polling Mode it is advised to use the following functions: + (+) ADC_GetFlagStatus() : to check if flags events occur. + (+) ADC_ClearFlag() : to clear the flags events. + + [..] In the Interrupt Mode it is advised to use the following functions: + (+) ADC_ITConfig() : to enable or disable the interrupt source. + (+) ADC_GetITStatus() : to check if Interrupt occurs. + (+) ADC_ClearITPendingBit() : to clear the Interrupt pending Bit + (corresponding Flag). +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified ADC interrupts. + * @param ADCx: where x can be 1 to select the ADC peripheral. + * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt + * @arg ADC_IT_AWD: Analog watchdog interrupt + * @arg ADC_IT_JEOC: End of injected conversion interrupt + * @arg ADC_IT_OVR: overrun interrupt + * @param NewState: new state of the specified ADC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint32_t itmask = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_IT(ADC_IT)); + + /* Get the ADC IT index */ + itmask = (uint8_t)ADC_IT; + itmask = (uint32_t)0x01 << itmask; + + if (NewState != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->CR1 |= itmask; + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->CR1 &= (~(uint32_t)itmask); + } +} + +/** + * @brief Checks whether the specified ADC flag is set or not. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @arg ADC_FLAG_OVR: Overrun flag + * @arg ADC_FLAG_ADONS: ADC ON status + * @arg ADC_FLAG_RCNR: Regular channel not ready + * @arg ADC_FLAG_JCNR: Injected channel not ready + * @retval The new state of ADC_FLAG (SET or RESET). + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint16_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); + + /* Check the status of the specified ADC flag */ + if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET) + { + /* ADC_FLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the ADC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx's pending flags. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ADC_FLAG_AWD: Analog watchdog flag + * @arg ADC_FLAG_EOC: End of conversion flag + * @arg ADC_FLAG_JEOC: End of injected group conversion flag + * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag + * @arg ADC_FLAG_STRT: Start of regular group conversion flag + * @arg ADC_FLAG_OVR: overrun flag + * @retval None + */ +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint16_t ADC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); + + /* Clear the selected ADC flags */ + ADCx->SR = ~(uint32_t)ADC_FLAG; +} + +/** + * @brief Checks whether the specified ADC interrupt has occurred or not. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_IT: specifies the ADC interrupt source to check. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt + * @arg ADC_IT_AWD: Analog watchdog interrupt + * @arg ADC_IT_JEOC: End of injected conversion interrupt + * @arg ADC_IT_OVR: Overrun interrupt + * @retval The new state of ADC_IT (SET or RESET). + */ +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_IT(ADC_IT)); + + /* Get the ADC IT index */ + itmask = (uint32_t)((uint32_t)ADC_IT >> 8); + + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->CR1 & ((uint32_t)0x01 << (uint8_t)ADC_IT)); + + /* Check the status of the specified ADC interrupt */ + if (((uint32_t)(ADCx->SR & (uint32_t)itmask) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + /* ADC_IT is set */ + bitstatus = SET; + } + else + { + /* ADC_IT is reset */ + bitstatus = RESET; + } + /* Return the ADC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the ADCx's interrupt pending bits. + * @param ADCx: where x can be 1 to select the ADC1 peripheral. + * @param ADC_IT: specifies the ADC interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg ADC_IT_EOC: End of conversion interrupt + * @arg ADC_IT_AWD: Analog watchdog interrupt + * @arg ADC_IT_JEOC: End of injected conversion interrupt + * @arg ADC_IT_OVR: Overrun interrupt + * @retval None + */ +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_PERIPH(ADCx)); + assert_param(IS_ADC_IT(ADC_IT)); + + /* Get the ADC IT index */ + itmask = (uint8_t)(ADC_IT >> 8); + + /* Clear the selected ADC interrupt pending bits */ + ADCx->SR = ~(uint32_t)itmask; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes.c new file mode 100644 index 0000000..9f96814 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes.c @@ -0,0 +1,599 @@ +/** + ****************************************************************************** + * @file stm32l1xx_aes.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the AES peripheral: + * + Configuration + * + Read/Write operations + * + DMA transfers management + * + Interrupts and flags management + * + * @verbatim + =============================================================================== + ##### AES Peripheral features ##### + =============================================================================== +....[..] + (#) The Advanced Encryption Standard hardware accelerator (AES) can be used + to both encipher and decipher data using AES algorithm. + (#) The AES supports 4 operation modes: + (++) Encryption: It consumes 214 clock cycle when processing one 128-bit block + (++) Decryption: It consumes 214 clock cycle when processing one 128-bit block + (++) Key derivation for decryption: It consumes 80 clock cycle when processing one 128-bit block + (++) Key Derivation and decryption: It consumes 288 clock cycle when processing one 128-bit blobk + (#) Moreover 3 chaining modes are supported: + (++) Electronic codebook (ECB): Each plain text is encrypted/decrypted separately + (++) Cipher block chaining (CBC): Each block is XORed with the previous block + (++) Counter mode (CTR): A 128-bit counter is encrypted and then XORed with the + plain text to give the cipher text + (#) The AES peripheral supports data swapping: 1-bit, 8-bit, 16-bit and 32-bit. + (#) The AES peripheral supports write/read error handling with interrupt capability. + (#) Automatic data flow control with support of direct memory access (DMA) using + 2 channels, one for incoming data (DMA2 Channel5), and one for outcoming data + (DMA2 Channel3). + + ##### How to use this driver ##### + =============================================================================== + [..] + (#) AES AHB clock must be enabled to get write access to AES registers + using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_AES, ENABLE). + (#) Initialize the key using AES_KeyInit(). + (#) Configure the AES operation mode using AES_Init(). + (#) If required, enable interrupt source using AES_ITConfig() and + enable the AES interrupt vector using NVIC_Init(). + (#) If required, when using the DMA mode. + (##) Configure the DMA using DMA_Init(). + (##) Enable DMA requests using AES_DMAConfig(). + (#) Enable the AES peripheral using AES_Cmd(). + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_aes.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup AES + * @brief AES driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define CR_CLEAR_MASK ((uint32_t)0xFFFFFF81) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup AES_Private_Functions + * @{ + */ + +/** @defgroup AES_Group1 Initialization and configuration + * @brief Initialization and configuration. + * +@verbatim + =============================================================================== + ##### Initialization and configuration ##### + =============================================================================== + +@endverbatim + * @{ + */ + + /** + * @brief Deinitializes AES peripheral registers to their default reset values. + * @param None + * @retval None + */ +void AES_DeInit(void) +{ + /* Enable AES reset state */ + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_AES, ENABLE); + /* Release AES from reset state */ + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_AES, DISABLE); +} + +/** + * @brief Initializes the AES peripheral according to the specified parameters + * in the AES_InitStruct: + * - AES_Operation: specifies the operation mode (encryption, decryption...). + * - AES_Chaining: specifies the chaining mode (ECB, CBC or CTR). + * - AES_DataType: specifies the data swapping type: 32-bit, 16-bit, 8-bit or 1-bit. + * @note If AES is already enabled, use AES_Cmd(DISABLE) before setting the new + * configuration (When AES is enabled, setting configuration is forbidden). + * @param AES_InitStruct: pointer to an AES_InitTypeDef structure that contains + * the configuration information for AES peripheral. + * @retval None + */ +void AES_Init(AES_InitTypeDef* AES_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_AES_MODE(AES_InitStruct->AES_Operation)); + assert_param(IS_AES_CHAINING(AES_InitStruct->AES_Chaining)); + assert_param(IS_AES_DATATYPE(AES_InitStruct->AES_DataType)); + + /* Get AES CR register value */ + tmpreg = AES->CR; + + /* Clear DATATYPE[1:0], MODE[1:0] and CHMOD[1:0] bits */ + tmpreg &= (uint32_t)CR_CLEAR_MASK; + + tmpreg |= (AES_InitStruct->AES_Operation | AES_InitStruct->AES_Chaining | AES_InitStruct->AES_DataType); + + AES->CR = (uint32_t) tmpreg; +} + +/** + * @brief Initializes the AES Keys according to the specified parameters in the AES_KeyInitStruct. + * @param AES_KeyInitStruct: pointer to an AES_KeyInitTypeDef structure that + * contains the configuration information for the specified AES Keys. + * @note This function must be called while the AES is disabled. + * @note In encryption, key derivation and key derivation + decryption modes, + * AES_KeyInitStruct must contain the encryption key. + * In decryption mode, AES_KeyInitStruct must contain the decryption key. + * @retval None + */ +void AES_KeyInit(AES_KeyInitTypeDef* AES_KeyInitStruct) +{ + AES->KEYR0 = AES_KeyInitStruct->AES_Key0; + AES->KEYR1 = AES_KeyInitStruct->AES_Key1; + AES->KEYR2 = AES_KeyInitStruct->AES_Key2; + AES->KEYR3 = AES_KeyInitStruct->AES_Key3; +} + +/** + * @brief Initializes the AES Initialization Vector IV according to + * the specified parameters in the AES_IVInitStruct. + * @param AES_KeyInitStruct: pointer to an AES_IVInitTypeDef structure that + * contains the configuration information for the specified AES IV. + * @note When ECB chaining mode is selected, Initialization Vector IV has no + * meaning. + * When CTR chaining mode is selected, AES_IV0 contains the CTR value. + * AES_IV1, AES_IV2 and AES_IV3 contains nonce value. + * @retval None + */ +void AES_IVInit(AES_IVInitTypeDef* AES_IVInitStruct) +{ + AES->IVR0 = AES_IVInitStruct->AES_IV0; + AES->IVR1 = AES_IVInitStruct->AES_IV1; + AES->IVR2 = AES_IVInitStruct->AES_IV2; + AES->IVR3 = AES_IVInitStruct->AES_IV3; +} + +/** + * @brief Enable or disable the AES peripheral. + * @param NewState: new state of the AES peripheral. + * This parameter can be: ENABLE or DISABLE. + * @note The key must be written while AES is disabled. + * @retval None + */ +void AES_Cmd(FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the AES peripheral */ + AES->CR |= (uint32_t) AES_CR_EN; /**< AES Enable */ + } + else + { + /* Disable the AES peripheral */ + AES->CR &= (uint32_t)(~AES_CR_EN); /**< AES Disable */ + } +} + +/** + * @} + */ + +/** @defgroup AES_Group2 Structures initialization functions + * @brief Structures initialization. + * +@verbatim + =============================================================================== + ##### Structures initialization functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Fills each AES_InitStruct member with its default value. + * @param AES_InitStruct: pointer to an AES_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void AES_StructInit(AES_InitTypeDef* AES_InitStruct) +{ + AES_InitStruct->AES_Operation = AES_Operation_Encryp; + AES_InitStruct->AES_Chaining = AES_Chaining_ECB; + AES_InitStruct->AES_DataType = AES_DataType_32b; +} + +/** + * @brief Fills each AES_KeyInitStruct member with its default value. + * @param AES_KeyInitStruct: pointer to an AES_KeyInitStruct structure which + * will be initialized. + * @retval None + */ +void AES_KeyStructInit(AES_KeyInitTypeDef* AES_KeyInitStruct) +{ + AES_KeyInitStruct->AES_Key0 = 0x00000000; + AES_KeyInitStruct->AES_Key1 = 0x00000000; + AES_KeyInitStruct->AES_Key2 = 0x00000000; + AES_KeyInitStruct->AES_Key3 = 0x00000000; +} + +/** + * @brief Fills each AES_IVInitStruct member with its default value. + * @param AES_IVInitStruct: pointer to an AES_IVInitTypeDef structure which + * will be initialized. + * @retval None + */ +void AES_IVStructInit(AES_IVInitTypeDef* AES_IVInitStruct) +{ + AES_IVInitStruct->AES_IV0 = 0x00000000; + AES_IVInitStruct->AES_IV1 = 0x00000000; + AES_IVInitStruct->AES_IV2 = 0x00000000; + AES_IVInitStruct->AES_IV3 = 0x00000000; +} + +/** + * @} + */ + +/** @defgroup AES_Group3 AES Read and Write + * @brief AES Read and Write. + * +@verbatim + =============================================================================== + ##### AES Read and Write functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Write data in DINR register to be processed by AES peripheral. + * @note To process 128-bit data (4 * 32-bit), this function must be called + * four times to write the 128-bit data in the 32-bit register DINR. + * @note When an unexpected write to DOUTR register is detected, WRERR flag is + * set. + * @param Data: The data to be processed. + * @retval None + */ +void AES_WriteSubData(uint32_t Data) +{ + /* Write Data */ + AES->DINR = Data; +} + +/** + * @brief Returns the data in DOUTR register processed by AES peripheral. + * @note This function must be called four times to get the 128-bit data. + * @note When an unexpected read of DINR register is detected, RDERR flag is + * set. + * @retval The processed data. + */ +uint32_t AES_ReadSubData(void) +{ + /* Read Data */ + return AES->DOUTR; +} + +/** + * @brief Read the Key value. + * @param AES_KeyInitStruct: pointer to an AES_KeyInitTypeDef structure which + * will contain the key. + * @note When the key derivation mode is selected, AES must be disabled + * (AES_Cmd(DISABLE)) before reading the decryption key. + * Reading the key while the AES is enabled will return unpredictable + * value. + * @retval None + */ +void AES_ReadKey(AES_KeyInitTypeDef* AES_KeyInitStruct) +{ + AES_KeyInitStruct->AES_Key0 = AES->KEYR0; + AES_KeyInitStruct->AES_Key1 = AES->KEYR1; + AES_KeyInitStruct->AES_Key2 = AES->KEYR2; + AES_KeyInitStruct->AES_Key3 = AES->KEYR3; +} + +/** + * @brief Read the Initialization Vector IV value. + * @param AES_IVInitStruct: pointer to an AES_IVInitTypeDef structure which + * will contain the Initialization Vector IV. + * @note When the AES is enabled Reading the Initialization Vector IV value + * will return 0. The AES must be disabled using AES_Cmd(DISABLE) + * to get the right value. + * @note When ECB chaining mode is selected, Initialization Vector IV has no + * meaning. + * When CTR chaining mode is selected, AES_IV0 contains 32-bit Counter value. + * AES_IV1, AES_IV2 and AES_IV3 contains nonce value. + * @retval None + */ +void AES_ReadIV(AES_IVInitTypeDef* AES_IVInitStruct) +{ + AES_IVInitStruct->AES_IV0 = AES->IVR0; + AES_IVInitStruct->AES_IV1 = AES->IVR1; + AES_IVInitStruct->AES_IV2 = AES->IVR2; + AES_IVInitStruct->AES_IV3 = AES->IVR3; +} + +/** + * @} + */ + +/** @defgroup AES_Group4 DMA transfers management functions + * @brief DMA transfers management function. + * +@verbatim + =============================================================================== + ##### DMA transfers management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the AES DMA interface. + * @param AES_DMATransfer: Specifies the AES DMA transfer. + * This parameter can be one of the following values: + * @arg AES_DMATransfer_In: When selected, DMA manages the data input phase. + * @arg AES_DMATransfer_Out: When selected, DMA manages the data output phase. + * @arg AES_DMATransfer_InOut: When selected, DMA manages both the data input/output phases. + * @param NewState Indicates the new state of the AES DMA interface. + * This parameter can be: ENABLE or DISABLE. + * @note The DMA has no action in key derivation mode. + * @retval None + */ +void AES_DMAConfig(uint32_t AES_DMATransfer, FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_AES_DMA_TRANSFER(AES_DMATransfer)); + + if (NewState != DISABLE) + { + /* Enable the DMA transfer */ + AES->CR |= (uint32_t) AES_DMATransfer; + } + else + { + /* Disable the DMA transfer */ + AES->CR &= (uint32_t)(~AES_DMATransfer); + } +} + +/** + * @} + */ + +/** @defgroup AES_Group5 Interrupts and flags management functions + * @brief Interrupts and flags management functions. + * +@verbatim + + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified AES interrupt. + * @param AES_IT: Specifies the AES interrupt source to enable/disable. + * This parameter can be any combinations of the following values: + * @arg AES_IT_CC: Computation Complete Interrupt. If enabled, once CCF + * flag is set an interrupt is generated. + * @arg AES_IT_ERR: Error Interrupt. If enabled, once a read error + * flags (RDERR) or write error flag (WRERR) is set, + * an interrupt is generated. + * @param NewState: The new state of the AES interrupt source. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void AES_ITConfig(uint32_t AES_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_AES_IT(AES_IT)); + + if (NewState != DISABLE) + { + AES->CR |= (uint32_t) AES_IT; /**< AES_IT Enable */ + } + else + { + AES->CR &= (uint32_t)(~AES_IT); /**< AES_IT Disable */ + } +} + +/** + * @brief Checks whether the specified AES flag is set or not. + * @param AES_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * @arg AES_FLAG_CCF: Computation Complete Flag is set by hardware when + * he computation phase is completed. + * @arg AES_FLAG_RDERR: Read Error Flag is set when an unexpected read + * operation of DOUTR register is detected. + * @arg AES_FLAG_WRERR: Write Error Flag is set when an unexpected write + * operation in DINR is detected. + * @retval FlagStatus (SET or RESET) + */ +FlagStatus AES_GetFlagStatus(uint32_t AES_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check parameters */ + assert_param(IS_AES_FLAG(AES_FLAG)); + + if ((AES->SR & AES_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the AES_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the AES flags. + * @param AES_FLAG: specifies the flag to clear. + * This parameter can be: + * @arg AES_FLAG_CCF: Computation Complete Flag is cleared by setting CCFC + * bit in CR register. + * @arg AES_FLAG_RDERR: Read Error is cleared by setting ERRC bit in + * CR register. + * @arg AES_FLAG_WRERR: Write Error is cleared by setting ERRC bit in + * CR register. + * @retval None + */ +void AES_ClearFlag(uint32_t AES_FLAG) +{ + /* Check the parameters */ + assert_param(IS_AES_FLAG(AES_FLAG)); + + /* Check if AES_FLAG is AES_FLAG_CCF */ + if (AES_FLAG == AES_FLAG_CCF) + { + /* Clear CCF flag by setting CCFC bit */ + AES->CR |= (uint32_t) AES_CR_CCFC; + } + else /* AES_FLAG is AES_FLAG_RDERR or AES_FLAG_WRERR */ + { + /* Clear RDERR and WRERR flags by setting ERRC bit */ + AES->CR |= (uint32_t) AES_CR_ERRC; + } +} + +/** + * @brief Checks whether the specified AES interrupt has occurred or not. + * @param AES_IT: Specifies the AES interrupt pending bit to check. + * This parameter can be: + * @arg AES_IT_CC: Computation Complete Interrupt. + * @arg AES_IT_ERR: Error Interrupt. + * @retval ITStatus The new state of AES_IT (SET or RESET). + */ +ITStatus AES_GetITStatus(uint32_t AES_IT) +{ + ITStatus itstatus = RESET; + uint32_t cciebitstatus = RESET, ccfbitstatus = RESET; + + /* Check parameters */ + assert_param(IS_AES_GET_IT(AES_IT)); + + cciebitstatus = AES->CR & AES_CR_CCIE; + ccfbitstatus = AES->SR & AES_SR_CCF; + + /* Check if AES_IT is AES_IT_CC */ + if (AES_IT == AES_IT_CC) + { + /* Check the status of the specified AES interrupt */ + if (((cciebitstatus) != (uint32_t)RESET) && ((ccfbitstatus) != (uint32_t)RESET)) + { + /* Interrupt occurred */ + itstatus = SET; + } + else + { + /* Interrupt didn't occur */ + itstatus = RESET; + } + } + else /* AES_IT is AES_IT_ERR */ + { + /* Check the status of the specified AES interrupt */ + if ((AES->CR & AES_CR_ERRIE) != RESET) + { + /* Check if WRERR or RDERR flags are set */ + if ((AES->SR & (uint32_t)(AES_SR_WRERR | AES_SR_RDERR)) != (uint16_t)RESET) + { + /* Interrupt occurred */ + itstatus = SET; + } + else + { + /* Interrupt didn't occur */ + itstatus = RESET; + } + } + else + { + /* Interrupt didn't occur */ + itstatus = (ITStatus) RESET; + } + } + + /* Return the AES_IT status */ + return itstatus; +} + +/** + * @brief Clears the AES's interrupt pending bits. + * @param AES_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combinations of the following values: + * @arg AES_IT_CC: Computation Complete Interrupt. + * @arg AES_IT_ERR: Error Interrupt. + * @retval None + */ +void AES_ClearITPendingBit(uint32_t AES_IT) +{ + /* Check the parameters */ + assert_param(IS_AES_IT(AES_IT)); + + /* Clear the interrupt pending bit */ + AES->CR |= (uint32_t) (AES_IT >> (uint32_t) 0x00000002); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes_util.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes_util.c new file mode 100644 index 0000000..d49306a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes_util.c @@ -0,0 +1,679 @@ +/** + ****************************************************************************** + * @file stm32l1xx_aes_util.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides high level functions to encrypt and decrypt an + * input message using AES in ECB/CBC/CTR modes. + * + * @verbatim + +================================================================================ + ##### How to use this driver ##### +================================================================================ + [..] + (#) Enable The AES controller clock using + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_AES, ENABLE); function. + + (#) Use AES_ECB_Encrypt() function to encrypt an input message in ECB mode. + (#) Use AES_ECB_Decrypt() function to decrypt an input message in ECB mode. + + (#) Use AES_CBC_Encrypt() function to encrypt an input message in CBC mode. + (#) Use AES_CBC_Decrypt() function to decrypt an input message in CBC mode. + + (#) Use AES_CTR_Encrypt() function to encrypt an input message in CTR mode. + (#) Use AES_CTR_Decrypt() function to decrypt an input message in CTR mode. + + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_aes.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup AES + * @brief AES driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define AES_CC_TIMEOUT ((uint32_t) 0x00010000) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup AES_Private_Functions + * @{ + */ + +/** @defgroup AES_Group6 High Level AES functions + * @brief High Level AES functions + * +@verbatim +================================================================================ + ##### High Level AES functions ##### +================================================================================ + +@endverbatim + * @{ + */ + +/** + * @brief Encrypt using AES in ECB Mode + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_ECB_Encrypt(uint8_t* Key, uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES Key initialisation */ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_Encryp; + AES_InitStructure.AES_Chaining = AES_Chaining_ECB; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @brief Decrypt using AES in ECB Mode + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_ECB_Decrypt(uint8_t* Key, uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES Key initialisation */ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_KeyDerivAndDecryp; + AES_InitStructure.AES_Chaining = AES_Chaining_ECB; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @brief Encrypt using AES in CBC Mode + * @param InitVectors: Initialisation Vectors used for AES algorithm. + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_CBC_Encrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + AES_IVInitTypeDef AES_IVInitStructure; + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + uint32_t ivaddr = (uint32_t)InitVectors; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES Key initialisation*/ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES Initialization Vectors */ + AES_IVInitStructure.AES_IV3 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV2 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV1 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV0 = __REV(*(uint32_t*)(ivaddr)); + AES_IVInit(&AES_IVInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_Encryp; + AES_InitStructure.AES_Chaining = AES_Chaining_CBC; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @brief Decrypt using AES in CBC Mode + * @param InitVectors: Initialisation Vectors used for AES algorithm. + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_CBC_Decrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + AES_IVInitTypeDef AES_IVInitStructure; + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + uint32_t ivaddr = (uint32_t)InitVectors; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES Key initialisation*/ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES Initialization Vectors */ + AES_IVInitStructure.AES_IV3 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV2 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV1 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV0 = __REV(*(uint32_t*)(ivaddr)); + AES_IVInit(&AES_IVInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_KeyDerivAndDecryp; + AES_InitStructure.AES_Chaining = AES_Chaining_CBC; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @brief Encrypt using AES in CTR Mode + * @param InitVectors: Initialisation Vectors used for AES algorithm. + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_CTR_Encrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + AES_IVInitTypeDef AES_IVInitStructure; + + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + uint32_t ivaddr = (uint32_t)InitVectors; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES key initialisation*/ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES Initialization Vectors */ + AES_IVInitStructure.AES_IV3 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV2= __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV1 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV0= __REV(*(uint32_t*)(ivaddr)); + AES_IVInit(&AES_IVInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_Encryp; + AES_InitStructure.AES_Chaining = AES_Chaining_CTR; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @brief Decrypt using AES in CTR Mode + * @param InitVectors: Initialisation Vectors used for AES algorithm. + * @param Key: Key used for AES algorithm. + * @param Input: pointer to the Input buffer. + * @param Ilength: length of the Input buffer, must be a multiple of 16 bytes. + * @param Output: pointer to the returned buffer. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Operation done + * - ERROR: Operation failed + */ +ErrorStatus AES_CTR_Decrypt(uint8_t* Key, uint8_t InitVectors[16], uint8_t* Input, uint32_t Ilength, uint8_t* Output) +{ + AES_InitTypeDef AES_InitStructure; + AES_KeyInitTypeDef AES_KeyInitStructure; + AES_IVInitTypeDef AES_IVInitStructure; + + ErrorStatus status = SUCCESS; + uint32_t keyaddr = (uint32_t)Key; + uint32_t inputaddr = (uint32_t)Input; + uint32_t outputaddr = (uint32_t)Output; + uint32_t ivaddr = (uint32_t)InitVectors; + __IO uint32_t counter = 0; + uint32_t ccstatus = 0; + uint32_t i = 0; + + /* AES Key initialisation*/ + AES_KeyInitStructure.AES_Key3 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key2 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key1 = __REV(*(uint32_t*)(keyaddr)); + keyaddr += 4; + AES_KeyInitStructure.AES_Key0 = __REV(*(uint32_t*)(keyaddr)); + AES_KeyInit(&AES_KeyInitStructure); + + /* AES Initialization Vectors */ + AES_IVInitStructure.AES_IV3 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV2 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV1 = __REV(*(uint32_t*)(ivaddr)); + ivaddr += 4; + AES_IVInitStructure.AES_IV0 = __REV(*(uint32_t*)(ivaddr)); + AES_IVInit(&AES_IVInitStructure); + + /* AES configuration */ + AES_InitStructure.AES_Operation = AES_Operation_KeyDerivAndDecryp; + AES_InitStructure.AES_Chaining = AES_Chaining_CTR; + AES_InitStructure.AES_DataType = AES_DataType_8b; + AES_Init(&AES_InitStructure); + + /* Enable AES */ + AES_Cmd(ENABLE); + + for(i = 0; ((i < Ilength) && (status != ERROR)); i += 16) + { + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + AES_WriteSubData(*(uint32_t*)(inputaddr)); + inputaddr += 4; + + /* Wait for CCF flag to be set */ + counter = 0; + do + { + ccstatus = AES_GetFlagStatus(AES_FLAG_CCF); + counter++; + }while((counter != AES_CC_TIMEOUT) && (ccstatus == RESET)); + + if (ccstatus == RESET) + { + status = ERROR; + } + else + { + /* Clear CCF flag */ + AES_ClearFlag(AES_FLAG_CCF); + + /* Read cipher text */ + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + *(uint32_t*)(outputaddr) = AES_ReadSubData(); + outputaddr += 4; + } + } + + /* Disable AES before starting new processing */ + AES_Cmd(DISABLE); + + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_comp.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_comp.c new file mode 100644 index 0000000..30f6945 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_comp.c @@ -0,0 +1,378 @@ +/** + ****************************************************************************** + * @file stm32l1xx_comp.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the comparators (COMP1 and COMP2) peripheral: + * + Comparators configuration + * + Window mode control + * + Internal Reference Voltage (VREFINT) output + * + * @verbatim + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] The device integrates two analog comparators COMP1 and COMP2: + (+) COMP1 is a fixed threshold (VREFINT) that shares the non inverting + input with the ADC channels. + (+) COMP2 is a rail-to-rail comparator whose the inverting input can be + selected among: DAC_OUT1, DAC_OUT2, 1/4 VREFINT, 1/2 VERFINT, 3/4 + VREFINT, VREFINT, PB3 and whose the output can be redirected to + embedded timers: TIM2, TIM3, TIM4, TIM10. + + (+) The two comparators COMP1 and COMP2 can be combined in window mode. + + -@- + (#@) Comparator APB clock must be enabled to get write access + to comparator register using + RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP, ENABLE). + + (#@) COMP1 comparator and ADC can't be used at the same time since + they share the same ADC switch matrix (analog switches). + + (#@) When an I/O is used as comparator input, the corresponding GPIO + registers should be configured in analog mode. + + (#@) Comparators outputs (CMP1OUT and CMP2OUT) are not mapped on + GPIO pin. They are only internal. + To get the comparator output level, use COMP_GetOutputLevel(). + + (#@) COMP1 and COMP2 outputs are internally connected to EXTI Line 21 + and EXTI Line 22 respectively. + Interrupts can be used by configuring the EXTI Line using the + EXTI peripheral driver. + + (#@) After enabling the comparator (COMP1 or COMP2), user should wait + for start-up time (tSTART) to get right output levels. + Please refer to product datasheet for more information on tSTART. + + (#@) Comparators cannot be used to exit the device from Sleep or Stop + mode when the internal reference voltage is switched off using + the PWR_UltraLowPowerCmd() function (ULP bit in the PWR_CR register). + + @endverbatim + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_comp.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup COMP + * @brief COMP driver modules. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup COMP_Private_Functions + * @{ + */ + +/** @defgroup COMP_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions. + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes COMP peripheral registers to their default reset values. + * @param None + * @retval None + */ +void COMP_DeInit(void) +{ + COMP->CSR = ((uint32_t)0x00000000); /*!< Set COMP->CSR to reset value */ +} + +/** + * @brief Initializes the COMP2 peripheral according to the specified parameters + * in the COMP_InitStruct. + * @note This function configures only COMP2. + * @note COMP2 comparator is enabled as soon as the INSEL[2:0] bits are + * different from "000". + * @param COMP_InitStruct: pointer to an COMP_InitTypeDef structure that contains + * the configuration information for the specified COMP peripheral. + * @retval None + */ +void COMP_Init(COMP_InitTypeDef* COMP_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_COMP_INVERTING_INPUT(COMP_InitStruct->COMP_InvertingInput)); + assert_param(IS_COMP_OUTPUT(COMP_InitStruct->COMP_OutputSelect)); + assert_param(IS_COMP_SPEED(COMP_InitStruct->COMP_Speed)); + + /*!< Get the COMP CSR value */ + tmpreg = COMP->CSR; + + /*!< Clear the INSEL[2:0], OUTSEL[1:0] and SPEED bits */ + tmpreg &= (uint32_t) (~(uint32_t) (COMP_CSR_OUTSEL | COMP_CSR_INSEL | COMP_CSR_SPEED)); + + /*!< Configure COMP: speed, inversion input selection and output redirection */ + /*!< Set SPEED bit according to COMP_InitStruct->COMP_Speed value */ + /*!< Set INSEL bits according to COMP_InitStruct->COMP_InvertingInput value */ + /*!< Set OUTSEL bits according to COMP_InitStruct->COMP_OutputSelect value */ + tmpreg |= (uint32_t)((COMP_InitStruct->COMP_Speed | COMP_InitStruct->COMP_InvertingInput + | COMP_InitStruct->COMP_OutputSelect)); + + /*!< The COMP2 comparator is enabled as soon as the INSEL[2:0] bits value are + different from "000" */ + /*!< Write to COMP_CSR register */ + COMP->CSR = tmpreg; +} + +/** + * @brief Enable or disable the COMP1 peripheral. + * @note After enabling COMP1, the following functions should be called to + * connect the selected GPIO input to COMP1 non inverting input: + * @note Enable switch control mode using SYSCFG_RISwitchControlModeCmd() + * @note Close VCOMP switch using SYSCFG_RIIOSwitchConfig() + * @note Close the I/O switch number n corresponding to the I/O + * using SYSCFG_RIIOSwitchConfig() + * @param NewState: new state of the COMP1 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @note This function enables/disables only the COMP1. + * @retval None + */ +void COMP_Cmd(FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the COMP1 */ + COMP->CSR |= (uint32_t) COMP_CSR_CMP1EN; + } + else + { + /* Disable the COMP1 */ + COMP->CSR &= (uint32_t)(~COMP_CSR_CMP1EN); + } +} + +/** + * @brief Return the output level (high or low) of the selected comparator. + * @note Comparator output is low when the noninverting input is at a lower + * voltage than the inverting input. + * @note Comparator output is high when the noninverting input is at a higher + * voltage than the inverting input. + * @note Comparators outputs aren't available on GPIO (outputs levels are + * only internal). The COMP1 and COMP2 outputs are connected internally + * to the EXTI Line 21 and Line 22 respectively. + * @param COMP_Selection: the selected comparator. + * This parameter can be one of the following values: + * @arg COMP_Selection_COMP1: COMP1 selected + * @arg COMP_Selection_COMP2: COMP2 selected + * @retval Returns the selected comparator output level. + */ +uint8_t COMP_GetOutputLevel(uint32_t COMP_Selection) +{ + uint8_t compout = 0x0; + + /* Check the parameters */ + assert_param(IS_COMP_ALL_PERIPH(COMP_Selection)); + + /* Check if Comparator 1 is selected */ + if(COMP_Selection == COMP_Selection_COMP1) + { + /* Check if comparator 1 output level is high */ + if((COMP->CSR & COMP_CSR_CMP1OUT) != (uint8_t) RESET) + { + /* Get Comparator 1 output level */ + compout = (uint8_t) COMP_OutputLevel_High; + } + /* comparator 1 output level is low */ + else + { + /* Get Comparator 1 output level */ + compout = (uint8_t) COMP_OutputLevel_Low; + } + } + /* Comparator 2 is selected */ + else + { + /* Check if comparator 2 output level is high */ + if((COMP->CSR & COMP_CSR_CMP2OUT) != (uint8_t) RESET) + { + /* Get Comparator output level */ + compout = (uint8_t) COMP_OutputLevel_High; + } + /* comparator 2 output level is low */ + else + { + /* Get Comparator 2 output level */ + compout = (uint8_t) COMP_OutputLevel_Low; + } + } + /* Return the comparator output level */ + return (uint8_t)(compout); +} + +/** + * @brief Close or Open the SW1 switch. + * @param NewState: new state of the SW1 switch. + * This parameter can be: ENABLE or DISABLE. + * @note ENABLE to close the SW1 switch + * @note DISABLE to open the SW1 switch + * @retval None. + */ +void COMP_SW1SwitchConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Close SW1 switch */ + COMP->CSR |= (uint32_t) COMP_CSR_SW1; + } + else + { + /* Open SW1 switch */ + COMP->CSR &= (uint32_t)(~COMP_CSR_SW1); + } +} + +/** + * @} + */ + +/** @defgroup COMP_Group2 Window mode control function + * @brief Window mode control function. + * +@verbatim + =============================================================================== + ##### Window mode control function ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the window mode. + * In window mode: + * @note COMP1 inverting input is fixed to VREFINT defining the first + * threshold. + * @note COMP2 inverting input is configurable (DAC_OUT1, DAC_OUT2, VREFINT + * sub-multiples, PB3) defining the second threshold. + * @note COMP1 and COMP2 non inverting inputs are connected together. + * @note In window mode, only the Group 6 (PB4 or PB5) can be used as + * noninverting inputs. + * @param NewState: new state of the window mode. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void COMP_WindowCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the window mode */ + COMP->CSR |= (uint32_t) COMP_CSR_WNDWE; + } + else + { + /* Disable the window mode */ + COMP->CSR &= (uint32_t)(~COMP_CSR_WNDWE); + } +} + +/** + * @} + */ + +/** @defgroup COMP_Group3 Internal Reference Voltage output function + * @brief Internal Reference Voltage (VREFINT) output function. + * +@verbatim + =============================================================================== + ##### Internal Reference Voltage (VREFINT) output function ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the output of internal reference voltage (VREFINT). + * The VREFINT output can be routed to any I/O in group 3: CH8 (PB0) or + * CH9 (PB1). + * To correctly use this function, the SYSCFG_RIIOSwitchConfig() function + * should be called after. + * @param NewState: new state of the Vrefint output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void COMP_VrefintOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the output of internal reference voltage */ + COMP->CSR |= (uint32_t) COMP_CSR_VREFOUTEN; + } + else + { + /* Disable the output of internal reference voltage */ + COMP->CSR &= (uint32_t) (~COMP_CSR_VREFOUTEN); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_crc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_crc.c new file mode 100644 index 0000000..c7a0af2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_crc.c @@ -0,0 +1,133 @@ +/** + ****************************************************************************** + * @file stm32l1xx_crc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides all the CRC firmware functions. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_crc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup CRC + * @brief CRC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup CRC_Private_Functions + * @{ + */ + +/** + * @brief Resets the CRC Data register (DR). + * @param None + * @retval None + */ +void CRC_ResetDR(void) +{ + /* Reset CRC generator */ + CRC->CR = CRC_CR_RESET; +} + +/** + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * @param Data: data word(32-bit) to compute its CRC. + * @retval 32-bit CRC + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DR = Data; + + return (CRC->DR); +} + +/** + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * @param pBuffer: pointer to the buffer containing the data to be computed. + * @param BufferLength: length of the buffer to be computed + * @retval 32-bit CRC + */ +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) +{ + uint32_t index = 0; + + for(index = 0; index < BufferLength; index++) + { + CRC->DR = pBuffer[index]; + } + return (CRC->DR); +} + +/** + * @brief Returns the current CRC value. + * @param None + * @retval 32-bit CRC + */ +uint32_t CRC_GetCRC(void) +{ + return (CRC->DR); +} + +/** + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * @param IDValue: 8-bit value to be stored in the ID register + * @retval None + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDR = IDValue; +} + +/** + * @brief Returns the 8-bit data stored in the Independent Data(ID) register. + * @param None + * @retval 8-bit value of the ID register + */ +uint8_t CRC_GetIDRegister(void) +{ + return (CRC->IDR); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dac.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dac.c new file mode 100644 index 0000000..834282a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dac.c @@ -0,0 +1,687 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dac.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Digital-to-Analog Converter (DAC) peripheral: + * + DAC channels configuration: trigger, output buffer, data format + * + DMA management + * + Interrupts and flags management + + * @verbatim + * + =============================================================================== + ##### DAC Peripheral features ##### + =============================================================================== + [..] The device integrates two 12-bit Digital Analog Converters that can + be used independently or simultaneously (dual mode): + (#) DAC channel1 with DAC_OUT1 (PA4) as output. + (#) DAC channel2 with DAC_OUT2 (PA5) as output. + + [..] Digital to Analog conversion can be non-triggered using DAC_Trigger_None + and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register using + DAC_SetChannel1Data()/DAC_SetChannel2Data. + + [..] Digital to Analog conversion can be triggered by: + (#) External event: EXTI Line 9 (any GPIOx_Pin9) using DAC_Trigger_Ext_IT9. + The used pin (GPIOx_Pin9) must be configured in input mode. + (#) Timers TRGO: TIM2, TIM4, TIM6, TIM7 and TIM9 + (DAC_Trigger_T2_TRGO, DAC_Trigger_T4_TRGO...). + The timer TRGO event should be selected using TIM_SelectOutputTrigger() + (#) Software using DAC_Trigger_Software. + + [..] Each DAC channel integrates an output buffer that can be used to + reduce the output impedance, and to drive external loads directly + without having to add an external operational amplifier. + To enable, the output buffer use + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + + [..] Refer to the device datasheet for more details about output impedance + value with and without output buffer. + + [..] Both DAC channels can be used to generate: + (#) Noise wave using DAC_WaveGeneration_Noise + (#) Triangle wave using DAC_WaveGeneration_Triangle + + [..] Wave generation can be disabled using DAC_WaveGeneration_None. + + [..] The DAC data format can be: + (#) 8-bit right alignment using DAC_Align_8b_R + (#) 12-bit left alignment using DAC_Align_12b_L + (#) 12-bit right alignment using DAC_Align_12b_R + + [..] The analog output voltage on each DAC channel pin is determined + by the following equation: DAC_OUTx = VREF+ * DOR / 4095 + with DOR is the Data Output Register. + VEF+ is the input voltage reference (refer to the device datasheet) + e.g. To set DAC_OUT1 to 0.7V, use + DAC_SetChannel1Data(DAC_Align_12b_R, 868); + Assuming that VREF+ = 3.3, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V. + + [..] A DMA1 request can be generated when an external trigger (but not + a software trigger) occurs if DMA1 requests are enabled using + DAC_DMACmd() + [..] DMA1 requests are mapped as following: + (#) DAC channel1 is mapped on DMA1 channel3 which must be already + configured. + (#) DAC channel2 is mapped on DMA1 channel4 which must be already + configured. + + ##### How to use this driver ##### + =============================================================================== + [..] + (+) DAC APB clock must be enabled to get write access to DAC registers using + RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE) + (+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode. + (+) Configure the DAC channel using DAC_Init() + (+) Enable the DAC channel using DAC_Cmd() + + @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_dac.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup DAC + * @brief DAC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* CR register Mask */ +#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) + +/* DAC Dual Channels SWTRIG masks */ +#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) +#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) + +/* DHR registers offsets */ +#define DHR12R1_OFFSET ((uint32_t)0x00000008) +#define DHR12R2_OFFSET ((uint32_t)0x00000014) +#define DHR12RD_OFFSET ((uint32_t)0x00000020) + +/* DOR register offset */ +#define DOR_OFFSET ((uint32_t)0x0000002C) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup DAC_Private_Functions + * @{ + */ + +/** @defgroup DAC_Group1 DAC channels configuration + * @brief DAC channels configuration: trigger, output buffer, data format. + * +@verbatim + =============================================================================== + ##### DAC channels configuration: trigger, output buffer, data format ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the DAC peripheral registers to their default reset values. + * @param None + * @retval None + */ +void DAC_DeInit(void) +{ + /* Enable DAC reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); + /* Release DAC from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); +} + +/** + * @brief Initializes the DAC peripheral according to the specified + * parameters in the DAC_InitStruct. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected. + * @arg DAC_Channel_2: DAC Channel2 selected. + * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that + * contains the configuration information for the specified DAC channel. + * @retval None + */ +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + + /* Check the DAC parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); + assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); + assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); + assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); + +/*---------------------------- DAC CR Configuration --------------------------*/ + /* Get the DAC CR value */ + tmpreg1 = DAC->CR; + /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ + tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel); + /* Configure for the selected DAC channel: buffer output, trigger, wave generation, + mask/amplitude for wave generation */ + /* Set TSELx and TENx bits according to DAC_Trigger value */ + /* Set WAVEx bits according to DAC_WaveGeneration value */ + /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ + /* Set BOFFx bit according to DAC_OutputBuffer value */ + tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer); + /* Calculate CR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << DAC_Channel; + /* Write to DAC CR */ + DAC->CR = tmpreg1; +} + +/** + * @brief Fills each DAC_InitStruct member with its default value. + * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) +{ +/*--------------- Reset DAC init structure parameters values -----------------*/ + /* Initialize the DAC_Trigger member */ + DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; + /* Initialize the DAC_WaveGeneration member */ + DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; + /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; + /* Initialize the DAC_OutputBuffer member */ + DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; +} + +/** + * @brief Enables or disables the specified DAC channel. + * @param DAC_Channel: The selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the DAC channel. + * This parameter can be: ENABLE or DISABLE. + * @note When the DAC channel is enabled the trigger source can no more + * be modified. + * @retval None + */ +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DAC channel */ + DAC->CR |= (DAC_CR_EN1 << DAC_Channel); + } + else + { + /* Disable the selected DAC channel */ + DAC->CR &= (~(DAC_CR_EN1 << DAC_Channel)); + } +} + +/** + * @brief Enables or disables the selected DAC channel software trigger. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel software trigger. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable software trigger for the selected DAC channel */ + DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4); + } + else + { + /* Disable software trigger for the selected DAC channel */ + DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4)); + } +} + +/** + * @brief Enables or disables simultaneously the two DAC channels software + * triggers. + * @param NewState: new state of the DAC channels software triggers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable software trigger for both DAC channels */ + DAC->SWTRIGR |= DUAL_SWTRIG_SET; + } + else + { + /* Disable software trigger for both DAC channels */ + DAC->SWTRIGR &= DUAL_SWTRIG_RESET; + } +} + +/** + * @brief Enables or disables the selected DAC channel wave generation. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_Wave: Specifies the wave type to enable or disable. + * This parameter can be one of the following values: + * @arg DAC_Wave_Noise: noise wave generation + * @arg DAC_Wave_Triangle: triangle wave generation + * @param NewState: new state of the selected DAC channel wave generation. + * This parameter can be: ENABLE or DISABLE. + * @note + * @retval None + */ +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_WAVE(DAC_Wave)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected wave generation for the selected DAC channel */ + DAC->CR |= DAC_Wave << DAC_Channel; + } + else + { + /* Disable the selected wave generation for the selected DAC channel */ + DAC->CR &= ~(DAC_Wave << DAC_Channel); + } +} + +/** + * @brief Set the specified data holding register value for DAC channel1. + * @param DAC_Align: Specifies the data alignment for DAC channel1. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R1_OFFSET + DAC_Align; + + /* Set the DAC channel1 selected data holding register */ + *(__IO uint32_t *) tmp = Data; +} + +/** + * @brief Set the specified data holding register value for DAC channel2. + * @param DAC_Align: Specifies the data alignment for DAC channel2. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data : Data to be loaded in the selected data holding register. + * @retval None + */ +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data)); + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R2_OFFSET + DAC_Align; + + /* Set the DAC channel2 selected data holding register */ + *(__IO uint32_t *)tmp = Data; +} + +/** + * @brief Set the specified data holding register value for dual channel DAC. + * @param DAC_Align: Specifies the data alignment for dual channel DAC. + * This parameter can be one of the following values: + * @arg DAC_Align_8b_R: 8bit right data alignment selected + * @arg DAC_Align_12b_L: 12bit left data alignment selected + * @arg DAC_Align_12b_R: 12bit right data alignment selected + * @param Data2: Data for DAC Channel2 to be loaded in the selected data + * holding register. + * @param Data1: Data for DAC Channel1 to be loaded in the selected data + * holding register. + * @note In dual mode, a unique register access is required to write in both + * DAC channels at the same time. + * @retval None + */ +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) +{ + uint32_t data = 0, tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_ALIGN(DAC_Align)); + assert_param(IS_DAC_DATA(Data1)); + assert_param(IS_DAC_DATA(Data2)); + + /* Calculate and set dual DAC data holding register value */ + if (DAC_Align == DAC_Align_8b_R) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12RD_OFFSET + DAC_Align; + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t *)tmp = data; +} + +/** + * @brief Returns the last data output value of the selected DAC channel. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @retval The selected DAC channel data output value. + */ +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + + tmp = (uint32_t) DAC_BASE ; + tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); + + /* Returns the DAC channel data output register value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/** + * @} + */ + +/** @defgroup DAC_Group2 DMA management functions + * @brief DMA management functions + * +@verbatim + =============================================================================== + ##### DMA management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified DAC channel DMA request. + * When enabled DMA1 is generated when an external trigger (EXTI Line9, + * TIM2, TIM4, TIM6, TIM7 or TIM9 but not a software trigger) occurs. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param NewState: new state of the selected DAC channel DMA request. + * This parameter can be: ENABLE or DISABLE. + * @note The DAC channel1 (channel2) is mapped on DMA1 channel3 (channel4) which + * must be already configured. + * @retval None + */ +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DAC channel DMA request */ + DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel); + } + else + { + /* Disable the selected DAC channel DMA request */ + DAC->CR &= (~(DAC_CR_DMAEN1 << DAC_Channel)); + } +} + +/** + * @} + */ + +/** @defgroup DAC_Group3 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified DAC interrupts. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. + * This parameter can be the following value: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @note The DMA underrun occurs when a second external trigger arrives before + * the acknowledgement for the first external trigger is received (first request). + * @param NewState: new state of the specified DAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_DAC_IT(DAC_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected DAC interrupts */ + DAC->CR |= (DAC_IT << DAC_Channel); + } + else + { + /* Disable the selected DAC interrupts */ + DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); + } +} + +/** + * @brief Checks whether the specified DAC flag is set or not. + * @param DAC_Channel: thee selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_FLAG: specifies the flag to check. + * This parameter can be only of the following value: + * @arg DAC_FLAG_DMAUDR: DMA underrun flag + * @note The DMA underrun occurs when a second external trigger arrives before + * the acknowledgement for the first external trigger is received (first request). + * @retval The new state of DAC_FLAG (SET or RESET). + */ +FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_FLAG(DAC_FLAG)); + + /* Check the status of the specified DAC flag */ + if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) + { + /* DAC_FLAG is set */ + bitstatus = SET; + } + else + { + /* DAC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the DAC_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the DAC channel's pending flags. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_FLAG: specifies the flag to clear. + * This parameter can be the following value: + * @arg DAC_FLAG_DMAUDR: DMA underrun flag + * @retval None + */ +void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_FLAG(DAC_FLAG)); + + /* Clear the selected DAC flags */ + DAC->SR = (DAC_FLAG << DAC_Channel); +} + +/** + * @brief Checks whether the specified DAC interrupt has occurred or not. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt source to check. + * This parameter can be the following values: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @note The DMA underrun occurs when a second external trigger arrives before + * the acknowledgement for the first external trigger is received (first request). + * @retval The new state of DAC_IT (SET or RESET). + */ +ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_IT(DAC_IT)); + + /* Get the DAC_IT enable bit status */ + enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; + + /* Check the status of the specified DAC interrupt */ + if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) + { + /* DAC_IT is set */ + bitstatus = SET; + } + else + { + /* DAC_IT is reset */ + bitstatus = RESET; + } + /* Return the DAC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the DAC channel's interrupt pending bits. + * @param DAC_Channel: the selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_Channel_1: DAC Channel1 selected + * @arg DAC_Channel_2: DAC Channel2 selected + * @param DAC_IT: specifies the DAC interrupt pending bit to clear. + * This parameter can be the following values: + * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask + * @retval None + */ +void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) +{ + /* Check the parameters */ + assert_param(IS_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_DAC_IT(DAC_IT)); + + /* Clear the selected DAC interrupt pending bits */ + DAC->SR = (DAC_IT << DAC_Channel); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dbgmcu.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dbgmcu.c new file mode 100644 index 0000000..2462236 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dbgmcu.c @@ -0,0 +1,181 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dbgmcu.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides all the DBGMCU firmware functions. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_dbgmcu.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup DBGMCU + * @brief DBGMCU driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup DBGMCU_Private_Functions + * @{ + */ + +/** + * @brief Returns the device revision identifier. + * @param None + * @retval Device revision identifier + */ +uint32_t DBGMCU_GetREVID(void) +{ + return(DBGMCU->IDCODE >> 16); +} + +/** + * @brief Returns the device identifier. + * @param None + * @retval Device identifier + */ +uint32_t DBGMCU_GetDEVID(void) +{ + return(DBGMCU->IDCODE & IDCODE_DEVID_MASK); +} + +/** + * @brief Configures low power mode behavior when the MCU is in Debug mode. + * @param DBGMCU_Periph: specifies the low power mode. + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP: Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode + * @param NewState: new state of the specified low power mode in Debug mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + DBGMCU->CR |= DBGMCU_Periph; + } + else + { + DBGMCU->CR &= ~DBGMCU_Periph; + } +} + + +/** + * @brief Configures APB1 peripheral behavior when the MCU is in Debug mode. + * @param DBGMCU_Periph: specifies the APB1 peripheral. + * This parameter can be any combination of the following values: + * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted + * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted + * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted + * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted + * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted + * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted + * @arg DBGMCU_RTC_STOP: + * + On STM32L1xx Medium-density devices: RTC Wakeup counter stopped when + * Core is halted. + * + On STM32L1xx High-density and Medium-density Plus devices: RTC Calendar + * and Wakeup counter stopped when Core is halted. + * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted + * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is + * halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is + * halted + * @param NewState: new state of the specified APB1 peripheral in Debug mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DBGMCU_APB1PERIPH(DBGMCU_Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + DBGMCU->APB1FZ |= DBGMCU_Periph; + } + else + { + DBGMCU->APB1FZ &= ~DBGMCU_Periph; + } +} + +/** + * @brief Configures APB2 peripheral behavior when the MCU is in Debug mode. + * @param DBGMCU_Periph: specifies the APB2 peripheral. + * This parameter can be any combination of the following values: + * @arg DBGMCU_TIM9_STOP: TIM9 counter stopped when Core is halted + * @arg DBGMCU_TIM10_STOP: TIM10 counter stopped when Core is halted + * @arg DBGMCU_TIM11_STOP: TIM11 counter stopped when Core is halted + * @param NewState: new state of the specified APB2 peripheral in Debug mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DBGMCU_APB2PERIPH(DBGMCU_Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + DBGMCU->APB2FZ |= DBGMCU_Periph; + } + else + { + DBGMCU->APB2FZ &= ~DBGMCU_Periph; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dma.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dma.c new file mode 100644 index 0000000..f416e26 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dma.c @@ -0,0 +1,866 @@ +/** + ****************************************************************************** + * @file stm32l1xx_dma.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Direct Memory Access controller (DMA): + * + Initialization and Configuration + * + Data Counter + * + Interrupts and flags management + * + * @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable The DMA controller clock using + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) function for DMA1 or + using RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE) function for DMA2. + (#) Enable and configure the peripheral to be connected to the DMA channel + (except for internal SRAM / FLASH memories: no initialization is + necessary). + (#) For a given Channel, program the Source and Destination addresses, + the transfer Direction, the Buffer Size, the Peripheral and Memory + Incrementation mode and Data Size, the Circular or Normal mode, + the channel transfer Priority and the Memory-to-Memory transfer + mode (if needed) using the DMA_Init() function. + (#) Enable the NVIC and the corresponding interrupt(s) using the function + DMA_ITConfig() if you need to use DMA interrupts. + (#) Enable the DMA channel using the DMA_Cmd() function. + (#) Activate the needed channel Request using PPP_DMACmd() function for + any PPP peripheral except internal SRAM and FLASH (ie. SPI, USART ...) + The function allowing this operation is provided in each PPP peripheral + driver (ie. SPI_DMACmd for SPI peripheral). + (#) Optionally, you can configure the number of data to be transferred + when the channel is disabled (ie. after each Transfer Complete event + or when a Transfer Error occurs) using the function DMA_SetCurrDataCounter(). + And you can get the number of remaining data to be transferred using + the function DMA_GetCurrDataCounter() at run time (when the DMA channel is + enabled and running). + (#) To control DMA events you can use one of the following two methods: + (##) Check on DMA channel flags using the function DMA_GetFlagStatus(). + (##) Use DMA interrupts through the function DMA_ITConfig() at initialization + phase and DMA_GetITStatus() function into interrupt routines in + communication phase. + After checking on a flag you should clear it using DMA_ClearFlag() + function. And after checking on an interrupt event you should + clear it using DMA_ClearITPendingBit() function. + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_dma.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup DMA + * @brief DMA driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* DMA1 Channelx interrupt pending bit masks */ +#define DMA1_CHANNEL1_IT_MASK ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) +#define DMA1_CHANNEL2_IT_MASK ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) +#define DMA1_CHANNEL3_IT_MASK ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) +#define DMA1_CHANNEL4_IT_MASK ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) +#define DMA1_CHANNEL5_IT_MASK ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) +#define DMA1_CHANNEL6_IT_MASK ((uint32_t)(DMA_ISR_GIF6 | DMA_ISR_TCIF6 | DMA_ISR_HTIF6 | DMA_ISR_TEIF6)) +#define DMA1_CHANNEL7_IT_MASK ((uint32_t)(DMA_ISR_GIF7 | DMA_ISR_TCIF7 | DMA_ISR_HTIF7 | DMA_ISR_TEIF7)) + +/* DMA2 Channelx interrupt pending bit masks */ +#define DMA2_CHANNEL1_IT_MASK ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1)) +#define DMA2_CHANNEL2_IT_MASK ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2)) +#define DMA2_CHANNEL3_IT_MASK ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3)) +#define DMA2_CHANNEL4_IT_MASK ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4)) +#define DMA2_CHANNEL5_IT_MASK ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5)) + +/* DMA FLAG mask */ +#define FLAG_MASK ((uint32_t)0x10000000) + +/* DMA registers Masks */ +#define CCR_CLEAR_MASK ((uint32_t)0xFFFF800F) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + + +/** @defgroup DMA_Private_Functions + * @{ + */ + +/** @defgroup DMA_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This subsection provides functions allowing to initialize the DMA channel + source and destination addresses, incrementation and data sizes, transfer + direction, buffer size, circular/normal mode selection, memory-to-memory + mode selection and channel priority value. + [..] The DMA_Init() function follows the DMA configuration procedures as described + in reference manual (RM0038). +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the DMAy Channelx registers to their default reset + * values. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval None + */ +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN); + + /* Reset DMAy Channelx control register */ + DMAy_Channelx->CCR = 0; + + /* Reset DMAy Channelx remaining bytes register */ + DMAy_Channelx->CNDTR = 0; + + /* Reset DMAy Channelx peripheral address register */ + DMAy_Channelx->CPAR = 0; + + /* Reset DMAy Channelx memory address register */ + DMAy_Channelx->CMAR = 0; + + if (DMAy_Channelx == DMA1_Channel1) + { + /* Reset interrupt pending bits for DMA1 Channel1 */ + DMA1->IFCR |= DMA1_CHANNEL1_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel2) + { + /* Reset interrupt pending bits for DMA1 Channel2 */ + DMA1->IFCR |= DMA1_CHANNEL2_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel3) + { + /* Reset interrupt pending bits for DMA1 Channel3 */ + DMA1->IFCR |= DMA1_CHANNEL3_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel4) + { + /* Reset interrupt pending bits for DMA1 Channel4 */ + DMA1->IFCR |= DMA1_CHANNEL4_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel5) + { + /* Reset interrupt pending bits for DMA1 Channel5 */ + DMA1->IFCR |= DMA1_CHANNEL5_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel6) + { + /* Reset interrupt pending bits for DMA1 Channel6 */ + DMA1->IFCR |= DMA1_CHANNEL6_IT_MASK; + } + else if (DMAy_Channelx == DMA1_Channel7) + { + /* Reset interrupt pending bits for DMA1 Channel7 */ + DMA1->IFCR |= DMA1_CHANNEL7_IT_MASK; + } + else if (DMAy_Channelx == DMA2_Channel1) + { + /* Reset interrupt pending bits for DMA2 Channel1 */ + DMA2->IFCR |= DMA2_CHANNEL1_IT_MASK; + } + else if (DMAy_Channelx == DMA2_Channel2) + { + /* Reset interrupt pending bits for DMA2 Channel2 */ + DMA2->IFCR |= DMA2_CHANNEL2_IT_MASK; + } + else if (DMAy_Channelx == DMA2_Channel3) + { + /* Reset interrupt pending bits for DMA2 Channel3 */ + DMA2->IFCR |= DMA2_CHANNEL3_IT_MASK; + } + else if (DMAy_Channelx == DMA2_Channel4) + { + /* Reset interrupt pending bits for DMA2 Channel4 */ + DMA2->IFCR |= DMA2_CHANNEL4_IT_MASK; + } + else + { + if (DMAy_Channelx == DMA2_Channel5) + { + /* Reset interrupt pending bits for DMA2 Channel5 */ + DMA2->IFCR |= DMA2_CHANNEL5_IT_MASK; + } + } +} + +/** + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that + * contains the configuration information for the specified DMA Channel. + * @retval None + */ +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR)); + assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); + assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); + assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); + assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M)); + +/*--------------------------- DMAy Channelx CCR Configuration -----------------*/ + /* Get the DMAy_Channelx CCR value */ + tmpreg = DMAy_Channelx->CCR; + /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ + tmpreg &= CCR_CLEAR_MASK; + /* Configure DMAy Channelx: data transfer, data size, priority level and mode */ + /* Set DIR bit according to DMA_DIR value */ + /* Set CIRC bit according to DMA_Mode value */ + /* Set PINC bit according to DMA_PeripheralInc value */ + /* Set MINC bit according to DMA_MemoryInc value */ + /* Set PSIZE bits according to DMA_PeripheralDataSize value */ + /* Set MSIZE bits according to DMA_MemoryDataSize value */ + /* Set PL bits according to DMA_Priority value */ + /* Set the MEM2MEM bit according to DMA_M2M value */ + tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | + DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | + DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | + DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; + + /* Write to DMAy Channelx CCR */ + DMAy_Channelx->CCR = tmpreg; + +/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ + /* Write to DMAy Channelx CNDTR */ + DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize; + +/*--------------------------- DMAy Channelx CPAR Configuration ----------------*/ + /* Write to DMAy Channelx CPAR */ + DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr; + +/*--------------------------- DMAy Channelx CMAR Configuration ----------------*/ + /* Write to DMAy Channelx CMAR */ + DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr; +} + +/** + * @brief Fills each DMA_InitStruct member with its default value. + * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) +{ +/*-------------- Reset DMA init structure parameters values ------------------*/ + /* Initialize the DMA_PeripheralBaseAddr member */ + DMA_InitStruct->DMA_PeripheralBaseAddr = 0; + /* Initialize the DMA_MemoryBaseAddr member */ + DMA_InitStruct->DMA_MemoryBaseAddr = 0; + /* Initialize the DMA_DIR member */ + DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; + /* Initialize the DMA_BufferSize member */ + DMA_InitStruct->DMA_BufferSize = 0; + /* Initialize the DMA_PeripheralInc member */ + DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; + /* Initialize the DMA_MemoryInc member */ + DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; + /* Initialize the DMA_PeripheralDataSize member */ + DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + /* Initialize the DMA_MemoryDataSize member */ + DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + /* Initialize the DMA_Mode member */ + DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; + /* Initialize the DMA_Priority member */ + DMA_InitStruct->DMA_Priority = DMA_Priority_Low; + /* Initialize the DMA_M2M member */ + DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; +} + +/** + * @brief Enables or disables the specified DMAy Channelx. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param NewState: new state of the DMAy Channelx. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMAy Channelx */ + DMAy_Channelx->CCR |= DMA_CCR1_EN; + } + else + { + /* Disable the selected DMAy Channelx */ + DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN); + } +} + +/** + * @} + */ + +/** @defgroup DMA_Group2 Data Counter functions + * @brief Data Counter functions + * +@verbatim + =============================================================================== + ##### Data Counter functions ##### + =============================================================================== + [..] This subsection provides function allowing to configure and read the buffer + size (number of data to be transferred).The DMA data counter can be written + only when the DMA channel is disabled (ie. after transfer complete event). + [..] The following function can be used to write the Channel data counter value: + (+) void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t + DataNumber). + -@- It is advised to use this function rather than DMA_Init() in situations + where only the Data buffer needs to be reloaded. + [..] The DMA data counter can be read to indicate the number of remaining transfers + for the relative DMA channel. This counter is decremented at the end of each + data transfer and when the transfer is complete: + (+) If Normal mode is selected: the counter is set to 0. + (+) If Circular mode is selected: the counter is reloaded with the initial + value(configured before enabling the DMA channel). + [..] The following function can be used to read the Channel data counter value: + (+) uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx). + +@endverbatim + * @{ + */ + +/** + * @brief Sets the number of data units in the current DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DataNumber: The number of data units in the current DMAy Channelx + * transfer. + * @note This function can only be used when the DMAy_Channelx is disabled. + * @retval None. + */ +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + +/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ + /* Write to DMAy Channelx CNDTR */ + DMAy_Channelx->CNDTR = DataNumber; +} + +/** + * @brief Returns the number of remaining data units in the current + * DMAy Channelx transfer. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @retval The number of remaining data units in the current DMAy Channelx + * transfer. + */ +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + /* Return the number of remaining data units for DMAy Channelx */ + return ((uint16_t)(DMAy_Channelx->CNDTR)); +} + +/** + * @} + */ + +/** @defgroup DMA_Group3 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + [..] This subsection provides functions allowing to configure the DMA Interrupts + sources and check or clear the flags or pending bits status. + The user should identify which mode will be used in his application to manage + the DMA controller events: Polling mode or Interrupt mode. + *** Polling Mode *** + ==================== + [..] Each DMA channel can be managed through 4 event Flags:(y : DMA Controller + number x : DMA channel number ). + (#) DMAy_FLAG_TCx : to indicate that a Transfer Complete event occurred. + (#) DMAy_FLAG_HTx : to indicate that a Half-Transfer Complete event occurred. + (#) DMAy_FLAG_TEx : to indicate that a Transfer Error occurred. + (#) DMAy_FLAG_GLx : to indicate that at least one of the events described + above occurred. + -@- Clearing DMAy_FLAG_GLx results in clearing all other pending flags of the + same channel (DMAy_FLAG_TCx, DMAy_FLAG_HTx and DMAy_FLAG_TEx). + [..]In this Mode it is advised to use the following functions: + (+) FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG); + (+) void DMA_ClearFlag(uint32_t DMA_FLAG); + + *** Interrupt Mode *** + ====================== + [..] Each DMA channel can be managed through 4 Interrupts: + (+) Interrupt Source + (##) DMA_IT_TC: specifies the interrupt source for the Transfer Complete + event. + (##) DMA_IT_HT : specifies the interrupt source for the Half-transfer Complete + event. + (##) DMA_IT_TE : specifies the interrupt source for the transfer errors event. + (##) DMA_IT_GL : to indicate that at least one of the interrupts described + above occurred. + -@@- Clearing DMA_IT_GL interrupt results in clearing all other interrupts of + the same channel (DMA_IT_TCx, DMA_IT_HT and DMA_IT_TE). + [..]In this Mode it is advised to use the following functions: + (+) void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, + FunctionalState NewState); + (+) ITStatus DMA_GetITStatus(uint32_t DMA_IT); + (+) void DMA_ClearITPendingBit(uint32_t DMA_IT); + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified DMAy Channelx interrupts. + * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. + * @param DMA_IT: specifies the DMA interrupts sources to be enabled + * or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask + * @arg DMA_IT_HT: Half transfer interrupt mask + * @arg DMA_IT_TE: Transfer error interrupt mask + * @param NewState: new state of the specified DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); + assert_param(IS_DMA_CONFIG_IT(DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA interrupts */ + DMAy_Channelx->CCR |= DMA_IT; + } + else + { + /* Disable the selected DMA interrupts */ + DMAy_Channelx->CCR &= ~DMA_IT; + } +} + +/** + * @brief Checks whether the specified DMAy Channelx flag is set or not. + * @param DMAy_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * + * @note + * The Global flag (DMAy_FLAG_GLx) is set whenever any of the other flags + * relative to the same channel is set (Transfer Complete, Half-transfer + * Complete or Transfer Error flags: DMAy_FLAG_TCx, DMAy_FLAG_HTx or + * DMAy_FLAG_TEx). + * + * @retval The new state of DMAy_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_GET_FLAG(DMAy_FLAG)); + + /* Calculate the used DMAy */ + if ((DMAy_FLAG & FLAG_MASK) == (uint32_t)RESET) + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR; + } + else + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR; + } + + /* Check the status of the specified DMAy flag */ + if ((tmpreg & DMAy_FLAG) != (uint32_t)RESET) + { + /* DMAy_FLAG is set */ + bitstatus = SET; + } + else + { + /* DMAy_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the DMAy_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx's pending flags. + * @param DMAy_FLAG: specifies the flag to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. + * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. + * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. + * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. + * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. + * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. + * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. + * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. + * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. + * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. + * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. + * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. + * + * @note + * Clearing the Global flag (DMAy_FLAG_GLx) results in clearing all other flags + * relative to the same channel (Transfer Complete, Half-transfer Complete and + * Transfer Error flags: DMAy_FLAG_TCx, DMAy_FLAG_HTx and DMAy_FLAG_TEx). + * + * @retval None + */ +void DMA_ClearFlag(uint32_t DMAy_FLAG) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_FLAG(DMAy_FLAG)); + + if ((DMAy_FLAG & FLAG_MASK) == (uint32_t)RESET) + { + /* Clear the selected DMAy flags */ + DMA1->IFCR = DMAy_FLAG; + } + else + { + /* Clear the selected DMAy flags */ + DMA2->IFCR = DMAy_FLAG; + } +} + +/** + * @brief Checks whether the specified DMAy Channelx interrupt has occurred or not. + * @param DMAy_IT: specifies the DMAy interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * + * @note + * The Global interrupt (DMAy_FLAG_GLx) is set whenever any of the other + * interrupts relative to the same channel is set (Transfer Complete, + * Half-transfer Complete or Transfer Error interrupts: DMAy_IT_TCx, + * DMAy_IT_HTx or DMAy_IT_TEx). + * + * @retval The new state of DMAy_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMAy_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_DMA_GET_IT(DMAy_IT)); + + /* Calculate the used DMAy */ + if ((DMAy_IT & FLAG_MASK) == (uint32_t)RESET) + { + /* Get DMA1 ISR register value */ + tmpreg = DMA1->ISR; + } + else + { + /* Get DMA2 ISR register value */ + tmpreg = DMA2->ISR; + } + + /* Check the status of the specified DMAy interrupt */ + if ((tmpreg & DMAy_IT) != (uint32_t)RESET) + { + /* DMAy_IT is set */ + bitstatus = SET; + } + else + { + /* DMAy_IT is reset */ + bitstatus = RESET; + } + /* Return the DMAy_IT status */ + return bitstatus; +} + +/** + * @brief Clears the DMAy Channelx's interrupt pending bits. + * @param DMAy_IT: specifies the DMAy interrupt pending bit to clear. + * This parameter can be any combination (for the same DMA) of the following values: + * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. + * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. + * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. + * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. + * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. + * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. + * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. + * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. + * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. + * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. + * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. + * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. + * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. + * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. + * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. + * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. + * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. + * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. + * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. + * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. + * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. + * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. + * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. + * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. + * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. + * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. + * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. + * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. + * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. + * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. + * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. + * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. + * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. + * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. + * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. + * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. + * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. + * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. + * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. + * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. + * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. + * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. + * + * @note + * Clearing the Global interrupt (DMAy_IT_GLx) results in clearing all other + * interrupts relative to the same channel (Transfer Complete, Half-transfer + * Complete and Transfer Error interrupts: DMAy_IT_TCx, DMAy_IT_HTx and + * DMAy_IT_TEx). + * + * @retval None + */ +void DMA_ClearITPendingBit(uint32_t DMAy_IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_CLEAR_IT(DMAy_IT)); + + /* Calculate the used DMAy */ + if ((DMAy_IT & FLAG_MASK) == (uint32_t)RESET) + { + /* Clear the selected DMAy interrupt pending bits */ + DMA1->IFCR = DMAy_IT; + } + else + { + /* Clear the selected DMAy interrupt pending bits */ + DMA2->IFCR = DMAy_IT; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_exti.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_exti.c new file mode 100644 index 0000000..07e8f3c --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_exti.c @@ -0,0 +1,315 @@ +/** + ****************************************************************************** + * @file stm32l1xx_exti.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the EXTI peripheral: + * + Initialization and Configuration + * + Interrupts and flags management + * + * @verbatim + ============================================================================== + ##### EXTI features ##### + ============================================================================== + [..] External interrupt/event lines are mapped as following: + (#) All available GPIO pins are connected to the 16 external + interrupt/event lines from EXTI0 to EXTI15. + (#) EXTI line 16 is connected to the PVD output. + (#) EXTI line 17 is connected to the RTC Alarm event. + (#) EXTI line 18 is connected to the USB Device FS wakeup event. + (#) EXTI line 19 is connected to the RTC Tamper and TimeStamp events. + (#) EXTI line 20 is connected to the RTC Wakeup event. + (#) EXTI line 21 is connected to the Comparator 1 wakeup event. + (#) EXTI line 22 is connected to the Comparator 2 wakeup event. + (#) EXTI line 23 is connected to the Comparator channel acquisition wakeup event. + + + ##### How to use this driver ##### + ============================================================================== + [..] In order to use an I/O pin as an external interrupt source, follow + steps below: + (#) Configure the I/O in input mode using GPIO_Init() + (#) Select the input source pin for the EXTI line using + SYSCFG_EXTILineConfig() + (#) Select the mode(interrupt, event) and configure the trigger + selection (Rising, falling or both) using EXTI_Init() + (#) Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init() + [..] + (@) SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx + registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_exti.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup EXTI + * @brief EXTI driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup EXTI_Private_Functions + * @{ + */ + +/** @defgroup EXTI_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and Configuration functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the EXTI peripheral registers to their default reset values. + * @param None + * @retval None + */ +void EXTI_DeInit(void) +{ + EXTI->IMR = 0x00000000; + EXTI->EMR = 0x00000000; + EXTI->RTSR = 0x00000000; + EXTI->FTSR = 0x00000000; + EXTI->PR = 0x00FFFFFF; +} + +/** + * @brief Initializes the EXTI peripheral according to the specified + * parameters in the EXTI_InitStruct. + * EXTI_Line specifies the EXTI line (EXTI0....EXTI23). + * EXTI_Mode specifies which EXTI line is used as interrupt or an event. + * EXTI_Trigger selects the trigger. When the trigger occurs, interrupt + * pending bit will be set. + * EXTI_LineCmd controls (Enable/Disable) the EXTI line. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure + * that contains the configuration information for the EXTI peripheral. + * @retval None + */ +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) +{ + uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); + assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); + assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); + assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); + + tmp = (uint32_t)EXTI_BASE; + + if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; + + tmp += EXTI_InitStruct->EXTI_Mode; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; + + /* Select the trigger for the selected external interrupts */ + if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + /* Rising Falling edge */ + EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; + EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; + } + else + { + tmp = (uint32_t)EXTI_BASE; + tmp += EXTI_InitStruct->EXTI_Trigger; + + *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; + } + } + else + { + tmp += EXTI_InitStruct->EXTI_Mode; + + /* Disable the selected external lines */ + *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; + } +} + +/** + * @brief Fills each EXTI_InitStruct member with its reset value. + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/** + * @brief Generates a Software interrupt on selected EXTI line. + * @param EXTI_Line: specifies the EXTI line on which the software interrupt + * will be generated. + * This parameter can be any combination of EXTI_Linex where x can be (0..23). + * @retval None + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->SWIER |= EXTI_Line; +} + +/** + * @} + */ + +/** @defgroup EXTI_Group2 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + ============================================================================== + ##### Interrupts and flags management functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param EXTI_Line: specifies the EXTI line flag to check. + * This parameter can be: + * EXTI_Linex: External interrupt line x where x(0..23). + * @retval The new state of EXTI_Line (SET or RESET). + */ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI's line pending flags. + * @param EXTI_Line: specifies the EXTI lines flags to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..23). + * @retval None + */ +void EXTI_ClearFlag(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param EXTI_Line: specifies the EXTI line to check. + * This parameter can be: + * EXTI_Linex: External interrupt line x where x(0..23). + * @retval The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_GET_EXTI_LINE(EXTI_Line)); + + if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the EXTI's line pending bits. + * @param EXTI_Line: specifies the EXTI lines to clear. + * This parameter can be any combination of EXTI_Linex where x can be (0..23). + * @retval None + */ +void EXTI_ClearITPendingBit(uint32_t EXTI_Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(EXTI_Line)); + + EXTI->PR = EXTI_Line; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash.c new file mode 100644 index 0000000..59a2627 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash.c @@ -0,0 +1,1843 @@ +/** + ****************************************************************************** + * @file stm32l1xx_flash.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides all the Flash firmware functions. These functions + * can be executed from Internal FLASH or Internal SRAM memories. + * The functions that should be called from SRAM are defined inside + * the "stm32l1xx_flash_ramfunc.c" file. + * This file provides firmware functions to manage the following + * functionalities of the FLASH peripheral: + * + FLASH Interface configuration + * + FLASH Memory Programming + * + DATA EEPROM Programming + * + Option Bytes Programming + * + Interrupts and flags management + * + * @verbatim + + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the Flash + memory of all STM32L1xx devices. + [..] These functions are split in 5 groups: + (#) FLASH Interface configuration functions: this group includes + the management of following features: + (++) Set the latency. + (++) Enable/Disable the prefetch buffer. + (++) Enable/Disable the 64 bit Read Access. + (++) Enable/Disable the RUN PowerDown mode. + (++) Enable/Disable the SLEEP PowerDown mode. + + (#) FLASH Memory Programming functions: this group includes all + needed functions to erase and program the main memory: + (++) Lock and Unlock the Flash interface. + (++) Erase function: Erase Page. + (++) Program functions: Fast Word and Half Page(should be + executed from internal SRAM). + + (#) DATA EEPROM Programming functions: this group includes all + needed functions to erase and program the DATA EEPROM memory: + (++) Lock and Unlock the DATA EEPROM interface. + (++) Erase function: Erase Byte, erase HalfWord, erase Word, erase + (++) Double Word (should be executed from internal SRAM). + (++) Program functions: Fast Program Byte, Fast Program Half-Word, + FastProgramWord, Program Byte, Program Half-Word, + Program Word and Program Double-Word (should be executed + from internal SRAM). + + (#) FLASH Option Bytes Programming functions: this group includes + all needed functions to: + (++) Lock and Unlock the Flash Option bytes. + (++) Set/Reset the write protection. + (++) Set the Read protection Level. + (++) Set the BOR level. + (++) rogram the user option Bytes. + (++) Launch the Option Bytes loader. + (++) Get the Write protection. + (++) Get the read protection status. + (++) Get the BOR level. + (++) Get the user option bytes. + + (#) FLASH Interrupts and flag management functions: this group + includes all needed functions to: + (++) Enable/Disable the flash interrupt sources. + (++) Get flags status. + (++) Clear flags. + (++) Get Flash operation status. + (++) Wait for last flash operation. + + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_flash.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup FLASH + * @brief FLASH driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* FLASH Mask */ +#define WRP01_MASK ((uint32_t)0x0000FFFF) +#define WRP23_MASK ((uint32_t)0xFFFF0000) +#define WRP45_MASK ((uint32_t)0x0000FFFF) +#define WRP67_MASK ((uint32_t)0xFFFF0000) +#define WRP89_MASK ((uint32_t)0x0000FFFF) +#define WRP1011_MASK ((uint32_t)0xFFFF0000) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup FLASH_Private_Functions + * @{ + */ + +/** @defgroup FLASH_Group1 FLASH Interface configuration functions + * @brief FLASH Interface configuration functions + * +@verbatim + ============================================================================== + ##### FLASH Interface configuration functions ##### + ============================================================================== + + [..] FLASH_Interface configuration_Functions, includes the following functions: + (+) void FLASH_SetLatency(uint32_t FLASH_Latency): + [..] To correctly read data from Flash memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) and the supply voltage of the device. + [..] + ---------------------------------------------------------------- + | Wait states | HCLK clock frequency (MHz) | + | |------------------------------------------------| + | (Latency) | voltage range | voltage range | + | | 1.65 V - 3.6 V | 2.0 V - 3.6 V | + | |----------------|---------------|---------------| + | | VCORE = 1.2 V | VCORE = 1.5 V | VCORE = 1.8 V | + |-------------- |----------------|---------------|---------------| + |0WS(1CPU cycle)|0 < HCLK <= 2 |0 < HCLK <= 8 |0 < HCLK <= 16 | + |---------------|----------------|---------------|---------------| + |1WS(2CPU cycle)|2 < HCLK <= 4 |8 < HCLK <= 16 |16 < HCLK <= 32| + ---------------------------------------------------------------- + [..] + (+) void FLASH_PrefetchBufferCmd(FunctionalState NewState); + (+) void FLASH_ReadAccess64Cmd(FunctionalState NewState); + (+) void FLASH_RUNPowerDownCmd(FunctionalState NewState); + (+) void FLASH_SLEEPPowerDownCmd(FunctionalState NewState); + (+) void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); + [..] + Here below the allowed configuration of Latency, 64Bit access and prefetch buffer + [..] + -------------------------------------------------------------------------------- + | | ACC64 = 0 | ACC64 = 1 | + | Latency |----------------|---------------|---------------|---------------| + | | PRFTEN = 0 | PRFTEN = 1 | PRFTEN = 0 | PRFTEN = 1 | + |---------------|----------------|---------------|---------------|---------------| + |0WS(1CPU cycle)| YES | NO | YES | YES | + |---------------|----------------|---------------|---------------|---------------| + |1WS(2CPU cycle)| NO | NO | YES | YES | + -------------------------------------------------------------------------------- + [..] + All these functions don't need the unlock sequence. + +@endverbatim + * @{ + */ + +/** + * @brief Sets the code latency value. + * @param FLASH_Latency: specifies the FLASH Latency value. + * This parameter can be one of the following values: + * @arg FLASH_Latency_0: FLASH Zero Latency cycle. + * @arg FLASH_Latency_1: FLASH One Latency cycle. + * @retval None + */ +void FLASH_SetLatency(uint32_t FLASH_Latency) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_FLASH_LATENCY(FLASH_Latency)); + + /* Read the ACR register */ + tmpreg = FLASH->ACR; + + /* Sets the Latency value */ + tmpreg &= (uint32_t) (~((uint32_t)FLASH_ACR_LATENCY)); + tmpreg |= FLASH_Latency; + + /* Write the ACR register */ + FLASH->ACR = tmpreg; +} + +/** + * @brief Enables or disables the Prefetch Buffer. + * @param NewState: new state of the FLASH prefetch buffer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FLASH_PrefetchBufferCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(NewState != DISABLE) + { + FLASH->ACR |= FLASH_ACR_PRFTEN; + } + else + { + FLASH->ACR &= (uint32_t)(~((uint32_t)FLASH_ACR_PRFTEN)); + } +} + +/** + * @brief Enables or disables read access to flash by 64 bits. + * @param NewState: new state of the FLASH read access mode. + * This parameter can be: ENABLE or DISABLE. + * @note If this bit is set, the Read access 64 bit is used. + * If this bit is reset, the Read access 32 bit is used. + * @note This bit cannot be written at the same time as the LATENCY and + * PRFTEN bits. + * To reset this bit, the LATENCY should be zero wait state and the + * prefetch off. + * @retval None + */ +void FLASH_ReadAccess64Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(NewState != DISABLE) + { + FLASH->ACR |= FLASH_ACR_ACC64; + } + else + { + FLASH->ACR &= (uint32_t)(~((uint32_t)FLASH_ACR_ACC64)); + } +} + +/** + * @brief Enable or disable the power down mode during Sleep mode. + * @note This function is used to power down the FLASH when the system is in SLEEP LP mode. + * @param NewState: new state of the power down mode during sleep mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FLASH_SLEEPPowerDownCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the SLEEP_PD bit to put Flash in power down mode during sleep mode */ + FLASH->ACR |= FLASH_ACR_SLEEP_PD; + } + else + { + /* Clear the SLEEP_PD bit in to put Flash in idle mode during sleep mode */ + FLASH->ACR &= (uint32_t)(~((uint32_t)FLASH_ACR_SLEEP_PD)); + } +} + +/** + * @} + */ + +/** @defgroup FLASH_Group2 FLASH Memory Programming functions + * @brief FLASH Memory Programming functions + * +@verbatim + ============================================================================== + ##### FLASH Memory Programming functions ##### + ============================================================================== + + [..] The FLASH Memory Programming functions, includes the following functions: + (+) void FLASH_Unlock(void); + (+) void FLASH_Lock(void); + (+) FLASH_Status FLASH_ErasePage(uint32_t Page_Address); + (+) FLASH_Status FLASH_FastProgramWord(uint32_t Address, uint32_t Data); + + [..] Any operation of erase or program should follow these steps: + (#) Call the FLASH_Unlock() function to enable the flash control register and + program memory access. + (#) Call the desired function to erase page or program data. + (#) Call the FLASH_Lock() to disable the flash program memory access + (recommended to protect the FLASH memory against possible unwanted operation). + +@endverbatim + * @{ + */ + +/** + * @brief Unlocks the FLASH control register and program memory access. + * @param None + * @retval None + */ +void FLASH_Unlock(void) +{ + if((FLASH->PECR & FLASH_PECR_PRGLOCK) != RESET) + { + /* Unlocking the data memory and FLASH_PECR register access */ + DATA_EEPROM_Unlock(); + + /* Unlocking the program memory access */ + FLASH->PRGKEYR = FLASH_PRGKEY1; + FLASH->PRGKEYR = FLASH_PRGKEY2; + } +} + +/** + * @brief Locks the Program memory access. + * @param None + * @retval None + */ +void FLASH_Lock(void) +{ + /* Set the PRGLOCK Bit to lock the program memory access */ + FLASH->PECR |= FLASH_PECR_PRGLOCK; +} + +/** + * @brief Erases a specified page in program memory. + * @note To correctly run this function, the FLASH_Unlock() function + * must be called before. + * Call the FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @param Page_Address: The page address in program memory to be erased. + * @note A Page is erased in the Program memory only if the address to load + * is the start address of a page (multiple of 256 bytes). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(Page_Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to erase the page */ + + /* Set the ERASE bit */ + FLASH->PECR |= FLASH_PECR_ERASE; + + /* Set PROG bit */ + FLASH->PECR |= FLASH_PECR_PROG; + + /* Write 00000000h to the first word of the program page to erase */ + *(__IO uint32_t *)Page_Address = 0x00000000; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* If the erase operation is completed, disable the ERASE and PROG bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PROG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_ERASE); + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Programs a word at a specified address in program memory. + * @note To correctly run this function, the FLASH_Unlock() function + * must be called before. + * Call the FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation). + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_FastProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to program the new word */ + *(__IO uint32_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + /* Return the Write Status */ + return status; +} + +/** + * @} + */ + +/** @defgroup FLASH_Group3 DATA EEPROM Programming functions + * @brief DATA EEPROM Programming functions + * +@verbatim + =============================================================================== + ##### DATA EEPROM Programming functions ##### + =============================================================================== + + [..] The DATA_EEPROM Programming_Functions, includes the following functions: + (+) void DATA_EEPROM_Unlock(void); + (+) void DATA_EEPROM_Lock(void); + (+) FLASH_Status DATA_EEPROM_EraseByte(uint32_t Address); + (+) FLASH_Status DATA_EEPROM_EraseHalfWord(uint32_t Address); + (+) FLASH_Status DATA_EEPROM_EraseWord(uint32_t Address); + (+) FLASH_Status DATA_EEPROM_FastProgramByte(uint32_t Address, uint8_t Data); + (+) FLASH_Status DATA_EEPROM_FastProgramHalfWord(uint32_t Address, uint16_t Data); + (+) FLASH_Status DATA_EEPROM_FastProgramWord(uint32_t Address, uint32_t Data); + (+) FLASH_Status DATA_EEPROM_ProgramByte(uint32_t Address, uint8_t Data); + (+) FLASH_Status DATA_EEPROM_ProgramHalfWord(uint32_t Address, uint16_t Data); + (+) FLASH_Status DATA_EEPROM_ProgramWord(uint32_t Address, uint32_t Data); + + [..] Any operation of erase or program should follow these steps: + (#) Call the DATA_EEPROM_Unlock() function to enable the data EEPROM access + and Flash program erase control register access. + (#) Call the desired function to erase or program data. + (#) Call the DATA_EEPROM_Lock() to disable the data EEPROM access + and Flash program erase control register access(recommended + to protect the DATA_EEPROM against possible unwanted operation). + +@endverbatim + * @{ + */ + +/** + * @brief Unlocks the data memory and FLASH_PECR register access. + * @param None + * @retval None + */ +void DATA_EEPROM_Unlock(void) +{ + if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET) + { + /* Unlocking the Data memory and FLASH_PECR register access*/ + FLASH->PEKEYR = FLASH_PEKEY1; + FLASH->PEKEYR = FLASH_PEKEY2; + } +} + +/** + * @brief Locks the Data memory and FLASH_PECR register access. + * @param None + * @retval None + */ +void DATA_EEPROM_Lock(void) +{ + /* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */ + FLASH->PECR |= FLASH_PECR_PELOCK; +} + +/** + * @brief Enables or disables DATA EEPROM fixed Time programming (2*Tprog). + * @param NewState: new state of the DATA EEPROM fixed Time programming mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void DATA_EEPROM_FixedTimeProgramCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(NewState != DISABLE) + { + FLASH->PECR |= (uint32_t)FLASH_PECR_FTDW; + } + else + { + FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); + } +} + +/** + * @brief Erase a byte in data memory. + * @param Address: specifies the address to be erased. + * @note This function can be used only for STM32L1XX_HD and STM32L1XX_MDP + * density devices. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_EraseByte(uint32_t Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write "00h" to valid address in the data memory" */ + *(__IO uint8_t *) Address = (uint8_t)0x00; + } + + /* Return the erase status */ + return status; +} + +/** + * @brief Erase a halfword in data memory. + * @param Address: specifies the address to be erased. + * @note This function can be used only for STM32L1XX_HD and STM32L1XX_MDP + * density devices. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_EraseHalfWord(uint32_t Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write "0000h" to valid address in the data memory" */ + *(__IO uint16_t *) Address = (uint16_t)0x0000; + } + + /* Return the erase status */ + return status; +} + +/** + * @brief Erase a word in data memory. + * @param Address: specifies the address to be erased. + * @note For STM32L1XX_MD, A data memory word is erased in the data memory only + * if the address to load is the start address of a word (multiple of a word). + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_EraseWord(uint32_t Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write "00000000h" to valid address in the data memory" */ + *(__IO uint32_t *) Address = 0x00000000; + } + + /* Return the erase status */ + return status; +} + +/** + * @brief Write a Byte at a specified address in data memory. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @note This function assumes that the is data word is already erased. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_FastProgramByte(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + uint32_t tmp = 0, tmpaddr = 0; +#endif + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Clear the FTDW bit */ + FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); + +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + if(Data != (uint8_t)0x00) + { + /* If the previous operation is completed, proceed to write the new Data */ + *(__IO uint8_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + else + { + tmpaddr = Address & 0xFFFFFFFC; + tmp = * (__IO uint32_t *) tmpaddr; + tmpaddr = 0xFF << ((uint32_t) (0x8 * (Address & 0x3))); + tmp &= ~tmpaddr; + status = DATA_EEPROM_EraseWord(Address & 0xFFFFFFFC); + status = DATA_EEPROM_FastProgramWord((Address & 0xFFFFFFFC), tmp); + } +#elif defined (STM32L1XX_HD) || defined (STM32L1XX_MDP) + /* If the previous operation is completed, proceed to write the new Data */ + *(__IO uint8_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); +#endif + } + /* Return the Write Status */ + return status; +} + +/** + * @brief Writes a half word at a specified address in data memory. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @note This function assumes that the is data word is already erased. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_FastProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + uint32_t tmp = 0, tmpaddr = 0; +#endif + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Clear the FTDW bit */ + FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); + +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + if(Data != (uint16_t)0x0000) + { + /* If the previous operation is completed, proceed to write the new data */ + *(__IO uint16_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + else + { + if((Address & 0x3) != 0x3) + { + tmpaddr = Address & 0xFFFFFFFC; + tmp = * (__IO uint32_t *) tmpaddr; + tmpaddr = 0xFFFF << ((uint32_t) (0x8 * (Address & 0x3))); + tmp &= ~tmpaddr; + status = DATA_EEPROM_EraseWord(Address & 0xFFFFFFFC); + status = DATA_EEPROM_FastProgramWord((Address & 0xFFFFFFFC), tmp); + } + else + { + DATA_EEPROM_FastProgramByte(Address, 0x00); + DATA_EEPROM_FastProgramByte(Address + 1, 0x00); + } + } +#elif defined (STM32L1XX_HD) || defined (STM32L1XX_MDP) + /* If the previous operation is completed, proceed to write the new data */ + *(__IO uint16_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); +#endif + } + /* Return the Write Status */ + return status; +} + +/** + * @brief Programs a word at a specified address in data memory. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to the data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @note This function assumes that the is data word is already erased. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_FastProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Clear the FTDW bit */ + FLASH->PECR &= (uint32_t)(~((uint32_t)FLASH_PECR_FTDW)); + + /* If the previous operation is completed, proceed to program the new data */ + *(__IO uint32_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + /* Return the Write Status */ + return status; +} + +/** + * @brief Write a Byte at a specified address in data memory without erase. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @note The function DATA_EEPROM_FixedTimeProgramCmd() can be called before + * this function to configure the Fixed Time Programming. + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_ProgramByte(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + uint32_t tmp = 0, tmpaddr = 0; +#endif + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + if(Data != (uint8_t) 0x00) + { + *(__IO uint8_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + } + else + { + tmpaddr = Address & 0xFFFFFFFC; + tmp = * (__IO uint32_t *) tmpaddr; + tmpaddr = 0xFF << ((uint32_t) (0x8 * (Address & 0x3))); + tmp &= ~tmpaddr; + status = DATA_EEPROM_EraseWord(Address & 0xFFFFFFFC); + status = DATA_EEPROM_FastProgramWord((Address & 0xFFFFFFFC), tmp); + } +#elif defined (STM32L1XX_HD) || defined (STM32L1XX_MDP) + *(__IO uint8_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); +#endif + } + /* Return the Write Status */ + return status; +} + +/** + * @brief Writes a half word at a specified address in data memory without erase. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @note The function DATA_EEPROM_FixedTimeProgramCmd() can be called before + * this function to configure the Fixed Time Programming + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + uint32_t tmp = 0, tmpaddr = 0; +#endif + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { +#if !defined (STM32L1XX_HD) && !defined (STM32L1XX_MDP) + if(Data != (uint16_t)0x0000) + { + *(__IO uint16_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + else + { + if((Address & 0x3) != 0x3) + { + tmpaddr = Address & 0xFFFFFFFC; + tmp = * (__IO uint32_t *) tmpaddr; + tmpaddr = 0xFFFF << ((uint32_t) (0x8 * (Address & 0x3))); + tmp &= ~tmpaddr; + status = DATA_EEPROM_EraseWord(Address & 0xFFFFFFFC); + status = DATA_EEPROM_FastProgramWord((Address & 0xFFFFFFFC), tmp); + } + else + { + DATA_EEPROM_FastProgramByte(Address, 0x00); + DATA_EEPROM_FastProgramByte(Address + 1, 0x00); + } + } +#elif defined (STM32L1XX_HD) || defined (STM32L1XX_MDP) + *(__IO uint16_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); +#endif + } + /* Return the Write Status */ + return status; +} + +/** + * @brief Programs a word at a specified address in data memory without erase. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @note The function DATA_EEPROM_FixedTimeProgramCmd() can be called before + * this function to configure the Fixed Time Programming. + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status DATA_EEPROM_ProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Check the parameters */ + assert_param(IS_FLASH_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + *(__IO uint32_t *)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + /* Return the Write Status */ + return status; +} + +/** + * @} + */ + +/** @defgroup FLASH_Group4 Option Bytes Programming functions + * @brief Option Bytes Programming functions + * +@verbatim + ============================================================================== + ##### Option Bytes Programming functions ##### + ============================================================================== + + [..] The FLASH_Option Bytes Programming_functions, includes the following functions: + (+) void FLASH_OB_Unlock(void); + (+) void FLASH_OB_Lock(void); + (+) void FLASH_OB_Launch(void); + (+) FLASH_Status FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState); + (+) FLASH_Status FLASH_OB_WRP1Config(uint32_t OB_WRP1, FunctionalState NewState); + (+) FLASH_Status FLASH_OB_WRP2Config(uint32_t OB_WRP2, FunctionalState NewState); + (+) FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP); + (+) FLASH_Status FLASH_OB_PCROPConfig(uint32_t OB_WRP, FunctionalState NewState); + (+) FLASH_Status FLASH_OB_PCROP1Config(uint32_t OB_WRP1, FunctionalState NewState); + (+) FLASH_Status FLASH_OB_PCROPSelectionConfig(uint16_t OB_PcROP); + (+) FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); + (+) FLASH_Status FLASH_OB_BORConfig(uint8_t OB_BOR); + (+) uint8_t FLASH_OB_GetUser(void); + (+) uint32_t FLASH_OB_GetWRP(void); + (+) uint32_t FLASH_OB_GetWRP1(void); + (+) uint32_t FLASH_OB_GetWRP2(void); + (+) FlagStatus FLASH_OB_GetRDP(void); + (+) FlagStatus FLASH_OB_GetSPRMOD(void); + (+) uint8_t FLASH_OB_GetBOR(void); + (+) FLASH_Status FLASH_OB_BootConfig(uint16_t OB_BOOT); + + [..] Any operation of erase or program should follow these steps: + (#) Call the FLASH_OB_Unlock() function to enable the Flash option control + register access. + (#) Call one or several functions to program the desired option bytes. + (++) void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) => to Enable/Disable + the desired sector write protection. + (++) void FLASH_OB_RDPConfig(uint8_t OB_RDP) => to set the desired read Protection Level. + (++) void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) => to configure + the user option Bytes: IWDG, STOP and the Standby. + (++) void FLASH_OB_BORConfig(uint8_t OB_BOR) => to Set the BOR level. + (#) Once all needed option bytes to be programmed are correctly written, call the + FLASH_OB_Launch(void) function to launch the Option Bytes programming process. + (#) Call the FLASH_OB_Lock() to disable the Flash option control register access (recommended + to protect the option Bytes against possible unwanted operations). + + [..] Proprietary code Read Out Protection (PcROP): + (#) The PcROP sector is selected by using the same option bytes as the Write + protection (nWRPi bits). As a result, these 2 options are exclusive each other. + (#) In order to activate the PcROP (change the function of the nWRPi option bits), + the SPRMOD option bit must be activated. + (#) The active value of nWRPi bits is inverted when PCROP mode is active, this + means: if SPRMOD = 1 and nWRPi = 1 (default value), then the user sector "i" + is read/write protected. + (#) To activate PCROP mode for Flash sector(s), you need to follow the sequence below: + (++) For sector(s) within the first 128KB of the Flash, use this function + FLASH_OB_PCROPConfig(OB_WRP_Pagesxxx, ENABLE) + (++) For sector(s) within the second 128KB of the Flash, use this function + FLASH_OB_PCROP1Config(OB_WRP_Pagesxxx, ENABLE) + (++) Activate the PCROP mode using FLASH_OB_PCROPSelectionConfig(OB_PcROP_Enable) function + (#) PcROP is available only in STM32L1XX_MDP devices + +@endverbatim + * @{ + */ + +/** + * @brief Unlocks the option bytes block access. + * @param None + * @retval None + */ +void FLASH_OB_Unlock(void) +{ + if((FLASH->PECR & FLASH_PECR_OPTLOCK) != RESET) + { + /* Unlocking the data memory and FLASH_PECR register access */ + DATA_EEPROM_Unlock(); + + /* Unlocking the option bytes block access */ + FLASH->OPTKEYR = FLASH_OPTKEY1; + FLASH->OPTKEYR = FLASH_OPTKEY2; + } +} + +/** + * @brief Locks the option bytes block access. + * @param None + * @retval None + */ +void FLASH_OB_Lock(void) +{ + /* Set the OPTLOCK Bit to lock the option bytes block access */ + FLASH->PECR |= FLASH_PECR_OPTLOCK; +} + +/** + * @brief Launch the option byte loading. + * @param None + * @retval None + */ +void FLASH_OB_Launch(void) +{ + /* Set the OBL_Launch bit to lauch the option byte loading */ + FLASH->PECR |= FLASH_PECR_OBL_LAUNCH; +} + +/** + * @brief Write protects the desired pages of the first 128KB of the Flash. + * @param OB_WRP: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg value between OB_WRP_Pages0to15 and OB_WRP_Pages496to511 + * @arg OB_WRP_AllPages + * @param NewState: new state of the specified FLASH Pages Wtite protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) +{ + uint32_t WRP01_Data = 0, WRP23_Data = 0; + + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp1 = 0, tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_WRP(OB_WRP)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + if (NewState != DISABLE) + { + WRP01_Data = (uint16_t)(((OB_WRP & WRP01_MASK) | OB->WRP01)); + WRP23_Data = (uint16_t)((((OB_WRP & WRP23_MASK)>>16 | OB->WRP23))); + tmp1 = (uint32_t)(~(WRP01_Data) << 16)|(WRP01_Data); + OB->WRP01 = tmp1; + + tmp2 = (uint32_t)(~(WRP23_Data) << 16)|(WRP23_Data); + OB->WRP23 = tmp2; + } + + else + { + WRP01_Data = (uint16_t)(~OB_WRP & (WRP01_MASK & OB->WRP01)); + WRP23_Data = (uint16_t)((((~OB_WRP & WRP23_MASK)>>16 & OB->WRP23))); + + tmp1 = (uint32_t)((~WRP01_Data) << 16)|(WRP01_Data); + OB->WRP01 = tmp1; + + tmp2 = (uint32_t)((~WRP23_Data) << 16)|(WRP23_Data); + OB->WRP23 = tmp2; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Write protects the desired pages of the second 128KB of the Flash. + * @note This function can be used only for STM32L1XX_HD and STM32L1XX_MDP + * density devices. + * @param OB_WRP1: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg value between OB_WRP_Pages512to527 and OB_WRP_Pages1008to1023 + * @arg OB_WRP_AllPages + * @param NewState: new state of the specified FLASH Pages Wtite protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_WRP1Config(uint32_t OB_WRP1, FunctionalState NewState) +{ + uint32_t WRP45_Data = 0, WRP67_Data = 0; + + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp1 = 0, tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_WRP(OB_WRP1)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + if (NewState != DISABLE) + { + WRP45_Data = (uint16_t)(((OB_WRP1 & WRP45_MASK) | OB->WRP45)); + WRP67_Data = (uint16_t)((((OB_WRP1 & WRP67_MASK)>>16 | OB->WRP67))); + tmp1 = (uint32_t)(~(WRP45_Data) << 16)|(WRP45_Data); + OB->WRP45 = tmp1; + + tmp2 = (uint32_t)(~(WRP67_Data) << 16)|(WRP67_Data); + OB->WRP67 = tmp2; + } + + else + { + WRP45_Data = (uint16_t)(~OB_WRP1 & (WRP45_MASK & OB->WRP45)); + WRP67_Data = (uint16_t)((((~OB_WRP1 & WRP67_MASK)>>16 & OB->WRP67))); + + tmp1 = (uint32_t)((~WRP45_Data) << 16)|(WRP45_Data); + OB->WRP45 = tmp1; + + tmp2 = (uint32_t)((~WRP67_Data) << 16)|(WRP67_Data); + OB->WRP67 = tmp2; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Write protects the desired pages of the third 128KB of the Flash. + * @note This function can be used only for STM32L1XX_HD density devices. + * @param OB_WRP2: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg value between OB_WRP_Pages1024to1039 and OB_WRP_Pages1520to1535 + * @arg OB_WRP_AllPages + * @param NewState: new state of the specified FLASH Pages Wtite protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_WRP2Config(uint32_t OB_WRP2, FunctionalState NewState) +{ + uint32_t WRP89_Data = 0, WRP1011_Data = 0; + + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp1 = 0, tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_WRP(OB_WRP2)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + if (NewState != DISABLE) + { + WRP89_Data = (uint16_t)(((OB_WRP2 & WRP89_MASK) | OB->WRP89)); + WRP1011_Data = (uint16_t)((((OB_WRP2 & WRP1011_MASK)>>16 | OB->WRP1011))); + tmp1 = (uint32_t)(~(WRP89_Data) << 16)|(WRP89_Data); + OB->WRP89 = tmp1; + + tmp2 = (uint32_t)(~(WRP1011_Data) << 16)|(WRP1011_Data); + OB->WRP1011 = tmp2; + } + + else + { + WRP89_Data = (uint16_t)(~OB_WRP2 & (WRP89_MASK & OB->WRP89)); + WRP1011_Data = (uint16_t)((((~OB_WRP2 & WRP1011_MASK)>>16 & OB->WRP1011))); + + tmp1 = (uint32_t)((~WRP89_Data) << 16)|(WRP89_Data); + OB->WRP89 = tmp1; + + tmp2 = (uint32_t)((~WRP1011_Data) << 16)|(WRP1011_Data); + OB->WRP1011 = tmp2; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read out protection. + * @note To correctly run this function, the FLASH_OB_Unlock() function + * must be called before. + * @param FLASH_ReadProtection_Level: specifies the read protection level. + * This parameter can be: + * @arg OB_RDP_Level_0: No protection + * @arg OB_RDP_Level_1: Read protection of the memory + * @arg OB_RDP_Level_2: Chip protection + * + * !!!Warning!!! When enabling OB_RDP_Level_2 it's no more possible to go back to level 1 or 0 + * + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP) +{ + FLASH_Status status = FLASH_COMPLETE; + uint8_t tmp1 = 0; + uint32_t tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_RDP(OB_RDP)); + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* calculate the option byte to write */ + tmp1 = (uint8_t)(~(OB_RDP )); + tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16)) | ((uint32_t)OB_RDP)); + + if(status == FLASH_COMPLETE) + { + /* program read protection level */ + OB->RDP = tmp2; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Return the Read protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read/write protection (PCROP) of the desired + * sectors, for the first 128KB of the Flash. + * @note This function can be used only for STM32L1XX_MDP devices + * @param OB_WRP: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg value between OB_WRP_Pages0to15 and OB_WRP_Pages496to511 + * @arg OB_WRP_AllPages + * @param NewState: new state of the specified FLASH Pages Write protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_PCROPConfig(uint32_t OB_WRP, FunctionalState NewState) +{ + uint32_t WRP01_Data = 0, WRP23_Data = 0; + + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp1 = 0, tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_WRP(OB_WRP)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + if (NewState != DISABLE) + { + WRP01_Data = (uint16_t)(~OB_WRP & (WRP01_MASK & OB->WRP01)); + WRP23_Data = (uint16_t)((((~OB_WRP & WRP23_MASK)>>16 & OB->WRP23))); + + tmp1 = (uint32_t)((~WRP01_Data) << 16)|(WRP01_Data); + OB->WRP01 = tmp1; + + tmp2 = (uint32_t)((~WRP23_Data) << 16)|(WRP23_Data); + OB->WRP23 = tmp2; + + } + + else + { + WRP01_Data = (uint16_t)((OB_WRP & WRP01_MASK) | OB->WRP01); + WRP23_Data = (uint16_t)(((OB_WRP & WRP23_MASK) >> 16) | OB->WRP23); + + tmp1 = (uint32_t)(~(WRP01_Data) << 16)|(WRP01_Data); + OB->WRP01 = tmp1; + + tmp2 = (uint32_t)(~(WRP23_Data) << 16)|(WRP23_Data); + OB->WRP23 = tmp2; + + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Enables or disables the read/write protection (PCROP) of the desired + * sectors, for the second 128KB of the Flash. + * @note This function can be used only for STM32L1XX_MDP devices + * @param OB_WRP1: specifies the address of the pages to be write protected. + * This parameter can be: + * @arg value between OB_WRP_Pages512to527 and OB_WRP_Pages1008to1023 + * @arg OB_WRP_AllPages + * @param NewState: new state of the specified FLASH Pages Write protection. + * This parameter can be: ENABLE or DISABLE. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_PCROP1Config(uint32_t OB_WRP1, FunctionalState NewState) +{ + uint32_t WRP45_Data = 0, WRP67_Data = 0; + + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp1 = 0, tmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_WRP(OB_WRP1)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + if (NewState != DISABLE) + { + WRP45_Data = (uint16_t)(~OB_WRP1 & (WRP45_MASK & OB->WRP45)); + WRP67_Data = (uint16_t)((((~OB_WRP1 & WRP67_MASK)>>16 & OB->WRP67))); + + tmp1 = (uint32_t)((~WRP45_Data) << 16)|(WRP45_Data); + OB->WRP45 = tmp1; + + tmp2 = (uint32_t)((~WRP67_Data) << 16)|(WRP67_Data); + OB->WRP67 = tmp2; + } + else + { + WRP45_Data = (uint16_t)((OB_WRP1 & WRP45_MASK) | OB->WRP45); + WRP67_Data = (uint16_t)(((OB_WRP1 & WRP67_MASK)>>16) | OB->WRP67); + tmp1 = (uint32_t)(~(WRP45_Data) << 16)|(WRP45_Data); + OB->WRP45 = tmp1; + + tmp2 = (uint32_t)(~(WRP67_Data) << 16)|(WRP67_Data); + OB->WRP67 = tmp2; + } + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + } + + /* Return the write protection operation Status */ + return status; +} + +/** + * @brief Select the Protection Mode (SPRMOD). + * @note This function can be used only for STM32L1XX_MDP devices + * @note Once SPRMOD bit is active, unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @param OB_PcROP: Select the Protection Mode of nWPRi bits. + * This parameter can be: + * @arg OB_PcROP_Enable: nWRPi control the read&write protection (PcROP) of respective user sectors. + * @arg OB_PcROP_Disable: nWRPi control the write protection of respective user sectors. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_PCROPSelectionConfig(uint16_t OB_PcROP) +{ + FLASH_Status status = FLASH_COMPLETE; + uint16_t tmp1 = 0; + uint32_t tmp2 = 0; + uint8_t optiontmp = 0; + uint16_t optiontmp2 = 0; + + /* Check the parameters */ + assert_param(IS_OB_PCROP_SELECT(OB_PcROP)); + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Mask RDP Byte */ + optiontmp = (uint8_t)(*(__IO uint8_t *)(OB_BASE)); + + /* Update Option Byte */ + optiontmp2 = (uint16_t)(OB_PcROP | optiontmp); + + + /* calculate the option byte to write */ + tmp1 = (uint16_t)(~(optiontmp2 )); + tmp2 = (uint32_t)(((uint32_t)((uint32_t)(tmp1) << 16)) | ((uint32_t)optiontmp2)); + + if(status == FLASH_COMPLETE) + { + /* program PCRop */ + OB->RDP = tmp2; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Return the Read protection operation Status */ + return status; +} + +/** + * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @param OB_IWDG: Selects the WDG mode. + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software WDG selected + * @arg OB_IWDG_HW: Hardware WDG selected + * @param OB_STOP: Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NoRST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param OB_STDBY: Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp = 0, tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); + assert_param(IS_OB_STOP_SOURCE(OB_STOP)); + assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); + + /* Get the User Option byte register */ + tmp1 = (FLASH->OBR & 0x000F0000) >> 16; + + /* Calculate the user option byte to write */ + tmp = (uint32_t)(((uint32_t)~((uint32_t)((uint32_t)(OB_IWDG) | (uint32_t)(OB_STOP) | (uint32_t)(OB_STDBY) | tmp1))) << ((uint32_t)0x10)); + tmp |= ((uint32_t)(OB_IWDG) | ((uint32_t)OB_STOP) | (uint32_t)(OB_STDBY) | tmp1); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write the User Option Byte */ + OB->USER = tmp; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Return the Option Byte program Status */ + return status; +} + +/** + * @brief Programs the FLASH brownout reset threshold level Option Byte. + * @param OB_BOR: Selects the brownout reset threshold level. + * This parameter can be one of the following values: + * @arg OB_BOR_OFF: BOR is disabled at power down, the reset is asserted when the VDD + * power supply reaches the PDR(Power Down Reset) threshold (1.5V) + * @arg OB_BOR_LEVEL1: BOR Reset threshold levels for 1.7V - 1.8V VDD power supply + * @arg OB_BOR_LEVEL2: BOR Reset threshold levels for 1.9V - 2.0V VDD power supply + * @arg OB_BOR_LEVEL3: BOR Reset threshold levels for 2.3V - 2.4V VDD power supply + * @arg OB_BOR_LEVEL4: BOR Reset threshold levels for 2.55V - 2.65V VDD power supply + * @arg OB_BOR_LEVEL5: BOR Reset threshold levels for 2.8V - 2.9V VDD power supply + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_BORConfig(uint8_t OB_BOR) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp = 0, tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_OB_BOR_LEVEL(OB_BOR)); + + /* Get the User Option byte register */ + tmp1 = (FLASH->OBR & 0x00F00000) >> 16; + + /* Calculate the option byte to write */ + tmp = (uint32_t)~(OB_BOR | tmp1)<<16; + tmp |= (OB_BOR | tmp1); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write the BOR Option Byte */ + OB->USER = tmp; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Return the Option Byte program Status */ + return status; +} + +/** + * @brief Configures to boot from Bank1 or Bank2. + * @note This function can be used only for STM32L1XX_HD density devices. + * @param OB_BOOT: select the FLASH Bank to boot from. + * This parameter can be one of the following values: + * @arg OB_BOOT_BANK2: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank2 or Bank1, + * depending on the activation of the bank. The active banks are checked in + * the following order: Bank2, followed by Bank1. + * The active bank is recognized by the value programmed at the base address + * of the respective bank (corresponding to the initial stack pointer value + * in the interrupt vector table). + * @arg OB_BOOT_BANK1: At startup, if boot pins are set in boot from user Flash + * position and this parameter is selected the device will boot from Bank1(Default). + * For more information, please refer to AN2606 from www.st.com. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_OB_BootConfig(uint8_t OB_BOOT) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t tmp = 0, tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_OB_BOOT_BANK(OB_BOOT)); + + /* Get the User Option byte register */ + tmp1 = (FLASH->OBR & 0x007F0000) >> 16; + + /* Calculate the option byte to write */ + tmp = (uint32_t)~(OB_BOOT | tmp1)<<16; + tmp |= (OB_BOOT | tmp1); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* Write the BOOT Option Byte */ + OB->USER = tmp; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* Return the Option Byte program Status */ + return status; +} + +/** + * @brief Returns the FLASH User Option Bytes values. + * @param None + * @retval The FLASH User Option Bytes. + */ +uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return (uint8_t)(FLASH->OBR >> 20); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes value. + * @param None + * @retval The FLASH Write Protection Option Bytes value. + */ +uint32_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (uint32_t)(FLASH->WRPR); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes value. + * @note This function can be used only for STM32L1XX_HD and STM32L1XX_MDP + * density devices. + * @param None + * @retval The FLASH Write Protection Option Bytes value. + */ +uint32_t FLASH_OB_GetWRP1(void) +{ + /* Return the FLASH write protection Register value */ + return (uint32_t)(FLASH->WRPR1); +} + +/** + * @brief Returns the FLASH Write Protection Option Bytes value. + * @note This function can be used only for STM32L1XX_HD density devices. + * @param None + * @retval The FLASH Write Protection Option Bytes value. + */ +uint32_t FLASH_OB_GetWRP2(void) +{ + /* Return the FLASH write protection Register value */ + return (uint32_t)(FLASH->WRPR2); +} + +/** + * @brief Checks whether the FLASH Read out Protection Status is set or not. + * @param None + * @retval FLASH ReadOut Protection Status(SET or RESET). + */ +FlagStatus FLASH_OB_GetRDP(void) +{ + FlagStatus readstatus = RESET; + + if ((uint8_t)(FLASH->OBR) != (uint8_t)OB_RDP_Level_0) + { + readstatus = SET; + } + else + { + readstatus = RESET; + } + return readstatus; +} + +/** + * @brief Returns the SPRMOD Status. + * @note This function can be used only for STM32L1XX_MDP devices + * @param None + * @retval The SPRMOD Status. + */ +FlagStatus FLASH_OB_GetSPRMOD(void) +{ + FlagStatus readstatus = RESET; + uint16_t tmp = 0; + + /* Return the SPRMOD value */ + tmp = (uint16_t)(FLASH->OBR & (uint16_t)(0x0100)); + + if (tmp != (uint16_t)0x0000) + { + readstatus = SET; + } + else + { + readstatus = RESET; + } + return readstatus; +} + +/** + * @brief Returns the FLASH BOR level. + * @param None + * @retval The FLASH User Option Bytes. + */ +uint8_t FLASH_OB_GetBOR(void) +{ + /* Return the BOR level */ + return (uint8_t)((FLASH->OBR & (uint32_t)0x000F0000) >> 16); +} + +/** + * @} + */ + +/** @defgroup FLASH_Group5 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + ============================================================================== + ##### Interrupts and flags management functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified FLASH interrupts. + * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or + * disabled. + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: FLASH end of programming Interrupt + * @arg FLASH_IT_ERR: FLASH Error Interrupt + * @retval None + */ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FLASH_IT(FLASH_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(NewState != DISABLE) + { + /* Enable the interrupt sources */ + FLASH->PECR |= FLASH_IT; + } + else + { + /* Disable the interrupt sources */ + FLASH->PECR &= ~(uint32_t)FLASH_IT; + } +} + +/** + * @brief Checks whether the specified FLASH flag is set or not. + * @param FLASH_FLAG: specifies the FLASH flag to check. + * This parameter can be one of the following values: + * @arg FLASH_FLAG_BSY: FLASH write/erase operations in progress flag + * @arg FLASH_FLAG_EOP: FLASH End of Operation flag + * @arg FLASH_FLAG_READY: FLASH Ready flag after low power mode + * @arg FLASH_FLAG_ENDHV: FLASH End of high voltage flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_SIZERR: FLASH size error flag + * @arg FLASH_FLAG_OPTVERR: FLASH Option validity error flag + * @arg FLASH_FLAG_OPTVERRUSR: FLASH Option User validity error flag + * @arg FLASH_FLAG_RDERR: FLASH Read protected error flag (available only in STM32L1XX_MDP devices) + * @retval The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)); + + if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the new state of FLASH_FLAG (SET or RESET) */ + return bitstatus; +} + +/** + * @brief Clears the FLASH's pending flags. + * @param FLASH_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 + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_SIZERR: FLASH size error flag + * @arg FLASH_FLAG_OPTVERR: FLASH Option validity error flag + * @arg FLASH_FLAG_OPTVERRUSR: FLASH Option User validity error flag + * @arg FLASH_FLAG_RDERR: FLASH Read protected error flag (available only in STM32L1XX_MDP devices) + * @retval None + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)); + + /* Clear the flags */ + FLASH->SR = FLASH_FLAG; +} + +/** + * @brief Returns the FLASH Status. + * @param None + * @retval FLASH Status: The returned value can be: + * FLASH_BUSY, FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_GetStatus(void) +{ + FLASH_Status FLASHstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + FLASHstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & (uint32_t)FLASH_FLAG_WRPERR)!= (uint32_t)0x00) + { + FLASHstatus = FLASH_ERROR_WRP; + } + else + { + if((FLASH->SR & (uint32_t)0x1E00) != (uint32_t)0x00) + { + FLASHstatus = FLASH_ERROR_PROGRAM; + } + else + { + FLASHstatus = FLASH_COMPLETE; + } + } + } + /* Return the FLASH Status */ + return FLASHstatus; +} + + +/** + * @brief Waits for a FLASH operation to complete or a TIMEOUT to occur. + * @param Timeout: FLASH programming Timeout. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + __IO FLASH_Status status = FLASH_COMPLETE; + + /* Check for the FLASH Status */ + status = FLASH_GetStatus(); + + /* Wait for a FLASH operation to complete or a TIMEOUT to occur */ + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = FLASH_GetStatus(); + Timeout--; + } + + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +/** + * @} + */ + +/** + * @} + */ + + /** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash_ramfunc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash_ramfunc.c new file mode 100644 index 0000000..161b521 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash_ramfunc.c @@ -0,0 +1,553 @@ +/** + ****************************************************************************** + * @file stm32l1xx_flash_ramfunc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides all the Flash firmware functions which should be + * executed from the internal SRAM. This file should be placed in + * internal SRAM. + * Other FLASH memory functions that can be used from the FLASH are + * defined in the "stm32l1xx_flash.c" file. +@verbatim + + *** ARM Compiler *** + -------------------- + [..] RAM functions are defined using the toolchain options. + Functions that are be executed in RAM should reside in a separate + source module. Using the 'Options for File' dialog you can simply change + the 'Code / Const' area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the + Options for Target' dialog. + + *** ICCARM Compiler *** + ----------------------- + [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". + + *** GNU Compiler *** + -------------------- + [..] RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".data")))". + + *** TASKING Compiler *** + ------------------------ + [..] RAM functions are defined using a specific toolchain pragma. This + pragma is defined inside this file. + +@endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_flash.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup FLASH + * @brief FLASH driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static __RAM_FUNC GetStatus(void); +static __RAM_FUNC WaitForLastOperation(uint32_t Timeout); + +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup FLASH_Private_Functions + * @{ + */ + +/** @addtogroup FLASH_Group1 + * +@verbatim +@endverbatim + * @{ + */ +#if defined ( __TASKING__ ) +#pragma section_code_init on +#endif + +/** + * @brief Enable or disable the power down mode during RUN mode. + * @note This function can be used only when the user code is running from Internal SRAM. + * @param NewState: new state of the power down mode during RUN mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +__RAM_FUNC FLASH_RUNPowerDownCmd(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + + if (NewState != DISABLE) + { + /* Unlock the RUN_PD bit */ + FLASH->PDKEYR = FLASH_PDKEY1; + FLASH->PDKEYR = FLASH_PDKEY2; + + /* Set the RUN_PD bit in FLASH_ACR register to put Flash in power down mode */ + FLASH->ACR |= (uint32_t)FLASH_ACR_RUN_PD; + + if((FLASH->ACR & FLASH_ACR_RUN_PD) != FLASH_ACR_RUN_PD) + { + status = FLASH_ERROR_PROGRAM; + } + } + else + { + /* Clear the RUN_PD bit in FLASH_ACR register to put Flash in idle mode */ + FLASH->ACR &= (uint32_t)(~(uint32_t)FLASH_ACR_RUN_PD); + } + + /* Return the Write Status */ + return status; +} + +/** + * @} + */ + +/** @addtogroup FLASH_Group2 + * +@verbatim +@endverbatim + * @{ + */ + +/** + * @brief Erases a specified 2 page in program memory in parallel. + * @note This function can be used only for STM32L1XX_HD density devices. + * To correctly run this function, the FLASH_Unlock() function + * must be called before. + * Call the FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation). + * @param Page_Address1: The page address in program memory to be erased in + * the first Bank (BANK1). This parameter should be between 0x08000000 + * and 0x0802FF00. + * @param Page_Address2: The page address in program memory to be erased in + * the second Bank (BANK2). This parameter should be between 0x08030000 + * and 0x0805FF00. + * @note A Page is erased in the Program memory only if the address to load + * is the start address of a page (multiple of 256 bytes). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseParallelPage(uint32_t Page_Address1, uint32_t Page_Address2) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to erase the page */ + + /* Set the PARALLBANK bit */ + FLASH->PECR |= FLASH_PECR_PARALLBANK; + + /* Set the ERASE bit */ + FLASH->PECR |= FLASH_PECR_ERASE; + + /* Set PROG bit */ + FLASH->PECR |= FLASH_PECR_PROG; + + /* Write 00000000h to the first word of the first program page to erase */ + *(__IO uint32_t *)Page_Address1 = 0x00000000; + /* Write 00000000h to the first word of the second program page to erase */ + *(__IO uint32_t *)Page_Address2 = 0x00000000; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* If the erase operation is completed, disable the ERASE, PROG and PARALLBANK bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PROG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_ERASE); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PARALLBANK); + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Programs a half page in program memory. + * @param Address: specifies the address to be written. + * @param pBuffer: pointer to the buffer containing the data to be written to + * the half page. + * @note To correctly run this function, the FLASH_Unlock() function + * must be called before. + * Call the FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @note Half page write is possible only from SRAM. + * @note If there are more than 32 words to write, after 32 words another + * Half Page programming operation starts and has to be finished. + * @note A half page is written to the program memory only if the first + * address to load is the start address of a half page (multiple of 128 + * bytes) and the 31 remaining words to load are in the same half page. + * @note During the Program memory half page write all read operations are + * forbidden (this includes DMA read operations and debugger read + * operations such as breakpoints, periodic updates, etc.). + * @note If a PGAERR is set during a Program memory half page write, the + * complete write operation is aborted. Software should then reset the + * FPRG and PROG/DATA bits and restart the write operation from the + * beginning. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +__RAM_FUNC FLASH_ProgramHalfPage(uint32_t Address, uint32_t* pBuffer) +{ + uint32_t count = 0; + + FLASH_Status status = FLASH_COMPLETE; + + /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) + This bit prevents the interruption of multicycle instructions and therefore + will increase the interrupt latency. of Cortex-M3. */ + SCnSCB->ACTLR |= SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* if the previous operation is completed, proceed to program the new + half page */ + FLASH->PECR |= FLASH_PECR_FPRG; + FLASH->PECR |= FLASH_PECR_PROG; + + /* Write one half page directly with 32 different words */ + while(count < 32) + { + *(__IO uint32_t*) (Address + (4 * count)) = *(pBuffer++); + count ++; + } + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* if the write operation is completed, disable the PROG and FPRG bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PROG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_FPRG); + } + + SCnSCB->ACTLR &= ~SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Return the Write Status */ + return status; +} + +/** + * @brief Programs 2 half page in program memory in parallel. + * @param Address1: specifies the first address to be written in the first bank + * (BANK1). This parameter should be between 0x08000000 and 0x0802FF80. + * @param pBuffer1: pointer to the buffer containing the data to be written + * to the first half page in the first bank. + * @param Address2: specifies the second address to be written in the second bank + * (BANK2). This parameter should be between 0x08030000 and 0x0805FF80. + * @param pBuffer2: pointer to the buffer containing the data to be written + * to the second half page in the second bank. + * @note This function can be used only for STM32L1XX_HD density devices. + * @note To correctly run this function, the FLASH_Unlock() function + * must be called before. + * Call the FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation). + * @note Half page write is possible only from SRAM. + * @note If there are more than 32 words to write, after 32 words another + * Half Page programming operation starts and has to be finished. + * @note A half page is written to the program memory only if the first + * address to load is the start address of a half page (multiple of 128 + * bytes) and the 31 remaining words to load are in the same half page. + * @note During the Program memory half page write all read operations are + * forbidden (this includes DMA read operations and debugger read + * operations such as breakpoints, periodic updates, etc.). + * @note If a PGAERR is set during a Program memory half page write, the + * complete write operation is aborted. Software should then reset the + * FPRG and PROG/DATA bits and restart the write operation from the + * beginning. + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +__RAM_FUNC FLASH_ProgramParallelHalfPage(uint32_t Address1, uint32_t* pBuffer1, uint32_t Address2, uint32_t* pBuffer2) +{ + uint32_t count = 0; + + FLASH_Status status = FLASH_COMPLETE; + + /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) + This bit prevents the interruption of multicycle instructions and therefore + will increase the interrupt latency. of Cortex-M3. */ + SCnSCB->ACTLR |= SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to program the new + half page */ + FLASH->PECR |= FLASH_PECR_PARALLBANK; + FLASH->PECR |= FLASH_PECR_FPRG; + FLASH->PECR |= FLASH_PECR_PROG; + + /* Write the first half page directly with 32 different words */ + while(count < 32) + { + *(__IO uint32_t*) (Address1 + (4 * count)) = *(pBuffer1++); + count ++; + } + count = 0; + /* Write the second half page directly with 32 different words */ + while(count < 32) + { + *(__IO uint32_t*) (Address2 + (4 * count)) = *(pBuffer2++); + count ++; + } + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* if the write operation is completed, disable the PROG, FPRG and PARALLBANK bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PROG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_FPRG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_PARALLBANK); + } + + SCnSCB->ACTLR &= ~SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Return the Write Status */ + return status; +} + +/** + * @} + */ + +/** @addtogroup FLASH_Group3 + * +@verbatim +@endverbatim + * @{ + */ + +/** + * @brief Erase a double word in data memory. + * @param Address: specifies the address to be erased. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @note Data memory double word erase is possible only from SRAM. + * @note A double word is erased to the data memory only if the first address + * to load is the start address of a double word (multiple of 8 bytes). + * @note During the Data memory double word erase, all read operations are + * forbidden (this includes DMA read operations and debugger read + * operations such as breakpoints, periodic updates, etc.). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ + +__RAM_FUNC DATA_EEPROM_EraseDoubleWord(uint32_t Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) + This bit prevents the interruption of multicycle instructions and therefore + will increase the interrupt latency. of Cortex-M3. */ + SCnSCB->ACTLR |= SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to erase the next double word */ + /* Set the ERASE bit */ + FLASH->PECR |= FLASH_PECR_ERASE; + + /* Set DATA bit */ + FLASH->PECR |= FLASH_PECR_DATA; + + /* Write 00000000h to the 2 words to erase */ + *(__IO uint32_t *)Address = 0x00000000; + Address += 4; + *(__IO uint32_t *)Address = 0x00000000; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* If the erase operation is completed, disable the ERASE and DATA bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_ERASE); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_DATA); + } + + SCnSCB->ACTLR &= ~SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Return the erase status */ + return status; +} + +/** + * @brief Write a double word in data memory without erase. + * @param Address: specifies the address to be written. + * @param Data: specifies the data to be written. + * @note To correctly run this function, the DATA_EEPROM_Unlock() function + * must be called before. + * Call the DATA_EEPROM_Lock() to he data EEPROM access + * and Flash program erase control register access(recommended to protect + * the DATA_EEPROM against possible unwanted operation). + * @note Data memory double word write is possible only from SRAM. + * @note A data memory double word is written to the data memory only if the + * first address to load is the start address of a double word (multiple + * of double word). + * @note During the Data memory double word write, all read operations are + * forbidden (this includes DMA read operations and debugger read + * operations such as breakpoints, periodic updates, etc.). + * @retval FLASH Status: The returned value can be: + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +__RAM_FUNC DATA_EEPROM_ProgramDoubleWord(uint32_t Address, uint64_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + /* Set the DISMCYCINT[0] bit in the Auxillary Control Register (0xE000E008) + This bit prevents the interruption of multicycle instructions and therefore + will increase the interrupt latency. of Cortex-M3. */ + SCnSCB->ACTLR |= SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + if(status == FLASH_COMPLETE) + { + /* If the previous operation is completed, proceed to program the new data*/ + FLASH->PECR |= FLASH_PECR_FPRG; + FLASH->PECR |= FLASH_PECR_DATA; + + /* Write the 2 words */ + *(__IO uint32_t *)Address = (uint32_t) Data; + Address += 4; + *(__IO uint32_t *)Address = (uint32_t) (Data >> 32); + + /* Wait for last operation to be completed */ + status = WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); + + /* If the write operation is completed, disable the FPRG and DATA bits */ + FLASH->PECR &= (uint32_t)(~FLASH_PECR_FPRG); + FLASH->PECR &= (uint32_t)(~FLASH_PECR_DATA); + } + + SCnSCB->ACTLR &= ~SCnSCB_ACTLR_DISMCYCINT_Msk; + + /* Return the Write Status */ + return status; +} + +/** + * @} + */ + +/** + * @brief Returns the FLASH Status. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP or FLASH_COMPLETE + */ +static __RAM_FUNC GetStatus(void) +{ + FLASH_Status FLASHstatus = FLASH_COMPLETE; + + if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + FLASHstatus = FLASH_BUSY; + } + else + { + if((FLASH->SR & (uint32_t)FLASH_FLAG_WRPERR)!= (uint32_t)0x00) + { + FLASHstatus = FLASH_ERROR_WRP; + } + else + { + if((FLASH->SR & (uint32_t)0x1E00) != (uint32_t)0x00) + { + FLASHstatus = FLASH_ERROR_PROGRAM; + } + else + { + FLASHstatus = FLASH_COMPLETE; + } + } + } + /* Return the FLASH Status */ + return FLASHstatus; +} + +/** + * @brief Waits for a FLASH operation to complete or a TIMEOUT to occur. + * @param Timeout: FLASH programming Timeout + * @retval FLASH Status: The returned value can be: FLASH_BUSY, + * FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or + * FLASH_TIMEOUT. + */ +static __RAM_FUNC WaitForLastOperation(uint32_t Timeout) +{ + __IO FLASH_Status status = FLASH_COMPLETE; + + /* Check for the FLASH Status */ + status = GetStatus(); + + /* Wait for a FLASH operation to complete or a TIMEOUT to occur */ + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = GetStatus(); + Timeout--; + } + + if(Timeout == 0x00 ) + { + status = FLASH_TIMEOUT; + } + /* Return the operation status */ + return status; +} + +#if defined ( __TASKING__ ) +#pragma section_code_init restore +#endif + +/** + * @} + */ + + /** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_fsmc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_fsmc.c new file mode 100644 index 0000000..0499026 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_fsmc.c @@ -0,0 +1,285 @@ +/** + ****************************************************************************** + * @file stm32l1xx_fsmc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the FSMC peripheral: + * + Initialization + * + Interrupts and flags management + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_fsmc.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** @defgroup FSMC_Group1 NOR/SRAM Controller functions + * @brief NOR/SRAM Controller functions + * + @verbatim + ============================================================================== + ##### NOR-SRAM Controller functions ##### + ============================================================================== + [..] The following sequence should be followed to configure the FSMC to + interface with SRAM, PSRAM, NOR or OneNAND memory connected to the + NOR/SRAM Bank: + (#) Enable the clock for the FSMC and associated GPIOs using the following + functions: + (++)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); + (++)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOx, ENABLE); + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the + function GPIO_Init(); + (#) Declare a FSMC_NORSRAMInitTypeDef structure, for example: + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; and fill the + FSMC_NORSRAMInitStructure variable with the allowed values of the + structure member. + (#) Initialize the NOR/SRAM Controller by calling the function + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + (#) Then enable the NOR/SRAM Bank, for example: + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); + (#) At this stage you can read/write from/to the memory connected to the + NOR/SRAM Bank. + +@endverbatim + + * @{ + */ + +/** + * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef + * structure that contains the configuration information for + * the FSMC NOR/SRAM specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Bank1 NOR/SRAM control register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)FSMC_BCR1_FACCEN; + } + + /* Bank1 NOR/SRAM timing register configuration */ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef + * structure which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the MBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= FSMC_BCR1_MBKEN; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the MBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= (uint32_t)(~FSMC_BCR1_MBKEN); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_gpio.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_gpio.c new file mode 100644 index 0000000..6a306c6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_gpio.c @@ -0,0 +1,557 @@ +/** + ****************************************************************************** + * @file stm32l1xx_gpio.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the GPIO peripheral: + * + Initialization and Configuration + * + GPIO Read and Write + * + GPIO Alternate functions configuration + * + * @verbatim + =========================================================================== + ##### How to use this driver ##### + =========================================================================== + [..] + (#) Enable the GPIO AHB clock using RCC_AHBPeriphClockCmd() + (#) Configure the GPIO pin(s) using GPIO_Init() + Four possible configuration are available for each pin: + (++) Input: Floating, Pull-up, Pull-down. + (++) Output: Push-Pull (Pull-up, Pull-down or no Pull) + Open Drain (Pull-up, Pull-down or no Pull). + In output mode, the speed is configurable: Very Low, Low, + Medium or High. + (++) Alternate Function: Push-Pull (Pull-up, Pull-down or no Pull) + Open Drain (Pull-up, Pull-down or no Pull). + (++) Analog: required mode when a pin is to be used as ADC channel, + DAC output or comparator input. + (#) Peripherals alternate function: + (++) For ADC, DAC and comparators, configure the desired pin in + analog mode using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN + (++) For other peripherals (TIM, USART...): + (+++) Connect the pin to the desired peripherals' Alternate + Function (AF) using GPIO_PinAFConfig() function. + (+++) Configure the desired pin in alternate function mode using + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF + (+++) Select the type, pull-up/pull-down and output speed via + GPIO_PuPd, GPIO_OType and GPIO_Speed members. + (+++) Call GPIO_Init() function. + (#) To get the level of a pin configured in input mode use GPIO_ReadInputDataBit() + (#) To set/reset the level of a pin configured in output mode use + GPIO_SetBits()/GPIO_ResetBits() + (#) During and just after reset, the alternate functions are not + active and the GPIO pins are configured in input floating mode + (except JTAG pins). + (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as + general-purpose (PC14 and PC15, respectively) when the LSE + oscillator is off. The LSE has priority over the GPIO function. + (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as + general-purpose PH0 and PH1, respectively, when the HSE + oscillator is off. The HSE has priority over the GPIO function. + @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_gpio.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup GPIO + * @brief GPIO driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup GPIO_Private_Functions + * @{ + */ + +/** @defgroup GPIO_Group1 Initialization and Configuration + * @brief Initialization and Configuration + * +@verbatim + =============================================================================== + ##### Initialization and Configuration ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset + * values. + * By default, The GPIO pins are configured in input floating mode + * (except JTAG pins). + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + if(GPIOx == GPIOA) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, DISABLE); + } + else if(GPIOx == GPIOB) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, DISABLE); + } + else if(GPIOx == GPIOC) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, DISABLE); + } + else if(GPIOx == GPIOD) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, DISABLE); + } + else if(GPIOx == GPIOE) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, DISABLE); + } + else if(GPIOx == GPIOF) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, DISABLE); + } + else if(GPIOx == GPIOG) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOG, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOG, DISABLE); + } + else + { + if(GPIOx == GPIOH) + { + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOH, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOH, DISABLE); + } + } +} + +/** + * @brief Initializes the GPIOx peripheral according to the specified + * parameters in the GPIO_InitStruct. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO + * peripheral. + + * @retval None + */ +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) +{ + uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); + assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); + assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd)); + + /* -------------------------Configure the port pins---------------- */ + /*-- GPIO Mode Configuration --*/ + for (pinpos = 0x00; pinpos < 0x10; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + + /* Get the port pins position */ + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + + if (currentpin == pos) + { + GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2)); + + GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2)); + + if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF)) + { + /* Check Speed mode parameters */ + assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); + + /* Speed mode configuration */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2)); + GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2)); + + /*Check Output mode parameters */ + assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType)); + + /* Output mode configuration */ + GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ; + GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos)); + } + + /* Pull-up Pull down resistor configuration */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2)); + GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2)); + } + } +} + +/** + * @brief Fills each GPIO_InitStruct member with its default value. + * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStruct->GPIO_OType = GPIO_OType_PP; + GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL; +} + +/** + * @brief Locks GPIO Pins configuration registers. + * The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, + * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. + * The configuration of the locked GPIO pins can no longer be modified + * until the next reset. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + __IO uint32_t tmp = 0x00010000; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + tmp |= GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Reset LCKK bit */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKK bit */ + GPIOx->LCKR = tmp; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; + /* Read LCKK bit*/ + tmp = GPIOx->LCKR; +} + +/** + * @} + */ + +/** @defgroup GPIO_Group2 GPIO Read and Write + * @brief GPIO Read and Write + * +@verbatim + =============================================================================== + ##### GPIO Read and Write ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO input data port. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @retval GPIO input data port value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->IDR); +} + +/** + * @brief Reads the specified output data port bit. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: Specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * @retval The output port pin value. + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + return bitstatus; +} + +/** + * @brief Reads the specified GPIO output data port. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @retval GPIO output data port value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + return ((uint16_t)GPIOx->ODR); +} + +/** + * @brief Sets the selected data port bits. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @note This functions uses GPIOx_BSRR register to allow atomic read/modify + * accesses. In this way, there is no risk of an IRQ occurring between + * the read and the modify access. + * @retval None + */ +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BSRRL = GPIO_Pin; +} + +/** + * @brief Clears the selected data port bits. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @note This functions uses GPIOx_BSRR register to allow atomic read/modify + * accesses. In this way, there is no risk of an IRQ occurring between + * the read and the modify access. + * @retval None + */ +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + GPIOx->BSRRH = GPIO_Pin; +} + +/** + * @brief Sets or clears the selected data port bit. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be one of the BitAction enum values: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @retval None + */ +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_BIT_ACTION(BitVal)); + + if (BitVal != Bit_RESET) + { + GPIOx->BSRRL = GPIO_Pin; + } + else + { + GPIOx->BSRRH = GPIO_Pin ; + } +} + +/** + * @brief Writes data to the specified GPIO data port. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param PortVal: specifies the value to be written to the port output data + * register. + * @retval None + */ +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + GPIOx->ODR = PortVal; +} + +/** + * @brief Toggles the specified GPIO pins.. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_Pin: Specifies the pins to be toggled. + * @retval None + */ +void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + + GPIOx->ODR ^= GPIO_Pin; +} + +/** + * @} + */ + +/** @defgroup GPIO_Group3 GPIO Alternate functions configuration functions + * @brief GPIO Alternate functions configuration functions + * +@verbatim + =============================================================================== + ##### GPIO Alternate functions configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Changes the mapping of the specified pin. + * @param GPIOx: where x can be (A..H) to select the GPIO peripheral. + * @param GPIO_PinSource: specifies the pin for the Alternate function. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * @param GPIO_AFSelection: selects the pin to used as Alternat function. + * This parameter can be one of the following values: + * @arg GPIO_AF_RTC_50Hz: RTC 50/60 Hz synchronization + * @arg GPIO_AF_MCO: Microcontroller clock output + * @arg GPIO_AF_RTC_AF1: Time stamp, Tamper, Alarm A out, Alarm B out, + * 512 Hz clock output (with an LSE oscillator of 32.768 kHz) + * @arg GPIO_AF_WKUP: wakeup + * @arg GPIO_AF_SWJ: SWJ (SW and JTAG) + * @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset) + * @arg GPIO_AF_TIM2c: Connect TIM2 pins to AF1 + * @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2 + * @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2 + * @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2 + * @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3 + * @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3 + * @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3 + * @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4 + * @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4 + * @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5 + * @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5 + * @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6 + * @arg GPIO_AF_USART1: Connect USART1 pins to AF7 + * @arg GPIO_AF_USART2: Connect USART2 pins to AF7 + * @arg GPIO_AF_USART3: Connect USART3 pins to AF7 + * @arg GPIO_AF_UART4: Connect UART4 pins to AF8 + * @arg GPIO_AF_UART5: Connect UART5 pins to AF8 + * @arg GPIO_AF_USB: Connect USB pins to AF10 + * @arg GPIO_AF_LCD: Connect LCD pins to AF11 + * @arg GPIO_AF_FSMC: Connect FSMC pins to AF12 + * @arg GPIO_AF_SDIO: Connect SDIO pins to AF12 + * @arg GPIO_AF_RI: Connect RI pins to AF14 + * @arg GPIO_AF_EVENTOUT: Cortex-M3 EVENTOUT signal + * @note The pin should already been configured in Alternate Function mode(AF) + * using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF + * @note Please refer to the Alternate function mapping table in the device + * datasheet for the detailed mapping of the system and peripherals' + * alternate function I/O pins. + * @note EVENTOUT is not mapped on PH0, PH1 and PH2. + * @retval None + */ +void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) +{ + uint32_t temp = 0x00; + uint32_t temp_2 = 0x00; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); + assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); + assert_param(IS_GPIO_AF(GPIO_AF)); + + temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; + GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; + temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp; + GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_i2c.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_i2c.c new file mode 100644 index 0000000..0d66d17 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_i2c.c @@ -0,0 +1,1364 @@ +/** + ****************************************************************************** + * @file stm32l1xx_i2c.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Inter-integrated circuit (I2C) + * + Initialization and Configuration + * + Data transfers + * + PEC management + * + DMA transfers management + * + Interrupts, events and flags management + * + * @verbatim + * + * ============================================================================ + * ##### How to use this driver ##### + * ============================================================================ + [..] + (#) Enable peripheral clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2Cx, ENABLE) + function for I2C1 or I2C2. + (#) Enable SDA, SCL and SMBA (when used) GPIO clocks using + RCC_AHBPeriphClockCmd() function. + (#) Peripherals alternate function: + (++) Connect the pin to the desired peripherals' Alternate + Function (AF) using GPIO_PinAFConfig() function. + (++) Configure the desired pin in alternate function by: + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF + (++) Select the type, pull-up/pull-down and output speed via + GPIO_PuPd, GPIO_OType and GPIO_Speed members + (++) Call GPIO_Init() function. + (#) Program the Mode, duty cycle , Own address, Ack, Speed and Acknowledged + Address using the I2C_Init() function. + (#) Optionally you can enable/configure the following parameters without + re-initialization (i.e there is no need to call again I2C_Init() function): + (++) Enable the acknowledge feature using I2C_AcknowledgeConfig() function. + (++) Enable the dual addressing mode using I2C_DualAddressCmd() function. + (++) Enable the general call using the I2C_GeneralCallCmd() function. + (++) Enable the clock stretching using I2C_StretchClockCmd() function. + (++) Enable the fast mode duty cycle using the I2C_FastModeDutyCycleConfig() + function. + (++) Enable the PEC Calculation using I2C_CalculatePEC() function. + (++) For SMBus Mode: + (+++) Enable the Address Resolution Protocol (ARP) using I2C_ARPCmd() function. + (+++) Configure the SMBusAlert pin using I2C_SMBusAlertConfig() function. + (#) Enable the NVIC and the corresponding interrupt using the function + I2C_ITConfig() if you need to use interrupt mode. + (#) When using the DMA mode + (++) Configure the DMA using DMA_Init() function. + (++) Active the needed channel Request using I2C_DMACmd() or + I2C_DMALastTransferCmd() function. + (#) Enable the I2C using the I2C_Cmd() function. + (#) Enable the DMA using the DMA_Cmd() function when using DMA mode in the + transfers. + @endverbatim + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_i2c.h" +#include "stm32l1xx_rcc.h" + + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup I2C + * @brief I2C driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +#define CR1_CLEAR_MASK ((uint16_t)0xFBF5) /*I2C_ClockSpeed)); + assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); + assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); + assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); + assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); + +/*---------------------------- I2Cx CR2 Configuration ------------------------*/ + /* Get the I2Cx CR2 value */ + tmpreg = I2Cx->CR2; + /* Clear frequency FREQ[5:0] bits */ + tmpreg &= (uint16_t)~((uint16_t)I2C_CR2_FREQ); + /* Get pclk1 frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + /* Set frequency bits depending on pclk1 value */ + freqrange = (uint16_t)(pclk1 / 1000000); + tmpreg |= freqrange; + /* Write to I2Cx CR2 */ + I2Cx->CR2 = tmpreg; + +/*---------------------------- I2Cx CCR Configuration ------------------------*/ + /* Disable the selected I2C peripheral to configure TRISE */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PE); + /* Reset tmpreg value */ + /* Clear F/S, DUTY and CCR[11:0] bits */ + tmpreg = 0; + + /* Configure speed in standard mode */ + if (I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + /* Standard mode speed calculate */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + /* Test if CCR value is under 0x4*/ + if (result < 0x04) + { + /* Set minimum allowed value */ + result = 0x04; + } + /* Set speed value for standard mode */ + tmpreg |= result; + /* Set Maximum Rise Time for standard mode */ + I2Cx->TRISE = freqrange + 1; + } + /* Configure speed in fast mode */ + /* To use the I2C at 400 KHz (in fast mode), the PCLK1 frequency (I2C peripheral + input clock) must be a multiple of 10 MHz */ + else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ + { + if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + /* Fast mode speed calculate: Tlow/Thigh = 2 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ + { + /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + /* Set DUTY bit */ + result |= I2C_DutyCycle_16_9; + } + + /* Test if CCR value is under 0x1*/ + if ((result & I2C_CCR_CCR) == 0) + { + /* Set minimum allowed value */ + result |= (uint16_t)0x0001; + } + /* Set speed value and set F/S bit for fast mode */ + tmpreg |= (uint16_t)(result | I2C_CCR_FS); + /* Set Maximum Rise Time for fast mode */ + I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + /* Write to I2Cx CCR */ + I2Cx->CCR = tmpreg; + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= I2C_CR1_PE; + +/*---------------------------- I2Cx CR1 Configuration ------------------------*/ + /* Get the I2Cx CR1 value */ + tmpreg = I2Cx->CR1; + /* Clear ACK, SMBTYPE and SMBUS bits */ + tmpreg &= CR1_CLEAR_MASK; + /* Configure I2Cx: mode and acknowledgement */ + /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ + /* Set ACK bit according to I2C_Ack value */ + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + /* Write to I2Cx CR1 */ + I2Cx->CR1 = tmpreg; + +/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ + /* Set I2Cx Own Address1 and acknowledged address */ + I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/** + * @brief Fills each I2C_InitStruct member with its default value. + * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) +{ +/*---------------- Reset I2C init structure parameters values ----------------*/ + /* initialize the I2C_ClockSpeed member */ + I2C_InitStruct->I2C_ClockSpeed = 5000; + /* Initialize the I2C_Mode member */ + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + /* Initialize the I2C_DutyCycle member */ + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + /* Initialize the I2C_OwnAddress1 member */ + I2C_InitStruct->I2C_OwnAddress1 = 0; + /* Initialize the I2C_Ack member */ + I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; + /* Initialize the I2C_AcknowledgedAddress member */ + I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; +} + +/** + * @brief Enables or disables the specified I2C peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C peripheral */ + I2Cx->CR1 |= I2C_CR1_PE; + } + else + { + /* Disable the selected I2C peripheral */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PE); + } +} + +/** + * @brief Generates I2Cx communication START condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C START condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a START condition */ + I2Cx->CR1 |= I2C_CR1_START; + } + else + { + /* Disable the START condition generation */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_START); + } +} + +/** + * @brief Generates I2Cx communication STOP condition. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C STOP condition generation. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Generate a STOP condition */ + I2Cx->CR1 |= I2C_CR1_STOP; + } + else + { + /* Disable the STOP condition generation */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_STOP); + } +} + +/** + * @brief Enables or disables the specified I2C acknowledge feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C Acknowledgement. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the acknowledgement */ + I2Cx->CR1 |= I2C_CR1_ACK; + } + else + { + /* Disable the acknowledgement */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ACK); + } +} + +/** + * @brief Configures the specified I2C own address2. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the 7bit I2C own address2. + * @retval None. + */ +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Get the old register value */ + tmpreg = I2Cx->OAR2; + + /* Reset I2Cx Own address2 bit [7:1] */ + tmpreg &= (uint16_t)~((uint16_t)I2C_OAR2_ADD2); + + /* Set I2Cx Own address2 */ + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + + /* Store the new register value */ + I2Cx->OAR2 = tmpreg; +} + +/** + * @brief Enables or disables the specified I2C dual addressing mode. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C dual addressing mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable dual addressing mode */ + I2Cx->OAR2 |= I2C_OAR2_ENDUAL; + } + else + { + /* Disable dual addressing mode */ + I2Cx->OAR2 &= (uint16_t)~((uint16_t)I2C_OAR2_ENDUAL); + } +} + +/** + * @brief Enables or disables the specified I2C general call feature. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C General call. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable generall call */ + I2Cx->CR1 |= I2C_CR1_ENGC; + } + else + { + /* Disable generall call */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENGC); + } +} + +/** + * @brief Enables or disables the specified I2C software reset. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C software reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Peripheral under reset */ + I2Cx->CR1 |= I2C_CR1_SWRST; + } + else + { + /* Peripheral not under reset */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_SWRST); + } +} + +/** + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_SMBusAlert: specifies SMBAlert pin level. + * This parameter can be one of the following values: + * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low + * @arg I2C_SMBusAlert_High: SMBAlert pin driven high + * @retval None + */ +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); + if (I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + /* Drive the SMBusAlert pin Low */ + I2Cx->CR1 |= I2C_SMBusAlert_Low; + } + else + { + /* Drive the SMBusAlert pin High */ + I2Cx->CR1 &= I2C_SMBusAlert_High; + } +} + +/** + * @brief Enables or disables the specified I2C ARP. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx ARP. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C ARP */ + I2Cx->CR1 |= I2C_CR1_ENARP; + } + else + { + /* Disable the selected I2C ARP */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENARP); + } +} + +/** + * @brief Enables or disables the specified I2C Clock stretching. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx Clock stretching. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState == DISABLE) + { + /* Enable the selected I2C Clock stretching */ + I2Cx->CR1 |= I2C_CR1_NOSTRETCH; + } + else + { + /* Disable the selected I2C Clock stretching */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_NOSTRETCH); + } +} + +/** + * @brief Selects the specified I2C fast mode duty cycle. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_DutyCycle: specifies the fast mode duty cycle. + * This parameter can be one of the following values: + * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 + * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @retval None + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); + if (I2C_DutyCycle != I2C_DutyCycle_16_9) + { + /* I2C fast mode Tlow/Thigh=2 */ + I2Cx->CCR &= I2C_DutyCycle_2; + } + else + { + /* I2C fast mode Tlow/Thigh=16/9 */ + I2Cx->CCR |= I2C_DutyCycle_16_9; + } +} + +/** + * @brief Transmits the address byte to select the slave device. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Address: specifies the slave address which will be transmitted. + * @param I2C_Direction: specifies whether the I2C device will be a + * Transmitter or a Receiver. This parameter can be one of the following values: + * @arg I2C_Direction_Transmitter: Transmitter mode + * @arg I2C_Direction_Receiver: Receiver mode + * @retval None. + */ +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_DIRECTION(I2C_Direction)); + /* Test on the direction to set/reset the read/write bit */ + if (I2C_Direction != I2C_Direction_Transmitter) + { + /* Set the address bit0 for read */ + Address |= I2C_OAR1_ADD0; + } + else + { + /* Reset the address bit0 for write */ + Address &= (uint8_t)~((uint8_t)I2C_OAR1_ADD0); + } + /* Send the address */ + I2Cx->DR = Address; +} + +/** + * @} + */ + +/** @defgroup I2C_Group2 Data transfers functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### Data transfers functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Sends a data byte through the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param Data: Byte to be transmitted. + * @retval None + */ +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Write in the DR register the data to be sent */ + I2Cx->DR = Data; +} + +/** + * @brief Returns the most recent received data by the I2Cx peripheral. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The value of the received data. + */ +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the data in the DR register */ + return (uint8_t)I2Cx->DR; +} + +/** + * @brief Selects the specified I2C NACK position in master receiver mode. + * This function is useful in I2C Master Receiver mode when the number + * of data to be received is equal to 2. In this case, this function + * should be called (with parameter I2C_NACKPosition_Next) before data + * reception starts,as described in the 2-byte reception procedure + * recommended in Reference Manual in Section: Master receiver. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_NACKPosition: specifies the NACK position. + * This parameter can be one of the following values: + * @arg I2C_NACKPosition_Next: indicates that the next byte will be the last + * received byte. + * @arg I2C_NACKPosition_Current: indicates that current byte is the last + * received byte. + * @note This function configures the same bit (POS) as I2C_PECPositionConfig() + * but is intended to be used in I2C mode while I2C_PECPositionConfig() + * is intended to used in SMBUS mode. + * + * @retval None + */ +void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_NACK_POSITION(I2C_NACKPosition)); + + /* Check the input parameter */ + if (I2C_NACKPosition == I2C_NACKPosition_Next) + { + /* Next byte in shift register is the last received byte */ + I2Cx->CR1 |= I2C_NACKPosition_Next; + } + else + { + /* Current byte in shift register is the last received byte */ + I2Cx->CR1 &= I2C_NACKPosition_Current; + } +} + +/** + * @} + */ + +/** @defgroup I2C_Group3 PEC management functions + * @brief PEC management functions + * +@verbatim + =============================================================================== + ##### PEC management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified I2C PEC transfer. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C PEC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC transmission */ + I2Cx->CR1 |= I2C_CR1_PEC; + } + else + { + /* Disable the selected I2C PEC transmission */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PEC); + } +} + +/** + * @brief Selects the specified I2C PEC position. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_PECPosition: specifies the PEC position. + * This parameter can be one of the following values: + * @arg I2C_PECPosition_Next: indicates that the next byte is PEC + * @arg I2C_PECPosition_Current: indicates that current byte is PEC + * @note This function configures the same bit (POS) as I2C_NACKPositionConfig() + * but is intended to be used in SMBUS mode while I2C_NACKPositionConfig() + * is intended to used in I2C mode. + * @retval None + */ +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); + if (I2C_PECPosition == I2C_PECPosition_Next) + { + /* Next byte in shift register is PEC */ + I2Cx->CR1 |= I2C_PECPosition_Next; + } + else + { + /* Current byte in shift register is PEC */ + I2Cx->CR1 &= I2C_PECPosition_Current; + } +} + +/** + * @brief Enables or disables the PEC value calculation of the transferred bytes. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2Cx PEC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C PEC calculation */ + I2Cx->CR1 |= I2C_CR1_ENPEC; + } + else + { + /* Disable the selected I2C PEC calculation */ + I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENPEC); + } +} + +/** + * @brief Returns the PEC value for the specified I2C. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @retval The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + /* Return the selected I2C PEC value */ + return ((I2Cx->SR2) >> 8); +} + +/** + * @} + */ + +/** @defgroup I2C_Group4 DMA transfers management functions + * @brief DMA transfers management functions + * +@verbatim + =============================================================================== + ##### DMA transfers management functions ##### + =============================================================================== + [..] This section provides functions allowing to configure the I2C DMA channels + requests. +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified I2C DMA requests. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected I2C DMA requests */ + I2Cx->CR2 |= I2C_CR2_DMAEN; + } + else + { + /* Disable the selected I2C DMA requests */ + I2Cx->CR2 &= (uint16_t)~((uint16_t)I2C_CR2_DMAEN); + } +} + +/** + * @brief Specifies that the next DMA transfer is the last one. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param NewState: new state of the I2C DMA last transfer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Next DMA transfer is the last transfer */ + I2Cx->CR2 |= I2C_CR2_LAST; + } + else + { + /* Next DMA transfer is not the last transfer */ + I2Cx->CR2 &= (uint16_t)~((uint16_t)I2C_CR2_LAST); + } +} + +/** + * @} + */ + +/** @defgroup I2C_Group5 Interrupts events and flags management functions + * @brief Interrupts, events and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts, events and flags management functions ##### + =============================================================================== + [..] This section provides functions allowing to configure the I2C Interrupts + sources and check or clear the flags or pending bits status. + The user should identify which mode will be used in his application to manage + the communication: Polling mode, Interrupt mode or DMA mode. + + + ##### I2C State Monitoring Functions ##### + =============================================================================== + [..]This I2C driver provides three different ways for I2C state monitoring + depending on the application requirements and constraints: + + + ***. Basic state monitoring (Using I2C_CheckEvent() function) *** + ----------------------------------------------------------------- + [..]It compares the status registers (SR1 and SR2) content to a given event + (can be the combination of one or more flags). + It returns SUCCESS if the current status includes the given flags + and returns ERROR if one or more flags are missing in the current status. + + (+) When to use + (++) This function is suitable for most applications as well as for + startup activity since the events are fully described in the product + reference manual (RM0038). + (++) It is also suitable for users who need to define their own events. + (+) Limitations + (++) If an error occurs (ie. error flags are set besides to the monitored + flags), the I2C_CheckEvent() function may return SUCCESS despite + the communication hold or corrupted real state. + In this case, it is advised to use error interrupts to monitor + the error events and handle them in the interrupt IRQ handler. + -@@- For error management, it is advised to use the following functions: + (+@@) I2C_ITConfig() to configure and enable the error interrupts + (I2C_IT_ERR). + (+@@) I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. + Where x is the peripheral instance (I2C1, I2C2 ...). + (+@@) I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the + I2Cx_ER_IRQHandler() function in order to determine which error occurred. + (+@@) I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() + and/or I2C_GenerateStop() in order to clear the error flag and source + and return to correct communication status. + + *** Advanced state monitoring (Using the function I2C_GetLastEvent()) *** + ------------------------------------------------------------------------- + [..] Using the function I2C_GetLastEvent() which returns the image of both status + registers in a single word (uint32_t) (Status Register 2 value is shifted left + by 16 bits and concatenated to Status Register 1). + + (+) When to use + (++) This function is suitable for the same applications above but it + allows to overcome the mentioned limitation of I2C_GetFlagStatus() + function. + (++) The returned value could be compared to events already defined in + the library (stm32l1xx_i2c.h) or to custom values defined by user. + This function is suitable when multiple flags are monitored at the + same time. + (++) At the opposite of I2C_CheckEvent() function, this function allows + user to choose when an event is accepted (when all events flags are + set and no other flags are set or just when the needed flags are set + like I2C_CheckEvent() function. + + (+) Limitations + (++) User may need to define his own events. + (++) Same remark concerning the error management is applicable for this + function if user decides to check only regular communication flags + (and ignores error flags). + + + *** Flag-based state monitoring (Using the function I2C_GetFlagStatus()) *** + ---------------------------------------------------------------------------- + [..] Using the function I2C_GetFlagStatus() which simply returns the status of + one single flag (ie. I2C_FLAG_RXNE ...). + (+) When to use + (++) This function could be used for specific applications or in debug + phase. + (++) It is suitable when only one flag checking is needed (most I2C + events are monitored through multiple flags). + (+) Limitations: + (++) When calling this function, the Status register is accessed. + Some flags are cleared when the status register is accessed. + So checking the status of one Flag, may clear other ones. + (++) Function may need to be called twice or more in order to monitor + one single event. + + [..] For detailed description of Events, please refer to section I2C_Events in + stm32l1xx_i2c.h file. + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified I2C register and returns its value. + * @param I2C_Register: specifies the register to read. + * This parameter can be one of the following values: + * @arg I2C_Register_CR1: CR1 register. + * @arg I2C_Register_CR2: CR2 register. + * @arg I2C_Register_OAR1: OAR1 register. + * @arg I2C_Register_OAR2: OAR2 register. + * @arg I2C_Register_DR: DR register. + * @arg I2C_Register_SR1: SR1 register. + * @arg I2C_Register_SR2: SR2 register. + * @arg I2C_Register_CCR: CCR register. + * @arg I2C_Register_TRISE: TRISE register. + * @retval The value of the read register. + */ +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_REGISTER(I2C_Register)); + + tmp = (uint32_t) I2Cx; + tmp += I2C_Register; + + /* Return the selected register value */ + return (*(__IO uint16_t *) tmp); +} + +/** + * @brief Enables or disables the specified I2C interrupts. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg I2C_IT_BUF: Buffer interrupt mask + * @arg I2C_IT_EVT: Event interrupt mask + * @arg I2C_IT_ERR: Error interrupt mask + * @param NewState: new state of the specified I2C interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_I2C_CONFIG_IT(I2C_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected I2C interrupts */ + I2Cx->CR2 |= I2C_IT; + } + else + { + /* Disable the selected I2C interrupts */ + I2Cx->CR2 &= (uint16_t)~I2C_IT; + } +} + +/* + =============================================================================== + 1. Basic state monitoring + =============================================================================== + */ + +/** + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_EVENT: specifies the event to be checked. + * This parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: EV1 + * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED: EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED: EV1 + * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED: EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED: EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF): EV2 + * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL): EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED: EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF): EV3 + * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL): EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE: EV3_2 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED: EV4 + * @arg I2C_EVENT_MASTER_MODE_SELECT: EV5 + * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: EV6 + * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED: EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING: EV8 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED: EV8_2 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10: EV9 + * @note For detailed description of Events, please refer to section + * I2C_Events in stm32l1xx_i2c.h file. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Last event is equal to the I2C_EVENT + * - ERROR: Last event is different from the I2C_EVENT + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_EVENT(I2C_EVENT)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_MASK; + + /* Check whether the last event contains the I2C_EVENT */ + if ((lastevent & I2C_EVENT) == I2C_EVENT) + { + /* SUCCESS: last event is equal to I2C_EVENT */ + status = SUCCESS; + } + else + { + /* ERROR: last event is different from I2C_EVENT */ + status = ERROR; + } + /* Return status */ + return status; +} + +/* + =============================================================================== + 2. Advanced state monitoring + =============================================================================== + */ + +/** + * @brief Returns the last I2Cx Event. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * + * @note For detailed description of Events, please refer to section + * I2C_Events in stm32l1xx_i2c.h file. + * + * @retval The last event + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + + /* Read the I2Cx status register */ + flag1 = I2Cx->SR1; + flag2 = I2Cx->SR2; + flag2 = flag2 << 16; + + /* Get the last event value from I2C status register */ + lastevent = (flag1 | flag2) & FLAG_MASK; + + /* Return status */ + return lastevent; +} + +/* + =============================================================================== + 3. Flag-based state monitoring + =============================================================================== + */ + +/** + * @brief Checks whether the specified I2C flag is set or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2C_FLAG_DUALF: Dual flag (Slave mode) + * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TRA: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSY: Bus busy flag + * @arg I2C_FLAG_MSL: Master/Slave flag + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) + * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag + * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTF: Byte transfer finished flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDAD" + * @arg I2C_FLAG_SB: Start bit flag (Master mode) + * @retval The new state of I2C_FLAG (SET or RESET). + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); + + /* Get the I2Cx peripheral base address */ + i2cxbase = (uint32_t)I2Cx; + + /* Read flag register index */ + i2creg = I2C_FLAG >> 28; + + /* Get bit[23:0] of the flag */ + I2C_FLAG &= FLAG_MASK; + + if(i2creg != 0) + { + /* Get the I2Cx SR1 register address */ + i2cxbase += 0x14; + } + else + { + /* Flag in I2Cx SR2 Register */ + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + /* Get the I2Cx SR2 register address */ + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + /* I2C_FLAG is set */ + bitstatus = SET; + } + else + { + /* I2C_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the I2C_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the I2Cx's pending flags. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg I2C_FLAG_SMBALERT: SMBus Alert flag + * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_FLAG_PECERR: PEC error in reception flag + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + + *@note STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + *@note ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the + * second byte of the address in DR register. + *@note BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + *@note ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + *@note SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 + * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR + * register (I2C_SendData()). + * @retval None + */ +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); + /* Get the I2C flag position */ + flagpos = I2C_FLAG & FLAG_MASK; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @brief Checks whether the specified I2C interrupt has occurred or not. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert flag + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag + * @arg I2C_IT_PECERR: PEC error in reception flag + * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure flag + * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_IT_BERR: Bus error flag + * @arg I2C_IT_TXE: Data register empty flag (Transmitter) + * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag + * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) + * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) + * @arg I2C_IT_BTF: Byte transfer finished flag + * @arg I2C_IT_ADDR: Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDAD" + * @arg I2C_IT_SB: Start bit flag (Master mode) + * @retval The new state of I2C_IT (SET or RESET). + */ +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_GET_IT(I2C_IT)); + + /* Check if the interrupt source is enabled or not */ + enablestatus = (uint32_t)(((I2C_IT & ITEN_MASK) >> 16) & (I2Cx->CR2)) ; + + /* Get bit[23:0] of the flag */ + I2C_IT &= FLAG_MASK; + + /* Check the status of the specified I2C flag */ + if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) + { + /* I2C_IT is set */ + bitstatus = SET; + } + else + { + /* I2C_IT is reset */ + bitstatus = RESET; + } + /* Return the I2C_IT status */ + return bitstatus; +} + +/** + * @brief Clears the I2Cx's interrupt pending bits. + * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. + * @param I2C_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg I2C_IT_SMBALERT: SMBus Alert interrupt + * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt + * @arg I2C_IT_PECERR: PEC error in reception interrupt + * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) + * @arg I2C_IT_AF: Acknowledge failure interrupt + * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) + * @arg I2C_IT_BERR: Bus error interrupt + * + + * @note STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * @note ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second + * byte of the address in I2C_DR register. + * @note BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a + * read/write to I2C_DR register (I2C_SendData()). + * @note ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to + * I2C_SR2 register ((void)(I2Cx->SR2)). + * @note SB (Start Bit) is cleared by software sequence: a read operation to + * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_DR register (I2C_SendData()). + * @retval None + */ +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_ALL_PERIPH(I2Cx)); + assert_param(IS_I2C_CLEAR_IT(I2C_IT)); + /* Get the I2C flag position */ + flagpos = I2C_IT & FLAG_MASK; + /* Clear the selected I2C flag */ + I2Cx->SR1 = (uint16_t)~flagpos; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_iwdg.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_iwdg.c new file mode 100644 index 0000000..d6fe022 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_iwdg.c @@ -0,0 +1,266 @@ +/** + ****************************************************************************** + * @file stm32l1xx_iwdg.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Independent watchdog (IWDG) peripheral: + * + Prescaler and Counter configuration + * + IWDG activation + * + Flag management + * + * @verbatim + * + ============================================================================== + ##### IWDG features ##### + ============================================================================== + [..] The IWDG can be started by either software or hardware (configurable + through option byte). + + [..] The IWDG is clocked by its own dedicated low-speed clock (LSI) and + thus stays active even if the main clock fails. + Once the IWDG is started, the LSI is forced ON and cannot be disabled + (LSI cannot be disabled too), and the counter starts counting down from + the reset value of 0xFFF. When it reaches the end of count value (0x000) + a system reset is generated. + The IWDG counter should be reloaded at regular intervals to prevent + an MCU reset. + + [..] The IWDG is implemented in the VDD voltage domain that is still functional + in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY). + + [..] IWDGRST flag in RCC_CSR register can be used to inform when a IWDG + reset occurs. + + [..] Min-max timeout value @37KHz (LSI): ~108us / ~28.3s + The IWDG timeout may vary due to LSI frequency dispersion. STM32L1xx + devices provide the capability to measure the LSI frequency (LSI clock + connected internally to TIM10 CH1 input capture). The measured value + can be used to have an IWDG timeout with an acceptable accuracy. + For more information, please refer to the STM32L1xx Reference manual. + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable write access to IWDG_PR and IWDG_RLR registers using + IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function. + (#) Configure the IWDG prescaler using IWDG_SetPrescaler() function. + + (#) Configure the IWDG counter value using IWDG_SetReload() function. + This value will be loaded in the IWDG counter each time the counter + is reloaded, then the IWDG will start counting down from this value. + + (#) Start the IWDG using IWDG_Enable() function, when the IWDG is used + in software mode (no need to enable the LSI, it will be enabled + by hardware). + + (#) Then the application program must reload the IWDG counter at regular + intervals during normal operation to prevent an MCU reset, using + IWDG_ReloadCounter() function. + + @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_iwdg.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup IWDG + * @brief IWDG driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* ---------------------- IWDG registers bit mask ----------------------------*/ +/* KR register bit mask */ +#define KR_KEY_RELOAD ((uint16_t)0xAAAA) +#define KR_KEY_ENABLE ((uint16_t)0xCCCC) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup IWDG_Private_Functions + * @{ + */ + +/** @defgroup IWDG_Group1 Prescaler and Counter configuration functions + * @brief Prescaler and Counter configuration functions + * +@verbatim + ============================================================================== + ##### Prescaler and Counter configuration functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. + * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. + * This parameter can be one of the following values: + * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers + * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers + * @retval None + */ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) +{ + /* Check the parameters */ + assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); + IWDG->KR = IWDG_WriteAccess; +} + +/** + * @brief Sets IWDG Prescaler value. + * @param IWDG_Prescaler: specifies the IWDG Prescaler value. + * This parameter can be one of the following values: + * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 + * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 + * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 + * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 + * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 + * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 + * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 + * @retval None + */ +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); + IWDG->PR = IWDG_Prescaler; +} + +/** + * @brief Sets IWDG Reload value. + * @param Reload: specifies the IWDG Reload value. + * This parameter must be a number between 0 and 0x0FFF. + * @retval None + */ +void IWDG_SetReload(uint16_t Reload) +{ + /* Check the parameters */ + assert_param(IS_IWDG_RELOAD(Reload)); + IWDG->RLR = Reload; +} + +/** + * @brief Reloads IWDG counter with value defined in the reload register + * (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None + * @retval None + */ +void IWDG_ReloadCounter(void) +{ + IWDG->KR = KR_KEY_RELOAD; +} + +/** + * @} + */ + +/** @defgroup IWDG_Group2 IWDG activation function + * @brief IWDG activation function + * +@verbatim + ============================================================================== + ##### IWDG activation function ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). + * @param None. + * @retval None. + */ +void IWDG_Enable(void) +{ + IWDG->KR = KR_KEY_ENABLE; +} + +/** + * @} + */ + +/** @defgroup IWDG_Group3 Flag management function + * @brief Flag management function + * +@verbatim + =============================================================================== + ##### Flag management function ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Checks whether the specified IWDG flag is set or not. + * @param IWDG_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg IWDG_FLAG_PVU: Prescaler Value Update on going + * @arg IWDG_FLAG_RVU: Reload Value Update on going + * @retval The new state of IWDG_FLAG (SET or RESET). + */ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_IWDG_FLAG(IWDG_FLAG)); + if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_lcd.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_lcd.c new file mode 100644 index 0000000..f3ab0d2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_lcd.c @@ -0,0 +1,640 @@ +/** + ****************************************************************************** + * @file stm32l1xx_lcd.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the LCD controller (LCD) peripheral: + * + Initialization and configuration + * + LCD RAM memory write + * + Interrupts and flags management + * + * @verbatim + + =============================================================================== + ##### LCD Clock ##### + =============================================================================== + [..] LCDCLK is the same as RTCCLK. + [..] To configure the RTCCLK/LCDCLK, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + RCC_APB1PeriphClockCmd() function. + (+) Enable access to RTC domain using the PWR_RTCAccessCmd() function. + (+) Select the RTC clock source using the RCC_RTCCLKConfig() function. + + [..] The frequency generator allows you to achieve various LCD frame rates + starting from an LCD input clock frequency (LCDCLK) which can vary + from 32 kHz up to 1 MHz. + + ##### LCD and low power modes ##### + =============================================================================== + [..] The LCD still active during STOP mode. + + ##### How to use this driver ##### + =============================================================================== + [..] + (#) Enable LCD clock using + RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD, ENABLE) function. + (#) Configure the LCD prescaler, divider, duty, bias and voltage source + using LCD_Init() function. + (#) Optionally you can enable/configure: + (++) LCD High Drive using the LCD_HighDriveCmd() function. + (++) LCD COM/SEG Mux using the LCD_MuxSegmentCmd() function. + (++) LCD Pulse ON Duration using the LCD_PulseOnDurationConfig() function. + (++) LCD Dead Time using the LCD_DeadTimeConfig() function + (++) The LCD Blink mode and frequency using the LCD_BlinkConfig() function. + (++) The LCD Contrast using the LCD_ContrastConfig() function. + (#) Call the LCD_WaitForSynchro() function to wait for LCD_FCR register + synchronization. + (#) Call the LCD_Cmd() to enable the LCD controller. + (#) Wait until the LCD Controller status is enabled and the step-up + converter is ready using the LCD_GetFlagStatus() and + LCD_FLAG_ENS and LCD_FLAG_RDY flags. + (#) Write to the LCD RAM memory using the LCD_Write() function. + (#) Request an update display using the LCD_UpdateDisplayRequest() + function. + (#) Wait until the update display is finished by checking the UDD + flag status using the LCD_GetFlagStatus(LCD_FLAG_UDD). + + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_lcd.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup LCD + * @brief LCD driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* ------------ LCD registers bit address in the alias region --------------- */ +#define LCD_OFFSET (LCD_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of LCDEN bit */ +#define CR_OFFSET (LCD_OFFSET + 0x00) +#define LCDEN_BitNumber 0x00 +#define CR_LCDEN_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (LCDEN_BitNumber * 4)) + +/* Alias word address of MUX_SEG bit */ +#define MUX_SEG_BitNumber 0x07 +#define CR_MUX_SEG_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (MUX_SEG_BitNumber * 4)) + + +/* --- FCR Register ---*/ + +/* Alias word address of HD bit */ +#define FCR_OFFSET (LCD_OFFSET + 0x04) +#define HD_BitNumber 0x00 +#define FCR_HD_BB (PERIPH_BB_BASE + (FCR_OFFSET * 32) + (HD_BitNumber * 4)) + +/* --- SR Register ---*/ + +/* Alias word address of UDR bit */ +#define SR_OFFSET (LCD_OFFSET + 0x08) +#define UDR_BitNumber 0x02 +#define SR_UDR_BB (PERIPH_BB_BASE + (SR_OFFSET * 32) + (UDR_BitNumber * 4)) + +#define FCR_MASK ((uint32_t)0xFC03FFFF) /* LCD FCR Mask */ +#define CR_MASK ((uint32_t)0xFFFFFF81) /* LCD CR Mask */ +#define PON_MASK ((uint32_t)0xFFFFFF8F) /* LCD PON Mask */ +#define DEAD_MASK ((uint32_t)0xFFFFFC7F) /* LCD DEAD Mask */ +#define BLINK_MASK ((uint32_t)0xFFFC1FFF) /* LCD BLINK Mask */ +#define CONTRAST_MASK ((uint32_t)0xFFFFE3FF) /* LCD CONTRAST Mask */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup LCD_Private_Functions + * @{ + */ + +/** @defgroup LCD_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the LCD peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void LCD_DeInit(void) +{ + /* Enable LCD reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_LCD, ENABLE); + /* Release LCD from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_LCD, DISABLE); +} + +/** + * @brief Initializes the LCD peripheral according to the specified parameters + * in the LCD_InitStruct. + * @note This function can be used only when the LCD is disabled. + * @param LCD_InitStruct: pointer to a LCD_InitTypeDef structure that contains + * the configuration information for the specified LCD peripheral. + * @retval None + */ +void LCD_Init(LCD_InitTypeDef* LCD_InitStruct) +{ + /* Check function parameters */ + assert_param(IS_LCD_PRESCALER(LCD_InitStruct->LCD_Prescaler)); + assert_param(IS_LCD_DIVIDER(LCD_InitStruct->LCD_Divider)); + assert_param(IS_LCD_DUTY(LCD_InitStruct->LCD_Duty)); + assert_param(IS_LCD_BIAS(LCD_InitStruct->LCD_Bias)); + assert_param(IS_LCD_VOLTAGE_SOURCE(LCD_InitStruct->LCD_VoltageSource)); + + LCD->FCR &= (uint32_t)FCR_MASK; + LCD->FCR |= (uint32_t)(LCD_InitStruct->LCD_Prescaler | LCD_InitStruct->LCD_Divider); + + LCD_WaitForSynchro(); + + LCD->CR &= (uint32_t)CR_MASK; + LCD->CR |= (uint32_t)(LCD_InitStruct->LCD_Duty | LCD_InitStruct->LCD_Bias | \ + LCD_InitStruct->LCD_VoltageSource); + +} + +/** + * @brief Fills each LCD_InitStruct member with its default value. + * @param LCD_InitStruct: pointer to a LCD_InitTypeDef structure which will + * be initialized. + * @retval None + */ +void LCD_StructInit(LCD_InitTypeDef* LCD_InitStruct) +{ +/*--------------- Reset LCD init structure parameters values -----------------*/ + LCD_InitStruct->LCD_Prescaler = LCD_Prescaler_1; /*!< Initialize the LCD_Prescaler member */ + + LCD_InitStruct->LCD_Divider = LCD_Divider_16; /*!< Initialize the LCD_Divider member */ + + LCD_InitStruct->LCD_Duty = LCD_Duty_Static; /*!< Initialize the LCD_Duty member */ + + LCD_InitStruct->LCD_Bias = LCD_Bias_1_4; /*!< Initialize the LCD_Bias member */ + + LCD_InitStruct->LCD_VoltageSource = LCD_VoltageSource_Internal; /*!< Initialize the LCD_VoltageSource member */ +} + +/** + * @brief Enables or disables the LCD Controller. + * @param NewState: new state of the LCD peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void LCD_Cmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_LCDEN_BB = (uint32_t)NewState; +} + +/** + * @brief Waits until the LCD FCR register is synchronized in the LCDCLK domain. + * This function must be called after any write operation to LCD_FCR register. + * @param None + * @retval None + */ +void LCD_WaitForSynchro(void) +{ + /* Loop until FCRSF flag is set */ + while ((LCD->SR & LCD_FLAG_FCRSF) == (uint32_t)RESET) + { + } +} + +/** + * @brief Enables or disables the low resistance divider. Displays with high + * internal resistance may need a longer drive time to achieve + * satisfactory contrast. This function is useful in this case if some + * additional power consumption can be tolerated. + * @note When this mode is enabled, the PulseOn Duration (PON) have to be + * programmed to 1/CK_PS (LCD_PulseOnDuration_1). + * @param NewState: new state of the low resistance divider. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void LCD_HighDriveCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) FCR_HD_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Mux Segment. + * @note This function can be used only when the LCD is disabled. + * @param NewState: new state of the Mux Segment. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void LCD_MuxSegmentCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_MUX_SEG_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the LCD pulses on duration. + * @param LCD_PulseOnDuration: specifies the LCD pulse on duration in terms of + * CK_PS (prescaled LCD clock period) pulses. + * This parameter can be one of the following values: + * @arg LCD_PulseOnDuration_0: 0 pulse + * @arg LCD_PulseOnDuration_1: Pulse ON duration = 1/CK_PS + * @arg LCD_PulseOnDuration_2: Pulse ON duration = 2/CK_PS + * @arg LCD_PulseOnDuration_3: Pulse ON duration = 3/CK_PS + * @arg LCD_PulseOnDuration_4: Pulse ON duration = 4/CK_PS + * @arg LCD_PulseOnDuration_5: Pulse ON duration = 5/CK_PS + * @arg LCD_PulseOnDuration_6: Pulse ON duration = 6/CK_PS + * @arg LCD_PulseOnDuration_7: Pulse ON duration = 7/CK_PS + * @retval None + */ +void LCD_PulseOnDurationConfig(uint32_t LCD_PulseOnDuration) +{ + /* Check the parameters */ + assert_param(IS_LCD_PULSE_ON_DURATION(LCD_PulseOnDuration)); + + LCD->FCR &= (uint32_t)PON_MASK; + LCD->FCR |= (uint32_t)(LCD_PulseOnDuration); +} + +/** + * @brief Configures the LCD dead time. + * @param LCD_DeadTime: specifies the LCD dead time. + * This parameter can be one of the following values: + * @arg LCD_DeadTime_0: No dead Time + * @arg LCD_DeadTime_1: One Phase between different couple of Frame + * @arg LCD_DeadTime_2: Two Phase between different couple of Frame + * @arg LCD_DeadTime_3: Three Phase between different couple of Frame + * @arg LCD_DeadTime_4: Four Phase between different couple of Frame + * @arg LCD_DeadTime_5: Five Phase between different couple of Frame + * @arg LCD_DeadTime_6: Six Phase between different couple of Frame + * @arg LCD_DeadTime_7: Seven Phase between different couple of Frame + * @retval None + */ +void LCD_DeadTimeConfig(uint32_t LCD_DeadTime) +{ + /* Check the parameters */ + assert_param(IS_LCD_DEAD_TIME(LCD_DeadTime)); + + LCD->FCR &= (uint32_t)DEAD_MASK; + LCD->FCR |= (uint32_t)(LCD_DeadTime); +} + +/** + * @brief Configures the LCD Blink mode and Blink frequency. + * @param LCD_BlinkMode: specifies the LCD blink mode. + * This parameter can be one of the following values: + * @arg LCD_BlinkMode_Off: Blink disabled + * @arg LCD_BlinkMode_SEG0_COM0: Blink enabled on SEG[0], COM[0] (1 pixel) + * @arg LCD_BlinkMode_SEG0_AllCOM: Blink enabled on SEG[0], all COM (up to 8 + * pixels according to the programmed duty) + * @arg LCD_BlinkMode_AllSEG_AllCOM: Blink enabled on all SEG and all COM + * (all pixels) + * @param LCD_BlinkFrequency: specifies the LCD blink frequency. + * This parameter can be one of the following values: + * @arg LCD_BlinkFrequency_Div8: The Blink frequency = fLcd/8 + * @arg LCD_BlinkFrequency_Div16: The Blink frequency = fLcd/16 + * @arg LCD_BlinkFrequency_Div32: The Blink frequency = fLcd/32 + * @arg LCD_BlinkFrequency_Div64: The Blink frequency = fLcd/64 + * @arg LCD_BlinkFrequency_Div128: The Blink frequency = fLcd/128 + * @arg LCD_BlinkFrequency_Div256: The Blink frequency = fLcd/256 + * @arg LCD_BlinkFrequency_Div512: The Blink frequency = fLcd/512 + * @arg LCD_BlinkFrequency_Div1024: The Blink frequency = fLcd/1024 + * @retval None + */ +void LCD_BlinkConfig(uint32_t LCD_BlinkMode, uint32_t LCD_BlinkFrequency) +{ + /* Check the parameters */ + assert_param(IS_LCD_BLINK_MODE(LCD_BlinkMode)); + assert_param(IS_LCD_BLINK_FREQUENCY(LCD_BlinkFrequency)); + + LCD->FCR &= (uint32_t)BLINK_MASK; + LCD->FCR |= (uint32_t)(LCD_BlinkMode | LCD_BlinkFrequency); +} + +/** + * @brief Configures the LCD Contrast. + * @param LCD_Contrast: specifies the LCD Contrast. + * This parameter can be one of the following values: + * @arg LCD_Contrast_Level_0: Maximum Voltage = 2.60V + * @arg LCD_Contrast_Level_1: Maximum Voltage = 2.73V + * @arg LCD_Contrast_Level_2: Maximum Voltage = 2.86V + * @arg LCD_Contrast_Level_3: Maximum Voltage = 2.99V + * @arg LCD_Contrast_Level_4: Maximum Voltage = 3.12V + * @arg LCD_Contrast_Level_5: Maximum Voltage = 3.25V + * @arg LCD_Contrast_Level_6: Maximum Voltage = 3.38V + * @arg LCD_Contrast_Level_7: Maximum Voltage = 3.51V + * @retval None + */ +void LCD_ContrastConfig(uint32_t LCD_Contrast) +{ + /* Check the parameters */ + assert_param(IS_LCD_CONTRAST(LCD_Contrast)); + + LCD->FCR &= (uint32_t)CONTRAST_MASK; + LCD->FCR |= (uint32_t)(LCD_Contrast); +} + +/** + * @} + */ + +/** @defgroup LCD_Group2 LCD RAM memory write functions + * @brief LCD RAM memory write functions + * +@verbatim + =============================================================================== + ##### LCD RAM memory write functions ##### + =============================================================================== + [..] Using its double buffer memory the LCD controller ensures the coherency + of the displayed information without having to use interrupts to control + LCD_RAM modification. + + [..] The application software can access the first buffer level (LCD_RAM) through + the APB interface. Once it has modified the LCD_RAM, it sets the UDR flag + in the LCD_SR register using the LCD_UpdateDisplayRequest() function. + + [..] This UDR flag (update display request) requests the updated information + to be moved into the second buffer level (LCD_DISPLAY). + + [..] This operation is done synchronously with the frame (at the beginning of + the next frame), until the update is completed, the LCD_RAM is write + protected and the UDR flag stays high. + + [..] Once the update is completed another flag (UDD - Update Display Done) is + set and generates an interrupt if the UDDIE bit in the LCD_FCR register + is set. + + [..] The time it takes to update LCD_DISPLAY is, in the worst case, one odd + and one even frame. + + [..] The update will not occur (UDR = 1 and UDD = 0) until the display is + enabled (LCDEN = 1). + +@endverbatim + * @{ + */ + +/** + * @brief Writes a word in the specific LCD RAM. + * @param LCD_RAMRegister: specifies the LCD Contrast. + * This parameter can be one of the following values: + * @arg LCD_RAMRegister_0: LCD RAM Register 0 + * @arg LCD_RAMRegister_1: LCD RAM Register 1 + * @arg LCD_RAMRegister_2: LCD RAM Register 2 + * @arg LCD_RAMRegister_3: LCD RAM Register 3 + * @arg LCD_RAMRegister_4: LCD RAM Register 4 + * @arg LCD_RAMRegister_5: LCD RAM Register 5 + * @arg LCD_RAMRegister_6: LCD RAM Register 6 + * @arg LCD_RAMRegister_7: LCD RAM Register 7 + * @arg LCD_RAMRegister_8: LCD RAM Register 8 + * @arg LCD_RAMRegister_9: LCD RAM Register 9 + * @arg LCD_RAMRegister_10: LCD RAM Register 10 + * @arg LCD_RAMRegister_11: LCD RAM Register 11 + * @arg LCD_RAMRegister_12: LCD RAM Register 12 + * @arg LCD_RAMRegister_13: LCD RAM Register 13 + * @arg LCD_RAMRegister_14: LCD RAM Register 14 + * @arg LCD_RAMRegister_15: LCD RAM Register 15 + * @param LCD_Data: specifies LCD Data Value to be written. + * @retval None + */ +void LCD_Write(uint32_t LCD_RAMRegister, uint32_t LCD_Data) +{ + /* Check the parameters */ + assert_param(IS_LCD_RAM_REGISTER(LCD_RAMRegister)); + + /* Copy data bytes to RAM register */ + LCD->RAM[LCD_RAMRegister] = (uint32_t)LCD_Data; +} + +/** + * @brief Enables the Update Display Request. + * @note Each time software modifies the LCD_RAM it must set the UDR bit to + * transfer the updated data to the second level buffer. + * The UDR bit stays set until the end of the update and during this + * time the LCD_RAM is write protected. + * @note When the display is disabled, the update is performed for all + * LCD_DISPLAY locations. + * When the display is enabled, the update is performed only for locations + * for which commons are active (depending on DUTY). For example if + * DUTY = 1/2, only the LCD_DISPLAY of COM0 and COM1 will be updated. + * @param None + * @retval None + */ +void LCD_UpdateDisplayRequest(void) +{ + *(__IO uint32_t *) SR_UDR_BB = (uint32_t)0x01; +} + +/** + * @} + */ + +/** @defgroup LCD_Group3 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified LCD interrupts. + * @param LCD_IT: specifies the LCD interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg LCD_IT_SOF: Start of Frame Interrupt + * @arg LCD_IT_UDD: Update Display Done Interrupt + * @param NewState: new state of the specified LCD interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void LCD_ITConfig(uint32_t LCD_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_LCD_IT(LCD_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + LCD->FCR |= LCD_IT; + } + else + { + LCD->FCR &= (uint32_t)~LCD_IT; + } +} + +/** + * @brief Checks whether the specified LCD flag is set or not. + * @param LCD_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg LCD_FLAG_ENS: LCD Enabled flag. It indicates the LCD controller status. + * @note The ENS bit is set immediately when the LCDEN bit in the LCD_CR + * goes from 0 to 1. On deactivation it reflects the real status of + * LCD so it becomes 0 at the end of the last displayed frame. + * @arg LCD_FLAG_SOF: Start of Frame flag. This flag is set by hardware at + * the beginning of a new frame, at the same time as the display data is + * updated. + * @arg LCD_FLAG_UDR: Update Display Request flag. + * @arg LCD_FLAG_UDD: Update Display Done flag. + * @arg LCD_FLAG_RDY: Step_up converter Ready flag. It indicates the status + * of the step-up converter. + * @arg LCD_FLAG_FCRSF: LCD Frame Control Register Synchronization Flag. + * This flag is set by hardware each time the LCD_FCR register is updated + * in the LCDCLK domain. + * @retval The new state of LCD_FLAG (SET or RESET). + */ +FlagStatus LCD_GetFlagStatus(uint32_t LCD_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_LCD_GET_FLAG(LCD_FLAG)); + + if ((LCD->SR & LCD_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the LCD's pending flags. + * @param LCD_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg LCD_FLAG_SOF: Start of Frame Interrupt + * @arg LCD_FLAG_UDD: Update Display Done Interrupt + * @retval None + */ +void LCD_ClearFlag(uint32_t LCD_FLAG) +{ + /* Check the parameters */ + assert_param(IS_LCD_CLEAR_FLAG(LCD_FLAG)); + + /* Clear the corresponding LCD flag */ + LCD->CLR = (uint32_t)LCD_FLAG; +} + +/** + * @brief Checks whether the specified RTC interrupt has occurred or not. + * @param LCD_IT: specifies the LCD interrupts sources to check. + * This parameter can be one of the following values: + * @arg LCD_IT_SOF: Start of Frame Interrupt + * @arg LCD_IT_UDD: Update Display Done Interrupt. + * @note If the device is in STOP mode (PCLK not provided) UDD will not + * generate an interrupt even if UDDIE = 1. + * If the display is not enabled the UDD interrupt will never occur. + * @retval The new state of the LCD_IT (SET or RESET). + */ +ITStatus LCD_GetITStatus(uint32_t LCD_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_LCD_GET_IT(LCD_IT)); + + if ((LCD->SR & LCD_IT) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + if (((LCD->FCR & LCD_IT) != (uint16_t)RESET) && (bitstatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the LCD's interrupt pending bits. + * @param LCD_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg LCD_IT_SOF: Start of Frame Interrupt + * @arg LCD_IT_UDD: Update Display Done Interrupt + * @retval None + */ +void LCD_ClearITPendingBit(uint32_t LCD_IT) +{ + /* Check the parameters */ + assert_param(IS_LCD_IT(LCD_IT)); + + /* Clear the corresponding LCD pending bit */ + LCD->CLR = (uint32_t)LCD_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_opamp.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_opamp.c new file mode 100644 index 0000000..d5cd5ee --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_opamp.c @@ -0,0 +1,557 @@ +/** + ****************************************************************************** + * @file stm32l1xx_opamp.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the operational amplifiers (opamp) peripheral: + * + Initialization and configuration + * + Calibration management + * + * @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] The device integrates three independent rail-to-rail operational amplifiers + OPAMP1, OPAMP2 and OPAMP3: + (+) Internal connections to the ADC. + (+) Internal connections to the DAC. + (+) Internal connection to COMP1 (only OPAMP3). + (+) Internal connection for unity gain (voltage follower) configuration. + (+) Calibration capability. + (+) Selectable gain-bandwidth (2MHz in normal mode, 500KHz in low power mode). + [..] + (#) COMP AHB clock must be enabled to get write access + to OPAMP registers using + (#) RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP, ENABLE) + + (#) Configure the corresponding GPIO to OPAMPx INP, OPAMPx_INN (if used) + and OPAMPx_OUT in analog mode. + + (#) Configure (close/open) the OPAMP switches using OPAMP_SwitchCmd() + + (#) Enable the OPAMP peripheral using OPAMP_Cmd() + + -@- In order to use OPAMP outputs as ADC inputs, the opamps must be enabled + and the ADC must use the OPAMP output channel number: + (+@) OPAMP1 output is connected to ADC channel 3. + (+@) OPAMP2 output is connected to ADC channel 8. + (+@) OPAMP3 output is connected to ADC channel 13 (SW1 switch must be closed). + + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_opamp.h" + + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup OPAMP + * @brief OPAMP driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup OPAMP_Private_Functions + * @{ + */ + +/** @defgroup OPAMP_Group1 Initialization and configuration + * @brief Initialization and configuration + * +@verbatim + =============================================================================== + ##### Initialization and configuration ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitialize the OPAMPs register to its default reset value. + * @note At startup, OTR and LPOTR registers are set to factory programmed values. + * @param None. + * @retval None. + */ +void OPAMP_DeInit(void) +{ + /*!< Set OPAMP_CSR register to reset value */ + OPAMP->CSR = 0x00010101; + /*!< Set OPAMP_OTR register to reset value */ + OPAMP->OTR = (uint32_t)(* (uint32_t*)FLASH_R_BASE + 0x00000038); + /*!< Set OPAMP_LPOTR register to reset value */ + OPAMP->LPOTR = (uint32_t)(* (uint32_t*)FLASH_R_BASE + 0x0000003C); +} + +/** + * @brief Close or Open the OPAMP switches. + * @param OPAMP_OPAMPxSwitchy: selects the OPAMPx switch. + * This parameter can be any combinations of the following values: + * @arg OPAMP_OPAMP1Switch3: used to connect internally OPAMP1 output to + * OPAMP1 negative input (internal follower) + * @arg OPAMP_OPAMP1Switch4: used to connect PA2 to OPAMP1 negative input + * @arg OPAMP_OPAMP1Switch5: used to connect PA1 to OPAMP1 positive input + * @arg OPAMP_OPAMP1Switch6: used to connect DAC_OUT1 to OPAMP1 positive input + * @arg OPAMP_OPAMP1SwitchANA: used to meet 1 nA input leakage + * @arg OPAMP_OPAMP2Switch3: used to connect internally OPAMP2 output to + * OPAMP2 negative input (internal follower) + * @arg OPAMP_OPAMP2Switch4: used to connect PA7 to OPAMP2 negative input + * @arg OPAMP_OPAMP2Switch5: used to connect PA6 to OPAMP2 positive input + * @arg OPAMP_OPAMP2Switch6: used to connect DAC_OUT1 to OPAMP2 positive input + * @arg OPAMP_OPAMP2Switch7: used to connect DAC_OUT2 to OPAMP2 positive input + * @arg OPAMP_OPAMP2SwitchANA: used to meet 1 nA input leakage + * @arg OPAMP_OPAMP3Switch3: used to connect internally OPAMP3 output to + * OPAMP3 negative input (internal follower) + * @arg OPAMP_OPAMP3Switch4: used to connect PC2 to OPAMP3 negative input + * @arg OPAMP_OPAMP3Switch5: used to connect PC1 to OPAMP3 positive input + * @arg OPAMP_OPAMP3Switch6: used to connect DAC_OUT1 to OPAMP3 positive input + * @arg OPAMP_OPAMP3SwitchANA: used to meet 1 nA input leakage on negative input + * + * @param NewState: New state of the OPAMP switch. + * This parameter can be: + * ENABLE to close the OPAMP switch + * or DISABLE to open the OPAMP switch + * @note OPAMP_OPAMP2Switch6 and OPAMP_OPAMP2Switch7 mustn't be closed together. + * @retval None + */ +void OPAMP_SwitchCmd(uint32_t OPAMP_OPAMPxSwitchy, FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_OPAMP_SWITCH(OPAMP_OPAMPxSwitchy)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Close the selected switches */ + OPAMP->CSR |= (uint32_t) OPAMP_OPAMPxSwitchy; + } + else + { + /* Open the selected switches */ + OPAMP->CSR &= (~(uint32_t)OPAMP_OPAMPxSwitchy); + } +} + +/** + * @brief Enable or disable the OPAMP peripheral. + * @param OPAMP_Selection: the selected OPAMP. + * This parameter can be one of the following values: + * @arg OPAMP_Selection_OPAMP1: OPAMP1 is selected + * @arg OPAMP_Selection_OPAMP2: OPAMP2 is selected + * @arg OPAMP_Selection_OPAMP3: OPAMP3 is selected + * @param NewState: new state of the selected OPAMP peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void OPAMP_Cmd(uint32_t OPAMP_Selection, FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_OPAMP_ALL_PERIPH(OPAMP_Selection)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected OPAMP */ + OPAMP->CSR &= (~(uint32_t) OPAMP_Selection); + } + else + { + /* Disable the selected OPAMP */ + OPAMP->CSR |= (uint32_t) OPAMP_Selection; + } +} + +/** + * @brief Enable or disable the low power mode for OPAMP peripheral. + * @param OPAMP_Selection: the selected OPAMP. + * This parameter can be one of the following values: + * @arg OPAMP_Selection_OPAMP1: OPAMP1 selected + * @arg OPAMP_Selection_OPAMP2: OPAMP2 selected + * @arg OPAMP_Selection_OPAMP3: OPAMP3 selected + * @param NewState: new low power state of the selected OPAMP peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void OPAMP_LowPowerCmd(uint32_t OPAMP_Selection, FunctionalState NewState) +{ + /* Check the parameter */ + assert_param(IS_OPAMP_ALL_PERIPH(OPAMP_Selection)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the selected OPAMP in low power mode */ + OPAMP->CSR |= (uint32_t) (OPAMP_Selection << 7); + } + else + { + /* Disable the low power mode for the selected OPAMP */ + OPAMP->CSR &= (~(uint32_t) (OPAMP_Selection << 7)); + } +} + +/** + * @brief Select the OPAMP power range. + * @note The OPAMP power range selection must be performed while OPAMPs are powered down. + * @param OPAMP_Range: the selected OPAMP power range. + * This parameter can be one of the following values: + * @arg OPAMP_PowerRange_Low: Low power range is selected (VDDA is lower than 2.4V). + * @arg OPAMP_PowerRange_High: High power range is selected (VDDA is higher than 2.4V). + * @retval None + */ +void OPAMP_PowerRangeSelect(uint32_t OPAMP_PowerRange) +{ + /* Check the parameter */ + assert_param(IS_OPAMP_RANGE(OPAMP_PowerRange)); + + /* Reset the OPAMP range bit */ + OPAMP->CSR &= (~(uint32_t) (OPAMP_CSR_AOP_RANGE)); + + /* Select the OPAMP power range */ + OPAMP->CSR |= OPAMP_PowerRange; +} + +/** + * @} + */ + +/** @defgroup OPAMP_Group2 Calibration functions + * @brief Calibration functions + * +@verbatim + =============================================================================== + ##### Calibration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Select the trimming mode. + * @param OffsetTrimming: the selected offset trimming mode. + * This parameter can be one of the following values: + * @arg OffsetTrimming_Factory: factory trimming values are used for offset + * calibration. + * @arg OffsetTrimming_User: user trimming values are used for offset + * calibration. + * @note When OffsetTrimming_User is selected, use OPAMP_OffsetTrimConfig() + * function or OPAMP_OffsetTrimLowPowerConfig() function to adjust + * trimming value. + * @retval None + */ +void OPAMP_OffsetTrimmingModeSelect(uint32_t OPAMP_Trimming) +{ + /* Check the parameter */ + assert_param(IS_OPAMP_TRIMMING(OPAMP_Trimming)); + + /* Reset the OPAMP_OTR range bit */ + OPAMP->CSR &= (~(uint32_t) (OPAMP_OTR_OT_USER)); + + /* Select the OPAMP offset trimming */ + OPAMP->CSR |= OPAMP_Trimming; + +} + +/** + * @brief Configure the trimming value of OPAMPs in normal mode. + * @param OPAMP_Selection: the selected OPAMP. + * This parameter can be one of the following values: + * @arg OPAMP_Selection_OPAMP1: OPAMP1 is selected to configure the trimming value. + * @arg OPAMP_Selection_OPAMP2: OPAMP2 is selected to configure the trimming value. + * @arg OPAMP_Selection_OPAMP3: OPAMP3 is selected to configure the trimming value. + * @param OPAMP_Input: the selected OPAMP input. + * This parameter can be one of the following values: + * @arg OPAMP_Input_NMOS: NMOS input is selected to configure the trimming value. + * @arg OPAMP_Input_PMOS: PMOS input is selected to configure the trimming value. + * @param OPAMP_TrimValue: the trimming value. This parameter can be any value lower + * or equal to 0x0000001F. + * @retval None + */ +void OPAMP_OffsetTrimConfig(uint32_t OPAMP_Selection, uint32_t OPAMP_Input, uint32_t OPAMP_TrimValue) +{ + uint32_t tmpreg = 0; + + /* Check the parameter */ + assert_param(IS_OPAMP_ALL_PERIPH(OPAMP_Selection)); + assert_param(IS_OPAMP_INPUT(OPAMP_Input)); + assert_param(IS_OPAMP_TRIMMINGVALUE(OPAMP_TrimValue)); + + /* Get the OPAMP_OTR value */ + tmpreg = OPAMP->OTR; + + if(OPAMP_Selection == OPAMP_Selection_OPAMP1) + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA1CAL_L | OPAMP_CSR_OPA1CAL_H); + /* Select the OPAMP input */ + tmpreg |= OPAMP_Input; + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP1 PMOS input */ + tmpreg &= (0xFFFFFFE0); + /* Set the new trimming value corresponding to OPAMP1 PMOS input */ + tmpreg |= (OPAMP_TrimValue); + } + else + { + /* Reset the trimming value corresponding to OPAMP1 NMOS input */ + tmpreg &= (0xFFFFFC1F); + /* Set the new trimming value corresponding to OPAMP1 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<5); + } + } + else if (OPAMP_Selection == OPAMP_Selection_OPAMP2) + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA2CAL_L | OPAMP_CSR_OPA2CAL_H); + /* Select the OPAMP input */ + tmpreg |= (uint32_t)(OPAMP_Input<<8); + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP2 PMOS input */ + tmpreg &= (0xFFFF83FF); + /* Set the new trimming value corresponding to OPAMP2 PMOS input */ + tmpreg |= (OPAMP_TrimValue<<10); + } + else + { + /* Reset the trimming value corresponding to OPAMP2 NMOS input */ + tmpreg &= (0xFFF07FFF); + /* Set the new trimming value corresponding to OPAMP2 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<15); + } + } + else + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA3CAL_L | OPAMP_CSR_OPA3CAL_H); + /* Select the OPAMP input */ + tmpreg |= (uint32_t)(OPAMP_Input<<16); + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP3 PMOS input */ + tmpreg &= (0xFE0FFFFF); + /* Set the new trimming value corresponding to OPAMP3 PMOS input */ + tmpreg |= (OPAMP_TrimValue<<20); + } + else + { + /* Reset the trimming value corresponding to OPAMP3 NMOS input */ + tmpreg &= (0xC1FFFFFF); + /* Set the new trimming value corresponding to OPAMP3 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<25); + } + } + + /* Set the OPAMP_OTR register */ + OPAMP->OTR = tmpreg; +} + +/** + * @brief Configure the trimming value of OPAMPs in low power mode. + * @param OPAMP_Selection: the selected OPAMP. + * This parameter can be one of the following values: + * @arg OPAMP_Selection_OPAMP1: OPAMP1 is selected to configure the trimming value. + * @arg OPAMP_Selection_OPAMP2: OPAMP2 is selected to configure the trimming value. + * @arg OPAMP_Selection_OPAMP3: OPAMP3 is selected to configure the trimming value. + * @param OPAMP_Input: the selected OPAMP input. + * This parameter can be one of the following values: + * @arg OPAMP_Input_NMOS: NMOS input is selected to configure the trimming value. + * @arg OPAMP_Input_PMOS: PMOS input is selected to configure the trimming value. + * @param OPAMP_TrimValue: the trimming value. + * This parameter can be any value lower or equal to 0x0000001F. + * @retval None + */ +void OPAMP_OffsetTrimLowPowerConfig(uint32_t OPAMP_Selection, uint32_t OPAMP_Input, uint32_t OPAMP_TrimValue) +{ + uint32_t tmpreg = 0; + + /* Check the parameter */ + assert_param(IS_OPAMP_ALL_PERIPH(OPAMP_Selection)); + assert_param(IS_OPAMP_INPUT(OPAMP_Input)); + assert_param(IS_OPAMP_TRIMMINGVALUE(OPAMP_TrimValue)); + + /* Get the OPAMP_LPOTR value */ + tmpreg = OPAMP->LPOTR; + + if(OPAMP_Selection == OPAMP_Selection_OPAMP1) + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA1CAL_L | OPAMP_CSR_OPA1CAL_H); + /* Select the OPAMP input */ + tmpreg |= OPAMP_Input; + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP1 PMOS input */ + tmpreg &= (0xFFFFFFE0); + /* Set the new trimming value corresponding to OPAMP1 PMOS input */ + tmpreg |= (OPAMP_TrimValue); + } + else + { + /* Reset the trimming value corresponding to OPAMP1 NMOS input */ + tmpreg &= (0xFFFFFC1F); + /* Set the new trimming value corresponding to OPAMP1 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<5); + } + } + else if (OPAMP_Selection == OPAMP_Selection_OPAMP2) + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA2CAL_L | OPAMP_CSR_OPA2CAL_H); + /* Select the OPAMP input */ + tmpreg |= (uint32_t)(OPAMP_Input<<8); + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP2 PMOS input */ + tmpreg &= (0xFFFF83FF); + /* Set the new trimming value corresponding to OPAMP2 PMOS input */ + tmpreg |= (OPAMP_TrimValue<<10); + } + else + { + /* Reset the trimming value corresponding to OPAMP2 NMOS input */ + tmpreg &= (0xFFF07FFF); + /* Set the new trimming value corresponding to OPAMP2 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<15); + } + } + else + { + /* Reset the OPAMP inputs selection */ + tmpreg &= (uint32_t)~(OPAMP_CSR_OPA3CAL_L | OPAMP_CSR_OPA3CAL_H); + /* Select the OPAMP input */ + tmpreg |= (uint32_t)(OPAMP_Input<<16); + + if(OPAMP_Input == OPAMP_Input_PMOS) + { + /* Reset the trimming value corresponding to OPAMP3 PMOS input */ + tmpreg &= (0xFE0FFFFF); + /* Set the new trimming value corresponding to OPAMP3 PMOS input */ + tmpreg |= (OPAMP_TrimValue<<20); + } + else + { + /* Reset the trimming value corresponding to OPAMP3 NMOS input */ + tmpreg &= (0xC1FFFFFF); + /* Set the new trimming value corresponding to OPAMP3 NMOS input */ + tmpreg |= (OPAMP_TrimValue<<25); + } + } + + /* Set the OPAMP_LPOTR register */ + OPAMP->LPOTR = tmpreg; +} + +/** + * @brief Checks whether the specified OPAMP calibration flag is set or not. + * @note User should wait until calibration flag change the value when changing + * the trimming value. + * @param OPAMP_Selection: the selected OPAMP. + * This parameter can be one of the following values: + * @arg OPAMP_Selection_OPAMP1: OPAMP1 is selected. + * @arg OPAMP_Selection_OPAMP2: OPAMP2 is selected. + * @arg OPAMP_Selection_OPAMP3: OPAMP3 is selected. + * @retval The new state of the OPAMP calibration flag (SET or RESET). + */ +FlagStatus OPAMP_GetFlagStatus(uint32_t OPAMP_Selection) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameter */ + assert_param(IS_OPAMP_ALL_PERIPH(OPAMP_Selection)); + + /* Get the CSR register value */ + tmpreg = OPAMP->CSR; + + /* Check if OPAMP1 is selected */ + if(OPAMP_Selection == OPAMP_Selection_OPAMP1) + { + /* Check OPAMP1 CAL bit status */ + if ((tmpreg & OPAMP_CSR_OPA1CALOUT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + /* Check if OPAMP2 is selected */ + else if(OPAMP_Selection == OPAMP_Selection_OPAMP2) + { + /* Check OPAMP2 CAL bit status */ + if ((tmpreg & OPAMP_CSR_OPA2CALOUT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + /* Check OPAMP3 CAL bit status */ + if ((tmpreg & OPAMP_CSR_OPA3CALOUT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + return bitstatus; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_pwr.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_pwr.c new file mode 100644 index 0000000..ce6f047 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_pwr.c @@ -0,0 +1,833 @@ +/** + ****************************************************************************** + * @file stm32l1xx_pwr.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + RTC Domain Access + * + PVD configuration + * + WakeUp pins configuration + * + Ultra Low Power mode configuration + * + Voltage Scaling configuration + * + Low Power modes configuration + * + Flags management + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_pwr.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup PWR + * @brief PWR driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* --------- PWR registers bit address in the alias region ---------- */ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of DBP bit */ +#define CR_OFFSET (PWR_OFFSET + 0x00) +#define DBP_BitNumber 0x08 +#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) + +/* Alias word address of PVDE bit */ +#define PVDE_BitNumber 0x04 +#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) + +/* Alias word address of ULP bit */ +#define ULP_BitNumber 0x09 +#define CR_ULP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (ULP_BitNumber * 4)) + +/* Alias word address of FWU bit */ +#define FWU_BitNumber 0x0A +#define CR_FWU_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (FWU_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of EWUP bit */ +#define CSR_OFFSET (PWR_OFFSET + 0x04) +#define EWUP_BitNumber 0x08 +#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) + +/* ------------------ PWR registers bit mask ------------------------ */ + +/* CR register bit mask */ +#define CR_DS_MASK ((uint32_t)0xFFFFFFFC) +#define CR_PLS_MASK ((uint32_t)0xFFFFFF1F) +#define CR_VOS_MASK ((uint32_t)0xFFFFE7FF) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup PWR_Private_Functions + * @{ + */ + +/** @defgroup PWR_Group1 RTC Domain Access function + * @brief RTC Domain Access function + * +@verbatim + ============================================================================== + ##### RTC Domain Access function ##### + ============================================================================== + + [..] After reset, the RTC Registers (RCC CSR Register, RTC registers and RTC backup + registers) are protected against possible stray write accesses. + [..] To enable access to RTC domain use the PWR_RTCAccessCmd(ENABLE) function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the PWR peripheral registers to their default reset values. + * @note Before calling this function, the VOS[1:0] bits should be configured + * to "10" and the system frequency has to be configured accordingly. + * To configure the VOS[1:0] bits, use the PWR_VoltageScalingConfig() + * function. + * @note ULP and FWU bits are not reset by this function. + * @param None + * @retval None + */ +void PWR_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); +} + +/** + * @brief Enables or disables access to the RTC and backup registers. + * @note If the HSE divided by 2, 4, 8 or 16 is used as the RTC clock, the + * RTC Domain Access should be kept enabled. + * @param NewState: new state of the access to the RTC and backup registers. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_RTCAccessCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup PWR_Group2 PVD configuration functions + * @brief PVD configuration functions + * +@verbatim + ============================================================================== + ##### PVD configuration functions ##### + ============================================================================== + [..] + (+) The PVD is used to monitor the VDD power supply by comparing it to a threshold + selected by the PVD Level (PLS[2:0] bits in the PWR_CR). + (+) The PVD can use an external input analog voltage (PVD_IN) which is compared + internally to VREFINT. The PVD_IN (PB7) has to be configured in Analog mode + when PWR_PVDLevel_7 is selected (PLS[2:0] = 111). + (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower than the + PVD threshold. This event is internally connected to the EXTI line16 + and can generate an interrupt if enabled through the EXTI registers. + (+) The PVD is stopped in Standby mode. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param PWR_PVDLevel: specifies the PVD detection level. + * This parameter can be one of the following values: + * @arg PWR_PVDLevel_0: PVD detection level set to 1.9V. + * @arg PWR_PVDLevel_1: PVD detection level set to 2.1V. + * @arg PWR_PVDLevel_2: PVD detection level set to 2.3V. + * @arg PWR_PVDLevel_3: PVD detection level set to 2.5V. + * @arg PWR_PVDLevel_4: PVD detection level set to 2.7V. + * @arg PWR_PVDLevel_5: PVD detection level set to 2.9V. + * @arg PWR_PVDLevel_6: PVD detection level set to 3.1V. + * @arg PWR_PVDLevel_7: External input analog voltage (Compare internally to VREFINT). + * @retval None + */ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); + + tmpreg = PWR->CR; + + /* Clear PLS[7:5] bits */ + tmpreg &= CR_PLS_MASK; + + /* Set PLS[7:5] bits according to PWR_PVDLevel value */ + tmpreg |= PWR_PVDLevel; + + /* Store the new value */ + PWR->CR = tmpreg; +} + +/** + * @brief Enables or disables the Power Voltage Detector(PVD). + * @param NewState: new state of the PVD. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_PVDCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup PWR_Group3 WakeUp pins configuration functions + * @brief WakeUp pins configuration functions + * +@verbatim + ============================================================================== + ##### WakeUp pin configuration functions ##### + ============================================================================== + + (+) WakeUp pins are used to wakeup the system from Standby mode. These pins are + forced in input pull down configuration and are active on rising edges. + (+) There are three WakeUp pins: WakeUp Pin 1 on PA.00, WakeUp Pin 2 on PC.13 and + WakeUp Pin 3 on PE.06. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the WakeUp Pin functionality. + * @param PWR_WakeUpPin: specifies the WakeUpPin. + * This parameter can be: PWR_WakeUpPin_1, PWR_WakeUpPin_2 or PWR_WakeUpPin_3. + * @param NewState: new state of the WakeUp Pin functionality. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_WakeUpPinCmd(uint32_t PWR_WakeUpPin, FunctionalState NewState) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_PWR_WAKEUP_PIN(PWR_WakeUpPin)); + + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + tmp = CSR_EWUP_BB + PWR_WakeUpPin; + + *(__IO uint32_t *) (tmp) = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup PWR_Group4 Ultra Low Power mode configuration functions + * @brief Ultra Low Power mode configuration functions + * +@verbatim + ============================================================================== + ##### Ultra Low Power mode configuration functions ##### + ============================================================================== + [..] + (+) The internal voltage reference consumption is not negligible, in particular + in Stop and Standby mode. To reduce power consumption, use the PWR_UltraLowPowerCmd() + function (ULP bit (Ultra low power) in the PWR_CR register) to disable the + internal voltage reference. However, in this case, when exiting from the + Stop/Standby mode, the functions managed through the internal voltage reference + are not reliable during the internal voltage reference startup time (up to 3 ms). + To reduce the wakeup time, the device can exit from Stop/Standby mode without + waiting for the internal voltage reference startup time. This is performed + by using the PWR_FastWakeUpCmd() function (setting the FWU bit (Fast + wakeup) in the PWR_CR register) before entering Stop/Standby mode. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the Fast WakeUp from Ultra Low Power mode. + * @param NewState: new state of the Fast WakeUp functionality. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_FastWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_FWU_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Ultra Low Power mode. + * @param NewState: new state of the Ultra Low Power mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_UltraLowPowerCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_ULP_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup PWR_Group5 Voltage Scaling configuration functions + * @brief Voltage Scaling configuration functions + * +@verbatim + ============================================================================== + ##### Voltage Scaling configuration functions ##### + ============================================================================== + + (+) The dynamic voltage scaling is a power management technique which consists in + increasing or decreasing the voltage used for the digital peripherals (VCORE), + according to the circumstances. + + [..] Depending on the device voltage range, the maximum frequency and FLASH wait + state should be adapted accordingly: + [..] + +------------------------------------------------------------------+ + | Wait states | HCLK clock frequency (MHz) | + | |------------------------------------------------| + | (Latency) | voltage range | voltage range | + | | 1.65 V - 3.6 V | 2.0 V - 3.6 V | + | |----------------|---------------|---------------| + | | Range 3 | Range 2 | Range 1 | + | | VCORE = 1.2 V | VCORE = 1.5 V | VCORE = 1.8 V | + |---------------- |----------------|---------------|---------------| + | 0WS(1CPU cycle) |0 < HCLK <= 2 |0 < HCLK <= 8 |0 < HCLK <= 16 | + |-----------------|----------------|---------------|---------------| + | 1WS(2CPU cycle) |2 < HCLK <= 4 |8 < HCLK <= 16 |16 < HCLK <= 32| + |-----------------|----------------|---------------|---------------| + | CPU Performance | Low | Medium | High | + |-----__----------|----------------|---------------|---------------| + |Power Performance| High | Medium | Low | + +------------------------------------------------------------------+ + + (+) To modify the Product voltage range, user application has to: + (++) Check VDD to identify which ranges are allowed (see table above). + (++) Check the PWR_FLAG_VOSF (Voltage Scaling update ongoing) using the PWR_GetFlagStatus() + function and wait until it is reset. + (++) Configure the Voltage range using the PWR_VoltageScalingConfig() function. + + (+) When VCORE range 1 is selected and VDD drops below 2.0 V, the application must + reconfigure the system: + (++) Detect that VDD drops below 2.0 V using the PVD Level 1. + (++) Adapt the clock frequency to the voltage range that will be selected at next step. + (++) Select the required voltage range. + (++) When VCORE range 2 or range 3 is selected and VDD drops below 2.0 V, no system + reconfiguration is required. + + (+) When VDD is above 2.0 V, any of the 3 voltage ranges can be selected. + (++) When the voltage range is above the targeted voltage range (e.g. from range + 1 to 2). + (++) Adapt the clock frequency to the lower voltage range that will be selected + at next step. + (++) Select the required voltage range. + (++) When the voltage range is below the targeted voltage range (e.g. from range + 3 to 1). + (++) Select the required voltage range. + (++) Tune the clock frequency if needed. + + (+) When VDD is below 2.0 V, only range 2 and 3 can be selected: + (++) From range 2 to range 3. + (+++) Adapt the clock frequency to voltage range 3. + (+++) Select voltage range 3. + (++) From range 3 to range 2. + (+++) Select the voltage range 2. + (+++) Tune the clock frequency if needed. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the voltage scaling range. + * @note During voltage scaling configuration, the system clock is stopped + * until the regulator is stabilized (VOSF = 0). This must be taken + * into account during application developement, in case a critical + * reaction time to interrupt is needed, and depending on peripheral + * used (timer, communication,...). + * + * @param PWR_VoltageScaling: specifies the voltage scaling range. + * This parameter can be: + * @arg PWR_VoltageScaling_Range1: Voltage Scaling Range 1 (VCORE = 1.8V). + * @arg PWR_VoltageScaling_Range2: Voltage Scaling Range 2 (VCORE = 1.5V). + * @arg PWR_VoltageScaling_Range3: Voltage Scaling Range 3 (VCORE = 1.2V) + * @retval None + */ +void PWR_VoltageScalingConfig(uint32_t PWR_VoltageScaling) +{ + uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(PWR_VoltageScaling)); + + tmp = PWR->CR; + + tmp &= CR_VOS_MASK; + tmp |= PWR_VoltageScaling; + + PWR->CR = tmp & 0xFFFFFFF3; + +} + +/** + * @} + */ + +/** @defgroup PWR_Group6 Low Power modes configuration functions + * @brief Low Power modes configuration functions + * +@verbatim + ============================================================================== + ##### Low Power modes configuration functions ##### + ============================================================================== + + [..] The devices feature five low-power modes: + (+) Low power run mode: regulator in low power mode, limited clock frequency, + limited number of peripherals running. + (+) Sleep mode: Cortex-M3 core stopped, peripherals kept running. + (+) Low power sleep mode: Cortex-M3 core stopped, limited clock frequency, + limited number of peripherals running, regulator in low power mode. + (+) Stop mode: all clocks are stopped, regulator running, regulator in low power mode. + (+) Standby mode: VCORE domain powered off. + + *** Low power run mode (LP run) *** + =================================== + [..] + (+) Entry: + (++) Decrease the system frequency. + (++) The regulator is forced in low power mode using the PWR_EnterLowPowerRunMode() + function. + (+) Exit: + (++) The regulator is forced in Main regulator mode sing the PWR_EnterLowPowerRunMode() + function. + (++) Increase the system frequency if needed. + + *** Sleep mode *** + ================== + [..] + (+) Entry: + (++) The Sleep mode is entered by using the PWR_EnterSleepMode(PWR_Regulator_ON,) + function with regulator ON. + (+) Exit: + (++) Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep mode. + + *** Low power sleep mode (LP sleep) *** + ======================================= + [..] + (+) Entry: + (++) The Flash memory must be switched off by using the FLASH_SLEEPPowerDownCmd() + function. + (++) Decrease the system frequency. + (++) The regulator is forced in low power mode and the WFI or WFE instructions + are executed using the PWR_EnterSleepMode(PWR_Regulator_LowPower,) function + with regulator in LowPower. + (+) Exit: + (++) Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep LP mode. + + *** Stop mode *** + ================= + [..] In Stop mode, all clocks in the VCORE domain are stopped, the PLL, the MSI, + the HSI and the HSE RC oscillators are disabled. Internal SRAM and register + contents are preserved. + The voltage regulator can be configured either in normal or low-power mode. + To minimize the consumption In Stop mode, VREFINT, the BOR, PVD, and temperature + sensor can be switched off before entering the Stop mode. They can be switched + on again by software after exiting the Stop mode using the PWR_UltraLowPowerCmd() + function. + + (+) Entry: + (++) The Stop mode is entered using the PWR_EnterSTOPMode(PWR_Regulator_LowPower,) + function with regulator in LowPower or with Regulator ON. + (+) Exit: + (++) Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + + *** Standby mode *** + ==================== + [..] The Standby mode allows to achieve the lowest power consumption. It is based + on the Cortex-M3 deepsleep mode, with the voltage regulator disabled. + The VCORE domain is consequently powered off. The PLL, the MSI, the HSI + oscillator and the HSE oscillator are also switched off. SRAM and register + contents are lost except for the RTC registers, RTC backup registers and + Standby circuitry. + + [..] The voltage regulator is OFF. + + [..] To minimize the consumption In Standby mode, VREFINT, the BOR, PVD, and temperature + sensor can be switched off before entering the Standby mode. They can be switched + on again by software after exiting the Standby mode using the PWR_UltraLowPowerCmd() + function. + + (+) Entry: + (++) The Standby mode is entered using the PWR_EnterSTANDBYMode() function. + (+) Exit: + (++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wakeup, + tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + + *** Auto-wakeup (AWU) from low-power mode *** + ============================================= + [..]The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + Wakeup event, a tamper event, a time-stamp event, or a comparator event, + without depending on an external interrupt (Auto-wakeup mode). + + (+) RTC auto-wakeup (AWU) from the Stop mode + (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to: + (+++) Configure the EXTI Line 17 to be sensitive to rising edges (Interrupt + or Event modes) using the EXTI_Init() function. + (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function + (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() + and RTC_AlarmCmd() functions. + (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it + is necessary to: + (+++) Configure the EXTI Line 19 to be sensitive to rising edges (Interrupt + or Event modes) using the EXTI_Init() function. + (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() + function. + (+++) Configure the RTC to detect the tamper or time stamp event using the + RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() + functions. + (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to: + (+++) Configure the EXTI Line 20 to be sensitive to rising edges (Interrupt + or Event modes) using the EXTI_Init() function. + (+++) Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function. + (+++) Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), + RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions. + + (+) RTC auto-wakeup (AWU) from the Standby mode + (++) To wake up from the Standby mode with an RTC alarm event, it is necessary to: + (+++) Enable the RTC Alarm Interrupt using the RTC_ITConfig() function. + (+++) Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() + and RTC_AlarmCmd() functions. + (++) To wake up from the Standby mode with an RTC Tamper or time stamp event, it + is necessary to: + (+++) Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() + function. + (+++) Configure the RTC to detect the tamper or time stamp event using the + RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() + functions. + (++) To wake up from the Standby mode with an RTC WakeUp event, it is necessary to: + (+++) Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function + (+++) Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), + RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions. + + (+) Comparator auto-wakeup (AWU) from the Stop mode + (++) To wake up from the Stop mode with an comparator 1 or comparator 2 wakeup + event, it is necessary to: + (+++) Configure the EXTI Line 21 for comparator 1 or EXTI Line 22 for comparator 2 + to be sensitive to to the selected edges (falling, rising or falling + and rising) (Interrupt or Event modes) using the EXTI_Init() function. + (+++) Configure the comparator to generate the event. + +@endverbatim + * @{ + */ + +/** + * @brief Enters/Exits the Low Power Run mode. + * @note Low power run mode can only be entered when VCORE is in range 2. + * In addition, the dynamic voltage scaling must not be used when Low + * power run mode is selected. Only Stop and Sleep modes with regulator + * configured in Low power mode is allowed when Low power run mode is + * selected. + * @note In Low power run mode, all I/O pins keep the same state as in Run mode. + * @param NewState: new state of the Low Power Run mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void PWR_EnterLowPowerRunMode(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + PWR->CR |= PWR_CR_LPSDSR; + PWR->CR |= PWR_CR_LPRUN; + } + else + { + PWR->CR &= (uint32_t)~((uint32_t)PWR_CR_LPRUN); + PWR->CR &= (uint32_t)~((uint32_t)PWR_CR_LPSDSR); + } +} + +/** + * @brief Enters Sleep mode. + * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + * @param PWR_Regulator: specifies the regulator state in Sleep mode. + * This parameter can be one of the following values: + * @arg PWR_Regulator_ON: Sleep mode with regulator ON + * @arg PWR_Regulator_LowPower: Sleep mode with regulator in low power mode + * @note Low power sleep mode can only be entered when VCORE is in range 2. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Low power sleep mode. + * @param PWR_SLEEPEntry: specifies if SLEEP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPEntry_WFI: enter SLEEP mode with WFI instruction + * @arg PWR_SLEEPEntry_WFE: enter SLEEP mode with WFE instruction + * @retval None + */ +void PWR_EnterSleepMode(uint32_t PWR_Regulator, uint8_t PWR_SLEEPEntry) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(PWR_Regulator)); + + assert_param(IS_PWR_SLEEP_ENTRY(PWR_SLEEPEntry)); + + /* Select the regulator state in Sleep mode ---------------------------------*/ + tmpreg = PWR->CR; + + /* Clear PDDS and LPDSR bits */ + tmpreg &= CR_DS_MASK; + + /* Set LPDSR bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator; + + /* Store the new value */ + PWR->CR = tmpreg; + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } +} + +/** + * @brief Enters STOP mode. + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * @note When exiting Stop mode by issuing an interrupt or a wakeup event, + * the MSI RC oscillator is selected as system clock. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * @param PWR_Regulator: specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_Regulator_ON: STOP mode with regulator ON. + * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode. + * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction. + * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction. + * @retval None + */ +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(PWR_Regulator)); + assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg = PWR->CR; + /* Clear PDDS and LPDSR bits */ + tmpreg &= CR_DS_MASK; + + /* Set LPDSR bit according to PWR_Regulator value */ + tmpreg |= PWR_Regulator; + + /* Store the new value */ + PWR->CR = tmpreg; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + + /* Select STOP mode entry --------------------------------------------------*/ + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); +} + +/** + * @brief Enters STANDBY mode. + * @note In Standby mode, all I/O pins are high impedance except for: + * Reset pad (still available) + * RTC_AF1 pin (PC13) if configured for Wakeup pin 2 (WKUP2), tamper, + * time-stamp, RTC Alarm out, or RTC clock calibration out. + * WKUP pin 1 (PA0) and WKUP pin 3 (PE6), if enabled. + * @param None + * @retval None + */ +void PWR_EnterSTANDBYMode(void) +{ + /* Clear Wakeup flag */ + PWR->CR |= PWR_CR_CWUF; + + /* Select STANDBY mode */ + PWR->CR |= PWR_CR_PDDS; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + +/* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @} + */ + +/** @defgroup PWR_Group7 Flags management functions + * @brief Flags management functions + * +@verbatim + ============================================================================== + ##### Flags management functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Checks whether the specified PWR flag is set or not. + * @param PWR_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event + * was received from the WKUP pin or from the RTC alarm (Alarm A or Alarm B), + * RTC Tamper event, RTC TimeStamp event or RTC Wakeup. + * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was + * resumed from StandBy mode. + * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled + * by the PWR_PVDCmd() function. + * @arg PWR_FLAG_VREFINTRDY: Internal Voltage Reference Ready flag. This + * flag indicates the state of the internal voltage reference, VREFINT. + * @arg PWR_FLAG_VOS: Voltage Scaling select flag. A delay is required for + * the internal regulator to be ready after the voltage range is changed. + * The VOSF flag indicates that the regulator has reached the voltage level + * defined with bits VOS[1:0] of PWR_CR register. + * @arg PWR_FLAG_REGLP: Regulator LP flag. This flag is set by hardware + * when the MCU is in Low power run mode. + * When the MCU exits from Low power run mode, this flag stays SET until + * the regulator is ready in main mode. A polling on this flag is + * recommended to wait for the regulator main mode. + * This flag is RESET by hardware when the regulator is ready. + * @retval The new state of PWR_FLAG (SET or RESET). + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); + + if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the PWR's pending flags. + * @param PWR_FLAG: specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + * @retval None + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + /* Check the parameters */ + assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); + + PWR->CR |= PWR_FLAG << 2; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rcc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rcc.c new file mode 100644 index 0000000..6218025 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rcc.c @@ -0,0 +1,1642 @@ +/** + ****************************************************************************** + * @file stm32l1xx_rcc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Reset and clock control (RCC) peripheral: + * + Internal/external clocks, PLL, CSS and MCO configuration + * + System, AHB and APB busses clocks configuration + * + Peripheral clocks configuration + * + Interrupts and flags management + * + @verbatim + + =============================================================================== + ##### RCC specific features ##### + =============================================================================== + [..] After reset the device is running from MSI (2 MHz) with Flash 0 WS, + all peripherals are off except internal SRAM, Flash and JTAG. + (#) There is no prescaler on High speed (AHB) and Low speed (APB) busses; + all peripherals mapped on these busses are running at MSI speed. + (#) The clock for all peripherals is switched off, except the SRAM and + FLASH. + (#) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + [..] Once the device started from reset, the user application has to: + (#) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (#) Configure the System clock frequency and Flash settings + (#) Configure the AHB and APB busses prescalers + (#) Enable the clock for the peripheral(s) to be used + (#) Configure the clock source(s) for peripherals whose clocks are not + derived from the System clock (ADC, RTC/LCD and IWDG) + + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup RCC + * @brief RCC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* --- CR Register ---*/ + +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BitNumber 0x00 +#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) + +/* Alias word address of MSION bit */ +#define MSION_BitNumber 0x08 +#define CR_MSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (MSION_BitNumber * 4)) + +/* Alias word address of PLLON bit */ +#define PLLON_BitNumber 0x18 +#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) + +/* Alias word address of CSSON bit */ +#define CSSON_BitNumber 0x1C +#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) + +/* --- CSR Register ---*/ + +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x34) +#define LSION_BitNumber 0x00 +#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) + +/* Alias word address of LSECSSON bit */ +#define LSECSSON_BitNumber 0x0B +#define CSR_LSECSSON_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSECSSON_BitNumber * 4)) + +/* Alias word address of RTCEN bit */ +#define RTCEN_BitNumber 0x16 +#define CSR_RTCEN_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (RTCEN_BitNumber * 4)) + +/* Alias word address of RTCRST bit */ +#define RTCRST_BitNumber 0x17 +#define CSR_RTCRST_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (RTCRST_BitNumber * 4)) + + +/* ---------------------- RCC registers mask -------------------------------- */ +/* RCC Flag Mask */ +#define FLAG_MASK ((uint8_t)0x1F) + +/* CR register byte 3 (Bits[23:16]) base address */ +#define CR_BYTE3_ADDRESS ((uint32_t)0x40023802) + +/* ICSCR register byte 4 (Bits[31:24]) base address */ +#define ICSCR_BYTE4_ADDRESS ((uint32_t)0x40023807) + +/* CFGR register byte 3 (Bits[23:16]) base address */ +#define CFGR_BYTE3_ADDRESS ((uint32_t)0x4002380A) + +/* CFGR register byte 4 (Bits[31:24]) base address */ +#define CFGR_BYTE4_ADDRESS ((uint32_t)0x4002380B) + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define CIR_BYTE2_ADDRESS ((uint32_t)0x4002380D) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002380E) + +/* CSR register byte 2 (Bits[15:8]) base address */ +#define CSR_BYTE2_ADDRESS ((uint32_t)0x40023835) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +static __I uint8_t PLLMulTable[9] = {3, 4, 6, 8, 12, 16, 24, 32, 48}; +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Private_Functions + * @{ + */ + +/** @defgroup RCC_Group1 Internal and external clocks, PLL, CSS and MCO configuration functions + * @brief Internal and external clocks, PLL, CSS and MCO configuration functions + * +@verbatim + =============================================================================== + ##### Internal-external clocks, PLL, CSS and MCO configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to configure the internal/external + clocks, PLL, CSS and MCO. + (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly + or through the PLL as System clock source. + (#) MSI (multi-speed internal), multispeed low power RC + (65.536 KHz to 4.194 MHz) MHz used as System clock source. + (#) LSI (low-speed internal), 37 KHz low consumption RC used as IWDG + and/or RTC clock source. + (#) HSE (high-speed external), 1 to 24 MHz crystal oscillator used + directly or through the PLL as System clock source. Can be used + also as RTC clock source. + (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + (#) PLL (clocked by HSI or HSE), for System clock and USB (48 MHz). + (#) CSS (Clock security system), once enable and if a HSE clock failure + occurs (HSE used directly or through PLL as System clock source), + the System clock is automatically switched to MSI and an interrupt + is generated if enabled. + The interrupt is linked to the Cortex-M3 NMI (Non-Maskable Interrupt) + exception vector. + (#) MCO (microcontroller clock output), used to output SYSCLK, HSI, MSI, + HSE, PLL, LSI or LSE clock (through a configurable prescaler) on + PA8 pin. + +@endverbatim + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * @note MSI ON and used as system clock source (MSI range is not modified + * by this function, it keep the value configured by user application) + * @note HSI, HSE and PLL OFF + * @note AHB, APB1 and APB2 prescaler set to 1. + * @note CSS and MCO OFF + * @note All interrupts disabled + * @note However, this function doesn't modify the configuration of the + * @note Peripheral clocks + * @note LSI, LSE and RTC clocks + * @param None + * @retval None + */ +void RCC_DeInit(void) +{ + + /* Set MSION bit */ + RCC->CR |= (uint32_t)0x00000100; + + /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */ + RCC->CFGR &= (uint32_t)0x88FFC00C; + + /* Reset HSION, HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xEEFEFFFE; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ + RCC->CFGR &= (uint32_t)0xFF02FFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; +} + +/** + * @brief Configures the External High Speed oscillator (HSE). + * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application + * software should wait on HSERDY flag to be set indicating that HSE clock + * is stable and can be used to clock the PLL and/or system clock. + * @note HSE state can not be changed if it is used directly or through the + * PLL as system clock. In this case, you have to select another source + * of the system clock then change the HSE state (ex. disable it). + * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. + * @note This function reset the CSSON bit, so if the Clock security system(CSS) + * was previously enabled you have to enable it again after calling this + * function. + * @param RCC_HSE: specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg RCC_HSE_ON: turn ON the HSE oscillator + * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock + * @retval None + */ +void RCC_HSEConfig(uint8_t RCC_HSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_HSE)); + + /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ + *(__IO uint8_t *) CR_BYTE3_ADDRESS = RCC_HSE_OFF; + + /* Set the new HSE configuration -------------------------------------------*/ + *(__IO uint8_t *) CR_BYTE3_ADDRESS = RCC_HSE; + +} + +/** + * @brief Waits for HSE start-up. + * @note This functions waits on HSERDY flag to be set and return SUCCESS if + * this flag is set, otherwise returns ERROR if the timeout is reached + * and this flag is not set. The timeout value is defined by the constant + * HSE_STARTUP_TIMEOUT in stm32l1xx.h file. You can tailor it depending + * on the HSE crystal used in your application. + * @param None + * @retval An ErrorStatus enumeration value: + * - SUCCESS: HSE oscillator is stable and ready to use + * - ERROR: HSE oscillator not yet ready + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + ErrorStatus status = ERROR; + FlagStatus HSEStatus = RESET; + + /* Wait till HSE is ready and if timeout is reached exit */ + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); + + if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + return (status); +} + +/** + * @brief Adjusts the Internal Multi Speed oscillator (MSI) calibration value. + * @note The calibration is used to compensate for the variations in voltage + * and temperature that influence the frequency of the internal MSI RC. + * Refer to the Application Note AN3300 for more details on how to + * calibrate the MSI. + * @param MSICalibrationValue: specifies the MSI calibration trimming value. + * This parameter must be a number between 0 and 0xFF. + * @retval None + */ +void RCC_AdjustMSICalibrationValue(uint8_t MSICalibrationValue) +{ + + /* Check the parameters */ + assert_param(IS_RCC_MSI_CALIBRATION_VALUE(MSICalibrationValue)); + + *(__IO uint8_t *) ICSCR_BYTE4_ADDRESS = MSICalibrationValue; +} + +/** + * @brief Configures the Internal Multi Speed oscillator (MSI) clock range. + * @note After restart from Reset or wakeup from STANDBY, the MSI clock is + * around 2.097 MHz. The MSI clock does not change after wake-up from + * STOP mode. + * @note The MSI clock range can be modified on the fly. + * @param RCC_MSIRange: specifies the MSI Clock range. + * This parameter must be one of the following values: + * @arg RCC_MSIRange_0: MSI clock is around 65.536 KHz + * @arg RCC_MSIRange_1: MSI clock is around 131.072 KHz + * @arg RCC_MSIRange_2: MSI clock is around 262.144 KHz + * @arg RCC_MSIRange_3: MSI clock is around 524.288 KHz + * @arg RCC_MSIRange_4: MSI clock is around 1.048 MHz + * @arg RCC_MSIRange_5: MSI clock is around 2.097 MHz (default after Reset or wake-up from STANDBY) + * @arg RCC_MSIRange_6: MSI clock is around 4.194 MHz + * + * @retval None + */ +void RCC_MSIRangeConfig(uint32_t RCC_MSIRange) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_MSI_CLOCK_RANGE(RCC_MSIRange)); + + tmpreg = RCC->ICSCR; + + /* Clear MSIRANGE[2:0] bits */ + tmpreg &= ~RCC_ICSCR_MSIRANGE; + + /* Set the MSIRANGE[2:0] bits according to RCC_MSIRange value */ + tmpreg |= (uint32_t)RCC_MSIRange; + + /* Store the new value */ + RCC->ICSCR = tmpreg; +} + +/** + * @brief Enables or disables the Internal Multi Speed oscillator (MSI). + * @note The MSI is stopped by hardware when entering STOP and STANDBY modes. + * It is used (enabled by hardware) as system clock source after + * startup from Reset, wakeup from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * @note MSI can not be stopped if it is used as system clock source. + * In this case, you have to select another source of the system + * clock then stop the MSI. + * @note After enabling the MSI, the application software should wait on + * MSIRDY flag to be set indicating that MSI clock is stable and can + * be used as system clock source. + * @param NewState: new state of the MSI. + * This parameter can be: ENABLE or DISABLE. + * @note When the MSI is stopped, MSIRDY flag goes low after 6 MSI oscillator + * clock cycles. + * @retval None + */ +void RCC_MSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_MSION_BB = (uint32_t)NewState; +} + +/** + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * @note The calibration is used to compensate for the variations in voltage + * and temperature that influence the frequency of the internal HSI RC. + * Refer to the Application Note AN3300 for more details on how to + * calibrate the HSI. + * @param HSICalibrationValue: specifies the HSI calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * @retval None + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_HSI_CALIBRATION_VALUE(HSICalibrationValue)); + + tmpreg = RCC->ICSCR; + + /* Clear HSITRIM[4:0] bits */ + tmpreg &= ~RCC_ICSCR_HSITRIM; + + /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ + tmpreg |= (uint32_t)HSICalibrationValue << 8; + + /* Store the new value */ + RCC->ICSCR = tmpreg; +} + +/** + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * @note After enabling the HSI, the application software should wait on + * HSIRDY flag to be set indicating that HSI clock is stable and can + * be used to clock the PLL and/or system clock. + * @note HSI can not be stopped if it is used directly or through the PLL + * as system clock. In this case, you have to select another source + * of the system clock then stop the HSI. + * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. + * @param NewState: new state of the HSI. + * This parameter can be: ENABLE or DISABLE. + * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator + * clock cycles. + * @retval None + */ +void RCC_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the External Low Speed oscillator (LSE). + * @note As the LSE is in the RTC domain and write access is denied to this + * domain after reset, you have to enable write access using + * PWR_RTCAccessCmd(ENABLE) function before to configure the LSE + * (to be done once after reset). + * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_Bypass), the application + * software should wait on LSERDY flag to be set indicating that LSE clock + * is stable and can be used to clock the RTC. + * @param RCC_LSE: specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg RCC_LSE_ON: turn ON the LSE oscillator + * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock + * @retval None + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_LSE)); + + /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ + *(__IO uint8_t *) CSR_BYTE2_ADDRESS = RCC_LSE_OFF; + + /* Set the new LSE configuration -------------------------------------------*/ + *(__IO uint8_t *) CSR_BYTE2_ADDRESS = RCC_LSE; +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @note After enabling the LSI, the application software should wait on + * LSIRDY flag to be set indicating that LSI clock is stable and can + * be used to clock the IWDG and/or the RTC. + * @note LSI can not be disabled if the IWDG is running. + * @param NewState: new state of the LSI. + * This parameter can be: ENABLE or DISABLE. + * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator + * clock cycles. + * @retval None + */ +void RCC_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; +} + +/** + * @brief Configures the PLL clock source and multiplication factor. + * @note This function must be used only when the PLL is disabled. + * + * @param RCC_PLLSource: specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSource_HSI: HSI oscillator clock selected as PLL clock source + * @arg RCC_PLLSource_HSE: HSE oscillator clock selected as PLL clock source + * @note The minimum input clock frequency for PLL is 2 MHz (when using HSE as + * PLL source). + * + * @param RCC_PLLMul: specifies the PLL multiplication factor, which drive the PLLVCO clock + * This parameter can be: + * @arg RCC_PLLMul_3: PLL clock source multiplied by 3 + * @arg RCC_PLLMul_4: PLL clock source multiplied by 4 + * @arg RCC_PLLMul_6: PLL clock source multiplied by 6 + * @arg RCC_PLLMul_8: PLL clock source multiplied by 8 + * @arg RCC_PLLMul_12: PLL clock source multiplied by 12 + * @arg RCC_PLLMul_16: PLL clock source multiplied by 16 + * @arg RCC_PLLMul_24: PLL clock source multiplied by 24 + * @arg RCC_PLLMul_32: PLL clock source multiplied by 32 + * @arg RCC_PLLMul_48: PLL clock source multiplied by 48 + * @note The application software must set correctly the PLL multiplication + * factor to avoid exceeding: + * - 96 MHz as PLLVCO when the product is in range 1 + * - 48 MHz as PLLVCO when the product is in range 2 + * - 24 MHz when the product is in range 3 + * @note When using the USB the PLLVCO should be 96MHz + * + * @param RCC_PLLDiv: specifies the PLL division factor. + * This parameter can be: + * @arg RCC_PLLDiv_2: PLL Clock output divided by 2 + * @arg RCC_PLLDiv_3: PLL Clock output divided by 3 + * @arg RCC_PLLDiv_4: PLL Clock output divided by 4 + * @note The application software must set correctly the output division to avoid + * exceeding 32 MHz as SYSCLK. + * + * @retval None + */ +void RCC_PLLConfig(uint8_t RCC_PLLSource, uint8_t RCC_PLLMul, uint8_t RCC_PLLDiv) +{ + /* Check the parameters */ + assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); + assert_param(IS_RCC_PLL_DIV(RCC_PLLDiv)); + + *(__IO uint8_t *) CFGR_BYTE3_ADDRESS = (uint8_t)(RCC_PLLSource | ((uint8_t)(RCC_PLLMul | (uint8_t)(RCC_PLLDiv)))); +} + +/** + * @brief Enables or disables the PLL. + * @note After enabling the PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The PLL can not be disabled if it is used as system clock source + * @note The PLL is disabled by hardware when entering STOP and STANDBY modes. + * @param NewState: new state of the PLL. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M3 NMI (Non-Maskable Interrupt) exception vector. + * @param NewState: new state of the Clock Security System. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the LSE Clock Security System. + * @param NewState: new state of the Clock Security System. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_LSEClockSecuritySystemCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CSR_LSECSSON_BB = (uint32_t)NewState; +} + +/** + * @brief Selects the clock source to output on MCO pin (PA8). + * @note PA8 should be configured in alternate function mode. + * @param RCC_MCOSource: specifies the clock source to output. + * This parameter can be one of the following values: + * @arg RCC_MCOSource_NoClock: No clock selected + * @arg RCC_MCOSource_SYSCLK: System clock selected + * @arg RCC_MCOSource_HSI: HSI oscillator clock selected + * @arg RCC_MCOSource_MSI: MSI oscillator clock selected + * @arg RCC_MCOSource_HSE: HSE oscillator clock selected + * @arg RCC_MCOSource_PLLCLK: PLL clock selected + * @arg RCC_MCOSource_LSI: LSI clock selected + * @arg RCC_MCOSource_LSE: LSE clock selected + * @param RCC_MCODiv: specifies the MCO prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODiv_1: no division applied to MCO clock + * @arg RCC_MCODiv_2: division by 2 applied to MCO clock + * @arg RCC_MCODiv_4: division by 4 applied to MCO clock + * @arg RCC_MCODiv_8: division by 8 applied to MCO clock + * @arg RCC_MCODiv_16: division by 16 applied to MCO clock + * @retval None + */ +void RCC_MCOConfig(uint8_t RCC_MCOSource, uint8_t RCC_MCODiv) +{ + /* Check the parameters */ + assert_param(IS_RCC_MCO_SOURCE(RCC_MCOSource)); + assert_param(IS_RCC_MCO_DIV(RCC_MCODiv)); + + /* Select MCO clock source and prescaler */ + *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCOSource | RCC_MCODiv; +} + +/** + * @} + */ + +/** @defgroup RCC_Group2 System AHB and APB busses clocks configuration functions + * @brief System, AHB and APB busses clocks configuration functions + * +@verbatim + =============================================================================== + ##### System, AHB and APB busses clocks configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to configure the System, AHB, + APB1 and APB2 busses clocks. + (#) Several clock sources can be used to drive the System clock (SYSCLK): + MSI, HSI, HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA and GPIO).APB1 (PCLK1) and APB2 (PCLK2) clocks are + derived from AHB clock through configurable prescalers and used to + clock the peripherals mapped on these busses. You can use + "RCC_GetClocksFreq()" function to retrieve the frequencies of these + clocks. + + -@- All the peripheral clocks are derived from the System clock (SYSCLK) + except: + (+@) The USB 48 MHz clock which is derived from the PLL VCO clock. + (+@) The ADC clock which is always the HSI clock. A divider by 1, 2 + or 4 allows to adapt the clock frequency to the device operating + conditions. + (+@) The RTC/LCD clock which is derived from the LSE, LSI or 1 MHz + HSE_RTC (HSE divided by a programmable prescaler). + The System clock (SYSCLK) frequency must be higher or equal to + the RTC/LCD clock frequency. + (+@) IWDG clock which is always the LSI clock. + + (#) The maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 is 32 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly: + + +----------------------------------------------------------------+ + | Wait states | HCLK clock frequency (MHz) | + | |------------------------------------------------| + | (Latency) | voltage range | voltage range | + | | 1.65 V - 3.6 V | 2.0 V - 3.6 V | + | |----------------|---------------|---------------| + | | VCORE = 1.2 V | VCORE = 1.5 V | VCORE = 1.8 V | + |-------------- |----------------|---------------|---------------| + |0WS(1CPU cycle)|0 < HCLK <= 2 |0 < HCLK <= 8 |0 < HCLK <= 16 | + |---------------|----------------|---------------|---------------| + |1WS(2CPU cycle)|2 < HCLK <= 4 |8 < HCLK <= 16 |16 < HCLK <= 32| + +----------------------------------------------------------------+ + + (#) After reset, the System clock source is the MSI (2 MHz) with 0 WS, + Flash 32-bit access is enabled and prefetch is disabled. + [..] It is recommended to use the following software sequences to tune the + number of wait states needed to access the Flash memory with the CPU + frequency (HCLK). + (+) Increasing the CPU frequency (in the same voltage range) + (+) Program the Flash 64-bit access, using "FLASH_ReadAccess64Cmd(ENABLE)" + function + (+) Check that 64-bit access is taken into account by reading FLASH_ACR + (+) Program Flash WS to 1, using "FLASH_SetLatency(FLASH_Latency_1)" + function + (+) Check that the new number of WS is taken into account by reading + FLASH_ACR + (+) Modify the CPU clock source, using "RCC_SYSCLKConfig()" function + (+) If needed, modify the CPU clock prescaler by using "RCC_HCLKConfig()" + function + (+) Check that the new CPU clock source is taken into account by reading + the clock source status, using "RCC_GetSYSCLKSource()" function + (+) Decreasing the CPU frequency (in the same voltage range) + (+) Modify the CPU clock source, using "RCC_SYSCLKConfig()" function + (+) If needed, modify the CPU clock prescaler by using "RCC_HCLKConfig()" + function + (+) Check that the new CPU clock source is taken into account by reading + the clock source status, using "RCC_GetSYSCLKSource()" function + (+) Program the new number of WS, using "FLASH_SetLatency()" function + (+) Check that the new number of WS is taken into account by reading + FLASH_ACR + (+) Enable the Flash 32-bit access, using "FLASH_ReadAccess64Cmd(DISABLE)" + function + (+) Check that 32-bit access is taken into account by reading FLASH_ACR + +@endverbatim + * @{ + */ + +/** + * @brief Configures the system clock (SYSCLK). + * @note The MSI is used (enabled by hardware) as system clock source after + * startup from Reset, wake-up from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after startup delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source will be ready. + * You can use RCC_GetSYSCLKSource() function to know which clock is + * currently used as system clock source. + * @param RCC_SYSCLKSource: specifies the clock source used as system clock source + * This parameter can be one of the following values: + * @arg RCC_SYSCLKSource_MSI: MSI selected as system clock source + * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock source + * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock source + * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock source + * @retval None + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); + + tmpreg = RCC->CFGR; + + /* Clear SW[1:0] bits */ + tmpreg &= ~RCC_CFGR_SW; + + /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ + tmpreg |= RCC_SYSCLKSource; + + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Returns the clock source used as system clock. + * @param None + * @retval The clock source used as system clock. The returned value can be one + * of the following values: + * - 0x00: MSI used as system clock + * - 0x04: HSI used as system clock + * - 0x08: HSE used as system clock + * - 0x0C: PLL used as system clock + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR & RCC_CFGR_SWS)); +} + +/** + * @brief Configures the AHB clock (HCLK). + * @note Depending on the device voltage range, the software has to set correctly + * these bits to ensure that the system frequency does not exceed the + * maximum allowed frequency (for more details refer to section above + * "CPU, AHB and APB busses clocks configuration functions") + * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * This parameter can be one of the following values: + * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK + * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 + * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 + * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 + * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 + * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 + * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 + * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 + * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 + * @retval None + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_HCLK(RCC_SYSCLK)); + + tmpreg = RCC->CFGR; + + /* Clear HPRE[3:0] bits */ + tmpreg &= ~RCC_CFGR_HPRE; + + /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ + tmpreg |= RCC_SYSCLK; + + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the Low Speed APB clock (PCLK1). + * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB1 clock = HCLK + * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + + tmpreg = RCC->CFGR; + + /* Clear PPRE1[2:0] bits */ + tmpreg &= ~RCC_CFGR_PPRE1; + + /* Set PPRE1[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK; + + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Configures the High Speed APB clock (PCLK2). + * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * This parameter can be one of the following values: + * @arg RCC_HCLK_Div1: APB2 clock = HCLK + * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 + * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 + * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 + * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 + * @retval None + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_PCLK(RCC_HCLK)); + + tmpreg = RCC->CFGR; + + /* Clear PPRE2[2:0] bits */ + tmpreg &= ~RCC_CFGR_PPRE2; + + /* Set PPRE2[2:0] bits according to RCC_HCLK value */ + tmpreg |= RCC_HCLK << 3; + + /* Store the new value */ + RCC->CFGR = tmpreg; +} + +/** + * @brief Returns the frequencies of the System, AHB and APB busses clocks. + * @note The frequency returned by this function is not the real frequency + * in the chip. It is calculated based on the predefined constant and + * the source selected by RCC_SYSCLKConfig(): + * + * @note If SYSCLK source is MSI, function returns values based on MSI + * Value as defined by the MSI range, refer to RCC_MSIRangeConfig() + * + * @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. + * + * (*) HSI_VALUE is a constant defined in stm32l1xx.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature, refer to RCC_AdjustHSICalibrationValue(). + * + * (**) HSE_VALUE is a constant defined in stm32l1xx.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * return wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * + * @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, HCLK, PCLK1 and/or PCLK2 clock changes, this function + * must be called to update the structure's field. Otherwise, any + * configuration based on this function will be incorrect. + * + * @retval None + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmul = 0, plldiv = 0, pllsource = 0, presc = 0, msirange = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE ) >> 13; + RCC_Clocks->SYSCLK_Frequency = (32768 * (1 << (msirange + 1))); + break; + case 0x04: /* HSI used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + case 0x08: /* HSE used as system clock */ + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; + break; + case 0x0C: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; + pllmul = PLLMulTable[(pllmul >> 18)]; + plldiv = (plldiv >> 22) + 1; + + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + + if (pllsource == 0x00) + { + /* HSI oscillator clock selected as PLL clock source */ + RCC_Clocks->SYSCLK_Frequency = (((HSI_VALUE) * pllmul) / plldiv); + } + else + { + /* HSE selected as PLL clock source */ + RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE) * pllmul) / plldiv); + } + break; + default: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE ) >> 13; + RCC_Clocks->SYSCLK_Frequency = (32768 * (1 << (msirange + 1))); + break; + } + /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ + /* Get HCLK prescaler */ + tmp = RCC->CFGR & RCC_CFGR_HPRE; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + + /* Get PCLK1 prescaler */ + tmp = RCC->CFGR & RCC_CFGR_PPRE1; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + + /* Get PCLK2 prescaler */ + tmp = RCC->CFGR & RCC_CFGR_PPRE2; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; +} + +/** + * @} + */ + +/** @defgroup RCC_Group3 Peripheral clocks configuration functions + * @brief Peripheral clocks configuration functions + * +@verbatim + =============================================================================== + ##### Peripheral clocks configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to configure the Peripheral clocks. + (#) The RTC/LCD clock which is derived from the LSE, LSI or 1 MHz HSE_RTC + (HSE divided by a programmable prescaler). + (#) After restart from Reset or wakeup from STANDBY, all peripherals are + off except internal SRAM, Flash and JTAG. Before to start using a + peripheral you have to enable its interface clock. You can do this + using RCC_AHBPeriphClockCmd(), RCC_APB2PeriphClockCmd() and + RCC_APB1PeriphClockCmd() functions. + + (#) To reset the peripherals configuration (to the default state after + device reset) you can use RCC_AHBPeriphResetCmd(), + RCC_APB2PeriphResetCmd() and RCC_APB1PeriphResetCmd() functions. + (#) To further reduce power consumption in SLEEP mode the peripheral + clocks can be disabled prior to executing the WFI or WFE instructions. + You can do this using RCC_AHBPeriphClockLPModeCmd(), + RCC_APB2PeriphClockLPModeCmd() and RCC_APB1PeriphClockLPModeCmd() + functions. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the RTC and LCD clock (RTCCLK / LCDCLK). + * @note As the RTC clock configuration bits are in the RTC domain and write + * access is denied to this domain after reset, you have to enable write + * access using PWR_RTCAccessCmd(ENABLE) function before to configure + * the RTC clock source (to be done once after reset). + * @note Once the RTC clock is configured it can't be changed unless the RTC + * is reset using RCC_RTCResetCmd function, or by a Power On Reset (POR) + * @note The RTC clock (RTCCLK) is used also to clock the LCD (LCDCLK). + * + * @param RCC_RTCCLKSource: specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock + * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div2: HSE divided by 2 selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div4: HSE divided by 4 selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div8: HSE divided by 8 selected as RTC clock + * @arg RCC_RTCCLKSource_HSE_Div16: HSE divided by 16 selected as RTC clock + * + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wakeup source. + * However, when the HSE clock is used as RTC clock source, the RTC + * cannot be used in STOP and STANDBY modes. + * + * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as + * RTC clock source). + * + * @retval None + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); + + if ((RCC_RTCCLKSource & RCC_CSR_RTCSEL_HSE) == RCC_CSR_RTCSEL_HSE) + { + /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */ + tmpreg = RCC->CR; + + /* Clear RTCPRE[1:0] bits */ + tmpreg &= ~RCC_CR_RTCPRE; + + /* Configure HSE division factor for RTC clock */ + tmpreg |= (RCC_RTCCLKSource & RCC_CR_RTCPRE); + + /* Store the new value */ + RCC->CR = tmpreg; + } + + RCC->CSR &= ~RCC_CSR_RTCSEL; + + /* Select the RTC clock source */ + RCC->CSR |= (RCC_RTCCLKSource & RCC_CSR_RTCSEL); +} + +/** + * @brief Enables or disables the RTC clock. + * @note This function must be used only after the RTC clock source was selected + * using the RCC_RTCCLKConfig function. + * @param NewState: new state of the RTC clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CSR_RTCEN_BB = (uint32_t)NewState; +} + +/** + * @brief Forces or releases the RTC peripheral and associated resources reset. + * @note This function resets the RTC peripheral, RTC clock source selection + * (in RCC_CSR) and the backup registers. + * @param NewState: new state of the RTC reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_RTCResetCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CSR_RTCRST_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the AHB peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_GPIOA: GPIOA clock + * @arg RCC_AHBPeriph_GPIOB: GPIOB clock + * @arg RCC_AHBPeriph_GPIOC: GPIOC clock + * @arg RCC_AHBPeriph_GPIOD: GPIOD clock + * @arg RCC_AHBPeriph_GPIOE: GPIOE clock + * @arg RCC_AHBPeriph_GPIOH: GPIOH clock + * @arg RCC_AHBPeriph_GPIOF: GPIOF clock + * @arg RCC_AHBPeriph_GPIOG: GPIOG clock + * @arg RCC_AHBPeriph_CRC: CRC clock + * @arg RCC_AHBPeriph_FLITF: (has effect only when the Flash memory is in power down mode) + * @arg RCC_AHBPeriph_DMA1: DMA1 clock + * @arg RCC_AHBPeriph_DMA2: DMA2 clock + * @arg RCC_AHBPeriph_AES: AES clock + * @arg RCC_AHBPeriph_FSMC: FSMC clock + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBENR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_SYSCFG: SYSCFG APB2 Clock. + * @arg RCC_APB2Periph_TIM9: TIM9 APB2 Clock. + * @arg RCC_APB2Periph_TIM10: TIM10 APB2 Clock. + * @arg RCC_APB2Periph_TIM11: TIM11 APB2 Clock. + * @arg RCC_APB2Periph_ADC1: ADC1 APB2 Clock. + * @arg RCC_APB2Periph_SDIO: SDIO APB2 Clock. + * @arg RCC_APB2Periph_SPI1: SPI1 APB2 Clock. + * @arg RCC_APB2Periph_USART1: USART1 APB2 Clock. + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB2ENR |= RCC_APB2Periph; + } + else + { + RCC->APB2ENR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2: TIM2 clock + * @arg RCC_APB1Periph_TIM3: TIM3 clock + * @arg RCC_APB1Periph_TIM4: TIM4 clock + * @arg RCC_APB1Periph_TIM5: TIM5 clock + * @arg RCC_APB1Periph_TIM6: TIM6 clock + * @arg RCC_APB1Periph_TIM7: TIM7 clock + * @arg RCC_APB1Periph_LCD: LCD clock + * @arg RCC_APB1Periph_WWDG: WWDG clock + * @arg RCC_APB1Periph_SPI2: SPI2 clock + * @arg RCC_APB1Periph_SPI3: SPI3 clock + * @arg RCC_APB1Periph_USART2: USART2 clock + * @arg RCC_APB1Periph_USART3: USART3 clock + * @arg RCC_APB1Periph_UART4: UART4 clock + * @arg RCC_APB1Periph_UART5: UART5 clock + * @arg RCC_APB1Periph_I2C1: I2C1 clock + * @arg RCC_APB1Periph_I2C2: I2C2 clock + * @arg RCC_APB1Periph_USB: USB clock + * @arg RCC_APB1Periph_PWR: PWR clock + * @arg RCC_APB1Periph_DAC: DAC clock + * @arg RCC_APB1Periph_COMP COMP clock + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB1ENR |= RCC_APB1Periph; + } + else + { + RCC->APB1ENR &= ~RCC_APB1Periph; + } +} + +/** + * @brief Forces or releases AHB peripheral reset. + * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_GPIOA: GPIOA clock + * @arg RCC_AHBPeriph_GPIOB: GPIOB clock + * @arg RCC_AHBPeriph_GPIOC: GPIOC clock + * @arg RCC_AHBPeriph_GPIOD: GPIOD clock + * @arg RCC_AHBPeriph_GPIOE: GPIOE clock + * @arg RCC_AHBPeriph_GPIOH: GPIOH clock + * @arg RCC_AHBPeriph_GPIOF: GPIOF clock + * @arg RCC_AHBPeriph_GPIOG: GPIOG clock + * @arg RCC_AHBPeriph_CRC: CRC clock + * @arg RCC_AHBPeriph_FLITF: (has effect only when the Flash memory is in power down mode) + * @arg RCC_AHBPeriph_DMA1: DMA1 clock + * @arg RCC_AHBPeriph_DMA2: DMA2 clock + * @arg RCC_AHBPeriph_AES: AES clock + * @arg RCC_AHBPeriph_FSMC: FSMC clock + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock + * @arg RCC_APB2Periph_TIM9: TIM9 clock + * @arg RCC_APB2Periph_TIM10: TIM10 clock + * @arg RCC_APB2Periph_TIM11: TIM11 clock + * @arg RCC_APB2Periph_ADC1: ADC1 clock + * @arg RCC_APB2Periph_SDIO: SDIO clock + * @arg RCC_APB2Periph_SPI1: SPI1 clock + * @arg RCC_APB2Periph_USART1: USART1 clock + * @param NewState: new state of the specified peripheral reset. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB2RSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2RSTR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2: TIM2 clock + * @arg RCC_APB1Periph_TIM3: TIM3 clock + * @arg RCC_APB1Periph_TIM4: TIM4 clock + * @arg RCC_APB1Periph_TIM5: TIM5 clock + * @arg RCC_APB1Periph_TIM6: TIM6 clock + * @arg RCC_APB1Periph_TIM7: TIM7 clock + * @arg RCC_APB1Periph_LCD: LCD clock + * @arg RCC_APB1Periph_WWDG: WWDG clock + * @arg RCC_APB1Periph_SPI2: SPI2 clock + * @arg RCC_APB1Periph_SPI3: SPI3 clock + * @arg RCC_APB1Periph_USART2: USART2 clock + * @arg RCC_APB1Periph_USART3: USART3 clock + * @arg RCC_APB1Periph_UART4: UART4 clock + * @arg RCC_APB1Periph_UART5: UART5 clock + * @arg RCC_APB1Periph_I2C1: I2C1 clock + * @arg RCC_APB1Periph_I2C2: I2C2 clock + * @arg RCC_APB1Periph_USB: USB clock + * @arg RCC_APB1Periph_PWR: PWR clock + * @arg RCC_APB1Periph_DAC: DAC clock + * @arg RCC_APB1Periph_COMP + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB1RSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1RSTR &= ~RCC_APB1Periph; + } +} + +/** + * @brief Enables or disables the AHB peripheral clock during SLEEP mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * - After wakeup from SLEEP mode, the peripheral clock is enabled again. + * - By default, all peripheral clocks are enabled during SLEEP mode. + * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_AHBPeriph_GPIOA: GPIOA clock + * @arg RCC_AHBPeriph_GPIOB: GPIOB clock + * @arg RCC_AHBPeriph_GPIOC: GPIOC clock + * @arg RCC_AHBPeriph_GPIOD: GPIOD clock + * @arg RCC_AHBPeriph_GPIOE: GPIOE clock + * @arg RCC_AHBPeriph_GPIOH: GPIOH clock + * @arg RCC_AHBPeriph_GPIOF: GPIOF clock + * @arg RCC_AHBPeriph_GPIOG: GPIOG clock + * @arg RCC_AHBPeriph_CRC: CRC clock + * @arg RCC_AHBPeriph_FLITF: (has effect only when the Flash memory is in power down mode) + * @arg RCC_AHBPeriph_SRAM: SRAM clock + * @arg RCC_AHBPeriph_DMA1: DMA1 clock + * @arg RCC_AHBPeriph_DMA2: DMA2 clock + * @arg RCC_AHBPeriph_AES: AES clock + * @arg RCC_AHBPeriph_FSMC: FSMC clock + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_AHBPeriphClockLPModeCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_AHB_LPMODE_PERIPH(RCC_AHBPeriph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->AHBLPENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBLPENR &= ~RCC_AHBPeriph; + } +} + +/** + * @brief Enables or disables the APB2 peripheral clock during SLEEP mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock + * @arg RCC_APB2Periph_TIM9: TIM9 clock + * @arg RCC_APB2Periph_TIM10: TIM10 clock + * @arg RCC_APB2Periph_TIM11: TIM11 clock + * @arg RCC_APB2Periph_ADC1: ADC1 clock + * @arg RCC_APB2Periph_SDIO: SDIO clock + * @arg RCC_APB2Periph_SPI1: SPI1 clock + * @arg RCC_APB2Periph_USART1: USART1 clock + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB2PeriphClockLPModeCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB2LPENR |= RCC_APB2Periph; + } + else + { + RCC->APB2LPENR &= ~RCC_APB2Periph; + } +} + +/** + * @brief Enables or disables the APB1 peripheral clock during SLEEP mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. + * This parameter can be any combination of the following values: + * @arg RCC_APB1Periph_TIM2: TIM2 clock + * @arg RCC_APB1Periph_TIM3: TIM3 clock + * @arg RCC_APB1Periph_TIM4: TIM4 clock + * @arg RCC_APB1Periph_TIM5: TIM5 clock + * @arg RCC_APB1Periph_TIM6: TIM6 clock + * @arg RCC_APB1Periph_TIM7: TIM7 clock + * @arg RCC_APB1Periph_LCD: LCD clock + * @arg RCC_APB1Periph_WWDG: WWDG clock + * @arg RCC_APB1Periph_SPI2: SPI2 clock + * @arg RCC_APB1Periph_SPI3: SPI3 clock + * @arg RCC_APB1Periph_USART2: USART2 clock + * @arg RCC_APB1Periph_USART3: USART3 clock + * @arg RCC_APB1Periph_UART4: UART4 clock + * @arg RCC_APB1Periph_UART5: UART5 clock + * @arg RCC_APB1Periph_I2C1: I2C1 clock + * @arg RCC_APB1Periph_I2C2: I2C2 clock + * @arg RCC_APB1Periph_USB: USB clock + * @arg RCC_APB1Periph_PWR: PWR clock + * @arg RCC_APB1Periph_DAC: DAC clock + * @arg RCC_APB1Periph_COMP: COMP clock + * @param NewState: new state + * @param NewState: new state of the specified peripheral clock. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_APB1PeriphClockLPModeCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + RCC->APB1LPENR |= RCC_APB1Periph; + } + else + { + RCC->APB1LPENR &= ~RCC_APB1Periph; + } +} + +/** + * @} + */ + +/** @defgroup RCC_Group4 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified RCC interrupts. + * @note The CSS interrupt doesn't have an enable bit; once the CSS is enabled + * and if the HSE clock fails, the CSS interrupt occurs and an NMI is + * automatically generated. The NMI will be executed indefinitely, and + * since NMI has higher priority than any other IRQ (and main program) + * the application will be stacked in the NMI ISR unless the CSS interrupt + * pending bit is cleared. + * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_MSIRDY: MSI ready interrupt + * @arg RCC_IT_LSECSS: LSE CSS interrupt + * @param NewState: new state of the specified RCC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(RCC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Perform Byte access to RCC_CIR[12:8] bits to enable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + /* Perform Byte access to RCC_CIR[12:8] bits to disable the selected interrupts */ + *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +/** + * @brief Checks whether the specified RCC flag is set or not. + * @param RCC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready + * @arg RCC_FLAG_MSIRDY: MSI oscillator clock ready + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready + * @arg RCC_FLAG_PLLRDY: PLL clock ready + * @arg RCC_FLAG_LSECSS: LSE oscillator clock CSS detected + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready + * @arg RCC_FLAG_OBLRST: Option Byte Loader (OBL) reset + * @arg RCC_FLAG_PINRST: Pin reset + * @arg RCC_FLAG_PORRST: POR/PDR reset + * @arg RCC_FLAG_SFTRST: Software reset + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset + * @arg RCC_FLAG_LPWRRST: Low Power reset + * @retval The new state of RCC_FLAG (SET or RESET). + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_FLAG(RCC_FLAG)); + + /* Get the RCC register index */ + tmp = RCC_FLAG >> 5; + + if (tmp == 1) /* The flag to check is in CR register */ + { + statusreg = RCC->CR; + } + else /* The flag to check is in CSR register (tmp == 2) */ + { + statusreg = RCC->CSR; + } + + /* Get the flag position */ + tmp = RCC_FLAG & FLAG_MASK; + + if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the RCC reset flags. + * The reset flags are: RCC_FLAG_OBLRST, RCC_FLAG_PINRST, RCC_FLAG_PORRST, + * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST. + * @param None + * @retval None + */ +void RCC_ClearFlag(void) +{ + /* Set RMVF bit to clear the reset flags */ + RCC->CSR |= RCC_CSR_RMVF; +} + +/** + * @brief Checks whether the specified RCC interrupt has occurred or not. + * @param RCC_IT: specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_MSIRDY: MSI ready interrupt + * @arg RCC_IT_LSECSS: LSE CSS interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval The new state of RCC_IT (SET or RESET). + */ +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_RCC_GET_IT(RCC_IT)); + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the RCC_IT status */ + return bitstatus; +} + +/** + * @brief Clears the RCC's interrupt pending bits. + * @param RCC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt + * @arg RCC_IT_LSERDY: LSE ready interrupt + * @arg RCC_IT_HSIRDY: HSI ready interrupt + * @arg RCC_IT_HSERDY: HSE ready interrupt + * @arg RCC_IT_PLLRDY: PLL ready interrupt + * @arg RCC_IT_MSIRDY: MSI ready interrupt + * @arg RCC_IT_LSECSS: LSE CSS interrupt + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval None + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_CLEAR_IT(RCC_IT)); + + /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt + pending bits */ + *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rtc.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rtc.c new file mode 100644 index 0000000..d853c3a --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rtc.c @@ -0,0 +1,2675 @@ +/** + ****************************************************************************** + * @file stm32l1xx_rtc.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Real-Time Clock (RTC) peripheral: + * + Initialization + * + Calendar (Time and Date) configuration + * + Alarms (Alarm A and Alarm B) configuration + * + WakeUp Timer configuration + * + Daylight Saving configuration + * + Output pin Configuration + * + Coarse digital Calibration configuration + * + Smooth digital Calibration configuration + * + TimeStamp configuration + * + Tampers configuration + * + Backup Data Registers configuration + * + Output Type Config configuration + * + Shift control synchronisation + * + Interrupts and flags management + * + @verbatim + + =============================================================================== + ##### RTC Domain Reset ##### + =============================================================================== + [..] After power-on reset, the RTC domain (RTC clock source configuration, + RTC registers and RTC Backup data registers) is reset. You can also + reset this domain by software using the RCC_RTCResetCmd() function. + + ##### RTC Operating Condition ##### + =============================================================================== + [..] As long as the supply voltage remains in the operating range, + the RTC never stops, regardless of the device status (Run mode, + low power modes or under reset). + + ##### RTC Domain Access ##### + =============================================================================== + [..] After reset, the RTC domain (RTC clock source configuration, + RTC registers and RTC Backup data registers) are protected against + possible stray write accesses. + [..] To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + RCC_APB1PeriphClockCmd() function. + (+) Enable access to RTC domain using the PWR_RTCAccessCmd() function. + (+) Select the RTC clock source using the RCC_RTCCLKConfig() function. + (+) Enable RTC Clock using the RCC_RTCCLKCmd() function. + + ##### How to use this driver ##### + =============================================================================== + [..] + (+) Enable the RTC domain access (see description in the section above) + (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and + RTC hour format using the RTC_Init() function. + ***Time and Date configuration *** + ================================== + [..] + (+) To configure the RTC Calendar (Time and Date) use the RTC_SetTime() + and RTC_SetDate() functions. + (+) To read the RTC Calendar, use the RTC_GetTime() and RTC_GetDate() + functions. + (+) To read the RTC subsecond, use the RTC_GetSubSecond() function. + (+) Use the RTC_DayLightSavingConfig() function to add or sub one + hour to the RTC Calendar. + + ***Alarm configuration *** + ========================== + [..] + (+) To configure the RTC Alarm use the RTC_SetAlarm() function. + (+) Enable the selected RTC Alarm using the RTC_AlarmCmd() function + (+) To read the RTC Alarm, use the RTC_GetAlarm() function. + (+) To read the RTC alarm SubSecond, use the RTC_GetAlarmSubSecond() function. + + ***RTC Wakeup configuration *** + =============================== + [..] + (+) Configure the RTC Wakeup Clock source use the RTC_WakeUpClockConfig() + function. + (+) Configure the RTC WakeUp Counter using the RTC_SetWakeUpCounter() + function. + (+) Enable the RTC WakeUp using the RTC_WakeUpCmd() function + (+) To read the RTC WakeUp Counter register, use the RTC_GetWakeUpCounter() + function. + + ***Outputs configuration *** + ============================ + [..] The RTC has 2 different outputs: + (+) AFO_ALARM: this output is used to manage the RTC Alarm A, Alarm B + and WaKeUp signals. + To output the selected RTC signal on RTC_AF1 pin, use the + RTC_OutputConfig() function. + (+) AFO_CALIB: this output is 512Hz signal or 1Hz. + To output the RTC Clock on RTC_AF1 pin, use the RTC_CalibOutputCmd() + function. + + ***Smooth digital Calibration configuration *** + =============================================== + [..] + (+) Configure the RTC Original Digital Calibration Value and the corresponding + calibration cycle period (32s,16s and 8s) using the RTC_SmoothCalibConfig() + function. + + ***Coarse digital Calibration configuration *** + =============================================== + [..] + (+) Configure the RTC Coarse Calibration Value and the corresponding + sign using the RTC_CoarseCalibConfig() function. + (+) Enable the RTC Coarse Calibration using the RTC_CoarseCalibCmd() + function. + + ***TimeStamp configuration *** + ============================== + [..] + (+) Configure the RTC_AF1 trigger and enables the RTC TimeStamp + using the RTC_TimeStampCmd() function. + (+) To read the RTC TimeStamp Time and Date register, use the + RTC_GetTimeStamp() function. + (+) To read the RTC TimeStamp SubSecond register, use the + RTC_GetTimeStampSubSecond() function. + + ***Tamper configuration *** + =========================== + [..] + (+) Configure the Tamper filter count using RTC_TamperFilterConfig() + function. + (+) Configure the RTC Tamper trigger Edge or Level according to the Tamper + filter (if equal to 0 Edge else Level) value using the RTC_TamperConfig() + function. + (+) Configure the Tamper sampling frequency using RTC_TamperSamplingFreqConfig() + function. + (+) Configure the Tamper precharge or discharge duration using + RTC_TamperPinsPrechargeDuration() function. + (+) Enable the Tamper Pull-UP using RTC_TamperPullUpDisableCmd() function. + (+) Enable the RTC Tamper using the RTC_TamperCmd() function. + (+) Enable the Time stamp on Tamper detection event using + RTC_TSOnTamperDetecCmd() function. + + ***Backup Data Registers configuration *** + ========================================== + [..] + (+) To write to the RTC Backup Data registers, use the RTC_WriteBackupRegister() + function. + (+) To read the RTC Backup Data registers, use the RTC_ReadBackupRegister() + function. + + ##### RTC and low power modes ##### + =============================================================================== + [..] The MCU can be woken up from a low power mode by an RTC alternate + function. + [..] The RTC alternate functions are the RTC alarms (Alarm A and Alarm B), + RTC wakeup, RTC tamper event detection and RTC time stamp event detection. + These RTC alternate functions can wake up the system from the Stop + and Standby lowpower modes. + The system can also wake up from low power modes without depending + on an external interrupt (Auto-wakeup mode), by using the RTC alarm + or the RTC wakeup events. + [..] The RTC provides a programmable time base for waking up from the + Stop or Standby mode at regular intervals. + Wakeup from STOP and Standby modes is possible only when the RTC + clock source is LSE or LSI. + + ##### Selection of RTC_AF1 alternate functions ##### + =============================================================================== + [..] The RTC_AF1 pin (PC13) can be used for the following purposes: + (+) Wakeup pin 2 (WKUP2) using the PWR_WakeUpPinCmd() function. + (+) AFO_ALARM output. + (+) AFO_CALIB output. + (+) AFI_TAMPER. + (+) AFI_TIMESTAMP. + + +------------------------------------------------------------------------------------------+ + | Pin |AFO_ALARM |AFO_CALIB |AFI_TAMPER |AFI_TIMESTAMP | WKUP2 |ALARMOUTTYPE | + | configuration | ENABLED | ENABLED | ENABLED | ENABLED |ENABLED | AFO_ALARM | + | and function | | | | | |Configuration | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | Alarm out | | | | | Don't | | + | output OD | 1 | 0 |Don't care | Don't care | care | 0 | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | Alarm out | | | | | Don't | | + | output PP | 1 | 0 |Don't care | Don't care | care | 1 | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | Calibration out | | | | | Don't | | + | output PP | 0 | 1 |Don't care | Don't care | care | Don't care | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | TAMPER input | | | | | Don't | | + | floating | 0 | 0 | 1 | 0 | care | Don't care | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | TIMESTAMP and | | | | | Don't | | + | TAMPER input | 0 | 0 | 1 | 1 | care | Don't care | + | floating | | | | | | | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | TIMESTAMP input | | | | | Don't | | + | floating | 0 | 0 | 0 | 1 | care | Don't care | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | Wakeup Pin 2 | 0 | 0 | 0 | 0 | 1 | Don't care | + |-----------------|----------|----------|-----------|--------------|--------|--------------| + | Standard GPIO | 0 | 0 | 0 | 0 | 0 | Don't care | + +------------------------------------------------------------------------------------------+ + + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_rtc.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup RTC + * @brief RTC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* Masks Definition */ +#define RTC_TR_RESERVED_MASK ((uint32_t)0x007F7F7F) +#define RTC_DR_RESERVED_MASK ((uint32_t)0x00FFFF3F) +#define RTC_INIT_MASK ((uint32_t)0xFFFFFFFF) +#define RTC_RSF_MASK ((uint32_t)0xFFFFFF5F) +#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 | \ + RTC_FLAG_ALRBWF | RTC_FLAG_ALRAWF | RTC_FLAG_TAMP1F | \ + RTC_FLAG_TAMP2F | RTC_FLAG_TAMP3F | RTC_FLAG_RECALPF | \ + RTC_FLAG_SHPF)) + +#define INITMODE_TIMEOUT ((uint32_t) 0x00002000) +#define SYNCHRO_TIMEOUT ((uint32_t) 0x00008000) +#define RECALPF_TIMEOUT ((uint32_t) 0x00001000) +#define SHPF_TIMEOUT ((uint32_t) 0x00002000) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static uint8_t RTC_ByteToBcd2(uint8_t Value); +static uint8_t RTC_Bcd2ToByte(uint8_t Value); + +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RTC_Private_Functions + * @{ + */ + +/** @defgroup RTC_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to initialize and configure the + RTC Prescaler (Synchronous and Asynchronous), RTC Hour format, disable + RTC registers Write protection, enter and exit the RTC initialization mode, + RTC registers synchronization check and reference clock detection enable. + (#) The RTC Prescaler is programmed to generate the RTC 1Hz time base. + It is split into 2 programmable prescalers to minimize power consumption. + (++) A 7-bit asynchronous prescaler and A 13-bit synchronous prescaler. + (++) When both prescalers are used, it is recommended to configure the + asynchronous prescaler to a high value to minimize consumption. + (#) All RTC registers are Write protected. Writing to the RTC registers + is enabled by writing a key into the Write Protection register, RTC_WPR. + (#) To Configure the RTC Calendar, user application should enter + initialization mode. In this mode, the calendar counter is stopped + and its value can be updated. When the initialization sequence is + complete, the calendar restarts counting after 4 RTCCLK cycles. + (#) 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.The RTC_WaitForSynchro() function + implements the above software sequence (RSF clear and RSF check). + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the RTC registers to their default reset values. + * @note This function doesn't reset the RTC Clock source and RTC Backup Data + * registers. + * @param None + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are deinitialized + * - ERROR: RTC registers are not deinitialized + */ +ErrorStatus RTC_DeInit(void) +{ + __IO uint32_t wutcounter = 0x00; + uint32_t wutwfstatus = 0x00; + ErrorStatus status = ERROR; + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Reset TR, DR and CR registers */ + RTC->TR = (uint32_t)0x00000000; + RTC->DR = (uint32_t)0x00002101; + + /* Reset All CR bits except CR[2:0] */ + RTC->CR &= (uint32_t)0x00000007; + + /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ + do + { + wutwfstatus = RTC->ISR & RTC_ISR_WUTWF; + wutcounter++; + } while((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); + + if ((RTC->ISR & RTC_ISR_WUTWF) == RESET) + { + status = ERROR; + } + else + { + /* Reset all RTC CR register bits */ + RTC->CR &= (uint32_t)0x00000000; + RTC->WUTR = (uint32_t)0x0000FFFF; + RTC->PRER = (uint32_t)0x007F00FF; + RTC->CALIBR = (uint32_t)0x00000000; + RTC->ALRMAR = (uint32_t)0x00000000; + RTC->ALRMBR = (uint32_t)0x00000000; + RTC->SHIFTR = (uint32_t)0x00000000; + RTC->CALR = (uint32_t)0x00000000; + RTC->ALRMASSR = (uint32_t)0x00000000; + RTC->ALRMBSSR = (uint32_t)0x00000000; + + /* Reset ISR register and exit initialization mode */ + RTC->ISR = (uint32_t)0x00000000; + + /* Reset Tamper and alternate functions configuration register */ + RTC->TAFCR = 0x00000000; + + /* Wait till the RTC RSF flag is set */ + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Initializes the RTC registers according to the specified parameters + * in RTC_InitStruct. + * @param RTC_InitStruct: pointer to a 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 RTC_Init(RTC_InitTypeDef* RTC_InitStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat)); + assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv)); + assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Clear RTC CR FMT Bit */ + RTC->CR &= ((uint32_t)~(RTC_CR_FMT)); + /* Set RTC_CR register */ + RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat)); + + /* Configure the RTC PRER */ + RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv); + RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Fills each RTC_InitStruct member with its default value. + * @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure which will be + * initialized. + * @retval None + */ +void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct) +{ + /* Initialize the RTC_HourFormat member */ + RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24; + + /* Initialize the RTC_AsynchPrediv member */ + RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F; + + /* Initialize the RTC_SynchPrediv member */ + RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF; +} + +/** + * @brief Enables or disables the RTC registers write protection. + * @note All the RTC registers are write protected except for RTC_ISR[13:8], + * RTC_TAFCR and RTC_BKPxR. + * @note Writing a wrong key reactivates the write protection. + * @note The protection mechanism is not affected by system reset. + * @param NewState: new state of the write protection. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_WriteProtectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + } + else + { + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + } +} + +/** + * @brief Enters the RTC Initialization mode. + * @note The RTC Initialization mode is write protected, use the + * RTC_WriteProtectionCmd(DISABLE) before calling this function. + * @param None + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC is in Init mode + * - ERROR: RTC is not in Init mode + */ +ErrorStatus RTC_EnterInitMode(void) +{ + __IO uint32_t initcounter = 0x00; + ErrorStatus status = ERROR; + uint32_t initstatus = 0x00; + + /* Check if the Initialization mode is set */ + if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET) + { + /* Set the Initialization mode */ + RTC->ISR = (uint32_t)RTC_INIT_MASK; + + /* Wait till RTC is in INIT state and if Time out is reached exit */ + do + { + initstatus = RTC->ISR & RTC_ISR_INITF; + initcounter++; + } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00)); + + if ((RTC->ISR & RTC_ISR_INITF) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + } + else + { + status = SUCCESS; + } + + return (status); +} + +/** + * @brief Exits 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 + * RTC_WriteProtectionCmd(DISABLE) before calling this function. + * @param None + * @retval None + */ +void RTC_ExitInitMode(void) +{ + /* Exit Initialization mode */ + RTC->ISR &= (uint32_t)~RTC_ISR_INIT; +} + +/** + * @brief Waits until the RTC Time and Date registers (RTC_TR and RTC_DR) are + * synchronized with RTC APB clock. + * @note The RTC Resynchronization mode is write protected, use the + * RTC_WriteProtectionCmd(DISABLE) 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 None + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are synchronised + * - ERROR: RTC registers are not synchronised + */ +ErrorStatus RTC_WaitForSynchro(void) +{ + __IO uint32_t synchrocounter = 0; + ErrorStatus status = ERROR; + uint32_t synchrostatus = 0x00; + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Clear RSF flag */ + RTC->ISR &= (uint32_t)RTC_RSF_MASK; + + /* Wait the registers to be synchronised */ + do + { + synchrostatus = RTC->ISR & RTC_ISR_RSF; + synchrocounter++; + } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00)); + + if ((RTC->ISR & RTC_ISR_RSF) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return (status); +} + +/** + * @brief Enables or disables the RTC reference clock detection. + * @param NewState: new state of the RTC reference clock. + * This parameter can be: ENABLE or DISABLE. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC reference clock detection is enabled + * - ERROR: RTC reference clock detection is disabled + */ +ErrorStatus RTC_RefClockCmd(FunctionalState NewState) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + if (NewState != DISABLE) + { + /* Enable the RTC reference clock detection */ + RTC->CR |= RTC_CR_REFCKON; + } + else + { + /* Disable the RTC reference clock detection */ + RTC->CR &= ~RTC_CR_REFCKON; + } + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Enables or Disables the Bypass Shadow feature. + * @note When the Bypass Shadow is enabled the calendar value are taken + * directly from the Calendar counter. + * @param NewState: new state of the Bypass Shadow feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None +*/ +void RTC_BypassShadowCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + if (NewState != DISABLE) + { + /* Set the BYPSHAD bit */ + RTC->CR |= (uint8_t)RTC_CR_BYPSHAD; + } + else + { + /* Reset the BYPSHAD bit */ + RTC->CR &= (uint8_t)~RTC_CR_BYPSHAD; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @} + */ + +/** @defgroup RTC_Group2 Time and Date configuration functions + * @brief Time and Date configuration functions + * +@verbatim + =============================================================================== + ##### Time and Date configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to program and read the RTC + Calendar (Time and Date). + +@endverbatim + * @{ + */ + +/** + * @brief Set the RTC current time. + * @param RTC_Format: specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @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 RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) +{ + uint32_t tmpreg = 0; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + + if (RTC_Format == RTC_Format_BIN) + { + if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) + { + assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours)); + assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); + } + else + { + RTC_TimeStruct->RTC_H12 = 0x00; + assert_param(IS_RTC_HOUR24(RTC_TimeStruct->RTC_Hours)); + } + assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes)); + assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds)); + } + else + { + if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) + { + tmpreg = RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); + assert_param(IS_RTC_HOUR12(tmpreg)); + assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); + } + else + { + RTC_TimeStruct->RTC_H12 = 0x00; + assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours))); + } + assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes))); + assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds))); + } + + /* Check the input parameters format */ + if (RTC_Format != RTC_Format_BIN) + { + tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \ + ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \ + ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \ + ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16)); + } + else + { + tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \ + (((uint32_t)RTC_TimeStruct->RTC_H12) << 16)); + } + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Set the RTC_TR register */ + RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if ((RTC->CR & RTC_CR_BYPSHAD) == RESET) + { + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = SUCCESS; + } + + } + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Fills each RTC_TimeStruct member with its default value + * (Time = 00h:00min:00sec). + * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure which will be + * initialized. + * @retval None + */ +void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct) +{ + /* Time = 00h:00min:00sec */ + RTC_TimeStruct->RTC_H12 = RTC_H12_AM; + RTC_TimeStruct->RTC_Hours = 0; + RTC_TimeStruct->RTC_Minutes = 0; + RTC_TimeStruct->RTC_Seconds = 0; +} + +/** + * @brief Get the RTC current Time. + * @param RTC_Format: specifies the format of the returned parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will + * contain the returned current time configuration. + * @retval None + */ +void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + + /* Get the RTC_TR register */ + tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); + RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); + RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); + RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); + + /* Check the input parameters format */ + if (RTC_Format == RTC_Format_BIN) + { + /* Convert the structure parameters to Binary format */ + RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); + RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes); + RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds); + } +} + +/** + * @brief Gets the RTC current Calendar Subseconds value. + * @note This function freeze the Time and Date registers after reading the + * SSR register. + * @param None + * @retval RTC current Calendar Subseconds value. + */ +uint32_t RTC_GetSubSecond(void) +{ + uint32_t tmpreg = 0; + + /* Get subseconds values from the correspondent registers*/ + tmpreg = (uint32_t)(RTC->SSR); + + /* Read DR register to unfroze calendar registers */ + (void) (RTC->DR); + + return (tmpreg); +} + +/** + * @brief Set the RTC current date. + * @param RTC_Format: specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @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 Date register is configured + * - ERROR: RTC Date register is not configured + */ +ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) +{ + uint32_t tmpreg = 0; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + + if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10)) + { + RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A; + } + if (RTC_Format == RTC_Format_BIN) + { + assert_param(IS_RTC_YEAR(RTC_DateStruct->RTC_Year)); + assert_param(IS_RTC_MONTH(RTC_DateStruct->RTC_Month)); + assert_param(IS_RTC_DATE(RTC_DateStruct->RTC_Date)); + } + else + { + assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year))); + tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); + assert_param(IS_RTC_MONTH(tmpreg)); + tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); + assert_param(IS_RTC_DATE(tmpreg)); + } + assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay)); + + /* Check the input parameters format */ + if (RTC_Format != RTC_Format_BIN) + { + tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \ + (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \ + ((uint32_t)RTC_DateStruct->RTC_Date) | \ + (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13)); + } + else + { + tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \ + ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13)); + } + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Set the RTC_DR register */ + RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if ((RTC->CR & RTC_CR_BYPSHAD) == RESET) + { + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = SUCCESS; + } + } + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Fills each RTC_DateStruct member with its default value + * (Monday, January 01 xx00). + * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure which will be + * initialized. + * @retval None + */ +void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct) +{ + /* Monday, January 01 xx00 */ + RTC_DateStruct->RTC_WeekDay = RTC_Weekday_Monday; + RTC_DateStruct->RTC_Date = 1; + RTC_DateStruct->RTC_Month = RTC_Month_January; + RTC_DateStruct->RTC_Year = 0; +} + +/** + * @brief Get the RTC current date. + * @param RTC_Format: specifies the format of the returned parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will + * contain the returned current date configuration. + * @retval None + */ +void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + + /* Get the RTC_TR register */ + tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); + RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); + RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU)); + RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13); + + /* Check the input parameters format */ + if (RTC_Format == RTC_Format_BIN) + { + /* Convert the structure parameters to Binary format */ + RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year); + RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); + RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); + } +} + +/** + * @} + */ + +/** @defgroup RTC_Group3 Alarms configuration functions + * @brief Alarms (Alarm A and Alarm B) configuration functions + * +@verbatim + =============================================================================== + ##### Alarms (Alarm A and Alarm B) configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to program and read the RTC + Alarms. + +@endverbatim + * @{ + */ + +/** + * @brief Set the specified RTC Alarm. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (Use the RTC_AlarmCmd(DISABLE)). + * @param RTC_Format: specifies the format of the returned parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @param RTC_Alarm: specifies the alarm to be configured. + * This parameter can be one of the following values: + * @arg RTC_Alarm_A: to select Alarm A. + * @arg RTC_Alarm_B: to select Alarm B. + * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that + * contains the alarm configuration parameters. + * @retval None + */ +void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + assert_param(IS_RTC_ALARM(RTC_Alarm)); + assert_param(IS_ALARM_MASK(RTC_AlarmStruct->RTC_AlarmMask)); + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel)); + + if (RTC_Format == RTC_Format_BIN) + { + if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) + { + assert_param(IS_RTC_HOUR12(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); + assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); + } + else + { + RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; + assert_param(IS_RTC_HOUR24(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); + } + assert_param(IS_RTC_MINUTES(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes)); + assert_param(IS_RTC_SECONDS(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)); + + if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); + } + else + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); + } + } + else + { + if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) + { + tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours); + assert_param(IS_RTC_HOUR12(tmpreg)); + assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); + } + else + { + RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; + assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours))); + } + + assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes))); + assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds))); + + if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) + { + tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(tmpreg)); + } + else + { + tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(tmpreg)); + } + } + + /* Check the input parameters format */ + if (RTC_Format != RTC_Format_BIN) + { + tmpreg = (((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ + ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ + ((uint32_t)RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds) | \ + ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ + ((uint32_t)(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ + ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ + ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); + } + else + { + tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)) | \ + ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ + ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ + ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ + ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); + } + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Configure the Alarm register */ + if (RTC_Alarm == RTC_Alarm_A) + { + RTC->ALRMAR = (uint32_t)tmpreg; + } + else + { + RTC->ALRMBR = (uint32_t)tmpreg; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Fills each RTC_AlarmStruct member with its default value + * (Time = 00h:00mn:00sec / Date = 1st day of the month/Mask = + * all fields are masked). + * @param RTC_AlarmStruct: pointer to a @ref RTC_AlarmTypeDef structure which + * will be initialized. + * @retval None + */ +void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = RTC_H12_AM; + RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = 0; + RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = 0; + RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = 0; + + /* Alarm Date Settings : Date = 1st day of the month */ + RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; + RTC_AlarmStruct->RTC_AlarmDateWeekDay = 1; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->RTC_AlarmMask = RTC_AlarmMask_None; +} + +/** + * @brief Get the RTC Alarm value and masks. + * @param RTC_Format: specifies the format of the output parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format. + * @arg RTC_Format_BCD: BCD data format. + * @param RTC_Alarm: specifies the alarm to be read. + * This parameter can be one of the following values: + * @arg RTC_Alarm_A: to select Alarm A. + * @arg RTC_Alarm_B: to select Alarm B. + * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that will + * contains the output alarm configuration values. + * @retval None + */ +void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + assert_param(IS_RTC_ALARM(RTC_Alarm)); + + /* Get the RTC_ALRMxR register */ + if (RTC_Alarm == RTC_Alarm_A) + { + tmpreg = (uint32_t)(RTC->ALRMAR); + } + else + { + tmpreg = (uint32_t)(RTC->ALRMBR); + } + + /* Fill the structure with the read parameters */ + RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = (uint32_t)((tmpreg & (RTC_ALRMAR_HT | \ + RTC_ALRMAR_HU)) >> 16); + RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = (uint32_t)((tmpreg & (RTC_ALRMAR_MNT | \ + RTC_ALRMAR_MNU)) >> 8); + RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = (uint32_t)(tmpreg & (RTC_ALRMAR_ST | \ + RTC_ALRMAR_SU)); + RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = (uint32_t)((tmpreg & RTC_ALRMAR_PM) >> 16); + RTC_AlarmStruct->RTC_AlarmDateWeekDay = (uint32_t)((tmpreg & (RTC_ALRMAR_DT | RTC_ALRMAR_DU)) >> 24); + RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMAR_WDSEL); + RTC_AlarmStruct->RTC_AlarmMask = (uint32_t)(tmpreg & RTC_AlarmMask_All); + + if (RTC_Format == RTC_Format_BIN) + { + RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ + RTC_AlarmTime.RTC_Hours); + RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ + RTC_AlarmTime.RTC_Minutes); + RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ + RTC_AlarmTime.RTC_Seconds); + RTC_AlarmStruct->RTC_AlarmDateWeekDay = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); + } +} + +/** + * @brief Enables or disables the specified RTC Alarm. + * @param RTC_Alarm: specifies the alarm to be configured. + * This parameter can be any combination of the following values: + * @arg RTC_Alarm_A: to select Alarm A. + * @arg RTC_Alarm_B: to select Alarm B. + * @param NewState: new state of the specified alarm. + * This parameter can be: ENABLE or DISABLE. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Alarm is enabled/disabled + * - ERROR: RTC Alarm is not enabled/disabled + */ +ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState) +{ + __IO uint32_t alarmcounter = 0x00; + uint32_t alarmstatus = 0x00; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_CMD_ALARM(RTC_Alarm)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Configure the Alarm state */ + if (NewState != DISABLE) + { + RTC->CR |= (uint32_t)RTC_Alarm; + + status = SUCCESS; + } + else + { + /* Disable the Alarm in RTC_CR register */ + RTC->CR &= (uint32_t)~RTC_Alarm; + + /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */ + do + { + alarmstatus = RTC->ISR & (RTC_Alarm >> 8); + alarmcounter++; + } while((alarmcounter != INITMODE_TIMEOUT) && (alarmstatus == 0x00)); + + if ((RTC->ISR & (RTC_Alarm >> 8)) == RESET) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Configure the RTC AlarmA/B Subseconds value and mask.* + * @note This function is performed only when the Alarm is disabled. + * @param RTC_Alarm: specifies the alarm to be configured. + * This parameter can be one of the following values: + * @arg RTC_Alarm_A: to select Alarm A. + * @arg RTC_Alarm_B: to select Alarm B. + * @param RTC_AlarmSubSecondValue: specifies the Subseconds value. + * This parameter can be a value from 0 to 0x00007FFF. + * @param RTC_AlarmSubSecondMask: specifies the Subseconds Mask. + * This parameter can be any combination of the following values: + * @arg RTC_AlarmSubSecondMask_All: All Alarm SS fields are masked. + * There is no comparison on sub seconds for Alarm. + * @arg RTC_AlarmSubSecondMask_SS14_1: SS[14:1] are don't care in Alarm comparison. + * Only SS[0] is compared + * @arg RTC_AlarmSubSecondMask_SS14_2: SS[14:2] are don't care in Alarm comparison. + * Only SS[1:0] are compared + * @arg RTC_AlarmSubSecondMask_SS14_3: SS[14:3] are don't care in Alarm comparison. + * Only SS[2:0] are compared + * @arg RTC_AlarmSubSecondMask_SS14_4: SS[14:4] are don't care in Alarm comparison. + * Only SS[3:0] are compared + * @arg RTC_AlarmSubSecondMask_SS14_5: SS[14:5] are don't care in Alarm comparison. + * Only SS[4:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_6: SS[14:6] are don't care in Alarm comparison. + * Only SS[5:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_7: SS[14:7] are don't care in Alarm comparison. + * Only SS[6:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_8: SS[14:8] are don't care in Alarm comparison. + * Only SS[7:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_9: SS[14:9] are don't care in Alarm comparison. + * Only SS[8:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_10: SS[14:10] are don't care in Alarm comparison. + * Only SS[9:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_11: SS[14:11] are don't care in Alarm comparison. + * Only SS[10:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_12: SS[14:12] are don't care in Alarm comparison. + * Only SS[11:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14_13: SS[14:13] are don't care in Alarm comparison. + * Only SS[12:0] are compared. + * @arg RTC_AlarmSubSecondMask_SS14: SS[14] is don't care in Alarm comparison. + * Only SS[13:0] are compared. + * @arg RTC_AlarmSubSecondMask_None: SS[14:0] are compared and must match + * to activate alarm. + * @retval None + */ +void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_ALARM(RTC_Alarm)); + assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(RTC_AlarmSubSecondValue)); + assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(RTC_AlarmSubSecondMask)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Configure the Alarm A or Alarm B SubSecond registers */ + tmpreg = (uint32_t) (uint32_t)(RTC_AlarmSubSecondValue) | (uint32_t)(RTC_AlarmSubSecondMask); + + if (RTC_Alarm == RTC_Alarm_A) + { + /* Configure the AlarmA SubSecond register */ + RTC->ALRMASSR = tmpreg; + } + else + { + /* Configure the Alarm B SubSecond register */ + RTC->ALRMBSSR = tmpreg; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + +} + +/** + * @brief Gets the RTC Alarm Subseconds value. + * @param RTC_Alarm: specifies the alarm to be read. + * This parameter can be one of the following values: + * @arg RTC_Alarm_A: to select Alarm A. + * @arg RTC_Alarm_B: to select Alarm B. + * @param None + * @retval RTC Alarm Subseconds value. + */ +uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm) +{ + uint32_t tmpreg = 0; + + /* Get the RTC_ALRMxR register */ + if (RTC_Alarm == RTC_Alarm_A) + { + tmpreg = (uint32_t)((RTC->ALRMASSR) & RTC_ALRMASSR_SS); + } + else + { + tmpreg = (uint32_t)((RTC->ALRMBSSR) & RTC_ALRMBSSR_SS); + } + + return (tmpreg); +} + +/** + * @} + */ + +/** @defgroup RTC_Group4 WakeUp Timer configuration functions + * @brief WakeUp Timer configuration functions + * +@verbatim + =============================================================================== + ##### WakeUp Timer configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to program and read the RTC WakeUp. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the RTC Wakeup clock source. + * @note The WakeUp Clock source can only be changed when the RTC WakeUp + * is disabled (Use the RTC_WakeUpCmd(DISABLE)). + * @param RTC_WakeUpClock: Wakeup Clock source. + * This parameter can be one of the following values: + * @arg RTC_WakeUpClock_RTCCLK_Div16: RTC Wakeup Counter Clock = RTCCLK/16. + * @arg RTC_WakeUpClock_RTCCLK_Div8: RTC Wakeup Counter Clock = RTCCLK/8. + * @arg RTC_WakeUpClock_RTCCLK_Div4: RTC Wakeup Counter Clock = RTCCLK/4. + * @arg RTC_WakeUpClock_RTCCLK_Div2: RTC Wakeup Counter Clock = RTCCLK/2. + * @arg RTC_WakeUpClock_CK_SPRE_16bits: RTC Wakeup Counter Clock = CK_SPRE. + * @arg RTC_WakeUpClock_CK_SPRE_17bits: RTC Wakeup Counter Clock = CK_SPRE. + * @retval None + */ +void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock) +{ + /* Check the parameters */ + assert_param(IS_RTC_WAKEUP_CLOCK(RTC_WakeUpClock)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Clear the Wakeup Timer clock source bits in CR register */ + RTC->CR &= (uint32_t)~RTC_CR_WUCKSEL; + + /* Configure the clock source */ + RTC->CR |= (uint32_t)RTC_WakeUpClock; + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Configures the RTC Wakeup counter. + * @note The RTC WakeUp counter can only be written when the RTC WakeUp. + * is disabled (Use the RTC_WakeUpCmd(DISABLE)). + * @param RTC_WakeUpCounter: specifies the WakeUp counter. + * This parameter can be a value from 0x0000 to 0xFFFF. + * @retval None + */ +void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter) +{ + /* Check the parameters */ + assert_param(IS_RTC_WAKEUP_COUNTER(RTC_WakeUpCounter)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Configure the Wakeup Timer counter */ + RTC->WUTR = (uint32_t)RTC_WakeUpCounter; + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Returns the RTC WakeUp timer counter value. + * @param None + * @retval The RTC WakeUp Counter value. + */ +uint32_t RTC_GetWakeUpCounter(void) +{ + /* Get the counter value */ + return ((uint32_t)(RTC->WUTR & RTC_WUTR_WUT)); +} + +/** + * @brief Enables or Disables the RTC WakeUp timer. + * @param NewState: new state of the WakeUp timer. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +ErrorStatus RTC_WakeUpCmd(FunctionalState NewState) +{ + __IO uint32_t wutcounter = 0x00; + uint32_t wutwfstatus = 0x00; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + if (NewState != DISABLE) + { + /* Enable the Wakeup Timer */ + RTC->CR |= (uint32_t)RTC_CR_WUTE; + status = SUCCESS; + } + else + { + /* Disable the Wakeup Timer */ + RTC->CR &= (uint32_t)~RTC_CR_WUTE; + /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ + do + { + wutwfstatus = RTC->ISR & RTC_ISR_WUTWF; + wutcounter++; + } while((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); + + if ((RTC->ISR & RTC_ISR_WUTWF) == RESET) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @} + */ + +/** @defgroup RTC_Group5 Daylight Saving configuration functions + * @brief Daylight Saving configuration functions + * +@verbatim + =============================================================================== + ##### Daylight Saving configuration functions ##### + =============================================================================== + [..] This section provide functions allowing to configure the RTC DayLight Saving. + +@endverbatim + * @{ + */ + +/** + * @brief Adds or substract one hour from the current time. + * @param RTC_DayLightSaveOperation: the value of hour adjustment. + * This parameter can be one of the following values: + * @arg RTC_DayLightSaving_SUB1H: Substract one hour (winter time). + * @arg RTC_DayLightSaving_ADD1H: Add one hour (summer time). + * @param RTC_StoreOperation: Specifies the value to be written in the BCK bit + * in CR register to store the operation. + * This parameter can be one of the following values: + * @arg RTC_StoreOperation_Reset: BCK Bit Reset. + * @arg RTC_StoreOperation_Set: BCK Bit Set. + * @retval None + */ +void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation) +{ + /* Check the parameters */ + assert_param(IS_RTC_DAYLIGHT_SAVING(RTC_DayLightSaving)); + assert_param(IS_RTC_STORE_OPERATION(RTC_StoreOperation)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Clear the bits to be configured */ + RTC->CR &= (uint32_t)~(RTC_CR_BCK); + + /* Configure the RTC_CR register */ + RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation); + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Returns the RTC Day Light Saving stored operation. + * @param None + * @retval RTC Day Light Saving stored operation. + * - RTC_StoreOperation_Reset + * - RTC_StoreOperation_Set + */ +uint32_t RTC_GetStoreOperation(void) +{ + return (RTC->CR & RTC_CR_BCK); +} + +/** + * @} + */ + +/** @defgroup RTC_Group6 Output pin Configuration function + * @brief Output pin Configuration function + * +@verbatim + =============================================================================== + ##### Output pin Configuration function ##### + =============================================================================== + [..] This section provide functions allowing to configure the RTC Output source. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the RTC output source (AFO_ALARM). + * @param RTC_Output: Specifies which signal will be routed to the RTC output. + * This parameter can be one of the following values: + * @arg RTC_Output_Disable: No output selected + * @arg RTC_Output_AlarmA: signal of AlarmA mapped to output. + * @arg RTC_Output_AlarmB: signal of AlarmB mapped to output. + * @arg RTC_Output_WakeUp: signal of WakeUp mapped to output. + * @param RTC_OutputPolarity: Specifies the polarity of the output signal. + * This parameter can be one of the following: + * @arg RTC_OutputPolarity_High: The output pin is high when the + * ALRAF/ALRBF/WUTF is high (depending on OSEL). + * @arg RTC_OutputPolarity_Low: The output pin is low when the + * ALRAF/ALRBF/WUTF is high (depending on OSEL). + * @retval None + */ +void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity) +{ + /* Check the parameters */ + assert_param(IS_RTC_OUTPUT(RTC_Output)); + assert_param(IS_RTC_OUTPUT_POL(RTC_OutputPolarity)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Clear the bits to be configured */ + RTC->CR &= (uint32_t)~(RTC_CR_OSEL | RTC_CR_POL); + + /* Configure the output selection and polarity */ + RTC->CR |= (uint32_t)(RTC_Output | RTC_OutputPolarity); + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @} + */ + +/** @defgroup RTC_Group7 Coarse and Smooth Calibrations configuration functions + * @brief Coarse and Smooth Calibrations configuration functions + * +@verbatim + =============================================================================== + ##### Coarse and Smooth Calibrations configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the Coarse Calibration parameters. + * @param RTC_CalibSign: specifies the sign of the calibration value. + * This parameter can be one of the following values: + * @arg RTC_CalibSign_Positive: The value sign is positive. + * @arg RTC_CalibSign_Negative: The value sign is negative. + * @param Value: value of calibration expressed in ppm (coded on 5 bits) + * This value should be between 0 and 63 when using negative sign + * with a 2-ppm step. + * This value should be between 0 and 126 when using positive sign + * with a 4-ppm step. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Coarse calibration are initialized + * - ERROR: RTC Coarse calibration are not initialized + */ +ErrorStatus RTC_CoarseCalibConfig(uint32_t RTC_CalibSign, uint32_t Value) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_CALIB_SIGN(RTC_CalibSign)); + assert_param(IS_RTC_CALIB_VALUE(Value)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Set the coarse calibration value */ + RTC->CALIBR = (uint32_t)(RTC_CalibSign | Value); + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** +* @brief Enables or disables the Coarse calibration process. + * @param NewState: new state of the Coarse calibration. + * This parameter can be: ENABLE or DISABLE. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Coarse calibration are enabled/disabled + * - ERROR: RTC Coarse calibration are not enabled/disabled + */ +ErrorStatus RTC_CoarseCalibCmd(FunctionalState NewState) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + if (NewState != DISABLE) + { + /* Enable the Coarse Calibration */ + RTC->CR |= (uint32_t)RTC_CR_DCE; + } + else + { + /* Disable the Coarse Calibration */ + RTC->CR &= (uint32_t)~RTC_CR_DCE; + } + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return status; +} + +/** + * @brief Enables or disables the RTC clock to be output through the relative + * pin. + * @param NewState: new state of the coarse calibration Output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_CalibOutputCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + if (NewState != DISABLE) + { + /* Enable the RTC clock output */ + RTC->CR |= (uint32_t)RTC_CR_COE; + } + else + { + /* Disable the RTC clock output */ + RTC->CR &= (uint32_t)~RTC_CR_COE; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). + * @param RTC_CalibOutput : Select the Calibration output Selection . + * This parameter can be one of the following values: + * @arg RTC_CalibOutput_512Hz: A signal has a regular waveform at 512Hz. + * @arg RTC_CalibOutput_1Hz: A signal has a regular waveform at 1Hz. + * @retval None +*/ +void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput) +{ + /* Check the parameters */ + assert_param(IS_RTC_CALIB_OUTPUT(RTC_CalibOutput)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /*clear flags before config*/ + RTC->CR &= (uint32_t)~(RTC_CR_COSEL); + + /* Configure the RTC_CR register */ + RTC->CR |= (uint32_t)RTC_CalibOutput; + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Configures the Smooth Calibration Settings. + * @param RTC_SmoothCalibPeriod: Select the Smooth Calibration Period. + * This parameter can be can be one of the following values: + * @arg RTC_SmoothCalibPeriod_32sec: The smooth calibration periode is 32s. + * @arg RTC_SmoothCalibPeriod_16sec: The smooth calibration periode is 16s. + * @arg RTC_SmoothCalibPeriod_8sec: The smooth calibartion periode is 8s. + * @param RTC_SmoothCalibPlusPulses: Select to Set or reset the CALP bit. + * This parameter can be one of the following values: + * @arg RTC_SmoothCalibPlusPulses_Set: Add one RTCCLK puls every 2**11 pulses. + * @arg RTC_SmoothCalibPlusPulses_Reset: No RTCCLK pulses are added. + * @param RTC_SmouthCalibMinusPulsesValue: Select the value of CALM[8:0] bits. + * This parameter can be one any value from 0 to 0x000001FF. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Calib registers are configured + * - ERROR: RTC Calib registers are not configured +*/ +ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, + uint32_t RTC_SmoothCalibPlusPulses, + uint32_t RTC_SmouthCalibMinusPulsesValue) +{ + ErrorStatus status = ERROR; + uint32_t recalpfcount = 0; + + /* Check the parameters */ + assert_param(IS_RTC_SMOOTH_CALIB_PERIOD(RTC_SmoothCalibPeriod)); + assert_param(IS_RTC_SMOOTH_CALIB_PLUS(RTC_SmoothCalibPlusPulses)); + assert_param(IS_RTC_SMOOTH_CALIB_MINUS(RTC_SmouthCalibMinusPulsesValue)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* check if a calibration is pending*/ + if ((RTC->ISR & RTC_ISR_RECALPF) != RESET) + { + /* wait until the Calibration is completed*/ + while (((RTC->ISR & RTC_ISR_RECALPF) != RESET) && (recalpfcount != RECALPF_TIMEOUT)) + { + recalpfcount++; + } + } + + /* check if the calibration pending is completed or if there is no calibration operation at all*/ + if ((RTC->ISR & RTC_ISR_RECALPF) == RESET) + { + /* Configure the Smooth calibration settings */ + RTC->CALR = (uint32_t)((uint32_t)RTC_SmoothCalibPeriod | (uint32_t)RTC_SmoothCalibPlusPulses | (uint32_t)RTC_SmouthCalibMinusPulsesValue); + + status = SUCCESS; + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return (ErrorStatus)(status); +} + +/** + * @} + */ + + +/** @defgroup RTC_Group8 TimeStamp configuration functions + * @brief TimeStamp configuration functions + * +@verbatim + =============================================================================== + ##### TimeStamp configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or Disables the RTC TimeStamp functionality with the + * specified time stamp pin stimulating edge. + * @param RTC_TimeStampEdge: Specifies the pin edge on which the TimeStamp is + * activated. + * This parameter can be one of the following: + * @arg RTC_TimeStampEdge_Rising: the Time stamp event occurs on the rising + * edge of the related pin. + * @arg RTC_TimeStampEdge_Falling: the Time stamp event occurs on the + * falling edge of the related pin. + * @param NewState: new state of the TimeStamp. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_TIMESTAMP_EDGE(RTC_TimeStampEdge)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Get the RTC_CR register and clear the bits to be configured */ + tmpreg = (uint32_t)(RTC->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); + + /* Get the new configuration */ + if (NewState != DISABLE) + { + tmpreg |= (uint32_t)(RTC_TimeStampEdge | RTC_CR_TSE); + } + else + { + tmpreg |= (uint32_t)(RTC_TimeStampEdge); + } + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Configure the Time Stamp TSEDGE and Enable bits */ + RTC->CR = (uint32_t)tmpreg; + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Get the RTC TimeStamp value and masks. + * @param RTC_Format: specifies the format of the output parameters. + * This parameter can be one of the following values: + * @arg RTC_Format_BIN: Binary data format + * @arg RTC_Format_BCD: BCD data format + * @param RTC_StampTimeStruct: pointer to a RTC_TimeTypeDef structure that will + * contains the TimeStamp time values. + * @param RTC_StampDateStruct: pointer to a RTC_DateTypeDef structure that will + * contains the TimeStamp date values. + * @retval None + */ +void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, + RTC_DateTypeDef* RTC_StampDateStruct) +{ + uint32_t tmptime = 0, tmpdate = 0; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(RTC_Format)); + + /* Get the TimeStamp time and date registers values */ + tmptime = (uint32_t)(RTC->TSTR & RTC_TR_RESERVED_MASK); + tmpdate = (uint32_t)(RTC->TSDR & RTC_DR_RESERVED_MASK); + + /* Fill the Time structure fields with the read parameters */ + RTC_StampTimeStruct->RTC_Hours = (uint8_t)((tmptime & (RTC_TR_HT | RTC_TR_HU)) >> 16); + RTC_StampTimeStruct->RTC_Minutes = (uint8_t)((tmptime & (RTC_TR_MNT | RTC_TR_MNU)) >> 8); + RTC_StampTimeStruct->RTC_Seconds = (uint8_t)(tmptime & (RTC_TR_ST | RTC_TR_SU)); + RTC_StampTimeStruct->RTC_H12 = (uint8_t)((tmptime & (RTC_TR_PM)) >> 16); + + /* Fill the Date structure fields with the read parameters */ + RTC_StampDateStruct->RTC_Year = 0; + RTC_StampDateStruct->RTC_Month = (uint8_t)((tmpdate & (RTC_DR_MT | RTC_DR_MU)) >> 8); + RTC_StampDateStruct->RTC_Date = (uint8_t)(tmpdate & (RTC_DR_DT | RTC_DR_DU)); + RTC_StampDateStruct->RTC_WeekDay = (uint8_t)((tmpdate & (RTC_DR_WDU)) >> 13); + + /* Check the input parameters format */ + if (RTC_Format == RTC_Format_BIN) + { + /* Convert the Time structure parameters to Binary format */ + RTC_StampTimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Hours); + RTC_StampTimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Minutes); + RTC_StampTimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Seconds); + + /* Convert the Date structure parameters to Binary format */ + RTC_StampDateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Month); + RTC_StampDateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Date); + RTC_StampDateStruct->RTC_WeekDay = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_WeekDay); + } +} + +/** + * @brief Get the RTC timestamp Subseconds value. + * @param None + * @retval RTC current timestamp Subseconds value. + */ +uint32_t RTC_GetTimeStampSubSecond(void) +{ + /* Get timestamp subseconds values from the correspondent registers */ + return (uint32_t)(RTC->TSSSR); +} + +/** + * @} + */ + +/** @defgroup RTC_Group9 Tampers configuration functions + * @brief Tampers configuration functions + * +@verbatim + =============================================================================== + ##### Tampers configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the select Tamper pin edge. + * @param RTC_Tamper: Selected tamper pin. + * This parameter can be any combination of the following values: + * @arg RTC_Tamper_1: Select Tamper 1. + * @arg RTC_Tamper_2: Select Tamper 2. + * @arg RTC_Tamper_3: Select Tamper 3. + * @param RTC_TamperTrigger: Specifies the trigger on the tamper pin that + * stimulates tamper event. + * This parameter can be one of the following values: + * @arg RTC_TamperTrigger_RisingEdge: Rising Edge of the tamper pin causes tamper event. + * @arg RTC_TamperTrigger_FallingEdge: Falling Edge of the tamper pin causes tamper event. + * @arg RTC_TamperTrigger_LowLevel: Low Level of the tamper pin causes tamper event. + * @arg RTC_TamperTrigger_HighLevel: High Level of the tamper pin causes tamper event. + * @retval None + */ +void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger) +{ + /* Check the parameters */ + assert_param(IS_RTC_TAMPER(RTC_Tamper)); + assert_param(IS_RTC_TAMPER_TRIGGER(RTC_TamperTrigger)); + + /* Check if the active level for Tamper is rising edge (Low level)*/ + if (RTC_TamperTrigger == RTC_TamperTrigger_RisingEdge) + { + /* Configure the RTC_TAFCR register */ + RTC->TAFCR &= (uint32_t)((uint32_t)~(RTC_Tamper << 1)); + } + else + { + /* Configure the RTC_TAFCR register */ + RTC->TAFCR |= (uint32_t)(RTC_Tamper << 1); + } +} + +/** + * @brief Enables or Disables the Tamper detection. + * @param RTC_Tamper: Selected tamper pin. + * This parameter can be any combination of the following values: + * @arg RTC_Tamper_1: Select Tamper 1. + * @arg RTC_Tamper_2: Select Tamper 2. + * @arg RTC_Tamper_3: Select Tamper 3. + * @param NewState: new state of the tamper pin. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_TAMPER(RTC_Tamper)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected Tamper pin */ + RTC->TAFCR |= (uint32_t)RTC_Tamper; + } + else + { + /* Disable the selected Tamper pin */ + RTC->TAFCR &= (uint32_t)~RTC_Tamper; + } +} + +/** + * @brief Configures the Tampers Filter. + * @param RTC_TamperFilter: Specifies the tampers filter. + * This parameter can be one of the following values: + * @arg RTC_TamperFilter_Disable: Tamper filter is disabled. + * @arg RTC_TamperFilter_2Sample: Tamper is activated after 2 consecutive + * samples at the active level. + * @arg RTC_TamperFilter_4Sample: Tamper is activated after 4 consecutive + * samples at the active level. + * @arg RTC_TamperFilter_8Sample: Tamper is activated after 8 consecutive + * samples at the active level. + * @retval None + */ +void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter) +{ + /* Check the parameters */ + assert_param(IS_RTC_TAMPER_FILTER(RTC_TamperFilter)); + + /* Clear TAMPFLT[1:0] bits in the RTC_TAFCR register */ + RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFLT); + + /* Configure the RTC_TAFCR register */ + RTC->TAFCR |= (uint32_t)RTC_TamperFilter; +} + +/** + * @brief Configures the Tampers Sampling Frequency. + * @param RTC_TamperSamplingFreq: Specifies the tampers Sampling Frequency. + * This parameter can be one of the following values: + * @arg RTC_TamperSamplingFreq_RTCCLK_Div32768: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 32768 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div16384: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 16384 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div8192: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 8192 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div4096: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 4096 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div2048: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 2048 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div1024: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 1024 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div512: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 512 + * @arg RTC_TamperSamplingFreq_RTCCLK_Div256: Each of the tamper inputs are sampled + * with a frequency = RTCCLK / 256 + * @retval None + */ +void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq) +{ + /* Check the parameters */ + assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(RTC_TamperSamplingFreq)); + + /* Clear TAMPFREQ[2:0] bits in the RTC_TAFCR register */ + RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFREQ); + + /* Configure the RTC_TAFCR register */ + RTC->TAFCR |= (uint32_t)RTC_TamperSamplingFreq; +} + +/** + * @brief Configures the Tampers Pins input Precharge Duration. + * @param RTC_TamperPrechargeDuration: Specifies the Tampers Pins input + * Precharge Duration. + * This parameter can be one of the following values: + * @arg RTC_TamperPrechargeDuration_1RTCCLK: Tamper pins are pre-charged before sampling during 1 RTCCLK cycle. + * @arg RTC_TamperPrechargeDuration_2RTCCLK: Tamper pins are pre-charged before sampling during 2 RTCCLK cycle. + * @arg RTC_TamperPrechargeDuration_4RTCCLK: Tamper pins are pre-charged before sampling during 4 RTCCLK cycle. + * @arg RTC_TamperPrechargeDuration_8RTCCLK: Tamper pins are pre-charged before sampling during 8 RTCCLK cycle. + * @retval None + */ +void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration) +{ + /* Check the parameters */ + assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(RTC_TamperPrechargeDuration)); + + /* Clear TAMPPRCH[1:0] bits in the RTC_TAFCR register */ + RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPPRCH); + + /* Configure the RTC_TAFCR register */ + RTC->TAFCR |= (uint32_t)RTC_TamperPrechargeDuration; +} + +/** + * @brief Enables or Disables the TimeStamp on Tamper Detection Event. + * @note The timestamp is valid even the TSE bit in tamper control register + * is reset. + * @param NewState: new state of the timestamp on tamper event. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Save timestamp on tamper detection event */ + RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPTS; + } + else + { + /* Tamper detection does not cause a timestamp to be saved */ + RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPTS; + } +} + +/** + * @brief Enables or Disables the Precharge of Tamper pin. + * @param NewState: new state of tamper pull up. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_TamperPullUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable precharge of the selected Tamper pin */ + RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPPUDIS; + } + else + { + /* Disable precharge of the selected Tamper pin */ + RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPPUDIS; + } +} + +/** + * @} + */ + +/** @defgroup RTC_Group10 Backup Data Registers configuration functions + * @brief Backup Data Registers configuration functions + * +@verbatim + =============================================================================== + ##### Backup Data Registers configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Writes a data in a specified RTC Backup data register. + * @param RTC_BKP_DR: RTC Backup data Register number. + * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to + * specify the register. + * @param Data: Data to be written in the specified RTC Backup data register. + * @retval None + */ +void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_RTC_BKP(RTC_BKP_DR)); + + tmp = RTC_BASE + 0x50; + tmp += (RTC_BKP_DR * 4); + + /* Write the specified register */ + *(__IO uint32_t *)tmp = (uint32_t)Data; +} + +/** + * @brief Reads data from the specified RTC Backup data Register. + * @param RTC_BKP_DR: RTC Backup data Register number. + * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to + * specify the register. + * @retval None + */ +uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_RTC_BKP(RTC_BKP_DR)); + + tmp = RTC_BASE + 0x50; + tmp += (RTC_BKP_DR * 4); + + /* Read the specified register */ + return (*(__IO uint32_t *)tmp); +} + +/** + * @} + */ + +/** @defgroup RTC_Group11 Output Type Config configuration functions + * @brief Output Type Config configuration functions + * +@verbatim + =============================================================================== + ##### Output Type Config configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the RTC Output Pin mode. + * @param RTC_OutputType: specifies the RTC Output (PC13) pin mode. + * This parameter can be one of the following values: + * @arg RTC_OutputType_OpenDrain: RTC Output (PC13) is configured in + * Open Drain mode. + * @arg RTC_OutputType_PushPull: RTC Output (PC13) is configured in + * Push Pull mode. + * @retval None + */ +void RTC_OutputTypeConfig(uint32_t RTC_OutputType) +{ + /* Check the parameters */ + assert_param(IS_RTC_OUTPUT_TYPE(RTC_OutputType)); + + RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_ALARMOUTTYPE); + RTC->TAFCR |= (uint32_t)(RTC_OutputType); +} + +/** + * @} + */ + +/** @defgroup RTC_Group12 Shift control synchronisation functions + * @brief Shift control synchronisation functions + * +@verbatim + =============================================================================== + ##### Shift control synchronisation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the Synchronization Shift Control Settings. + * @note When REFCKON is set, firmware must not write to Shift control register + * @param RTC_ShiftAdd1S : Select to add or not 1 second to the time Calendar. + * This parameter can be one of the following values : + * @arg RTC_ShiftAdd1S_Set: Add one second to the clock calendar. + * @arg RTC_ShiftAdd1S_Reset: No effect. + * @param RTC_ShiftSubFS: Select the number of Second Fractions to Substitute. + * This parameter can be one any value from 0 to 0x7FFF. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Shift registers are configured + * - ERROR: RTC Shift registers are not configured +*/ +ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS) +{ + ErrorStatus status = ERROR; + uint32_t shpfcount = 0; + + /* Check the parameters */ + assert_param(IS_RTC_SHIFT_ADD1S(RTC_ShiftAdd1S)); + assert_param(IS_RTC_SHIFT_SUBFS(RTC_ShiftSubFS)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + /* Check if a Shift is pending*/ + if ((RTC->ISR & RTC_ISR_SHPF) != RESET) + { + /* Wait until the shift is completed*/ + while (((RTC->ISR & RTC_ISR_SHPF) != RESET) && (shpfcount != SHPF_TIMEOUT)) + { + shpfcount++; + } + } + + /* Check if the Shift pending is completed or if there is no Shift operation at all*/ + if ((RTC->ISR & RTC_ISR_SHPF) == RESET) + { + /* check if the reference clock detection is disabled */ + if((RTC->CR & RTC_CR_REFCKON) == RESET) + { + /* Configure the Shift settings */ + RTC->SHIFTR = (uint32_t)(uint32_t)(RTC_ShiftSubFS) | (uint32_t)(RTC_ShiftAdd1S); + + if(RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = ERROR; + } + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; + + return (ErrorStatus)(status); +} + +/** + * @} + */ + +/** @defgroup RTC_Group13 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + [..] All RTC interrupts are connected to the EXTI controller. + (+) To enable the RTC Alarm interrupt, the following sequence is required: + (+) Configure and enable the EXTI Line 17 in interrupt mode and select + the rising edge sensitivity using the EXTI_Init() function. + (+) Configure and enable the RTC_Alarm IRQ channel in the NVIC using + the NVIC_Init() function. + (+) Configure the RTC to generate RTC alarms (Alarm A and/or Alarm B) + using the RTC_SetAlarm() and RTC_AlarmCmd() functions. + + (+) To enable the RTC Wakeup interrupt, the following sequence is required: + (+) Configure and enable the EXTI Line 20 in interrupt mode and select + the rising edge sensitivity using the EXTI_Init() function. + (+) Configure and enable the RTC_WKUP IRQ channel in the NVIC using the + NVIC_Init() function. + (+) Configure the RTC to generate the RTC wakeup timer event using the + RTC_WakeUpClockConfig(), RTC_SetWakeUpCounter() and RTC_WakeUpCmd() + functions. + + (+) To enable the RTC Tamper interrupt, the following sequence is required: + (+) Configure and enable the EXTI Line 19 in interrupt mode and select + the rising edge sensitivity using the EXTI_Init() function. + (+) Configure and enable the TAMP_STAMP IRQ channel in the NVIC using + the NVIC_Init() function. + (+) Configure the RTC to detect the RTC tamper event using the + RTC_TamperTriggerConfig() and RTC_TamperCmd() functions. + + (+) To enable the RTC TimeStamp interrupt, the following sequence is + required: + (+) Configure and enable the EXTI Line 19 in interrupt mode and select + the rising edge sensitivity using the EXTI_Init() function. + (+) Configure and enable the TAMP_STAMP IRQ channel in the NVIC using + the NVIC_Init() function. + (+) Configure the RTC to detect the RTC time-stamp event using the + RTC_TimeStampCmd() functions. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified RTC interrupts. + * @param RTC_IT: specifies the RTC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg RTC_IT_TS: Time Stamp interrupt mask. + * @arg RTC_IT_WUT: WakeUp Timer interrupt mask. + * @arg RTC_IT_ALRB: Alarm B interrupt mask. + * @arg RTC_IT_ALRA: Alarm A interrupt mask. + * @arg RTC_IT_TAMP: Tamper event interrupt mask. + * @param NewState: new state of the specified RTC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_CONFIG_IT(RTC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Disable the write protection for RTC registers */ + RTC->WPR = 0xCA; + RTC->WPR = 0x53; + + if (NewState != DISABLE) + { + /* Configure the Interrupts in the RTC_CR register */ + RTC->CR |= (uint32_t)(RTC_IT & ~RTC_TAFCR_TAMPIE); + /* Configure the Tamper Interrupt in the RTC_TAFCR */ + RTC->TAFCR |= (uint32_t)(RTC_IT & RTC_TAFCR_TAMPIE); + } + else + { + /* Configure the Interrupts in the RTC_CR register */ + RTC->CR &= (uint32_t)~(RTC_IT & (uint32_t)~RTC_TAFCR_TAMPIE); + /* Configure the Tamper Interrupt in the RTC_TAFCR */ + RTC->TAFCR &= (uint32_t)~(RTC_IT & RTC_TAFCR_TAMPIE); + } + /* Enable the write protection for RTC registers */ + RTC->WPR = 0xFF; +} + +/** + * @brief Checks whether the specified RTC flag is set or not. + * @param RTC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg RTC_FLAG_RECALPF: RECALPF event flag. + * @arg RTC_FLAG_TAMP3F: Tamper 3 event flag. + * @arg RTC_FLAG_TAMP2F: Tamper 2 event flag. + * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag. + * @arg RTC_FLAG_TSOVF: Time Stamp OverFlow flag. + * @arg RTC_FLAG_TSF: Time Stamp event flag. + * @arg RTC_FLAG_WUTF: WakeUp Timer flag. + * @arg RTC_FLAG_ALRBF: Alarm B flag. + * @arg RTC_FLAG_ALRAF: Alarm A flag. + * @arg RTC_FLAG_INITF: Initialization mode flag. + * @arg RTC_FLAG_RSF: Registers Synchronized flag. + * @arg RTC_FLAG_INITS: Registers Configured flag. + * @argRTC_FLAG_SHPF: Shift operation pending flag. + * @arg RTC_FLAG_WUTWF: WakeUp Timer Write flag. + * @arg RTC_FLAG_ALRBWF: Alarm B Write flag. + * @arg RTC_FLAG_ALRAWF: Alarm A write flag. + * @retval The new state of RTC_FLAG (SET or RESET). + */ +FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); + + /* Get all the flags */ + tmpreg = (uint32_t)(RTC->ISR & RTC_FLAGS_MASK); + + /* Return the status of the flag */ + if ((tmpreg & RTC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC's pending flags. + * @param RTC_FLAG: specifies the RTC flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_TAMP3F: Tamper 3 event flag. + * @arg RTC_FLAG_TAMP2F: Tamper 2 event flag. + * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag. + * @arg RTC_FLAG_TSOVF: Time Stamp Overflow flag. + * @arg RTC_FLAG_TSF: Time Stamp event flag. + * @arg RTC_FLAG_WUTF: WakeUp Timer flag. + * @arg RTC_FLAG_ALRBF: Alarm B flag. + * @arg RTC_FLAG_ALRAF: Alarm A flag. + * @arg RTC_FLAG_RSF: Registers Synchronized flag. + * @retval None + */ +void RTC_ClearFlag(uint32_t RTC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); + + /* Clear the Flags in the RTC_ISR register */ + RTC->ISR = (uint32_t)((uint32_t)(~((RTC_FLAG | RTC_ISR_INIT)& 0x0001FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Checks whether the specified RTC interrupt has occurred or not. + * @param RTC_IT: specifies the RTC interrupt source to check. + * This parameter can be one of the following values: + * @arg RTC_IT_TS: Time Stamp interrupt. + * @arg RTC_IT_WUT: WakeUp Timer interrupt. + * @arg RTC_IT_ALRB: Alarm B interrupt. + * @arg RTC_IT_ALRA: Alarm A interrupt. + * @arg RTC_IT_TAMP1: Tamper1 event interrupt. + * @arg RTC_IT_TAMP2: Tamper2 event interrupt. + * @arg RTC_IT_TAMP3: Tamper3 event interrupt. + * @retval The new state of RTC_IT (SET or RESET). + */ +ITStatus RTC_GetITStatus(uint32_t RTC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0, enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_RTC_GET_IT(RTC_IT)); + + /* Get the TAMPER Interrupt enable bit and pending bit */ + tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE)); + + /* Get the Interrupt enable Status */ + enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & ((RTC_IT >> (RTC_IT >> 18)) >> 15))); + + /* Get the Interrupt pending bit */ + tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4))); + + /* Get the status of the Interrupt */ + if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the RTC's interrupt pending bits. + * @param RTC_IT: specifies the RTC interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RTC_IT_TS: Time Stamp interrupt + * @arg RTC_IT_WUT: WakeUp Timer interrupt + * @arg RTC_IT_ALRB: Alarm B interrupt + * @arg RTC_IT_ALRA: Alarm A interrupt + * @arg RTC_IT_TAMP1: Tamper1 event interrupt + * @arg RTC_IT_TAMP2: Tamper2 event interrupt + * @arg RTC_IT_TAMP3: Tamper3 event interrupt + * @retval None + */ +void RTC_ClearITPendingBit(uint32_t RTC_IT) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RTC_CLEAR_IT(RTC_IT)); + + /* Get the RTC_ISR Interrupt pending bits mask */ + tmpreg = (uint32_t)(RTC_IT >> 4); + + /* Clear the interrupt pending bits in the RTC_ISR register */ + RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); +} + +/** + * @} + */ + +/** + * @brief Converts a 2 digit decimal to BCD format. + * @param Value: Byte to be converted. + * @retval Converted byte + */ +static uint8_t RTC_ByteToBcd2(uint8_t Value) +{ + uint8_t bcdhigh = 0; + + while (Value >= 10) + { + bcdhigh++; + Value -= 10; + } + + return ((uint8_t)(bcdhigh << 4) | Value); +} + +/** + * @brief Convert from 2 digit BCD to Binary. + * @param Value: BCD value to be converted. + * @retval Converted word + */ +static uint8_t RTC_Bcd2ToByte(uint8_t Value) +{ + uint8_t tmp = 0; + tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; + return (tmp + (Value & (uint8_t)0x0F)); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_sdio.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_sdio.c new file mode 100644 index 0000000..fcb11a0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_sdio.c @@ -0,0 +1,984 @@ +/** + ****************************************************************************** + * @file stm32l1xx_sdio.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the SDIO peripheral: + * + Initialization + * + Interrupts and flags management + * + * @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) The SDIO clock (SDIOCLK = 48 MHz) is coming from a specific output of PLL + (PLLVCO) througth a fixed divider by 2. + Before to start working with SDIO peripheral make sure that the PLLVCO is + well configured to 96MHz. + The SDIO peripheral uses two clock signals: + (++) SDIO adapter clock (SDIOCLK = 48 MHz). + (++) APB2 bus clock (PCLK2). + PCLK2 and SDIO_CK clock frequencies must respect the following + condition: Frequenc(PCLK2) >= (3 / 8 x Frequency(SDIO_CK)). + (#) Enable peripheral clock using + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE). + (#) According to the SDIO mode, enable the GPIO clocks using + RCC_AHBPeriphClockCmd() function. + The I/O can be one of the following configurations: + (++) 1-bit data length: SDIO_CMD, SDIO_CK and D0. + (++) 4-bit data length: SDIO_CMD, SDIO_CK and D[3:0]. + (++) 8-bit data length: SDIO_CMD, SDIO_CK and D[7:0]. + + (#) Peripheral's alternate function: + (++) Connect the pin to the desired peripherals' Alternate + Function (AF) using GPIO_PinAFConfig() function. + (++) Configure the desired pin in alternate function by: + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. + (++) Select the type, pull-up/pull-down and output speed via + GPIO_PuPd, GPIO_OType and GPIO_Speed members. + (++) Call GPIO_Init() function. + + (#) Program the Clock Edge, Clock Bypass, Clock Power Save, Bus Wide, + hardware, flow control and the Clock Divider using the SDIO_Init() + function. + (#) Enable the Power ON State using the SDIO_SetPowerState(SDIO_PowerState_ON) + function. + (#) Enable the clock using the SDIO_ClockCmd() function. + (#) Enable the NVIC and the corresponding interrupt using the function + SDIO_ITConfig() if you need to use interrupt mode. + (#) When using the DMA mode + (++) Configure the DMA using DMA_Init() function. + (++) Active the needed channel Request using SDIO_DMACmd() function. + (#) Enable the DMA using the DMA_Cmd() function, when using DMA mode. + (#) To control the CPSM (Command Path State Machine) and send 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. The parameters that should be filled are: + (++) Command Argument. + (++) Command Index. + (++) Command Response type. + (++) Command Wait. + (++) CPSM Status (Enable or Disable). + 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 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_ReadData(), SDIO_WriteData() and SDIO_GetFIFOCount() functions. + + *** Read Operations *** + ----------------------- + [..] + (#) 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 Length. + (++) Data Block size. + (++) Data Transfer direction: should be from card (To SDIO). + (++) Data Transfer mode. + (++) DPSM Status (Enable or Disable). + (#) Configure the SDIO 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). + (#) Use the SDIO flags/interrupts to check the transfer status. + + *** Write Operations *** + ------------------------ + [..] + (#) 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 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 selected transfer mode (Refer to Step 8, 9 and 10). + (#) Send the selected Write command (refer to step 11). + (#) Use the SDIO flags/interrupts to check the transfer status. + + @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_sdio.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup SDIO + * @brief SDIO driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* ------------ SDIO registers bit address in the alias region ----------- */ +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* --- CLKCR Register ---*/ + +/* Alias word address of CLKEN bit */ +#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) +#define CLKEN_BitNumber 0x08 +#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) + +/* --- CMD Register ---*/ + +/* Alias word address of SDIOSUSPEND bit */ +#define CMD_OFFSET (SDIO_OFFSET + 0x0C) +#define SDIOSUSPEND_BitNumber 0x0B +#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) + +/* Alias word address of ENCMDCOMPL bit */ +#define ENCMDCOMPL_BitNumber 0x0C +#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) + +/* Alias word address of NIEN bit */ +#define NIEN_BitNumber 0x0D +#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) + +/* Alias word address of ATACMD bit */ +#define ATACMD_BitNumber 0x0E +#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) + +/* --- DCTRL Register ---*/ + +/* Alias word address of DMAEN bit */ +#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) +#define DMAEN_BitNumber 0x03 +#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) + +/* Alias word address of RWSTART bit */ +#define RWSTART_BitNumber 0x08 +#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) + +/* Alias word address of RWSTOP bit */ +#define RWSTOP_BitNumber 0x09 +#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) + +/* Alias word address of RWMOD bit */ +#define RWMOD_BitNumber 0x0A +#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) + +/* Alias word address of SDIOEN bit */ +#define SDIOEN_BitNumber 0x0B +#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) + +/* ---------------------- SDIO registers bit mask ------------------------ */ + +/* --- CLKCR Register ---*/ + +/* CLKCR register clear mask */ +#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) + +/* --- PWRCTRL Register ---*/ + +/* SDIO PWRCTRL Mask */ +#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) + +/* --- DCTRL Register ---*/ + +/* SDIO DCTRL Clear Mask */ +#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) + +/* --- CMD Register ---*/ + +/* CMD Register clear mask */ +#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) + +/* SDIO RESP Registers Address */ +#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup SDIO_Private_Functions + * @{ + */ + +/** @defgroup SDIO_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * + @verbatim + ============================================================================== + ##### Initialization and Configuration functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the SDIO peripheral registers to their default reset values. + * @param None + * @retval None + */ +void SDIO_DeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE); +} + +/** + * @brief Initializes the SDIO peripheral according to the specified + * parameters in the SDIO_InitStruct. + * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure + * that contains the configuration information for the SDIO peripheral. + * @retval None + */ +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); + +/*---------------------------- SDIO CLKCR Configuration ------------------------*/ + /* Get the SDIO CLKCR value */ + tmpreg = SDIO->CLKCR; + + /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ + tmpreg &= CLKCR_CLEAR_MASK; + + /* Set CLKDIV bits according to SDIO_ClockDiv value */ + /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ + /* Set BYPASS bit according to SDIO_ClockBypass value */ + /* Set WIDBUS bits according to SDIO_BusWide value */ + /* Set NEGEDGE bits according to SDIO_ClockEdge value */ + /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ + tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | + SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | + SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); + + /* Write to SDIO CLKCR */ + SDIO->CLKCR = tmpreg; +} + +/** + * @brief Fills each SDIO_InitStruct member with its default value. + * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) +{ + /* SDIO_InitStruct members default value */ + SDIO_InitStruct->SDIO_ClockDiv = 0x00; + SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; + SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; + SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; + SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; + SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; +} + +/** + * @brief Enables or disables the SDIO Clock. + * @param NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ClockCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; +} + +/** + * @brief Sets the power status of the controller. + * @param SDIO_PowerState: new state of the Power state. + * This parameter can be one of the following values: + * @arg SDIO_PowerState_OFF: SDIO Power OFF. + * @arg SDIO_PowerState_ON: SDIO Power ON. + * @retval None + */ +void SDIO_SetPowerState(uint32_t SDIO_PowerState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); + + SDIO->POWER = SDIO_PowerState; +} + +/** + * @brief Gets the power status of the controller. + * @param None + * @retval Power status of the controller. The returned value can + * be one of the following: + * - 0x00: Power OFF + * - 0x02: Power UP + * - 0x03: Power ON + */ +uint32_t SDIO_GetPowerState(void) +{ + return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); +} + +/** + * @} + */ + +/** @defgroup SDIO_Group2 DMA transfers management functions + * @brief DMA transfers management functions + * + @verbatim + ============================================================================== + ##### DMA transfers management functions ##### + ============================================================================== + [..] This section provide functions allowing to program SDIO DMA transfer. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the SDIO DMA request. + * @param NewState: new state of the selected SDIO DMA request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_DMACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup SDIO_Group3 Command path state machine (CPSM) management functions + * @brief Command path state machine (CPSM) management functions + * + @verbatim + ============================================================================== + ##### Command path state machine (CPSM) management functions ##### + ============================================================================== + [..] This section provide functions allowing to program and read the Command + path state machine (CPSM). + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the SDIO Command according to the specified + * parameters in the SDIO_CmdInitStruct and send the command. + * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef + * structure that contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); + assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); + assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); + assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); + +/*---------------------------- SDIO ARG Configuration ------------------------*/ + /* Set the SDIO Argument value */ + SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; + +/*---------------------------- SDIO CMD Configuration ------------------------*/ + /* Get the SDIO CMD value */ + tmpreg = SDIO->CMD; + /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ + tmpreg &= CMD_CLEAR_MASK; + /* Set CMDINDEX bits according to SDIO_CmdIndex value */ + /* Set WAITRESP bits according to SDIO_Response value */ + /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ + /* Set CPSMEN bits according to SDIO_CPSM value */ + tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response + | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; + + /* Write to SDIO CMD */ + SDIO->CMD = tmpreg; +} + +/** + * @brief Fills each SDIO_CmdInitStruct member with its default value. + * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef + * structure which will be initialized. + * @retval None + */ +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) +{ + /* SDIO_CmdInitStruct members default value */ + SDIO_CmdInitStruct->SDIO_Argument = 0x00; + SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; + SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; + SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; + SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; +} + +/** + * @brief Returns command index of last command for which response received. + * @param None + * @retval Returns the command index of the last command response received. + */ +uint8_t SDIO_GetCommandResponse(void) +{ + return (uint8_t)(SDIO->RESPCMD); +} + +/** + * @brief Returns response received from the card for the last command. + * @param SDIO_RESP: Specifies the SDIO 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. + * @retval The Corresponding response register value. + */ +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_RESP(SDIO_RESP)); + + tmp = SDIO_RESP_ADDR + SDIO_RESP; + + return (*(__IO uint32_t *) tmp); +} + +/** + * @} + */ + +/** @defgroup SDIO_Group4 Data path state machine (DPSM) management functions + * @brief Data path state machine (DPSM) management functions + * + @verbatim + ============================================================================== + ##### Data path state machine (DPSM) management functions ##### + ============================================================================== + [..] This section provide functions allowing to program and read the Data path + state machine (DPSM). + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the SDIO data path according to the specified + * parameters in the SDIO_DataInitStruct. + * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that + * contains the configuration information for the SDIO command. + * @retval None + */ +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); + assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); + assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); + assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); + assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); + +/*---------------------------- SDIO DTIMER Configuration ---------------------*/ + /* Set the SDIO Data TimeOut value */ + SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; + +/*---------------------------- SDIO DLEN Configuration -----------------------*/ + /* Set the SDIO DataLength value */ + SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; + +/*---------------------------- SDIO DCTRL Configuration ----------------------*/ + /* Get the SDIO DCTRL value */ + tmpreg = SDIO->DCTRL; + /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ + tmpreg &= DCTRL_CLEAR_MASK; + /* Set DEN bit according to SDIO_DPSM value */ + /* Set DTMODE bit according to SDIO_TransferMode value */ + /* Set DTDIR bit according to SDIO_TransferDir value */ + /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ + tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir + | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; + + /* Write to SDIO DCTRL */ + SDIO->DCTRL = tmpreg; +} + +/** + * @brief Fills each SDIO_DataInitStruct member with its default value. + * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which + * will be initialized. + * @retval None + */ +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) +{ + /* SDIO_DataInitStruct members default value */ + SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; + SDIO_DataInitStruct->SDIO_DataLength = 0x00; + SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; + SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; + SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; + SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; +} + +/** + * @brief Returns number of remaining data bytes to be transferred. + * @param None + * @retval Number of remaining data bytes to be transferred + */ +uint32_t SDIO_GetDataCounter(void) +{ + return SDIO->DCOUNT; +} + +/** + * @brief Read one data word from Rx FIFO. + * @param None + * @retval Data received + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFO; +} + +/** + * @brief Write one data word to Tx FIFO. + * @param Data: 32-bit data word to write. + * @retval None + */ +void SDIO_WriteData(uint32_t Data) +{ + SDIO->FIFO = Data; +} + +/** + * @brief Returns the number of words left to be written to or read from FIFO. + * @param None + * @retval Remaining number of words. + */ +uint32_t SDIO_GetFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/** + * @} + */ + +/** @defgroup SDIO_Group5 SDIO IO Cards mode management functions + * @brief SDIO IO Cards mode management functions + * + @verbatim + ============================================================================== + ##### SDIO IO Cards mode management functions ##### + ============================================================================== + [..] This section provide functions allowing to program and read the SDIO IO + Cards. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the SD I/O Read Wait operation. + * @param NewState: new state of the Start SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StartSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; +} + +/** + * @brief Stops the SD I/O Read Wait operation. + * @param NewState: new state of the Stop SDIO Read Wait operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_StopSDIOReadWait(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; +} + +/** + * @brief Sets one of the two options of inserting read wait interval. + * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. + * This parametre can be: + * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK. + * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2. + * @retval None + */ +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +{ + /* Check the parameters */ + assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); + + *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; +} + +/** + * @brief Enables or disables the SD I/O Mode Operation. + * @param NewState: new state of SDIO specific operation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SetSDIOOperation(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the SD I/O Mode suspend command sending. + * @param NewState: new state of the SD I/O Mode suspend command. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup SDIO_Group6 CE-ATA mode management functions + * @brief CE-ATA mode management functions + * + @verbatim + ============================================================================== + ##### CE-ATA mode management functions ##### + ============================================================================== + [..] This section provide functions allowing to program and read the CE-ATA + card. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the command completion signal. + * @param NewState: new state of command completion signal. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CommandCompletionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; +} + +/** + * @brief Enables or disables the CE-ATA interrupt. + * @param NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_CEATAITCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); +} + +/** + * @brief Sends CE-ATA command (CMD61). + * @param NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_SendCEATACmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; +} + +/** + * @} + */ + +/** @defgroup SDIO_Group7 Interrupts and flags management functions + * @brief Interrupts and flags management functions + + + @verbatim + ============================================================================== + ##### Interrupts and flags management functions ##### + ============================================================================== + + @endverbatim + * @{ + */ + +/** + * @brief Enables or disables the SDIO interrupts. + * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or 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_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. + * @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. + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt. + * @param NewState: new state of the specified SDIO interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SDIO_IT(SDIO_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SDIO interrupts */ + SDIO->MASK |= SDIO_IT; + } + else + { + /* Disable the SDIO interrupts */ + SDIO->MASK &= ~SDIO_IT; + } +} + +/** + * @brief Checks whether the specified SDIO flag is set or not. + * @param SDIO_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_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. + * @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. + * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61. + * @retval The new state of SDIO_FLAG (SET or RESET). + */ +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_FLAG(SDIO_FLAG)); + + if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's pending flags. + * @param SDIO_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_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 + */ +void SDIO_ClearFlag(uint32_t SDIO_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); + + SDIO->ICR = SDIO_FLAG; +} + +/** + * @brief Checks whether the specified SDIO interrupt has occurred or not. + * @param SDIO_IT: specifies the SDIO 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_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. + * @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. + * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt. + * @retval The new state of SDIO_IT (SET or RESET). + */ +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_SDIO_GET_IT(SDIO_IT)); + if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the SDIO's interrupt pending bits. + * @param SDIO_IT: 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, SDIDCOUNT, 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 + */ +void SDIO_ClearITPendingBit(uint32_t SDIO_IT) +{ + /* Check the parameters */ + assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); + + SDIO->ICR = SDIO_IT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_spi.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_spi.c new file mode 100644 index 0000000..19edb72 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_spi.c @@ -0,0 +1,1076 @@ +/** + ****************************************************************************** + * @file stm32l1xx_spi.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Serial peripheral interface (SPI): + * + Initialization and Configuration + * + Data transfers functions + * + Hardware CRC Calculation + * + DMA transfers management + * + Interrupts and flags management + * + * @verbatim + [..] The I2S feature is not implemented in STM32L1xx Ultra Low Power + Medium-density devices and it's supported only STM32L1xx Ultra Low Power + Medium-density Plus and High-density devices. + + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] + (#) Enable peripheral clock using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) + function for SPI1 or using RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) + function for SPI2 or using RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) + for SPI3. + + (#) Enable SCK, MOSI, MISO and NSS GPIO clocks using + RCC_AHBPeriphClockCmd() function. + + (#) Peripherals alternate function: + (++) Connect the pin to the desired peripherals' Alternate + Function (AF) using GPIO_PinAFConfig() function. + (++) Configure the desired pin in alternate function by: + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. + (++) Select the type, pull-up/pull-down and output speed via + GPIO_PuPd, GPIO_OType and GPIO_Speed members. + (++) Call GPIO_Init() function. + + (#) Program the Polarity, Phase, First Data, Baud Rate Prescaler, Slave + Management, Peripheral Mode and CRC Polynomial values using the SPI_Init() + function.In I2S mode, program the Mode, Standard, Data Format, MCLK + Output, Audio frequency and Polarity using I2S_Init() function. + + (#) Enable the NVIC and the corresponding interrupt using the function + SPI_ITConfig() if you need to use interrupt mode. + + (#) When using the DMA mode + (++) Configure the DMA using DMA_Init() function. + (++) Active the needed channel Request using SPI_I2S_DMACmd() function. + + (#) Enable the SPI using the SPI_Cmd() function or enable the I2S using + I2S_Cmd(). + + (#) Enable the DMA using the DMA_Cmd() function when using DMA mode. + + (#) Optionally, you can enable/configure the following parameters without + re-initialization (i.e there is no need to call again SPI_Init() function): + (++) When bidirectional mode (SPI_Direction_1Line_Rx or SPI_Direction_1Line_Tx) + is programmed as Data direction parameter using the SPI_Init() + function it can be possible to switch between SPI_Direction_Tx + or SPI_Direction_Rx using the SPI_BiDirectionalLineConfig() function. + (++) When SPI_NSS_Soft is selected as Slave Select Management parameter + using the SPI_Init() function it can be possible to manage the + NSS internal signal using the SPI_NSSInternalSoftwareConfig() function. + (++) Reconfigure the data size using the SPI_DataSizeConfig() function. + (++) Enable or disable the SS output using the SPI_SSOutputCmd() function. + + (#) To use the CRC Hardware calculation feature refer to the Peripheral + CRC hardware Calculation subsection. + + @endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_spi.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup SPI + * @brief SPI driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* SPI registers Masks */ +#define CR1_CLEAR_MASK ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup SPI_Private_Functions + * @{ + */ + +/** @defgroup SPI_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides a set of functions allowing to initialize the SPI + Direction, SPI Mode, SPI Data Size, SPI Polarity, SPI Phase, SPI NSS + Management, SPI Baud Rate Prescaler, SPI First Bit and SPI CRC Polynomial. + [..] The SPI_Init() function follows the SPI configuration procedures for + Master mode and Slave mode (details for these procedures are available + in reference manual (RM0038)). + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + * @retval None + */ +void SPI_I2S_DeInit(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + if (SPIx == SPI1) + { + /* Enable SPI1 reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); + /* Release SPI1 from reset state */ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); + } + else if (SPIx == SPI2) + { + /* Enable SPI2 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); + /* Release SPI2 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); + } + else + { + if (SPIx == SPI3) + { + /* Enable SPI3 reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); + /* Release SPI3 from reset state */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); + } + } +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral. + * @retval None + */ +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) +{ + uint16_t tmpreg = 0; + + /* check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Check the SPI parameters */ + assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); + assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); + assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); + assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); + assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); + assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); + assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); + assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); + assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); + +/*---------------------------- SPIx CR1 Configuration ------------------------*/ + /* Get the SPIx CR1 value */ + tmpreg = SPIx->CR1; + /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ + tmpreg &= CR1_CLEAR_MASK; + /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler + master/salve mode, CPOL and CPHA */ + /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ + /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ + /* Set LSBFirst bit according to SPI_FirstBit value */ + /* Set BR bits according to SPI_BaudRatePrescaler value */ + /* Set CPOL bit according to SPI_CPOL value */ + /* Set CPHA bit according to SPI_CPHA value */ + tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + /* Write to SPIx CR1 */ + SPIx->CR1 = tmpreg; + + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD); +/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/** + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral + * (configured in I2S mode). + * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral + * configured in I2S mode. + * @note + * The function calculates the optimal prescaler needed to obtain the most + * accurate audio frequency (depending on the I2S clock source, the PLL values + * and the product configuration). But in case the prescaler value is greater + * than 511, the default value (0x02) will be configured instead. + * @retval None + */ +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + /* Check the I2S parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); + assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); + assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); + assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); + assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); + assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); + +/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ + /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ + SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; + SPIx->I2SPR = 0x0002; + + /* Get the I2SCFGR register value */ + tmpreg = SPIx->I2SCFGR; + + /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ + if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + /* If the requested audio frequency is not the default, compute the prescaler */ + else + { + /* Check the frame length (For the Prescaler computing) */ + if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) + { + /* Packet length is 16 bits */ + packetlength = 1; + } + else + { + /* Packet length is 32 bits */ + packetlength = 2; + } + + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreq(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SYSCLK_Frequency; + + /* Compute the Real divider depending on the MCLK output state with a flaoting point */ + if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) + { + /* MCLK output is enabled */ + tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + else + { + /* MCLK output is disabled */ + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + + /* Remove the flaoting point */ + tmp = tmp / 10; + + /* Check the parity of the divider */ + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + + /* Compute the i2sdiv prescaler */ + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + + /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ + i2sodd = (uint16_t) (i2sodd << 8); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + /* Set the default values */ + i2sdiv = 2; + i2sodd = 0; + } + + /* Write to SPIx I2SPR register the computed value */ + SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); + + /* Configure the I2S with the SPI_InitStruct values */ + tmpreg |= (uint16_t)(SPI_I2SCFGR_I2SMOD | (uint16_t)(I2S_InitStruct->I2S_Mode | \ + (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ + (uint16_t)I2S_InitStruct->I2S_CPOL)))); + + /* Write to SPIx I2SCFGR */ + SPIx->I2SCFGR = tmpreg; +} + +/** + * @brief Fills each SPI_InitStruct member with its default value. + * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure which will be initialized. + * @retval None + */ +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) +{ +/*--------------- Reset SPI init structure parameters values -----------------*/ + /* Initialize the SPI_Direction member */ + SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; + /* initialize the SPI_Mode member */ + SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; + /* initialize the SPI_DataSize member */ + SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; + /* Initialize the SPI_CPOL member */ + SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; + /* Initialize the SPI_CPHA member */ + SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; + /* Initialize the SPI_NSS member */ + SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; + /* Initialize the SPI_BaudRatePrescaler member */ + SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + /* Initialize the SPI_FirstBit member */ + SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; + /* Initialize the SPI_CRCPolynomial member */ + SPI_InitStruct->SPI_CRCPolynomial = 7; +} + +/** + * @brief Fills each I2S_InitStruct member with its default value. + * @param I2S_InitStruct: pointer to a I2S_InitTypeDef structure which will be initialized. + * @retval None + */ +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) +{ +/*--------------- Reset I2S init structure parameters values -----------------*/ + /* Initialize the I2S_Mode member */ + I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; + + /* Initialize the I2S_Standard member */ + I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; + + /* Initialize the I2S_DataFormat member */ + I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; + + /* Initialize the I2S_MCLKOutput member */ + I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; + + /* Initialize the I2S_AudioFreq member */ + I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; + + /* Initialize the I2S_CPOL member */ + I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; +} + +/** + * @brief Enables or disables the specified SPI peripheral. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral */ + SPIx->CR1 |= SPI_CR1_SPE; + } + else + { + /* Disable the selected SPI peripheral */ + SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_SPE); + } +} + +/** + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * @param SPIx: where x can be 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_23_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected SPI peripheral (in I2S mode) */ + SPIx->I2SCFGR |= SPI_I2SCFGR_I2SE; + } + else + { + /* Disable the selected SPI peripheral in I2S mode */ + SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SE); + } +} + +/** + * @brief Configures the data size for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_DataSize: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DataSize_16b: Set data frame format to 16bit. + * @arg SPI_DataSize_8b: Set data frame format to 8bit. + * @retval None. + */ +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DATASIZE(SPI_DataSize)); + /* Clear DFF bit */ + SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; + /* Set new DFF bit value */ + SPIx->CR1 |= SPI_DataSize; +} + +/** + * @brief Selects the data transfer direction in bidirectional mode for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_Direction: specifies the data transfer direction in bidirectional mode. + * This parameter can be one of the following values: + * @arg SPI_Direction_Tx: Selects Tx transmission direction. + * @arg SPI_Direction_Rx: Selects Rx receive direction. + * @retval None + */ +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_DIRECTION(SPI_Direction)); + if (SPI_Direction == SPI_Direction_Tx) + { + /* Set the Tx only mode */ + SPIx->CR1 |= SPI_Direction_Tx; + } + else + { + /* Set the Rx only mode */ + SPIx->CR1 &= SPI_Direction_Rx; + } +} + +/** + * @brief Configures internally by software the NSS pin for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. + * This parameter can be one of the following values: + * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally. + * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally. + * @retval None + */ +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); + if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) + { + /* Set NSS pin internally by software */ + SPIx->CR1 |= SPI_NSSInternalSoft_Set; + } + else + { + /* Reset NSS pin internally by software */ + SPIx->CR1 &= SPI_NSSInternalSoft_Reset; + } +} + +/** + * @brief Enables or disables the SS output for the selected SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx SS output. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI SS output */ + SPIx->CR2 |= (uint16_t)SPI_CR2_SSOE; + } + else + { + /* Disable the selected SPI SS output */ + SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_SSOE); + } +} + +/** + * @} + */ + +/** @defgroup SPI_Group2 Data transfers functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### Data transfers functions ##### + =============================================================================== +....[..] This section provides a set of functions allowing to manage the SPI data + transfers. +....[..] In reception, data are received and then stored into an internal Rx buffer + while In transmission, data are first stored into an internal Tx buffer + before being transmitted. +....[..] The read access of the SPI_DR register can be done using the + SPI_I2S_ReceiveData() function and returns the Rx buffered value. + Whereas a write access to the SPI_DR can be done using SPI_I2S_SendData() + function and stores the written data into Tx buffer. + +@endverbatim + * @{ + */ + +/** + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + * @retval The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the data in the DR register */ + return SPIx->DR; +} + +/** + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + * @param Data: Data to be transmitted. + * @retval None + */ +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Write in the DR register the data to be sent */ + SPIx->DR = Data; +} + +/** + * @} + */ + +/** @defgroup SPI_Group3 Hardware CRC Calculation functions + * @brief Hardware CRC Calculation functions + * +@verbatim + =============================================================================== + ##### Hardware CRC Calculation functions ##### + =============================================================================== + [..] This section provides a set of functions allowing to manage the SPI CRC + hardware calculation SPI communication using CRC is possible through + the following procedure: + (#) Program the Data direction, Polarity, Phase, First Data, Baud Rate + Prescaler, Slave Management, Peripheral Mode and CRC Polynomial + values using the SPI_Init() function. + (#) Enable the CRC calculation using the SPI_CalculateCRC() function. + (#) Enable the SPI using the SPI_Cmd() function. + (#) Before writing the last data to the TX buffer, set the CRCNext bit + using the SPI_TransmitCRC() function to indicate that after + transmission of the last data, the CRC should be transmitted. + (#) After transmitting the last data, the SPI transmits the CRC. + The SPI_CR1_CRCNEXT bit is reset. The CRC is also received and + compared against the SPI_RXCRCR value. + If the value does not match, the SPI_FLAG_CRCERR flag is set and an + interrupt can be generated when the SPI_I2S_IT_ERR interrupt is enabled. + -@- + (+@) It is advised to don't read the calculate CRC values during the communication. + (+@) When the SPI is in slave mode, be careful to enable CRC calculation only + when the clock is stable, that is, when the clock is in the steady state. + If not, a wrong CRC calculation may be done. In fact, the CRC is sensitive + to the SCK slave input clock as soon as CRCEN is set, and this, whatever + the value of the SPE bit. + (+@) With high bitrate frequencies, be careful when transmitting the CRC. + As the number of used CPU cycles has to be as low as possible in the CRC + transfer phase, it is forbidden to call software functions in the CRC + transmission sequence to avoid errors in the last data and CRC reception. + In fact, CRCNEXT bit has to be written before the end of the transmission/ + reception of the last data. + (+@) For high bit rate frequencies, it is advised to use the DMA mode to avoid the + degradation of the SPI speed performance due to CPU accesses impacting the + SPI bandwidth. + (+@) When the STM32L15xxx are configured as slaves and the NSS hardware mode is + used, the NSS pin needs to be kept low between the data phase and the CRC + phase. + (+@) When the SPI is configured in slave mode with the CRC feature enabled, CRC + calculation takes place even if a high level is applied on the NSS pin. + This may happen for example in case of a multislave environment where the + communication master addresses slaves alternately. + (+@) Between a slave deselection (high level on NSS) and a new slave selection + (low level on NSS), the CRC value should be cleared on both master and slave + sides in order to resynchronize the master and slave for their respective + CRC calculation. + -@- To clear the CRC, follow the procedure below: + (#@) Disable SPI using the SPI_Cmd() function + (#@) Disable the CRC calculation using the SPI_CalculateCRC() function. + (#@) Enable the CRC calculation using the SPI_CalculateCRC() function. + (#@) Enable SPI using the SPI_Cmd() function. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the CRC value calculation of the transferred bytes. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param NewState: new state of the SPIx CRC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the selected SPI CRC calculation */ + SPIx->CR1 |= SPI_CR1_CRCEN; + } + else + { + /* Disable the selected SPI CRC calculation */ + SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_CRCEN); + } +} + +/** + * @brief Transmit the SPIx CRC value. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval None + */ +void SPI_TransmitCRC(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Enable the selected SPI CRC transmission */ + SPIx->CR1 |= SPI_CR1_CRCNEXT; +} + +/** + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @param SPI_CRC: specifies the CRC register to be read. + * This parameter can be one of the following values: + * @arg SPI_CRC_Tx: Selects Tx CRC register. + * @arg SPI_CRC_Rx: Selects Rx CRC register. + * @retval The selected CRC register value. + */ +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_CRC(SPI_CRC)); + if (SPI_CRC != SPI_CRC_Rx) + { + /* Get the Tx CRC register */ + crcreg = SPIx->TXCRCR; + } + else + { + /* Get the Rx CRC register */ + crcreg = SPIx->RXCRCR; + } + /* Return the selected CRC register */ + return crcreg; +} + +/** + * @brief Returns the CRC Polynomial register value for the specified SPI. + * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. + * @retval The CRC Polynomial register value. + */ +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + + /* Return the CRC polynomial register */ + return SPIx->CRCPR; +} + +/** + * @} + */ + +/** @defgroup SPI_Group4 DMA transfers management functions + * @brief DMA transfers management functions + * +@verbatim + =============================================================================== + ##### DMA transfers management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + * @param SPI_I2S_DMAReq: specifies the SPI DMA transfer request to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request. + * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request. + * @param NewState: new state of the selected SPI DMA transfer request. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq)); + + if (NewState != DISABLE) + { + /* Enable the selected SPI DMA requests */ + SPIx->CR2 |= SPI_I2S_DMAReq; + } + else + { + /* Disable the selected SPI DMA requests */ + SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/** + * @} + */ + +/** @defgroup SPI_Group5 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + [..] This section provides a set of functions allowing to configure the SPI + Interrupts sources and check or clear the flags or pending bits status. + The user should identify which mode will be used in his application to + manage the communication: Polling mode, Interrupt mode or DMA mode. + *** Polling Mode *** + ==================== + [..] In Polling Mode, the SPI/I2S communication can be managed by 9 flags: + (#) SPI_I2S_FLAG_TXE : to indicate the status of the transmit buffer + register. + (#) SPI_I2S_FLAG_RXNE : to indicate the status of the receive buffer + register. + (#) SPI_I2S_FLAG_BSY : to indicate the state of the communication layer + of the SPI. + (#) SPI_FLAG_CRCERR : to indicate if a CRC Calculation error occur. + (#) SPI_FLAG_MODF : to indicate if a Mode Fault error occur. + (#) SPI_I2S_FLAG_OVR : to indicate if an Overrun error occur. + (#) SPI_I2S_FLAG_FRE: to indicate a Frame Format error occurs. + (#) I2S_FLAG_UDR: to indicate an Underrun error occurs. + (#) I2S_FLAG_CHSIDE: to indicate Channel Side. + -@- Do not use the BSY flag to handle each data transmission or reception. + It is better to use the TXE and RXNE flags instead. + [..] In this Mode it is advised to use the following functions: + (+) FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG). + (+) void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG). + + *** Interrupt Mode *** + ====================== + [..] In Interrupt Mode, the SPI communication can be managed by 3 interrupt + sources and 7 pending bits: + [..] Pending Bits: + (#) SPI_I2S_IT_TXE : to indicate the status of the transmit buffer register. + (#) SPI_I2S_IT_RXNE : to indicate the status of the receive buffer register. + (#) SPI_IT_CRCERR : to indicate if a CRC Calculation error occur. + (#) SPI_IT_MODF : to indicate if a Mode Fault error occur. + (#) SPI_I2S_IT_OVR : to indicate if an Overrun error occur. + (#) I2S_IT_UDR : to indicate an Underrun Error occurs. + (#) SPI_I2S_FLAG_FRE : to indicate a Frame Format error occurs. + [..] Interrupt Source: + (#) SPI_I2S_IT_TXE: specifies the interrupt source for the Tx buffer empty + interrupt. + (#) SPI_I2S_IT_RXNE : specifies the interrupt source for the Rx buffer not + empty interrupt. + (#) SPI_I2S_IT_ERR : specifies the interrupt source for the errors interrupt. + [..] In this Mode it is advised to use the following functions: + (+) void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, + FunctionalState NewState). + (+) ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT). + (+) void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT). + + *** DMA Mode *** + ================ + [..] In DMA Mode, the SPI communication can be managed by 2 DMA Channel + requests: + (#) SPI_I2S_DMAReq_Tx: specifies the Tx buffer DMA transfer request. + (#) SPI_I2S_DMAReq_Rx: specifies the Rx buffer DMA transfer request. + + [..] In this Mode it is advised to use the following function: + (+) void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, + FunctionalState NewState). + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified SPI/I2S interrupts. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + + * @param SPI_I2S_IT: specifies the SPI interrupt source to be enabled or disabled. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask. + * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask. + * @arg SPI_I2S_IT_ERR: Error interrupt mask. + * @param NewState: new state of the specified SPI interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) +{ + uint16_t itpos = 0, itmask = 0 ; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); + + /* Get the SPI IT index */ + itpos = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (NewState != DISABLE) + { + /* Enable the selected SPI interrupt */ + SPIx->CR2 |= itmask; + } + else + { + /* Disable the selected SPI interrupt */ + SPIx->CR2 &= (uint16_t)~itmask; + } +} + +/** + * @brief Checks whether the specified SPIx/I2Sx flag is set or not. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + + * @param SPI_I2S_FLAG: specifies the SPI flag to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. + * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. + * @arg SPI_I2S_FLAG_BSY: Busy flag. + * @arg SPI_I2S_FLAG_OVR: Overrun flag. + * @arg SPI_FLAG_MODF: Mode Fault flag. + * @arg SPI_FLAG_CRCERR: CRC Error flag. + * @arg SPI_I2S_FLAG_FRE: Format Error. + * @arg I2S_FLAG_UDR: Underrun Error flag. + * @arg I2S_FLAG_CHSIDE: Channel Side flag. + * @retval The new state of SPI_I2S_FLAG (SET or RESET). + */ +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); + + /* Check the status of the specified SPI flag */ + if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) + { + /* SPI_I2S_FLAG is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_FLAG is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_FLAG status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) flag. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + + * @param SPI_I2S_FLAG: specifies the SPI flag to clear. + * This function clears only CRCERR flag. + + * @note OVR (OverRun error) flag is cleared by software sequence: a read + * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()). + * @note UDR (UnderRun error) flag is cleared by a read operation to + * SPI_SR register (SPI_I2S_GetFlagStatus()). + * @note MODF (Mode Fault) flag is cleared by software sequence: a read/write + * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a + * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). + * @retval None + */ +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) +{ + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG)); + + /* Clear the selected SPI CRC Error (CRCERR) flag */ + SPIx->SR = (uint16_t)~SPI_I2S_FLAG; +} + +/** + * @brief Checks whether the specified SPIx/I2Sx interrupt has occurred or not. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + + * @param SPI_I2S_IT: specifies the SPI interrupt source to check. + * This parameter can be one of the following values: + * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. + * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. + * @arg SPI_I2S_IT_OVR: Overrun interrupt. + * @arg SPI_IT_MODF: Mode Fault interrupt. + * @arg SPI_IT_CRCERR: CRC Error interrupt. + * @arg I2S_IT_UDR: Underrun interrupt. + * @arg SPI_I2S_IT_FRE: Format Error interrupt. + * @retval The new state of SPI_I2S_IT (SET or RESET). + */ +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); + + /* Get the SPI_I2S_IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Get the SPI_I2S_IT IT mask */ + itmask = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (SPIx->CR2 & itmask) ; + + /* Check the status of the specified SPI interrupt */ + if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + /* Return the SPI_I2S_IT status */ + return bitstatus; +} + +/** + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 + * in SPI mode or 2 or 3 in I2S mode. + + * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. + * This function clears only CRCERR interrupt pending bit. + + * OVR (OverRun Error) interrupt pending bit is cleared by software + * sequence: a read operation to SPI_DR register (SPI_I2S_ReceiveData()) + * followed by a read operation to SPI_SR register (SPI_I2S_GetITStatus()). + * @note UDR (UnderRun Error) interrupt pending bit is cleared by a read + * operation to SPI_SR register (SPI_I2S_GetITStatus()). + * @note MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) + * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable + * the SPI). + * @retval None + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + /* Check the parameters */ + assert_param(IS_SPI_ALL_PERIPH(SPIx)); + assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); + + /* Get the SPI_I2S IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + SPIx->SR = (uint16_t)~itpos; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_syscfg.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_syscfg.c new file mode 100644 index 0000000..792bf4e --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_syscfg.c @@ -0,0 +1,652 @@ +/** + ****************************************************************************** + * @file stm32l1xx_syscfg.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the SYSCFG and RI peripherals: + * + SYSCFG Initialization and Configuration + * + RI Initialization and Configuration + * +@verbatim + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] This driver provides functions for: + (#) Remapping the memory accessible in the code area using + SYSCFG_MemoryRemapConfig(). + (#) Manage the EXTI lines connection to the GPIOs using + SYSCFG_EXTILineConfig(). + (#) Routing of I/Os toward the input captures of timers (TIM2, TIM3 and TIM4). + (#) Input routing of COMP1 and COMP2. + (#) Routing of internal reference voltage VREFINT to PB0 and PB1. + (#) The RI registers can be accessed only when the comparator + APB interface clock is enabled. + To enable comparator clock use: + RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP, ENABLE). + Following functions uses RI registers: + (++) SYSCFG_RIDeInit() + (++) SYSCFG_RITIMSelect() + (++) SYSCFG_RITIMInputCaptureConfig() + (++) SYSCFG_RIResistorConfig() + (++) SYSCFG_RIChannelSpeedConfig() + (++) SYSCFG_RIIOSwitchConfig() + (++) SYSCFG_RISwitchControlModeCmd() + (++) SYSCFG_RIHysteresisConfig() + (#) The SYSCFG registers can be accessed only when the SYSCFG + interface APB clock is enabled. + To enable SYSCFG APB clock use: + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + Following functions uses SYSCFG registers: + (++) SYSCFG_DeInit() + (++) SYSCFG_MemoryRemapConfig() + (++) SYSCFG_GetBootMode() + (++) SYSCFG_USBPuCmd() + (++) SYSCFG_EXTILineConfig() +@endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_syscfg.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup SYSCFG + * @brief SYSCFG driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define TIM_SELECT_MASK ((uint32_t)0xFFFCFFFF) /*!< TIM select mask */ +#define IC_ROUTING_MASK ((uint32_t)0x0000000F) /*!< Input Capture routing mask */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup SYSCFG_Private_Functions + * @{ + */ + +/** @defgroup SYSCFG_Group1 SYSCFG Initialization and Configuration functions + * @brief SYSCFG Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### SYSCFG Initialization and Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the SYSCFG registers to their default reset values. + * @param None. + * @retval None. + * @Note: MEMRMP bits are not reset by APB2 reset. + */ +void SYSCFG_DeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, DISABLE); +} + +/** + * @brief Deinitializes the RI registers to their default reset values. + * @param None. + * @retval None. + */ +void SYSCFG_RIDeInit(void) +{ + RI->ICR = ((uint32_t)0x00000000); /*!< Set RI->ICR to reset value */ + RI->ASCR1 = ((uint32_t)0x00000000); /*!< Set RI->ASCR1 to reset value */ + RI->ASCR2 = ((uint32_t)0x00000000); /*!< Set RI->ASCR2 to reset value */ + RI->HYSCR1 = ((uint32_t)0x00000000); /*!< Set RI->HYSCR1 to reset value */ + RI->HYSCR2 = ((uint32_t)0x00000000); /*!< Set RI->HYSCR2 to reset value */ + RI->HYSCR3 = ((uint32_t)0x00000000); /*!< Set RI->HYSCR3 to reset value */ + RI->HYSCR4 = ((uint32_t)0x00000000); /*!< Set RI->HYSCR4 to reset value */ +} + +/** + * @brief Changes the mapping of the specified memory. + * @param SYSCFG_Memory: selects the memory remapping. + * This parameter can be one of the following values: + * @arg SYSCFG_MemoryRemap_Flash: Main Flash memory mapped at 0x00000000 + * @arg SYSCFG_MemoryRemap_SystemFlash: System Flash memory mapped at 0x00000000 + * @arg SYSCFG_MemoryRemap_FSMC: FSMC memory mapped at 0x00000000 + * @arg SYSCFG_MemoryRemap_SRAM: Embedded SRAM mapped at 0x00000000 + * @retval None + */ +void SYSCFG_MemoryRemapConfig(uint8_t SYSCFG_MemoryRemap) +{ + /* Check the parameters */ + assert_param(IS_SYSCFG_MEMORY_REMAP_CONFING(SYSCFG_MemoryRemap)); + SYSCFG->MEMRMP = SYSCFG_MemoryRemap; +} + +/** + * @brief Returns the boot mode as configured by user. + * @param None. + * @retval The boot mode as configured by user. The returned value can be one + * of the following values: + * - 0x00000000: Boot is configured in Main Flash memory + * - 0x00000100: Boot is configured in System Flash memory + * - 0x00000200: Boot is configured in FSMC memory + * - 0x00000300: Boot is configured in Embedded SRAM memory + */ +uint32_t SYSCFG_GetBootMode(void) +{ + return (SYSCFG->MEMRMP & SYSCFG_MEMRMP_BOOT_MODE); +} + +/** + * @brief Control the internal pull-up on USB DP line. + * @param NewState: New state of the internal pull-up on USB DP line. + * This parameter can be ENABLE: Connect internal pull-up on USB DP line. + * or DISABLE: Disconnect internal pull-up on USB DP line. + * @retval None + */ +void SYSCFG_USBPuCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Connect internal pull-up on USB DP line */ + SYSCFG->PMC |= (uint32_t) SYSCFG_PMC_USB_PU; + } + else + { + /* Disconnect internal pull-up on USB DP line */ + SYSCFG->PMC &= (uint32_t)(~SYSCFG_PMC_USB_PU); + } +} + +/** + * @brief Selects the GPIO pin used as EXTI Line. + * @param EXTI_PortSourceGPIOx : selects the GPIO port to be used as source + * for EXTI lines where x can be (A, B, C, D, E, F, G or H). + * @param EXTI_PinSourcex: specifies the EXTI line to be configured. + * This parameter can be EXTI_PinSourcex where x can be (0..15). + * @retval None + */ +void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex) +{ + uint32_t tmp = 0x00; + + /* Check the parameters */ + assert_param(IS_EXTI_PORT_SOURCE(EXTI_PortSourceGPIOx)); + assert_param(IS_EXTI_PIN_SOURCE(EXTI_PinSourcex)); + + tmp = ((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03)); + SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= ~tmp; + SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] |= (((uint32_t)EXTI_PortSourceGPIOx) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03))); +} + +/** + * @} + */ + +/** @defgroup SYSCFG_Group2 RI Initialization and Configuration functions + * @brief RI Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### RI Initialization and Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the routing interface to select which Timer to be routed. + * @note Routing capability can be applied only on one of the three timers + * (TIM2, TIM3 or TIM4) at a time. + * @param TIM_Select: Timer select. + * This parameter can be one of the following values: + * @arg TIM_Select_None: No timer selected and default Timer mapping is enabled. + * @arg TIM_Select_TIM2: Timer 2 Input Captures to be routed. + * @arg TIM_Select_TIM3: Timer 3 Input Captures to be routed. + * @arg TIM_Select_TIM4: Timer 4 Input Captures to be routed. + * @retval None. + */ +void SYSCFG_RITIMSelect(uint32_t TIM_Select) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RI_TIM(TIM_Select)); + + /* Get the old register value */ + tmpreg = RI->ICR; + + /* Clear the TIMx select bits */ + tmpreg &= TIM_SELECT_MASK; + + /* Select the Timer */ + tmpreg |= (TIM_Select); + + /* Write to RI->ICR register */ + RI->ICR = tmpreg; +} + +/** + * @brief Configures the routing interface to map Input Capture 1, 2, 3 or 4 + * to a selected I/O pin. + * @param RI_InputCapture selects which input capture to be routed. + * This parameter can be one (or combination) of the following parameters: + * @arg RI_InputCapture_IC1: Input capture 1 is selected. + * @arg RI_InputCapture_IC2: Input capture 2 is selected. + * @arg RI_InputCapture_IC3: Input capture 3 is selected. + * @arg RI_InputCapture_IC4: Input capture 4 is selected. + * @param RI_InputCaptureRouting: selects which pin to be routed to Input Capture. + * This parameter can be one of the following values: + * @param RI_InputCaptureRouting_0 to RI_InputCaptureRouting_15 + * e.g. + * SYSCFG_RITIMSelect(TIM_Select_TIM2) + * SYSCFG_RITIMInputCaptureConfig(RI_InputCapture_IC1, RI_InputCaptureRouting_1) + * allows routing of Input capture IC1 of TIM2 to PA4. + * For details about correspondence between RI_InputCaptureRouting_x + * and I/O pins refer to the parameters' description in the header file + * or refer to the product reference manual. + * @note Input capture selection bits are not reset by this function. + * To reset input capture selection bits, use SYSCFG_RIDeInit() function. + * @note The I/O should be configured in alternate function mode (AF14) using + * GPIO_PinAFConfig() function. + * @retval None. + */ +void SYSCFG_RITIMInputCaptureConfig(uint32_t RI_InputCapture, uint32_t RI_InputCaptureRouting) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_RI_INPUTCAPTURE(RI_InputCapture)); + assert_param(IS_RI_INPUTCAPTURE_ROUTING(RI_InputCaptureRouting)); + + /* Get the old register value */ + tmpreg = RI->ICR; + + /* Select input captures to be routed */ + tmpreg |= (RI_InputCapture); + + if((RI_InputCapture & RI_InputCapture_IC1) == RI_InputCapture_IC1) + { + /* Clear the input capture select bits */ + tmpreg &= (uint32_t)(~IC_ROUTING_MASK); + + /* Set RI_InputCaptureRouting bits */ + tmpreg |= (uint32_t)( RI_InputCaptureRouting); + } + + if((RI_InputCapture & RI_InputCapture_IC2) == RI_InputCapture_IC2) + { + /* Clear the input capture select bits */ + tmpreg &= (uint32_t)(~(IC_ROUTING_MASK << 4)); + + /* Set RI_InputCaptureRouting bits */ + tmpreg |= (uint32_t)( (RI_InputCaptureRouting << 4)); + } + + if((RI_InputCapture & RI_InputCapture_IC3) == RI_InputCapture_IC3) + { + /* Clear the input capture select bits */ + tmpreg &= (uint32_t)(~(IC_ROUTING_MASK << 8)); + + /* Set RI_InputCaptureRouting bits */ + tmpreg |= (uint32_t)( (RI_InputCaptureRouting << 8)); + } + + if((RI_InputCapture & RI_InputCapture_IC4) == RI_InputCapture_IC4) + { + /* Clear the input capture select bits */ + tmpreg &= (uint32_t)(~(IC_ROUTING_MASK << 12)); + + /* Set RI_InputCaptureRouting bits */ + tmpreg |= (uint32_t)( (RI_InputCaptureRouting << 12)); + } + + /* Write to RI->ICR register */ + RI->ICR = tmpreg; +} + +/** + * @brief Configures the Pull-up and Pull-down Resistors + * @param RI_Resistor selects the resistor to connect. + * This parameter can be one of the following values: + * @arg RI_Resistor_10KPU: 10K pull-up resistor. + * @arg RI_Resistor_400KPU: 400K pull-up resistor. + * @arg RI_Resistor_10KPD: 10K pull-down resistor. + * @arg RI_Resistor_400KPD: 400K pull-down resistor. + * @param NewState: New state of the analog switch associated to the selected + * resistor. + * This parameter can be: + * ENABLE so the selected resistor is connected + * or DISABLE so the selected resistor is disconnected. + * @note To avoid extra power consumption, only one resistor should be enabled + * at a time. + * @retval None + */ +void SYSCFG_RIResistorConfig(uint32_t RI_Resistor, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RI_RESISTOR(RI_Resistor)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the resistor */ + COMP->CSR |= (uint32_t) RI_Resistor; + } + else + { + /* Disable the Resistor */ + COMP->CSR &= (uint32_t) (~RI_Resistor); + } +} + +/** + * @brief Configures the ADC channels speed. + * @param RI_Channel selects the channel. + * This parameter can be one of the following values: + * @arg RI_Channel_3: Channel 3 is selected. + * @arg RI_Channel_8: Channel 8 is selected. + * @arg RI_Channel_13: Channel 13 is selected. + * @param RI_ChannelSpeed: The speed of the selected ADC channel + * This parameter can be: + * RI_ChannelSpeed_Fast: The selected channel is a fast ADC channel + * or RI_ChannelSpeed_Slow: The selected channel is a slow ADC channel. + * @retval None + */ +void SYSCFG_RIChannelSpeedConfig(uint32_t RI_Channel, uint32_t RI_ChannelSpeed) +{ + /* Check the parameters */ + assert_param(IS_RI_CHANNEL(RI_Channel)); + assert_param(IS_RI_CHANNELSPEED(RI_ChannelSpeed)); + + if(RI_ChannelSpeed != RI_ChannelSpeed_Fast) + { + /* Set the selected channel as a slow ADC channel */ + COMP->CSR &= (uint32_t) (~RI_Channel); + } + else + { + /* Set the selected channel as a fast ADC channel */ + COMP->CSR |= (uint32_t) (RI_Channel); + } +} + +/** + * @brief Close or Open the routing interface Input Output switches. + * @param RI_IOSwitch: selects the I/O analog switch number. + * This parameter can be one of the following values: + * @param RI_IOSwitch_CH0 --> RI_IOSwitch_CH15. + * @param RI_IOSwitch_CH18 --> RI_IOSwitch_CH25. + * @param RI_IOSwitch_GR10_1 --> RI_IOSwitch_GR10_4. + * @param RI_IOSwitch_GR6_1 --> RI_IOSwitch_GR6_2. + * @param RI_IOSwitch_GR5_1 --> RI_IOSwitch_GR5_3. + * @param RI_IOSwitch_GR4_1 --> RI_IOSwitch_GR4_3. + * @param RI_IOSwitch_VCOMP + * RI_IOSwitch_CH27 + * @param RI_IOSwitch_CH28 --> RI_IOSwitch_CH30 + * @param RI_IOSwitch_GR10_1 --> RI_IOSwitch_GR10_4 + * @param RI_IOSwitch_GR6_1 + * @param RI_IOSwitch_GR6_2 + * @param RI_IOSwitch_GR5_1 --> RI_IOSwitch_GR5_3 + * @param RI_IOSwitch_GR4_1 --> RI_IOSwitch_GR4_4 + * @param RI_IOSwitch_CH0b --> RI_IOSwitch_CH3b + * @param RI_IOSwitch_CH6b --> RI_IOSwitch_CH12b + * @param RI_IOSwitch_GR6_3 + * @param RI_IOSwitch_GR6_4 + * @param RI_IOSwitch_GR5_4 + + * @param NewState: New state of the analog switch. + * This parameter can be + * ENABLE so the Input Output switch is closed + * or DISABLE so the Input Output switch is open. + * @retval None + */ +void SYSCFG_RIIOSwitchConfig(uint32_t RI_IOSwitch, FunctionalState NewState) +{ + uint32_t ioswitchmask = 0; + + /* Check the parameters */ + assert_param(IS_RI_IOSWITCH(RI_IOSwitch)); + + /* Read Analog switch register index */ + ioswitchmask = RI_IOSwitch >> 31; + + /* Get Bits[30:0] of the IO switch */ + RI_IOSwitch &= 0x7FFFFFFF; + + + if (NewState != DISABLE) + { + if (ioswitchmask != 0) + { + /* Close the analog switches */ + RI->ASCR1 |= RI_IOSwitch; + } + else + { + /* Open the analog switches */ + RI->ASCR2 |= RI_IOSwitch; + } + } + else + { + if (ioswitchmask != 0) + { + /* Close the analog switches */ + RI->ASCR1 &= (~ (uint32_t)RI_IOSwitch); + } + else + { + /* Open the analog switches */ + RI->ASCR2 &= (~ (uint32_t)RI_IOSwitch); + } + } +} + +/** + * @brief Enable or disable the switch control mode. + * @param NewState: New state of the switch control mode. This parameter can + * be ENABLE: ADC analog switches closed if the corresponding + * I/O switch is also closed. + * When using COMP1, switch control mode must be enabled. + * or DISABLE: ADC analog switches open or controlled by the ADC interface. + * When using the ADC for acquisition, switch control mode + * must be disabled. + * @note COMP1 comparator and ADC cannot be used at the same time since + * they share the ADC switch matrix. + * @retval None + */ +void SYSCFG_RISwitchControlModeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Switch control mode */ + RI->ASCR1 |= (uint32_t) RI_ASCR1_SCM; + } + else + { + /* Disable the Switch control mode */ + RI->ASCR1 &= (uint32_t)(~RI_ASCR1_SCM); + } +} + +/** + * @brief Enable or disable Hysteresis of the input schmitt triger of Ports A..E + * When the I/Os are programmed in input mode by standard I/O port + * registers, the Schmitt trigger and the hysteresis are enabled by default. + * When hysteresis is disabled, it is possible to read the + * corresponding port with a trigger level of VDDIO/2. + * @param RI_Port: selects the GPIO Port. + * This parameter can be one of the following values: + * @arg RI_PortA: Port A is selected + * @arg RI_PortB: Port B is selected + * @arg RI_PortC: Port C is selected + * @arg RI_PortD: Port D is selected + * @arg RI_PortE: Port E is selected + * @arg RI_PortF: Port F is selected + * @arg RI_PortG: Port G is selected + * @param RI_Pin : Selects the pin(s) on which to enable or disable hysteresis. + * This parameter can any value from RI_Pin_x where x can be (0..15) or RI_Pin_All. + * @param NewState new state of the Hysteresis. + * This parameter can be: + * ENABLE so the Hysteresis is on + * or DISABLE so the Hysteresis is off + * @retval None + */ +void SYSCFG_RIHysteresisConfig(uint8_t RI_Port, uint16_t RI_Pin, + FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RI_PORT(RI_Port)); + assert_param(IS_RI_PIN(RI_Pin)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if(RI_Port == RI_PortA) + { + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR1 &= (uint32_t)~((uint32_t)RI_Pin); + } + else + { + /* Hysteresis off */ + RI->HYSCR1 |= (uint32_t) RI_Pin; + } + } + + else if(RI_Port == RI_PortB) + { + + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR1 &= (uint32_t) (~((uint32_t)RI_Pin) << 16); + } + else + { + /* Hysteresis off */ + RI->HYSCR1 |= (uint32_t) ((uint32_t)(RI_Pin) << 16); + } + } + + else if(RI_Port == RI_PortC) + { + + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR2 &= (uint32_t) (~((uint32_t)RI_Pin)); + } + else + { + /* Hysteresis off */ + RI->HYSCR2 |= (uint32_t) (RI_Pin ); + } + } + else if(RI_Port == RI_PortD) + { + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR2 &= (uint32_t) (~((uint32_t)RI_Pin) << 16); + } + else + { + /* Hysteresis off */ + RI->HYSCR2 |= (uint32_t) ((uint32_t)(RI_Pin) << 16); + + } + } + else if(RI_Port == RI_PortE) + { + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR3 &= (uint32_t) (~((uint32_t)RI_Pin)); + } + else + { + /* Hysteresis off */ + RI->HYSCR3 |= (uint32_t) (RI_Pin ); + } + } + else if(RI_Port == RI_PortF) + { + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR3 &= (uint32_t) (~((uint32_t)RI_Pin) << 16); + } + else + { + /* Hysteresis off */ + RI->HYSCR3 |= (uint32_t) ((uint32_t)(RI_Pin) << 16); + } + } + else /* RI_Port == RI_PortG */ + { + if (NewState != DISABLE) + { + /* Hysteresis on */ + RI->HYSCR4 &= (uint32_t) (~((uint32_t)RI_Pin)); + } + else + { + /* Hysteresis off */ + RI->HYSCR4 |= (uint32_t) (RI_Pin); + } + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_tim.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_tim.c new file mode 100644 index 0000000..3ff4319 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_tim.c @@ -0,0 +1,2843 @@ +/** + ****************************************************************************** + * @file stm32l1xx_tim.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the TIM peripheral: + * + TimeBase management + * + Output Compare management + * + Input Capture management + * + Interrupts, DMA and flags management + * + Clocks management + * + Synchronization management + * + Specific interface management + * + Specific remapping management + * +* @verbatim + + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] This driver provides functions to configure and program the TIM + of all STM32L1xx devices These functions are split in 8 groups: + (#) TIM TimeBase management: this group includes all needed functions + to configure the TM Timebase unit: + (++) Set/Get Prescaler. + (++) Set/Get Autoreload. + (++) Counter modes configuration. + (++) Set Clock division. + (++) Select the One Pulse mode. + (++) Update Request Configuration. + (++) Update Disable Configuration. + (++) Auto-Preload Configuration. + (++) Enable/Disable the counter. + + (#) TIM Output Compare management: this group includes all needed + functions to configure the Capture/Compare unit used in Output + compare mode: + (++) Configure each channel, independently, in Output Compare mode. + (++) Select the output compare modes. + (++) Select the Polarities of each channel. + (++) Set/Get the Capture/Compare register values. + (++) Select the Output Compare Fast mode. + (++) Select the Output Compare Forced mode. + (++) Output Compare-Preload Configuration. + (++) Clear Output Compare Reference. + (++) Select the OCREF Clear signal. + (++) Enable/Disable the Capture/Compare Channels. + + (#) TIM Input Capture management: this group includes all needed + functions to configure the Capture/Compare unit used in + Input Capture mode: + (++) Configure each channel in input capture mode. + (++) Configure Channel1/2 in PWM Input mode. + (++) Set the Input Capture Prescaler. + (++) Get the Capture/Compare values. + + (#) TIM interrupts, DMA and flags management. + (++) Enable/Disable interrupt sources. + (++) Get flags status. + (++) Clear flags/ Pending bits. + (++) Enable/Disable DMA requests. + (++) Configure DMA burst mode. + (++) Select CaptureCompare DMA request. + + (#) TIM clocks management: this group includes all needed functions + to configure the clock controller unit: + (++) Select internal/External clock. + (++) Select the external clock mode: ETR(Mode1/Mode2), TIx or ITRx. + + (#) TIM synchronization management: this group includes all needed. + functions to configure the Synchronization unit: + (++) Select Input Trigger. + (++) Select Output Trigger. + (++) Select Master Slave Mode. + (++) ETR Configuration when used as external trigger. + + (#) TIM specific interface management, this group includes all + needed functions to use the specific TIM interface: + (++) Encoder Interface Configuration. + (++) Select Hall Sensor. + + (#) TIM specific remapping management includes the Remapping + configuration of specific timers + +@endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_tim.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup TIM + * @brief TIM driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* ---------------------- TIM registers bit mask ------------------------ */ +#define SMCR_ETR_MASK ((uint16_t)0x00FF) +#define CCMR_OFFSET ((uint16_t)0x0018) +#define CCER_CCE_SET ((uint16_t)0x0001) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup TIM_Private_Functions + * @{ + */ + +/** @defgroup TIM_Group1 TimeBase management functions + * @brief TimeBase management functions + * +@verbatim + =============================================================================== + ##### TimeBase management functions ##### + =============================================================================== + + *** TIM Driver: how to use it in Timing(Time base) Mode *** + =============================================================================== + [..] To use the Timer in Timing(Time base) mode, the following steps are + mandatory: + (#) Enable TIM clock using + RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function. + (#) Fill the TIM_TimeBaseInitStruct with the desired parameters. + (#) Call TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct) to configure + the Time Base unit with the corresponding configuration. + (#) Enable the NVIC if you need to generate the update interrupt. + (#) Enable the corresponding interrupt using the function + TIM_ITConfig(TIMx, TIM_IT_Update). + (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. + [..] + (@) All other functions can be used seperatly to modify, if needed, + a specific feature of the Timer. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the TIMx peripheral registers to their default reset values. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @retval None + * + */ +void TIM_DeInit(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + if (TIMx == TIM2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); + } + else if (TIMx == TIM3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); + } + else if (TIMx == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if (TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); + } + else if (TIMx == TIM6) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); + } + else if (TIMx == TIM7) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); + } + + else if (TIMx == TIM9) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE); + } + else if (TIMx == TIM10) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE); + } + else + { + if (TIMx == TIM11) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE); + } + } + +} + +/** + * @brief Initializes the TIMx Time Base Unit peripheral according to + * the specified parameters in the TIM_TimeBaseInitStruct. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef + * structure that contains the configuration information for + * the specified TIM peripheral. + * @retval None + */ +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + uint16_t tmpcr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); + assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); + + tmpcr1 = TIMx->CR1; + + if(((TIMx) == TIM2) || ((TIMx) == TIM3) || ((TIMx) == TIM4) || ((TIMx) == TIM5)) + { + /* Select the Counter Mode */ + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; + } + + if(((TIMx) != TIM6) && ((TIMx) != TIM7)) + { + /* Set the clock division */ + tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; + } + + TIMx->CR1 = tmpcr1; + + /* Set the Autoreload value */ + TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; + + /* Set the Prescaler value */ + TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; + + /* Generate an update event to reload the Prescaler value immediatly */ + TIMx->EGR = TIM_PSCReloadMode_Immediate; +} + +/** + * @brief Fills each TIM_TimeBaseInitStruct member with its default value. + * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef + * structure which will be initialized. + * @retval None + */ +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) +{ + /* Set the default configuration */ + TIM_TimeBaseInitStruct->TIM_Period = 0xFFFFFFFF; + TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; + TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; +} + +/** + * @brief Configures the TIMx Prescaler. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param Prescaler: specifies the Prescaler Register value. + * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode + * This parameter can be one of the following values: + * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. + * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly. + * @retval None + */ +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); + + /* Set the Prescaler value */ + TIMx->PSC = Prescaler; + /* Set or reset the UG Bit */ + TIMx->EGR = TIM_PSCReloadMode; +} + +/** + * @brief Specifies the TIMx Counter Mode to be used. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_CounterMode: specifies the Counter Mode to be used + * This parameter can be one of the following values: + * @arg TIM_CounterMode_Up: TIM Up Counting Mode. + * @arg TIM_CounterMode_Down: TIM Down Counting Mode. + * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1. + * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2. + * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3. + * @retval None + */ +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) +{ + uint16_t tmpcr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); + + tmpcr1 = TIMx->CR1; + /* Reset the CMS and DIR Bits */ + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); + /* Set the Counter Mode */ + tmpcr1 |= TIM_CounterMode; + /* Write to TIMx CR1 register */ + TIMx->CR1 = tmpcr1; +} + +/** + * @brief Sets the TIMx Counter Register value + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param Counter: specifies the Counter register new value. + * @retval None + */ +void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + /* Set the Counter Register value */ + TIMx->CNT = Counter; +} + +/** + * @brief Sets the TIMx Autoreload Register value + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param Autoreload: specifies the Autoreload register new value. + * @retval None + */ +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + /* Set the Autoreload Register value */ + TIMx->ARR = Autoreload; +} + +/** + * @brief Gets the TIMx Counter value. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @retval Counter Register value. + */ +uint32_t TIM_GetCounter(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + /* Get the Counter Register value */ + return TIMx->CNT; +} + +/** + * @brief Gets the TIMx Prescaler value. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @retval Prescaler Register value. + */ +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + + /* Get the Prescaler Register value */ + return TIMx->PSC; +} + +/** + * @brief Enables or Disables the TIMx Update event. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param NewState: new state of the TIMx UDIS bit + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the Update Disable Bit */ + TIMx->CR1 |= TIM_CR1_UDIS; + } + else + { + /* Reset the Update Disable Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS); + } +} + +/** + * @brief Configures the TIMx Update Request Interrupt source. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_UpdateSource: specifies the Update source. + * This parameter can be one of the following values: + * @arg TIM_UpdateSource_Global: Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. + * @arg TIM_UpdateSource_Regular: Source of update is counter overflow/underflow. + * @retval None + */ +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); + + if (TIM_UpdateSource != TIM_UpdateSource_Global) + { + /* Set the URS Bit */ + TIMx->CR1 |= TIM_CR1_URS; + } + else + { + /* Reset the URS Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_URS); + } +} + +/** + * @brief Enables or disables TIMx peripheral Preload register on ARR. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param NewState: new state of the TIMx peripheral Preload register + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the ARR Preload Bit */ + TIMx->CR1 |= TIM_CR1_ARPE; + } + else + { + /* Reset the ARR Preload Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE); + } +} + +/** + * @brief Selects the TIMx's One Pulse Mode. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_OPMode: specifies the OPM Mode to be used. + * This parameter can be one of the following values: + * @arg TIM_OPMode_Single:: TIM One Pulse Single Mode (Counter stops counting + * at the next update event (clearing the bit CEN)). + * @arg TIM_OPMode_Repetitive: TIM One Pulse Repetitive Mode + * (Counter is not stopped at update event). + * @retval None + */ +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); + + /* Reset the OPM Bit */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM); + /* Configure the OPM Mode */ + TIMx->CR1 |= TIM_OPMode; +} + +/** + * @brief Sets the TIMx Clock Division value. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_CKD: specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CKD_DIV1: TDTS = Tck_tim. + * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim. + * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim. + * @retval None + */ +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_CKD_DIV(TIM_CKD)); + + /* Reset the CKD Bits */ + TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD); + /* Set the CKD value */ + TIMx->CR1 |= TIM_CKD; +} + +/** + * @brief Enables or disables the specified TIM peripheral. + * @param TIMx: where x can be 2 to 11 to select the TIMx peripheral. + * @param NewState: new state of the TIMx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the TIM Counter */ + TIMx->CR1 |= TIM_CR1_CEN; + } + else + { + /* Disable the TIM Counter */ + TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); + } +} + +/** + * @} + */ + +/** @defgroup TIM_Group2 Output Compare management functions + * @brief Output Compare management functions + * +@verbatim + =============================================================================== + ##### Output Compare management functions ##### + =============================================================================== + *** TIM Driver: how to use it in Output Compare Mode *** + =============================================================================== + [..] To use the Timer in Output Compare mode, the following steps are mandatory: + (#) Enable TIM clock using + RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function. + (#) Configure the TIM pins by configuring the corresponding GPIO pins + (#) Configure the Time base unit as described in the first part of this + driver, if needed, else the Timer will run with the default + configuration: + (++) Autoreload value = 0xFFFF. + (++) Prescaler value = 0x0000. + (++) Counter mode = Up counting. + (++) Clock Division = TIM_CKD_DIV1. + (#) Fill the TIM_OCInitStruct with the desired parameters including: + (++) The TIM Output Compare mode: TIM_OCMode. + (++) TIM Output State: TIM_OutputState. + (++) TIM Pulse value: TIM_Pulse. + (++) TIM Output Compare Polarity : TIM_OCPolarity. + (#) Call TIM_OCxInit(TIMx, &TIM_OCInitStruct) to configure the desired + channel with the corresponding configuration. + (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. + [..] + (@) All other functions can be used separately to modify, if needed, + a specific feature of the Timer. + (@) In case of PWM mode, this function is mandatory: + TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE). + (@) If the corresponding interrupt or DMA request are needed, the user should: + (#@) Enable the NVIC (or the DMA) to use the TIM interrupts (or DMA requests). + (#@) Enable the corresponding interrupt (or DMA request) using the function + TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)). + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S)); + + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P)); + /* Set the Output Compare Polarity */ + tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; + + /* Set the Output State */ + tmpccer |= TIM_OCInitStruct->TIM_OutputState; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel2 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M)); + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel3 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M)); + + /* Select the Output Compare Mode */ + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Initializes the TIMx Channel4 according to the specified + * parameters in the TIM_OCInitStruct. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); + assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); + + /* Disable the Channel 2: Reset the CC4E Bit */ + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E)); + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M)); + + /* Select the Output Compare Mode */ + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P)); + /* Set the Output Compare Polarity */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); + + /* Set the Output State */ + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Fills each TIM_OCInitStruct member with its default value. + * @param TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) +{ + /* Set the default configuration */ + TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; + TIM_OCInitStruct->TIM_Pulse = 0x0000; + TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; +} + +/** + * @brief Selects the TIM Output Compare Mode. + * @note This function disables the selected channel before changing the Output + * Compare Mode. + * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel. + * This parameter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1. + * @arg TIM_Channel_2: TIM Channel 2. + * @arg TIM_Channel_3: TIM Channel 3. + * @arg TIM_Channel_4: TIM Channel 4. + * @param TIM_OCMode: specifies the TIM Output Compare Mode. + * This parameter can be one of the following values: + * @arg TIM_OCMode_Timing: TIM Output Compare Timing mode. + * @arg TIM_OCMode_Active: TIM Output Compare Active mode. + * @arg TIM_OCMode_Inactive: TIM Output Compare Inactive mode. + * @arg TIM_OCMode_Toggle: TIM Output Compare Toggle mode. + * @arg TIM_OCMode_PWM1: TIM Output Compare PWM1 mode. + * @arg TIM_OCMode_PWM2: TIM Output Compare PWM2 mode. + * @arg TIM_ForcedAction_Active: TIM Forced Action Active mode. + * @arg TIM_ForcedAction_InActive: TIM Forced Action Inactive mode. + * @retval None + */ +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) +{ + uint32_t tmp = 0; + uint16_t tmp1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCM(TIM_OCMode)); + + tmp = (uint32_t) TIMx; + tmp += CCMR_OFFSET; + + tmp1 = CCER_CCE_SET << (uint16_t)TIM_Channel; + + /* Disable the Channel: Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t) ~tmp1; + + if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) + { + tmp += (TIM_Channel>>1); + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } + else + { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; + + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); + + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); + } +} + +/** + * @brief Sets the TIMx Capture Compare1 Register value + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param Compare1: specifies the Capture Compare1 register new value. + * @retval None + */ +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + + /* Set the Capture Compare1 Register value */ + TIMx->CCR1 = Compare1; +} + +/** + * @brief Sets the TIMx Capture Compare2 Register value. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param Compare2: specifies the Capture Compare2 register new value. + * @retval None + */ +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + + /* Set the Capture Compare2 Register value */ + TIMx->CCR2 = Compare2; +} + +/** + * @brief Sets the TIMx Capture Compare3 Register value. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param Compare3: specifies the Capture Compare3 register new value. + * @retval None + */ +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + + /* Set the Capture Compare3 Register value */ + TIMx->CCR3 = Compare3; +} + +/** + * @brief Sets the TIMx Capture Compare4 Register value. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param Compare4: specifies the Capture Compare4 register new value. + * @retval None + */ +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + + /* Set the Capture Compare4 Register value */ + TIMx->CCR4 = Compare4; +} + +/** + * @brief Forces the TIMx output 1 waveform to active or inactive level. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC1REF. + * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. + * @retval None + */ +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1M Bits */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M); + /* Configure The Forced output Mode */ + tmpccmr1 |= TIM_ForcedAction; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 2 waveform to active or inactive level. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM + * peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC2REF. + * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. + * @retval None + */ +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2M Bits */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M); + /* Configure The Forced output Mode */ + tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Forces the TIMx output 3 waveform to active or inactive level. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC3REF. + * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. + * @retval None + */ +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC1M Bits */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M); + /* Configure The Forced output Mode */ + tmpccmr2 |= TIM_ForcedAction; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Forces the TIMx output 4 waveform to active or inactive level. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * @arg TIM_ForcedAction_Active: Force active level on OC4REF. + * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. + * @retval None + */ +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC2M Bits */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M); + /* Configure The Forced output Mode */ + tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR1. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register. + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable: Enable TIM output compare Preload + * @arg TIM_OCPreload_Disable: Disable TIM output compare Preload + * @retval None + */ +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1PE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= TIM_OCPreload; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR2. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register. + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable: Enable TIM output compare Preload + * @arg TIM_OCPreload_Disable: Disable TIM output compare Preload + * @retval None + */ +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2PE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR3. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register. + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable: Enable TIM output compare Preload + * @arg TIM_OCPreload_Disable: Disable TIM output compare Preload + * @retval None + */ +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3PE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= TIM_OCPreload; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Enables or disables the TIMx peripheral Preload register on CCR4. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCPreload: new state of the TIMx peripheral Preload register. + * This parameter can be one of the following values: + * @arg TIM_OCPreload_Enable: Enable TIM output compare Preload + * @arg TIM_OCPreload_Disable: Disable TIM output compare Preload + * @retval None + */ +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4PE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 1 Fast feature. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable. + * @arg TIM_OCFast_Disable: TIM output compare fast disable. + * @retval None + */ +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1FE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= TIM_OCFast; + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 2 Fast feature. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable. + * @arg TIM_OCFast_Disable: TIM output compare fast disable. + * @retval None + */ +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2FE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Configures the TIMx Output Compare 3 Fast feature. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable. + * @arg TIM_OCFast_Disable: TIM output compare fast disable. + * @retval None + */ +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3FE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= TIM_OCFast; + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx Output Compare 4 Fast feature. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCFast_Enable: TIM output compare fast enable. + * @arg TIM_OCFast_Disable: TIM output compare fast disable. + * @retval None + */ +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4FE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF1 signal on an external event + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable. + * @arg TIM_OCClear_Disable: TIM Output clear disable. + * @retval None + */ +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC1CE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= TIM_OCClear; + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF2 signal on an external event + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable. + * @arg TIM_OCClear_Disable: TIM Output clear disable . + * @retval None + */ +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + + tmpccmr1 = TIMx->CCMR1; + /* Reset the OC2CE Bit */ + tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR1 register */ + TIMx->CCMR1 = tmpccmr1; +} + +/** + * @brief Clears or safeguards the OCREF3 signal on an external event + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable. + * @arg TIM_OCClear_Disable: TIM Output clear disable. + * @retval None + */ +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC3CE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= TIM_OCClear; + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Clears or safeguards the OCREF4 signal on an external event + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. + * This parameter can be one of the following values: + * @arg TIM_OCClear_Enable: TIM Output clear enable. + * @arg TIM_OCClear_Disable: TIM Output clear disable. + * @retval None + */ +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); + + tmpccmr2 = TIMx->CCMR2; + /* Reset the OC4CE Bit */ + tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); + /* Write to TIMx CCMR2 register */ + TIMx->CCMR2 = tmpccmr2; +} + +/** + * @brief Configures the TIMx channel 1 polarity. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC1 Polarity. + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high. + * @arg TIM_OCPolarity_Low: Output Compare active low. + * @retval None + */ +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC1P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P); + tmpccer |= TIM_OCPolarity; + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 2 polarity. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC2 Polarity. + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high. + * @arg TIM_OCPolarity_Low: Output Compare active low. + * @retval None + */ +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC2P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 4); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 3 polarity. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC3 Polarity. + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high. + * @arg TIM_OCPolarity_Low: Output Compare active low. + * @retval None + */ +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC3P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 8); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Configures the TIMx channel 4 polarity. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCPolarity: specifies the OC4 Polarity. + * This parameter can be one of the following values: + * @arg TIM_OCPolarity_High: Output Compare active high. + * @arg TIM_OCPolarity_Low: Output Compare active low. + * @retval None + */ +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); + + tmpccer = TIMx->CCER; + /* Set or Reset the CC4P Bit */ + tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 12); + /* Write to TIMx CCER register */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Selects the OCReference Clear source. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_OCReferenceClear: specifies the OCReference Clear source. + * This parameter can be one of the following values: + * @arg TIM_OCReferenceClear_ETRF: The internal OCreference clear input is connected to ETRF. + * @arg TIM_OCReferenceClear_OCREFCLR: The internal OCreference clear input is connected to OCREF_CLR input. + * @retval None + */ +void TIM_SelectOCREFClear(TIM_TypeDef* TIMx, uint16_t TIM_OCReferenceClear) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(TIM_OCREFERENCECECLEAR_SOURCE(TIM_OCReferenceClear)); + + /* Set the TIM_OCReferenceClear source */ + TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_OCCS); + TIMx->SMCR |= TIM_OCReferenceClear; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_Channel: specifies the TIM Channel. + * This parameter can be one of the following values: + * @arg TIM_Channel_1: TIM Channel 1. + * @arg TIM_Channel_2: TIM Channel 2. + * @arg TIM_Channel_3: TIM Channel 3. + * @arg TIM_Channel_4: TIM Channel 4. + * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. + * @retval None + */ +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) +{ + uint16_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_CCX(TIM_CCx)); + + tmp = CCER_CCE_SET << TIM_Channel; + + /* Reset the CCxE Bit */ + TIMx->CCER &= (uint16_t)~ tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); +} + +/** + * @} + */ + +/** @defgroup TIM_Group3 Input Capture management functions + * @brief Input Capture management functions + * +@verbatim + =============================================================================== + ##### Input Capture management functions ##### + =============================================================================== + + *** TIM Driver: how to use it in Input Capture Mode *** + =============================================================================== + [..] To use the Timer in Input Capture mode, the following steps are mandatory: + (#) Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) + function. + (#) Configure the TIM pins by configuring the corresponding GPIO pins. + (#) Configure the Time base unit as described in the first part of this + driver, if needed, else the Timer will run with the default configuration: + (++) Autoreload value = 0xFFFF. + (++) Prescaler value = 0x0000. + (++) Counter mode = Up counting. + (++) Clock Division = TIM_CKD_DIV1. + (#) Fill the TIM_ICInitStruct with the desired parameters including: + (++) TIM Channel: TIM_Channel. + (++) TIM Input Capture polarity: TIM_ICPolarity. + (++) TIM Input Capture selection: TIM_ICSelection. + (++) TIM Input Capture Prescaler: TIM_ICPrescaler. + (++) TIM Input CApture filter value: TIM_ICFilter. + (#) Call TIM_ICInit(TIMx, &TIM_ICInitStruct) to configure the desired + channel with the corresponding configuration and to measure only + frequency or duty cycle of the input signal,or, Call + TIM_PWMIConfig(TIMx, &TIM_ICInitStruct) to configure the desired + channels with the corresponding configuration and to measure the + frequency and the duty cycle of the input signal. + (#) Enable the NVIC or the DMA to read the measured frequency. + (#) Enable the corresponding interrupt (or DMA request) to read + the Captured value, using the function TIM_ITConfig(TIMx, TIM_IT_CCx) + (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)). + (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter. + (#) Use TIM_GetCapturex(TIMx); to read the captured value. + [..] + (@) All other functions can be used separately to modify, if needed, + a specific feature of the Timer. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); + + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + /* TI4 Configuration */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Fills each TIM_ICInitStruct member with its default value. + * @param TIM_ICInitStruct : pointer to a TIM_ICInitTypeDef structure which will + * be initialized. + * @retval None + */ +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; + TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; + TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; + TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; + TIM_ICInitStruct->TIM_ICFilter = 0x00; +} + +/** + * @brief Configures the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct to measure an external PWM signal. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure + * that contains the configuration information for the specified TIM + * peripheral. + * @retval None + */ +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) +{ + uint16_t icoppositepolarity = TIM_ICPolarity_Rising; + uint16_t icoppositeselection = TIM_ICSelection_DirectTI; + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + /* Select the Opposite Input Polarity */ + if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) + { + icoppositepolarity = TIM_ICPolarity_Falling; + } + else + { + icoppositepolarity = TIM_ICPolarity_Rising; + } + /* Select the Opposite Input */ + if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) + { + icoppositeselection = TIM_ICSelection_IndirectTI; + } + else + { + icoppositeselection = TIM_ICSelection_DirectTI; + } + if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + /* TI1 Configuration */ + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI2 Configuration */ + TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + /* TI1 Configuration */ + TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/** + * @brief Gets the TIMx Input Capture 1 value. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @retval Capture Compare 1 Register value. + */ +uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + + /* Get the Capture 1 Register value */ + return TIMx->CCR1; +} + +/** + * @brief Gets the TIMx Input Capture 2 value. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @retval Capture Compare 2 Register value. + */ +uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + + /* Get the Capture 2 Register value */ + return TIMx->CCR2; +} + +/** + * @brief Gets the TIMx Input Capture 3 value. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @retval Capture Compare 3 Register value. + */ +uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + + /* Get the Capture 3 Register value */ + return TIMx->CCR3; +} + +/** + * @brief Gets the TIMx Input Capture 4 value. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @retval Capture Compare 4 Register value. + */ +uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + + /* Get the Capture 4 Register value */ + return TIMx->CCR4; +} + +/** + * @brief Sets the TIMx Input Capture 1 prescaler. + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. + * This parameter 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. + * @retval None + */ +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + + /* Reset the IC1PSC Bits */ + TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC); + /* Set the IC1PSC value */ + TIMx->CCMR1 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 2 prescaler. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. + * This parameter 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. + * @retval None + */ +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + + /* Reset the IC2PSC Bits */ + TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC); + /* Set the IC2PSC value */ + TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @brief Sets the TIMx Input Capture 3 prescaler. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. + * This parameter 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. + * @retval None + */ +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + + /* Reset the IC3PSC Bits */ + TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC); + /* Set the IC3PSC value */ + TIMx->CCMR2 |= TIM_ICPSC; +} + +/** + * @brief Sets the TIMx Input Capture 4 prescaler. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. + * This parameter 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. + * @retval None + */ +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); + + /* Reset the IC4PSC Bits */ + TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC); + /* Set the IC4PSC value */ + TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); +} + +/** + * @} + */ + +/** @defgroup TIM_Group4 Interrupts DMA and flags management functions + * @brief Interrupts, DMA and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts, DMA and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified TIM interrupts. + * @param TIMx: where x can be 2 to 11 to select the TIMx peripheral. + * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source. + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source. + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source. + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source. + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source. + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source. + * @note TIM6 and TIM7 can only generate an update interrupt. + * @note TIM_IT_CC2, TIM_IT_CC3, TIM_IT_CC4 and TIM_IT_Trigger can not be used with TIM10 and TIM11. + * @note TIM_IT_CC3, TIM_IT_CC4 can not be used with TIM9. + * @param NewState: new state of the TIM interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIMx->DIER |= TIM_IT; + } + else + { + /* Disable the Interrupt sources */ + TIMx->DIER &= (uint16_t)~TIM_IT; + } +} + +/** + * @brief Configures the TIMx event to be generate by software. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_EventSource: specifies the event source. + * This parameter can be one or more of the following values: + * @arg TIM_EventSource_Update: Timer update Event source. + * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source. + * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source. + * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source. + * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source. + * @arg TIM_EventSource_Trigger: Timer Trigger Event source. + * @note TIM6 and TIM7 can only generate an update event. + * @note TIM9 can only generate an update event, Capture Compare 1 event, + * Capture Compare 2 event and TIM_EventSource_Trigger. + * @note TIM10 and TIM11 can only generate an update event and Capture Compare 1 event. + * @retval None + */ +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); + /* Set the event sources */ + TIMx->EGR = TIM_EventSource; +} + +/** + * @brief Checks whether the specified TIM flag is set or not. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_Update: TIM update Flag. + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag. + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag. + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag. + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag. + * @arg TIM_FLAG_Trigger: TIM Trigger Flag. + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag. + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag. + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag. + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag. + * + * @note TIM6 and TIM7 can have only one update flag. + * @note TIM9 can have only update flag, TIM_FLAG_CC1, TIM_FLAG_CC2 and TIM_FLAG_Trigger, + * TIM_FLAG_CC1OF or TIM_FLAG_CC2OF flags. + * @note TIM10 and TIM11 can have only update flag, TIM_FLAG_CC1 or TIM_FLAG_CC1OF flags + * @retval The new state of TIM_FLAG (SET or RESET). + */ +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); + + if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's pending flags. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_FLAG: specifies the flag bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_FLAG_Update: TIM update Flag. + * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag. + * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag. + * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag. + * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag. + * @arg TIM_FLAG_Trigger: TIM Trigger Flag. + * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag. + * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag. + * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag. + * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag. + * @note TIM6 and TIM7 can have only one update flag. + * @note TIM9 can have only update flag, TIM_FLAG_CC1, TIM_FLAG_CC2 and TIM_FLAG_Trigger flags + * TIM_FLAG_CC1OF or TIM_FLAG_CC2OF flags. + * @note TIM10 and TIM11 can have only update flag, TIM_FLAG_CC1 + * or TIM_FLAG_CC1OF flags + * @retval None + */ +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG)); + + /* Clear the flags */ + TIMx->SR = (uint16_t)~TIM_FLAG; +} + +/** + * @brief Checks whether the TIM interrupt has occurred or not. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_IT: specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source. + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source. + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source. + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source. + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source. + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source. + * + * @note TIM6 and TIM7 can generate only an update interrupt. + * @note TIM9 can have only update interrupt, TIM_FLAG_CC1 or TIM_FLAG_CC2, + * interrupt and TIM_IT_Trigger interrupt. + * @note TIM10 and TIM11 can have only update interrupt or TIM_FLAG_CC1 + * interrupt + * @retval The new state of the TIM_IT(SET or RESET). + */ +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_GET_IT(TIM_IT)); + + itstatus = TIMx->SR & TIM_IT; + + itenable = TIMx->DIER & TIM_IT; + if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the TIMx's interrupt pending bits. + * @param TIMx: where x can be 2 to 11 to select the TIM peripheral. + * @param TIM_IT: specifies the pending bit to clear. + * This parameter can be any combination of the following values: + * @arg TIM_IT_Update: TIM update Interrupt source. + * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source. + * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source. + * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source. + * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source. + * @arg TIM_IT_Trigger: TIM Trigger Interrupt source. + * @note + * @note TIM6 and TIM7 can generate only an update interrupt. + * @note TIM9 can have only update interrupt, TIM_IT_CC1 or TIM_IT_CC2, + * and TIM_IT_Trigger interrupt. + * @note TIM10 and TIM11 can have only update interrupt or TIM_IT_CC1 + * interrupt + * @retval None + */ +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM_ALL_PERIPH(TIMx)); + assert_param(IS_TIM_IT(TIM_IT)); + + /* Clear the IT pending Bit */ + TIMx->SR = (uint16_t)~TIM_IT; +} + +/** + * @brief Configures the TIMx's DMA interface. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_DMABase: DMA Base address. + * This parameter can be one of the following values: + * @arg TIM_DMABase_CR1: TIM CR1 register as TIM DMA Base. + * @arg TIM_DMABase_CR2: TIM CR2 register as TIM DMA Base. + * @arg TIM_DMABase_SMCR: TIM SMCR register as TIM DMA Base. + * @arg TIM_DMABase_DIER: TIM DIER register as TIM DMA Base. + * @arg TIM_DMABase_SR: TIM SR register as TIM DMA Base. + * @arg TIM_DMABase_EGR: TIM EGR register as TIM DMA Base. + * @arg TIM_DMABase_CCMR1: TIM CCMR1 register as TIM DMA Base. + * @arg TIM_DMABase_CCMR2: TIM CCMR2 register as TIM DMA Base. + * @arg TIM_DMABase_CCER: TIM CCER register as TIM DMA Base. + * @arg TIM_DMABase_CNT: TIM CNT register as TIM DMA Base. + * @arg TIM_DMABase_PSC: TIM PSC register as TIM DMA Base. + * @arg TIM_DMABase_ARR: TIM ARR register as TIM DMA Base. + * @arg TIM_DMABase_CCR1: TIM CCR1 register as TIM DMA Base. + * @arg TIM_DMABase_CCR2: TIM CCR2 register as TIM DMA Base. + * @arg TIM_DMABase_CCR3: TIM CCR3 register as TIM DMA Base. + * @arg TIM_DMABase_CCR4: TIM CCR4 register as TIM DMA Base. + * @arg TIM_DMABase_DCR: TIM DCR register as TIM DMA Base. + * @arg TIM_DMABase_OR: TIM OR register as TIM DMA Base. + * @param TIM_DMABurstLength: DMA Burst length. + * This parameter can be one value between: + * TIM_DMABurstLength_1Transfer and TIM_DMABurstLength_18Transfers. + * @retval None + */ +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); + assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); + /* Set the DMA Base and the DMA Burst Length */ + TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; +} + +/** + * @brief Enables or disables the TIMx's DMA Requests. + * @param TIMx: where x can be 2, 3, 4, 5, 6 or 7 to select the TIM peripheral. + * @param TIM_DMASource: specifies the DMA Request sources. + * This parameter can be any combination of the following values: + * @arg TIM_DMA_Update: TIM update Interrupt source. + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source. + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source. + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source. + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source. + * @arg TIM_DMA_Trigger: TIM Trigger DMA source. + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST4_PERIPH(TIMx)); + assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA sources */ + TIMx->DIER |= TIM_DMASource; + } + else + { + /* Disable the DMA sources */ + TIMx->DIER &= (uint16_t)~TIM_DMASource; + } +} + +/** + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param NewState: new state of the Capture Compare DMA source + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the CCDS Bit */ + TIMx->CR2 |= TIM_CR2_CCDS; + } + else + { + /* Reset the CCDS Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS); + } +} + +/** + * @} + */ + +/** @defgroup TIM_Group5 Clocks management functions + * @brief Clocks management functions + * +@verbatim + =============================================================================== + ##### Clocks management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the TIMx internal Clock + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @retval None + */ +void TIM_InternalClockConfig(TIM_TypeDef* TIMx) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); +} + +/** + * @brief Configures the TIMx Internal Trigger as External Clock + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_ITRSource: Trigger source. + * This parameter can be one of the following values: + * @param TIM_TS_ITR0: Internal Trigger 0. + * @param TIM_TS_ITR1: Internal Trigger 1. + * @param TIM_TS_ITR2: Internal Trigger 2. + * @param TIM_TS_ITR3: Internal Trigger 3. + * @retval None + */ +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); + /* Select the Internal Trigger */ + TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the TIMx Trigger as External Clock + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_TIxExternalCLKSource: Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector. + * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1. + * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2. + * @param TIM_ICPolarity: specifies the TIx Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising: + * @arg TIM_ICPolarity_Falling: + * @param ICFilter : specifies the filter value. + * This parameter must be a value between 0x0 and 0xF. + * @retval None + */ +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); + assert_param(IS_TIM_IC_FILTER(ICFilter)); + + /* Configure the Timer Input Clock Source */ + if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) + { + TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + else + { + TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + /* Select the Trigger source */ + TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); + /* Select the External clock mode1 */ + TIMx->SMCR |= TIM_SlaveMode_External1; +} + +/** + * @brief Configures the External clock Mode1 + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the SMS Bits */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); + /* Select the External clock mode1 */ + tmpsmcr |= TIM_SlaveMode_External1; + /* Select the Trigger selection : ETRF */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); + tmpsmcr |= TIM_TS_ETRF; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Configures the External clock Mode2 + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + + /* Configure the ETR Clock source */ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + /* Enable the External clock mode2 */ + TIMx->SMCR |= TIM_SMCR_ECE; +} + +/** + * @} + */ + +/** @defgroup TIM_Group6 Synchronization management functions + * @brief Synchronization management functions + * +@verbatim + =============================================================================== + ##### Synchronization management functions ##### + =============================================================================== + *** TIM Driver: how to use it in synchronization Mode *** + =============================================================================== + [..] Case of two/several Timers + (#) Configure the Master Timers using the following functions: + (++) void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, + uint16_t TIM_TRGOSource). + (++) void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, + uint16_t TIM_MasterSlaveMode); + (#) Configure the Slave Timers using the following functions: + (++) void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, + uint16_t TIM_InputTriggerSource); + (++) void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); + [..] Case of Timers and external trigger(ETR pin) + (#) Configure the Etrenal trigger using this function: + (++) void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); + (#) Configure the Slave Timers using the following functions: + (++) void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, + uint16_t TIM_InputTriggerSource); + (++) void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); + +@endverbatim + * @{ + */ + +/** + * @brief Selects the Input Trigger source + * @param TIMx: where x can be 2, 3, 4, 5, or 9 to select the TIM peripheral. + * @param TIM_InputTriggerSource: The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0. + * @arg TIM_TS_ITR1: Internal Trigger 1. + * @arg TIM_TS_ITR2: Internal Trigger 2. + * @arg TIM_TS_ITR3: Internal Trigger 3. + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector. + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1. + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2. + * @arg TIM_TS_ETRF: External Trigger input. + * @retval None + */ +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) +{ + uint16_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS)); + /* Set the Input Trigger source */ + tmpsmcr |= TIM_InputTriggerSource; + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Selects the TIMx Trigger Output Mode. + * @param TIMx: where x can be 2, 3, 4, 5, 6, 7 or 9 to select the TIM peripheral. + * @param TIM_TRGOSource: specifies the Trigger Output source. + * This paramter can be one of the following values: + * + * @param For all TIMx + * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO). + * + * @param For all TIMx except TIM6 and TIM7 + * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag + * is to be set, as soon as a capture or compare match occurs (TRGO). + * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO). + + * @param For all TIMx except TIM6, TIM7, TIM10 and TIM11 + * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO). + + * @param For TIM2, TIM3 and TIM4 + * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO). + * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO). + * + * @retval None + */ +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST5_PERIPH(TIMx)); + assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); + + /* Reset the MMS Bits */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS); + /* Select the TRGO source */ + TIMx->CR2 |= TIM_TRGOSource; +} + +/** + * @brief Selects the TIMx Slave Mode. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_SlaveMode: specifies the Timer Slave Mode. + * This paramter can be one of the following values: + * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes + * the counter and triggers an update of the registers. + * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high. + * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI. + * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. + * @retval None + */ +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); + + /* Reset the SMS Bits */ + TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_SMS); + /* Select the Slave Mode */ + TIMx->SMCR |= TIM_SlaveMode; +} + +/** + * @brief Sets or Resets the TIMx Master/Slave Mode. + * @param TIMx: where x can be 2, 3, 4, 5 or 9 to select the TIM peripheral. + * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. + * This paramter can be one of the following values: + * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer + * and its slaves (through TRGO). + * @arg TIM_MasterSlaveMode_Disable: No action + * @retval None + */ +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST2_PERIPH(TIMx)); + assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); + + /* Reset the MSM Bit */ + TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_MSM); + + /* Set or Reset the MSM Bit */ + TIMx->SMCR |= TIM_MasterSlaveMode; +} + +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx: where x can be 2, 3, 4, 5, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. + * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. + * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. + * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity: The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. + * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. + * @param ExtTRGFilter: External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); + assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); + assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); + + tmpsmcr = TIMx->SMCR; + /* Reset the ETR Bits */ + tmpsmcr &= SMCR_ETR_MASK; + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @} + */ + +/** @defgroup TIM_Group7 Specific interface management functions + * @brief Specific interface management functions + * +@verbatim + =============================================================================== + ##### Specific interface management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the TIMx Encoder Interface. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. + * This parameter can be one of the following values: + * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. + * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. + * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending + * on the level of the other input. + * @param TIM_IC1Polarity: specifies the IC1 Polarity. + * This parmeter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @param TIM_IC2Polarity: specifies the IC2 Polarity + * This parmeter can be one of the following values: + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @retval None + */ +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) +{ + uint16_t tmpsmcr = 0; + uint16_t tmpccmr1 = 0; + uint16_t tmpccer = 0; + + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); + assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = TIMx->CCMR1; + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Set the encoder Mode */ + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)); + tmpsmcr |= TIM_EncoderMode; + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S))); + tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P))); + tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmr1; + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Enables or disables the TIMx's Hall sensor interface. + * @param TIMx: where x can be 2, 3, 4 or 5 to select the TIM peripheral. + * @param NewState: new state of the TIMx Hall sensor interface. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST3_PERIPH(TIMx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Set the TI1S Bit */ + TIMx->CR2 |= TIM_CR2_TI1S; + } + else + { + /* Reset the TI1S Bit */ + TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S); + } +} + +/** + * @} + */ + +/** @defgroup TIM_Group8 Specific remapping management function + * @brief Specific remapping management function + * +@verbatim + =============================================================================== + ##### Specific remapping management function ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Configures the TIM2, TIM3, TIM9, TIM10 and TIM11 Remapping input + * Capabilities. + * @param TIMx: where x can be 2, 3, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_Remap: specifies the TIM input remapping source. + * This parameter can be one of the following values: + * @arg TIM2_TIM10_OC: TIM2 ITR1 is connected to TIM10 output compare(default). + * @arg TIM2_TIM5_TRGO: TIM2 ITR1 is connected to TIM5 Trigger output. + * @arg TIM3_TIM11_OC: TIM3 ITR2 is connected to TIM11 output compare(default). + * @arg TIM3_TIM5_TRGO: TIM3 ITR2 is connected to TIM5 Trigger output. + * @arg TIM9_GPIO: TIM9 Channel 1 is connected to dedicated Timer pin(default). + * @arg TIM9_LSE: TIM9 Channel 1 is connected to LSE clock. + * @arg TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO. + * @arg TIM9_TS_IO: TIM9 ITR1 is connected to Touch Sense IO. + * @arg TIM10_GPIO: TIM10 Channel 1 is connected to dedicated Timer pin(default). + * @arg TIM10_LSI: TIM10 Channel 1 is connected to LSI clock. + * @arg TIM10_LSE: TIM10 Channel 1 is connected to LSE clock. + * @arg TIM10_RTC: TIM10 Channel 1 is connected to RTC Output event. + * @arg TIM10_RI: TIM10 Channel 1 is connected to Routing Interface (RI). + * @arg TIM10_ETR_LSE: TIM10 ETR input is connected to LSE Clock. + * @arg TIM10_ETR_TIM9_TRGO: TIM10 ETR input is connected to TIM9 Trigger Output. + * @arg TIM11_GPIO: TIM11 Channel 1 is connected to dedicated Timer pin(default). + * @arg TIM11_MSI: TIM11 Channel 1 is connected to MSI clock. + * @arg TIM11_HSE_RTC: TIM11 Channel 1 is connected to HSE_RTC clock. + * @arg TIM11_RI: TIM11 Channel 1 is connected to Routing Interface (RI). + * @arg TIM11_ETR_LSE: TIM11 ETR input is connected to LSE Clock. + * @arg TIM11_ETR_TIM9_TRGO: TIM11 ETR input is connected to TIM9 Trigger Output. + * @retval None + */ +void TIM_RemapConfig(TIM_TypeDef* TIMx, uint32_t TIM_Remap) +{ + /* Check the parameters */ + assert_param(IS_TIM_LIST6_PERIPH(TIMx)); + assert_param(IS_TIM_REMAP(TIM_Remap)); + + /* Set the Timer remapping configuration */ + TIMx->OR &= (uint16_t)(TIM_Remap >> 16); + TIMx->OR |= (uint16_t)TIM_Remap; +} + +/** + * @} + */ + +/** + * @brief Configure the TI1 as Input. + * @param TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E); + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + /* Select the Input and set the filter */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F))); + tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E); + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 4); + /* Select the Input and set the filter */ + tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F))); + tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); + tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx: where x can be 2, 3 or 4 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC3E); + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 8); + /* Select the Input and set the filter */ + tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx: where x can be 2, 3 or 4 to select the TIM peripheral. + * @param TIM_ICPolarity : The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPolarity_Rising: IC Rising edge. + * @arg TIM_ICPolarity_Falling: IC Falling edge. + * @param TIM_ICSelection: specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter: Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC4E); + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 12); + /* Select the Input and set the filter */ + tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); + tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P | TIM_CCER_CC4NP)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_usart.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_usart.c new file mode 100644 index 0000000..f31a659 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_usart.c @@ -0,0 +1,1459 @@ +/** + ****************************************************************************** + * @file stm32l1xx_usart.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Universal synchronous asynchronous receiver + * transmitter (USART): + * + Initialization and Configuration + * + Data transfers + * + Multi-Processor Communication + * + LIN mode + * + Half-duplex mode + * + Smartcard mode + * + IrDA mode + * + DMA transfers management + * + Interrupts and flags management + * + * @verbatim + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] + (#) Enable peripheral clock using + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE) function for + USART1 or using RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) + function for USART2 and USART3. + (#) According to the USART mode, enable the GPIO clocks using + RCC_AHBPeriphClockCmd() function. (The I/O can be TX, RX, CTS, + or and SCLK). + (#) Peripheral's alternate function: + (++) Connect the pin to the desired peripherals' Alternate + Function (AF) using GPIO_PinAFConfig() function. + (++) Configure the desired pin in alternate function by: + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF. + (++) Select the type, pull-up/pull-down and output speed via + GPIO_PuPd, GPIO_OType and GPIO_Speed members. + (++) Call GPIO_Init() function. + (#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware + flow control and Mode(Receiver/Transmitter) using the SPI_Init() + function. + (#) For synchronous mode, enable the clock and program the polarity, + phase and last bit using the USART_ClockInit() function. + (#) Enable the NVIC and the corresponding interrupt using the function + USART_ITConfig() if you need to use interrupt mode. + (#) When using the DMA mode. + (++) Configure the DMA using DMA_Init() function. + (++) Active the needed channel Request using USART_DMACmd() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Enable the DMA using the DMA_Cmd() function, when using DMA mode. + [..] + Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections + for more details. + +@endverbatim + + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_usart.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup USART + * @brief USART driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/*!< USART CR1 register clear Mask ((~(uint16_t)0xE9F3)) */ +#define CR1_CLEAR_MASK ((uint16_t)(USART_CR1_M | USART_CR1_PCE | \ + USART_CR1_PS | USART_CR1_TE | \ + USART_CR1_RE)) + +/*!< USART CR2 register clock bits clear Mask ((~(uint16_t)0xF0FF)) */ +#define CR2_CLOCK_CLEAR_MASK ((uint16_t)(USART_CR2_CLKEN | USART_CR2_CPOL | \ + USART_CR2_CPHA | USART_CR2_LBCL)) + +/*!< USART CR3 register clear Mask ((~(uint16_t)0xFCFF)) */ +#define CR3_CLEAR_MASK ((uint16_t)(USART_CR3_RTSE | USART_CR3_CTSE)) + +/*!< USART Interrupts mask */ +#define IT_MASK ((uint16_t)0x001F) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup USART_Private_Functions + * @{ + */ + +/** @defgroup USART_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USART + in asynchronous and in synchronous modes. + (+) For the asynchronous mode only these parameters can be configured: + (+) Baud Rate. + (+) Word Length. + (+) Stop Bit. + (+) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + Depending on the frame length defined by the M bit (8-bits or 9-bits), + the possible USART frame formats are as listed in the following table: + [..] + +-------------------------------------------------------------+ + | M bit | PCE bit | USART frame | + |---------------------|---------------------------------------| + | 0 | 0 | | SB | 8 bit data | STB | | + |---------|-----------|---------------------------------------| + | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|-----------|---------------------------------------| + | 1 | 0 | | SB | 9 bit data | STB | | + |---------|-----------|---------------------------------------| + | 1 | 1 | | SB | 8 bit data | PB | STB | | + +-------------------------------------------------------------+ + [..] + (+) Hardware flow control. + (+) Receiver/transmitter modes. + [..] The USART_Init() function follows the USART asynchronous configuration + procedure(details for the procedure are available in reference manual + (RM0038)). + (+) For the synchronous mode in addition to the asynchronous mode parameters + these parameters should be also configured: + (++) USART Clock Enabled. + (++) USART polarity. + (++) USART phase. + (++) USART LastBit. + [..] These parameters can be configured using the USART_ClockInit() function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the USARTx peripheral registers to their default reset values. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: USART1, USART2, USART3, + * UART4 or UART5. + * @retval None. + */ +void USART_DeInit(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + if (USARTx == USART1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + } + else if (USARTx == USART2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); + } + else if (USARTx == USART3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); + } + else if (USARTx == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } + else + { + if (USARTx == UART5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); + } + } +} + +/** + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: USART1, USART2, USART3, + * UART4 or UART5. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that + * contains the configuration information for the specified USART peripheral. + * @retval None. + */ +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) +{ + uint32_t tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + RCC_ClocksTypeDef RCC_ClocksStatus; + + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); + assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); + assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); + assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); + assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); + assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); + + /* The hardware flow control is available only for USART1, USART2 and USART3 */ + if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear STOP[13:12] bits */ + tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); + + /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ + /* Set STOP[13:12] bits according to USART_StopBits value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; + + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; + +/*---------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = USARTx->CR1; + /* Clear M, PCE, PS, TE and RE bits */ + tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK); + + /* Configure the USART Word Length, Parity and mode ----------------------- */ + /* Set the M bits according to USART_WordLength value */ + /* Set PCE and PS bits according to USART_Parity value */ + /* Set TE and RE bits according to USART_Mode value */ + tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | + USART_InitStruct->USART_Mode; + + /* Write to USART CR1 */ + USARTx->CR1 = (uint16_t)tmpreg; + +/*---------------------------- USART CR3 Configuration -----------------------*/ + tmpreg = USARTx->CR3; + /* Clear CTSE and RTSE bits */ + tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK); + + /* Configure the USART HFC -------------------------------------------------*/ + /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ + tmpreg |= USART_InitStruct->USART_HardwareFlowControl; + + /* Write to USART CR3 */ + USARTx->CR3 = (uint16_t)tmpreg; + +/*---------------------------- USART BRR Configuration -----------------------*/ + /* Configure the USART Baud Rate -------------------------------------------*/ + RCC_GetClocksFreq(&RCC_ClocksStatus); + if (USARTx == USART1) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + + /* Determine the integer part */ + if ((USARTx->CR1 & USART_CR1_OVER8) != 0) + { + /* Integer part computing in case Oversampling mode is 8 Samples */ + integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + /* Integer part computing in case Oversampling mode is 16 Samples */ + integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); + } + tmpreg = (integerdivider / 100) << 4; + + /* Determine the fractional part */ + fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); + + /* Implement the fractional part in the register */ + if ((USARTx->CR1 & USART_CR1_OVER8) != 0) + { + tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); + } + else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ + { + tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); + } + + /* Write to USART BRR */ + USARTx->BRR = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_InitStruct member with its default value. + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * which will be initialized. + * @retval None + */ +void USART_StructInit(USART_InitTypeDef* USART_InitStruct) +{ + /* USART_InitStruct members default value */ + USART_InitStruct->USART_BaudRate = 9600; + USART_InitStruct->USART_WordLength = USART_WordLength_8b; + USART_InitStruct->USART_StopBits = USART_StopBits_1; + USART_InitStruct->USART_Parity = USART_Parity_No ; + USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; +} + +/** + * @brief Initializes the USARTx peripheral Clock according to the + * specified parameters in the USART_ClockInitStruct. + * @param USARTx: where x can be 1, 2, 3 to select the USART peripheral. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * @note The Smart Card and Synchronous modes are not available for UART4 and UART5. + * @retval None. + */ +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); + assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); + assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); + assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); + +/*---------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = USARTx->CR2; + /* Clear CLKEN, CPOL, CPHA and LBCL bits */ + tmpreg &= (uint32_t)~((uint32_t)CR2_CLOCK_CLEAR_MASK); + /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ + /* Set CLKEN bit according to USART_Clock value */ + /* Set CPOL bit according to USART_CPOL value */ + /* Set CPHA bit according to USART_CPHA value */ + /* Set LBCL bit according to USART_LastBit value */ + tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | + USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; + /* Write to USART CR2 */ + USARTx->CR2 = (uint16_t)tmpreg; +} + +/** + * @brief Fills each USART_ClockInitStruct member with its default value. + * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef + * structure which will be initialized. + * @retval None + */ +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) +{ + /* USART_ClockInitStruct members default value */ + USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; + USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; + USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; + USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; +} + +/** + * @brief Enables or disables the specified USART peripheral. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USARTx peripheral. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected USART by setting the UE bit in the CR1 register */ + USARTx->CR1 |= USART_CR1_UE; + } + else + { + /* Disable the selected USART by clearing the UE bit in the CR1 register */ + USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); + } +} + +/** + * @brief Sets the system clock prescaler. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Prescaler: specifies the prescaler clock. + * @note The function is used for IrDA mode with UART4 and UART5. + * @retval None. + */ +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Clear the USART prescaler */ + USARTx->GTPR &= USART_GTPR_GT; + /* Set the USART prescaler */ + USARTx->GTPR |= USART_Prescaler; +} + +/** + * @brief Enables or disables the USART's 8x oversampling mode. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART 8x oversampling mode. + * This parameter can be: ENABLE or DISABLE. + * + * @note + * This function has to be called before calling USART_Init() + * function in order to have correct baudrate Divider value. + * @retval None + */ +void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */ + USARTx->CR1 |= USART_CR1_OVER8; + } + else + { + /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ + USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_OVER8); + } +} + +/** + * @brief Enables or disables the USART's one bit sampling method. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART one bit sampling method. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */ + USARTx->CR3 |= USART_CR3_ONEBIT; + } + else + { + /* Disable the one bit method by clearing the ONEBITE bit in the CR3 register */ + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT); + } +} + +/** + * @} + */ + +/** @defgroup USART_Group2 Data transfers functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### Data transfers functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage + the USART data transfers. + [..] During an USART reception, data shifts in least significant bit first + through the RX pin. In this mode, the USART_DR register consists of + a buffer (RDR) between the internal bus and the received shift register. + When a transmission is taking place, a write instruction to + the USART_DR register stores the data in the TDR register and which is + copied in the shift register at the end of the current transmission. + [..] The read access of the USART_DR register can be done using + the USART_ReceiveData() function and returns the RDR buffered value. + Whereas a write access to the USART_DR can be done using USART_SendData() + function and stores the written data into TDR buffer. + +@endverbatim + * @{ + */ + +/** + * @brief Transmits single data through the USARTx peripheral. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param Data: the data to transmit. + * @retval None. + */ +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_DATA(Data)); + + /* Transmit Data */ + USARTx->DR = (Data & (uint16_t)0x01FF); +} + +/** + * @brief Returns the most recent received data by the USARTx peripheral. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval The received data. + */ +uint16_t USART_ReceiveData(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Receive Data */ + return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); +} + +/** + * @} + */ + +/** @defgroup USART_Group3 MultiProcessor Communication functions + * @brief Multi-Processor Communication functions + * +@verbatim + =============================================================================== + ##### Multi-Processor Communication functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART + multiprocessor communication. + [..] For instance one of the USARTs can be the master, its TX output is + connected to the RX input of the other USART. The others are slaves, + their respective TX outputs are logically ANDed together and connected + to the RX input of the master. USART multiprocessor communication is + possible through the following procedure: + (#) Program the Baud rate, Word length = 9 bits, Stop bits, Parity, + Mode transmitter or Mode receiver and hardware flow control values + using the USART_Init() function. + (#) Configures the USART address using the USART_SetAddress() function. + (#) Configures the wake up methode (USART_WakeUp_IdleLine or + USART_WakeUp_AddressMark) using USART_WakeUpConfig() function only + for the slaves. + (#) Enable the USART using the USART_Cmd() function. + (#) Enter the USART slaves in mute mode using USART_ReceiverWakeUpCmd() + function. + + [..] The USART Slave exit from mute mode when receive the wake up condition. + +@endverbatim + * @{ + */ + +/** + * @brief Sets the address of the USART node. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_Address: Indicates the address of the USART node. + * @retval None + */ +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_ADDRESS(USART_Address)); + + /* Clear the USART address */ + USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_ADD); + /* Set the USART address node */ + USARTx->CR2 |= USART_Address; +} + +/** + * @brief Determines if the USART is in mute mode or not. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART mute mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ + USARTx->CR1 |= USART_CR1_RWU; + } + else + { + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_RWU); + } +} +/** + * @brief Selects the USART WakeUp method. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_WakeUp: specifies the USART wakeup method. + * This parameter can be one of the following values: + * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection. + * @arg USART_WakeUp_AddressMark: WakeUp by an address mark. + * @retval None. + */ +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_WAKEUP(USART_WakeUp)); + + USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_WAKE); + USARTx->CR1 |= USART_WakeUp; +} + +/** + * @} + */ + +/** @defgroup USART_Group4 LIN mode functions + * @brief LIN mode functions + * +@verbatim + =============================================================================== + ##### LIN mode functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART + LIN Mode communication. + [..] In LIN mode, 8-bit data format with 1 stop bit is required in accordance + with the LIN standard. + [..] Only this LIN Feature is supported by the USART IP: + (+) LIN Master Synchronous Break send capability and LIN slave break + detection capability : 13-bit break generation and 10/11 bit break + detection. + [..] USART LIN Master transmitter communication is possible through the + following procedure: + (#) Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, + Mode transmitter or Mode receiver and hardware flow control values + using the USART_Init() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Enable the LIN mode using the USART_LINCmd() function. + (#) Send the break character using USART_SendBreak() function. + [..] USART LIN Master receiver communication is possible through the + following procedure: + (#) Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, + Mode transmitter or Mode receiver and hardware flow control values + using the USART_Init() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Configures the break detection length + using the USART_LINBreakDetectLengthConfig() function. + (#) Enable the LIN mode using the USART_LINCmd() function. + -@- In LIN mode, the following bits must be kept cleared: + (+@) CLKEN in the USART_CR2 register. + (+@) STOP[1:0], SCEN, HDSEL and IREN in the USART_CR3 register. + +@endverbatim + * @{ + */ + +/** + * @brief Sets the USART LIN Break detection length. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_LINBreakDetectLength: specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg USART_LINBreakDetectLength_10b: 10-bit break detection. + * @arg USART_LINBreakDetectLength_11b: 11-bit break detection. + * @retval None. + */ +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); + + USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LBDL); + USARTx->CR2 |= USART_LINBreakDetectLength; +} + +/** + * @brief Enables or disables the USART's LIN mode. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART LIN mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + USARTx->CR2 |= USART_CR2_LINEN; + } + else + { + /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ + USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LINEN); + } +} + +/** + * @brief Transmits break characters. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @retval None. + */ +void USART_SendBreak(USART_TypeDef* USARTx) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + + /* Send break characters */ + USARTx->CR1 |= USART_CR1_SBK; +} + +/** + * @} + */ + +/** @defgroup USART_Group5 Halfduplex mode function + * @brief Half-duplex mode function + * +@verbatim + =============================================================================== + ##### Half-duplex mode function ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART + Half-duplex communication. + [..] The USART can be configured to follow a single-wire half-duplex protocol + where the TX and RX lines are internally connected. + [..] USART Half duplex communication is possible through the following procedure: + (#) Program the Baud rate, Word length, Stop bits, Parity, Mode transmitter + or Mode receiver and hardware flow control values using the USART_Init() + function. + (#) Configures the USART address using the USART_SetAddress() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Enable the half duplex mode using USART_HalfDuplexCmd() function. + -@- The RX pin is no longer used. + -@- 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. + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the USART's Half Duplex communication. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the USART Communication. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + USARTx->CR3 |= USART_CR3_HDSEL; + } + else + { + /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_HDSEL); + } +} + +/** + * @} + */ + + +/** @defgroup USART_Group6 Smartcard mode functions + * @brief Smartcard mode functions + * +@verbatim + =============================================================================== + ##### Smartcard mode functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART + Smartcard communication. + [..] The Smartcard interface is designed to support asynchronous protocol + Smartcards as defined in the ISO 7816-3 standard. The USART can provide + a clock to the smartcard through the SCLK output. In smartcard mode, + SCLK is not associated to the communication but is simply derived from + the internal peripheral input clock through a 5-bit prescaler. + [..] Smartcard communication is possible through the following procedure: + (#) Configures the Smartcard Prsecaler using the USART_SetPrescaler() + function. + (#) Configures the Smartcard Guard Time using the USART_SetGuardTime() + function. + (#) Program the USART clock using the USART_ClockInit() function as following: + (++) USART Clock enabled. + (++) USART CPOL Low. + (++) USART CPHA on first edge. + (++) USART Last Bit Clock Enabled. + (#) Program the Smartcard interface using the USART_Init() function as + following: + (++) Word Length = 9 Bits. + (++) 1.5 Stop Bit. + (++) Even parity. + (++) BaudRate = 12096 baud. + (++) Hardware flow control disabled (RTS and CTS signals). + (++) Tx and Rx enabled + (#) Optionally you can enable the parity error interrupt using + the USART_ITConfig() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Enable the Smartcard NACK using the USART_SmartCardNACKCmd() function. + (#) Enable the Smartcard interface using the USART_SmartCardCmd() function. + [..] + Please refer to the ISO 7816-3 specification for more details. + [..] + (@) It is also possible to choose 0.5 stop bit for receiving but it is + recommended to use 1.5 stop bits for both transmitting and receiving + to avoid switching between the two configurations. + (@) In smartcard mode, the following bits must be kept cleared: + (+@) LINEN bit in the USART_CR2 register. + (+@) HDSEL and IREN bits in the USART_CR3 register. + +@endverbatim + * @{ + */ + +/** + * @brief Sets the specified USART guard time. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2 or USART3. + * @param USART_GuardTime: specifies the guard time. + * @retval None. + */ +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + + /* Clear the USART Guard time */ + USARTx->GTPR &= USART_GTPR_PSC; + /* Set the USART guard time */ + USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/** + * @brief Enables or disables the USART's Smart Card mode. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2 or USART3. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR3 register */ + USARTx->CR3 |= USART_CR3_SCEN; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_SCEN); + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2 or USART3. + * @param NewState: new state of the NACK transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_123_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + if (NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ + USARTx->CR3 |= USART_CR3_NACK; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_NACK); + } +} + +/** + * @} + */ + +/** @defgroup USART_Group7 IrDA mode functions + * @brief IrDA mode functions + * +@verbatim + =============================================================================== + ##### IrDA mode functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART + IrDA communication. + [..] IrDA is a half duplex communication protocol. If the Transmitter is busy, + any data on the IrDA receive line will be ignored by the IrDA decoder + and if the Receiver is busy, data on the TX from the USART to IrDA will + not be encoded by IrDA. While receiving data, transmission should be + avoided as the data to be transmitted could be corrupted. + + [..] IrDA communication is possible through the following procedure: + (#) Program the Baud rate, Word length = 8 bits, Stop bits, Parity, + Transmitter/Receiver modes and hardware flow control values using + the USART_Init() function. + (#) Enable the USART using the USART_Cmd() function. + (#) Configures the IrDA pulse width by configuring the prescaler using + the USART_SetPrescaler() function. + (#) Configures the IrDA USART_IrDAMode_LowPower or USART_IrDAMode_Normal + mode using the USART_IrDAConfig() function. + (#) Enable the IrDA using the USART_IrDACmd() function. + + [..] + (@) A pulse of width less than two and greater than one PSC period(s) may or + may not be rejected. + (@) The receiver set up time should be managed by software. The IrDA physical + layer specification specifies a minimum of 10 ms delay between + transmission and reception (IrDA is a half duplex protocol). + (@) 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. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the USART's IrDA interface. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IrDAMode: specifies the IrDA mode. + * This parameter can be one of the following values: + * @arg USART_IrDAMode_LowPower: USART IrDA Low Power mode selected. + * @arg USART_IrDAMode_Normal: USART IrDA Normal mode selected. + * @retval None + */ +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); + + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_IRLP); + USARTx->CR3 |= USART_IrDAMode; +} + +/** + * @brief Enables or disables the USART's IrDA interface. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param NewState: new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + USARTx->CR3 |= USART_CR3_IREN; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_IREN); + } +} + +/** + * @} + */ + +/** @defgroup USART_Group8 DMA transfers management functions + * @brief DMA transfers management functions + * +@verbatim + =============================================================================== + ##### DMA transfers management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the USART's DMA interface. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_DMAReq: specifies the DMA request. + * This parameter can be any combination of the following values: + * @arg USART_DMAReq_Tx: USART DMA transmit request. + * @arg USART_DMAReq_Rx: USART DMA receive request. + * @param NewState: new state of the DMA Request sources. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_DMAREQ(USART_DMAReq)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA transfer for selected requests by setting the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 |= USART_DMAReq; + } + else + { + /* Disable the DMA transfer for selected requests by clearing the DMAT and/or + DMAR bits in the USART CR3 register */ + USARTx->CR3 &= (uint16_t)~USART_DMAReq; + } +} + +/** + * @} + */ + +/** @defgroup USART_Group9 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to configure the + USART Interrupts sources, DMA channels requests and check or clear the + flags or pending bits status. The user should identify which mode will + be used in his application to manage the communication: Polling mode, + Interrupt mode or DMA mode. + *** Polling Mode *** + ==================== + [..] In Polling Mode, the SPI communication can be managed by 10 flags: + (#) USART_FLAG_TXE: to indicate the status of the transmit buffer register. + (#) USART_FLAG_RXNE: to indicate the status of the receive buffer register. + (#) USART_FLAG_TC: to indicate the status of the transmit operation. + (#) USART_FLAG_IDLE: to indicate the status of the Idle Line. + (#) USART_FLAG_CTS: to indicate the status of the nCTS input. + (#) USART_FLAG_LBD: to indicate the status of the LIN break detection. + (#) USART_FLAG_NE: to indicate if a noise error occur. + (#) USART_FLAG_FE: to indicate if a frame error occur. + (#) USART_FLAG_PE: to indicate if a parity error occur. + (#) USART_FLAG_ORE: to indicate if an Overrun error occur. + [..] In this Mode it is advised to use the following functions: + (+) FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG). + (+) void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG). + + *** Interrupt Mode *** + ====================== + [..] In Interrupt Mode, the USART communication can be managed by 8 interrupt + sources and 10 pending bits: + (+) Pending Bits: + (##) USART_IT_TXE: to indicate the status of the transmit buffer + register. + (##) USART_IT_RXNE: to indicate the status of the receive buffer + register. + (##) USART_IT_TC: to indicate the status of the transmit operation. + (##) USART_IT_IDLE: to indicate the status of the Idle Line. + (##) USART_IT_CTS: to indicate the status of the nCTS input. + (##) USART_IT_LBD: to indicate the status of the LIN break detection. + (##) USART_IT_NE: to indicate if a noise error occur. + (##) USART_IT_FE: to indicate if a frame error occur. + (##) USART_IT_PE: to indicate if a parity error occur. + (##) USART_IT_ORE: to indicate if an Overrun error occur + (if the RXNEIE or EIE bits are set). + + (+) Interrupt Source: + (##) USART_IT_TXE: specifies the interrupt source for the Tx buffer + empty interrupt. + (##) USART_IT_RXNE: specifies the interrupt source for the Rx buffer + not empty interrupt. + (##) USART_IT_TC: specifies the interrupt source for the Transmit + complete interrupt. + (##) USART_IT_IDLE: specifies the interrupt source for the Idle Line + interrupt. + (##) USART_IT_CTS: specifies the interrupt source for the CTS interrupt. + (##) USART_IT_LBD: specifies the interrupt source for the LIN break + detection interrupt. + (##) USART_IT_PE: specifies the interrupt source for theparity error + interrupt. + (##) USART_IT_ERR: specifies the interrupt source for the errors + interrupt. + -@@- Some parameters are coded in order to use them as interrupt + source or as pending bits. + [..] In this Mode it is advised to use the following functions: + (+) void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, + FunctionalState NewState). + (+) ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT). + (+) void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT). + + *** DMA Mode *** + ================ + [..] In DMA Mode, the USART communication can be managed by 2 DMA Channel + requests: + (#) USART_DMAReq_Tx: specifies the Tx buffer DMA transfer request. + (#) USART_DMAReq_Rx: specifies the Rx buffer DMA transfer request. + [..] In this Mode it is advised to use the following function: + (+) void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, + FunctionalState NewState). +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified USART interrupts. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt. + * @arg USART_IT_LBD: LIN Break detection interrupt. + * @arg USART_IT_TXE: Tansmit Data Register empty interrupt. + * @arg USART_IT_TC: Transmission complete interrupt. + * @arg USART_IT_RXNE: Receive Data register not empty interrupt. + * @arg USART_IT_IDLE: Idle line detection interrupt. + * @arg USART_IT_PE: Parity Error interrupt. + * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error). + * @param NewState: new state of the specified USARTx interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None. + */ +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CONFIG_IT(USART_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + usartxbase = (uint32_t)USARTx; + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + + /* Get the interrupt position */ + itpos = USART_IT & IT_MASK; + itmask = (((uint32_t)0x01) << itpos); + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + usartxbase += 0x0C; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + usartxbase += 0x10; + } + else /* The IT is in CR3 register */ + { + usartxbase += 0x14; + } + if (NewState != DISABLE) + { + *(__IO uint32_t*)usartxbase |= itmask; + } + else + { + *(__IO uint32_t*)usartxbase &= ~itmask; + } +} + +/** + * @brief Checks whether the specified USART flag is set or not. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg USART_FLAG_LBD: LIN Break detection flag. + * @arg USART_FLAG_TXE: Transmit data register empty flag. + * @arg USART_FLAG_TC: Transmission Complete flag. + * @arg USART_FLAG_RXNE: Receive data register not empty flag. + * @arg USART_FLAG_IDLE: Idle Line detection flag. + * @arg USART_FLAG_ORE: OverRun Error flag. + * @arg USART_FLAG_NE: Noise Error flag. + * @arg USART_FLAG_FE: Framing Error flag. + * @arg USART_FLAG_PE: Parity Error flag. + * @retval The new state of USART_FLAG (SET or RESET). + */ +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_FLAG(USART_FLAG)); + + /* The CTS flag is not available for UART4 and UART5 */ + if (USART_FLAG == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the USARTx's pending flags. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg USART_FLAG_LBD: LIN Break detection flag. + * @arg USART_FLAG_TC: Transmission Complete flag. + * @arg USART_FLAG_RXNE: Receive data register not empty flag. + * + * + * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) + * followed by a read operation to USART_DR register (USART_ReceiveData()). + * @note RXNE flag can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * @note TC flag can be also cleared by software sequence: a read operation to + * USART_SR register (USART_GetFlagStatus()) followed by a write operation + * to USART_DR register (USART_SendData()). + * @note TXE flag is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) +{ + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); + + /* The CTS flag is not available for UART4 and UART5 */ + if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + USARTx->SR = (uint16_t)~USART_FLAG; +} + +/** + * @brief Checks whether the specified USART interrupt has occurred or not. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the USART interrupt source to check. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TXE: Tansmit Data Register empty interrupt + * @arg USART_IT_TC: Transmission complete interrupt + * @arg USART_IT_RXNE: Receive Data register not empty interrupt + * @arg USART_IT_IDLE: Idle line detection interrupt + * @arg USART_IT_ORE_RX: OverRun Error interrupt if the RXNEIE bit is set. + * @arg USART_IT_ORE_ER: OverRun Error interrupt if the EIE bit is set. + * @arg USART_IT_NE: Noise Error interrupt + * @arg USART_IT_FE: Framing Error interrupt + * @arg USART_IT_PE: Parity Error interrupt + * @retval The new state of USART_IT (SET or RESET). + */ +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_GET_IT(USART_IT)); + + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + /* Get the USART register index */ + usartreg = (((uint8_t)USART_IT) >> 0x05); + /* Get the interrupt position */ + itmask = USART_IT & IT_MASK; + itmask = (uint32_t)0x01 << itmask; + + if (usartreg == 0x01) /* The IT is in CR1 register */ + { + itmask &= USARTx->CR1; + } + else if (usartreg == 0x02) /* The IT is in CR2 register */ + { + itmask &= USARTx->CR2; + } + else /* The IT is in CR3 register */ + { + itmask &= USARTx->CR3; + } + + bitpos = USART_IT >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->SR; + if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** + * @brief Clears the USARTx's interrupt pending bits. + * @param USARTx: Select the USART peripheral. + * This parameter can be one of the following values: + * USART1, USART2, USART3, UART4 or UART5. + * @param USART_IT: specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg USART_IT_LBD: LIN Break detection interrupt + * @arg USART_IT_TC: Transmission complete interrupt. + * @arg USART_IT_RXNE: Receive Data register not empty interrupt. + * + + * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) pending bits are cleared by + * software sequence: a read operation to USART_SR register + * (USART_GetITStatus()) followed by a read operation to USART_DR register + * (USART_ReceiveData()). + * @note RXNE pending bit can be also cleared by a read to the USART_DR register + * (USART_ReceiveData()). + * @note TC pending bit can be also cleared by software sequence: a read + * operation to USART_SR register (USART_GetITStatus()) followed by a write + * operation to USART_DR register (USART_SendData()). + * @note TXE pending bit is cleared only by a write to the USART_DR register + * (USART_SendData()). + * @retval None + */ +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + /* Check the parameters */ + assert_param(IS_USART_ALL_PERIPH(USARTx)); + assert_param(IS_USART_CLEAR_IT(USART_IT)); + + /* The CTS interrupt is not available for UART4 and UART5 */ + if (USART_IT == USART_IT_CTS) + { + assert_param(IS_USART_123_PERIPH(USARTx)); + } + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->SR = (uint16_t)~itmask; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_wwdg.c b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_wwdg.c new file mode 100644 index 0000000..03029e4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_wwdg.c @@ -0,0 +1,313 @@ +/** + ****************************************************************************** + * @file stm32l1xx_wwdg.c + * @author MCD Application Team + * @version V1.2.0 + * @date 22-February-2013 + * @brief This file provides firmware functions to manage the following + * functionalities of the Window watchdog (WWDG) peripheral: + * + Prescaler, Refresh window and Counter configuration + * + WWDG activation + * + Interrupts and flags management + * + * @verbatim + * + ============================================================================== + ##### WWDG features ##### + ============================================================================== + [..] Once enabled the WWDG generates a system reset on expiry of a programmed + time period, unless the program refreshes the counter (downcounter) + before to reach 0x3F value (i.e. a reset is generated when the counter + value rolls over from 0x40 to 0x3F). + [..] An MCU reset is also generated if the counter value is refreshed + before the counter has reached the refresh window value. This + implies that the counter must be refreshed in a limited window. + + [..] Once enabled the WWDG cannot be disabled except by a system reset. + + [..] WWDGRST flag in RCC_CSR register can be used to inform when a WWDG + reset occurs. + + [..] The WWDG counter input clock is derived from the APB clock divided + by a programmable prescaler. + + [..] WWDG counter clock = PCLK1 / Prescaler. + [..] WWDG timeout = (WWDG counter clock) * (counter value). + + [..] Min-max timeout value @32MHz (PCLK1): ~128us / ~65.6ms. + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable WWDG clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE) + function. + + (#) Configure the WWDG prescaler using WWDG_SetPrescaler() function. + + (#) Configure the WWDG refresh window using WWDG_SetWindowValue() function. + + (#) Set the WWDG counter value and start it using WWDG_Enable() function. + When the WWDG is enabled the counter value should be configured to + a value greater than 0x40 to prevent generating an immediate reset. + + (#) Optionally you can enable the Early wakeup interrupt which is + generated when the counter reach 0x40. + Once enabled this interrupt cannot be disabled except by a system reset. + + (#) Then the application program must refresh the WWDG counter at regular + intervals during normal operation to prevent an MCU reset, using + WWDG_SetCounter() function. This operation must occur only when + the counter value is lower than the refresh window value, + programmed using WWDG_SetWindowValue(). + + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2013 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 "stm32l1xx_wwdg.h" +#include "stm32l1xx_rcc.h" + +/** @addtogroup STM32L1xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup WWDG + * @brief WWDG driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* ----------- WWDG registers bit address in the alias region ----------- */ +#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) + +/* Alias word address of EWI bit */ +#define CFR_OFFSET (WWDG_OFFSET + 0x04) +#define EWI_BitNumber 0x09 +#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) + +/* --------------------- WWDG registers bit mask ------------------------ */ + +/* CFR register bit mask */ +#define CFR_WDGTB_MASK ((uint32_t)0xFFFFFE7F) +#define CFR_W_MASK ((uint32_t)0xFFFFFF80) +#define BIT_MASK ((uint8_t)0x7F) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup WWDG_Private_Functions + * @{ + */ + +/** @defgroup WWDG_Group1 Prescaler, Refresh window and Counter configuration functions + * @brief Prescaler, Refresh window and Counter configuration functions + * +@verbatim + ============================================================================== + ##### Prescaler, Refresh window and Counter configuration functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the WWDG peripheral registers to their default reset values. + * @param None + * @retval None + */ +void WWDG_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); +} + +/** + * @brief Sets the WWDG Prescaler. + * @param WWDG_Prescaler: specifies the WWDG Prescaler. + * This parameter can be one of the following values: + * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 + * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 + * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 + * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 + * @retval None + */ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) +{ + uint32_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); + /* Clear WDGTB[1:0] bits */ + tmpreg = WWDG->CFR & CFR_WDGTB_MASK; + /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ + tmpreg |= WWDG_Prescaler; + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Sets the WWDG window value. + * @param WindowValue: specifies the window value to be compared to the downcounter. + * This parameter value must be lower than 0x80. + * @retval None + */ +void WWDG_SetWindowValue(uint8_t WindowValue) +{ + __IO uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); + /* Clear W[6:0] bits */ + + tmpreg = WWDG->CFR & CFR_W_MASK; + + /* Set W[6:0] bits according to WindowValue value */ + tmpreg |= WindowValue & (uint32_t) BIT_MASK; + + /* Store the new value */ + WWDG->CFR = tmpreg; +} + +/** + * @brief Enables the WWDG Early Wakeup interrupt(EWI). + * @note Once enabled this interrupt cannot be disabled except by a system reset. + * @param None + * @retval None + */ +void WWDG_EnableIT(void) +{ + *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; +} + +/** + * @brief Sets the WWDG counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F (to prevent generating + * an immediate reset). + * @retval None + */ +void WWDG_SetCounter(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + /* Write to T[6:0] bits to configure the counter value, no need to do + a read-modify-write; writing a 0 to WDGA bit does nothing */ + WWDG->CR = Counter & BIT_MASK; +} + +/** + * @} + */ + +/** @defgroup WWDG_Group2 WWDG activation functions + * @brief WWDG activation functions + * +@verbatim + ============================================================================== + ##### WWDG activation function ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables WWDG and load the counter value. + * @param Counter: specifies the watchdog counter value. + * This parameter must be a number between 0x40 and 0x7F (to prevent generating + * an immediate reset). + * @retval None + */ +void WWDG_Enable(uint8_t Counter) +{ + /* Check the parameters */ + assert_param(IS_WWDG_COUNTER(Counter)); + WWDG->CR = WWDG_CR_WDGA | Counter; +} + +/** + * @} + */ + +/** @defgroup WWDG_Group3 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + ============================================================================== + ##### Interrupts and flags management functions ##### + ============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Checks whether the Early Wakeup interrupt flag is set or not. + * @param None + * @retval The new state of the Early Wakeup interrupt flag (SET or RESET). + */ +FlagStatus WWDG_GetFlagStatus(void) +{ + FlagStatus bitstatus = RESET; + + if ((WWDG->SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears Early Wakeup interrupt flag. + * @param None + * @retval None + */ +void WWDG_ClearFlag(void) +{ + WWDG->SR = (uint32_t)RESET; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/Release_Notes.html b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/Release_Notes.html new file mode 100644 index 0000000..e9c0846 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/Release_Notes.html @@ -0,0 +1,850 @@ + + + + + + + Release Notes for STM32F10x and STM32L1xx USB-FS-Device Driver + + + + + + + +
      +

      + +   + + +

      +
      + + + + + + +
      + + + + + + + + + +
      +

      + + Back to Release page + + + + + +

      +

      + Release Notes for +

      +

      +  STM32F10x and STM32L1xx USB-FS-Device Driver + + + + +

      +

      + Copyright 2012 STMicroelectronics + + + + + + + +

      +

      + + + + + + + +

      +

      + +   + + +

      + + + + + + +
      +

      + Contents + + +

      +
        +
      1. + + Update History + + +
      2. +
      3. + + License + + +
      4. +
      +

      + Update History

      V3.4.0 / 29-June-2012

      +

      Main +Changes

      + +
      • All source files: license disclaimer text update and add link to the License file on ST Internet.
      +

      + V3.3.0 / 21-March-2011 +

      +

      + + Main Changes + + + +

      +
        +
      • + Update library driver to support + + + STM32L15x Medium-Density Low-Power + + + devices (add STM32L1xx defines). +
      • +
      • + Minor fixes: +
      • +
          +
        • + otgd_fs_cal.c: correction of iteration number in OTGD_FS_CoreInitDev() function. +
        • +
        +
          +
        • + usb_core.c: update the remote wakeup checking condition in NoData_Setup0() function. +
        • +
        +
          +
        • + otgd_fs_int.c: update the data count in case of 0 packet length in OTGD_FS_Handle_RxStatusQueueLevel_ISR() function. +
        • +
        +
      + + + + + +

      + + 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/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h new file mode 100644 index 0000000..cfa24b9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h @@ -0,0 +1,217 @@ +/** + ****************************************************************************** + * @file otgd_fs_cal.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Header of OTG FS Device Core Access Layer interface. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + +#ifndef __OTG_CORE_H__ +#define __OTG_CORE_H__ + +#ifdef STM32F10X_CL + +#include "stm32f10x.h" +#include "usb_type.h" + +#if defined ( __CC_ARM ) + #define __packed __packed /*!< packing keyword for ARM Compiler */ +#elif defined ( __ICCARM__ ) + #define __packed __packed /*!< packing keyword for IAR Compiler */ +#elif defined ( __GNUC__ ) + #define __packed __attribute__ ((__packed__)) /*!< packing keyword for GNU Compiler */ +#elif defined ( __TASKING__ ) /*!< packing keyword for TASKING Compiler */ + #define __packed +#endif /* __CC_ARM */ + +/******************************************************************************* + define and types +*******************************************************************************/ + +#define DEVICE_MODE_ENABLED + +#ifndef NULL +#define NULL ((void *)0) +#endif + + +#define DEV_EP_TX_DIS 0x0000 +#define DEV_EP_TX_STALL 0x0010 +#define DEV_EP_TX_NAK 0x0020 +#define DEV_EP_TX_VALID 0x0030 + +#define DEV_EP_RX_DIS 0x0000 +#define DEV_EP_RX_STALL 0x1000 +#define DEV_EP_RX_NAK 0x2000 +#define DEV_EP_RX_VALID 0x3000 + +#define USB_OTG_TIMEOUT 200000 +/***************** GLOBAL DEFINES ***************************/ + +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 + +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 + +#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 + +/***************** DEVICE DEFINES ***************************/ + +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 + + + + +typedef enum { + + USB_OTG_OK, + USB_OTG_FAIL + +} +USB_OTG_Status; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint32_t tx_fifo_num; + uint32_t type; + uint8_t even_odd_frame; + uint32_t maxpacket; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; +} +USB_OTG_EP , *PUSB_OTG_EP; + +/******************************************************************************** + MACRO'S +********************************************************************************/ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DINEPS[epnum]->DIEPINTx,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DOUTEPS[epnum]->DOEPINTx,doepint.d32); + + +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) + +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) + +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + + +#define uDELAY(usec) USB_OTG_BSP_uDelay(usec) +#define mDELAY(msec) USB_OTG_BSP_uDelay(1000 * msec) + +#define _OTGD_FS_GATE_PHYCLK *(__IO uint32_t*)(0x50000E00) = 0x03 +#define _OTGD_FS_UNGATE_PHYCLK *(__IO uint32_t*)(0x50000E00) = 0x00 + +/******************************************************************************* + USB OTG INTERNAL TIME BASE +*******************************************************************************/ +void USB_OTG_BSP_uDelay (const uint32_t usec); +/******************************************************************************** + EXPORTED FUNCTIONS FROM THE OTGD_FS_CAL LAYER +********************************************************************************/ +USB_OTG_Status OTGD_FS_CoreInit(void); +USB_OTG_Status OTGD_FS_SetAddress(uint32_t BaseAddress); +USB_OTG_Status OTGD_FS_EnableGlobalInt(void); +USB_OTG_Status OTGD_FS_DisableGlobalInt(void); +USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num); +USB_OTG_Status OTGD_FS_FlushRxFifo (void); +USB_OTG_Status OTGD_FS_CoreInitDev (void); +USB_OTG_Status OTGD_FS_EnableDevInt(void); +USB_OTG_Status OTGD_FS_EP0Activate(void); +USB_OTG_Status OTGD_FS_EPActivate(USB_OTG_EP *ep); +USB_OTG_Status OTGD_FS_EPDeactivate(USB_OTG_EP *ep); +USB_OTG_Status OTGD_FS_EPStartXfer(USB_OTG_EP *ep); +USB_OTG_Status OTGD_FS_EP0StartXfer(USB_OTG_EP *ep); +USB_OTG_Status OTGD_FS_EPSetStall(USB_OTG_EP *ep); +USB_OTG_Status OTGD_FS_EPClearStall(USB_OTG_EP *ep); +uint32_t OTGD_FS_ReadDevAllOutEp_itr(void); +uint32_t OTGD_FS_ReadDevOutEP_itr(USB_OTG_EP *ep); +uint32_t OTGD_FS_ReadDevAllInEPItr(void); +uint32_t OTGD_FS_GetEPStatus(USB_OTG_EP *ep); +uint32_t USBD_FS_IsDeviceMode(void); +uint32_t OTGD_FS_ReadCoreItr(void); +USB_OTG_Status OTGD_FS_WritePacket(uint8_t *src, + uint8_t ep_num, + uint16_t bytes); +void* OTGD_FS_ReadPacket(uint8_t *dest, + uint16_t bytes); + +void OTGD_FS_SetEPStatus(USB_OTG_EP *ep, uint32_t Status); +void OTGD_FS_SetRemoteWakeup(void); +void OTGD_FS_ResetRemoteWakeup(void); + +#endif /* STM32F10X_CL */ + +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h new file mode 100644 index 0000000..d97c03d --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @file otg_dev.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief linking defines + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __OTG_DEV_H__ +#define __OTG_DEV_H__ + +#ifdef STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usb_type.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* Endpoint types */ +#define OTG_DEV_EP_TYPE_CONTROL 0 +#define OTG_DEV_EP_TYPE_ISOC 1 +#define OTG_DEV_EP_TYPE_BULK 2 +#define OTG_DEV_EP_TYPE_INT 3 + +/* Endpoint Addresses (w/direction) */ +#define EP0_OUT 0x00 +#define EP0_IN 0x80 +#define EP1_OUT 0x01 +#define EP1_IN 0x81 +#define EP2_OUT 0x02 +#define EP2_IN 0x82 +#define EP3_OUT 0x03 +#define EP3_IN 0x83 + + +/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h defines -*-*-*-*-*-*-*-*-*-*-*-*-*/ +/* endpoints enumeration */ +#define ENDP0 ((uint8_t)0) +#define ENDP1 ((uint8_t)1) +#define ENDP2 ((uint8_t)2) +#define ENDP3 ((uint8_t)3) +#define ENDP4 ((uint8_t)4) +#define ENDP5 ((uint8_t)5) +#define ENDP6 ((uint8_t)6) +#define ENDP7 ((uint8_t)7) + +/* EP Transmit status defines */ +#define EP_TX_DIS DEV_EP_TX_DIS) /* EndPoint TX DISabled */ +#define EP_TX_STALL DEV_EP_TX_STALL /* EndPoint TX STALLed */ +#define EP_TX_NAK DEV_EP_TX_NAK /* EndPoint TX NAKed */ +#define EP_TX_VALID DEV_EP_TX_VALID /* EndPoint TX VALID */ + +/* EP Transmit status defines */ +#define EP_RX_DIS DEV_EP_RX_DIS /* EndPoint RX DISabled */ +#define EP_RX_STALL DEV_EP_RX_STALL /* EndPoint RX STALLed */ +#define EP_RX_NAK DEV_EP_RX_NAK /* EndPoint RX NAKed */ +#define EP_RX_VALID DEV_EP_RX_VALID /* EndPoint RX VALID */ +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +/* Exported macro ------------------------------------------------------------*/ +#define _GetEPTxStatus(bEpNum) ((uint16_t)OTG_DEV_GetEPTxStatus(bEpNum)) +#define _GetEPRxStatus(bEpNum) ((uint16_t)OTG_DEV_GetEPRxStatus(bEpNum)) + +#define _SetEPTxStatus(bEpNum,wState) (OTG_DEV_SetEPTxStatus(bEpNum, wState)) +#define _SetEPRxStatus(bEpNum,wState) (OTG_DEV_SetEPRxStatus(bEpNum, wState)) + +#define _SetEPTxValid(bEpNum) (OTG_DEV_SetEPTxStatus(bEpNum, EP_TX_VALID)) +#define _SetEPRxValid(bEpNum) (OTG_DEV_SetEPRxStatus(bEpNum, EP_RX_VALID)) + +#define _GetTxStallStatus(bEpNum) (OTG_DEV_GetEPTxStatus(bEpNum) == EP_TX_STALL) +#define _GetRxStallStatus(bEpNum) (OTG_DEV_GetEPRxStatus(bEpNum) == EP_RX_STALL) + +/* Define the callbacks for updating the USB state machine */ +#define OTGD_FS_DEVICE_RESET Device_Property.Reset() + +/* Exported define -----------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void OTG_DEV_Init(void); +void OTG_DEV_EP_Init(uint8_t bEpAdd, uint8_t bEpType, uint16_t wEpMaxPackSize); + +void OTG_DEV_SetEPRxStatus(uint8_t bEpnum, uint32_t status); +void OTG_DEV_SetEPTxStatus(uint8_t bEpnum, uint32_t status); +uint32_t OTG_DEV_GetEPRxStatus(uint8_t bEpnum); +uint32_t OTG_DEV_GetEPTxStatus(uint8_t bEpnum); + +void USB_DevDisconnect(void); +void USB_DevConnect(void); + + +/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h prototypes *-*-*-*-*-*-*-*-*-*-*-*/ +void SetEPTxStatus(uint8_t bEpNum, uint16_t wState); +void SetEPRxStatus(uint8_t bEpNum, uint16_t wState); +uint16_t GetEPTxStatus(uint8_t bEpNum); +uint16_t GetEPRxStatus(uint8_t bEpNum); +void SetEPTxValid(uint8_t bEpNum); +void SetEPRxValid(uint8_t bEpNum); +uint16_t GetTxStallStatus(uint8_t bEpNum); +uint16_t GetRxStallStatus(uint8_t bEpNum); +void SetEPTxCount(uint8_t bEpNum, uint16_t wCount); +void SetEPRxCount(uint8_t bEpNum, uint16_t wCount); + +uint16_t ToWord(uint8_t, uint8_t); +uint16_t ByteSwap(uint16_t); +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +#endif /* STM32F10X_CL */ + +#endif /* __OTG_DEV_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h new file mode 100644 index 0000000..9885293 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * @file otgd_fs_int.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Endpoint interrupt's service routines prototypes. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_INT_H +#define __USB_INT_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#ifdef STM32F10X_CL + +/* Interrupt Handlers functions */ +uint32_t OTGD_FS_Handle_Sof_ISR(void); +uint32_t OTGD_FS_Handle_RxStatusQueueLevel_ISR(void); +uint32_t OTGD_FS_Handle_GInNakEff_ISR(void); +uint32_t OTGD_FS_Handle_GOutNakEff_ISR(void); +uint32_t OTGD_FS_Handle_EarlySuspend_ISR(void); +uint32_t OTGD_FS_Handle_USBSuspend_ISR(void); +uint32_t OTGD_FS_Handle_UsbReset_ISR(void); +uint32_t OTGD_FS_Handle_EnumDone_ISR(void); +uint32_t OTGD_FS_Handle_IsoOutDrop_ISR(void); +uint32_t OTGD_FS_Handle_EOPF_ISR(void); +uint32_t OTGD_FS_Handle_EPMismatch_ISR(void); +uint32_t OTGD_FS_Handle_InEP_ISR(void); +uint32_t OTGD_FS_Handle_OutEP_ISR(void); +uint32_t OTGD_FS_Handle_IncomplIsoIn_ISR(void); +uint32_t OTGD_FS_Handle_IncomplIsoOut_ISR(void); +uint32_t OTGD_FS_Handle_Wakeup_ISR(void); + +#endif /* STM32F10X_CL */ + +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_INT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h new file mode 100644 index 0000000..76dcad2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file otgd_fs_pcd.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Header file of the High Layer device mode interface and wrapping layer + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + + +#ifndef __USB_OTG_PCD_H__ +#define __USB_OTG_PCD_H__ + +#include "otgd_fs_regs.h" + +#define MAX_EP0_SIZE 0x40 +#define MAX_PACKET_SIZE 0x400 + + +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 +#define USB_ENDPOINT_XFERTYPE_MASK 3 + + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, USB_SPEED_FULL, + USB_SPEED_HIGH +}; +/******************************************************************************** + Data structure type +********************************************************************************/ +typedef struct usb_ep_descriptor +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; +/******************************************************************************** + USBF LAYER UNION AND STRUCTURES +********************************************************************************/ +typedef struct USB_OTG_USBF +{ + + USB_OTG_EP ep0; + USB_OTG_EP in_ep[ NUM_TX_FIFOS - 1]; + USB_OTG_EP out_ep[ NUM_TX_FIFOS - 1]; +} +USB_OTG_PCD_DEV , *USB_OTG_PCD_PDEV; +/******************************************************************************** + EXPORTED FUNCTION FROM THE USB_OTG LAYER +********************************************************************************/ +void PCD_Init(void); +void PCD_DevConnect (void); +void PCD_DevDisconnect (void); +void PCD_EP_SetAddress (uint8_t address); +uint32_t PCD_EP_Open(EP_DESCRIPTOR *epdesc); +uint32_t PCD_EP_Close ( uint8_t ep_addr); +uint32_t PCD_EP_Read ( uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t PCD_EP_Write ( uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t PCD_EP_Stall (uint8_t epnum); +uint32_t PCD_EP_ClrStall (uint8_t epnum); +uint32_t PCD_EP_Flush (uint8_t epnum); +uint32_t PCD_Handle_ISR(void); + +USB_OTG_EP* PCD_GetOutEP(uint32_t ep_num) ; +USB_OTG_EP* PCD_GetInEP(uint32_t ep_num); +void PCD_EP0_OutStart(void); + +#endif +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h new file mode 100644 index 0000000..0d9d877 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h @@ -0,0 +1,726 @@ +/** + ****************************************************************************** + * @file otgd_fs_regs.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief USB OTG IP hardware registers. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + + +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +#ifdef STM32F10X_CL + +#include "stm32f10x.h" +#include "usb_type.h" + +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x0000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x0800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x0900 +#define USB_OTG_EP_REG_OFFSET 0x0020 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0x0B00 +#define USB_OTG_PCGCCTL_OFFSET 0x0E00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + +#define NUM_TX_FIFOS 4 +/******************************************************************************* + * USB_OTG Core registers . + * The USB_OTG_USB_OTG_FS_REGS structure defines the size + * and relative field offsets for the Core Global registers. + ******************************************************************************/ +typedef struct _USB_OTG_GREGS //000h +{ + + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status reg 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0; /* EP0 Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + uint32_t Reserved30[2]; /* Reserved 030h*/ + __IO uint32_t GCCFG; /* General Core configuration reg 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t reserved[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXFx[NUM_TX_FIFOS - 1]; /* dev Transmit FIFO */ + +} +USB_OTG_GREGS; + +/******************************************************************************* + * dev Registers + * dev Global Registers : Offsets 800h-BFFh + * The following structures define the size and relative field offsets + * for the dev Mode Registers. + * These registers are visible only in dev mode and must not be + * accessed in Host mode, as the results are unknown + ******************************************************************************/ +typedef struct _USB_OTG_DEV // 800h +{ + + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t reservedC; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20[2]; /* Reserved 820h-824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t Reserved30; /* Reserved 830h*/ + __IO uint32_t DIEPEMPMSK; /* IN EP FIFO empty int mask 834h*/ + +} +USB_OTG_DEV; +/******************************************************************************* + * dev Logical IN Endpoint-Specific Registers: Offsets 900h-AFCh + * There will be one set of endpoint registers per logical endpoint implemented. + * These registers are visible only in dev mode and must not be + * accessed in Host mode, as the results are unknown +*******************************************************************************/ +typedef struct _USB_OTG_DINEPS +{ + __IO uint32_t DIEPCTLx; /* dev IN EP Ctl Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINTx; /* dev IN EP Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZx; /* dev IN EP Tx Size 900h + (ep_num * 20h) + 10h*/ + uint32_t reserved14; /* Reserved 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTSx; /* IN EP TxFIFO Sts 900h + (ep_num * 20h) + 18h*/ + uint32_t reserved18; /* Reserved 900h + (ep_num * 20h) + 1Ch*/ + +} +USB_OTG_DINEPS; + +/******************************************************************************* + * dev Logical OUT Endpoint-Specific Registers Offsets: B00h-CFCh + * There will be one set of endpoint registers per logical endpoint + * implemented. + * These registers are visible only in dev mode and must not be + * accessed in Host mode, as the results are unknown +******************************************************************************/ +typedef struct _USB_OTG_DOUTEPS +{ + __IO uint32_t DOEPCTLx; /* OUT EP Ctl Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINTx; /* OUT EP Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZx; /* OUT EP Tx Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t Reserved14[3]; /* Reserved B00h + (ep_num * 20h) + 14h*/ +} +USB_OTG_DOUTEPS; + + + +/******************************************************************************* + * otg Core registers . + * The USB_OTG_USB_OTG_FS_REGS structure defines the size + * and relative field offsets for the Core Global registers. + ******************************************************************************/ +typedef struct USB_OTG_USB_OTG_FS_REGS //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DEV *DEV; + USB_OTG_DINEPS *DINEPS[NUM_TX_FIFOS]; + USB_OTG_DOUTEPS *DOUTEPS[NUM_TX_FIFOS]; + __IO uint32_t *FIFO[NUM_TX_FIFOS]; + __IO uint32_t *PCGCCTL; + +} +USB_OTG_CORE_REGS , *pUSB_OTG_CORE_REGS; +/******************************************************************************/ +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t gintmsk : + 1; +uint32_t reserved1 : + 6; +uint32_t txfemplvl : + 1; +uint32_t reserved8_31 : + 24; + } + b; +} +USB_OTG_GAHBCFG_TypeDef; +/******************************************************************************/ + +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t Reserved3_5 : + 3; +uint32_t physel : /* MUST be always 1 because the phy is embedded*/ + 1; +uint32_t Reserved7 : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t reserved15_30 : + 15; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef; +/******************************************************************************/ + +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t reserved3 : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t reserved11_30 : + 20; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef; + +/******************************************************************************/ +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t reserved5 : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef; + +/******************************************************************************/ + + +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t reserved5 : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16_17 : + 2; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef; + +/******************************************************************************/ +typedef union _USB_OTG_GRXSTSP_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t frmnum : + 4; +uint32_t reserved : + 7; + } + b; +} USB_OTG_GRXSTSP_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_FIFOSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FIFOSIZ_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_DTXFSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t reserved : + 16; + } + b; +} USB_OTG_DTXFSTS_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_GCCFG_TypeDef +{ + + uint32_t d32; + struct + { + +uint32_t reserved0 : + 16; +uint32_t pwdn : + 1; +uint32_t reserved17 : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t SOFouten : + 1; +uint32_t reserved21 : + 11; + } + b; +} USB_OTG_GCCFG_TypeDef; + + +/******************************************************************************/ +typedef union _USB_OTG_DCFG_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t reserved13_31 : + 19; + } + b; +} USB_OTG_DCFG_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_DCTL_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t pwronprgdone : + 1; +uint32_t reserved : + 20; + } + b; +} USB_OTG_DCTL_TypeDef; + +/******************************************************************************/ +typedef union _USB_OTG_DSTS_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_DIEPINTx_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdis : + 1; +uint32_t Reserved2 : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t reserved5 : + 1; +uint32_t inepnakeff : + 1; +uint32_t txfempty : + 1; +uint32_t reserved08_31 : + 24; + } + b; +} USB_OTG_DIEPINTx_TypeDef; + + +typedef union _USB_OTG_DIEPINTx_TypeDef USB_OTG_DIEPMSKx_TypeDef; +/******************************************************************************/ + +typedef union _USB_OTG_DOEPINTx_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdis : + 1; +uint32_t reserved2 : + 1; +uint32_t setup : /* for EP0 only */ + 1; +uint32_t outtokenepdis : + 1; +uint32_t reserved5 : + 1; +uint32_t b2bsetup : + 1; +uint32_t reserved07_31 : + 25; + } + b; +} USB_OTG_DOEPINTx_TypeDef; + + +typedef union _USB_OTG_DOEPINTx_TypeDef USB_OTG_DOEPMSKx_TypeDef; + +/******************************************************************************/ +typedef union _USB_OTG_DAINT_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef; + +/******************************************************************************/ +typedef union _USB_OTG_DEPCTLx_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t Reserved11_14 : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t Reserved20 : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setoddfrm : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTLx_TypeDef; + +/******************************************************************************/ + +typedef union _OTG_FS_DEPTSIZx_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mcount : + 2; +uint32_t reserved : + 1; + } + b; +} +OTG_FS_DEPTSIZx_TypeDef; + +/******************************************************************************/ + +typedef union _USB_OTG_DOEPTSIZ0_TypeDef +{ + + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t reserved7_18 : + 12; +uint32_t pktcnt : + 1; +uint32_t reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t reserved31; + } + b; +} USB_OTG_DOEPTSIZ0_TypeDef; + +/******************************************************************************/ + +typedef union _OTG_FS_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t reserved3 : + 30; + } + b; +} OTG_FS_PCGCCTL_TypeDef; + +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + +#endif diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h new file mode 100644 index 0000000..5605ead --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h @@ -0,0 +1,259 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Standard protocol processing functions prototypes + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_CORE_H +#define __USB_CORE_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _CONTROL_STATE +{ + WAIT_SETUP, /* 0 */ + SETTING_UP, /* 1 */ + IN_DATA, /* 2 */ + OUT_DATA, /* 3 */ + LAST_IN_DATA, /* 4 */ + LAST_OUT_DATA, /* 5 */ + WAIT_STATUS_IN, /* 7 */ + WAIT_STATUS_OUT, /* 8 */ + STALLED, /* 9 */ + PAUSE /* 10 */ +} CONTROL_STATE; /* The state machine states of a control pipe */ + +typedef struct OneDescriptor +{ + uint8_t *Descriptor; + uint16_t Descriptor_Size; +} +ONE_DESCRIPTOR, *PONE_DESCRIPTOR; +/* All the request process routines return a value of this type + If the return value is not SUCCESS or NOT_READY, + the software will STALL the correspond endpoint */ +typedef enum _RESULT +{ + USB_SUCCESS = 0, /* Process successfully */ + USB_ERROR, + USB_UNSUPPORT, + USB_NOT_READY /* The process has not been finished, endpoint will be + NAK to further request */ +} RESULT; + + +/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/ +typedef struct _ENDPOINT_INFO +{ + /* When send data out of the device, + CopyData() is used to get data buffer 'Length' bytes data + if Length is 0, + CopyData() returns the total length of the data + if the request is not supported, returns 0 + (NEW Feature ) + if CopyData() returns -1, the calling routine should not proceed + further and will resume the SETUP process by the class device + if Length is not 0, + CopyData() returns a pointer to indicate the data location + Usb_wLength is the data remain to be sent, + Usb_wOffset is the Offset of original data + When receive data from the host, + CopyData() is used to get user data buffer which is capable + of Length bytes data to copy data from the endpoint buffer. + if Length is 0, + CopyData() returns the available data length, + if Length is not 0, + CopyData() returns user buffer address + Usb_rLength is the data remain to be received, + Usb_rPointer is the Offset of data buffer + */ + uint16_t Usb_wLength; + uint16_t Usb_wOffset; + uint16_t PacketSize; + uint8_t *(*CopyData)(uint16_t Length); +}ENDPOINT_INFO; + +/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/ + +typedef struct _DEVICE +{ + uint8_t Total_Endpoint; /* Number of endpoints that are used */ + uint8_t Total_Configuration;/* Number of configuration available */ +} +DEVICE; + +typedef union +{ + uint16_t w; + struct BW + { + uint8_t bb1; + uint8_t bb0; + } + bw; +} uint16_t_uint8_t; + +typedef struct _DEVICE_INFO +{ + uint8_t USBbmRequestType; /* bmRequestType */ + uint8_t USBbRequest; /* bRequest */ + uint16_t_uint8_t USBwValues; /* wValue */ + uint16_t_uint8_t USBwIndexs; /* wIndex */ + uint16_t_uint8_t USBwLengths; /* wLength */ + + uint8_t ControlState; /* of type CONTROL_STATE */ + uint8_t Current_Feature; + uint8_t Current_Configuration; /* Selected configuration */ + uint8_t Current_Interface; /* Selected interface of current configuration */ + uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current + interface*/ + + ENDPOINT_INFO Ctrl_Info; +}DEVICE_INFO; + +typedef struct _DEVICE_PROP +{ + void (*Init)(void); /* Initialize the device */ + void (*Reset)(void); /* Reset routine of this device */ + + /* Device dependent process after the status stage */ + void (*Process_Status_IN)(void); + void (*Process_Status_OUT)(void); + + /* Procedure of process on setup stage of a class specified request with data stage */ + /* All class specified requests with data stage are processed in Class_Data_Setup + Class_Data_Setup() + responses to check all special requests and fills ENDPOINT_INFO + according to the request + If IN tokens are expected, then wLength & wOffset will be filled + with the total transferring bytes and the starting position + If OUT tokens are expected, then rLength & rOffset will be filled + with the total expected bytes and the starting position in the buffer + + If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT + + CAUTION: + Since GET_CONFIGURATION & GET_INTERFACE are highly related to + the individual classes, they will be checked and processed here. + */ + RESULT (*Class_Data_Setup)(uint8_t RequestNo); + + /* Procedure of process on setup stage of a class specified request without data stage */ + /* All class specified requests without data stage are processed in Class_NoData_Setup + Class_NoData_Setup + responses to check all special requests and perform the request + + CAUTION: + Since SET_CONFIGURATION & SET_INTERFACE are highly related to + the individual classes, they will be checked and processed here. + */ + RESULT (*Class_NoData_Setup)(uint8_t RequestNo); + + /*Class_Get_Interface_Setting + This function is used by the file usb_core.c to test if the selected Interface + and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by + the application. + This function is writing by user. It should return "SUCCESS" if the Interface + and Alternate Setting are supported by the application or "UNSUPPORT" if they + are not supported. */ + + RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); + + uint8_t* (*GetDeviceDescriptor)(uint16_t Length); + uint8_t* (*GetConfigDescriptor)(uint16_t Length); + uint8_t* (*GetStringDescriptor)(uint16_t Length); + + /* This field is not used in current library version. It is kept only for + compatibility with previous versions */ + void* RxEP_buffer; + + uint8_t MaxPacketSize; + +}DEVICE_PROP; + +typedef struct _USER_STANDARD_REQUESTS +{ + void (*User_GetConfiguration)(void); /* Get Configuration */ + void (*User_SetConfiguration)(void); /* Set Configuration */ + void (*User_GetInterface)(void); /* Get Interface */ + void (*User_SetInterface)(void); /* Set Interface */ + void (*User_GetStatus)(void); /* Get Status */ + void (*User_ClearFeature)(void); /* Clear Feature */ + void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */ + void (*User_SetDeviceFeature)(void); /* Set Device Feature */ + void (*User_SetDeviceAddress)(void); /* Set Device Address */ +} +USER_STANDARD_REQUESTS; + +/* Exported constants --------------------------------------------------------*/ +#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT)) + +#define Usb_rLength Usb_wLength +#define Usb_rOffset Usb_wOffset + +#define USBwValue USBwValues.w +#define USBwValue0 USBwValues.bw.bb0 +#define USBwValue1 USBwValues.bw.bb1 +#define USBwIndex USBwIndexs.w +#define USBwIndex0 USBwIndexs.bw.bb0 +#define USBwIndex1 USBwIndexs.bw.bb1 +#define USBwLength USBwLengths.w +#define USBwLength0 USBwLengths.bw.bb0 +#define USBwLength1 USBwLengths.bw.bb1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint8_t Setup0_Process(void); +uint8_t Post0_Process(void); +uint8_t Out0_Process(void); +uint8_t In0_Process(void); + +RESULT Standard_SetEndPointFeature(void); +RESULT Standard_SetDeviceFeature(void); + +uint8_t *Standard_GetConfiguration(uint16_t Length); +RESULT Standard_SetConfiguration(void); +uint8_t *Standard_GetInterface(uint16_t Length); +RESULT Standard_SetInterface(void); +uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); + +uint8_t *Standard_GetStatus(uint16_t Length); +RESULT Standard_ClearFeature(void); +void SetDeviceAddress(uint8_t); +void NOP_Process(void); + +extern DEVICE_PROP Device_Property; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern DEVICE Device_Table; +extern DEVICE_INFO Device_Info; + +/* cells saving status during interrupt servicing */ +extern __IO uint16_t SaveRState; +extern __IO uint16_t SaveTState; + +#endif /* __USB_CORE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h new file mode 100644 index 0000000..bcae02b --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h @@ -0,0 +1,92 @@ +/** + ****************************************************************************** + * @file usb_def.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Definitions related to USB Core + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_DEF_H +#define __USB_DEF_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _RECIPIENT_TYPE +{ + DEVICE_RECIPIENT, /* Recipient device */ + INTERFACE_RECIPIENT, /* Recipient interface */ + ENDPOINT_RECIPIENT, /* Recipient endpoint */ + OTHER_RECIPIENT +} RECIPIENT_TYPE; + + +typedef enum _STANDARD_REQUESTS +{ + GET_STATUS = 0, + CLEAR_FEATURE, + RESERVED1, + SET_FEATURE, + RESERVED2, + SET_ADDRESS, + GET_DESCRIPTOR, + SET_DESCRIPTOR, + GET_CONFIGURATION, + SET_CONFIGURATION, + GET_INTERFACE, + SET_INTERFACE, + TOTAL_sREQUEST, /* Total number of Standard request */ + SYNCH_FRAME = 12 +} STANDARD_REQUESTS; + +/* Definition of "USBwValue" */ +typedef enum _DESCRIPTOR_TYPE +{ + DEVICE_DESCRIPTOR = 1, + CONFIG_DESCRIPTOR, + STRING_DESCRIPTOR, + INTERFACE_DESCRIPTOR, + ENDPOINT_DESCRIPTOR +} DESCRIPTOR_TYPE; + +/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */ +typedef enum _FEATURE_SELECTOR +{ + ENDPOINT_STALL, + DEVICE_REMOTE_WAKEUP +} FEATURE_SELECTOR; + +/* Exported constants --------------------------------------------------------*/ +/* Definition of "USBbmRequestType" */ +#define REQUEST_TYPE 0x60 /* Mask to get request type */ +#define STANDARD_REQUEST 0x00 /* Standard request */ +#define CLASS_REQUEST 0x20 /* Class request */ +#define VENDOR_REQUEST 0x40 /* Vendor request */ + +#define RECIPIENT 0x1F /* Mask to get recipient */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __USB_DEF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h new file mode 100644 index 0000000..056c18b --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h @@ -0,0 +1,62 @@ +/** + ****************************************************************************** + * @file usb_init.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Initialization routines & global variables + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_INIT_H +#define __USB_INIT_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void USB_Init(void); + +/* External variables --------------------------------------------------------*/ +/* The number of current endpoint, it will be used to specify an endpoint */ +extern uint8_t EPindex; +/* The number of current device, it is an index to the Device_Table */ +/*extern uint8_t Device_no; */ +/* Points to the DEVICE_INFO structure of current device */ +/* The purpose of this register is to speed up the execution */ +extern DEVICE_INFO* pInformation; +/* Points to the DEVICE_PROP structure of current device */ +/* The purpose of this register is to speed up the execution */ +extern DEVICE_PROP* pProperty; +/* Temporary save the state of Rx & Tx status. */ +/* Whenever the Rx or Tx state is changed, its value is saved */ +/* in this variable first and will be set to the EPRB or EPRA */ +/* at the end of interrupt process */ +extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +extern uint16_t SaveState ; +extern uint16_t wInterrupt_Mask; + +#endif /* __USB_INIT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h new file mode 100644 index 0000000..35479aa --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @file usb_int.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Endpoint CTR (Low and High) interrupt's service routines prototypes + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_INT_H +#define __USB_INT_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void CTR_LP(void); +void CTR_HP(void); + +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_INT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h new file mode 100644 index 0000000..1c34272 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h @@ -0,0 +1,63 @@ +/** + ****************************************************************************** + * @file usb_lib.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief USB library include files + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_LIB_H +#define __USB_LIB_H + +/* Includes ------------------------------------------------------------------*/ +#include "Merged__hw_config.h" +#include "usb_type.h" +#include "usb_regs.h" +#include "usb_def.h" +#include "usb_core.h" +#include "usb_init.h" +#include "usb_sil.h" + +#ifndef STM32F10X_CL + #include "usb_mem.h" + #include "usb_int.h" +#endif /* STM32F10X_CL */ + +#ifdef STM32F10X_CL + #include "otgd_fs_cal.h" + #include "otgd_fs_pcd.h" + #include "otgd_fs_dev.h" + #include "otgd_fs_int.h" +#endif /* STM32F10X_CL */ + + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_LIB_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h new file mode 100644 index 0000000..96745bd --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @file usb_mem.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Utility prototypes functions for memory/PMA transfers + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_MEM_H +#define __USB_MEM_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); + +/* External variables --------------------------------------------------------*/ + +#endif /*__USB_MEM_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h new file mode 100644 index 0000000..230a5e0 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h @@ -0,0 +1,684 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Interface prototype functions to USB cell registers + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_REGS_H +#define __USB_REGS_H + +#ifndef STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef enum _EP_DBUF_DIR +{ + /* double buffered endpoint direction */ + EP_DBUF_ERR, + EP_DBUF_OUT, + EP_DBUF_IN +}EP_DBUF_DIR; + +/* endpoint buffer number */ +enum EP_BUF_NUM +{ + EP_NOBUF, + EP_BUF0, + EP_BUF1 +}; + +/* Exported constants --------------------------------------------------------*/ +#define RegBase (0x40005C00L) /* USB_IP Peripheral Registers base address */ +#define PMAAddr (0x40006000L) /* USB_IP Packet Memory Area base address */ + +/******************************************************************************/ +/* General registers */ +/******************************************************************************/ + +/* Control register */ +#define CNTR ((__IO unsigned *)(RegBase + 0x40)) +/* Interrupt status register */ +#define ISTR ((__IO unsigned *)(RegBase + 0x44)) +/* Frame number register */ +#define FNR ((__IO unsigned *)(RegBase + 0x48)) +/* Device address register */ +#define DADDR ((__IO unsigned *)(RegBase + 0x4C)) +/* Buffer Table address register */ +#define BTABLE ((__IO unsigned *)(RegBase + 0x50)) +/******************************************************************************/ +/* Endpoint registers */ +/******************************************************************************/ +#define EP0REG ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */ + +/* Endpoint Addresses (w/direction) */ +#define EP0_OUT ((uint8_t)0x00) +#define EP0_IN ((uint8_t)0x80) +#define EP1_OUT ((uint8_t)0x01) +#define EP1_IN ((uint8_t)0x81) +#define EP2_OUT ((uint8_t)0x02) +#define EP2_IN ((uint8_t)0x82) +#define EP3_OUT ((uint8_t)0x03) +#define EP3_IN ((uint8_t)0x83) +#define EP4_OUT ((uint8_t)0x04) +#define EP4_IN ((uint8_t)0x84) +#define EP5_OUT ((uint8_t)0x05) +#define EP5_IN ((uint8_t)0x85) +#define EP6_OUT ((uint8_t)0x06) +#define EP6_IN ((uint8_t)0x86) +#define EP7_OUT ((uint8_t)0x07) +#define EP7_IN ((uint8_t)0x87) + +/* endpoints enumeration */ +#define ENDP0 ((uint8_t)0) +#define ENDP1 ((uint8_t)1) +#define ENDP2 ((uint8_t)2) +#define ENDP3 ((uint8_t)3) +#define ENDP4 ((uint8_t)4) +#define ENDP5 ((uint8_t)5) +#define ENDP6 ((uint8_t)6) +#define ENDP7 ((uint8_t)7) + +/******************************************************************************/ +/* ISTR interrupt events */ +/******************************************************************************/ +#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ +#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */ +#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */ +#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */ +#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */ +#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */ +#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */ +#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */ + + +#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */ +#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */ + +#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ +#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/ +#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */ +#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */ +#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */ +#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */ +#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */ +#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */ + +/******************************************************************************/ +/* CNTR control register bits definitions */ +/******************************************************************************/ +#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */ +#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */ +#define CNTR_ERRM (0x2000) /* ERRor Mask */ +#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */ +#define CNTR_SUSPM (0x0800) /* SUSPend Mask */ +#define CNTR_RESETM (0x0400) /* RESET Mask */ +#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */ +#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */ + + +#define CNTR_RESUME (0x0010) /* RESUME request */ +#define CNTR_FSUSP (0x0008) /* Force SUSPend */ +#define CNTR_LPMODE (0x0004) /* Low-power MODE */ +#define CNTR_PDWN (0x0002) /* Power DoWN */ +#define CNTR_FRES (0x0001) /* Force USB RESet */ + +/******************************************************************************/ +/* FNR Frame Number Register bit definitions */ +/******************************************************************************/ +#define FNR_RXDP (0x8000) /* status of D+ data line */ +#define FNR_RXDM (0x4000) /* status of D- data line */ +#define FNR_LCK (0x2000) /* LoCKed */ +#define FNR_LSOF (0x1800) /* Lost SOF */ +#define FNR_FN (0x07FF) /* Frame Number */ +/******************************************************************************/ +/* DADDR Device ADDRess bit definitions */ +/******************************************************************************/ +#define DADDR_EF (0x80) +#define DADDR_ADD (0x7F) +/******************************************************************************/ +/* Endpoint register */ +/******************************************************************************/ +/* bit positions */ +#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */ +#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */ +#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */ +#define EP_SETUP (0x0800) /* EndPoint SETUP */ +#define EP_T_FIELD (0x0600) /* EndPoint TYPE */ +#define EP_KIND (0x0100) /* EndPoint KIND */ +#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */ +#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */ +#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */ +#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */ + +/* EndPoint REGister MASK (no toggle fields) */ +#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) + +/* EP_TYPE[1:0] EndPoint TYPE */ +#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */ +#define EP_BULK (0x0000) /* EndPoint BULK */ +#define EP_CONTROL (0x0200) /* EndPoint CONTROL */ +#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */ +#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */ +#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK) + + +/* EP_KIND EndPoint KIND */ +#define EPKIND_MASK (~EP_KIND & EPREG_MASK) + +/* STAT_TX[1:0] STATus for TX transfer */ +#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */ +#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */ +#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */ +#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */ +#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */ +#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */ +#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK) + +/* STAT_RX[1:0] STATus for RX transfer */ +#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */ +#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */ +#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */ +#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */ +#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK) +/* Exported macro ------------------------------------------------------------*/ +/* SetCNTR */ +#define _SetCNTR(wRegValue) (*CNTR = (uint16_t)wRegValue) + +/* SetISTR */ +#define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue) + +/* SetDADDR */ +#define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue) + +/* SetBTABLE */ +#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8)) + +/* GetCNTR */ +#define _GetCNTR() ((uint16_t) *CNTR) + +/* GetISTR */ +#define _GetISTR() ((uint16_t) *ISTR) + +/* GetFNR */ +#define _GetFNR() ((uint16_t) *FNR) + +/* GetDADDR */ +#define _GetDADDR() ((uint16_t) *DADDR) + +/* GetBTABLE */ +#define _GetBTABLE() ((uint16_t) *BTABLE) + +/* SetENDPOINT */ +#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ + (uint16_t)wRegValue) + +/* GetENDPOINT */ +#define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) + +/******************************************************************************* +* Macro Name : SetEPType +* Description : sets the type in the endpoint register(bits EP_TYPE[1:0]) +* Input : bEpNum: Endpoint Number. +* wType +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\ + ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType ))) + +/******************************************************************************* +* Macro Name : GetEPType +* Description : gets the type in the endpoint register(bits EP_TYPE[1:0]) +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Type +*******************************************************************************/ +#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD) + +/******************************************************************************* +* Macro Name : SetEPTxStatus +* Description : sets the status for tx transfer (bits STAT_TX[1:0]). +* Input : bEpNum: Endpoint Number. +* wState: new state +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + } /* _SetEPTxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxStatus +* Description : sets the status for rx transfer (bits STAT_TX[1:0]) +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPRxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + \ + _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + } /* _SetEPRxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxTxStatus +* Description : sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* wStaterx: new state. +* wStatetx: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\ + register uint32_t _wRegVal; \ + \ + _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wStaterx)!= 0) \ + _wRegVal ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wStaterx)!= 0) \ + _wRegVal ^= EPRX_DTOG2; \ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wStatetx)!= 0) \ + _wRegVal ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wStatetx)!= 0) \ + _wRegVal ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \ + } /* _SetEPRxTxStatus */ +/******************************************************************************* +* Macro Name : GetEPTxStatus / GetEPRxStatus +* Description : gets the status for tx/rx transfer (bits STAT_TX[1:0] +* /STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : status . +*******************************************************************************/ +#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT) + +#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT) + +/******************************************************************************* +* Macro Name : SetEPTxValid / SetEPRxValid +* Description : sets directly the VALID tx/rx-status into the enpoint register +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID)) + +#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID)) + +/******************************************************************************* +* Macro Name : GetTxStallStatus / GetRxStallStatus. +* Description : checks stall condition in an endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : TRUE = endpoint in stall condition. +*******************************************************************************/ +#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \ + == EP_TX_STALL) +#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \ + == EP_RX_STALL) + +/******************************************************************************* +* Macro Name : SetEP_KIND / ClearEP_KIND. +* Description : set & clear EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK)))) +#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK)))) + +/******************************************************************************* +* Macro Name : Set_Status_Out / Clear_Status_Out. +* Description : Sets/clears directly STATUS_OUT bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum) +#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : SetEPDoubleBuff / ClearEPDoubleBuff. +* Description : Sets/clears directly EP_KIND bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum) +#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : ClearEP_CTR_RX / ClearEP_CTR_TX. +* Description : Clears bit CTR_RX / CTR_TX in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK)) +#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK)) + +/******************************************************************************* +* Macro Name : ToggleDTOG_RX / ToggleDTOG_TX . +* Description : Toggles DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) +#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) + +/******************************************************************************* +* Macro Name : ClearDTOG_RX / ClearDTOG_TX. +* Description : Clears DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\ + _ToggleDTOG_RX(bEpNum) +#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\ + _ToggleDTOG_TX(bEpNum) +/******************************************************************************* +* Macro Name : SetEPAddress. +* Description : Sets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* bAddr: Address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\ + EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr) + +/******************************************************************************* +* Macro Name : GetEPAddress. +* Description : Gets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD)) + +#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr)) +#define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr)) +#define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr)) +#define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr)) + +/******************************************************************************* +* Macro Name : SetEPTxAddr / SetEPRxAddr. +* Description : sets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* wAddr: address to be set (must be word aligned). +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1)) +#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1)) + +/******************************************************************************* +* Macro Name : GetEPTxAddr / GetEPRxAddr. +* Description : Gets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : address of the buffer. +*******************************************************************************/ +#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum)) +#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPCountRxReg. +* Description : Sets counter of rx buffer with no. of blocks. +* Input : pdwReg: pointer to counter. +* wCount: Counter. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _BlocksOf32(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 5;\ + if((wCount & 0x1f) == 0)\ + wNBlocks--;\ + *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\ + }/* _BlocksOf32 */ + +#define _BlocksOf2(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 1;\ + if((wCount & 0x1) != 0)\ + wNBlocks++;\ + *pdwReg = (uint32_t)(wNBlocks << 10);\ + }/* _BlocksOf2 */ + +#define _SetEPCountRxReg(dwReg,wCount) {\ + uint16_t wNBlocks;\ + if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\ + else {_BlocksOf2(dwReg,wCount,wNBlocks);}\ + }/* _SetEPCountRxReg */ + + + +#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPTxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + } +/******************************************************************************* +* Macro Name : SetEPTxCount / SetEPRxCount. +* Description : sets counter for the tx/rx buffer. +* Input : bEpNum: endpoint number. +* wCount: Counter value. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount) +#define _SetEPRxCount(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPRxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + } +/******************************************************************************* +* Macro Name : GetEPTxCount / GetEPRxCount. +* Description : gets counter of the tx buffer. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : Counter value. +*******************************************************************************/ +#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff) +#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff) + +/******************************************************************************* +* Macro Name : SetEPDblBuf0Addr / SetEPDblBuf1Addr. +* Description : Sets buffer 0/1 address in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);} +#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);} + +/******************************************************************************* +* Macro Name : SetEPDblBuffAddr. +* Description : Sets addresses in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* : wBuf1Addr = buffer 1 address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\ + } /* _SetEPDblBuffAddr */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Addr / GetEPDblBuf1Addr. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum)) +#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : bDir: endpoint dir EP_DBUF_OUT = OUT +* EP_DBUF_IN = IN +* : wCount: Counter value +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxDblBuf0Count(bEpNum,wCount);} \ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */ \ + *_pEPTxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf0Count*/ + +#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxCount(bEpNum,wCount);}\ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */\ + *_pEPRxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf1Count */ + +#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); \ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); \ + } /* _SetEPDblBuffCount */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Count / GetEPDblBuf1Count. +* Description : Gets buffer 0/1 rx/tx counter for double buffering. +* Input : bEpNum: endpoint number. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) +#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) + + +/* External variables --------------------------------------------------------*/ +extern __IO uint16_t wIstr; /* ISTR register last read value */ + +/* Exported functions ------------------------------------------------------- */ +void SetCNTR(uint16_t /*wRegValue*/); +void SetISTR(uint16_t /*wRegValue*/); +void SetDADDR(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +uint16_t GetCNTR(void); +uint16_t GetISTR(void); +uint16_t GetFNR(void); +uint16_t GetDADDR(void); +uint16_t GetBTABLE(void); +void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/); +uint16_t GetENDPOINT(uint8_t /*bEpNum*/); +void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/); +uint16_t GetEPType(uint8_t /*bEpNum*/); +void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir); +uint16_t GetEPTxStatus(uint8_t /*bEpNum*/); +uint16_t GetEPRxStatus(uint8_t /*bEpNum*/); +void SetEPTxValid(uint8_t /*bEpNum*/); +void SetEPRxValid(uint8_t /*bEpNum*/); +uint16_t GetTxStallStatus(uint8_t /*bEpNum*/); +uint16_t GetRxStallStatus(uint8_t /*bEpNum*/); +void SetEP_KIND(uint8_t /*bEpNum*/); +void ClearEP_KIND(uint8_t /*bEpNum*/); +void Set_Status_Out(uint8_t /*bEpNum*/); +void Clear_Status_Out(uint8_t /*bEpNum*/); +void SetEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEP_CTR_RX(uint8_t /*bEpNum*/); +void ClearEP_CTR_TX(uint8_t /*bEpNum*/); +void ToggleDTOG_RX(uint8_t /*bEpNum*/); +void ToggleDTOG_TX(uint8_t /*bEpNum*/); +void ClearDTOG_RX(uint8_t /*bEpNum*/); +void ClearDTOG_TX(uint8_t /*bEpNum*/); +void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/); +uint8_t GetEPAddress(uint8_t /*bEpNum*/); +void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +uint16_t GetEPTxAddr(uint8_t /*bEpNum*/); +uint16_t GetEPRxAddr(uint8_t /*bEpNum*/); +void SetEPCountRxReg(uint32_t * /*pdwReg*/, uint16_t /*wCount*/); +void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +uint16_t GetEPTxCount(uint8_t /*bEpNum*/); +uint16_t GetEPRxCount(uint8_t /*bEpNum*/); +void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/); +void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/); +void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/); +uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/); +void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/); +EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/); +void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir); +uint16_t ToWord(uint8_t, uint8_t); +uint16_t ByteSwap(uint16_t); + +#endif /* STM32F10X_CL */ + +#endif /* __USB_REGS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h new file mode 100644 index 0000000..186c3c9 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h @@ -0,0 +1,47 @@ +/** + ****************************************************************************** + * @file usb_sil.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Simplified Interface Layer function prototypes. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_SIL_H +#define __USB_SIL_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint32_t USB_SIL_Init(void); +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize); +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer); + +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_SIL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h new file mode 100644 index 0000000..96169ce --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h @@ -0,0 +1,96 @@ +/** + ****************************************************************************** + * @file usb_type.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Type definitions used by the USB Library + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_TYPE_H +#define __USB_TYPE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#ifndef NULL +#define NULL ((void *)0) +#endif + +#if !defined (__STM32F10x_H) && !defined(__STM32L1XX_H) + +typedef signed long s32; +typedef signed short s16; +typedef signed char s8; + +typedef volatile signed long vs32; +typedef volatile signed short vs16; +typedef volatile signed char vs8; + +typedef unsigned long u32; +typedef unsigned short u16; +typedef unsigned char u8; + +typedef unsigned long const uc32; /* Read Only */ +typedef unsigned short const uc16; /* Read Only */ +typedef unsigned char const uc8; /* Read Only */ + +typedef volatile unsigned long vu32; +typedef volatile unsigned short vu16; +typedef volatile unsigned char vu8; + +typedef volatile unsigned long const vuc32; /* Read Only */ +typedef volatile unsigned short const vuc16; /* Read Only */ +typedef volatile unsigned char const vuc8; /* Read Only */ + +typedef enum { RESET = 0, SET = !RESET } FlagStatus, ITStatus; + +typedef enum { DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef enum { ERROR = 0, SUCCESS = !ERROR} ErrorStatus; +#endif /* __STM32F10x_H && __STM32L1XX_H */ + +/*typedef enum +{ + FALSE = 0, TRUE = !FALSE +} +bool;*/ +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif +#ifndef BOOL + #define BOOL unsigned char +#endif + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_TYPE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h.bak b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h.bak new file mode 100644 index 0000000..919ba85 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h.bak @@ -0,0 +1,87 @@ +/** + ****************************************************************************** + * @file usb_type.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Type definitions used by the USB Library + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_TYPE_H +#define __USB_TYPE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#ifndef NULL +#define NULL ((void *)0) +#endif + +#if !defined (__STM32F10x_H) && !defined(__STM32L1XX_H) + +typedef signed long s32; +typedef signed short s16; +typedef signed char s8; + +typedef volatile signed long vs32; +typedef volatile signed short vs16; +typedef volatile signed char vs8; + +typedef unsigned long u32; +typedef unsigned short u16; +typedef unsigned char u8; + +typedef unsigned long const uc32; /* Read Only */ +typedef unsigned short const uc16; /* Read Only */ +typedef unsigned char const uc8; /* Read Only */ + +typedef volatile unsigned long vu32; +typedef volatile unsigned short vu16; +typedef volatile unsigned char vu8; + +typedef volatile unsigned long const vuc32; /* Read Only */ +typedef volatile unsigned short const vuc16; /* Read Only */ +typedef volatile unsigned char const vuc8; /* Read Only */ + +typedef enum { RESET = 0, SET = !RESET } FlagStatus, ITStatus; + +typedef enum { DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef enum { ERROR = 0, SUCCESS = !ERROR} ErrorStatus; +#endif /* __STM32F10x_H && __STM32L1XX_H */ + +/*typedef enum +{ + FALSE = 0, TRUE = !FALSE +} +bool;*/ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/* External variables --------------------------------------------------------*/ + +#endif /* __USB_TYPE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c new file mode 100644 index 0000000..f715803 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c @@ -0,0 +1,1241 @@ +/** + ****************************************************************************** + * @file otgd_fs_cal.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief OTG FS Device Core Access Layer interface. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "otgd_fs_cal.h" +#include "usb_conf.h" +#include "otgd_fs_regs.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +USB_OTG_CORE_REGS USB_OTG_FS_regs; + +/* Private function prototypes -----------------------------------------------*/ +static USB_OTG_Status OTGD_FS_SetDeviceMode(void); +static USB_OTG_Status OTGD_FS_CoreReset(void); + +extern uint32_t STM32_PCD_OTG_ISR_Handler (void); + +/******************************************************************************/ +/* Common Core Layer */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : OTGD_FS_WritePacket +* Description : Writes a packet into the Tx FIFO associated with the EP +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_WritePacket(uint8_t *src, uint8_t ep_num, uint16_t bytes) +{ + USB_OTG_Status status = USB_OTG_OK; + uint32_t dword_count = 0 , i = 0; + __IO uint32_t *fifo; + + /* Find the DWORD length, padded by extra bytes as necessary if MPS + * is not a multiple of DWORD */ + dword_count = (bytes + 3) / 4; + + fifo = USB_OTG_FS_regs.FIFO[ep_num]; + + for (i = 0; i < dword_count; i++, src += 4) + { + USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); + } + + return status; +} +/******************************************************************************* +* Function Name : OTGD_FS_ReadPacket +* Description : Reads a packet from the Rx FIFO +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +void* OTGD_FS_ReadPacket(uint8_t *dest, uint16_t bytes) +{ + uint32_t i = 0; + uint32_t word_count = (bytes + 3) / 4; + + __IO uint32_t *fifo = USB_OTG_FS_regs.FIFO[0]; + uint32_t *data_buff = (uint32_t *)dest; + + for (i = 0; i < word_count; i++, data_buff++) + { + *data_buff = USB_OTG_READ_REG32(fifo); + } + + /* Return the buffer pointer because if the transfer is composed of several packets, + the data of the next packet must be stored following the previous packet's data */ + return ((void *)data_buff); +} + +/******************************************************************************* +* Function Name : OTGD_FS_SetAddress +* Description : Initialize core registers addresses. +* Input : BaseAddress +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_SetAddress(uint32_t BaseAddress) +{ + uint32_t i = 0; + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_FS_regs.GREGS = (USB_OTG_GREGS *)(BaseAddress +\ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + + USB_OTG_FS_regs.DEV = (USB_OTG_DEV *) (BaseAddress +\ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < NUM_TX_FIFOS; i++) + { + USB_OTG_FS_regs.DINEPS[i] = (USB_OTG_DINEPS *) (BaseAddress + \ + USB_OTG_DEV_IN_EP_REG_OFFSET + (i * USB_OTG_EP_REG_OFFSET)); + + USB_OTG_FS_regs.DOUTEPS[i] = (USB_OTG_DOUTEPS *) (BaseAddress + \ + USB_OTG_DEV_OUT_EP_REG_OFFSET + (i * USB_OTG_EP_REG_OFFSET)); + } + + for (i = 0; i < NUM_TX_FIFOS; i++) + { + USB_OTG_FS_regs.FIFO[i] = (uint32_t *)(BaseAddress + \ + USB_OTG_DATA_FIFO_OFFSET + (i * USB_OTG_DATA_FIFO_SIZE)); + } + + USB_OTG_FS_regs.PCGCCTL = (uint32_t *)(BaseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} +/******************************************************************************* +* Function Name : OTGD_FS_CoreInit +* Description : Initialize the USB_OTG controller registers and prepares the core + for device mode or host mode operation. +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_CoreInit(void) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + + usbcfg.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GUSBCFG); + usbcfg.b.physel = 1; + USB_OTG_WRITE_REG32 (&USB_OTG_FS_regs.GREGS->GUSBCFG, usbcfg.d32); + + /* init and configure the phy */ + gccfg.d32 = 0; + gccfg.b.vbussensingB = 1; + gccfg.b.pwdn = 1; + USB_OTG_WRITE_REG32 (&USB_OTG_FS_regs.GREGS->GCCFG, gccfg.d32); + mDELAY(50); + + /* Reset after a PHY select and set Host mode */ + OTGD_FS_CoreReset(); + + /* Set Device Mode */ + OTGD_FS_SetDeviceMode(); + + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_CoreReset +* Description : Soft reset of the core +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +static USB_OTG_Status OTGD_FS_CoreReset(void) +{ + USB_OTG_Status status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t timeout = 0; + + greset.d32 = 0; + + /* Wait for AHB master IDLE state. */ + do + { + uDELAY(5); + greset.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GRSTCTL); + if (++timeout > USB_OTG_TIMEOUT) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + + /* Core Soft Reset */ + timeout = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GRSTCTL, greset.d32 ); + + do + { + greset.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GRSTCTL); + if (++timeout > USB_OTG_TIMEOUT) + { + break; + } + } + while (greset.b.csftrst == 1); + + /* Wait for 3 PHY Clocks*/ + uDELAY(5); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_EnableGlobalInt +* Description : Enables the controller's Global Int in the AHB Config reg +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EnableGlobalInt(void) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + + ahbcfg.b.gintmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_DisableGlobalInt +* Description : Disables the controller's Global Int in the AHB Config reg +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_DisableGlobalInt(void) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.gintmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_FlushTxFifo +* Description : Flush a Tx FIFO +* Input : FIFO num +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num ) +{ + + USB_OTG_Status status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t timeout = 0; + + greset.d32 = 0; + + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GRSTCTL, greset.d32 ); + + do + { + greset.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.GREGS->GRSTCTL); + if (++timeout > USB_OTG_TIMEOUT) + { + break; + } + } + while (greset.b.txfflsh == 1); + + /* Wait for 3 PHY Clocks*/ + uDELAY(5); + + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_FlushRxFifo +* Description : Flush a Rx FIFO +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_FlushRxFifo( void ) +{ + USB_OTG_Status status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t timeout = 0; + + greset.d32 = 0; + + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GRSTCTL, greset.d32 ); + + do + { + greset.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.GREGS->GRSTCTL); + if (++timeout > USB_OTG_TIMEOUT) + { + break; + } + } + while (greset.b.rxfflsh == 1); + + /* Wait for 3 PHY Clocks*/ + uDELAY(5); + + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_SetDeviceMode +* Description : Set device mode +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_SetDeviceMode(void) +{ + + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg ; + + usbcfg.d32 = 0; + + usbcfg.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GUSBCFG); + + usbcfg.b.force_dev = 1; + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GUSBCFG, usbcfg.d32); + + mDELAY(50); + + return status; +} +/******************************************************************************* +* Function Name : IsDeviceMode +* Description : check device mode +* Input : None +* Output : None +* Return : current mode +*******************************************************************************/ +uint32_t USBD_FS_IsDeviceMode(void) +{ + return ((USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS ) & 0x1) == 0 ); +} + +/******************************************************************************* +* Function Name : OTGD_FS_ReadCoreItr +* Description : returns the Core Interrupt register +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint32_t OTGD_FS_ReadCoreItr(void) +{ + uint32_t v = 0; + + v = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GINTMSK); + + return v; +} + +/******************************************************************************* +* Function Name : OTGD_FS_ReadOtgItr +* Description : returns the USB_OTG Interrupt register +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint32_t OTGD_FS_ReadOtgItr (void) +{ + return (USB_OTG_READ_REG32 (&USB_OTG_FS_regs.GREGS->GOTGINT)); +} + +/******************************************************************************/ +/* PCD Core Layer */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : InitDevSpeed +* Description : Initializes the DevSpd field of the DCFG register depending + on the PHY type and the enumeration speed of the device. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +static void InitDevSpeed(void) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = 0; + + dcfg.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCFG); + dcfg.b.devspd = 0x3; /* Full speed PHY */ + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCFG, dcfg.d32); +} +/******************************************************************************* +* Function Name : OTGD_FS_CoreInitDev +* Description : Initialize the USB_OTG controller registers for device mode +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_CoreInitDev (void) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef depctl; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FIFOSIZ_TypeDef txfifosize0; + USB_OTG_FIFOSIZ_TypeDef txfifosize; + uint32_t i = 0; + + depctl.d32 = 0; + dcfg.d32 = 0; + txfifosize0.d32 = 0; + txfifosize.d32 = 0; + + /* Set device speed */ + InitDevSpeed (); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(USB_OTG_FS_regs.PCGCCTL, 0); + + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.DEV->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DCFG, dcfg.d32 ); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GRXFSIZ, RX_FIFO_SIZE); + + /* EP0 TX*/ + txfifosize0.b.depth = TX0_FIFO_SIZE; + txfifosize0.b.startaddr = RX_FIFO_SIZE; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->DIEPTXF0, txfifosize0.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = txfifosize0.b.startaddr + txfifosize0.b.depth; + txfifosize.b.depth = TX1_FIFO_SIZE; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->DIEPTXFx[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_SIZE; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->DIEPTXFx[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_SIZE; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->DIEPTXFx[2], txfifosize.d32 ); + + + /* Flush the FIFOs */ + OTGD_FS_FlushTxFifo(0x10); /* all Tx FIFOs */ + OTGD_FS_FlushRxFifo(); + + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DAINTMSK, 0 ); + + for (i = 0; i < NUM_TX_FIFOS; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DINEPS[i]->DIEPCTLx); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DINEPS[i]->DIEPCTLx, depctl.d32); + + + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DINEPS[i]->DIEPTSIZx, 0); + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DINEPS[i]->DIEPINTx, 0xFF); + } + + for (i = 0; i < 1/* NUM_OUT_EPS*/; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DOUTEPS[i]->DOEPCTLx); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DOUTEPS[i]->DOEPCTLx, depctl.d32); + + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DOUTEPS[i]->DOEPTSIZx, 0); + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DOUTEPS[i]->DOEPINTx, 0xFF); + } + + OTGD_FS_EnableDevInt(); + + return status; +} +/******************************************************************************* +* Function Name : OTGD_FS_EnableDevInt +* Description : Enables the Device mode interrupts +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EnableDevInt(void) +{ + + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intr_mask; + + intr_mask.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the defined interrupts in Device mode */ +#ifdef INTR_SOFINTR + intr_mask.b.sofintr = 1; +#endif /* INTR_SOFINTR */ +#ifdef INTR_RXSTSQLVL + intr_mask.b.rxstsqlvl = 1; +#endif /* INTR_RXSTSQLVL */ +#ifdef INTR_GINNAKEFF + intr_mask.b.ginnakeff = 1; +#endif /* INTR_GINNAKEFF */ +#ifdef INTR_GOUTNAKEFF + intr_mask.b.goutnakeff = 1; +#endif /* INTR_GOUTNAKEFF */ +#ifdef INTR_ERLYSUSPEND + intr_mask.b.erlysuspend = 1; +#endif /* INTR_ERLYSUSPEND */ +#ifdef INTR_USBSUSPEND + intr_mask.b.usbsuspend = 1; +#endif /* INTR_USBSUSPEND */ +#ifdef INTR_USBRESET + intr_mask.b.usbreset = 1; +#endif /* INTR_USBRESET */ +#ifdef INTR_ENUMDONE + intr_mask.b.enumdone = 1; +#endif /* INTR_ENUMDONE */ +#ifdef INTR_ISOOUTDROP + intr_mask.b.isooutdrop = 1; +#endif /* INTR_ISOOUTDROP */ +#ifdef INTR_EOPFRAME + intr_mask.b.eopframe = 1; +#endif /* INTR_EOPFRAME */ +#ifdef INTR_INEPINTR + intr_mask.b.inepintr = 1; +#endif /* INTR_INEPINTR */ +#ifdef INTR_OUTEPINTR + intr_mask.b.outepintr = 1; +#endif /* INTR_OUTEPINTR */ +#ifdef INTR_INCOMPLISOIN + intr_mask.b.incomplisoin = 1; +#endif /* INTR_INCOMPLISOIN */ +#ifdef INTR_INCOMPLISOOUT + intr_mask.b.incomplisoout = 1; +#endif /* INTR_INCOMPLISOOUT */ +#ifdef INTR_DISCONNECT + intr_mask.b.disconnect = 1; +#endif /* INTR_DISCONNECT */ +#ifdef INTR_WKUPINTR + intr_mask.b.wkupintr = 1; +#endif /* INTR_WKUPINTR */ + + USB_OTG_MODIFY_REG32( &USB_OTG_FS_regs.GREGS->GINTMSK, intr_mask.d32, intr_mask.d32); + return status; + +} +/******************************************************************************* +* Function Name : OTGD_FS_EP0Activate +* Description : enables EP0 OUT to receive SETUP packets and configures EP0 + IN for transmitting packets +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EP0Activate(void) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + diepctl.d32 = 0; + dctl.d32 = 0; + + diepctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DINEPS[0]->DIEPCTLx); + diepctl.b.mps = DEP0CTL_MPS_64; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DINEPS[0]->DIEPCTLx, diepctl.d32); + + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32, dctl.d32); + + return status; +} +/******************************************************************************* +* Function Name : OTGD_FS_EPActivate +* Description : Activates an EP +* Input : ep +* Output : None +* Return : num_in_ep +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EPActivate(USB_OTG_EP *ep) +{ + + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx; + daintmsk.ep.out = 1 << ep->num; + } + + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + + /* Enable the Interrupt for this EP */ + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DAINTMSK, 0, daintmsk.d32); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_EPDeactivate +* Description : Deactivates an EP +* Input : ep +* Output : None +* Return : num_in_ep +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EPDeactivate(USB_OTG_EP *ep) +{ + + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef depctl; + __IO uint32_t *addr; + USB_OTG_DAINT_TypeDef daintmsk; + + depctl.d32 = 0; + daintmsk.d32 = 0; + + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx; + daintmsk.ep.out = 1 << ep->num; + } + + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + + /* Disable the Interrupt for this EP */ + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DAINTMSK, daintmsk.d32, 0); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_EPStartXfer +* Description : Handle the setup for data xfer for an EP and starts the xfer +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EPStartXfer(USB_OTG_EP *ep) +{ + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_Status status = USB_OTG_OK; + __IO USB_OTG_DEPCTLx_TypeDef depctl; + OTG_FS_DEPTSIZx_TypeDef deptsiz; + + depctl.d32 = 0; + deptsiz.d32 = 0; + + /* IN endpoint */ + if (ep->is_in == 1) + { + + depctl.d32 = USB_OTG_READ_REG32(&(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx)); + deptsiz.d32 = USB_OTG_READ_REG32(&(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPTSIZx)); + + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mcount = 1; + } + } + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DINEPS[ep->num]->DIEPTSIZx, deptsiz.d32); + + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + uint32_t fifoemptymsk = 0; + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DIEPEMPMSK, 0, fifoemptymsk); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DSTS); + + if (((dsts.b.soffn)&0x1)==0) + { + depctl.b.setoddfrm=1; + } + else + { + depctl.b.setd0pid=1; + } + } + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + /*write buffer in TXFIFO*/ + /* user should ensure that ep->xfer_len <= ep->maxpacket */ + OTGD_FS_WritePacket(ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx)); + deptsiz.d32 = USB_OTG_READ_REG32(&(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPTSIZx)); + + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPTSIZx, deptsiz.d32); + + if (ep->type == EP_TYPE_ISOC) + { + + if (ep->even_odd_frame) + { + depctl.b.setoddfrm = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx, depctl.d32); + + } + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_EP0StartXfer +* Description : Handle the setup for a data xfer for EP0 and starts the xfer +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EP0StartXfer(USB_OTG_EP *ep) +{ + + USB_OTG_Status status = USB_OTG_OK; + uint32_t fifoemptymsk = 0; + USB_OTG_DEPCTLx_TypeDef depctl; + OTG_FS_DEPTSIZx_TypeDef deptsiz; + USB_OTG_DINEPS *in_regs ; + + depctl.d32 = 0; + deptsiz.d32 = 0; + + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = USB_OTG_FS_regs.DINEPS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTLx); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZx); + + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZx, deptsiz.d32); + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTLx, depctl.d32); + + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DIEPEMPMSK, 0, fifoemptymsk); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DOUTEPS[0]->DOEPCTLx); + deptsiz.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DOUTEPS[0]->DOEPTSIZx); + + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DOUTEPS[0]->DOEPTSIZx, deptsiz.d32); + + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(USB_OTG_FS_regs.DOUTEPS[0]->DOEPCTLx), depctl.d32); + } + return status; +} +/******************************************************************************* +* Function Name : OTGD_FS_EPSetStall +* Description : Set the EP STALL +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EPSetStall(USB_OTG_EP *ep) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + + if (ep->is_in == 1) + { + depctl_addr = &(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_EPClearStall +* Description : Clear the EP STALL +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +USB_OTG_Status OTGD_FS_EPClearStall(USB_OTG_EP *ep) +{ + USB_OTG_Status status = USB_OTG_OK; + USB_OTG_DEPCTLx_TypeDef depctl; + __IO uint32_t *depctl_addr; + + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx); + } + else + { + depctl_addr = &(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx); + } + + + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + /* clear the stall bits */ + depctl.b.stall = 0; + + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_ReadDevAllOutEp_itr +* Description : returns the OUT endpoint interrupt bits +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint32_t OTGD_FS_ReadDevAllOutEp_itr(void) +{ + uint32_t v = 0; + + v = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DAINT); + v &= USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + +/******************************************************************************* +* Function Name : OTGD_FS_ReadDevOutEP_itr +* Description : returns the Device OUT EP Interrupt register +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint32_t OTGD_FS_ReadDevOutEP_itr(USB_OTG_EP *ep) +{ + uint32_t v = 0; + + v = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPINTx); + v &= USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DOEPMSK); + return v; +} +/******************************************************************************* +* Function Name : OTGD_FS_ReadDevAllInEPItr +* Description : Get int status register +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint32_t OTGD_FS_ReadDevAllInEPItr(void) +{ + uint32_t v = 0; + + v = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DAINT); + v &= USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DAINTMSK); + return (v & 0xffff); +} + +/******************************************************************************* +* Function Name : OTGD_FS_GetEPStatus +* Description : returns the EP Status +* Input : - ep: pointer to the EP structure +* Output : None +* Return : status: DEV_EP_TX_STALL, DEV_EP_TX_VALID, DEV_EP_TX_NAK, +* DEV_EP_RX_STALL, DEV_EP_RX_VALID or DEV_EP_RX_NAK, +*******************************************************************************/ +uint32_t OTGD_FS_GetEPStatus(USB_OTG_EP *ep) +{ + USB_OTG_DEPCTLx_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx); + } + else + { + depctl_addr = &(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx); + } + + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + if (depctl.b.stall == 1) + Status = DEV_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = DEV_EP_TX_NAK; + else + Status = DEV_EP_TX_VALID; + } + /* Process for OUT endpoint */ + else + { + if (depctl.b.stall == 1) + Status = DEV_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = DEV_EP_RX_NAK; + else + Status = DEV_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/******************************************************************************* +* Function Name : OTGD_FS_SetEPStatus +* Description : Sets the EP Status +* Input : - ep: pointer to the EP structure +* - Status: new status to be set +* Output : None +* Return : None +*******************************************************************************/ +void OTGD_FS_SetEPStatus(USB_OTG_EP *ep, uint32_t Status) +{ + USB_OTG_DEPCTLx_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + + if (ep->is_in == 1) + { + depctl_addr = &(USB_OTG_FS_regs.DINEPS[ep->num]->DIEPCTLx); + } + else + { + depctl_addr = &(USB_OTG_FS_regs.DOUTEPS[ep->num]->DOEPCTLx); + } + + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + if (Status == DEV_EP_TX_STALL) + { + OTGD_FS_EPSetStall(ep); return; + } + else if (Status == DEV_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == DEV_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + OTGD_FS_EPClearStall(ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == DEV_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + if (Status == DEV_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == DEV_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == DEV_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + OTGD_FS_EPClearStall(ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == DEV_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +/******************************************************************************* +* Function Name : OTGD_FS_SetRemoteWakeup +* Description : Enable Remote wakeup signaling +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +void OTGD_FS_SetRemoteWakeup() +{ + USB_OTG_DCTL_TypeDef devctl; + + devctl.d32 = 0; + + devctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL); + + /* Enable the Remote Wakeup signal */ + devctl.b.rmtwkupsig = 1; + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, devctl.d32); +} + +/******************************************************************************* +* Function Name : OTGD_FS_ResetRemoteWakeup +* Description : Disable Remote wakeup signaling +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +void OTGD_FS_ResetRemoteWakeup() +{ + USB_OTG_DCTL_TypeDef devctl; + + + devctl.d32 = 0; + + devctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL); + + /* Disable the Remote Wakeup signal */ + devctl.b.rmtwkupsig = 0; + + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, devctl.d32); +} +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c new file mode 100644 index 0000000..af114b4 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c @@ -0,0 +1,384 @@ +/** + ****************************************************************************** + * @file otgd_fs_dev.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief High Layer device mode interface and wrapping layer. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "otgd_fs_dev.h" +#include "usb_regs.h" +#include "otgd_fs_cal.h" +#include "otgd_fs_pcd.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : OTG_DEV_Init +* Description : Initialize the OTG Device IP and EP0. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void OTG_DEV_Init(void) +{ + EP_DESCRIPTOR ep_descriptor; + + /* Init peripheral driver */ + PCD_Init(); + + /* Configure and open the IN control EP0 */ + ep_descriptor.bEndpointAddress = 0x80; + ep_descriptor.wMaxPacketSize = 64; + ep_descriptor.bmAttributes = USB_ENDPOINT_XFER_CONTROL; + PCD_EP_Open(&ep_descriptor); + + /* Configure and open the OUT control EP0 */ + ep_descriptor.bEndpointAddress = 0x00; + PCD_EP_Open(&ep_descriptor); + + OTGD_FS_EPStartXfer(PCD_GetOutEP(0)); + + /* Enable EP0 to start receiving setup packets */ + PCD_EP0_OutStart(); + + /* Enable USB Global interrupt */ + OTGD_FS_EnableGlobalInt(); +} + + +/******************************************************************************* +* Function Name : OTG_DEV_EP_Init +* Description : Initialize the selected endpoint parameters +* Input : - bEpAdd: address of the endpoint (epnum|epdir) +* example: EP1 OUT -> 0x01 and EP1 IN 0x81. +* - bEpType: OTG_DEV_EP_TYPE_CONTROL, OTG_DEV_EP_TYPE_ISOC, +* OTG_DEV_EP_TYPE_BULK, OTG_DEV_EP_TYPE_INT +* - wEpMaxPackSize: The EP max packet size. +* Output : None. +* Return : Status: New status to be set for the endpoint: +*******************************************************************************/ +void OTG_DEV_EP_Init(uint8_t bEpAdd, uint8_t bEpType, uint16_t wEpMaxPackSize) +{ + EP_DESCRIPTOR ep_descriptor; + USB_OTG_EP *ep; + + /* Set the EP parameters in a structure */ + ep_descriptor.bEndpointAddress = bEpAdd; + ep_descriptor.bmAttributes = bEpType; + ep_descriptor.wMaxPacketSize = wEpMaxPackSize; + + PCD_EP_Flush(bEpAdd); + + /* Open the EP with entered parameters */ + PCD_EP_Open(&ep_descriptor); + + /* Activate the EP if it is an OUT EP */ + if ((bEpAdd & 0x80) == 0) + { + ep = PCD_GetOutEP(bEpAdd & 0x7F); + OTGD_FS_EPStartXfer(ep); + } + else + { + ep = PCD_GetInEP(bEpAdd & 0x7F); + ep->even_odd_frame = 0; + OTG_DEV_SetEPTxStatus(bEpAdd, DEV_EP_TX_NAK); + } + +} + +/******************************************************************************* +* Function Name : OTG_DEV_GetEPTxStatus +* Description : Set the related endpoint status. +* Input : Number of the endpoint. +* Output : None. +* Return : Status: New status to be set for the endpoint: +*******************************************************************************/ +uint32_t OTG_DEV_GetEPTxStatus(uint8_t bEpnum) +{ + USB_OTG_EP *ep; + uint32_t status = 0; + + ep = PCD_GetInEP(bEpnum & 0x7F); + + status = OTGD_FS_GetEPStatus(ep); + + return status; +} + +/******************************************************************************* +* Function Name : OTG_DEV_GetEPRxStatus +* Description : returns the related endpoint status. +* Input : Number of the endpoint. +* Output : None. +* Return : Status: New status to be set for the endpoint: +*******************************************************************************/ +uint32_t OTG_DEV_GetEPRxStatus(uint8_t bEpnum) +{ + USB_OTG_EP *ep; + uint32_t status = 0; + + ep = PCD_GetOutEP(bEpnum & 0x7F); + + status = OTGD_FS_GetEPStatus(ep); + + return status; +} + +/******************************************************************************* +* Function Name : OTG_DEV_SetEPTxStatus +* Description : Sets the related endpoint status. +* Input : - bEpnum: Number of the endpoint. +* - Status: New status to be set for the endpoint. It can be +* DEV_EP_TX_VALID, DEV_EP_TX_STALL, DEV_EP_TX_NAK or +* DEV_EP_TX_DISABLE. +* Output : None. +* Return : None. +*******************************************************************************/ +void OTG_DEV_SetEPTxStatus(uint8_t bEpnum, uint32_t Status) +{ + USB_OTG_EP *ep; + + ep = PCD_GetInEP(bEpnum & 0x7F); + + if ((bEpnum == 0x80) && (Status == DEV_EP_TX_STALL)) + { + ep->is_in = 1; + } + + OTGD_FS_SetEPStatus(ep, Status); +} + +/******************************************************************************* +* Function Name : OTG_DEV_SetEPRxStatus +* Description : Sets the related endpoint status. +* Input : - bEpnum: Number of the endpoint. +* - Status: New status to be set for the endpoint. It can be +* DEV_EP_RX_VALID, DEV_EP_RX_STALL, DEV_EP_RX_NAK or +* DEV_EP_RX_DISABLE. +* Output : None. +* Return : None. +*******************************************************************************/ +void OTG_DEV_SetEPRxStatus(uint8_t bEpnum, uint32_t Status) +{ + USB_OTG_EP *ep; + + ep = PCD_GetOutEP(bEpnum & 0x7F); + + OTGD_FS_SetEPStatus(ep, Status); +} + +/******************************************************************************* +* Function Name : USB_DevDisconnect +* Description : Disconnect the Pull-up resist. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_DevDisconnect(void) +{ + PCD_DevDisconnect(); +} + +/******************************************************************************* +* Function Name : USB_DevConnect +* Description : Disconnect the . +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_DevConnect(void) +{ + PCD_DevConnect(); +} + +/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h defines -*-*-*-*-*-*-*-*-*-*-*-*-*/ + +/******************************************************************************* +* Function Name : SetEPTxStatus +* Description : Set the status of Tx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPTxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : SetEPRxStatus +* Description : Set the status of Rx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPRxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : GetEPTxStatus +* Description : Returns the endpoint Tx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint TX Status +*******************************************************************************/ +uint16_t GetEPTxStatus(uint8_t bEpNum) +{ + return(_GetEPTxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : GetEPRxStatus +* Description : Returns the endpoint Rx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint RX Status +*******************************************************************************/ +uint16_t GetEPRxStatus(uint8_t bEpNum) +{ + return(_GetEPRxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxValid +* Description : Valid the endpoint Tx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxValid(uint8_t bEpNum) +{ + _SetEPTxStatus(bEpNum, EP_TX_VALID); +} + +/******************************************************************************* +* Function Name : SetEPRxValid +* Description : Valid the endpoint Rx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxValid(uint8_t bEpNum) +{ + _SetEPRxStatus(bEpNum, EP_RX_VALID); +} + +/******************************************************************************* +* Function Name : GetTxStallStatus +* Description : Returns the Stall status of the Tx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Tx Stall status. +*******************************************************************************/ +uint16_t GetTxStallStatus(uint8_t bEpNum) +{ + return(_GetTxStallStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : GetRxStallStatus +* Description : Returns the Stall status of the Rx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx Stall status. +*******************************************************************************/ +uint16_t GetRxStallStatus(uint8_t bEpNum) +{ + return(_GetRxStallStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxCount. +* Description : Set the Tx count. +* Input : bEpNum: Endpoint Number. +* wCount: new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) +{ +} + +/******************************************************************************* +* Function Name : SetEPRxCount +* Description : Set the Rx count. +* Input : bEpNum: Endpoint Number. +* wCount: the new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) +{ +} + +/******************************************************************************* +* Function Name : ToWord +* Description : merge two byte in a word. +* Input : bh: byte high, bl: bytes low. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ToWord(uint8_t bh, uint8_t bl) +{ + uint16_t wRet = 0; + wRet = (uint16_t)bl | ((uint16_t)bh << 8); + return(wRet); +} + +/******************************************************************************* +* Function Name : ByteSwap +* Description : Swap two byte in a word. +* Input : wSwW: word to Swap. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ByteSwap(uint16_t wSwW) +{ + uint8_t bTemp = 0; + uint16_t wRet = 0; + + bTemp = (uint8_t)(wSwW & 0xff); + wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); + return(wRet); +} + +#endif /* STM32F10X_CL */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c new file mode 100644 index 0000000..43cf937 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c @@ -0,0 +1,745 @@ +/** + ****************************************************************************** + * @file otgd_fs_int.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Endpoint interrupt's service routines. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "hw_config.h" +#include "usb_type.h" +#include "otgd_fs_int.h" +#include "usb_lib.h" +#include "usb_istr.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +uint8_t USBD_Data_Buffer [RX_FIFO_SIZE]; +__IO uint8_t IsocBuff [(ISOC_BUFFER_SZE * NUM_SUB_BUFFERS)]; +__IO uint32_t IsocBufferIdx = 0; + +extern USB_OTG_CORE_REGS USB_OTG_FS_regs; + +__IO uint16_t SaveRState; +__IO uint16_t SaveTState; + +/* Extern variables ----------------------------------------------------------*/ +extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ +extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ + +/* Private function prototypes -----------------------------------------------*/ +static uint32_t PCD_ReadDevInEP( USB_OTG_EP *ep); +static uint32_t PCD_WriteEmptyTxFifo(uint32_t epnum); + +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_Sof_ISR +* Description : Handles the Start Of Frame detected interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_Sof_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS ; + GINTSTS.d32 = 0; + + /* Call user function */ + INTR_SOFINTR_Callback(); + + /* Clear interrupt */ + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&USB_OTG_FS_regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_RxStatusQueueLevel_ISR +* Description : Handles the Rx Status Queue Level Interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_RxStatusQueueLevel_ISR(void) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_GRXSTSP_TypeDef status; + USB_OTG_EP *ep; + + int_mask.d32 = 0; + status.d32 = 0; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &USB_OTG_FS_regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.GREGS->GRXSTSP ); + + /* Get the related endpoint structure */ + ep = PCD_GetOutEP(status.b.epnum); + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + if (ep->type == EP_TYPE_ISOC) + { + /* Call user function */ + INTR_RXSTSQLVL_ISODU_Callback(); + + /* Copy the received buffer to the RAM */ + OTGD_FS_ReadPacket((uint8_t*)(IsocBuff + (ISOC_BUFFER_SZE * IsocBufferIdx)), status.b.bcnt); + ep->xfer_buff = (uint8_t*)(IsocBuff + (ISOC_BUFFER_SZE * IsocBufferIdx)); + + /* Check if the end of the global buffer has been reached */ + if (IsocBufferIdx == (NUM_SUB_BUFFERS - 1)) + { + /* Reset the buffer index */ + IsocBufferIdx = 0; + } + else + { + /* Increment the buffer index */ + IsocBufferIdx ++; + } + } + else + { + /* Copy the received buffer to the RAM */ + OTGD_FS_ReadPacket(USBD_Data_Buffer, status.b.bcnt); + ep->xfer_buff = USBD_Data_Buffer; + } + + /* Update the endpoint structure */ + ep->xfer_len = status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + else + { + ep->xfer_len = status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in Fifo into the setup buffer in RAM */ + OTGD_FS_ReadPacket(USBD_Data_Buffer, 8); + ep->xfer_buff = USBD_Data_Buffer; + ep->xfer_count += status.b.bcnt; + ep->xfer_len = status.b.bcnt; + break; + default: + break; + } + + /* Call the user function */ + INTR_RXSTSQLVL_Callback(); + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &USB_OTG_FS_regs.GREGS->GINTMSK, 0, int_mask.d32); + + /* Clear interrupt: this is a read only bit, it cannot be cleared by register + access */ + + return 1; +} +/******************************************************************************* +* Function Name : OTGD_FS_Handle_GInNakEff_ISR +* Description : Handles the Global IN Endpoints NAK Effective interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_GInNakEff_ISR(void) +{ + + /* Call user function */ + INTR_GINNAKEFF_Callback(); + + /* Clear interrupt: This is a read only bit, it cannot be cleared by register + access */ + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_GOutNakEff_ISR +* Description : Handles the Global OUT Endpoints NAK Effective interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_GOutNakEff_ISR(void) +{ + /* Call user function */ + INTR_GOUTNAKEFF_Callback(); + + /* Clear interrupt: This is a read only bit, it cannot be cleared by register + access */ + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_EarlySuspend_ISR +* Description : Handles the Early Suspend detected interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_EarlySuspend_ISR(void ) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GINTMSK_TypeDef gintmsk; + + gintsts.d32 = 0; + gintmsk.d32 = 0; + + + /* Call user function */ + INTR_ERLYSUSPEND_Callback(); + + gintmsk.b.erlysuspend = 1; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.GREGS->GINTMSK, gintmsk.d32, 0 ); + + /* Clear interrupt */ + gintsts.b.erlysuspend = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_USBSuspend_ISR +* Description : Handles the Suspend condition detected interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_USBSuspend_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + /* Call user function */ + INTR_USBSUSPEND_Callback(); + + /* Clear interrupt */ + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_UsbReset_ISR +* Description : This interrupt occurs when a USB Reset is detected. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_UsbReset_ISR(void) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSKx_TypeDef doepmsk; + USB_OTG_DIEPMSKx_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i = 0; + + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 =0; + dctl.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wakeup Signalling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32, 0 ); + + /* Flush the NP Tx FIFO */ + OTGD_FS_FlushTxFifo( 0 ); + + /* clear pending interrupts */ + for (i = 0; i < NUM_TX_FIFOS ; i++) + { + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DINEPS[i]->DIEPINTx, 0xFF); + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DOUTEPS[i]->DOEPINTx, 0xFF); + } + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.b2bsetup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.epdis = 1; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DOEPMSK, doepmsk.d32 ); + + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdis = 1; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DIEPMSK, diepmsk.d32 ); + + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.DEV->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DEV->DCFG, dcfg.d32); + + /* setup EP0 to receive SETUP packets */ + PCD_EP0_OutStart(); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + /* Call the user reset function */ + OTGD_FS_DEVICE_RESET; + + /* Call user function */ + INTR_USBRESET_Callback(); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_EnumDone_ISR +* Description : Reads the device status register and set the device speed +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_EnumDone_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + gintsts.d32 = 0; + gusbcfg.d32 = 0; + + OTGD_FS_EP0Activate(); + + /* Set USB turnaround time */ + gusbcfg.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.GREGS->GUSBCFG); + gusbcfg.b.usbtrdtim = 9; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Call user function */ + INTR_ENUMDONE_Callback(); + + /* Clear interrupt */ + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_IsoOutDrop_ISR +* Description : Handles the Isochronous Out packet Dropped interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_IsoOutDrop_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + /* Call user function */ + INTR_ISOOUTDROP_Callback(); + + /* Clear interrupt */ + gintsts.b.isooutdrop = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_EOPF_ISR +* Description : Handles the Expected End Of Periodic Frame interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_EOPF_ISR(void ) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GINTMSK_TypeDef gintmsk; + + gintsts.d32 = 0; + gintmsk.d32 = 0; + + gintmsk.b.eopframe = 1; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.GREGS->GINTMSK, gintmsk.d32, 0 ); + + /* Call user function */ + INTR_EOPFRAME_Callback(); + + /* Clear interrupt */ + gintsts.b.eopframe = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/******************************************************************************* +* Function Name : OTGD_FS_Handle_InEP_ISR +* Description : Handles all IN endpoints interrupts. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_InEP_ISR(void) +{ + USB_OTG_DIEPINTx_TypeDef diepint; + + uint32_t ep_intr = 0; + uint32_t epnum = 0; + USB_OTG_EP *ep; + uint32_t fifoemptymsk = 0; + + diepint.d32 = 0; + ep_intr = OTGD_FS_ReadDevAllInEPItr(); + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + ep = PCD_GetInEP(epnum); + diepint.d32 = PCD_ReadDevInEP(ep); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << ep->num; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DIEPEMPMSK, fifoemptymsk, 0); + + /* Clear the Interrupt flag */ + CLEAR_IN_EP_INTR(epnum, xfercompl); + + if (epnum == 0) + { + /* Call the core IN process for EP0 */ + In0_Process(); + + /* before terminate set Tx & Rx status */ + OTG_DEV_SetEPRxStatus(epnum, SaveRState); + OTG_DEV_SetEPTxStatus(epnum, SaveTState); + } + else + { + /* Call the relative IN endpoint callback */ + (*pEpInt_IN[epnum -1])(); + } + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if (diepint.b.txfempty) + { + if ((epnum == 0) || (OTG_DEV_GetEPTxStatus(epnum) == DEV_EP_TX_VALID)) + { + PCD_WriteEmptyTxFifo(epnum); + } + + CLEAR_IN_EP_INTR(epnum, txfempty); + } + if ( diepint.b.epdis) + { + /* Reset Endpoint Frame ID to 0 */ + ep->even_odd_frame = 0; + + CLEAR_IN_EP_INTR(epnum, epdis); + } + } + epnum++; + ep_intr >>= 1; + } + + /* Call user function */ + INTR_INEPINTR_Callback(); + + return 1; +} + + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_OutEP_ISR +* Description : Handles all OUT endpoints interrupts. +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_OutEP_ISR(void) +{ + uint32_t ep_intr = 0; + USB_OTG_DOEPINTx_TypeDef doepint; + uint32_t epnum = 0; + USB_OTG_EP *ep; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = OTGD_FS_ReadDevAllOutEp_itr(); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + /* Get EP pointer */ + ep = PCD_GetOutEP(epnum); + doepint.d32 = OTGD_FS_ReadDevOutEP_itr(ep); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + + if (epnum == 0) + { + /* Call the OUT process for the EP0 */ + Out0_Process(); + } + else + { + (*pEpInt_OUT[epnum-1])(); + } + } + /* Endpoint disable */ + if ( doepint.b.epdis) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdis); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + if (epnum == 0) + { + /* Call the SETUP process for the EP0 */ + Setup0_Process(); + + /* Before exit, update the Tx status */ + OTG_DEV_SetEPTxStatus(0x80, SaveTState); + } + else + { + /* Other control endpoints */ + } + + /* Clear the EP Interrupt */ + CLEAR_OUT_EP_INTR(epnum, setup); + } + /* Back to back setup received */ + if ( doepint.b.b2bsetup ) + { + if (epnum == 0) + { + /* Call the SETUP process for the EP0 */ + Setup0_Process(); + + /* Before exit, update the Tx status */ + OTG_DEV_SetEPTxStatus(0x80, SaveTState); + } + } + } + epnum++; + ep_intr >>= 1; + } + + /* Call user function */ + INTR_OUTEPINTR_Callback(); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_IncomplIsoIn_ISR +* Description : Handles the Incomplete Isochronous IN transfer error interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_IncomplIsoIn_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + /* Call user function */ + INTR_INCOMPLISOIN_Callback(); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_IncomplIsoOut_ISR +* Description : Handles the Incomplete Isochronous OUT transfer error interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_IncomplIsoOut_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + /* Call user function */ + INTR_INCOMPLISOOUT_Callback(); + + /* Clear interrupt */ + gintsts.b.outepintr = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/******************************************************************************* +* Function Name : OTGD_FS_Handle_Wakeup_ISR +* Description : Handles the Wakeup or Remote Wakeup detected interrupt. +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t OTGD_FS_Handle_Wakeup_ISR(void) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + /* Call user function */ + INTR_WKUPINTR_Callback(); + + /* Clear interrupt */ + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&USB_OTG_FS_regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} +/******************************************************************************* +* Function Name : PCD_ReadDevInEP +* Description : Reads all the Endpoints flags. +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +static uint32_t PCD_ReadDevInEP( USB_OTG_EP *ep) +{ + uint32_t v = 0, msk = 0, emp=0; + + msk = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DIEPMSK); + emp = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DIEPEMPMSK); + msk |= ((emp >> ep->num) & 0x1) << 7; + v = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DINEPS[ep->num]->DIEPINTx) & msk; + + return v; +} + +/******************************************************************************* +* Function Name : PCD_WriteEmptyTxFifo +* Description : Checks Fifo for the next packet to be loaded. +* Input : None +* Output : None +* Return : Status +*******************************************************************************/ +static uint32_t PCD_WriteEmptyTxFifo(uint32_t epnum) +{ + USB_OTG_DTXFSTS_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t dwords = 0; + uint32_t fifoemptymsk = 0; + + txstatus.d32 = 0; + + ep = PCD_GetInEP(epnum); + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + dwords = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &USB_OTG_FS_regs.DINEPS[epnum]->DTXFSTSx); + + + while ((txstatus.b.txfspcavail > dwords) && + (ep->xfer_count < ep->xfer_len) && + (ep->xfer_len) != 0) + { + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + dwords = (len + 3) / 4; + + OTGD_FS_WritePacket(ep->xfer_buff, epnum, len); + + ep->xfer_count += len; + ep->xfer_buff += len; + + txstatus.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DINEPS[epnum]->DTXFSTSx); + + /* Mask the TxFIFOEmpty interrupt to prevent re-entring this routine */ + if (ep->xfer_len == ep->xfer_count) + { + fifoemptymsk = 0x1 << ep->num; + USB_OTG_MODIFY_REG32(&USB_OTG_FS_regs.DEV->DIEPEMPMSK, fifoemptymsk, 0); + } + } + + return 1; +} +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c new file mode 100644 index 0000000..0e7c6ae --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c @@ -0,0 +1,461 @@ +/** + ****************************************************************************** + * @file otgd_fs_pcd.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Peripheral Device Interface low layer. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 STM32F10X_CL + +#include "usb_lib.h" +#include "otgd_fs_cal.h" +#include "otgd_fs_pcd.h" + +USB_OTG_PCD_DEV USB_OTG_PCD_dev; + +extern USB_OTG_CORE_REGS USB_OTG_FS_regs; +/******************************************************************************* +* Function Name : PCD_Init +* Description : Initialize the USB Device portion of the driver. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void PCD_Init(void) +{ + uint32_t i = 0; + USB_OTG_EP *ep; + + /**** SOFTWARE INIT *****/ + + ep = &USB_OTG_PCD_dev.ep0; + + /* Init ep structure */ + ep->num = 0; + ep->tx_fifo_num = 0; + + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = MAX_PACKET_SIZE; + + ep->xfer_buff = 0; + ep->xfer_len = 0; + + for (i = 1; i < NUM_TX_FIFOS ; i++) + { + ep = &USB_OTG_PCD_dev.in_ep[i-1]; + + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = MAX_PACKET_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 1; i < NUM_TX_FIFOS; i++) + { + ep = &USB_OTG_PCD_dev.out_ep[i-1]; + + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = MAX_PACKET_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_PCD_dev.ep0.maxpacket = MAX_EP0_SIZE; + USB_OTG_PCD_dev.ep0.type = EP_TYPE_CTRL; + + /**** HARDWARE INIT *****/ + + /* Set the OTG_USB base registers address */ + OTGD_FS_SetAddress(USB_OTG_FS_BASE_ADDR); + + /* Disable all global interrupts */ + OTGD_FS_DisableGlobalInt(); + + /*Init the Core */ + OTGD_FS_CoreInit(); + + /* Init Device mode*/ + OTGD_FS_CoreInitDev(); +} + +/******************************************************************************* +* Function Name : PCD_EP_Open +* Description : Configure an Endpoint +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Open(EP_DESCRIPTOR *epdesc) +{ + USB_OTG_EP *ep; + + + if ((0x80 & epdesc->bEndpointAddress) != 0) + { + ep = PCD_GetInEP(epdesc->bEndpointAddress & 0x7F); + ep->is_in = 1; + } + else + { + ep = PCD_GetOutEP(epdesc->bEndpointAddress & 0x7F); + ep->is_in = 0; + } + + ep->num = epdesc->bEndpointAddress & 0x7F; + ep->maxpacket = epdesc->wMaxPacketSize; + ep->type = epdesc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; + + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + + OTGD_FS_EPActivate(ep ); + + return 0; +} + +/******************************************************************************* +* Function Name : PCD_EP_Close +* Description : Called when an EP is disabled +* Input : Endpoint address. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Close(uint8_t ep_addr) +{ + + USB_OTG_EP *ep; + + if ((0x80 & ep_addr) != 0) + { + ep = PCD_GetInEP(ep_addr & 0x7F); + } + else + { + ep = PCD_GetOutEP(ep_addr & 0x7F); + } + + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + + OTGD_FS_EPDeactivate(ep ); + return 0; +} + +/******************************************************************************* +* Function Name : PCD_EP_Read +* Description : Read data from Fifo +* Input : Endpoint address. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Read (uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len) +{ + USB_OTG_EP *ep; + uint32_t i = 0; + + ep = PCD_GetOutEP(ep_addr & 0x7F); + + /* copy received data into application buffer */ + for (i = 0 ; i < buf_len ; i++) + { + pbuf[i] = ep->xfer_buff[i]; + } + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if ( ep->num == 0 ) + { + OTGD_FS_EP0StartXfer(ep); + } + else + { + OTGD_FS_EPStartXfer( ep ); + } + + return 0; +} + +/******************************************************************************* +* Function Name : USBF_EP_Write +* Description : Read data from Fifo +* Input : ep +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Write (uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = PCD_GetInEP(ep_addr & 0x7f); + + /* assign data to EP structure buffer */ + ep->xfer_buff = pbuf; + + /* Setup and start the Transfer */ + ep->xfer_count = 0; + ep->xfer_len = buf_len; + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + + if ( ep->num == 0 ) + { + OTGD_FS_EP0StartXfer(ep); + } + else + { + OTGD_FS_EPStartXfer( ep ); + } + + return 0; +} + +/******************************************************************************* +* Function Name : PCD_EP_Stall +* Description : Stall an endpoint. +* Input : Endpoint Address. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Stall (uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((0x80 & ep_addr) != 0) + { + ep = PCD_GetInEP(ep_addr & 0x7F); + } + else + { + ep = PCD_GetOutEP(ep_addr & 0x7F); + } + + ep->num = ep_addr & 0x7F; + ep->is_in = ((ep_addr & 0x80) == 0x80) ? 1 : 0; + + OTGD_FS_EPSetStall(ep); + return (0); +} +/******************************************************************************* +* Function Name : PCD_EP_ClrStall +* Description : Clear stall condition on endpoints. +* Input : Endpoint Address. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_ClrStall (uint8_t ep_addr) +{ + + USB_OTG_EP *ep; + + if ((0x80 & ep_addr) != 0) + { + ep = PCD_GetInEP(ep_addr & 0x7F); + } + else + { + ep = PCD_GetOutEP(ep_addr & 0x7F); + } + + ep->num = ep_addr & 0x7F; + ep->is_in = ((ep_addr & 0x80) == 0x80) ? 1 : 0; + + OTGD_FS_EPClearStall(ep); + + return (0); +} + +/******************************************************************************* +* Function Name : USBF_FCD_EP_Flush() +* Description : This Function flushes the buffer. +* Input : Endpoint Address. +* Output : None +* Return : status +*******************************************************************************/ +uint32_t PCD_EP_Flush (uint8_t ep_addr) +{ + + uint8_t is_out = 0; + uint8_t ep_nbr = 0; + + ep_nbr = ep_addr & 0x7F; + is_out = ((ep_addr & 0x80) == 0x80) ? 0 : 1; + + if (is_out == 0) + { + OTGD_FS_FlushTxFifo(ep_nbr); + } + else + { + OTGD_FS_FlushRxFifo(); + } + PCD_EP_ClrStall(ep_addr); + return (0); +} + +/******************************************************************************* +* Function Name : PCD_EP_SetAddress +* Description : This Function set USB device address +* Input : The new device Address to be set. +* Output : None +* Return : status +*******************************************************************************/ +void PCD_EP_SetAddress (uint8_t address) +{ + + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = 0; + + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &USB_OTG_FS_regs.DEV->DCFG, 0, dcfg.d32); +} + + +/******************************************************************************* +* Function Name : PCD_GetInEP +* Description : This function returns pointer to IN EP struct with number ep_num +* Input : Endpoint Number. +* Output : None +* Return : status +*******************************************************************************/ +USB_OTG_EP* PCD_GetInEP(uint32_t ep_num) +{ + if (ep_num == 0) + { + return &USB_OTG_PCD_dev.ep0; + } + else + { + return &USB_OTG_PCD_dev.in_ep[ep_num - 1]; + } +} +/******************************************************************************* +* Function Name : PCD_GetOutEP +* Description : returns pointer to OUT EP struct with number ep_num +* Input : Endpoint Number. +* Output : None +* Return : USBF_EP +*******************************************************************************/ +USB_OTG_EP* PCD_GetOutEP(uint32_t ep_num) +{ + if (ep_num == 0) + { + return &USB_OTG_PCD_dev.ep0; + } + else + { + return &USB_OTG_PCD_dev.out_ep[ep_num - 1]; + } +} + +/******************************************************************************* +* Function Name : PCD_DevConnect +* Description : Connect device +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +void PCD_DevConnect(void) +{ + + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + + dctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL); + + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32); + mDELAY(25); +} + +/******************************************************************************* +* Function Name : PCD_DevDisconnect +* Description : Disconnect device +* Input : None +* Output : None +* Return : status +*******************************************************************************/ +void PCD_DevDisconnect (void) +{ + + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + + dctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL); + + /* Disconnect device for 20ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32); + mDELAY(25); +} + +/******************************************************************************* +* Function Name : PCD_EP0_OutStart +* Description : Configures EPO to receive SETUP packets. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void PCD_EP0_OutStart(void) +{ + + USB_OTG_DOEPTSIZ0_TypeDef doeptsize0; + doeptsize0.d32 = 0; + + + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + + USB_OTG_WRITE_REG32( &USB_OTG_FS_regs.DOUTEPS[0]->DOEPTSIZx, doeptsize0.d32 ); + +} + +#endif /* STM32F10X_CL */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c new file mode 100644 index 0000000..f7e5429 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c @@ -0,0 +1,1098 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Standard protocol processing (USB v2.0) + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define ValBit(VAR,Place) (VAR & (1 << Place)) +#define SetBit(VAR,Place) (VAR |= (1 << Place)) +#define ClrBit(VAR,Place) (VAR &= ((1 << Place) ^ 255)) + +#ifdef STM32F10X_CL + #define Send0LengthData() {PCD_EP_Write (0, 0, 0) ; vSetEPTxStatus(EP_TX_VALID);} +#else +#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \ + vSetEPTxStatus(EP_TX_VALID); \ + } +#endif /* STM32F10X_CL */ + +#define vSetEPRxStatus(st) (SaveRState = st) +#define vSetEPTxStatus(st) (SaveTState = st) + +#define USB_StatusIn() Send0LengthData() +#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID) + +#define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */ +#define StatusInfo1 StatusInfo.bw.bb0 + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint16_t_uint8_t StatusInfo; + +BOOL Data_Mul_MaxPacketSize = FALSE; +/* Private function prototypes -----------------------------------------------*/ +static void DataStageOut(void); +static void DataStageIn(void); +static void NoData_Setup0(void); +static void Data_Setup0(void); +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Standard_GetConfiguration. +* Description : Return the current configuration variable address. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 1 , if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetConfiguration(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_Configuration); + return 0; + } + pUser_Standard_Requests->User_GetConfiguration(); + return (uint8_t *)&pInformation->Current_Configuration; +} + +/******************************************************************************* +* Function Name : Standard_SetConfiguration. +* Description : This routine is called to set the configuration value +* Then each class should configure device itself. +* Input : None. +* Output : None. +* Return : Return USB_SUCCESS, if the request is performed. +* Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetConfiguration(void) +{ + + if ((pInformation->USBwValue0 <= + Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0) + && (pInformation->USBwIndex == 0)) /*call Back usb spec 2.0*/ + { + pInformation->Current_Configuration = pInformation->USBwValue0; + pUser_Standard_Requests->User_SetConfiguration(); + return USB_SUCCESS; + } + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : Standard_GetInterface. +* Description : Return the Alternate Setting of the current interface. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetInterface(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_AlternateSetting); + return 0; + } + pUser_Standard_Requests->User_GetInterface(); + return (uint8_t *)&pInformation->Current_AlternateSetting; +} + +/******************************************************************************* +* Function Name : Standard_SetInterface. +* Description : This routine is called to set the interface. +* Then each class should configure the interface them self. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetInterface(void) +{ + RESULT Re; + /*Test if the specified Interface and Alternate Setting are supported by + the application Firmware*/ + Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0); + + if (pInformation->Current_Configuration != 0) + { + if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0) + || (pInformation->USBwValue1 != 0)) + { + return USB_UNSUPPORT; + } + else if (Re == USB_SUCCESS) + { + pUser_Standard_Requests->User_SetInterface(); + pInformation->Current_Interface = pInformation->USBwIndex0; + pInformation->Current_AlternateSetting = pInformation->USBwValue0; + return USB_SUCCESS; + } + + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_GetStatus. +* Description : Copy the device request data to "StatusInfo buffer". +* Input : - Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is at end of data block, +* or is invalid when "Length" is 0. +*******************************************************************************/ +uint8_t *Standard_GetStatus(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return 0; + } + + /* Reset Status Information */ + StatusInfo.w = 0; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /*Get Device Status */ + uint8_t Feature = pInformation->Current_Feature; + + /* Remote Wakeup enabled */ + if (ValBit(Feature, 5)) + { + SetBit(StatusInfo0, 1); + } + else + { + ClrBit(StatusInfo0, 1); + } + + /* Bus-powered */ + if (ValBit(Feature, 6)) + { + SetBit(StatusInfo0, 0); + } + else /* Self-powered */ + { + ClrBit(StatusInfo0, 0); + } + } + /*Interface Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + return (uint8_t *)&StatusInfo; + } + /*Get EndPoint Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + uint8_t Related_Endpoint; + uint8_t wIndex0 = pInformation->USBwIndex0; + + Related_Endpoint = (wIndex0 & 0x0f); + if (ValBit(wIndex0, 7)) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* IN Endpoint stalled */ + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */ + } + } + + } + else + { + return NULL; + } + pUser_Standard_Requests->User_GetStatus(); + return (uint8_t *)&StatusInfo; +} + +/******************************************************************************* +* Function Name : Standard_ClearFeature. +* Description : Clear or disable a specific feature. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_ClearFeature(void) +{ + uint32_t Type_Rec = Type_Recipient; + uint32_t Status; + + + if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + {/*Device Clear Feature*/ + ClrBit(pInformation->Current_Feature, 5); + return USB_SUCCESS; + } + else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + {/*EndPoint Clear Feature*/ + DEVICE* pDev; + uint32_t Related_Endpoint; + uint32_t wIndex0; + uint32_t rEP; + + if ((pInformation->USBwValue != ENDPOINT_STALL) + || (pInformation->USBwIndex1 != 0)) + { + return USB_UNSUPPORT; + } + + pDev = &Device_Table; + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((rEP >= pDev->Total_Endpoint) || (Status == 0) + || (pInformation->Current_Configuration == 0)) + { + return USB_UNSUPPORT; + } + + + if (wIndex0 & 0x80) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint )) + { + #ifndef STM32F10X_CL + ClearDTOG_TX(Related_Endpoint); + #endif /* STM32F10X_CL */ + SetEPTxStatus(Related_Endpoint, EP_TX_VALID); + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + if (Related_Endpoint == ENDP0) + { + /* After clear the STALL, enable the default endpoint receiver */ + SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + else + { + #ifndef STM32F10X_CL + ClearDTOG_RX(Related_Endpoint); + #endif /* STM32F10X_CL */ + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + } + } + pUser_Standard_Requests->User_ClearFeature(); + return USB_SUCCESS; + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_SetEndPointFeature +* Description : Set or enable a specific feature of EndPoint +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetEndPointFeature(void) +{ + uint32_t wIndex0; + uint32_t Related_Endpoint; + uint32_t rEP; + uint32_t Status; + + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /* get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if (Related_Endpoint >= Device_Table.Total_Endpoint + || pInformation->USBwValue != 0 || Status == 0 + || pInformation->Current_Configuration == 0) + { + return USB_UNSUPPORT; + } + else + { + if (wIndex0 & 0x80) + { + /* IN endpoint */ + _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); + } + + else + { + /* OUT endpoint */ + _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); + } + } + pUser_Standard_Requests->User_SetEndPointFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_SetDeviceFeature. +* Description : Set or enable a specific feature of Device. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetDeviceFeature(void) +{ + SetBit(pInformation->Current_Feature, 5); + pUser_Standard_Requests->User_SetDeviceFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_GetDescriptorData. +* Description : Standard_GetDescriptorData is used for descriptors transfer. +* : This routine is used for the descriptors resident in Flash +* or RAM +* pDesc can be in either Flash or RAM +* The purpose of this routine is to have a versatile way to +* response descriptors request. It allows user to generate +* certain descriptors with software or read descriptors from +* external storage part by part. +* Input : - Length - Length of the data in this transfer. +* - pDesc - A pointer points to descriptor struct. +* The structure gives the initial address of the descriptor and +* its original size. +* Output : None. +* Return : Address of a part of the descriptor pointed by the Usb_ +* wOffset The buffer pointed by this address contains at least +* Length bytes. +*******************************************************************************/ +uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) +{ + uint32_t wOffset; + + wOffset = pInformation->Ctrl_Info.Usb_wOffset; + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset; + return 0; + } + + return pDesc->Descriptor + wOffset; +} + +/******************************************************************************* +* Function Name : DataStageOut. +* Description : Data stage of a Control Write Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageOut(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_rLength; + + save_rLength = pEPinfo->Usb_rLength; + + if (pEPinfo->CopyData && save_rLength) + { + uint8_t *Buffer; + uint32_t Length; + + Length = pEPinfo->PacketSize; + if (Length > save_rLength) + { + Length = save_rLength; + } + + Buffer = (*pEPinfo->CopyData)(Length); + pEPinfo->Usb_rLength -= Length; + pEPinfo->Usb_rOffset += Length; + + #ifdef STM32F10X_CL + PCD_EP_Read(ENDP0, Buffer, Length); + #else + PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length); + #endif /* STM32F10X_CL */ + } + + if (pEPinfo->Usb_rLength != 0) + { + vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */ + SetEPTxCount(ENDP0, 0); + vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */ + } + /* Set the next State*/ + if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize) + { + pInformation->ControlState = OUT_DATA; + } + else + { + if (pEPinfo->Usb_rLength > 0) + { + pInformation->ControlState = LAST_OUT_DATA; + } + else if (pEPinfo->Usb_rLength == 0) + { + pInformation->ControlState = WAIT_STATUS_IN; + USB_StatusIn(); + } + } +} + +/******************************************************************************* +* Function Name : DataStageIn. +* Description : Data stage of a Control Read Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageIn(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_wLength = pEPinfo->Usb_wLength; + uint32_t ControlState = pInformation->ControlState; + + uint8_t *DataBuffer; + uint32_t Length; + + if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) + { + if(Data_Mul_MaxPacketSize == TRUE) + { + /* No more data to send and empty packet */ + Send0LengthData(); + ControlState = LAST_IN_DATA; + Data_Mul_MaxPacketSize = FALSE; + } + else + { + /* No more data to send so STALL the TX Status*/ + ControlState = WAIT_STATUS_OUT; + + #ifdef STM32F10X_CL + PCD_EP_Read (ENDP0, 0, 0); + #endif /* STM32F10X_CL */ + + #ifndef STM32F10X_CL + vSetEPTxStatus(EP_TX_STALL); + #endif /* STM32F10X_CL */ + } + + goto Expect_Status_Out; + } + + Length = pEPinfo->PacketSize; + ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA; + + if (Length > save_wLength) + { + Length = save_wLength; + } + + DataBuffer = (*pEPinfo->CopyData)(Length); + +#ifdef STM32F10X_CL + PCD_EP_Write (ENDP0, DataBuffer, Length); +#else + UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length); +#endif /* STM32F10X_CL */ + + SetEPTxCount(ENDP0, Length); + + pEPinfo->Usb_wLength -= Length; + pEPinfo->Usb_wOffset += Length; + vSetEPTxStatus(EP_TX_VALID); + + USB_StatusOut();/* Expect the host to abort the data IN stage */ + +Expect_Status_Out: + pInformation->ControlState = ControlState; +} + +/******************************************************************************* +* Function Name : NoData_Setup0. +* Description : Proceed the processing of setup request without data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NoData_Setup0(void) +{ + RESULT Result = USB_UNSUPPORT; + uint32_t RequestNo = pInformation->USBbRequest; + uint32_t ControlState; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /* Device Request*/ + /* SET_CONFIGURATION*/ + if (RequestNo == SET_CONFIGURATION) + { + Result = Standard_SetConfiguration(); + } + + /*SET ADDRESS*/ + else if (RequestNo == SET_ADDRESS) + { + if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) + || (pInformation->USBwIndex != 0) + || (pInformation->Current_Configuration != 0)) + /* Device Address should be 127 or less*/ + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + else + { + Result = USB_SUCCESS; + + #ifdef STM32F10X_CL + SetDeviceAddress(pInformation->USBwValue0); + #endif /* STM32F10X_CL */ + } + } + /*SET FEATURE for Device*/ + else if (RequestNo == SET_FEATURE) + { + if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) \ + && (pInformation->USBwIndex == 0)) + { + Result = Standard_SetDeviceFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + /*Clear FEATURE for Device */ + else if (RequestNo == CLEAR_FEATURE) + { + if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP + && pInformation->USBwIndex == 0 + && ValBit(pInformation->Current_Feature, 5)) + { + Result = Standard_ClearFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + + } + + /* Interface Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + /*SET INTERFACE*/ + if (RequestNo == SET_INTERFACE) + { + Result = Standard_SetInterface(); + } + } + + /* EndPoint Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + /*CLEAR FEATURE for EndPoint*/ + if (RequestNo == CLEAR_FEATURE) + { + Result = Standard_ClearFeature(); + } + /* SET FEATURE for EndPoint*/ + else if (RequestNo == SET_FEATURE) + { + Result = Standard_SetEndPointFeature(); + } + } + else + { + Result = USB_UNSUPPORT; + } + + + if (Result != USB_SUCCESS) + { + Result = (*pProperty->Class_NoData_Setup)(RequestNo); + if (Result == USB_NOT_READY) + { + ControlState = PAUSE; + goto exit_NoData_Setup0; + } + } + + if (Result != USB_SUCCESS) + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + + ControlState = WAIT_STATUS_IN;/* After no data stage SETUP */ + + USB_StatusIn(); + +exit_NoData_Setup0: + pInformation->ControlState = ControlState; + return; +} + +/******************************************************************************* +* Function Name : Data_Setup0. +* Description : Proceed the processing of setup request with data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Data_Setup0(void) +{ + uint8_t *(*CopyRoutine)(uint16_t); + RESULT Result; + uint32_t Request_No = pInformation->USBbRequest; + + uint32_t Related_Endpoint, Reserved; + uint32_t wOffset, Status; + + + + CopyRoutine = NULL; + wOffset = 0; + + /*GET DESCRIPTOR*/ + if (Request_No == GET_DESCRIPTOR) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + uint8_t wValue1 = pInformation->USBwValue1; + if (wValue1 == DEVICE_DESCRIPTOR) + { + CopyRoutine = pProperty->GetDeviceDescriptor; + } + else if (wValue1 == CONFIG_DESCRIPTOR) + { + CopyRoutine = pProperty->GetConfigDescriptor; + } + else if (wValue1 == STRING_DESCRIPTOR) + { + CopyRoutine = pProperty->GetStringDescriptor; + } /* End of GET_DESCRIPTOR */ + } + } + + /*GET STATUS*/ + else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) + && (pInformation->USBwLength == 0x0002) + && (pInformation->USBwIndex1 == 0)) + { + /* GET STATUS for Device*/ + if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + && (pInformation->USBwIndex == 0)) + { + CopyRoutine = Standard_GetStatus; + } + + /* GET STATUS for Interface*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) + && (pInformation->Current_Configuration != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + /* GET STATUS for EndPoint*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + Related_Endpoint = (pInformation->USBwIndex0 & 0x0f); + Reserved = pInformation->USBwIndex0 & 0x70; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) + && (Status != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + } + + /*GET CONFIGURATION*/ + else if (Request_No == GET_CONFIGURATION) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + CopyRoutine = Standard_GetConfiguration; + } + } + /*GET INTERFACE*/ + else if (Request_No == GET_INTERFACE) + { + if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) + && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) + { + CopyRoutine = Standard_GetInterface; + } + + } + + if (CopyRoutine) + { + pInformation->Ctrl_Info.Usb_wOffset = wOffset; + pInformation->Ctrl_Info.CopyData = CopyRoutine; + /* sb in the original the cast to word was directly */ + /* now the cast is made step by step */ + (*CopyRoutine)(0); + Result = USB_SUCCESS; + } + else + { + Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest); + if (Result == USB_NOT_READY) + { + pInformation->ControlState = PAUSE; + return; + } + } + + if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) + { + /* Data is not ready, wait it */ + pInformation->ControlState = PAUSE; + return; + } + if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) + { + /* Unsupported request */ + pInformation->ControlState = STALLED; + return; + } + + + if (ValBit(pInformation->USBbmRequestType, 7)) + { + /* Device ==> Host */ + __IO uint32_t wLength = pInformation->USBwLength; + + /* Restrict the data length to be the one host asks for */ + if (pInformation->Ctrl_Info.Usb_wLength > wLength) + { + pInformation->Ctrl_Info.Usb_wLength = wLength; + } + + else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) + { + if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) + { + Data_Mul_MaxPacketSize = FALSE; + } + else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) + { + Data_Mul_MaxPacketSize = TRUE; + } + } + + pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; + DataStageIn(); + } + else + { + pInformation->ControlState = OUT_DATA; + vSetEPRxStatus(EP_RX_VALID); /* enable for next data reception */ + } + + return; +} + +/******************************************************************************* +* Function Name : Setup0_Process +* Description : Get the device request data and dispatch to individual process. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Setup0_Process(void) +{ + + union + { + uint8_t* b; + uint16_t* w; + } pBuf; + +#ifdef STM32F10X_CL + USB_OTG_EP *ep; + uint16_t offset = 0; + + ep = PCD_GetOutEP(ENDP0); + pBuf.b = ep->xfer_buff; +#else + uint16_t offset = 1; + + pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */ +#endif /* STM32F10X_CL */ + + if (pInformation->ControlState != PAUSE) + { + pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */ + pInformation->USBbRequest = *pBuf.b++; /* bRequest */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwLength = *pBuf.w; /* wLength */ + } + + pInformation->ControlState = SETTING_UP; + if (pInformation->USBwLength == 0) + { + /* Setup with no data stage */ + NoData_Setup0(); + } + else + { + /* Setup with data stage */ + Data_Setup0(); + } + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : In0_Process +* Description : Process the IN token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t In0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + DataStageIn(); + /* ControlState may be changed outside the function */ + ControlState = pInformation->ControlState; + } + + else if (ControlState == WAIT_STATUS_IN) + { + if ((pInformation->USBbRequest == SET_ADDRESS) && + (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))) + { + SetDeviceAddress(pInformation->USBwValue0); + pUser_Standard_Requests->User_SetDeviceAddress(); + } + (*pProperty->Process_Status_IN)(); + ControlState = STALLED; + } + + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Out0_Process +* Description : Process the OUT token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Out0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + /* host aborts the transfer before finish */ + ControlState = STALLED; + } + else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA)) + { + DataStageOut(); + ControlState = pInformation->ControlState; /* may be changed outside the function */ + } + + else if (ControlState == WAIT_STATUS_OUT) + { + (*pProperty->Process_Status_OUT)(); + #ifndef STM32F10X_CL + ControlState = STALLED; + #endif /* STM32F10X_CL */ + } + + + /* Unexpect state, STALL the endpoint */ + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Post0_Process +* Description : Stall the Endpoint 0 in case of error. +* Input : None. +* Output : None. +* Return : - 0 if the control State is in PAUSE +* - 1 if not. +*******************************************************************************/ +uint8_t Post0_Process(void) +{ +#ifdef STM32F10X_CL + USB_OTG_EP *ep; +#endif /* STM32F10X_CL */ + + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + + if (pInformation->ControlState == STALLED) + { + vSetEPRxStatus(EP_RX_STALL); + vSetEPTxStatus(EP_TX_STALL); + } + +#ifdef STM32F10X_CL + else if ((pInformation->ControlState == OUT_DATA) || + (pInformation->ControlState == WAIT_STATUS_OUT)) + { + ep = PCD_GetInEP(0); + ep->is_in = 0; + OTGD_FS_EP0StartXfer(ep); + + vSetEPTxStatus(EP_TX_VALID); + } + + else if ((pInformation->ControlState == IN_DATA) || + (pInformation->ControlState == WAIT_STATUS_IN)) + { + ep = PCD_GetInEP(0); + ep->is_in = 1; + OTGD_FS_EP0StartXfer(ep); + } +#endif /* STM32F10X_CL */ + + return (pInformation->ControlState == PAUSE); +} + +/******************************************************************************* +* Function Name : SetDeviceAddress. +* Description : Set the device and all the used Endpoints addresses. +* Input : - Val: device address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDeviceAddress(uint8_t Val) +{ +#ifdef STM32F10X_CL + PCD_EP_SetAddress ((uint8_t)Val); +#else + uint32_t i; + uint32_t nEP = Device_Table.Total_Endpoint; + + /* set address in every used endpoint */ + for (i = 0; i < nEP; i++) + { + _SetEPAddress((uint8_t)i, (uint8_t)i); + } /* for */ + _SetDADDR(Val | DADDR_EF); /* set device address and enable function */ +#endif /* STM32F10X_CL */ +} + +/******************************************************************************* +* Function Name : NOP_Process +* Description : No operation function. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NOP_Process(void) +{ +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c.bak b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c.bak new file mode 100644 index 0000000..023c4b6 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c.bak @@ -0,0 +1,1098 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Standard protocol processing (USB v2.0) + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define ValBit(VAR,Place) (VAR & (1 << Place)) +#define SetBit(VAR,Place) (VAR |= (1 << Place)) +#define ClrBit(VAR,Place) (VAR &= ((1 << Place) ^ 255)) + +#ifdef STM32F10X_CL + #define Send0LengthData() {PCD_EP_Write (0, 0, 0) ; vSetEPTxStatus(EP_TX_VALID);} +#else +#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \ + vSetEPTxStatus(EP_TX_VALID); \ + } +#endif /* STM32F10X_CL */ + +#define vSetEPRxStatus(st) (SaveRState = st) +#define vSetEPTxStatus(st) (SaveTState = st) + +#define USB_StatusIn() Send0LengthData() +#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID) + +#define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */ +#define StatusInfo1 StatusInfo.bw.bb0 + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint16_t_uint8_t StatusInfo; + +bool Data_Mul_MaxPacketSize = FALSE; +/* Private function prototypes -----------------------------------------------*/ +static void DataStageOut(void); +static void DataStageIn(void); +static void NoData_Setup0(void); +static void Data_Setup0(void); +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Standard_GetConfiguration. +* Description : Return the current configuration variable address. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 1 , if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetConfiguration(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_Configuration); + return 0; + } + pUser_Standard_Requests->User_GetConfiguration(); + return (uint8_t *)&pInformation->Current_Configuration; +} + +/******************************************************************************* +* Function Name : Standard_SetConfiguration. +* Description : This routine is called to set the configuration value +* Then each class should configure device itself. +* Input : None. +* Output : None. +* Return : Return USB_SUCCESS, if the request is performed. +* Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetConfiguration(void) +{ + + if ((pInformation->USBwValue0 <= + Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0) + && (pInformation->USBwIndex == 0)) /*call Back usb spec 2.0*/ + { + pInformation->Current_Configuration = pInformation->USBwValue0; + pUser_Standard_Requests->User_SetConfiguration(); + return USB_SUCCESS; + } + else + { + return USB_UNSUPPORT; + } +} + +/******************************************************************************* +* Function Name : Standard_GetInterface. +* Description : Return the Alternate Setting of the current interface. +* Input : Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is invalid when "Length" is 0. +* Return "Buffer" if the "Length" is not 0. +*******************************************************************************/ +uint8_t *Standard_GetInterface(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = + sizeof(pInformation->Current_AlternateSetting); + return 0; + } + pUser_Standard_Requests->User_GetInterface(); + return (uint8_t *)&pInformation->Current_AlternateSetting; +} + +/******************************************************************************* +* Function Name : Standard_SetInterface. +* Description : This routine is called to set the interface. +* Then each class should configure the interface them self. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetInterface(void) +{ + RESULT Re; + /*Test if the specified Interface and Alternate Setting are supported by + the application Firmware*/ + Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0); + + if (pInformation->Current_Configuration != 0) + { + if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0) + || (pInformation->USBwValue1 != 0)) + { + return USB_UNSUPPORT; + } + else if (Re == USB_SUCCESS) + { + pUser_Standard_Requests->User_SetInterface(); + pInformation->Current_Interface = pInformation->USBwIndex0; + pInformation->Current_AlternateSetting = pInformation->USBwValue0; + return USB_SUCCESS; + } + + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_GetStatus. +* Description : Copy the device request data to "StatusInfo buffer". +* Input : - Length - How many bytes are needed. +* Output : None. +* Return : Return 0, if the request is at end of data block, +* or is invalid when "Length" is 0. +*******************************************************************************/ +uint8_t *Standard_GetStatus(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return 0; + } + + /* Reset Status Information */ + StatusInfo.w = 0; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /*Get Device Status */ + uint8_t Feature = pInformation->Current_Feature; + + /* Remote Wakeup enabled */ + if (ValBit(Feature, 5)) + { + SetBit(StatusInfo0, 1); + } + else + { + ClrBit(StatusInfo0, 1); + } + + /* Bus-powered */ + if (ValBit(Feature, 6)) + { + SetBit(StatusInfo0, 0); + } + else /* Self-powered */ + { + ClrBit(StatusInfo0, 0); + } + } + /*Interface Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + return (uint8_t *)&StatusInfo; + } + /*Get EndPoint Status*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + uint8_t Related_Endpoint; + uint8_t wIndex0 = pInformation->USBwIndex0; + + Related_Endpoint = (wIndex0 & 0x0f); + if (ValBit(wIndex0, 7)) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* IN Endpoint stalled */ + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */ + } + } + + } + else + { + return NULL; + } + pUser_Standard_Requests->User_GetStatus(); + return (uint8_t *)&StatusInfo; +} + +/******************************************************************************* +* Function Name : Standard_ClearFeature. +* Description : Clear or disable a specific feature. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_ClearFeature(void) +{ + uint32_t Type_Rec = Type_Recipient; + uint32_t Status; + + + if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + {/*Device Clear Feature*/ + ClrBit(pInformation->Current_Feature, 5); + return USB_SUCCESS; + } + else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + {/*EndPoint Clear Feature*/ + DEVICE* pDev; + uint32_t Related_Endpoint; + uint32_t wIndex0; + uint32_t rEP; + + if ((pInformation->USBwValue != ENDPOINT_STALL) + || (pInformation->USBwIndex1 != 0)) + { + return USB_UNSUPPORT; + } + + pDev = &Device_Table; + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((rEP >= pDev->Total_Endpoint) || (Status == 0) + || (pInformation->Current_Configuration == 0)) + { + return USB_UNSUPPORT; + } + + + if (wIndex0 & 0x80) + { + /* IN endpoint */ + if (_GetTxStallStatus(Related_Endpoint )) + { + #ifndef STM32F10X_CL + ClearDTOG_TX(Related_Endpoint); + #endif /* STM32F10X_CL */ + SetEPTxStatus(Related_Endpoint, EP_TX_VALID); + } + } + else + { + /* OUT endpoint */ + if (_GetRxStallStatus(Related_Endpoint)) + { + if (Related_Endpoint == ENDP0) + { + /* After clear the STALL, enable the default endpoint receiver */ + SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + else + { + #ifndef STM32F10X_CL + ClearDTOG_RX(Related_Endpoint); + #endif /* STM32F10X_CL */ + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + } + } + pUser_Standard_Requests->User_ClearFeature(); + return USB_SUCCESS; + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Standard_SetEndPointFeature +* Description : Set or enable a specific feature of EndPoint +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetEndPointFeature(void) +{ + uint32_t wIndex0; + uint32_t Related_Endpoint; + uint32_t rEP; + uint32_t Status; + + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /* get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if (Related_Endpoint >= Device_Table.Total_Endpoint + || pInformation->USBwValue != 0 || Status == 0 + || pInformation->Current_Configuration == 0) + { + return USB_UNSUPPORT; + } + else + { + if (wIndex0 & 0x80) + { + /* IN endpoint */ + _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); + } + + else + { + /* OUT endpoint */ + _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); + } + } + pUser_Standard_Requests->User_SetEndPointFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_SetDeviceFeature. +* Description : Set or enable a specific feature of Device. +* Input : None. +* Output : None. +* Return : - Return USB_SUCCESS, if the request is performed. +* - Return USB_UNSUPPORT, if the request is invalid. +*******************************************************************************/ +RESULT Standard_SetDeviceFeature(void) +{ + SetBit(pInformation->Current_Feature, 5); + pUser_Standard_Requests->User_SetDeviceFeature(); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Standard_GetDescriptorData. +* Description : Standard_GetDescriptorData is used for descriptors transfer. +* : This routine is used for the descriptors resident in Flash +* or RAM +* pDesc can be in either Flash or RAM +* The purpose of this routine is to have a versatile way to +* response descriptors request. It allows user to generate +* certain descriptors with software or read descriptors from +* external storage part by part. +* Input : - Length - Length of the data in this transfer. +* - pDesc - A pointer points to descriptor struct. +* The structure gives the initial address of the descriptor and +* its original size. +* Output : None. +* Return : Address of a part of the descriptor pointed by the Usb_ +* wOffset The buffer pointed by this address contains at least +* Length bytes. +*******************************************************************************/ +uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) +{ + uint32_t wOffset; + + wOffset = pInformation->Ctrl_Info.Usb_wOffset; + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset; + return 0; + } + + return pDesc->Descriptor + wOffset; +} + +/******************************************************************************* +* Function Name : DataStageOut. +* Description : Data stage of a Control Write Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageOut(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_rLength; + + save_rLength = pEPinfo->Usb_rLength; + + if (pEPinfo->CopyData && save_rLength) + { + uint8_t *Buffer; + uint32_t Length; + + Length = pEPinfo->PacketSize; + if (Length > save_rLength) + { + Length = save_rLength; + } + + Buffer = (*pEPinfo->CopyData)(Length); + pEPinfo->Usb_rLength -= Length; + pEPinfo->Usb_rOffset += Length; + + #ifdef STM32F10X_CL + PCD_EP_Read(ENDP0, Buffer, Length); + #else + PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length); + #endif /* STM32F10X_CL */ + } + + if (pEPinfo->Usb_rLength != 0) + { + vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */ + SetEPTxCount(ENDP0, 0); + vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */ + } + /* Set the next State*/ + if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize) + { + pInformation->ControlState = OUT_DATA; + } + else + { + if (pEPinfo->Usb_rLength > 0) + { + pInformation->ControlState = LAST_OUT_DATA; + } + else if (pEPinfo->Usb_rLength == 0) + { + pInformation->ControlState = WAIT_STATUS_IN; + USB_StatusIn(); + } + } +} + +/******************************************************************************* +* Function Name : DataStageIn. +* Description : Data stage of a Control Read Transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void DataStageIn(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_wLength = pEPinfo->Usb_wLength; + uint32_t ControlState = pInformation->ControlState; + + uint8_t *DataBuffer; + uint32_t Length; + + if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) + { + if(Data_Mul_MaxPacketSize == TRUE) + { + /* No more data to send and empty packet */ + Send0LengthData(); + ControlState = LAST_IN_DATA; + Data_Mul_MaxPacketSize = FALSE; + } + else + { + /* No more data to send so STALL the TX Status*/ + ControlState = WAIT_STATUS_OUT; + + #ifdef STM32F10X_CL + PCD_EP_Read (ENDP0, 0, 0); + #endif /* STM32F10X_CL */ + + #ifndef STM32F10X_CL + vSetEPTxStatus(EP_TX_STALL); + #endif /* STM32F10X_CL */ + } + + goto Expect_Status_Out; + } + + Length = pEPinfo->PacketSize; + ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA; + + if (Length > save_wLength) + { + Length = save_wLength; + } + + DataBuffer = (*pEPinfo->CopyData)(Length); + +#ifdef STM32F10X_CL + PCD_EP_Write (ENDP0, DataBuffer, Length); +#else + UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length); +#endif /* STM32F10X_CL */ + + SetEPTxCount(ENDP0, Length); + + pEPinfo->Usb_wLength -= Length; + pEPinfo->Usb_wOffset += Length; + vSetEPTxStatus(EP_TX_VALID); + + USB_StatusOut();/* Expect the host to abort the data IN stage */ + +Expect_Status_Out: + pInformation->ControlState = ControlState; +} + +/******************************************************************************* +* Function Name : NoData_Setup0. +* Description : Proceed the processing of setup request without data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NoData_Setup0(void) +{ + RESULT Result = USB_UNSUPPORT; + uint32_t RequestNo = pInformation->USBbRequest; + uint32_t ControlState; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + /* Device Request*/ + /* SET_CONFIGURATION*/ + if (RequestNo == SET_CONFIGURATION) + { + Result = Standard_SetConfiguration(); + } + + /*SET ADDRESS*/ + else if (RequestNo == SET_ADDRESS) + { + if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) + || (pInformation->USBwIndex != 0) + || (pInformation->Current_Configuration != 0)) + /* Device Address should be 127 or less*/ + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + else + { + Result = USB_SUCCESS; + + #ifdef STM32F10X_CL + SetDeviceAddress(pInformation->USBwValue0); + #endif /* STM32F10X_CL */ + } + } + /*SET FEATURE for Device*/ + else if (RequestNo == SET_FEATURE) + { + if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) \ + && (pInformation->USBwIndex == 0)) + { + Result = Standard_SetDeviceFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + /*Clear FEATURE for Device */ + else if (RequestNo == CLEAR_FEATURE) + { + if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP + && pInformation->USBwIndex == 0 + && ValBit(pInformation->Current_Feature, 5)) + { + Result = Standard_ClearFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + + } + + /* Interface Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + /*SET INTERFACE*/ + if (RequestNo == SET_INTERFACE) + { + Result = Standard_SetInterface(); + } + } + + /* EndPoint Request*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + /*CLEAR FEATURE for EndPoint*/ + if (RequestNo == CLEAR_FEATURE) + { + Result = Standard_ClearFeature(); + } + /* SET FEATURE for EndPoint*/ + else if (RequestNo == SET_FEATURE) + { + Result = Standard_SetEndPointFeature(); + } + } + else + { + Result = USB_UNSUPPORT; + } + + + if (Result != USB_SUCCESS) + { + Result = (*pProperty->Class_NoData_Setup)(RequestNo); + if (Result == USB_NOT_READY) + { + ControlState = PAUSE; + goto exit_NoData_Setup0; + } + } + + if (Result != USB_SUCCESS) + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + + ControlState = WAIT_STATUS_IN;/* After no data stage SETUP */ + + USB_StatusIn(); + +exit_NoData_Setup0: + pInformation->ControlState = ControlState; + return; +} + +/******************************************************************************* +* Function Name : Data_Setup0. +* Description : Proceed the processing of setup request with data stage. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Data_Setup0(void) +{ + uint8_t *(*CopyRoutine)(uint16_t); + RESULT Result; + uint32_t Request_No = pInformation->USBbRequest; + + uint32_t Related_Endpoint, Reserved; + uint32_t wOffset, Status; + + + + CopyRoutine = NULL; + wOffset = 0; + + /*GET DESCRIPTOR*/ + if (Request_No == GET_DESCRIPTOR) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + uint8_t wValue1 = pInformation->USBwValue1; + if (wValue1 == DEVICE_DESCRIPTOR) + { + CopyRoutine = pProperty->GetDeviceDescriptor; + } + else if (wValue1 == CONFIG_DESCRIPTOR) + { + CopyRoutine = pProperty->GetConfigDescriptor; + } + else if (wValue1 == STRING_DESCRIPTOR) + { + CopyRoutine = pProperty->GetStringDescriptor; + } /* End of GET_DESCRIPTOR */ + } + } + + /*GET STATUS*/ + else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) + && (pInformation->USBwLength == 0x0002) + && (pInformation->USBwIndex1 == 0)) + { + /* GET STATUS for Device*/ + if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + && (pInformation->USBwIndex == 0)) + { + CopyRoutine = Standard_GetStatus; + } + + /* GET STATUS for Interface*/ + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) + && (pInformation->Current_Configuration != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + /* GET STATUS for EndPoint*/ + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + Related_Endpoint = (pInformation->USBwIndex0 & 0x0f); + Reserved = pInformation->USBwIndex0 & 0x70; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + /*Get Status of endpoint & stall the request if the related_ENdpoint + is Disabled*/ + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) + && (Status != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + } + + /*GET CONFIGURATION*/ + else if (Request_No == GET_CONFIGURATION) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + CopyRoutine = Standard_GetConfiguration; + } + } + /*GET INTERFACE*/ + else if (Request_No == GET_INTERFACE) + { + if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) + && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) + { + CopyRoutine = Standard_GetInterface; + } + + } + + if (CopyRoutine) + { + pInformation->Ctrl_Info.Usb_wOffset = wOffset; + pInformation->Ctrl_Info.CopyData = CopyRoutine; + /* sb in the original the cast to word was directly */ + /* now the cast is made step by step */ + (*CopyRoutine)(0); + Result = USB_SUCCESS; + } + else + { + Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest); + if (Result == USB_NOT_READY) + { + pInformation->ControlState = PAUSE; + return; + } + } + + if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) + { + /* Data is not ready, wait it */ + pInformation->ControlState = PAUSE; + return; + } + if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) + { + /* Unsupported request */ + pInformation->ControlState = STALLED; + return; + } + + + if (ValBit(pInformation->USBbmRequestType, 7)) + { + /* Device ==> Host */ + __IO uint32_t wLength = pInformation->USBwLength; + + /* Restrict the data length to be the one host asks for */ + if (pInformation->Ctrl_Info.Usb_wLength > wLength) + { + pInformation->Ctrl_Info.Usb_wLength = wLength; + } + + else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) + { + if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) + { + Data_Mul_MaxPacketSize = FALSE; + } + else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) + { + Data_Mul_MaxPacketSize = TRUE; + } + } + + pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; + DataStageIn(); + } + else + { + pInformation->ControlState = OUT_DATA; + vSetEPRxStatus(EP_RX_VALID); /* enable for next data reception */ + } + + return; +} + +/******************************************************************************* +* Function Name : Setup0_Process +* Description : Get the device request data and dispatch to individual process. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Setup0_Process(void) +{ + + union + { + uint8_t* b; + uint16_t* w; + } pBuf; + +#ifdef STM32F10X_CL + USB_OTG_EP *ep; + uint16_t offset = 0; + + ep = PCD_GetOutEP(ENDP0); + pBuf.b = ep->xfer_buff; +#else + uint16_t offset = 1; + + pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */ +#endif /* STM32F10X_CL */ + + if (pInformation->ControlState != PAUSE) + { + pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */ + pInformation->USBbRequest = *pBuf.b++; /* bRequest */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwLength = *pBuf.w; /* wLength */ + } + + pInformation->ControlState = SETTING_UP; + if (pInformation->USBwLength == 0) + { + /* Setup with no data stage */ + NoData_Setup0(); + } + else + { + /* Setup with data stage */ + Data_Setup0(); + } + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : In0_Process +* Description : Process the IN token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t In0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + DataStageIn(); + /* ControlState may be changed outside the function */ + ControlState = pInformation->ControlState; + } + + else if (ControlState == WAIT_STATUS_IN) + { + if ((pInformation->USBbRequest == SET_ADDRESS) && + (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))) + { + SetDeviceAddress(pInformation->USBwValue0); + pUser_Standard_Requests->User_SetDeviceAddress(); + } + (*pProperty->Process_Status_IN)(); + ControlState = STALLED; + } + + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Out0_Process +* Description : Process the OUT token on all default endpoint. +* Input : None. +* Output : None. +* Return : Post0_Process. +*******************************************************************************/ +uint8_t Out0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + /* host aborts the transfer before finish */ + ControlState = STALLED; + } + else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA)) + { + DataStageOut(); + ControlState = pInformation->ControlState; /* may be changed outside the function */ + } + + else if (ControlState == WAIT_STATUS_OUT) + { + (*pProperty->Process_Status_OUT)(); + #ifndef STM32F10X_CL + ControlState = STALLED; + #endif /* STM32F10X_CL */ + } + + + /* Unexpect state, STALL the endpoint */ + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/******************************************************************************* +* Function Name : Post0_Process +* Description : Stall the Endpoint 0 in case of error. +* Input : None. +* Output : None. +* Return : - 0 if the control State is in PAUSE +* - 1 if not. +*******************************************************************************/ +uint8_t Post0_Process(void) +{ +#ifdef STM32F10X_CL + USB_OTG_EP *ep; +#endif /* STM32F10X_CL */ + + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + + if (pInformation->ControlState == STALLED) + { + vSetEPRxStatus(EP_RX_STALL); + vSetEPTxStatus(EP_TX_STALL); + } + +#ifdef STM32F10X_CL + else if ((pInformation->ControlState == OUT_DATA) || + (pInformation->ControlState == WAIT_STATUS_OUT)) + { + ep = PCD_GetInEP(0); + ep->is_in = 0; + OTGD_FS_EP0StartXfer(ep); + + vSetEPTxStatus(EP_TX_VALID); + } + + else if ((pInformation->ControlState == IN_DATA) || + (pInformation->ControlState == WAIT_STATUS_IN)) + { + ep = PCD_GetInEP(0); + ep->is_in = 1; + OTGD_FS_EP0StartXfer(ep); + } +#endif /* STM32F10X_CL */ + + return (pInformation->ControlState == PAUSE); +} + +/******************************************************************************* +* Function Name : SetDeviceAddress. +* Description : Set the device and all the used Endpoints addresses. +* Input : - Val: device address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDeviceAddress(uint8_t Val) +{ +#ifdef STM32F10X_CL + PCD_EP_SetAddress ((uint8_t)Val); +#else + uint32_t i; + uint32_t nEP = Device_Table.Total_Endpoint; + + /* set address in every used endpoint */ + for (i = 0; i < nEP; i++) + { + _SetEPAddress((uint8_t)i, (uint8_t)i); + } /* for */ + _SetDADDR(Val | DADDR_EF); /* set device address and enable function */ +#endif /* STM32F10X_CL */ +} + +/******************************************************************************* +* Function Name : NOP_Process +* Description : No operation function. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void NOP_Process(void) +{ +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c new file mode 100644 index 0000000..02ddbb7 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file usb_init.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Initialization routines & global variables + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* The number of current endpoint, it will be used to specify an endpoint */ + uint8_t EPindex; +/* The number of current device, it is an index to the Device_Table */ +/* uint8_t Device_no; */ +/* Points to the DEVICE_INFO structure of current device */ +/* The purpose of this register is to speed up the execution */ +DEVICE_INFO *pInformation; +/* Points to the DEVICE_PROP structure of current device */ +/* The purpose of this register is to speed up the execution */ +DEVICE_PROP *pProperty; +/* Temporary save the state of Rx & Tx status. */ +/* Whenever the Rx or Tx state is changed, its value is saved */ +/* in this variable first and will be set to the EPRB or EPRA */ +/* at the end of interrupt process */ +uint16_t SaveState ; +uint16_t wInterrupt_Mask; +DEVICE_INFO Device_Info; +USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : USB_Init +* Description : USB system initialization +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Init(void) +{ + pInformation = &Device_Info; + pInformation->ControlState = 2; + pProperty = &Device_Property; + pUser_Standard_Requests = &User_Standard_Requests; + /* Initialize devices one by one */ + pProperty->Init(); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c new file mode 100644 index 0000000..a03fca1 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c @@ -0,0 +1,201 @@ +/** + ****************************************************************************** + * @file usb_int.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Endpoint CTR (Low and High) interrupt's service routines + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + +#ifndef STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint16_t SaveRState; +__IO uint16_t SaveTState; + +/* Extern variables ----------------------------------------------------------*/ +extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ +extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : CTR_LP. +* Description : Low priority Endpoint Correct Transfer interrupt's service +* routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CTR_LP(void) +{ + __IO uint16_t wEPVal = 0; + /* stay in loop while pending interrupts */ + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + /* extract highest priority endpoint number */ + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + if (EPindex == 0) + { + /* Decode and service control endpoint interrupt */ + /* calling related service routine */ + /* (Setup0_Process, In0_Process, Out0_Process) */ + + /* save RX & TX status */ + /* and set both to NAK */ + + + SaveRState = _GetENDPOINT(ENDP0); + SaveTState = SaveRState & EPTX_STAT; + SaveRState &= EPRX_STAT; + + _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); + + /* DIR bit = origin of the interrupt */ + + if ((wIstr & ISTR_DIR) == 0) + { + /* DIR = 0 */ + + /* DIR = 0 => IN int */ + /* DIR = 0 implies that (EP_CTR_TX = 1) always */ + + + _ClearEP_CTR_TX(ENDP0); + In0_Process(); + + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + else + { + /* DIR = 1 */ + + /* DIR = 1 & CTR_RX => SETUP or OUT int */ + /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ + + wEPVal = _GetENDPOINT(ENDP0); + + if ((wEPVal &EP_SETUP) != 0) + { + _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ + Setup0_Process(); + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + + else if ((wEPVal & EP_CTR_RX) != 0) + { + _ClearEP_CTR_RX(ENDP0); + Out0_Process(); + /* before terminate set Tx & Rx status */ + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + } + }/* if(EPindex == 0) */ + else + { + /* Decode and service non control endpoints interrupt */ + + /* process related endpoint register */ + wEPVal = _GetENDPOINT(EPindex); + if ((wEPVal & EP_CTR_RX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_RX(EPindex); + + /* call OUT service function */ + (*pEpInt_OUT[EPindex-1])(); + + } /* if((wEPVal & EP_CTR_RX) */ + + if ((wEPVal & EP_CTR_TX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_TX(EPindex); + + /* call IN service function */ + (*pEpInt_IN[EPindex-1])(); + } /* if((wEPVal & EP_CTR_TX) != 0) */ + + }/* if(EPindex == 0) else */ + + }/* while(...) */ +} + +/******************************************************************************* +* Function Name : CTR_HP. +* Description : High Priority Endpoint Correct Transfer interrupt's service +* routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CTR_HP(void) +{ + uint32_t wEPVal = 0; + + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */ + /* extract highest priority endpoint number */ + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + /* process related endpoint register */ + wEPVal = _GetENDPOINT(EPindex); + if ((wEPVal & EP_CTR_RX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_RX(EPindex); + + /* call OUT service function */ + (*pEpInt_OUT[EPindex-1])(); + + } /* if((wEPVal & EP_CTR_RX) */ + else if ((wEPVal & EP_CTR_TX) != 0) + { + /* clear int flag */ + _ClearEP_CTR_TX(EPindex); + + /* call IN service function */ + (*pEpInt_IN[EPindex-1])(); + + + } /* if((wEPVal & EP_CTR_TX) != 0) */ + + }/* while(...) */ +} + +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c new file mode 100644 index 0000000..e532abc --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c @@ -0,0 +1,89 @@ +/** + ****************************************************************************** + * @file usb_mem.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Utility functions for memory transfers to/from PMA + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + +#ifndef STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/******************************************************************************* +* Function Name : UserToPMABufferCopy +* Description : Copy a buffer from user memory area to packet memory area (PMA) +* Input : - pbUsrBuf: pointer to user memory area. +* - wPMABufAddr: address into PMA. +* - wNBytes: no. of bytes to be copied. +* Output : None. +* Return : None . +*******************************************************************************/ +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */ + uint32_t i, temp1, temp2; + uint16_t *pdwVal; + pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr); + for (i = n; i != 0; i--) + { + temp1 = (uint16_t) * pbUsrBuf; + pbUsrBuf++; + temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; + *pdwVal++ = temp2; + pdwVal++; + pbUsrBuf++; + } +} +/******************************************************************************* +* Function Name : PMAToUserBufferCopy +* Description : Copy a buffer from user memory area to packet memory area (PMA) +* Input : - pbUsrBuf = pointer to user memory area. +* - wPMABufAddr = address into PMA. +* - wNBytes = no. of bytes to be copied. +* Output : None. +* Return : None. +*******************************************************************************/ +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1;/* /2*/ + uint32_t i; + uint32_t *pdwVal; + pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr); + for (i = n; i != 0; i--) + { + *(uint16_t*)pbUsrBuf++ = *pdwVal++; + pbUsrBuf++; + } +} + +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c new file mode 100644 index 0000000..772517e --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c @@ -0,0 +1,764 @@ +/** + ****************************************************************************** + * @file usb_regs.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Interface functions to USB cell registers + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + +#ifndef STM32F10X_CL + +/* Includes ------------------------------------------------------------------*/ +#include "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : SetCNTR. +* Description : Set the CNTR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetCNTR(uint16_t wRegValue) +{ + _SetCNTR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetCNTR. +* Description : returns the CNTR register value. +* Input : None. +* Output : None. +* Return : CNTR register Value. +*******************************************************************************/ +uint16_t GetCNTR(void) +{ + return(_GetCNTR()); +} + +/******************************************************************************* +* Function Name : SetISTR. +* Description : Set the ISTR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetISTR(uint16_t wRegValue) +{ + _SetISTR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetISTR +* Description : Returns the ISTR register value. +* Input : None. +* Output : None. +* Return : ISTR register Value +*******************************************************************************/ +uint16_t GetISTR(void) +{ + return(_GetISTR()); +} + +/******************************************************************************* +* Function Name : GetFNR +* Description : Returns the FNR register value. +* Input : None. +* Output : None. +* Return : FNR register Value +*******************************************************************************/ +uint16_t GetFNR(void) +{ + return(_GetFNR()); +} + +/******************************************************************************* +* Function Name : SetDADDR +* Description : Set the DADDR register value. +* Input : wRegValue: new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDADDR(uint16_t wRegValue) +{ + _SetDADDR(wRegValue); +} + +/******************************************************************************* +* Function Name : GetDADDR +* Description : Returns the DADDR register value. +* Input : None. +* Output : None. +* Return : DADDR register Value +*******************************************************************************/ +uint16_t GetDADDR(void) +{ + return(_GetDADDR()); +} + +/******************************************************************************* +* Function Name : SetBTABLE +* Description : Set the BTABLE. +* Input : wRegValue: New register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetBTABLE(uint16_t wRegValue) +{ + _SetBTABLE(wRegValue); +} + +/******************************************************************************* +* Function Name : GetBTABLE. +* Description : Returns the BTABLE register value. +* Input : None. +* Output : None. +* Return : BTABLE address. +*******************************************************************************/ +uint16_t GetBTABLE(void) +{ + return(_GetBTABLE()); +} + +/******************************************************************************* +* Function Name : SetENDPOINT +* Description : Set the Endpoint register value. +* Input : bEpNum: Endpoint Number. +* wRegValue. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) +{ + _SetENDPOINT(bEpNum, wRegValue); +} + +/******************************************************************************* +* Function Name : GetENDPOINT +* Description : Return the Endpoint register value. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint register value. +*******************************************************************************/ +uint16_t GetENDPOINT(uint8_t bEpNum) +{ + return(_GetENDPOINT(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPType +* Description : sets the type in the endpoint register. +* Input : bEpNum: Endpoint Number. +* wType: type definition. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPType(uint8_t bEpNum, uint16_t wType) +{ + _SetEPType(bEpNum, wType); +} + +/******************************************************************************* +* Function Name : GetEPType +* Description : Returns the endpoint type. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Type +*******************************************************************************/ +uint16_t GetEPType(uint8_t bEpNum) +{ + return(_GetEPType(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxStatus +* Description : Set the status of Tx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPTxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : SetEPRxStatus +* Description : Set the status of Rx endpoint. +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPRxStatus(bEpNum, wState); +} + +/******************************************************************************* +* Function Name : SetDouBleBuffEPStall +* Description : sets the status for Double Buffer Endpoint to STALL +* Input : bEpNum: Endpoint Number. +* bDir: Endpoint direction. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) +{ + uint16_t Endpoint_DTOG_Status; + Endpoint_DTOG_Status = GetENDPOINT(bEpNum); + if (bDir == EP_DBUF_OUT) + { /* OUT double buffered endpoint */ + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); + } + else if (bDir == EP_DBUF_IN) + { /* IN double buffered endpoint */ + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); + } +} + +/******************************************************************************* +* Function Name : GetEPTxStatus +* Description : Returns the endpoint Tx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint TX Status +*******************************************************************************/ +uint16_t GetEPTxStatus(uint8_t bEpNum) +{ + return(_GetEPTxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : GetEPRxStatus +* Description : Returns the endpoint Rx status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint RX Status +*******************************************************************************/ +uint16_t GetEPRxStatus(uint8_t bEpNum) +{ + return(_GetEPRxStatus(bEpNum)); +} + +/******************************************************************************* +* Function Name : SetEPTxValid +* Description : Valid the endpoint Tx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxValid(uint8_t bEpNum) +{ + _SetEPTxStatus(bEpNum, EP_TX_VALID); +} + +/******************************************************************************* +* Function Name : SetEPRxValid +* Description : Valid the endpoint Rx Status. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxValid(uint8_t bEpNum) +{ + _SetEPRxStatus(bEpNum, EP_RX_VALID); +} + +/******************************************************************************* +* Function Name : SetEP_KIND +* Description : Clear the EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEP_KIND(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} + +/******************************************************************************* +* Function Name : ClearEP_KIND +* Description : set the EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_KIND(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : Clear_Status_Out +* Description : Clear the Status Out of the related Endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void Clear_Status_Out(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : Set_Status_Out +* Description : Set the Status Out of the related Endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_Status_Out(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : SetEPDoubleBuff +* Description : Enable the double buffer feature for the endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDoubleBuff(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : ClearEPDoubleBuff +* Description : Disable the double buffer feature for the endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEPDoubleBuff(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* +* Function Name : GetTxStallStatus +* Description : Returns the Stall status of the Tx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Tx Stall status. +*******************************************************************************/ +uint16_t GetTxStallStatus(uint8_t bEpNum) +{ + return(_GetTxStallStatus(bEpNum)); +} +/******************************************************************************* +* Function Name : GetRxStallStatus +* Description : Returns the Stall status of the Rx endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx Stall status. +*******************************************************************************/ +uint16_t GetRxStallStatus(uint8_t bEpNum) +{ + return(_GetRxStallStatus(bEpNum)); +} +/******************************************************************************* +* Function Name : ClearEP_CTR_RX +* Description : Clear the CTR_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_CTR_RX(uint8_t bEpNum) +{ + _ClearEP_CTR_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearEP_CTR_TX +* Description : Clear the CTR_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearEP_CTR_TX(uint8_t bEpNum) +{ + _ClearEP_CTR_TX(bEpNum); +} +/******************************************************************************* +* Function Name : ToggleDTOG_RX +* Description : Toggle the DTOG_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ToggleDTOG_RX(uint8_t bEpNum) +{ + _ToggleDTOG_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ToggleDTOG_TX +* Description : Toggle the DTOG_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ToggleDTOG_TX(uint8_t bEpNum) +{ + _ToggleDTOG_TX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearDTOG_RX. +* Description : Clear the DTOG_RX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearDTOG_RX(uint8_t bEpNum) +{ + _ClearDTOG_RX(bEpNum); +} +/******************************************************************************* +* Function Name : ClearDTOG_TX. +* Description : Clear the DTOG_TX bit. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +void ClearDTOG_TX(uint8_t bEpNum) +{ + _ClearDTOG_TX(bEpNum); +} +/******************************************************************************* +* Function Name : SetEPAddress +* Description : Set the endpoint address. +* Input : bEpNum: Endpoint Number. +* bAddr: New endpoint address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) +{ + _SetEPAddress(bEpNum, bAddr); +} +/******************************************************************************* +* Function Name : GetEPAddress +* Description : Get the endpoint address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint address. +*******************************************************************************/ +uint8_t GetEPAddress(uint8_t bEpNum) +{ + return(_GetEPAddress(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPTxAddr +* Description : Set the endpoint Tx buffer address. +* Input : bEpNum: Endpoint Number. +* wAddr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPTxAddr(bEpNum, wAddr); +} +/******************************************************************************* +* Function Name : SetEPRxAddr +* Description : Set the endpoint Rx buffer address. +* Input : bEpNum: Endpoint Number. +* wAddr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPRxAddr(bEpNum, wAddr); +} +/******************************************************************************* +* Function Name : GetEPTxAddr +* Description : Returns the endpoint Tx buffer address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx buffer address. +*******************************************************************************/ +uint16_t GetEPTxAddr(uint8_t bEpNum) +{ + return(_GetEPTxAddr(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPRxAddr. +* Description : Returns the endpoint Rx buffer address. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx buffer address. +*******************************************************************************/ +uint16_t GetEPRxAddr(uint8_t bEpNum) +{ + return(_GetEPRxAddr(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPTxCount. +* Description : Set the Tx count. +* Input : bEpNum: Endpoint Number. +* wCount: new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPTxCount(bEpNum, wCount); +} +/******************************************************************************* +* Function Name : SetEPCountRxReg. +* Description : Set the Count Rx Register value. +* Input : *pdwReg: point to the register. +* wCount: the new register value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount) +{ + _SetEPCountRxReg(dwReg, wCount); +} +/******************************************************************************* +* Function Name : SetEPRxCount +* Description : Set the Rx count. +* Input : bEpNum: Endpoint Number. +* wCount: the new count value. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPRxCount(bEpNum, wCount); +} +/******************************************************************************* +* Function Name : GetEPTxCount +* Description : Get the Tx count. +* Input : bEpNum: Endpoint Number. +* Output : None +* Return : Tx count value. +*******************************************************************************/ +uint16_t GetEPTxCount(uint8_t bEpNum) +{ + return(_GetEPTxCount(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPRxCount +* Description : Get the Rx count. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Rx count value. +*******************************************************************************/ +uint16_t GetEPRxCount(uint8_t bEpNum) +{ + return(_GetEPRxCount(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPDblBuffAddr +* Description : Set the addresses of the buffer 0 and 1. +* Input : bEpNum: Endpoint Number. +* wBuf0Addr: new address of buffer 0. +* wBuf1Addr: new address of buffer 1. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) +{ + _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); +} +/******************************************************************************* +* Function Name : SetEPDblBuf0Addr +* Description : Set the Buffer 1 address. +* Input : bEpNum: Endpoint Number +* wBuf0Addr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) +{ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); +} +/******************************************************************************* +* Function Name : SetEPDblBuf1Addr +* Description : Set the Buffer 1 address. +* Input : bEpNum: Endpoint Number +* wBuf1Addr: new address. +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) +{ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); +} +/******************************************************************************* +* Function Name : GetEPDblBuf0Addr +* Description : Returns the address of the Buffer 0. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : None. +*******************************************************************************/ +uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Addr(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBuf1Addr +* Description : Returns the address of the Buffer 1. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Address of the Buffer 1. +*******************************************************************************/ +uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Addr(bEpNum)); +} +/******************************************************************************* +* Function Name : SetEPDblBuffCount +* Description : Set the number of bytes for a double Buffer +* endpoint. +* Input : bEpNum,bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuffCount(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : SetEPDblBuf0Count +* Description : Set the number of bytes in the buffer 0 of a double Buffer +* endpoint. +* Input : bEpNum, bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : SetEPDblBuf1Count +* Description : Set the number of bytes in the buffer 0 of a double Buffer +* endpoint. +* Input : bEpNum, bDir, wCount +* Output : None. +* Return : None. +*******************************************************************************/ +void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); +} +/******************************************************************************* +* Function Name : GetEPDblBuf0Count +* Description : Returns the number of byte received in the buffer 0 of a double +* Buffer endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Buffer 0 count +*******************************************************************************/ +uint16_t GetEPDblBuf0Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Count(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBuf1Count +* Description : Returns the number of data received in the buffer 1 of a double +* Buffer endpoint. +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : Endpoint Buffer 1 count. +*******************************************************************************/ +uint16_t GetEPDblBuf1Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Count(bEpNum)); +} +/******************************************************************************* +* Function Name : GetEPDblBufDir +* Description : gets direction of the double buffered endpoint +* Input : bEpNum: Endpoint Number. +* Output : None. +* Return : EP_DBUF_OUT, EP_DBUF_IN, +* EP_DBUF_ERR if the endpoint counter not yet programmed. +*******************************************************************************/ +EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) +{ + if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) + return(EP_DBUF_OUT); + else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) + return(EP_DBUF_IN); + else + return(EP_DBUF_ERR); +} +/******************************************************************************* +* Function Name : FreeUserBuffer +* Description : free buffer used from the application realizing it to the line + toggles bit SW_BUF in the double buffered endpoint register +* Input : bEpNum, bDir +* Output : None. +* Return : None. +*******************************************************************************/ +void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) +{ + if (bDir == EP_DBUF_OUT) + { /* OUT double buffered endpoint */ + _ToggleDTOG_TX(bEpNum); + } + else if (bDir == EP_DBUF_IN) + { /* IN double buffered endpoint */ + _ToggleDTOG_RX(bEpNum); + } +} + +/******************************************************************************* +* Function Name : ToWord +* Description : merge two byte in a word. +* Input : bh: byte high, bl: bytes low. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ToWord(uint8_t bh, uint8_t bl) +{ + uint16_t wRet; + wRet = (uint16_t)bl | ((uint16_t)bh << 8); + return(wRet); +} +/******************************************************************************* +* Function Name : ByteSwap +* Description : Swap two byte in a word. +* Input : wSwW: word to Swap. +* Output : None. +* Return : resulted word. +*******************************************************************************/ +uint16_t ByteSwap(uint16_t wSwW) +{ + uint8_t bTemp; + uint16_t wRet; + bTemp = (uint8_t)(wSwW & 0xff); + wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); + return(wRet); +} + +#endif /* STM32F10X_CL */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c new file mode 100644 index 0000000..a8617f2 --- /dev/null +++ b/Firmware/WIMU3/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * @file usb_sil.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Simplified Interface Layer for Global Initialization and Endpoint + * Rea/Write operations. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +extern uint16_t IMR_MSK; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : USB_SIL_Init +* Description : Initialize the USB Device IP and the Endpoint 0. +* Input : None. +* Output : None. +* Return : Status. +*******************************************************************************/ +uint32_t USB_SIL_Init(void) +{ +#ifndef STM32F10X_CL + + /* USB interrupts initialization */ + /* clear pending interrupts */ + _SetISTR(0); + wInterrupt_Mask = IMR_MSK; + /* set interrupts mask */ + _SetCNTR(wInterrupt_Mask); + +#else + + /* Perform OTG Device initialization procedure (including EP0 init) */ + OTG_DEV_Init(); + +#endif /* STM32F10X_CL */ + + return 0; +} + +/******************************************************************************* +* Function Name : USB_SIL_Write +* Description : Write a buffer of data to a selected endpoint. +* Input : - bEpAddr: The address of the non control endpoint. +* - pBufferPointer: The pointer to the buffer of data to be written +* to the endpoint. +* - wBufferSize: Number of data to be written (in bytes). +* Output : None. +* Return : Status. +*******************************************************************************/ +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize) +{ +#ifndef STM32F10X_CL + + /* Use the memory interface function to write to the selected endpoint */ + UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize); + + /* Update the data length in the control register */ + SetEPTxCount((bEpAddr & 0x7F), wBufferSize); + +#else + + /* Use the PCD interface layer function to write to the selected endpoint */ + PCD_EP_Write (bEpAddr, pBufferPointer, wBufferSize); + +#endif /* STM32F10X_CL */ + + return 0; +} + +/******************************************************************************* +* Function Name : USB_SIL_Read +* Description : Write a buffer of data to a selected endpoint. +* Input : - bEpAddr: The address of the non control endpoint. +* - pBufferPointer: The pointer to which will be saved the +* received data buffer. +* Output : None. +* Return : Number of received data (in Bytes). +*******************************************************************************/ +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer) +{ + uint32_t DataLength = 0; + +#ifndef STM32F10X_CL + + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(bEpAddr & 0x7F); + + /* Use the memory interface function to write to the selected endpoint */ + PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength); + +#else + + USB_OTG_EP *ep; + + /* Get the structure pointer of the selected Endpoint */ + ep = PCD_GetOutEP(bEpAddr); + + /* Get the number of received data */ + DataLength = ep->xfer_len; + + /* Use the PCD interface layer function to read the selected endpoint */ + PCD_EP_Read (bEpAddr, pBufferPointer, DataLength); + +#endif /* STM32F10X_CL */ + + /* Return the number of received data */ + return DataLength; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/STM32_EVAL/Common/Release_Notes.html b/Firmware/WIMU3/STM32_EVAL/Common/Release_Notes.html new file mode 100644 index 0000000..585a654 --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/Common/Release_Notes.html @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + Release Notes for STM32 Evaluation Board Common Drivers + + + + + + + + + + +
      +


      +

      +
      + + + + + + +
      + + + + + + + + + +
      +

      Back to Release page

      +
      +

      Release +Notes for STM32 Evaluation Board Common Drivers

      +

      Copyright +2012 STMicroelectronics

      +

      +
      +

       

      + + + + + + +
      +

      Contents

      +
        +
      1. STM32 Evaluation Board Common Drivers +update History
      2. +
      3. License
      4. +
      + + +

      STM32 Evaluation Board Common Drivers update History

      V5.0.2 / 05-March-2012

      +

      Main +Changes

      + +
      • All source files: license disclaimer text update and add link to the License file on ST Internet.

      V5.0.1 / 28-December-2011

      Main +Changes

      +
      • All source files: update disclaimer to add reference to the new license agreement

      V5.0.0 / 30-September-2011

      +

      Main +Changes

      + +
      • Update STM32 Evaluation Board Drivers architecture and folder organization, full API compatibility maintained vs. V4.6.2
        • All the HW drivers required for each board are provided within this board folder. The concerned drivers are:
          • stm32_eval_i2c_ee.c\.h: I2C M24CXX EEPROM memory driver
          • stm32_eval_i2c_tsensor.c\.h: I2C LM75 temperature sensor driver
          • stm32_eval_spi_flash.c\.h: SPI M25Pxxx FLASH memory driver
          • stm32_eval_sdio_sd.c\.h: SDIO SD Card memory driver
          • stm32_eval_spi_sd.c\.h: SPI SD Card memory driver 
          • These drivers were moved from \Common to \STM32XXX_EVAL folder(s)
        • \Common folder contains only drivers for the fonts and log module used by the LCD driver
        • stm32_eval.c\.h files removed, as consequence you need to perform the following update on your project configuration  (based on EVAL drivers V4.6.2):
          • In the project files, add your EVAL board driver source file (ex. "stm3210c_eval.c") instead of "stm32_eval.c"
          • Include your EVAL board driver header file (ex. #include "stm3210c_eval.h") instead of #include "stm32_eval.h"
          • If +you are using the EVAL board's LCD, you need to add the include of +the LCD header file (ex: #include "stm3210c_eval_lcd.h")
            • If +you are using the LCD log module, after copying it to the application +folder you have to edit it and update the name of the LCD header file. For more details, refer to the lcd_log_conf_template.h driver description.

      V4.6.2 / 22-July-2011

      +

      Main +Changes

      + +
      • STM3210C_EVAL
        • stm3210c_eval_lcd.c: update to support new LCD AM240320D5TOQW01H (controller ILI9325)
      • STM322xG-EVAL
        • stm322xg_eval.h: fix value of the SDIO clock divider (SDIO_TRANSFER_CLK_DIV constant) to 2 instead of 0
        • stm322xg_eval_lcd.c: increase FSMC AddressSetupTime value from 1 to 3 to be compliant with some LCD access timing
        • stm322xg_eval_audio_codec.c: update Codec_CtrlInterface_Init() and Codec_GPIO_Init() functions to not reconfigure the I2C peripheral if it's already enabled and configured (to +avoid configuring the I2C twice when using both Audio codec and IO +Expander drivers in the same application).

      V4.6.1 / 18-April-2011

      +

      Main +Changes

      + +
      • Update some STM322xG_EVAL drivers (no change on the API) to fix warnings with TASKING C compiler.
      • Change the Release Notes name to STM32 Evaluation Board Drivers
      • stm322xg_eval.c
        • SD_LowLevel_Init(): change SDIO pins speed configuration to "GPIO_Speed_25MHz"

      V4.6.0 / 11-March-2011

      +

      Main +Changes

      + +
      • Official version supporting STM322xG_EVAL evaluation board RevB (for STM32F2xx devices).
      • Common
        • Add +new LCD log utility drivers: The LCD Log module allows to automatically +set a header and footer on any application using the LCD display and +allows to dump user, debug and error messages by using the following +macros: LCD_ErrLog(),    LCD_UsrLog() and LCD_DbgLog().
      Note: the STM322xG_EVAL board RevA was wrongly named STM3220F_EVAL

      V4.5.0 / 07-March-2011

      +

      Main +Changes

      + +
      • stm32_eval_sdio_sd.c\.h: driver improvement
        • SD Clock increased to 24MHz to improve the data transfer performance.
        • Add +new functions to check the SDIO peripheral and SD Card status at any +time: SD_WaitReadOperation(), SD_WaitWriteOperation(). The +software sequence is little bit changed but without any impact on +driver API. For more details, refer to the stm32_eval_sdio_sd.c +driver description.
        • Add +new structure containing the SD Status register parameters. This +structure is called by the +         + SD_SendSDStatus() function.
        • Transfers mode updated
          • Read/Write Block using Polling and DMA modes
          • Read/Write Multi Blocks using DMA mode only
          • Interrupt mode removed
        • Data transfer functions are managing only fixed Block size (512-byte) 
      • STM32100B-EVAL
        • stm32100b_eval_cec.c: fix some strict ANSI-C errors
      • STM32100E-EVAL
        • stm32100e_eval_cec.c: fix some strict ANSI-C errors
      +

      V4.4.0 / 31-December-2010

      +

      Main +Changes

      + +
      • Add new directory for STM32L152-EVAL board containing the following files:
        • stm32l152_eval.h/.c, stm32l152_eval_lcd.h/.c, stm32l152_eval_glass_lcd.h/.c, stm32l152_eval_i2c_ee.h/.c
      • Add support for the STM32100E-EVAL Rev B: SPI FLASH CS pin "sFLASH_CS_PIN" changed from PB.02 to PE.06.
      • stm32100e_eval_lcd.h/.c: Add support for "LCD_ILI9325" LCD controller.
      • stm32100e_eval_fsmc_onenand.h/.c driver updated to correct asynchronous and synchronous read operations procedures.
        +
      + +

      4.3.0 +- 10/15/2010

      +
      1. General
      + +
      • I2C EEPROM, Temperature Sensor and IOE Expander drivers updated to use the DMA for read/write transfer and add more robustness
      • SD Card (SDIO) driver updated to add more robustness
      • SPI Flash and SD Card (SPI) drivers: SPI MISO pin configuration changed to Input Floating 
      + + + +
      1. Utilities
      + + + + + +
      • Add new directory for STM32100E-EVAL board containing the following files:
        • stm32100e_eval.h/.c, +stm32100e_eval_lcd.h/.c, stm32100e_eval_cec.h/.c, +stm32100e_eval_fsmc_onenand.h/.c, stm32100e_eval_fsmc_sram.h/.c, +stm32100e_eval_ioe.h/.c
          +
      • Common
        • stm32_eval_sdio_sd.c: +Update the DMA End of Transfer Check loop inside the SD_ReadBlock(), +SD_WriteBlock(), SD_ReadMultiBlocks() and SD_Write MultiBlocks().
        • stm32_eval_i2c_ee.c/.h
          +
          • Enhanced sEE_WaitEepromStandbyState() function for more robustness.
          • Enhanced Read and Write operations to manage I2C limitations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
          • Add +critical sections user callbacks allowing to disable then enable +interrupts when I2C operation require to be not interrupted.
        • stm32_eval_i2c_tsensor.c/.h
          +
          • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
      • STM32100B_EVAL
        • stm32100b_eval.h: Add LM75 DMA defines.
        • stm32100b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
      • STM3210B_EVAL
        • stm3210b_eval.h: Add LM75 DMA defines.
        • stm3210b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
      • STM3210C_EVAL
        • stm3210c_eval.h: Add EEPROM driver Timeout define.
        • stm3210c_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
        • stm3210c_eval_i2c_ioe.c
          • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
          • change IOE_I2C_SPEED from "400000" to "300000".
      • STM3210E_EVAL
        • stm3210e_eval.c: change "void SD_WaitForDMAEndOfTransfer(void)" to "uint32_t SD_DMAEndOfTransferStatus(void)".
        • stm3210e_eval.h: Add LM75 DMA defines.
        • stm3210e_eval_fsmc_nand.h: remove "NAND_CMD_AREA_TRUE1" define.
        • stm3210e_eval_fsmc_nand.c: Update FSMC timing in NAND_Init() function to be aligned with AN2784 application note.
        • stm3210e_eval_fsmc_nor.c
          • NOR_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
        • stm3210e_eval_fsmc_sram.c
          +
          • Update FSMC timing in SRAM_Init() function to be aligned with AN2784 application note.
            +
          • SRAM_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
        • stm3210e_eval_lcd.c
          • LCD_FSMCConfig() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
      + + +

      4.2.0 +- 04/16/2010

      +
      1. General
      + +
      • I2C EEPROM driver +update to use the DMA to +perform data transfer to/from EEPROM memory.
      + +
      1. Utilities
      +
      • STM32_EVAL
      +
        • stm32_eval_i2c_ee.c: +updated to use the DMA to perform data transfer to/from +EEPROM memory. For more details, refer to the description provided +within this file.
        • stm3210c_eval.c: add low level +functions to configure the DMA (needed for I2C EEPROM driver)
          +
        • stm3210c_eval_ioe.c: add a delay +in IOE_TS_GetState() function to wait till the end of ADC +conversion
        • stm3210e_eval_fsmc_nor.c: add PD6 pin configuration in +NOR_Init() function
        • stm3210b_eval_lcd.c: remove the +second ";" from "static void PutPixel(int16_t x, int16_t y);;" 
      +

      4.1.0 +- 03/01/2010

      +
      1. General
      +
      • Add support +for STM32 Low-density Value line (STM32F100x4/6) and +Medium-density Value line (STM32F100x8/B) devices.
      • Add support for the +STMicroelectronics STM32100B-EVAL evaluation board.
      +
      1. Utilities
      +
      • STM32_EVAL
      +
      • Add new directory +"Common" containing a common drivers for all STM32 evaluation boards: +fonts.h/.c, stm32_eval_i2c_ee.h/.c, stm32_eval_spi_flash.h/.c, + stm32_eval_i2c_tsensor.h/.c, + stm32_eval_spi_sd.h/.c +and stm32_eval_sdio_sd.h/.c
      • Add new driver for the +STM32100B-EVAL managing Leds, push button and COM ports.
      • New HDMI CEC High level +driver.
        +
      • For all LCD drivers new fonts has +been added.
      • New FSMC memories +drivers for STM3210E-EVAL board: stm3210e_eval_fsmc_sram.h/.c, stm3210e_eval_fsmc_nor.h/.c +and stm3210e_eval_fsmc_nand.h/.c.

      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/Firmware/WIMU3/STM32_EVAL/Common/stm32_eval_legacy.h b/Firmware/WIMU3/STM32_EVAL/Common/stm32_eval_legacy.h new file mode 100644 index 0000000..3046a3f --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/Common/stm32_eval_legacy.h @@ -0,0 +1,208 @@ +/** + ****************************************************************************** + * @file stm32_eval_legacy.h + * @author MCD Application Team + * @version V5.0.2 + * @date 05-March-2012 + * @brief This file contains defines legacy for STM32 EVAL drivers. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __STM32_EVAL_LEGACY_H +#define __STM32_EVAL_LEGACY_H + +//#ifdef __cplusplus +// extern "C" { +//#endif +// +///* Includes ------------------------------------------------------------------*/ +// +///* Exported types ------------------------------------------------------------*/ +///* Exported constants --------------------------------------------------------*/ +///* STM322xG_EVAL Defines Legacy */ +//#ifdef USE_STM3220F_EVAL +// #define USE_STM322xG_EVAL +//#endif +//#define STM3220F_LCD_Init STM322xG_LCD_Init +// +///* Button Defines Legacy */ +//#define Button_WAKEUP BUTTON_WAKEUP +//#define Button_TAMPER BUTTON_TAMPER +//#define Button_KEY BUTTON_KEY +//#define Button_RIGHT BUTTON_RIGHT +//#define Button_LEFT BUTTON_LEFT +//#define Button_UP BUTTON_UP +//#define Button_DOWN BUTTON_DOWN +//#define Button_SEL BUTTON_SEL +//#define Mode_GPIO BUTTON_MODE_GPIO +//#define Mode_EXTI BUTTON_MODE_EXTI +//#define Button_Mode_TypeDef ButtonMode_TypeDef +//#define JOY_CENTER JOY_SEL +//#define JOY_State_TypeDef JOYState_TypeDef +// +///* LCD Defines Legacy */ +//#define LCD_RSNWR_GPIO_CLK LCD_NWR_GPIO_CLK +//#define LCD_SPI_GPIO_PORT LCD_SPI_SCK_GPIO_PORT +//#define LCD_SPI_GPIO_CLK LCD_SPI_SCK_GPIO_CLK +//#define R0 LCD_REG_0 +//#define R1 LCD_REG_1 +//#define R2 LCD_REG_2 +//#define R3 LCD_REG_3 +//#define R4 LCD_REG_4 +//#define R5 LCD_REG_5 +//#define R6 LCD_REG_6 +//#define R7 LCD_REG_7 +//#define R8 LCD_REG_8 +//#define R9 LCD_REG_9 +//#define R10 LCD_REG_10 +//#define R12 LCD_REG_12 +//#define R13 LCD_REG_13 +//#define R14 LCD_REG_14 +//#define R15 LCD_REG_15 +//#define R16 LCD_REG_16 +//#define R17 LCD_REG_17 +//#define R18 LCD_REG_18 +//#define R19 LCD_REG_19 +//#define R20 LCD_REG_20 +//#define R21 LCD_REG_21 +//#define R22 LCD_REG_22 +//#define R23 LCD_REG_23 +//#define R24 LCD_REG_24 +//#define R25 LCD_REG_25 +//#define R26 LCD_REG_26 +//#define R27 LCD_REG_27 +//#define R28 LCD_REG_28 +//#define R29 LCD_REG_29 +//#define R30 LCD_REG_30 +//#define R31 LCD_REG_31 +//#define R32 LCD_REG_32 +//#define R33 LCD_REG_33 +//#define R34 LCD_REG_34 +//#define R36 LCD_REG_36 +//#define R37 LCD_REG_37 +//#define R40 LCD_REG_40 +//#define R41 LCD_REG_41 +//#define R43 LCD_REG_43 +//#define R45 LCD_REG_45 +//#define R48 LCD_REG_48 +//#define R49 LCD_REG_49 +//#define R50 LCD_REG_50 +//#define R51 LCD_REG_51 +//#define R52 LCD_REG_52 +//#define R53 LCD_REG_53 +//#define R54 LCD_REG_54 +//#define R55 LCD_REG_55 +//#define R56 LCD_REG_56 +//#define R57 LCD_REG_57 +//#define R59 LCD_REG_59 +//#define R60 LCD_REG_60 +//#define R61 LCD_REG_61 +//#define R62 LCD_REG_62 +//#define R63 LCD_REG_63 +//#define R64 LCD_REG_64 +//#define R65 LCD_REG_65 +//#define R66 LCD_REG_66 +//#define R67 LCD_REG_67 +//#define R68 LCD_REG_68 +//#define R69 LCD_REG_69 +//#define R70 LCD_REG_70 +//#define R71 LCD_REG_71 +//#define R72 LCD_REG_72 +//#define R73 LCD_REG_73 +//#define R74 LCD_REG_74 +//#define R75 LCD_REG_75 +//#define R76 LCD_REG_76 +//#define R77 LCD_REG_77 +//#define R78 LCD_REG_78 +//#define R79 LCD_REG_79 +//#define R80 LCD_REG_80 +//#define R81 LCD_REG_81 +//#define R82 LCD_REG_82 +//#define R83 LCD_REG_83 +//#define R96 LCD_REG_96 +//#define R97 LCD_REG_97 +//#define R106 LCD_REG_106 +//#define R118 LCD_REG_118 +//#define R128 LCD_REG_128 +//#define R129 LCD_REG_129 +//#define R130 LCD_REG_130 +//#define R131 LCD_REG_131 +//#define R132 LCD_REG_132 +//#define R133 LCD_REG_133 +//#define R134 LCD_REG_134 +//#define R135 LCD_REG_135 +//#define R136 LCD_REG_136 +//#define R137 LCD_REG_137 +//#define R139 LCD_REG_139 +//#define R140 LCD_REG_140 +//#define R141 LCD_REG_141 +//#define R143 LCD_REG_143 +//#define R144 LCD_REG_144 +//#define R145 LCD_REG_145 +//#define R146 LCD_REG_146 +//#define R147 LCD_REG_147 +//#define R148 LCD_REG_148 +//#define R149 LCD_REG_149 +//#define R150 LCD_REG_150 +//#define R151 LCD_REG_151 +//#define R152 LCD_REG_152 +//#define R153 LCD_REG_153 +//#define R154 LCD_REG_154 +//#define R157 LCD_REG_157 +//#define R192 LCD_REG_192 +//#define R193 LCD_REG_193 +//#define R227 LCD_REG_227 +//#define R229 LCD_REG_229 +//#define R231 LCD_REG_231 +//#define R239 LCD_REG_239 +//#define White LCD_COLOR_WHITE +//#define Black LCD_COLOR_BLACK +//#define Grey LCD_COLOR_GREY +//#define Blue LCD_COLOR_BLUE +//#define Blue2 LCD_COLOR_BLUE2 +//#define Red LCD_COLOR_RED +//#define Magenta LCD_COLOR_MAGENTA +//#define Green LCD_COLOR_GREEN +//#define Cyan LCD_COLOR_CYAN +//#define Yellow LCD_COLOR_YELLOW +//#define Line0 LCD_LINE_0 +//#define Line1 LCD_LINE_1 +//#define Line2 LCD_LINE_2 +//#define Line3 LCD_LINE_3 +//#define Line4 LCD_LINE_4 +//#define Line5 LCD_LINE_5 +//#define Line6 LCD_LINE_6 +//#define Line7 LCD_LINE_7 +//#define Line8 LCD_LINE_8 +//#define Line9 LCD_LINE_9 +//#define Horizontal LCD_DIR_HORIZONTAL +//#define Vertical LCD_DIR_VERTICAL +// +///* Exported macro ------------------------------------------------------------*/ +///* Exported functions --------------------------------------------------------*/ +// +//#ifdef __cplusplus +//} +//#endif + +#endif /* __STM32_EVAL_LEGACY_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/Release_Notes.html b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/Release_Notes.html new file mode 100644 index 0000000..d41074c --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/Release_Notes.html @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + Release Notes for STM32L152_EVAL Evaluation Board Drivers + + + + + + + + + + +
      +


      +

      +
      + + + + + + +
      + + + + + + + + + +
      +

      Back to Release page

      +
      +

      Release +Notes for STM32L152_EVAL Evaluation Board Drivers

      +

      Copyright +2012 STMicroelectronics

      +

      +
      +

       

      + + + + + + +
      +

      Contents

      +
        +
      1. STM32L152_EVAL Evaluation Board Drivers +update History
      2. +
      3. License
      4. +
      + + +

      STM32L152_EVAL Evaluation Board Drivers update History

      V5.0.2 / 09-March-2012

      +

      Main +Changes

      + +
      • All source files: license disclaimer text update and add link to the License file on ST Internet.
      • stm32l152_eval.c
        • In sEE_LowLevel_Init() and LM75_LowLevel_Init() functions: swap +the order of I2C IOs and alternate function (AF) +configuration (AF configuration should be done before to configure the +IOs).
      +

      V5.0.1 / +24-January-2012

      + +

      Main +Changes

      + +
        +
      • All source +files: update disclaimer to add reference to the new license agreement +
      • stm32l152_eval.c and stm32l152_eval_lcd.h/.c +
        • Fix some strict ANSI-C errors.
          +
      • +
      +

      V5.0.0 / 02-December-2011

      + +

      Main +Changes

      + +
      • Update STM32 Evaluation Board Drivers architecture and folder organization, full API compatibility maintained vs. V4.6.2
        • All the HW drivers required for each board are provided within this board folder. The concerned drivers are:
          • stm32_eval_i2c_ee.c\.h: I2C M24Cxx EEPROM memory driver
          • stm32_eval_i2c_tsensor.c\.h: I2C LM75 temperature sensor driver
          • stm32_eval_spi_flash.c\.h: SPI M25Pxxx FLASH memory driver
          • stm32_eval_sdio_sd.c\.h: SDIO SD Card memory driver
          • stm32_eval_spi_sd.c\.h: SPI SD Card memory driver 
          • These drivers were moved from \Common to \STM32XXX_EVAL folder(s)
        • \Common folder contains only drivers for the fonts and log module used by the LCD driver
        • stm32_eval.c\.h files removed, as consequence you need to perform the following update on your project configuration  (based on EVAL drivers V4.6.2):
          • In the project files, add your EVAL board driver source file (ex. "stm32l152_eval.c") instead of "stm32_eval.c"
          • Include your EVAL board driver header file (ex. #include "stm32l152_eval.h") instead of #include "stm32_eval.h"
          • If +you are using the EVAL board's LCD, you need to add the include of +the LCD header file (ex: #include "stm32l152_eval_lcd.h")
            • If +you are using the LCD log module, after copying it to the application +folder you have to edit it and update the name of the LCD header file. For more details, refer to the lcd_log_conf_template.h driver description.
          • stm32l152_eval_lcd.c: update to support new LCD AM240320D5TOQW01H (controller ILI9325)
            +

      V4.6.2 / 22-July-2011

      +

      Main +Changes

      + +
      • STM3210C_EVAL
        • stm3210c_eval_lcd.c: update to support new LCD AM240320D5TOQW01H (controller ILI9325)
      • STM322xG-EVAL
        • stm322xg_eval.h: fix value of the SDIO clock divider (SDIO_TRANSFER_CLK_DIV constant) to 2 instead of 0
        • stm322xg_eval_lcd.c: increase FSMC AddressSetupTime value from 1 to 3 to be compliant with some LCD access timing
        • stm322xg_eval_audio_codec.c: update Codec_CtrlInterface_Init() and Codec_GPIO_Init() functions to not reconfigure the I2C peripheral if it's already enabled and configured (to +avoid configuring the I2C twice when using both Audio codec and IO +Expander drivers in the same application).

      V4.6.1 / 18-April-2011

      +

      Main +Changes

      + +
      • Update some STM322xG_EVAL drivers (no change on the API) to fix warnings with TASKING C compiler.
      • Change the Release Notes name to STM32 Evaluation Board Drivers
      • stm322xg_eval.c
        • SD_LowLevel_Init(): change SDIO pins speed configuration to "GPIO_Speed_25MHz"

      V4.6.0 / 11-March-2011

      +

      Main +Changes

      + +
      • Official version supporting STM322xG_EVAL evaluation board RevB (for STM32F2xx devices).
      • Common
        • Add +new LCD log utility drivers: The LCD Log module allows to automatically +set a header and footer on any application using the LCD display and +allows to dump user, debug and error messages by using the following +macros: LCD_ErrLog(),    LCD_UsrLog() and LCD_DbgLog().
      Note: the STM322xG_EVAL board RevA was wrongly named STM3220F_EVAL

      V4.5.0 / 07-March-2011

      +

      Main +Changes

      + +
      • stm32_eval_sdio_sd.c\.h: driver improvement
        • SD Clock increased to 24MHz to improve the data transfer performance.
        • Add +new functions to check the SDIO peripheral and SD Card status at any +time: SD_WaitReadOperation(), SD_WaitWriteOperation(). The +software sequence is little bit changed but without any impact on +driver API. For more details, refer to the stm32_eval_sdio_sd.c +driver description.
        • Add +new structure containing the SD Status register parameters. This +structure is called by the +         + SD_SendSDStatus() function.
        • Transfers mode updated
          • Read/Write Block using Polling and DMA modes
          • Read/Write Multi Blocks using DMA mode only
          • Interrupt mode removed
        • Data transfer functions are managing only fixed Block size (512-byte) 
      • STM32100B-EVAL
        • stm32100b_eval_cec.c: fix some strict ANSI-C errors
      • STM32100E-EVAL
        • stm32100e_eval_cec.c: fix some strict ANSI-C errors
      +

      V4.4.0 / 31-December-2010

      +

      Main +Changes

      + +
      • Add new directory for STM32L152-EVAL board containing the following files:
        • stm32l152_eval.h/.c, stm32l152_eval_lcd.h/.c, stm32l152_eval_glass_lcd.h/.c, stm32l152_eval_i2c_ee.h/.c
      • Add support for the STM32100E-EVAL Rev B: SPI FLASH CS pin "sFLASH_CS_PIN" changed from PB.02 to PE.06.
      • stm32100e_eval_lcd.h/.c: Add support for "LCD_ILI9325" LCD controller.
      • stm32100e_eval_fsmc_onenand.h/.c driver updated to correct asynchronous and synchronous read operations procedures.
        +
      + +

      4.3.0 +- 10/15/2010

      +
      1. General
      + +
      • I2C EEPROM, Temperature Sensor and IOE Expander drivers updated to use the DMA for read/write transfer and add more robustness
      • SD Card (SDIO) driver updated to add more robustness
      • SPI Flash and SD Card (SPI) drivers: SPI MISO pin configuration changed to Input Floating 
      + + + +
      1. Utilities
      + + + + + +
      • Add new directory for STM32100E-EVAL board containing the following files:
        • stm32100e_eval.h/.c, +stm32100e_eval_lcd.h/.c, stm32100e_eval_cec.h/.c, +stm32100e_eval_fsmc_onenand.h/.c, stm32100e_eval_fsmc_sram.h/.c, +stm32100e_eval_ioe.h/.c
          +
      • Common
        • stm32_eval_sdio_sd.c: +Update the DMA End of Transfer Check loop inside the SD_ReadBlock(), +SD_WriteBlock(), SD_ReadMultiBlocks() and SD_Write MultiBlocks().
        • stm32_eval_i2c_ee.c/.h
          +
          • Enhanced sEE_WaitEepromStandbyState() function for more robustness.
          • Enhanced Read and Write operations to manage I2C limitations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
          • Add +critical sections user callbacks allowing to disable then enable +interrupts when I2C operation require to be not interrupted.
        • stm32_eval_i2c_tsensor.c/.h
          +
          • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
      • STM32100B_EVAL
        • stm32100b_eval.h: Add LM75 DMA defines.
        • stm32100b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
      • STM3210B_EVAL
        • stm3210b_eval.h: Add LM75 DMA defines.
        • stm3210b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
      • STM3210C_EVAL
        • stm3210c_eval.h: Add EEPROM driver Timeout define.
        • stm3210c_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
        • stm3210c_eval_i2c_ioe.c
          • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
          • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
          • change IOE_I2C_SPEED from "400000" to "300000".
      • STM3210E_EVAL
        • stm3210e_eval.c: change "void SD_WaitForDMAEndOfTransfer(void)" to "uint32_t SD_DMAEndOfTransferStatus(void)".
        • stm3210e_eval.h: Add LM75 DMA defines.
        • stm3210e_eval_fsmc_nand.h: remove "NAND_CMD_AREA_TRUE1" define.
        • stm3210e_eval_fsmc_nand.c: Update FSMC timing in NAND_Init() function to be aligned with AN2784 application note.
        • stm3210e_eval_fsmc_nor.c
          • NOR_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
        • stm3210e_eval_fsmc_sram.c
          +
          • Update FSMC timing in SRAM_Init() function to be aligned with AN2784 application note.
            +
          • SRAM_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
        • stm3210e_eval_lcd.c
          • LCD_FSMCConfig() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
      + + +

      4.2.0 +- 04/16/2010

      +
      1. General
      + +
      • I2C EEPROM driver +update to use the DMA to +perform data transfer to/from EEPROM memory.
      + +
      1. Utilities
      +
      • STM32_EVAL
      +
        • stm32_eval_i2c_ee.c: +updated to use the DMA to perform data transfer to/from +EEPROM memory. For more details, refer to the description provided +within this file.
        • stm3210c_eval.c: add low level +functions to configure the DMA (needed for I2C EEPROM driver)
          +
        • stm3210c_eval_ioe.c: add a delay +in IOE_TS_GetState() function to wait till the end of ADC +conversion
        • stm3210e_eval_fsmc_nor.c: add PD6 pin configuration in +NOR_Init() function
        • stm3210b_eval_lcd.c: remove the +second ";" from "static void PutPixel(int16_t x, int16_t y);;" 
      +

      4.1.0 +- 03/01/2010

      +
      1. General
      +
      • Add support +for STM32 Low-density Value line (STM32F100x4/6) and +Medium-density Value line (STM32F100x8/B) devices.
      • Add support for the +STMicroelectronics STM32100B-EVAL evaluation board.
      +
      1. Utilities
      +
      • STM32_EVAL
      +
      • Add new directory +"Common" containing a common drivers for all STM32 evaluation boards: +fonts.h/.c, stm32_eval_i2c_ee.h/.c, stm32_eval_spi_flash.h/.c, + stm32_eval_i2c_tsensor.h/.c, + stm32_eval_spi_sd.h/.c +and stm32_eval_sdio_sd.h/.c
      • Add new driver for the +STM32100B-EVAL managing Leds, push button and COM ports.
      • New HDMI CEC High level +driver.
        +
      • For all LCD drivers new fonts has +been added.
      • New FSMC memories +drivers for STM3210E-EVAL board: stm3210e_eval_fsmc_sram.h/.c, stm3210e_eval_fsmc_nor.h/.c +and stm3210e_eval_fsmc_nand.h/.c.

      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/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.c b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.c new file mode 100644 index 0000000..c7e875c --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.c @@ -0,0 +1,754 @@ +/** + ****************************************************************************** + * @file stm32l152_eval.c + * @author MCD Application Team + * @version V5.0.2 + * @date 09-March-2012 + * @brief This file provides: + * - set of firmware functions to manage Leds, push-button and COM ports + * - low level initialization functions for SD card (on SPI) and + * temperature sensor (LM75) available on STM32L152-EVAL + * evaluation board RevB from STMicroelectronics. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "stm32l152_eval.h" +#include "stm32l1xx_spi.h" +#include "stm32l1xx_i2c.h" +#include "config.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL + * @{ + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL + * @brief This file provides firmware functions to manage Leds, push-buttons, + * COM ports, SD card on SPI and temperature sensor (LM75) available on + * STM32L152-EVAL evaluation board from STMicroelectronics. + * @{ + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_Variables + * @{ + */ +//GPIO_TypeDef* GPIO_PORT[LEDn] = {LED1_GPIO_PORT, LED2_GPIO_PORT, LED3_GPIO_PORT, +// LED4_GPIO_PORT}; +//const uint16_t GPIO_PIN[LEDn] = {LED1_PIN, LED2_PIN, LED3_PIN, +// LED4_PIN}; +//const uint32_t GPIO_CLK[LEDn] = {LED1_GPIO_CLK, LED2_GPIO_CLK, LED3_GPIO_CLK, +// LED4_GPIO_CLK}; +// +//GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT, RIGHT_BUTTON_GPIO_PORT, +// LEFT_BUTTON_GPIO_PORT, UP_BUTTON_GPIO_PORT, +// DOWN_BUTTON_GPIO_PORT, SEL_BUTTON_GPIO_PORT}; +// +//const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN, RIGHT_BUTTON_PIN, +// LEFT_BUTTON_PIN, UP_BUTTON_PIN, +// DOWN_BUTTON_PIN, SEL_BUTTON_PIN}; +// +//const uint32_t BUTTON_CLK[BUTTONn] = {KEY_BUTTON_GPIO_CLK, RIGHT_BUTTON_GPIO_CLK, +// LEFT_BUTTON_GPIO_CLK, UP_BUTTON_GPIO_CLK, +// DOWN_BUTTON_GPIO_CLK, SEL_BUTTON_GPIO_CLK}; +// +//const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {KEY_BUTTON_EXTI_LINE, +// RIGHT_BUTTON_EXTI_LINE, +// LEFT_BUTTON_EXTI_LINE, +// UP_BUTTON_EXTI_LINE, +// DOWN_BUTTON_EXTI_LINE, +// SEL_BUTTON_EXTI_LINE}; +// +//const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {KEY_BUTTON_EXTI_PORT_SOURCE, +// RIGHT_BUTTON_EXTI_PORT_SOURCE, +// LEFT_BUTTON_EXTI_PORT_SOURCE, +// UP_BUTTON_EXTI_PORT_SOURCE, +// DOWN_BUTTON_EXTI_PORT_SOURCE, +// SEL_BUTTON_EXTI_PORT_SOURCE}; +// +//const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {KEY_BUTTON_EXTI_PIN_SOURCE, +// RIGHT_BUTTON_EXTI_PIN_SOURCE, +// LEFT_BUTTON_EXTI_PIN_SOURCE, +// UP_BUTTON_EXTI_PIN_SOURCE, +// DOWN_BUTTON_EXTI_PIN_SOURCE, +// SEL_BUTTON_EXTI_PIN_SOURCE}; +// +//const uint8_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn, RIGHT_BUTTON_EXTI_IRQn, +// LEFT_BUTTON_EXTI_IRQn, UP_BUTTON_EXTI_IRQn, +// DOWN_BUTTON_EXTI_IRQn, SEL_BUTTON_EXTI_IRQn}; +// +//USART_TypeDef* COM_USART[COMn] = {EVAL_COM1, EVAL_COM2, EVAL_COM3}; +// +//GPIO_TypeDef* COM_TX_PORT[COMn] = {EVAL_COM1_TX_GPIO_PORT, EVAL_COM2_TX_GPIO_PORT, EVAL_COM3_TX_GPIO_PORT}; +// +//GPIO_TypeDef* COM_RX_PORT[COMn] = {EVAL_COM1_RX_GPIO_PORT, EVAL_COM2_RX_GPIO_PORT, EVAL_COM3_RX_GPIO_PORT}; +// +//const uint32_t COM_USART_CLK[COMn] = {EVAL_COM1_CLK, EVAL_COM2_CLK, EVAL_COM3_CLK}; +// +//const uint32_t COM_TX_PORT_CLK[COMn] = {EVAL_COM1_TX_GPIO_CLK, EVAL_COM2_TX_GPIO_CLK, EVAL_COM3_TX_GPIO_CLK}; +// +//const uint32_t COM_RX_PORT_CLK[COMn] = {EVAL_COM1_RX_GPIO_CLK, EVAL_COM2_RX_GPIO_CLK, EVAL_COM3_RX_GPIO_CLK}; +// +//const uint16_t COM_TX_PIN[COMn] = {EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN, EVAL_COM3_TX_PIN}; +// +//const uint16_t COM_RX_PIN[COMn] = {EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN, EVAL_COM3_RX_PIN}; +// +//const uint8_t COM_TX_PIN_SOURCE[COMn] = {EVAL_COM1_TX_SOURCE, EVAL_COM2_TX_SOURCE, EVAL_COM3_TX_SOURCE}; +// +//const uint8_t COM_RX_PIN_SOURCE[COMn] = {EVAL_COM1_RX_SOURCE, EVAL_COM2_RX_SOURCE, EVAL_COM3_RX_SOURCE}; +// +//const uint8_t COM_TX_AF[COMn] = {EVAL_COM1_TX_AF, EVAL_COM2_TX_AF, EVAL_COM3_TX_AF}; +// +//const uint8_t COM_RX_AF[COMn] = {EVAL_COM1_RX_AF, EVAL_COM2_RX_AF, EVAL_COM3_RX_AF}; +// +//DMA_InitTypeDef sEEDMA_InitStructure; + + +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Private_Functions + * @{ + */ + +///** +// * @brief Configures LED GPIO. +// * @param Led: Specifies the Led to be configured. +// * This parameter can be one of following parameters: +// * @arg LED1 +// * @arg LED2 +// * @arg LED3 +// * @arg LED4 +// * @retval None +// */ +//void STM_EVAL_LEDInit(Led_TypeDef Led) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// +// /* Enable the GPIO_LED Clock */ +// RCC_AHBPeriphClockCmd(GPIO_CLK[Led], ENABLE); +// +// /* Configure the GPIO_LED pin */ +// GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led]; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; +// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; +// GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure); +// GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led]; +//} +// +///** +// * @brief Turns selected LED On. +// * @param Led: Specifies the Led to be set on. +// * This parameter can be one of following parameters: +// * @arg LED1 +// * @arg LED2 +// * @arg LED3 +// * @arg LED4 +// * @retval None +// */ +//void STM_EVAL_LEDOn(Led_TypeDef Led) +//{ +// GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led]; +//} +// +///** +// * @brief Turns selected LED Off. +// * @param Led: Specifies the Led to be set off. +// * This parameter can be one of following parameters: +// * @arg LED1 +// * @arg LED2 +// * @arg LED3 +// * @arg LED4 +// * @retval None +// */ +//void STM_EVAL_LEDOff(Led_TypeDef Led) +//{ +// GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led]; +//} +// +///** +// * @brief Toggles the selected LED. +// * @param Led: Specifies the Led to be toggled. +// * This parameter can be one of following parameters: +// * @arg LED1 +// * @arg LED2 +// * @arg LED3 +// * @arg LED4 +// * @retval None +// */ +//void STM_EVAL_LEDToggle(Led_TypeDef Led) +//{ +// GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led]; +//} +// +///** +// * @brief Configures Button GPIO and EXTI Line. +// * @param Button: Specifies the Button to be configured. +// * This parameter can be one of following parameters: +// * @arg BUTTON_KEY: Key Push Button +// * @arg BUTTON_RIGHT: Joystick Right Push Button +// * @arg BUTTON_LEFT: Joystick Left Push Button +// * @arg BUTTON_UP: Joystick Up Push Button +// * @arg BUTTON_DOWN: Joystick Down Push Button +// * @arg BUTTON_SEL: Joystick Sel Push Button +// * @param Button_Mode: Specifies Button mode. +// * This parameter can be one of following parameters: +// * @arg BUTTON_MODE_GPIO: Button will be used as simple IO +// * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt +// * generation capability +// * @retval None +// */ +//void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// EXTI_InitTypeDef EXTI_InitStructure; +// NVIC_InitTypeDef NVIC_InitStructure; +// +// /* There is no Wakeup and Tamper buttons on STM32L152-EVAL. */ +// +// /* Enable the BUTTON Clock */ +// RCC_AHBPeriphClockCmd(BUTTON_CLK[Button], ENABLE); +// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); +// +// /* Configure Button pin as input */ +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button]; +// GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure); +// +// if (Button_Mode == BUTTON_MODE_EXTI) +// { +// /* Connect Button EXTI Line to Button GPIO Pin */ +// SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]); +// /* Configure Button EXTI line */ +// EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button]; +// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; +// +// if(Button != BUTTON_KEY) +// { +// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; +// } +// else +// { +// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; +// } +// EXTI_InitStructure.EXTI_LineCmd = ENABLE; +// EXTI_Init(&EXTI_InitStructure); +// +// /* Enable and set Button EXTI Interrupt to the lowest priority */ +// NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button]; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; +// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; +// +// NVIC_Init(&NVIC_InitStructure); +// } +//} +// +///** +// * @brief Returns the selected Button state. +// * @param Button: Specifies the Button to be checked. +// * This parameter can be one of following parameters: +// * @arg BUTTON_KEY: Key Push Button +// * @arg BUTTON_RIGHT: Joystick Right Push Button +// * @arg BUTTON_LEFT: Joystick Left Push Button +// * @arg BUTTON_UP: Joystick Up Push Button +// * @arg BUTTON_DOWN: Joystick Down Push Button +// * @arg BUTTON_SEL: Joystick Sel Push Button +// * @retval Button GPIO pin value is returned. +// */ +//uint32_t STM_EVAL_PBGetState(Button_TypeDef Button) +//{ +// /* There is no Wakeup and Tamper pins on STM32L152-EVAL. */ +// +// return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]); +//} +// +///** +// * @brief Configures COM port. +// * @param COM: Specifies the COM port to be configured. +// * This parameter can be one of following parameters: +// * @arg COM1 +// * @arg COM2 +// * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that +// * contains the configuration information for the specified USART peripheral. +// * @retval None +// */ +//void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// +// /* Enable GPIO clock */ +// RCC_AHBPeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE); +// +// /* Enable UART clock */ +// if(COM == COM3) +// { +// RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE); +// } +// else +// { +// RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE); +// } +// +// /* Connect PXx to USARTx_Tx */ +// GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]); +// +// /* Connect PXx to USARTx_Rx */ +// GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]); +// +// /* Configure USART Tx as alternate function push-pull */ +// GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM]; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; +// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; +// GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure); +// +// /* Configure USART Rx as alternate function push-pull */ +// GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM]; +// GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure); +// +// /* USART configuration */ +// USART_Init(COM_USART[COM], USART_InitStruct); +// +// /* Enable USART */ +// USART_Cmd(COM_USART[COM], ENABLE); +//} + +/** + * @brief DeInitializes the SPI interface. + * @param None + * @retval None + */ +void SD_LowLevel_DeInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + SPI_Cmd(SD_SPI, DISABLE); /*!< SD_SPI disable */ + SPI_DeInit(SD_SPI); /*!< DeInitializes the SD_SPI */ + + /*!< SD_SPI Periph clock disable */ + RCC_APB1PeriphClockCmd(SD_SPI_CLK, DISABLE); + + /*!< Configure SD_SPI pins: SCK */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI pins: MISO */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN; + GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI pins: MOSI */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN; + GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI_CS_PIN pin: SD Card CS pin */ + GPIO_InitStructure.GPIO_Pin = SD_CS_PIN; + GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */ +// GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN; +// GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure); +} + +/** + * @brief Initializes the SD Card and put it into StandBy State (Ready for + * data transfer). + * @param None + * @retval None + */ +void SD_LowLevel_Init(void) +{ + + #ifdef SHOW_DEBUG_PRINTF + printf("Entering SD_LowLevel_Init()\n"); + #endif + + GPIO_InitTypeDef GPIO_InitStructure; + SPI_InitTypeDef SPI_InitStructure; + + /*!< SD_SPI_CS_GPIO, SD_SPI_MOSI_GPIO, SD_SPI_MISO_GPIO, SD_SPI_DETECT_GPIO + and SD_SPI_SCK_GPIO Periph clock enable */ + RCC_AHBPeriphClockCmd(SD_CS_GPIO_CLK | SD_SPI_MOSI_GPIO_CLK | SD_SPI_MISO_GPIO_CLK | + SD_SPI_SCK_GPIO_CLK, ENABLE); + + /*!< SD_SPI Periph clock enable */ + RCC_APB1PeriphClockCmd(SD_SPI_CLK, ENABLE); + + /*!< Configure SD_SPI pins: SCK */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI pins: MISO */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN; + GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI pins: MOSI */ + GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN; + GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI_CS_PIN pin: SD Card CS pin */ + GPIO_InitStructure.GPIO_Pin = SD_CS_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStructure); + + /*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */ +// GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; +// GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure); + + /* Connect PXx to SD_SPI_SCK */ + GPIO_PinAFConfig(SD_SPI_SCK_GPIO_PORT, SD_SPI_SCK_SOURCE, SD_SPI_SCK_AF); + + /* Connect PXx to SD_SPI_MISO */ + GPIO_PinAFConfig(SD_SPI_MISO_GPIO_PORT, SD_SPI_MISO_SOURCE, SD_SPI_MISO_AF); + + /* Connect PXx to SD_SPI_MOSI */ + GPIO_PinAFConfig(SD_SPI_MOSI_GPIO_PORT, SD_SPI_MOSI_SOURCE, SD_SPI_MOSI_AF); + + /*!< SD_SPI Config */ + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + SPI_Init(SD_SPI, &SPI_InitStructure); + + SPI_Cmd(SD_SPI, ENABLE); /*!< SD_SPI enable */ +} + +///** +// * @brief DeInitializes the LM75_I2C. +// * @param None +// * @retval None +// */ +//void LM75_LowLevel_DeInit(void) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// +// /*!< Disable LM75_I2C */ +// I2C_Cmd(LM75_I2C, DISABLE); +// +// /*!< DeInitializes the LM75_I2C */ +// I2C_DeInit(LM75_I2C); +// +// /*!< LM75_I2C Periph clock disable */ +// RCC_APB1PeriphClockCmd(LM75_I2C_CLK, DISABLE); +// +// /*!< Configure LM75_I2C pins: SCL */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SCL_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(LM75_I2C_SCL_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure LM75_I2C pins: SDA */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SDA_PIN; +// GPIO_Init(LM75_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure LM75_I2C pin: SMBUS ALERT */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SMBUSALERT_PIN; +// GPIO_Init(LM75_I2C_SMBUSALERT_GPIO_PORT, &GPIO_InitStructure); +//} +// +///** +// * @brief Initializes the LM75_I2C. +// * @param None +// * @retval None +// */ +//void LM75_LowLevel_Init(void) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// +// /*!< LM75_I2C Periph clock enable */ +// RCC_APB1PeriphClockCmd(LM75_I2C_CLK, ENABLE); +// +// /*!< LM75_I2C_SCL_GPIO_CLK, LM75_I2C_SDA_GPIO_CLK +// and LM75_I2C_SMBUSALERT_GPIO_CLK Periph clock enable */ +// RCC_AHBPeriphClockCmd(LM75_I2C_SCL_GPIO_CLK | LM75_I2C_SDA_GPIO_CLK | +// LM75_I2C_SMBUSALERT_GPIO_CLK, ENABLE); +// +// /* Connect PXx to I2C_SCL */ +// GPIO_PinAFConfig(LM75_I2C_SCL_GPIO_PORT, LM75_I2C_SCL_SOURCE, LM75_I2C_SCL_AF); +// +// /* Connect PXx to I2C_SDA */ +// GPIO_PinAFConfig(LM75_I2C_SDA_GPIO_PORT, LM75_I2C_SDA_SOURCE, LM75_I2C_SDA_AF); +// +// /* Connect PXx to I2C_SMBUSALER */ +// GPIO_PinAFConfig(LM75_I2C_SMBUSALERT_GPIO_PORT, LM75_I2C_SMBUSALERT_SOURCE, LM75_I2C_SMBUSALERT_AF); +// +// /*!< Configure LM75_I2C pins: SCL */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SCL_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; +// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(LM75_I2C_SCL_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure LM75_I2C pins: SDA */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SDA_PIN; +// GPIO_Init(LM75_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure LM75_I2C pin: SMBUS ALERT */ +// GPIO_InitStructure.GPIO_Pin = LM75_I2C_SMBUSALERT_PIN; +// GPIO_Init(LM75_I2C_SMBUSALERT_GPIO_PORT, &GPIO_InitStructure); +//} +// +///** +// * @brief DeInitializes peripherals used by the I2C EEPROM driver. +// * @param None +// * @retval None +// */ +//void sEE_LowLevel_DeInit(void) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// NVIC_InitTypeDef NVIC_InitStructure; +// +// /* sEE_I2C Peripheral Disable */ +// I2C_Cmd(sEE_I2C, DISABLE); +// +// /* sEE_I2C DeInit */ +// I2C_DeInit(sEE_I2C); +// +// /*!< sEE_I2C Periph clock disable */ +// RCC_APB1PeriphClockCmd(sEE_I2C_CLK, DISABLE); +// +// /*!< GPIO configuration */ +// /*!< Configure sEE_I2C pins: SCL */ +// GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure sEE_I2C pins: SDA */ +// GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN; +// GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); +// +// /* Configure and enable I2C DMA TX Channel interrupt */ +// NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO; +// NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; +// NVIC_Init(&NVIC_InitStructure); +// +// /* Configure and enable I2C DMA RX Channel interrupt */ +// NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO; +// NVIC_Init(&NVIC_InitStructure); +// +// /* Disable and Deinitialize the DMA channels */ +// DMA_Cmd(sEE_I2C_DMA_CHANNEL_TX, DISABLE); +// DMA_Cmd(sEE_I2C_DMA_CHANNEL_RX, DISABLE); +// DMA_DeInit(sEE_I2C_DMA_CHANNEL_TX); +// DMA_DeInit(sEE_I2C_DMA_CHANNEL_RX); +//} +// +///** +// * @brief Initializes peripherals used by the I2C EEPROM driver. +// * @param None +// * @retval None +// */ +//void sEE_LowLevel_Init(void) +//{ +// GPIO_InitTypeDef GPIO_InitStructure; +// NVIC_InitTypeDef NVIC_InitStructure; +// +// /*!< sEE_I2C Periph clock enable */ +// RCC_APB1PeriphClockCmd(sEE_I2C_CLK, ENABLE); +// +// /*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */ +// RCC_AHBPeriphClockCmd(sEE_I2C_SCL_GPIO_CLK | sEE_I2C_SDA_GPIO_CLK, ENABLE); +// +// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); +// +// /* Reset sEE_I2C peripheral */ +// RCC_APB1PeriphResetCmd(sEE_I2C_CLK, ENABLE); +// +// /* Release reset signal of sEE_I2C IP */ +// RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE); +// +// /*!< GPIO configuration */ +// /* Connect PXx to I2C_SCL*/ +// GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF); +// +// /* Connect PXx to I2C_SDA*/ +// GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF); +// +// /*!< Configure sEE_I2C pins: SCL */ +// GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; +// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure); +// +// /*!< Configure sEE_I2C pins: SDA */ +// GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN; +// GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); +// +// +// /* Configure and enable I2C DMA TX Channel interrupt */ +// NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO; +// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; +// NVIC_Init(&NVIC_InitStructure); +// +// /* Configure and enable I2C DMA RX Channel interrupt */ +// NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO; +// NVIC_Init(&NVIC_InitStructure); +// +// /*!< I2C DMA TX and RX channels configuration */ +// /* Enable the DMA clock */ +// RCC_AHBPeriphClockCmd(sEE_I2C_DMA_CLK, ENABLE); +// +// /* I2C TX DMA Channel configuration */ +// DMA_DeInit(sEE_I2C_DMA_CHANNEL_TX); +// sEEDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)sEE_I2C_DR_Address; +// sEEDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)0; /* This parameter will be configured durig communication */ +// sEEDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* This parameter will be configured durig communication */ +// sEEDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */ +// sEEDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; +// sEEDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; +// sEEDMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte; +// sEEDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; +// sEEDMA_InitStructure.DMA_Mode = DMA_Mode_Normal; +// sEEDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; +// sEEDMA_InitStructure.DMA_M2M = DMA_M2M_Disable; +// DMA_Init(sEE_I2C_DMA_CHANNEL_TX, &sEEDMA_InitStructure); +// +// /* I2C RX DMA Channel configuration */ +// DMA_DeInit(sEE_I2C_DMA_CHANNEL_RX); +// DMA_Init(sEE_I2C_DMA_CHANNEL_RX, &sEEDMA_InitStructure); +// +// /* Enable the DMA Channels Interrupts */ +// DMA_ITConfig(sEE_I2C_DMA_CHANNEL_TX, DMA_IT_TC, ENABLE); +// DMA_ITConfig(sEE_I2C_DMA_CHANNEL_RX, DMA_IT_TC, ENABLE); +//} +// +///** +// * @brief Initializes DMA channel used by the I2C EEPROM driver. +// * @param None +// * @retval None +// */ +//void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction) +//{ +// /* Initialize the DMA with the new parameters */ +// if (Direction == sEE_DIRECTION_TX) +// { +// /* Configure the DMA Tx Channel with the buffer address and the buffer size */ +// sEEDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pBuffer; +// sEEDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; +// sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize; +// DMA_Init(sEE_I2C_DMA_CHANNEL_TX, &sEEDMA_InitStructure); +// } +// else +// { +// /* Configure the DMA Rx Channel with the buffer address and the buffer size */ +// sEEDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pBuffer; +// sEEDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; +// sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize; +// DMA_Init(sEE_I2C_DMA_CHANNEL_RX, &sEEDMA_InitStructure); +// } +//} + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.h b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.h new file mode 100644 index 0000000..631dc03 --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval.h @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @file stm32l152_eval.h + * @author MCD Application Team + * @version V5.0.2 + * @date 09-March-2012 + * @brief This file contains definitions for STM32L152_EVAL's Leds, push-buttons + * and COM ports hardware resources. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __STM32L152_EVAL_H +#define __STM32L152_EVAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" +#include "stm32_eval_legacy.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL + * @{ + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Exported_Types + * @{ + */ +//typedef enum +//{ +// LED1 = 0, +// LED2 = 1, +// LED3 = 2, +// LED4 = 3 +//} Led_TypeDef; +// +//typedef enum +//{ +// BUTTON_KEY = 0, +// BUTTON_RIGHT = 1, +// BUTTON_LEFT = 2, +// BUTTON_UP = 3, +// BUTTON_DOWN = 4, +// BUTTON_SEL = 5 +//} Button_TypeDef; +// +//typedef enum +//{ +// BUTTON_MODE_GPIO = 0, +// BUTTON_MODE_EXTI = 1 +//} ButtonMode_TypeDef; +// +//typedef enum +//{ +// JOY_NONE = 0, +// JOY_SEL = 1, +// JOY_DOWN = 2, +// JOY_LEFT = 3, +// JOY_RIGHT = 4, +// JOY_UP = 5 +//} JOYState_TypeDef +//; +// +//typedef enum +//{ +// COM1 = 0, +// COM2 = 1, +// COM3 = 2 +//} COM_TypeDef; +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Exported_Constants + * @{ + */ + +/** + * @brief Define for STM32L152_EVAL board + */ +#if !defined (USE_STM32L152_EVAL) + #define USE_STM32L152_EVAL +#endif + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL_LED + * @{ + */ +//#define LEDn 4 +// +//#define LED1_PIN GPIO_Pin_0 +//#define LED1_GPIO_PORT GPIOD +//#define LED1_GPIO_CLK RCC_AHBPeriph_GPIOD +// +//#define LED2_PIN GPIO_Pin_1 +//#define LED2_GPIO_PORT GPIOD +//#define LED2_GPIO_CLK RCC_AHBPeriph_GPIOD +// +//#define LED3_PIN GPIO_Pin_4 +//#define LED3_GPIO_PORT GPIOD +//#define LED3_GPIO_CLK RCC_AHBPeriph_GPIOD +// +//#define LED4_PIN GPIO_Pin_5 +//#define LED4_GPIO_PORT GPIOD +//#define LED4_GPIO_CLK RCC_AHBPeriph_GPIOD + +/** + * @} + */ + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL_BUTTON + * @{ + */ +//#define BUTTONn 6 +/* On STM32L152-EVAL board, the KEY button is connected to PA.00 and it can + be use as Wakeup pin button. */ + +/** + * @brief Key push-button + */ +//#define KEY_BUTTON_PIN GPIO_Pin_0 +//#define KEY_BUTTON_GPIO_PORT GPIOA +//#define KEY_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOA +//#define KEY_BUTTON_EXTI_LINE EXTI_Line0 +//#define KEY_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA +//#define KEY_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource0 +//#define KEY_BUTTON_EXTI_IRQn EXTI0_IRQn +// +///** +// * @brief Joystick Right push-button +// */ +//#define RIGHT_BUTTON_PIN GPIO_Pin_11 +//#define RIGHT_BUTTON_GPIO_PORT GPIOE +//#define RIGHT_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define RIGHT_BUTTON_EXTI_LINE EXTI_Line11 +//#define RIGHT_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define RIGHT_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource11 +//#define RIGHT_BUTTON_EXTI_IRQn EXTI15_10_IRQn +// +///** +// * @brief Joystick Left push-button +// */ +//#define LEFT_BUTTON_PIN GPIO_Pin_12 +//#define LEFT_BUTTON_GPIO_PORT GPIOE +//#define LEFT_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define LEFT_BUTTON_EXTI_LINE EXTI_Line12 +//#define LEFT_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define LEFT_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource12 +//#define LEFT_BUTTON_EXTI_IRQn EXTI15_10_IRQn +// +///** +// * @brief Joystick Up push-button +// */ +//#define UP_BUTTON_PIN GPIO_Pin_9 +//#define UP_BUTTON_GPIO_PORT GPIOE +//#define UP_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define UP_BUTTON_EXTI_LINE EXTI_Line9 +//#define UP_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define UP_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource9 +//#define UP_BUTTON_EXTI_IRQn EXTI9_5_IRQn +// +///** +// * @brief Joystick Down push-button +// */ +//#define DOWN_BUTTON_PIN GPIO_Pin_10 +//#define DOWN_BUTTON_GPIO_PORT GPIOE +//#define DOWN_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define DOWN_BUTTON_EXTI_LINE EXTI_Line10 +//#define DOWN_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define DOWN_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource10 +//#define DOWN_BUTTON_EXTI_IRQn EXTI15_10_IRQn +// +///** +// * @brief Joystick Sel push-button +// */ +//#define SEL_BUTTON_PIN GPIO_Pin_8 +//#define SEL_BUTTON_GPIO_PORT GPIOE +//#define SEL_BUTTON_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define SEL_BUTTON_EXTI_LINE EXTI_Line8 +//#define SEL_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define SEL_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource8 +//#define SEL_BUTTON_EXTI_IRQn EXTI9_5_IRQn +// +///** +// * @} +// */ +// +///** @addtogroup STM32L152_EVAL_LOW_LEVEL_COM +// * @{ +// */ +//#define COMn 3 +// +///** +// * @brief Definition for COM port1, connected to USART2 +// */ +//#define EVAL_COM1 USART2 +//#define EVAL_COM1_CLK RCC_APB1Periph_USART2 +// +//#define EVAL_COM1_TX_PIN GPIO_Pin_5 +//#define EVAL_COM1_TX_GPIO_PORT GPIOD +//#define EVAL_COM1_TX_GPIO_CLK RCC_AHBPeriph_GPIOD +//#define EVAL_COM1_TX_SOURCE GPIO_PinSource5 +//#define EVAL_COM1_TX_AF GPIO_AF_USART2 +// +//#define EVAL_COM1_RX_PIN GPIO_Pin_6 +//#define EVAL_COM1_RX_GPIO_PORT GPIOD +//#define EVAL_COM1_RX_GPIO_CLK RCC_AHBPeriph_GPIOD +//#define EVAL_COM1_RX_SOURCE GPIO_PinSource6 +//#define EVAL_COM1_RX_AF GPIO_AF_USART2 +// +//#define EVAL_COM1_RTS_PIN GPIO_Pin_4 +//#define EVAL_COM1_RTS_GPIO_PORT GPIOD +//#define EVAL_COM1_RTS_GPIO_CLK RCC_AHBPeriph_GPIOD +//#define EVAL_COM1_RTS_SOURCE GPIO_PinSource4 +//#define EVAL_COM1_RTS_AF GPIO_AF_USART2 +// +//#define EVAL_COM1_CTS_PIN GPIO_Pin_3 +//#define EVAL_COM1_CTS_GPIO_PORT GPIOD +//#define EVAL_COM1_CTS_GPIO_CLK RCC_AHBPeriph_GPIOD +//#define EVAL_COM1_CTS_SOURCE GPIO_PinSource3 +//#define EVAL_COM1_CTS_AF GPIO_AF_USART2 +// +//#define EVAL_COM1_IRQn USART2_IRQn +// +///** +// * @brief Definition for COM port2, connected to USART3 +// */ +//#define EVAL_COM2 USART3 +//#define EVAL_COM2_CLK RCC_APB1Periph_USART3 +// +//#define EVAL_COM2_TX_PIN GPIO_Pin_10 +//#define EVAL_COM2_TX_GPIO_PORT GPIOC +//#define EVAL_COM2_TX_GPIO_CLK RCC_AHBPeriph_GPIOC +//#define EVAL_COM2_TX_SOURCE GPIO_PinSource10 +//#define EVAL_COM2_TX_AF GPIO_AF_USART3 +// +//#define EVAL_COM2_RX_PIN GPIO_Pin_11 +//#define EVAL_COM2_RX_GPIO_PORT GPIOC +//#define EVAL_COM2_RX_GPIO_CLK RCC_AHBPeriph_GPIOC +//#define EVAL_COM2_RX_SOURCE GPIO_PinSource11 +//#define EVAL_COM2_RX_AF GPIO_AF_USART3 +// +//#define EVAL_COM2_IRQn USART3_IRQn +// +///** +//* @brief Definition for COM port3, connected to USART1 +//*/ +//#define EVAL_COM3 USART1 +//#define EVAL_COM3_CLK RCC_APB2Periph_USART1 +// +//#define EVAL_COM3_TX_PIN GPIO_Pin_9 +//#define EVAL_COM3_TX_GPIO_PORT GPIOA +//#define EVAL_COM3_TX_GPIO_CLK RCC_AHBPeriph_GPIOA +//#define EVAL_COM3_TX_SOURCE GPIO_PinSource9 +//#define EVAL_COM3_TX_AF GPIO_AF_USART1 +// +//#define EVAL_COM3_RX_PIN GPIO_Pin_10 +//#define EVAL_COM3_RX_GPIO_PORT GPIOA +//#define EVAL_COM3_RX_GPIO_CLK RCC_AHBPeriph_GPIOA +//#define EVAL_COM3_RX_SOURCE GPIO_PinSource10 +//#define EVAL_COM3_RX_AF GPIO_AF_USART1 +// +//#define EVAL_COM3_IRQn USART1_IRQn +// +/** + * @} + */ + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL_SD_FLASH + * @{ + */ +/** + * @brief SD Card SPI Interface + */ +#define SD_SPI SPI2 +#define SD_SPI_CLK RCC_APB1Periph_SPI2 +#define SD_SPI_SCK_PIN GPIO_Pin_13 /* PB.13 */ +#define SD_SPI_SCK_GPIO_PORT GPIOB /* GPIOB */ +#define SD_SPI_SCK_GPIO_CLK RCC_AHBPeriph_GPIOB +#define SD_SPI_SCK_SOURCE GPIO_PinSource13 +#define SD_SPI_SCK_AF GPIO_AF_SPI2 +#define SD_SPI_MISO_PIN GPIO_Pin_14 /* PB.14 */ +#define SD_SPI_MISO_GPIO_PORT GPIOB /* GPIOB */ +#define SD_SPI_MISO_GPIO_CLK RCC_AHBPeriph_GPIOB +#define SD_SPI_MISO_SOURCE GPIO_PinSource14 +#define SD_SPI_MISO_AF GPIO_AF_SPI2 +#define SD_SPI_MOSI_PIN GPIO_Pin_15 /* PB.15 */ +#define SD_SPI_MOSI_GPIO_PORT GPIOB /* GPIOB */ +#define SD_SPI_MOSI_GPIO_CLK RCC_AHBPeriph_GPIOB +#define SD_SPI_MOSI_SOURCE GPIO_PinSource15 +#define SD_SPI_MOSI_AF GPIO_AF_SPI2 +#define SD_CS_PIN GPIO_Pin_1 /* PB.01 */ +#define SD_CS_GPIO_PORT GPIOB /* GPIOB */ +#define SD_CS_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define SD_DETECT_PIN GPIO_Pin_6 /* PE.06 */ +//#define SD_DETECT_EXTI_LINE EXTI_Line6 +//#define SD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource6 +// +//#define SD_DETECT_GPIO_PORT GPIOE /* GPIOE */ +//#define SD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOE +//#define SD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE +//#define SD_DETECT_EXTI_IRQn EXTI9_5_IRQn +/** + * @} + */ + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL_TSENSOR_I2C + * @{ + */ +/** + * @brief LM75 Temperature Sensor I2C Interface pins + */ +//#define LM75_I2C I2C1 +//#define LM75_I2C_CLK RCC_APB1Periph_I2C1 +//#define LM75_I2C_SCL_PIN GPIO_Pin_6 /* PB.06 */ +//#define LM75_I2C_SCL_GPIO_PORT GPIOB /* GPIOB */ +//#define LM75_I2C_SCL_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define LM75_I2C_SCL_SOURCE GPIO_PinSource6 +//#define LM75_I2C_SCL_AF GPIO_AF_I2C1 +//#define LM75_I2C_SDA_PIN GPIO_Pin_7 /* PB.07 */ +//#define LM75_I2C_SDA_GPIO_PORT GPIOB /* GPIOB */ +//#define LM75_I2C_SDA_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define LM75_I2C_SDA_SOURCE GPIO_PinSource7 +//#define LM75_I2C_SDA_AF GPIO_AF_I2C1 +//#define LM75_I2C_SMBUSALERT_PIN GPIO_Pin_5 /* PB.05 */ +//#define LM75_I2C_SMBUSALERT_GPIO_PORT GPIOB /* GPIOB */ +//#define LM75_I2C_SMBUSALERT_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define LM75_I2C_SMBUSALERT_SOURCE GPIO_PinSource5 +//#define LM75_I2C_SMBUSALERT_AF GPIO_AF_I2C1 +//#define LM75_I2C_DR ((uint32_t)0x40005410) +// +//#define LM75_DMA_CLK RCC_AHBPeriph_DMA1 +//#define LM75_DMA_TX_CHANNEL DMA1_Channel6 +//#define LM75_DMA_RX_CHANNEL DMA1_Channel7 +//#define LM75_DMA_TX_TCFLAG DMA1_FLAG_TC6 +//#define LM75_DMA_RX_TCFLAG DMA1_FLAG_TC7 + +/** + * @} + */ + +/** @addtogroup STM32L152_EVAL_LOW_LEVEL_I2C_EE + * @{ + */ +/** + * @brief I2C EEPROM Interface pins + */ + +//#define sEE_I2C I2C1 +//#define sEE_I2C_CLK RCC_APB1Periph_I2C1 +//#define sEE_I2C_SCL_PIN GPIO_Pin_6 /* PB.06 */ +//#define sEE_I2C_SCL_GPIO_PORT GPIOB /* GPIOB */ +//#define sEE_I2C_SCL_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define sEE_I2C_SCL_SOURCE GPIO_PinSource6 +//#define sEE_I2C_SCL_AF GPIO_AF_I2C1 +//#define sEE_I2C_SDA_PIN GPIO_Pin_7 /* PB.07 */ +//#define sEE_I2C_SDA_GPIO_PORT GPIOB /* GPIOB */ +//#define sEE_I2C_SDA_GPIO_CLK RCC_AHBPeriph_GPIOB +//#define sEE_I2C_SDA_SOURCE GPIO_PinSource7 +//#define sEE_I2C_SDA_AF GPIO_AF_I2C1 +//#define sEE_M24C64_32 +// +//#define sEE_I2C_DMA DMA1 +//#define sEE_I2C_DMA_CHANNEL_TX DMA1_Channel6 +//#define sEE_I2C_DMA_CHANNEL_RX DMA1_Channel7 +//#define sEE_I2C_DMA_FLAG_TX_TC DMA1_IT_TC6 +//#define sEE_I2C_DMA_FLAG_TX_GL DMA1_IT_GL6 +//#define sEE_I2C_DMA_FLAG_RX_TC DMA1_IT_TC7 +//#define sEE_I2C_DMA_FLAG_RX_GL DMA1_IT_GL7 +//#define sEE_I2C_DMA_CLK RCC_AHBPeriph_DMA1 +//#define sEE_I2C_DR_Address ((uint32_t)0x40005410) +//#define sEE_USE_DMA +// +//#define sEE_I2C_DMA_TX_IRQn DMA1_Channel6_IRQn +//#define sEE_I2C_DMA_RX_IRQn DMA1_Channel7_IRQn +//#define sEE_I2C_DMA_TX_IRQHandler DMA1_Channel6_IRQHandler +//#define sEE_I2C_DMA_RX_IRQHandler DMA1_Channel7_IRQHandler +//#define sEE_I2C_DMA_PREPRIO 0 +//#define sEE_I2C_DMA_SUBPRIO 0 +// +//#define sEE_DIRECTION_TX 0 +//#define sEE_DIRECTION_RX 1 +// +///* Time constant for the delay caclulation allowing to have a millisecond +// incrementing counter. This value should be equal to (System Clock / 1000). +// ie. if system clock = 32MHz then sEE_TIME_CONST should be 32. */ +//#define sEE_TIME_CONST 32 + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Exported_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_LOW_LEVEL_Exported_Functions + * @{ + */ +//void STM_EVAL_LEDInit(Led_TypeDef Led); +//void STM_EVAL_LEDOn(Led_TypeDef Led); +//void STM_EVAL_LEDOff(Led_TypeDef Led); +//void STM_EVAL_LEDToggle(Led_TypeDef Led); +//void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode); +//uint32_t STM_EVAL_PBGetState(Button_TypeDef Button); +//void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct); +void SD_LowLevel_DeInit(void); +void SD_LowLevel_Init(void); +//void LM75_LowLevel_DeInit(void); +//void LM75_LowLevel_Init(void); +//void sEE_LowLevel_DeInit(void); +//void sEE_LowLevel_Init(void); +//void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L152_EVAL_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.c b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.c new file mode 100644 index 0000000..a474f0e --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.c @@ -0,0 +1,1147 @@ +/** + ****************************************************************************** + * @file stm32l152_eval_spi_sd.c + * @author MCD Application Team + * @version V5.0.2 + * @date 09-March-2012 + * @brief This file provides a set of functions needed to manage the SPI SD + * Card memory mounted on STM32L152-EVAL board. + * It implements a high level communication layer for read and write + * from/to this memory. The needed STM32L hardware resources (SPI and + * GPIO) are defined in stm32l152_eval.h file, and the initialization is + * performed in SD_LowLevel_Init() function declared in stm32l152_eval.c + * file. + * You can easily tailor this driver to any other development board, + * by just adapting the defines for hardware resources and + * SD_LowLevel_Init() function. + * + * =================================================================== + * Notes: + * - This driver is intended for STM32L1xx families devices only. + * - This driver doesn't support SD High Capacity cards. + * =================================================================== + * + * +-------------------------------------------------------+ + * | Pin assignment | + * +-------------------------+---------------+-------------+ + * | STM32 SPI Pins | SD | Pin | + * +-------------------------+---------------+-------------+ + * | SD_SPI_CS_PIN | ChipSelect | 1 | + * | SD_SPI_MOSI_PIN / MOSI | DataIn | 2 | + * | | GND | 3 (0 V) | + * | | VDD | 4 (3.3 V)| + * | SD_SPI_SCK_PIN / SCLK | Clock | 5 | + * | | GND | 6 (0 V) | + * | SD_SPI_MISO_PIN / MISO | DataOut | 7 | + * +-------------------------+---------------+-------------+ + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "stm32l152_eval_spi_sd.h" +#include "platform_config.h" +#include +#include "config.h" + +#ifdef SDHC +uint8_t flag_SDHC = 0; +#endif + + + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL_SPI_SD + * @brief This file includes the SD card driver of STM32L152-EVAL boards. + * @{ + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Variables + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32L152_EVAL_SPI_SD_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the SD/SD communication. + * @param None + * @retval None + */ +void SD_DeInit(void) +{ + SD_LowLevel_DeInit(); +} + +/** + * @brief Initializes the SD/SD communication. + * @param None + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_Init(void) +{ + + #ifdef SHOW_DEBUG_PRINTF + printf("Entering SD_Init()\n"); + #endif + + uint32_t i = 0; + + /*!< Initialize SD_SPI */ + SD_LowLevel_Init(); + +// #ifdef SHOW_DEBUG_PRINTF +// if(SD_Detect() == SD_NOT_PRESENT) +// { +// printf(" SD card not present\n"); +// } +// else +// { +// printf(" SD card present\n"); +// } +// #endif + + /*!< SD chip select high */ + SD_CS_HIGH(); + + /*!< Send dummy byte 0xFF, 10 times with CS high */ + /*!< Rise CS and MOSI for 80 clocks cycles */ + for (i = 0; i <= 9; i++) + { + /*!< Send dummy byte 0xFF */ + SD_WriteByte(SD_DUMMY_BYTE); + } + /*------------Put SD in SPI mode--------------*/ + /*!< SD initialized and set to SPI mode properly */ + return (SD_GoIdleState()); +} + +/** + * @brief Detect if SD card is correctly plugged in the memory slot. + * @param None + * @retval Return if SD is detected or not + */ +//uint8_t SD_Detect(void) +//{ +// __IO uint8_t status = SD_PRESENT; +// +// /*!< Check GPIO to detect SD */ +// if (GPIO_ReadInputData(SD_DETECT_GPIO_PORT) & SD_DETECT_PIN) +// { +// status = SD_NOT_PRESENT; +// } +// return status; +//} + +/** + * @brief Returns information about specific card. + * @param cardinfo: pointer to a SD_CardInfo structure that contains all SD + * card information. + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo) +{ + SD_Error status = SD_RESPONSE_FAILURE; + + status = SD_GetCSDRegister(&(cardinfo->SD_csd)); + status = SD_GetCIDRegister(&(cardinfo->SD_cid)); + cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) ; + cardinfo->CardCapacity *= (1 << (cardinfo->SD_csd.DeviceSizeMul + 2)); + cardinfo->CardBlockSize = 1 << (cardinfo->SD_csd.RdBlockLen); + cardinfo->CardCapacity *= cardinfo->CardBlockSize; + + /*!< Returns the reponse */ + return status; +} + +/** + * @brief Reads a block of data from the SD. + * @param pBuffer: pointer to the buffer that receives the data read from the + * SD. + * @param ReadAddr: SD's internal address to read from. + * @param BlockSize: the SD card Data block size. + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_ReadBlock(uint8_t* pBuffer, uint64_t ReadAddr, uint16_t BlockSize) +{ + uint32_t i = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + + if(flag_SDHC == 1) + { + ReadAddr = ReadAddr >> 9; + } + + /*!< SD chip select low */ + SD_CS_LOW(); + + + /*!< Send CMD17 (SD_CMD_READ_SINGLE_BLOCK) to read one block */ + SD_SendCmd(SD_CMD_READ_SINGLE_BLOCK, (uint32_t)ReadAddr, 0xFF); + + /*!< Check if the SD acknowledged the read block command: R1 response (0x00: no errors) */ + if (!SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + /*!< Now look for the data token to signify the start of the data */ + if (!SD_GetResponse(SD_START_DATA_SINGLE_BLOCK_READ)) + { + /*!< Read the SD block data : read NumByteToRead data */ + for (i = 0; i < BlockSize; i++) + { + /*!< Save the received data */ + *pBuffer = SD_ReadByte(); + + /*!< Point to the next location where the byte read will be saved */ + pBuffer++; + } + /*!< Get CRC bytes (not really needed by us, but required by SD) */ + SD_ReadByte(); + SD_ReadByte(); + /*!< Set response value to success */ + rvalue = SD_RESPONSE_NO_ERROR; + } + } + /*!< SD chip select high */ + SD_CS_HIGH(); + + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< Returns the reponse */ + return rvalue; +} + +/** + * @brief Reads multiple block of data from the SD. + * @param pBuffer: pointer to the buffer that receives the data read from the + * SD. + * @param ReadAddr: SD's internal address to read from. + * @param BlockSize: the SD card Data block size. + * @param NumberOfBlocks: number of blocks to be read. + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_ReadMultiBlocks(uint8_t* pBuffer, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks) +{ + uint32_t i = 0, Offset = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + + /*!< SD chip select low */ + SD_CS_LOW(); + /*!< Data transfer */ + while (NumberOfBlocks--) + { + if(flag_SDHC == 1) + { + /* Send CMD24 (MSD_WRITE_BLOCK) to write blocks */ + SD_SendCmd (SD_CMD_READ_SINGLE_BLOCK,(uint32_t)((ReadAddr + Offset) >> 9), 0xFF); + } + else + { + /*!< Send CMD17 (SD_CMD_READ_SINGLE_BLOCK) to read one block */ + SD_SendCmd (SD_CMD_READ_SINGLE_BLOCK, (uint32_t)(ReadAddr + Offset), 0xFF); + } + + /*!< Check if the SD acknowledged the read block command: R1 response (0x00: no errors) */ + if (SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + return SD_RESPONSE_FAILURE; + } + /*!< Now look for the data token to signify the start of the data */ + if (!SD_GetResponse(SD_START_DATA_SINGLE_BLOCK_READ)) + { + /*!< Read the SD block data : read NumByteToRead data */ + for (i = 0; i < BlockSize; i++) + { + /*!< Read the pointed data */ + *pBuffer = SD_ReadByte(); + /*!< Point to the next location where the byte read will be saved */ + pBuffer++; + } + /*!< Set next read address*/ + Offset += 512; + /*!< get CRC bytes (not really needed by us, but required by SD) */ + SD_ReadByte(); + SD_ReadByte(); + /*!< Set response value to success */ + rvalue = SD_RESPONSE_NO_ERROR; + } + else + { + /*!< Set response value to failure */ + rvalue = SD_RESPONSE_FAILURE; + } + } + /*!< SD chip select high */ + SD_CS_HIGH(); + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + /*!< Returns the reponse */ + return rvalue; +} + +/** + * @brief Writes a block on the SD + * @param pBuffer: pointer to the buffer containing the data to be written on + * the SD. + * @param WriteAddr: address to write on. + * @param BlockSize: the SD card Data block size. + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_WriteBlock(uint8_t* pBuffer, uint64_t WriteAddr, uint16_t BlockSize) +{ + uint32_t i = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + + if(flag_SDHC == 1) + { + WriteAddr = WriteAddr >> 9; + } + + /*!< SD chip select low */ + SD_CS_LOW(); + + /*!< Send CMD24 (SD_CMD_WRITE_SINGLE_BLOCK) to write multiple block */ + SD_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, (uint32_t)(WriteAddr), 0xFF); + + /*!< Check if the SD acknowledged the write block command: R1 response (0x00: no errors) */ + if (!SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + /*!< Send a dummy byte */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< Send the data token to signify the start of the data */ + SD_WriteByte(0xFE); + + /*!< Write the block data to SD : write count data by block */ + for (i = 0; i < BlockSize; i++) + { + /*!< Send the pointed byte */ + SD_WriteByte(*pBuffer); + /*!< Point to the next location where the byte read will be saved */ + pBuffer++; + } + /*!< Put CRC bytes (not really needed by us, but required by SD) */ + SD_ReadByte(); + SD_ReadByte(); + + /*!< Read data response */ + if (SD_GetDataResponse() == SD_DATA_OK) + { + rvalue = SD_RESPONSE_NO_ERROR; + } + } + /*!< SD chip select high */ + SD_CS_HIGH(); + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< Returns the reponse */ + return rvalue; +} + +/** + * @brief Writes many blocks on the SD + * @param pBuffer: pointer to the buffer containing the data to be written on + * the SD. + * @param WriteAddr: address to write on. + * @param BlockSize: the SD card Data block size. + * @param NumberOfBlocks: number of blocks to be written. + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_WriteMultiBlocks(uint8_t* pBuffer, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks) +{ + uint32_t i = 0, Offset = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + + /*!< SD chip select low */ + SD_CS_LOW(); + /*!< Data transfer */ + while (NumberOfBlocks--) + { + if(flag_SDHC == 1) + { + /* Send CMD24 (SD_WRITE_BLOCK) to write blocks */ + SD_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, (uint32_t)((WriteAddr + Offset) >> 9), 0xFF); + } + else + { + /*!< Send CMD24 (SD_CMD_WRITE_SINGLE_BLOCK) to write blocks */ + SD_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, (uint32_t)(WriteAddr + Offset), 0xFF); + } + + /*!< Check if the SD acknowledged the write block command: R1 response (0x00: no errors) */ + if (SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + return SD_RESPONSE_FAILURE; + } + /*!< Send dummy byte */ + SD_WriteByte(SD_DUMMY_BYTE); + /*!< Send the data token to signify the start of the data */ + SD_WriteByte(SD_START_DATA_SINGLE_BLOCK_WRITE); + /*!< Write the block data to SD : write count data by block */ + for (i = 0; i < BlockSize; i++) + { + /*!< Send the pointed byte */ + SD_WriteByte(*pBuffer); + /*!< Point to the next location where the byte read will be saved */ + pBuffer++; + } + /*!< Set next write address */ + Offset += 512; + /*!< Put CRC bytes (not really needed by us, but required by SD) */ + SD_ReadByte(); + SD_ReadByte(); + /*!< Read data response */ + if (SD_GetDataResponse() == SD_DATA_OK) + { + /*!< Set response value to success */ + rvalue = SD_RESPONSE_NO_ERROR; + } + else + { + /*!< Set response value to failure */ + rvalue = SD_RESPONSE_FAILURE; + } + } + /*!< SD chip select high */ + SD_CS_HIGH(); + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + /*!< Returns the reponse */ + return rvalue; +} + +/** + * @brief Read the CSD card register. + * Reading the contents of the CSD register in SPI mode is a simple + * read-block transaction. + * @param SD_csd: pointer on an SCD register structure + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_GetCSDRegister(SD_CSD* SD_csd) +{ + + #ifdef SHOW_DEBUG_PRINTF + printf("Entering SD_GetCSDRegister() :\n"); + #endif + + uint32_t i = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + uint8_t CSD_Tab[16]; + + /*!< SD chip select low */ + SD_CS_LOW(); + /*!< Send CMD9 (CSD register) or CMD10(CSD register) */ + SD_SendCmd(SD_CMD_SEND_CSD, 0, 0xFF); + /*!< Wait for response in the R1 format (0x00 is no errors) */ + if (!SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + if (!SD_GetResponse(SD_START_DATA_SINGLE_BLOCK_READ)) + { + for (i = 0; i < 16; i++) + { + /*!< Store CSD register value on CSD_Tab */ + CSD_Tab[i] = SD_ReadByte(); + } + } + /*!< Get CRC bytes (not really needed by us, but required by SD) */ + SD_WriteByte(SD_DUMMY_BYTE); + SD_WriteByte(SD_DUMMY_BYTE); + /*!< Set response value to success */ + rvalue = SD_RESPONSE_NO_ERROR; + } + /*!< SD chip select high */ + SD_CS_HIGH(); + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< Byte 0 */ + SD_csd->CSDStruct = (CSD_Tab[0] & 0xC0) >> 6; + SD_csd->SysSpecVersion = (CSD_Tab[0] & 0x3C) >> 2; + SD_csd->Reserved1 = CSD_Tab[0] & 0x03; + + /*!< Byte 1 */ + SD_csd->TAAC = CSD_Tab[1]; + + /*!< Byte 2 */ + SD_csd->NSAC = CSD_Tab[2]; + + /*!< Byte 3 */ + SD_csd->MaxBusClkFrec = CSD_Tab[3]; + + /*!< Byte 4 */ + SD_csd->CardComdClasses = CSD_Tab[4] << 4; + + /*!< Byte 5 */ + SD_csd->CardComdClasses |= (CSD_Tab[5] & 0xF0) >> 4; + SD_csd->RdBlockLen = CSD_Tab[5] & 0x0F; + + /*!< Byte 6 */ + SD_csd->PartBlockRead = (CSD_Tab[6] & 0x80) >> 7; + SD_csd->WrBlockMisalign = (CSD_Tab[6] & 0x40) >> 6; + SD_csd->RdBlockMisalign = (CSD_Tab[6] & 0x20) >> 5; + SD_csd->DSRImpl = (CSD_Tab[6] & 0x10) >> 4; + SD_csd->Reserved2 = 0; /*!< Reserved */ + + SD_csd->DeviceSize = (CSD_Tab[6] & 0x03) << 10; + + /*!< Byte 7 */ + SD_csd->DeviceSize |= (CSD_Tab[7]) << 2; + + /*!< Byte 8 */ + SD_csd->DeviceSize |= (CSD_Tab[8] & 0xC0) >> 6; + + SD_csd->MaxRdCurrentVDDMin = (CSD_Tab[8] & 0x38) >> 3; + SD_csd->MaxRdCurrentVDDMax = (CSD_Tab[8] & 0x07); + + /*!< Byte 9 */ + SD_csd->MaxWrCurrentVDDMin = (CSD_Tab[9] & 0xE0) >> 5; + SD_csd->MaxWrCurrentVDDMax = (CSD_Tab[9] & 0x1C) >> 2; + SD_csd->DeviceSizeMul = (CSD_Tab[9] & 0x03) << 1; + /*!< Byte 10 */ + SD_csd->DeviceSizeMul |= (CSD_Tab[10] & 0x80) >> 7; + + SD_csd->EraseGrSize = (CSD_Tab[10] & 0x40) >> 6; + SD_csd->EraseGrMul = (CSD_Tab[10] & 0x3F) << 1; + + /*!< Byte 11 */ + SD_csd->EraseGrMul |= (CSD_Tab[11] & 0x80) >> 7; + SD_csd->WrProtectGrSize = (CSD_Tab[11] & 0x7F); + + /*!< Byte 12 */ + SD_csd->WrProtectGrEnable = (CSD_Tab[12] & 0x80) >> 7; + SD_csd->ManDeflECC = (CSD_Tab[12] & 0x60) >> 5; + SD_csd->WrSpeedFact = (CSD_Tab[12] & 0x1C) >> 2; + SD_csd->MaxWrBlockLen = (CSD_Tab[12] & 0x03) << 2; + + /*!< Byte 13 */ + SD_csd->MaxWrBlockLen |= (CSD_Tab[13] & 0xC0) >> 6; + SD_csd->WriteBlockPaPartial = (CSD_Tab[13] & 0x20) >> 5; + SD_csd->Reserved3 = 0; + SD_csd->ContentProtectAppli = (CSD_Tab[13] & 0x01); + + /*!< Byte 14 */ + SD_csd->FileFormatGrouop = (CSD_Tab[14] & 0x80) >> 7; + SD_csd->CopyFlag = (CSD_Tab[14] & 0x40) >> 6; + SD_csd->PermWrProtect = (CSD_Tab[14] & 0x20) >> 5; + SD_csd->TempWrProtect = (CSD_Tab[14] & 0x10) >> 4; + SD_csd->FileFormat = (CSD_Tab[14] & 0x0C) >> 2; + SD_csd->ECC = (CSD_Tab[14] & 0x03); + + /*!< Byte 15 */ + SD_csd->CSD_CRC = (CSD_Tab[15] & 0xFE) >> 1; + SD_csd->Reserved4 = 1; + + if(flag_SDHC ==1) + { + + /* Byte 8 */ + SD_csd->DeviceSize = ((uint16_t)CSD_Tab[8]) << 8; + /* Byte 9 */ + SD_csd->DeviceSize |= CSD_Tab[9]; + + SD_csd->DeviceSizeMul = 1; + + } + + #ifdef SHOW_DEBUG_PRINTF + printf(" Device size : %16lX\n", SD_csd->DeviceSize); + #endif + + /*!< Return the reponse */ + return rvalue; +} + +/** + * @brief Read the CID card register. + * Reading the contents of the CID register in SPI mode is a simple + * read-block transaction. + * @param SD_cid: pointer on an CID register structure + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_GetCIDRegister(SD_CID* SD_cid) +{ + uint32_t i = 0; + SD_Error rvalue = SD_RESPONSE_FAILURE; + uint8_t CID_Tab[16]; + + /*!< SD chip select low */ + SD_CS_LOW(); + + /*!< Send CMD10 (CID register) */ + SD_SendCmd(SD_CMD_SEND_CID, 0, 0xFF); + + /*!< Wait for response in the R1 format (0x00 is no errors) */ + if (!SD_GetResponse(SD_RESPONSE_NO_ERROR)) + { + if (!SD_GetResponse(SD_START_DATA_SINGLE_BLOCK_READ)) + { + /*!< Store CID register value on CID_Tab */ + for (i = 0; i < 16; i++) + { + CID_Tab[i] = SD_ReadByte(); + } + } + /*!< Get CRC bytes (not really needed by us, but required by SD) */ + SD_WriteByte(SD_DUMMY_BYTE); + SD_WriteByte(SD_DUMMY_BYTE); + /*!< Set response value to success */ + rvalue = SD_RESPONSE_NO_ERROR; + } + /*!< SD chip select high */ + SD_CS_HIGH(); + /*!< Send dummy byte: 8 Clock pulses of delay */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< Byte 0 */ + SD_cid->ManufacturerID = CID_Tab[0]; + + /*!< Byte 1 */ + SD_cid->OEM_AppliID = CID_Tab[1] << 8; + + /*!< Byte 2 */ + SD_cid->OEM_AppliID |= CID_Tab[2]; + + /*!< Byte 3 */ + SD_cid->ProdName1 = CID_Tab[3] << 24; + + /*!< Byte 4 */ + SD_cid->ProdName1 |= CID_Tab[4] << 16; + + /*!< Byte 5 */ + SD_cid->ProdName1 |= CID_Tab[5] << 8; + + /*!< Byte 6 */ + SD_cid->ProdName1 |= CID_Tab[6]; + + /*!< Byte 7 */ + SD_cid->ProdName2 = CID_Tab[7]; + + /*!< Byte 8 */ + SD_cid->ProdRev = CID_Tab[8]; + + /*!< Byte 9 */ + SD_cid->ProdSN = CID_Tab[9] << 24; + + /*!< Byte 10 */ + SD_cid->ProdSN |= CID_Tab[10] << 16; + + /*!< Byte 11 */ + SD_cid->ProdSN |= CID_Tab[11] << 8; + + /*!< Byte 12 */ + SD_cid->ProdSN |= CID_Tab[12]; + + /*!< Byte 13 */ + SD_cid->Reserved1 |= (CID_Tab[13] & 0xF0) >> 4; + SD_cid->ManufactDate = (CID_Tab[13] & 0x0F) << 8; + + /*!< Byte 14 */ + SD_cid->ManufactDate |= CID_Tab[14]; + + /*!< Byte 15 */ + SD_cid->CID_CRC = (CID_Tab[15] & 0xFE) >> 1; + SD_cid->Reserved2 = 1; + + /*!< Return the reponse */ + return rvalue; +} + +/** + * @brief Send 5 bytes command to the SD card. + * @param Cmd: The user expected command to send to SD card. + * @param Arg: The command argument. + * @param Crc: The CRC. + * @retval None + */ +void SD_SendCmd(uint8_t Cmd, uint32_t Arg, uint8_t Crc) +{ + uint32_t i = 0x00; + + uint8_t Frame[6]; + + Frame[0] = (Cmd | 0x40); /*!< Construct byte 1 */ + + Frame[1] = (uint8_t)(Arg >> 24); /*!< Construct byte 2 */ + + Frame[2] = (uint8_t)(Arg >> 16); /*!< Construct byte 3 */ + + Frame[3] = (uint8_t)(Arg >> 8); /*!< Construct byte 4 */ + + Frame[4] = (uint8_t)(Arg); /*!< Construct byte 5 */ + + Frame[5] = (Crc); /*!< Construct CRC: byte 6 */ + + for (i = 0; i < 6; i++) + { + SD_WriteByte(Frame[i]); /*!< Send the Cmd bytes */ + } +} + +/** + * @brief Get SD card data response. + * @param None + * @retval The SD status: Read data response xxx01 + * - status 010: Data accecpted + * - status 101: Data rejected due to a crc error + * - status 110: Data rejected due to a Write error. + * - status 111: Data rejected due to other error. + */ +uint8_t SD_GetDataResponse(void) +{ + uint32_t i = 0; + uint8_t response, rvalue; + + while (i <= 64) + { + /*!< Read resonse */ + response = SD_ReadByte(); + /*!< Mask unused bits */ + response &= 0x1F; + switch (response) + { + case SD_DATA_OK: + { + rvalue = SD_DATA_OK; + break; + } + case SD_DATA_CRC_ERROR: + return SD_DATA_CRC_ERROR; + case SD_DATA_WRITE_ERROR: + return SD_DATA_WRITE_ERROR; + default: + { + rvalue = SD_DATA_OTHER_ERROR; + break; + } + } + /*!< Exit loop in case of data ok */ + if (rvalue == SD_DATA_OK) + break; + /*!< Increment loop counter */ + i++; + } + + /*!< Wait null data */ + while (SD_ReadByte() == 0); + + /*!< Return response */ + return response; +} + +/** + * @brief Returns the SD response. + * @param None + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_GetResponse(uint8_t AwaitedResponse) +{ + + uint32_t Count = 0x0200; //Original: 0x00FF //Delay adjusted for different SD card timings + uint8_t Response; + + /*!< Check if response is got or a timeout is happen */ + do + { + Response = SD_ReadByte(); + Count--; + } while ((Response != AwaitedResponse) && Count ); + + if (Count == 0) + { + /*!< After time out */ + #ifdef SHOW_DEBUG_PRINTF + printf(" SD respond timeout\n"); + #endif + + return SD_RESPONSE_FAILURE; + } + else + { + /*!< Right response got */ + return SD_RESPONSE_NO_ERROR; + } +} + +/** + * @brief Returns the SD status. + * @param None + * @retval The SD status. + */ +uint16_t SD_GetStatus(void) +{ + uint16_t Status = 0; + + /*!< SD chip select low */ + SD_CS_LOW(); + + /*!< Send CMD13 (SD_SEND_STATUS) to get SD status */ + SD_SendCmd(SD_CMD_SEND_STATUS, 0, 0xFF); + + Status = SD_ReadByte(); + Status |= (uint16_t)(SD_ReadByte() << 8); + + /*!< SD chip select high */ + SD_CS_HIGH(); + + /*!< Send dummy byte 0xFF */ + SD_WriteByte(SD_DUMMY_BYTE); + + return Status; +} + +/** + * @brief Put SD in Idle state. + * @param None + * @retval The SD Response: + * - SD_RESPONSE_FAILURE: Sequence failed + * - SD_RESPONSE_NO_ERROR: Sequence succeed + */ +SD_Error SD_GoIdleState(void) +{ + uint32_t RetryDownCounter = 6; + SD_Error ResponseResult; + + #ifdef SHOW_DEBUG_PRINTF + printf("Entering SD_GoIdleState() :\n"); + #endif + + uint8_t r1; + uint16_t n2,n; + uint32_t ocr; + SD_Error retvalue = SD_RESPONSE_FAILURE; + + /*!< SD chip select low */ + SD_CS_LOW(); + + // Try to put SD in SPI mode + do + { + /*!< Send CMD0 (SD_CMD_GO_IDLE_STATE) to put SD in SPI mode */ + SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95); + + /*!< Wait for In Idle State Response (R1 Format) equal to 0x01 */ + ResponseResult = SD_GetResponse(SD_IN_IDLE_STATE); + + RetryDownCounter--; + + } while((ResponseResult != SD_RESPONSE_NO_ERROR) && (RetryDownCounter != 0)); + + if(ResponseResult != SD_RESPONSE_NO_ERROR) + { + /*!< No Idle State Response: return response failue */ + return SD_RESPONSE_FAILURE; + } + +// /*!< Send CMD0 (SD_CMD_GO_IDLE_STATE) to put SD in SPI mode */ +// SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95); +// +// /*!< Wait for In Idle State Response (R1 Format) equal to 0x01 */ +// if (SD_GetResponse(SD_IN_IDLE_STATE)) +// { +// /*!< No Idle State Response: return response failue */ +// return SD_RESPONSE_FAILURE; +// } + + /*----------checked the card version-----------*/ + #ifdef SHOW_DEBUG_PRINTF + printf(" Check card revision :\n"); + #endif + SD_SendCmd(8, 0x1aa, 0x87); /*check version*/ + + for (n=0xfff;n>0; n--) + { + r1= SD_ReadByte(); + if(r1 != 0xff)break; + } + + if(n==0) + { + #ifdef SHOW_DEBUG_PRINTF + printf(" SD not responding\n"); + #endif + return SD_RESPONSE_FAILURE; + } + + if(r1 == 0x05) + { + // We get here if we have a card that only supports SDv1 protocol + #ifdef SHOW_DEBUG_PRINTF + printf(" Version 1.X SD Memory card\n"); + #endif + + flag_SDHC = 0; + + /*----------Activates the card initialization process-----------*/ + #ifdef SHOW_DEBUG_PRINTF + printf(" Card initialization..."); + #endif + do + { + + /*!< SD chip select high */ + SD_CS_HIGH(); + + /*!< Send Dummy byte 0xFF */ + SD_WriteByte(SD_DUMMY_BYTE); + + /*!< SD chip select low */ + SD_CS_LOW(); + + /*!< Send CMD41 (Activates the card process) until response equal to 0x0 */ + SD_SendCmd(SD_CMD_SEND_OP_COND, 0, 0xFF); + /*!< Wait for no error Response (R1 Format) equal to 0x00 */ + } + while (SD_GetResponse(SD_RESPONSE_NO_ERROR)); + #ifdef SHOW_DEBUG_PRINTF + printf("activated\n"); + #endif + + /*!< SD chip select high */ + SD_CS_HIGH(); + + /*!< Send dummy byte 0xFF */ + SD_WriteByte(SD_DUMMY_BYTE); + + retvalue = SD_RESPONSE_NO_ERROR; + + } + else if(r1 == 0x01) + { + /* Send Dummy byte 0xFF */ + for(n=0; n<5; n++) + { + SD_ReadByte(); + } + + /* SD chip select high */ + SD_CS_HIGH(); + SD_WriteByte(SD_DUMMY_BYTE); + /* SD chip select low */ + SD_CS_LOW(); + SD_WriteByte(SD_DUMMY_BYTE); + SD_WriteByte(SD_DUMMY_BYTE); + n=0xff; + + do + { + SD_SendCmd(55, 0, 0); + for(n2=0; n2<0x08;n2++) + { + r1= SD_ReadByte(); + if(r1 !=1)n=0; + } + SD_SendCmd(41, 0x40000000, 0); //Host supports SDHC + + for(n2=0; n2<0xff;n2++) + { + r1= SD_ReadByte(); + if(r1 ==0)break; + } + //if (n>0 && r1!=0) + n--; + }while((r1!=0)&&(n>0)); + if(n==0) + { + retvalue = SD_RESPONSE_FAILURE; + } + else + { + SD_SendCmd(58, 0, 0); + ocr=0; + for(n=0;n<6;n++) + { + r1 = SD_ReadByte(); + if (n>1){ + ocr += (uint32_t) (r1<<(3-(n-2))*8); + } + } + r1 = SD_ReadByte(); //CRC + + //Check if CCS=1 (SDHC) + if ((ocr & 0x40000000)==0){ + flag_SDHC=0; // SD + #ifdef SHOW_DEBUG_PRINTF + printf("flag_SDHC set to 0\n"); + #endif + }else{ + #ifdef SHOW_DEBUG_PRINTF + printf("flag_SDHC set to 1\n"); + #endif + flag_SDHC=1; // SDHC + } + + retvalue = SD_RESPONSE_NO_ERROR; + } + } + + + return(retvalue); +} +/* +SD_Error SD_EnterPowerDown(void){ + //!< SD chip select low + SD_CS_LOW(); + + //!< Send CMD48 (CID register) + SD_SendCmd(SD_CMD_SEND_CID, 0, 0xFF); + + //!< SD chip select high + SD_CS_High(); +}*/ + +/** + * @brief Write a byte on the SD. + * @param Data: byte to send. + * @retval None + */ +uint8_t SD_WriteByte(uint8_t Data) +{ + /*!< Wait until the transmit buffer is empty */ + while(SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_TXE) == RESET) + { + } + + /*!< Send the byte */ + SPI_I2S_SendData(SD_SPI, Data); + + /*!< Wait to receive a byte*/ + while(SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_RXNE) == RESET) + { + } + + /*!< Return the byte read from the SPI bus */ + return (uint8_t)SPI_I2S_ReceiveData(SD_SPI); +} + +/** + * @brief Read a byte from the SD. + * @param None + * @retval The received byte. + */ +uint8_t SD_ReadByte(void) +{ + uint8_t Data = 0; + + /*!< Wait until the transmit buffer is empty */ + while (SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_TXE) == RESET) + { + } + /*!< Send the byte */ + SPI_I2S_SendData(SD_SPI, SD_DUMMY_BYTE); + + /*!< Wait until a data is received */ + while (SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_RXNE) == RESET) + { + } + /*!< Get the received data */ + Data = (uint8_t)SPI_I2S_ReceiveData(SD_SPI); + + /*!< Return the shifted data */ + return Data; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.h b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.h new file mode 100644 index 0000000..66b9c99 --- /dev/null +++ b/Firmware/WIMU3/STM32_EVAL/STM32L152_EVAL/stm32l152_eval_spi_sd.h @@ -0,0 +1,290 @@ +/** + ****************************************************************************** + * @file stm32l152_eval_spi_sd.h + * @author MCD Application Team + * @version V5.0.2 + * @date 09-March-2012 + * @brief This file contains all the functions prototypes for the stm32l152_eval_spi_sd + * firmware driver. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __STM32L152_EVAL_SPI_SD_H +#define __STM32L152_EVAL_SPI_SD_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l152_eval.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL + * @{ + */ + +/** @addtogroup STM32L152_EVAL_SPI_SD + * @{ + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Exported_Types + * @{ + */ + +typedef enum +{ +/** + * @brief SD reponses and error flags + */ + SD_RESPONSE_NO_ERROR = (0x00), + SD_IN_IDLE_STATE = (0x01), + SD_ERASE_RESET = (0x02), + SD_ILLEGAL_COMMAND = (0x04), + SD_COM_CRC_ERROR = (0x08), + SD_ERASE_SEQUENCE_ERROR = (0x10), + SD_ADDRESS_ERROR = (0x20), + SD_PARAMETER_ERROR = (0x40), + SD_RESPONSE_FAILURE = (0xFF), + +/** + * @brief Data response error + */ + SD_DATA_OK = (0x05), + SD_DATA_CRC_ERROR = (0x0B), + SD_DATA_WRITE_ERROR = (0x0D), + SD_DATA_OTHER_ERROR = (0xFF) +} SD_Error; + +/** + * @brief 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; /*!< Reserded */ + __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*/ +} SD_CSD; + +/** + * @brief Card Identification Data: CID Register + */ +typedef struct +{ + __IO uint8_t ManufacturerID; /*!< ManufacturerID */ + __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 */ +} SD_CID; + +/** + * @brief SD Card information + */ +typedef struct +{ + SD_CSD SD_csd; + SD_CID SD_cid; + uint32_t CardCapacity; /*!< Card Capacity */ + uint32_t CardBlockSize; /*!< Card Block Size */ +} SD_CardInfo; + +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Exported_Constants + * @{ + */ + +/** + * @brief Block Size + */ +#define SD_BLOCK_SIZE 0x200 + +/** + * @brief Dummy byte + */ +#define SD_DUMMY_BYTE 0xFF + +/** + * @brief Start Data tokens: + * Tokens (necessary because at nop/idle (and CS active) only 0xff is + * on the data/command line) + */ +#define SD_START_DATA_SINGLE_BLOCK_READ 0xFE /*!< Data token start byte, Start Single Block Read */ +#define SD_START_DATA_MULTIPLE_BLOCK_READ 0xFE /*!< Data token start byte, Start Multiple Block Read */ +#define SD_START_DATA_SINGLE_BLOCK_WRITE 0xFE /*!< Data token start byte, Start Single Block Write */ +#define SD_START_DATA_MULTIPLE_BLOCK_WRITE 0xFD /*!< Data token start byte, Start Multiple Block Write */ +#define SD_STOP_DATA_MULTIPLE_BLOCK_WRITE 0xFD /*!< Data toke stop byte, Stop Multiple Block Write */ + +/** + * @brief SD detection on its memory slot + */ +#define SD_PRESENT ((uint8_t)0x01) +#define SD_NOT_PRESENT ((uint8_t)0x00) + + +/** + * @brief Commands: CMDxx = CMD-number | 0x40 + */ +#define SD_CMD_GO_IDLE_STATE 0 /*!< CMD0 = 0x40 */ +#define SD_CMD_SEND_OP_COND 1 /*!< CMD1 = 0x41 */ +#define SD_CMD_SEND_CSD 9 /*!< CMD9 = 0x49 */ +#define SD_CMD_SEND_CID 10 /*!< CMD10 = 0x4A */ +#define SD_CMD_STOP_TRANSMISSION 12 /*!< CMD12 = 0x4C */ +#define SD_CMD_SEND_STATUS 13 /*!< CMD13 = 0x4D */ +#define SD_CMD_SET_BLOCKLEN 16 /*!< CMD16 = 0x50 */ +#define SD_CMD_READ_SINGLE_BLOCK 17 /*!< CMD17 = 0x51 */ +#define SD_CMD_READ_MULT_BLOCK 18 /*!< CMD18 = 0x52 */ +#define SD_CMD_SET_BLOCK_COUNT 23 /*!< CMD23 = 0x57 */ +#define SD_CMD_WRITE_SINGLE_BLOCK 24 /*!< CMD24 = 0x58 */ +#define SD_CMD_WRITE_MULT_BLOCK 25 /*!< CMD25 = 0x59 */ +#define SD_CMD_PROG_CSD 27 /*!< CMD27 = 0x5B */ +#define SD_CMD_SET_WRITE_PROT 28 /*!< CMD28 = 0x5C */ +#define SD_CMD_CLR_WRITE_PROT 29 /*!< CMD29 = 0x5D */ +#define SD_CMD_SEND_WRITE_PROT 30 /*!< CMD30 = 0x5E */ +#define SD_CMD_SD_ERASE_GRP_START 32 /*!< CMD32 = 0x60 */ +#define SD_CMD_SD_ERASE_GRP_END 33 /*!< CMD33 = 0x61 */ +#define SD_CMD_UNTAG_SECTOR 34 /*!< CMD34 = 0x62 */ +#define SD_CMD_ERASE_GRP_START 35 /*!< CMD35 = 0x63 */ +#define SD_CMD_ERASE_GRP_END 36 /*!< CMD36 = 0x64 */ +#define SD_CMD_UNTAG_ERASE_GROUP 37 /*!< CMD37 = 0x65 */ +#define SD_CMD_ERASE 38 /*!< CMD38 = 0x66 */ + +#define SD_CMD_READ_EXTR_SINGLE 48 /*!< CMD48 = 0xC8 */ +#define SD_CMD_WRITE_EXTR_SINGLE 49 /*!< CMD49 = 0xC9 */ + +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Exported_Macros + * @{ + */ +/** + * @brief Select SD Card: ChipSelect pin low + */ +#define SD_CS_LOW() GPIO_ResetBits(SD_CS_GPIO_PORT, SD_CS_PIN) +/** + * @brief Deselect SD Card: ChipSelect pin high + */ +#define SD_CS_HIGH() GPIO_SetBits(SD_CS_GPIO_PORT, SD_CS_PIN) +/** + * @} + */ + +/** @defgroup STM32L152_EVAL_SPI_SD_Exported_Functions + * @{ + */ +void SD_DeInit(void); +SD_Error SD_Init(void); +//uint8_t SD_Detect(void); +SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo); +SD_Error SD_ReadBlock(uint8_t* pBuffer, uint64_t ReadAddr, uint16_t BlockSize); +SD_Error SD_ReadMultiBlocks(uint8_t* pBuffer, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks); +SD_Error SD_WriteBlock(uint8_t* pBuffer, uint64_t WriteAddr, uint16_t BlockSize); +SD_Error SD_WriteMultiBlocks(uint8_t* pBuffer, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks); +SD_Error SD_GetCSDRegister(SD_CSD* SD_csd); +SD_Error SD_GetCIDRegister(SD_CID* SD_cid); + +void SD_SendCmd(uint8_t Cmd, uint32_t Arg, uint8_t Crc); +SD_Error SD_GetResponse(uint8_t Response); +uint8_t SD_GetDataResponse(void); +SD_Error SD_GoIdleState(void); +uint16_t SD_GetStatus(void); +//SD_Error SD_EnterPowerDown(void){ + +uint8_t SD_WriteByte(uint8_t byte); +uint8_t SD_ReadByte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L152_EVAL_SPI_SD_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/WIMu_MS_VC.hzp b/Firmware/WIMU3/WIMu_MS_VC.hzp new file mode 100644 index 0000000..bf97798 --- /dev/null +++ b/Firmware/WIMU3/WIMu_MS_VC.hzp @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/WIMU3/WIMu_MS_VC.hzs b/Firmware/WIMU3/WIMu_MS_VC.hzs new file mode 100644 index 0000000..0f2c3d4 --- /dev/null +++ b/Firmware/WIMU3/WIMu_MS_VC.hzs @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Firmware/WIMU3/bin/WIMU_3_3_2.dfu b/Firmware/WIMU3/bin/WIMU_3_3_2.dfu new file mode 100644 index 0000000..0e973b2 Binary files /dev/null and b/Firmware/WIMU3/bin/WIMU_3_3_2.dfu differ diff --git a/Firmware/WIMU3/inc/FIFO.h b/Firmware/WIMU3/inc/FIFO.h new file mode 100644 index 0000000..30e30df --- /dev/null +++ b/Firmware/WIMU3/inc/FIFO.h @@ -0,0 +1,41 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef FIFO_H_ +#define FIFO_H_ + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include + + +/* Exported types ------------------------------------------------------------*/ +typedef struct +{ + void * ArrayPtr; + size_t ElementSize; + uint16_t ArraySize; + uint16_t RdPtr; + uint16_t WrPtr; + +} FIFO_TypeDef; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + + +/* Exported functions ------------------------------------------------------- */ + +void FIFO_Init(FIFO_TypeDef* FIFO, void * ArrayPtr, size_t ElementSize, uint16_t ArraySize); +uint8_t FIFO_WrArrayInIfSpaceAvailable(FIFO_TypeDef* FIFO, void * Array, uint16_t Array_Length); +void FIFO_WrArrayIn(FIFO_TypeDef* FIFO, void * Array, uint16_t Array_Length); +uint8_t FIFO_WrElementIfSpaceAvailable(FIFO_TypeDef* FIFO, void * Element); +void FIFO_WrElementIn(FIFO_TypeDef* FIFO, void * Element); +uint8_t FIFO_RdElementIfDataAvailable(FIFO_TypeDef* FIFO, void * RdElement); +uint8_t FIFO_IsEmpty(FIFO_TypeDef* FIFO); +uint16_t FIFO_GetFreeSpace(FIFO_TypeDef* FIFO); + +#endif /*FIFO_H_*/ diff --git a/Firmware/WIMU3/inc/GPS_driver.h b/Firmware/WIMU3/inc/GPS_driver.h new file mode 100644 index 0000000..875889f --- /dev/null +++ b/Firmware/WIMU3/inc/GPS_driver.h @@ -0,0 +1,35 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef GPS_DRIVER_H_ +#define GPS_DRIVER_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "utils.h" +#include "stm32l1xx.h" +#include "stm32l1xx_usart.h" +#include "stm32l1xx_dma.h" +#include + +/* Exported types ------------------------------------------------------------*/ +extern uint8_t GPS_Rx_DMA[255]; +extern DMA_InitTypeDef DMA_InitStructure; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions ------------------------------------------------------- */ +void GPS_Config(void); +void GPS_1PPS_IRQConfig(FunctionalState NewState); +void GPS_SetupPower(void); +void GPS_EnablePower(void); +void GPS_DisablePower(void); +uint8_t GPS_Wakeup(void); +uint8_t GPS_Hibernate(void); +uint8_t GPS_PowerAndWakeup(void); +void GPS_ConfigRxIRQ(FunctionalState NewState); +void GPS_ConfigTxIRQ(FunctionalState NewState); +void GPS_SetBaudrate(uint32_t baudrate); + +#endif /*GPS_DRIVER_H_*/ diff --git a/Firmware/WIMU3/inc/I2C_driver.h b/Firmware/WIMU3/inc/I2C_driver.h new file mode 100644 index 0000000..ff13805 --- /dev/null +++ b/Firmware/WIMU3/inc/I2C_driver.h @@ -0,0 +1,44 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef I2C_DRIVER_H_ +#define I2C_DRIVER_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_i2c.h" +#include "stm32l1xx_rcc.h" +#include + + + +/* Exported types ------------------------------------------------------------*/ +typedef struct +{ + I2C_TypeDef* I2Cx; // I2C1 or I2C2 + uint32_t I2Cx_PeriphClk; // RCC_APB1Periph_I2C1 or RCC_APB1Periph_I2C2 + + uint32_t I2Cx_SCLGPIOClk; // RCC_AHBPeriph_GPIOx + GPIO_TypeDef* I2Cx_SCLPort; // GPIOx, where x is A, B... + uint16_t I2Cx_SCLPin; // GPIO_Pin_x, where x can be 0, 1... 15 + uint8_t I2Cx_SCLPinSource; // GPIO_PinSourcex, where x can be 0, 1... 15 + uint8_t I2Cx_SCLAlternFunc; // GPIO_AF_I2C or GPIO_AF_I2C2 + + uint32_t I2Cx_SDAGPIOClk; // RCC_AHBPeriph_GPIOx + GPIO_TypeDef* I2Cx_SDAPort; // GPIOx, where x is A, B... + uint16_t I2Cx_SDAPin; // GPIO_Pin_x, where x can be 0, 1... 15 + uint8_t I2Cx_SDAPinSource; // GPIO_PinSourcex, where x can be 0, 1... 15 + uint8_t I2Cx_SDAAlternFunc; // GPIO_AF_I2C or GPIO_AF_I2C2 + +} I2CConfig_TypeDef; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + +#define NBR_OF_I2C_USED 2 + +/* Exported functions ------------------------------------------------------- */ + +void I2C_Config(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); + +#endif /*I2C_DRIVER_H_*/ diff --git a/Firmware/WIMU3/inc/MPUCompass_driver.h b/Firmware/WIMU3/inc/MPUCompass_driver.h new file mode 100644 index 0000000..f5462d4 --- /dev/null +++ b/Firmware/WIMU3/inc/MPUCompass_driver.h @@ -0,0 +1,355 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef MPUCOMPASS_DRIVER_H_ +#define MPUCOMPASS_DRIVER_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_i2c.h" +#include "stm32l1xx_pwr.h" +#include "I2C_driver.h" +#include "stm32l1xx.h" +#include "utils.h" +#include + +#define MPU_FILTERGYRO 1 // Define to filter Acc/Gyro values on the MPU + +/* Exported types ------------------------------------------------------------*/ + +// If we filter the Gyro, internal Fs of the MPU changes, hence those values +// REF: MPU Register Mapping Document, pp. 11-12-13 +#ifndef MPU_FILTERGYRO + typedef enum + { + MPUCOMPASS_50Hz = 159,//655,//1312, + MPUCOMPASS_100Hz = 79,//328, + MPUCOMPASS_200Hz = 39//164 + } MPUCompassSamplingFreq_TypeDef; +#else + typedef enum + { + MPUCOMPASS_50Hz = 19, + MPUCOMPASS_100Hz = 9, + MPUCOMPASS_200Hz = 4 + } MPUCompassSamplingFreq_TypeDef; +#endif + +typedef struct +{ + uint8_t I2CAddress; + uint8_t RegisterAddress; + uint8_t RegisterValue; +} I2C_WriteStruct_Typedef; + +typedef struct +{ + uint8_t I2CAddress; + uint8_t RegisterAddress; + uint8_t * RegisterValue; + uint8_t BurstLength; +} I2C_ReadStruct_Typedef; + +typedef enum +{ + MPUCOMPASS_I2C_IDLE, + MPUCOMPASS_I2C_READING, + MPUCOMPASS_I2C_WRITING +} MPUCompass_I2CState_Typedef; + +typedef enum +{ + MPUCOMPASS_I2CWR_START, + MPUCOMPASS_I2CWR_ICADDR_1, + MPUCOMPASS_I2CWR_ICADDR_2, + MPUCOMPASS_I2CWR_REGADDR, + MPUCOMPASS_I2CWR_REGVAL +} MPUCompass_I2CWrState_Typedef; + +typedef enum +{ + MPUCOMPASS_I2CRD_START, + MPUCOMPASS_I2CRD_ICADDR_1, + MPUCOMPASS_I2CRD_ICADDR_2, + MPUCOMPASS_I2CRD_REGADDR, + MPUCOMPASS_I2CRD_RESTART, + MPUCOMPASS_I2CRD_DATA +} MPUCompass_I2CRdState_Typedef; + + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + +/* Use this define to set the maximum delay timeout for the I2C read or write. + Exeeding this timeout delay, the read/write functions will be aborted. The period + of the delay will depend on the system operating frequency. The following value + has been set for system running at 32 MHz. */ +#define I2C_REG_ACCESS_TIMEOUT 2000 + + +// LSE startup timeout delay (ms) +#define LSE_STARTUP_TIMEOUT 100 + + +// STM32 Peripheral ID MACRO +#define I2C_MPUCOMPASS_PERIPHERAL_ID I2C1 +#define I2C_EXTERNAL_PERIPHERAL_ID I2C2 + +// I2C address MACRO +#define I2C_MPU_ADDR 0xD0 +#define I2C_COMPASS_WR_ADDR 0x3C +#define I2C_COMPASS_RD_ADDR 0x3D +#define I2C_EXTERNAL_ADDR 0x00 + +// MPU register MACRO +#define MPU_REG__SELF_TEST_X 0x0D +#define MPU_REG__SELF_TEST_Y 0x0E +#define MPU_REG__SELF_TEST_Z 0x0F +#define MPU_REG__SELF_TEST_A 0x10 +#define MPU_REG__SMPLRT_DIV 0x19 +#define MPU_REG__CONFIG 0x1A +#define MPU_REG__GYRO_CONFIG 0x1B +#define MPU_REG__ACCEL_CONFIG 0x1C +#define MPU_REG__MOT_THR 0x1F +#define MPU_REG__FIFO_EN 0x23 +#define MPU_REG__I2C_MST_CTRL 0x24 +#define MPU_REG__I2C_SLV0_ADDR 0x25 +#define MPU_REG__I2C_SLV0_REG 0x26 +#define MPU_REG__I2C_SLV0_CTRL 0x27 +#define MPU_REG__I2C_SLV1_ADDR 0x28 +#define MPU_REG__I2C_SLV1_REG 0x29 +#define MPU_REG__I2C_SLV1_CTRL 0x2A +#define MPU_REG__I2C_SLV2_ADDR 0x2B +#define MPU_REG__I2C_SLV2_REG 0x2C +#define MPU_REG__I2C_SLV2_CTRL 0x2D +#define MPU_REG__I2C_SLV3_ADDR 0x2E +#define MPU_REG__I2C_SLV3_REG 0x2F +#define MPU_REG__I2C_SLV3_CTRL 0x30 +#define MPU_REG__I2C_SLV4_ADDR 0x31 +#define MPU_REG__I2C_SLV4_REG 0x32 +#define MPU_REG__I2C_SLV4_DO 0x33 +#define MPU_REG__I2C_SLV4_CTRL 0x34 +#define MPU_REG__I2C_SLV4_DI 0x35 +#define MPU_REG__I2C_MST_STATUS 0x36 +#define MPU_REG__INT_PIN_CFG 0x37 +#define MPU_REG__INT_ENABLE 0x38 +#define MPU_REG__INT_STATUS 0x3A +#define MPU_REG__ACCEL_XOUT_H 0x3B +#define MPU_REG__ACCEL_XOUT_L 0x3C +#define MPU_REG__ACCEL_YOUT_H 0x3D +#define MPU_REG__ACCEL_YOUT_L 0x3E +#define MPU_REG__ACCEL_ZOUT_H 0x3F +#define MPU_REG__ACCEL_ZOUT_L 0x40 +#define MPU_REG__TEMP_OUT_H 0x41 +#define MPU_REG__TEMP_OUT_L 0x42 +#define MPU_REG__GYRO_XOUT_H 0x43 +#define MPU_REG__GYRO_XOUT_L 0x44 +#define MPU_REG__GYRO_YOUT_H 0x45 +#define MPU_REG__GYRO_YOUT_L 0x46 +#define MPU_REG__GYRO_ZOUT_H 0x47 +#define MPU_REG__GYRO_ZOUT_L 0x48 +#define MPU_REG__EXT_SENS_DATA_00 0x49 +#define MPU_REG__EXT_SENS_DATA_01 0x4A +#define MPU_REG__EXT_SENS_DATA_02 0x4B +#define MPU_REG__EXT_SENS_DATA_03 0x4C +#define MPU_REG__EXT_SENS_DATA_04 0x4D +#define MPU_REG__EXT_SENS_DATA_05 0x4E +#define MPU_REG__EXT_SENS_DATA_06 0x4F +#define MPU_REG__EXT_SENS_DATA_07 0x50 +#define MPU_REG__EXT_SENS_DATA_08 0x51 +#define MPU_REG__EXT_SENS_DATA_09 0x52 +#define MPU_REG__EXT_SENS_DATA_10 0x53 +#define MPU_REG__EXT_SENS_DATA_11 0x54 +#define MPU_REG__EXT_SENS_DATA_12 0x55 +#define MPU_REG__EXT_SENS_DATA_13 0x56 +#define MPU_REG__EXT_SENS_DATA_14 0x57 +#define MPU_REG__EXT_SENS_DATA_15 0x58 +#define MPU_REG__EXT_SENS_DATA_16 0x59 +#define MPU_REG__EXT_SENS_DATA_17 0x5A +#define MPU_REG__EXT_SENS_DATA_18 0x5B +#define MPU_REG__EXT_SENS_DATA_19 0x5C +#define MPU_REG__EXT_SENS_DATA_20 0x5D +#define MPU_REG__EXT_SENS_DATA_21 0x5E +#define MPU_REG__EXT_SENS_DATA_22 0x5F +#define MPU_REG__EXT_SENS_DATA_23 0x60 +#define MPU_REG__I2C_SLV0_DO 0x63 +#define MPU_REG__I2C_SLV1_DO 0x64 +#define MPU_REG__I2C_SLV2_DO 0x65 +#define MPU_REG__I2C_SLV3_DO 0x66 +#define MPU_REG__I2C_MST_DELAY_CTRL 0x67 +#define MPU_REG__SIGNAL_PATH_RESET 0x68 +#define MPU_REG__MOT_DETECT_CTRL 0x69 +#define MPU_REG__USER_CTRL 0x6A +#define MPU_REG__PWR_MGMT_1 0x6B +#define MPU_REG__PWR_MGMT_2 0x6C +#define MPU_REG__FIFO_COUNTH 0x72 +#define MPU_REG__FIFO_COUNTL 0x73 +#define MPU_REG__FIFO_R_W 0x74 +#define MPU_REG__WHO_AM_I 0x75 + +// MPU register bit mask MACRO +#define MPU_REG__USER_CTRL__I2C_MST_EN__MASK 0x20 + +#define MPU_REG__INT_PIN_CFG__I2C_BYPASS_EN__MASK 0x02 +#define MPU_REG__INT_PIN_CFG__INT_RD_CLEAR__MASK 0x10 + +#define MPU_REG__PWR_MGMT_1__SLEEP__MASK 0x40 +#define MPU_REG__PWR_MGMT_1__TEMP_DIS__MASK 0x08 +#define MPU_REG__PWR_MGMT_1__CLKSEL__MASK 0x07 +#define MPU_REG__PWR_MGMT_1__CLKSEL__SHIFT 0 + +#define MPU_REG__GYRO_CONFIG__FS_SEL__SHIFT 3 +#define MPU_REG__GYRO_CONFIG__FS_SEL__MASK 0x18 + +#define MPU_REG__ACCEL_CONFIG__AFS_SEL__SHIFT 3 +#define MPU_REG__ACCEL_CONFIG__AFS_SEL__MASK 0x18 + +#define MPU_REG__INT_ENABLE__DATA_RDY_EN__MASK 0x01 + +// GYRO filtering values +#define MPU_DLPF_256HZ 0 +#define MPU_DLPF_188HZ 1 +#define MPU_DLPF_98HZ 2 +#define MPU_DLPF_42HZ 3 +#define MPU_DLPF_20HZ 4 +#define MPU_DLPF_10HZ 5 +#define MPU_DLPF_5HZ 6 + +// Compass register MACRO +#define COMPASS_REG__CONF_A 0x00 +#define COMPASS_REG__CONF_B 0x01 +#define COMPASS_REG__MODE 0x02 +#define COMPASS_REG__DATA_X_MSB 0x03 +#define COMPASS_REG__DATA_X_LSB 0x04 +#define COMPASS_REG__DATA_Z_MSB 0x05 +#define COMPASS_REG__DATA_Z_LSB 0x06 +#define COMPASS_REG__DATA_Y_MSB 0x07 +#define COMPASS_REG__DATA_Y_LSB 0x08 +#define COMPASS_REG__STATUS 0x09 +#define COMPASS_REG__ID_A 0x0A +#define COMPASS_REG__ID_B 0x0B +#define COMPASS_REG__ID_C 0x0C + +//Configuration Register A +#define COMPASS_SAMPLE_AVG_1 0x0 +#define COMPASS_SAMPLE_AVG_2 0x1 +#define COMPASS_SAMPLE_AVG_4 0x2 +#define COMPASS_SAMPLE_AVG_8 0x3 + +#define COMPASS_DATA_OUT_0_75 0x0 +#define COMPASS_DATA_OUT_1_5 0x1 +#define COMPASS_DATA_OUT_3 0x2 +#define COMPASS_DATA_OUT_7_5 0x3 +#define COMPASS_DATA_OUT_15 0x4 +#define COMPASS_DATA_OUT_30 0x5 +#define COMPASS_DATA_OUT_75 0x6 + +#define COMPASS_MEASURE_NORMAL 0x0 +#define COMPASS_MEASURE_POSBIAS 0x1 +#define COMPASS_MEASURE_NEGBIAS 0x2 + +// Configuration Register B +#define COMPASS_GAIN_0_88 0x0 +#define COMPASS_GAIN_1_3 0x1 +#define COMPASS_GAIN_1_9 0x2 +#define COMPASS_GAIN_2_5 0x3 +#define COMPASS_GAIN_4_0 0x4 +#define COMPASS_GAIN_4_7 0x5 +#define COMPASS_GAIN_5_6 0x6 +#define COMPASS_GAIN_8_1 0x7 + +// Mode Register +#define COMPASS_MODE_CONTINUOUS 0x0 +#define COMPASS_MODE_SINGLE 0x1 +#define COMPASS_MODE_IDLE 0x2 + +// Configuration Values +#define COMPASS_SAMPLE_AVG COMPASS_SAMPLE_AVG_8 +#define COMPASS_DATA_OUT COMPASS_DATA_OUT_75 +#define COMPASS_MEASURE COMPASS_MEASURE_NORMAL + +//#define COMPASS_GAIN COMPASS_GAIN_8_1 + +#define COMPASS_MODE COMPASS_MODE_CONTINUOUS + +/*#define COMPASS_REG__CONG_A__MUST_CLR__SHIFT 7 +#define COMPASS_REG__CONG_A__MUST_CLR__MASK 0x80 + +#define COMPASS_REG__CONG_A__SAMPLE_FOR_AVG__SHIFT 5 +#define COMPASS_REG__CONG_A__SAMPLE_FOR_AVG__MASK 0x60 + +#define COMPASS_REG__CONG_A__OUTPUT_RATE__SHIFT 2 +#define COMPASS_REG__CONG_A__OUTPUT_RATE__MASK 0x1C + +#define COMPASS_REG__CONG_A__MEAS_CONF__SHIFT 0 +#define COMPASS_REG__CONG_A__MEAS_CONF__MASK 0x00 + + +#define COMPASS_REG__CONG_B__GAIN__SHIFT 5 +#define COMPASS_REG__CONG_B__GAIN__MASK 0xE0 + +#define COMPASS_REG__CONG_B__MUST_CLR__SHIFT 0 +#define COMPASS_REG__CONG_B__MUST_CLR__MASK 0x1F + + +#define COMPASS_REG__MODE__MUST_CLR__SHIFT 2 +#define COMPASS_REG__MODE__MUST_CLR__MASK 0xFC + +#define COMPASS_REG__MODE__OPERATE_MODE__SHIFT 0 +#define COMPASS_REG__MODE__OPERATE_MODE__MASK 0x03*/ + +#define COMPASS_REG__MODE__STATUS__RDY__MASK 0x01 + + +extern uint8_t MPU_SamplingFrequency; +extern uint8_t MPUCompass_SamplingFrequency; + +extern volatile uint8_t MPU_BufRdPtr; +extern uint8_t MPU_BufWrPtr; +extern volatile uint8_t Compass_BufRdPtr; +extern uint8_t Compass_BufWrPtr; +extern uint8_t MPU_SampleNumber; +extern uint8_t Compass_SampleNumber; +//extern uint8_t MPU_DMA[16]; + +extern volatile bool MPU_BufferReady[2]; +extern volatile bool Compass_BufferReady[2]; +//extern volatile uint8_t Gyro_BufferReady[2]; + +extern volatile bool MPU_NewValue; +//extern volatile bool GyroNewValue; +extern volatile bool Mag_NewValue; + + +/* Exported functions ------------------------------------------------------- */ +Error_TypeDef MPUCompass_MPUInit(void); +Error_TypeDef MPUCompass_MPUStart(void); + +uint8_t MPUCompass_ConfigIO(void); +void MPUCompass_SetupPower(void); +uint8_t MPUCompass_EnablePower(void); +void MPUCompass_DisablePower(void); +uint8_t MPUCompass_MPUWakeup(void); +uint8_t MPUCompass_MPUSleep(void); +uint8_t MPUCompass_MPUSetFreq(MPUCompassSamplingFreq_TypeDef SamplingFreq); + +void MPUCompass_MPUStop(void); +uint8_t MPUCompass_MPUIDValidation(void); +uint8_t MPUCompass_MPUConfigReg(uint8_t acc_range, uint8_t gyro_range); +//uint8_t MPUCompass_ReadMPUData(int16_t * AccelXYZData, int16_t * GyroXYZData); +uint8_t MPUCompass_StartReadMPUData(); +uint8_t MPUCompass_CompassIDValidation(void); +uint8_t MPUCompass_CompassConfigReg(uint8_t mag_range); +uint8_t MPUCompass_CompassSetFreq(MPUCompassSamplingFreq_TypeDef SamplingFreq); +uint8_t MPUCompass_CompassInitiateSingleMeasure(void); +//uint8_t MPUCompass_ReadMegnetoData(int16_t * MagnetoXYZData); +uint8_t MPUCompass_StartReadMagnetoData(); +void MPUCompass_CompassInitTimer(void); +void MPUCompass_CompassStart(void); +void MPUCompass_CompassStop(void); +uint8_t MPUCompass_CompassSync(void); +void MPUCompass_EnableInterrupt(bool enable); + + + +#endif /*MPUCOMPASS_DRIVER_H_*/ diff --git a/Firmware/WIMU3/inc/MS__mass_mal.h b/Firmware/WIMU3/inc/MS__mass_mal.h new file mode 100644 index 0000000..f51f97f --- /dev/null +++ b/Firmware/WIMU3/inc/MS__mass_mal.h @@ -0,0 +1,49 @@ +/** + ****************************************************************************** + * @file mass_mal.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Header for mass_mal.c file. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__MASS_MAL_H +#define __MS__MASS_MAL_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#define MAL_OK 0 +#define MAL_FAIL 1 +#define MAX_LUN 1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint16_t MAL_Init (uint8_t lun); +uint16_t MAL_GetStatus (uint8_t lun); +uint16_t MAL_Read(uint8_t lun, uint64_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length); +uint16_t MAL_Write(uint8_t lun, uint64_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length); +#endif /* __MS__MASS_MAL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/MS__memory.h b/Firmware/WIMU3/inc/MS__memory.h new file mode 100644 index 0000000..aaddab1 --- /dev/null +++ b/Firmware/WIMU3/inc/MS__memory.h @@ -0,0 +1,47 @@ +/** + ****************************************************************************** + * @file memory.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Memory management layer + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__memory_H +#define __MS__memory_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#define TXFR_IDLE 0 +#define TXFR_ONGOING 1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length); +void Read_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length); +#endif /* __MS__memory_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/MS__usb_bot.h b/Firmware/WIMU3/inc/MS__usb_bot.h new file mode 100644 index 0000000..08a18b6 --- /dev/null +++ b/Firmware/WIMU3/inc/MS__usb_bot.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file usb_bot.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief BOT State Machine management + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__USB_BOT_H +#define __MS__USB_BOT_H + +/* Includes ------------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Bulk-only Command Block Wrapper */ + +typedef struct _Bulk_Only_CBW +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataLength; + uint8_t bmFlags; + uint8_t bLUN; + uint8_t bCBLength; + uint8_t CB[16]; +} +Bulk_Only_CBW; + +/* Bulk-only Command Status Wrapper */ +typedef struct _Bulk_Only_CSW +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataResidue; + uint8_t bStatus; +} +Bulk_Only_CSW; +/* Exported constants --------------------------------------------------------*/ + +/*****************************************************************************/ +/*********************** Bulk-Only Transfer State machine ********************/ +/*****************************************************************************/ +#define BOT_IDLE 0 /* Idle state */ +#define BOT_DATA_OUT 1 /* Data Out state */ +#define BOT_DATA_IN 2 /* Data In state */ +#define BOT_DATA_IN_LAST 3 /* Last Data In Last */ +#define BOT_CSW_Send 4 /* Command Status Wrapper */ +#define BOT_ERROR 5 /* error state */ + +#define BOT_CBW_SIGNATURE 0x43425355 +#define BOT_CSW_SIGNATURE 0x53425355 +#define BOT_CBW_PACKET_LENGTH 31 + +#define CSW_DATA_LENGTH 0x000D + +/* CSW Status Definitions */ +#define CSW_CMD_PASSED 0x00 +#define CSW_CMD_FAILED 0x01 +#define CSW_PHASE_ERROR 0x02 + +#define SEND_CSW_DISABLE 0 +#define SEND_CSW_ENABLE 1 + +#define DIR_IN 0 +#define DIR_OUT 1 +#define BOTH_DIR 2 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void Mass_Storage_In (void); +void Mass_Storage_Out (void); +void CBW_Decode(void); +void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len); +void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission); +void Bot_Abort(uint8_t Direction); + +#endif /* __MS__USB_BOT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/inc/MS__usb_desc.h b/Firmware/WIMU3/inc/MS__usb_desc.h new file mode 100644 index 0000000..d9ac190 --- /dev/null +++ b/Firmware/WIMU3/inc/MS__usb_desc.h @@ -0,0 +1,63 @@ +/** + ****************************************************************************** + * @file usb_desc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Descriptor Header for Mass Storage Device + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__USB_DESC_H +#define __MS__USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ +#define MASS_SIZ_DEVICE_DESC 18 +#define MASS_SIZ_CONFIG_DESC 32 + +#define MASS_SIZ_STRING_LANGID 4 +#define MASS_SIZ_STRING_VENDOR 38 +#define MASS_SIZ_STRING_PRODUCT 38 +#define MASS_SIZ_STRING_SERIAL 26 +#define MASS_SIZ_STRING_INTERFACE 16 + +/* Exported functions ------------------------------------------------------- */ +extern const uint8_t MASS_DeviceDescriptor[MASS_SIZ_DEVICE_DESC]; +extern const uint8_t MASS_ConfigDescriptor[MASS_SIZ_CONFIG_DESC]; + +extern const uint8_t MASS_StringLangID[MASS_SIZ_STRING_LANGID]; +extern const uint8_t MASS_StringVendor[MASS_SIZ_STRING_VENDOR]; +extern const uint8_t MASS_StringProduct[MASS_SIZ_STRING_PRODUCT]; +extern uint8_t MASS_StringSerial[MASS_SIZ_STRING_SERIAL]; +extern const uint8_t MASS_StringInterface[MASS_SIZ_STRING_INTERFACE]; + +#endif /* __MS__USB_DESC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + diff --git a/Firmware/WIMU3/inc/MS__usb_prop.h b/Firmware/WIMU3/inc/MS__usb_prop.h new file mode 100644 index 0000000..28b6831 --- /dev/null +++ b/Firmware/WIMU3/inc/MS__usb_prop.h @@ -0,0 +1,71 @@ +/** + ****************************************************************************** + * @file usb_prop.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to Mass Storage Demo (Endpoint 0) + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__usb_prop_H +#define __MS__usb_prop_H +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +#define Mass_Storage_GetConfiguration NOP_Process +/* #define Mass_Storage_SetConfiguration NOP_Process*/ +#define Mass_Storage_GetInterface NOP_Process +#define Mass_Storage_SetInterface NOP_Process +#define Mass_Storage_GetStatus NOP_Process +/* #define Mass_Storage_ClearFeature NOP_Process*/ +#define Mass_Storage_SetEndPointFeature NOP_Process +#define Mass_Storage_SetDeviceFeature NOP_Process +/*#define Mass_Storage_SetDeviceAddress NOP_Process*/ + +/* MASS Storage Requests*/ +#define GET_MAX_LUN 0xFE +#define MASS_STORAGE_RESET 0xFF +#define LUN_DATA_LENGTH 1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void MASS_init(void); +void MASS_Reset(void); +void Mass_Storage_SetConfiguration(void); +void Mass_Storage_ClearFeature(void); +void Mass_Storage_SetDeviceAddress (void); +void MASS_Status_In (void); +void MASS_Status_Out (void); +RESULT MASS_Data_Setup(uint8_t); +RESULT MASS_NoData_Setup(uint8_t); +RESULT MASS_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); +uint8_t *MASS_GetDeviceDescriptor(uint16_t ); +uint8_t *MASS_GetConfigDescriptor(uint16_t); +uint8_t *MASS_GetStringDescriptor(uint16_t); +uint8_t *Get_Max_Lun(uint16_t Length); +void MS_Init(void); +#endif /* __MS__usb_prop_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/inc/MS__usb_scsi.h b/Firmware/WIMU3/inc/MS__usb_scsi.h new file mode 100644 index 0000000..a0b550c --- /dev/null +++ b/Firmware/WIMU3/inc/MS__usb_scsi.h @@ -0,0 +1,155 @@ +/** + ****************************************************************************** + * @file usb_scsi.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to the SCSI commands + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__USB_SCSI_H +#define __MS__USB_SCSI_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx.h" + +#include "usb_type.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* SCSI Commands */ +#define SCSI_FORMAT_UNIT 0x04 +#define SCSI_INQUIRY 0x12 +#define SCSI_MODE_SELECT6 0x15 +#define SCSI_MODE_SELECT10 0x55 +#define SCSI_MODE_SENSE6 0x1A +#define SCSI_MODE_SENSE10 0x5A +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E +#define SCSI_READ6 0x08 +#define SCSI_READ10 0x28 +#define SCSI_READ12 0xA8 +#define SCSI_READ16 0x88 + +#define SCSI_READ_CAPACITY10 0x25 +#define SCSI_READ_CAPACITY16 0x9E + +#define SCSI_REQUEST_SENSE 0x03 +#define SCSI_START_STOP_UNIT 0x1B +#define SCSI_TEST_UNIT_READY 0x00 +#define SCSI_WRITE6 0x0A +#define SCSI_WRITE10 0x2A +#define SCSI_WRITE12 0xAA +#define SCSI_WRITE16 0x8A + +#define SCSI_VERIFY10 0x2F +#define SCSI_VERIFY12 0xAF +#define SCSI_VERIFY16 0x8F + +#define SCSI_SEND_DIAGNOSTIC 0x1D +#define SCSI_READ_FORMAT_CAPACITIES 0x23 + +#define NO_SENSE 0 +#define RECOVERED_ERROR 1 +#define NOT_READY 2 +#define MEDIUM_ERROR 3 +#define HARDWARE_ERROR 4 +#define ILLEGAL_REQUEST 5 +#define UNIT_ATTENTION 6 +#define DATA_PROTECT 7 +#define BLANK_CHECK 8 +#define VENDOR_SPECIFIC 9 +#define COPY_ABORTED 10 +#define ABORTED_COMMAND 11 +#define VOLUME_OVERFLOW 13 +#define MISCOMPARE 14 + + +#define INVALID_COMMAND 0x20 +#define INVALID_FIELED_IN_COMMAND 0x24 +#define PARAMETER_LIST_LENGTH_ERROR 0x1A +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26 +#define ADDRESS_OUT_OF_RANGE 0x21 +#define MEDIUM_NOT_PRESENT 0x3A +#define MEDIUM_HAVE_CHANGED 0x28 + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C +#define READ_CAPACITY10_DATA_LEN 0x08 +#define MODE_SENSE10_DATA_LEN 0x08 +#define MODE_SENSE6_DATA_LEN 0x04 +#define REQUEST_SENSE_DATA_LEN 0x12 +#define STANDARD_INQUIRY_DATA_LEN 0x24 +#define BLKVFY 0x04 + +extern uint8_t Page00_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data2[]; +extern uint8_t Mode_Sense6_data[]; +extern uint8_t Mode_Sense10_data[]; +extern uint8_t Scsi_Sense_Data[]; +extern uint8_t ReadCapacity10_Data[]; +extern uint8_t ReadFormatCapacity_Data []; + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void SCSI_Inquiry_Cmd(uint8_t lun); +void SCSI_ReadFormatCapacity_Cmd(uint8_t lun); +void SCSI_ReadCapacity10_Cmd(uint8_t lun); +void SCSI_RequestSense_Cmd (uint8_t lun); +void SCSI_Start_Stop_Unit_Cmd(uint8_t lun); +void SCSI_ModeSense6_Cmd (uint8_t lun); +void SCSI_ModeSense10_Cmd (uint8_t lun); +void SCSI_Write10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr); +void SCSI_Read10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr); +void SCSI_Verify10_Cmd(uint8_t lun); + +void SCSI_Invalid_Cmd(uint8_t lun); +void SCSI_Valid_Cmd(uint8_t lun); +BOOL SCSI_Address_Management(uint8_t lun , uint8_t Cmd , uint32_t LBA , uint32_t BlockNbr); + +void Set_Scsi_Sense_Data(uint8_t lun , uint8_t Sens_Key, uint8_t Asc); +void SCSI_TestUnitReady_Cmd (uint8_t lun); +void SCSI_Format_Cmd (uint8_t lun); + +//#define SCSI_TestUnitReady_Cmd SCSI_Valid_Cmd +#define SCSI_Prevent_Removal_Cmd SCSI_Valid_Cmd + +/* Invalid (Unsupported) commands */ +#define SCSI_READ_CAPACITY16_Cmd SCSI_Invalid_Cmd +//#define SCSI_FormatUnit_Cmd SCSI_Invalid_Cmd +#define SCSI_Write6_Cmd SCSI_Invalid_Cmd +#define SCSI_Write16_Cmd SCSI_Invalid_Cmd +#define SCSI_Write12_Cmd SCSI_Invalid_Cmd +#define SCSI_Read6_Cmd SCSI_Invalid_Cmd +#define SCSI_Read12_Cmd SCSI_Invalid_Cmd +#define SCSI_Read16_Cmd SCSI_Invalid_Cmd +#define SCSI_Send_Diagnostic_Cmd SCSI_Invalid_Cmd +#define SCSI_Mode_Select6_Cmd SCSI_Invalid_Cmd +#define SCSI_Mode_Select10_Cmd SCSI_Invalid_Cmd +#define SCSI_Verify12_Cmd SCSI_Invalid_Cmd +#define SCSI_Verify16_Cmd SCSI_Invalid_Cmd + +#endif /* __MS__USB_SCSI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/inc/Merged__hw_config.h b/Firmware/WIMU3/inc/Merged__hw_config.h new file mode 100644 index 0000000..507c20d --- /dev/null +++ b/Firmware/WIMU3/inc/Merged__hw_config.h @@ -0,0 +1,87 @@ +/** + ****************************************************************************** + * @file hw_config.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Hardware Configuration & Setup + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __Merged__HW_CONFIG_H +#define __Merged__HW_CONFIG_H + +/* Includes ------------------------------------------------------------------*/ + +#include "platform_config.h" + +// VC specific include +#include "usb_type.h" +// End of VC specific include + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ +#define BULK_MAX_PACKET_SIZE 0x00000040 + +// VC specific definitions +#define MASS_MEMORY_START 0x04002000 +#define LED_ON 0xF0 +#define LED_OFF 0xFF + +#define USB_RX_DATA_SIZE 2048 +#define USART_RX_DATA_SIZE 2048 + +// End of VC specific definition + +/* Exported functions ------------------------------------------------------- */ +void Set_System(void); +void Set_USBClock(void); +void Enter_LowPowerMode(void); +void Leave_LowPowerMode(void); +void USB_Interrupts_Config(void); +void USB_Cable_Config (FunctionalState NewState); +void Get_SerialNum(void); + + +int __putchar (int ch); + +// MS specific section +//void Led_Config(void); +//void Led_RW_ON(void); +//void Led_RW_OFF(void); +//void USB_Configured_LED(void); +//void USB_NotConfigured_LED(void); +void MAL_Config(void); +// End of MS specific section + +// VC specific section +void USB_To_USB_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes); +void Handle_USBAsynchXfer (void); +// End of VC specific section + +/* External variables --------------------------------------------------------*/ + +#endif /*__Merged__HW_CONFIG_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/Merged__stm32_it.h b/Firmware/WIMU3/inc/Merged__stm32_it.h new file mode 100644 index 0000000..dea50bc --- /dev/null +++ b/Firmware/WIMU3/inc/Merged__stm32_it.h @@ -0,0 +1,69 @@ +/** + ****************************************************************************** + * @file stm32_it.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __Merge__STM32_IT_H +#define __Merge__STM32_IT_H + +/* Includes ------------------------------------------------------------------*/ +#include "platform_config.h" +#include "USART_driver.h" +#include "MPUCompass_driver.h" + + +/* Exported types ------------------------------------------------------------*/ +extern int compteurQuaternion; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +void USB_LP_IRQHandler(void); + +void USART3_IRQHandler(void); +void TIM4_IRQHandler(void); +void TIM10_IRQHandler(void); +void EXTI3_IRQHandler(void); +void EXTI9_5_IRQHandler(void); +void I2C1_EV_IRQHandler(void); + + +#endif /* __Merge__STM32_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/inc/Merged__usb_conf.h b/Firmware/WIMU3/inc/Merged__usb_conf.h new file mode 100644 index 0000000..098ce5f --- /dev/null +++ b/Firmware/WIMU3/inc/Merged__usb_conf.h @@ -0,0 +1,128 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Mass Storage Demo configuration header + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __Merged__USB_CONF_H +#define __Merged__USB_CONF_H + +/*-------------------------------------------------------------*/ +/* EP_NUM */ +/* defines how many endpoints are used by the device */ +/*-------------------------------------------------------------*/ +// MS specific section *** +#define MS__EP_NUM (3) +// End of MS specific section *** + +// VC specific section *** +#define VC__EP_NUM (4) +// En of CV specific section *** + +/*-------------------------------------------------------------*/ +/* -------------- Buffer Description Table -----------------*/ +/*-------------------------------------------------------------*/ + +// MS specific section *** +/* buffer table base address */ + +#define MS__BTABLE_ADDRESS (0x00) + +/* EP0 */ +/* rx/tx buffer base address */ +#define MS__ENDP0_RXADDR (0x18) +#define MS__ENDP0_TXADDR (0x58) + +/* EP1 */ +/* tx buffer base address */ +#define MS__ENDP1_TXADDR (0x98) + +/* EP2 */ +/* Rx buffer base address */ +#define MS__ENDP2_RXADDR (0xD8) +// End of MS specific section *** + + +// VC specific section *** +#define VC__BTABLE_ADDRESS (0x00) + +/* EP0 */ +/* rx/tx buffer base address */ +#define VC__ENDP0_RXADDR (0x40) +#define VC__ENDP0_TXADDR (0x80) + +/* EP1 */ +/* tx buffer base address */ +#define VC__ENDP1_TXADDR (0xC0) +#define VC__ENDP2_TXADDR (0x100) +#define VC__ENDP3_RXADDR (0x110) +// End of VC specific section *** + + +/* ISTR events */ +/* _IMR_MSK */ +/* mask defining which events has to be handled */ +/* by the device application software */ + + +#define MS__IMR_MSK (CNTR_CTRM | CNTR_RESETM) +#define VC__IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM ) +// Define the event section to be compiled : for VC and MS merged operation, ored the Masks +#define _IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM | CNTR_SUSPM ) + +// VC specific section *** +/*#define CTR_CALLBACK*/ +/*#define DOVR_CALLBACK*/ +/*#define ERR_CALLBACK*/ +/*#define WKUP_CALLBACK*/ +/*#define SUSP_CALLBACK*/ +/*#define RESET_CALLBACK*/ +#define SOF_CALLBACK +/*#define ESOF_CALLBACK*/ +// End of VC specific section *** + +/* CTR service routines */ +/* associated to defined endpoints */ +//#define EP1_IN_Callback NOP_Process +#define EP2_IN_Callback NOP_Process +#define EP3_IN_Callback NOP_Process +#define EP4_IN_Callback NOP_Process +#define EP5_IN_Callback NOP_Process +#define EP6_IN_Callback NOP_Process +#define EP7_IN_Callback NOP_Process + + +#define EP1_OUT_Callback NOP_Process +//#define EP2_OUT_Callback NOP_Process +//#define EP3_OUT_Callback NOP_Process +#define EP4_OUT_Callback NOP_Process +#define EP5_OUT_Callback NOP_Process +#define EP6_OUT_Callback NOP_Process +#define EP7_OUT_Callback NOP_Process + + +#endif /* __Merged__USB_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/RTC.h b/Firmware/WIMU3/inc/RTC.h new file mode 100644 index 0000000..fa6bd7d --- /dev/null +++ b/Firmware/WIMU3/inc/RTC.h @@ -0,0 +1,22 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef RTC_H_ +#define RTC_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_rtc.h" +#include "stm32l1xx_rcc.h" + + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +int RTC_Config(void); +void RTC_SetInitial(void); + + +#endif /*RTC_H_*/ diff --git a/Firmware/WIMU3/inc/SPI_driver.h b/Firmware/WIMU3/inc/SPI_driver.h new file mode 100644 index 0000000..02228f3 --- /dev/null +++ b/Firmware/WIMU3/inc/SPI_driver.h @@ -0,0 +1,52 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef SPI_DRIVER_H_ +#define SPI_DRIVER_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_spi.h" +#include "stm32l1xx_rcc.h" +#include +#include "FIFO.h" + + + +/* Exported types ------------------------------------------------------------*/ +typedef struct +{ + SPI_TypeDef* SPIx; + uint32_t SPIx_PeriphClk; + + uint32_t SPIx_MOSIGPIOClk; + GPIO_TypeDef* SPIx_MOSIPort; + uint16_t SPIx_MOSIPin; + uint8_t SPIx_MOSIPinSource; + uint8_t SPIx_MOSIAlternFunc; + + uint32_t SPIx_MISOGPIOClk; + GPIO_TypeDef* SPIx_MISOPort; + uint16_t SPIx_MISOPin; + uint8_t SPIx_MISOPinSource; + uint8_t SPIx_MISOAlternFunc; + + uint32_t SPIx_SCKGPIOClk; + GPIO_TypeDef* SPIx_SCKPort; + uint16_t SPIx_SCKPin; + uint8_t SPIx_SCKPinSource; + uint8_t SPIx_SCKAlternFunc; + +} SPIConfig_TypeDef; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + +#define NBR_OF_SPI_USED 1 + +/* Exported functions ------------------------------------------------------- */ + +void SPI_Config(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); + + +#endif /*SPI_DRIVER_H_*/ diff --git a/Firmware/WIMU3/inc/Storage.h b/Firmware/WIMU3/inc/Storage.h new file mode 100644 index 0000000..a18e99d --- /dev/null +++ b/Firmware/WIMU3/inc/Storage.h @@ -0,0 +1,43 @@ +/** + ****************************************************************************** + * @file Storage.h + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STORAGE_H +#define __STORAGE_H + +/* Includes ------------------------------------------------------------------*/ +#include "ff.h" +#include "stm32l152_eval.h" +//#include "stm32l152_eval_lcd.h" +//#include "stm32l152_eval_glass_lcd.h" +#include "stm32l152_eval_spi_sd.h" +//#include "stm32l152_eval_i2c_tsensor.h" +#include "ff.h" +#include +#include +#include +#include +//#include "usb_lib.h" +//#include "usb_pwr.h" +#include + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#define MAX_FILES 25 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint32_t Storage_Init(void); +uint32_t Storage_CreateFile(FIL * F, const char* FileName, char * FileNameWithNumAndExtension); + + + +#endif /* __MS__MASS_MAL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/USART_driver.h b/Firmware/WIMU3/inc/USART_driver.h new file mode 100644 index 0000000..a1ae62d --- /dev/null +++ b/Firmware/WIMU3/inc/USART_driver.h @@ -0,0 +1,49 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef USART_DRIVER_H_ +#define USART_DRIVER_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_usart.h" +#include "stm32l1xx_rcc.h" +#include +#include "FIFO.h" + + + +/* Exported types ------------------------------------------------------------*/ +typedef struct +{ + USART_TypeDef* USARTx; + uint32_t USARTx_PeriphClk; + + uint32_t USARTx_TXGPIOClk; + GPIO_TypeDef* USARTx_TXPort; + uint16_t USARTx_TXPin; + uint8_t USARTx_TXPinSource; + uint8_t USARTx_TXAlternFunc; + + uint32_t USARTx_RXGPIOClk; + GPIO_TypeDef* USARTx_RXPort; + uint16_t USARTx_RXPin; + uint8_t USARTx_RXPinSource; + uint8_t USARTx_RXAlternFunc; + +} USARTConfig_TypeDef; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ + +#define NBR_OF_USART_USED 4 + +/* Exported functions ------------------------------------------------------- */ + +void USART_Config(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); +void USART_ConfigRxIRQ(USART_TypeDef* USARTx, FunctionalState NewState); +void USARTx_SendDataIfPossible(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO); +void USARTx_SendAllData(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO); +uint8_t USARTx_GetDataIfAvailable(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO); + +#endif /*USART_DRIVER_H_*/ diff --git a/Firmware/WIMU3/inc/VC__usb_desc.h b/Firmware/WIMU3/inc/VC__usb_desc.h new file mode 100644 index 0000000..6cf1908 --- /dev/null +++ b/Firmware/WIMU3/inc/VC__usb_desc.h @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @file usb_desc.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Descriptor Header for Virtual COM Port Device + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __VC__USB_DESC_H +#define __VC__USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define VIRTUAL_COM_PORT_DATA_SIZE 64 +#define VIRTUAL_COM_PORT_INT_SIZE 8 + +#define VIRTUAL_COM_PORT_SIZ_DEVICE_DESC 18 +#define VIRTUAL_COM_PORT_SIZ_CONFIG_DESC 67 +#define VIRTUAL_COM_PORT_SIZ_STRING_LANGID 4 +#define VIRTUAL_COM_PORT_SIZ_STRING_VENDOR 10//38 +#define VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT 16//50 +#define VIRTUAL_COM_PORT_SIZ_STRING_SERIAL 28//26 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +/* Exported functions ------------------------------------------------------- */ +extern const uint8_t Virtual_Com_Port_DeviceDescriptor[VIRTUAL_COM_PORT_SIZ_DEVICE_DESC]; +extern const uint8_t Virtual_Com_Port_ConfigDescriptor[VIRTUAL_COM_PORT_SIZ_CONFIG_DESC]; + +extern const uint8_t Virtual_Com_Port_StringLangID[VIRTUAL_COM_PORT_SIZ_STRING_LANGID]; +extern const uint8_t Virtual_Com_Port_StringVendor[VIRTUAL_COM_PORT_SIZ_STRING_VENDOR]; +extern const uint8_t Virtual_Com_Port_StringProduct[VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT]; +extern uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL]; + +#endif /* __VC__USB_DESC_H */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/VC__usb_prop.h b/Firmware/WIMU3/inc/VC__usb_prop.h new file mode 100644 index 0000000..a5ae413 --- /dev/null +++ b/Firmware/WIMU3/inc/VC__usb_prop.h @@ -0,0 +1,88 @@ +/** + ****************************************************************************** + * @file usb_prop.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to Virtual COM Port Demo (Endpoint 0) + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __VC__usb_prop_H +#define __VC__usb_prop_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +typedef struct +{ + uint32_t bitrate; + uint8_t format; + uint8_t paritytype; + uint8_t datatype; +}LINE_CODING; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported define -----------------------------------------------------------*/ + +#define Virtual_Com_Port_GetConfiguration NOP_Process +//#define Virtual_Com_Port_SetConfiguration NOP_Process +#define Virtual_Com_Port_GetInterface NOP_Process +#define Virtual_Com_Port_SetInterface NOP_Process +#define Virtual_Com_Port_GetStatus NOP_Process +#define Virtual_Com_Port_ClearFeature NOP_Process +#define Virtual_Com_Port_SetEndPointFeature NOP_Process +#define Virtual_Com_Port_SetDeviceFeature NOP_Process +//#define Virtual_Com_Port_SetDeviceAddress NOP_Process + +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 + +/* Exported functions ------------------------------------------------------- */ +void Virtual_Com_Port_init(void); +void Virtual_Com_Port_Reset(void); +void Virtual_Com_Port_SetConfiguration(void); +void Virtual_Com_Port_SetDeviceAddress (void); +void Virtual_Com_Port_Status_In (void); +void Virtual_Com_Port_Status_Out (void); +RESULT Virtual_Com_Port_Data_Setup(uint8_t); +RESULT Virtual_Com_Port_NoData_Setup(uint8_t); +RESULT Virtual_Com_Port_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); +uint8_t *Virtual_Com_Port_GetDeviceDescriptor(uint16_t ); +uint8_t *Virtual_Com_Port_GetConfigDescriptor(uint16_t); +uint8_t *Virtual_Com_Port_GetStringDescriptor(uint16_t); + +uint8_t *Virtual_Com_Port_GetLineCoding(uint16_t Length); +uint8_t *Virtual_Com_Port_SetLineCoding(uint16_t Length); +void VC_Init(void); + +#endif /* __VC__usb_prop_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/inc/battery.h b/Firmware/WIMU3/inc/battery.h new file mode 100644 index 0000000..19022d9 --- /dev/null +++ b/Firmware/WIMU3/inc/battery.h @@ -0,0 +1,43 @@ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef BATTERY_H_ +#define BATTERY_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_adc.h" +#include "stm32l1xx_rcc.h" + +/* Exported types ------------------------------------------------------------*/ +/*typedef enum +{ + BATTERY_MONITORING, + BATTERY_NOT_MONITORING +} BatteryMonitoringState_TypeDef;*/ + +/* Exported constants --------------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ + +// Setting low battery treshold : +// ADC in = Battery_Volt/2 (resistive on board voltage divider) +// Treshold_Volt/2 = 3,3/4096 LOWBAT_ADC_TRESHOLD +// <--> LOWBAT_ADC_TRESHOLD = Treshold_Volt/2 * 4096/3,3 +// When Treshold_Volt = 3,5V, LOWBAT_ADC_TRESHOLD = 2172 (0x087C) + +// Experimental measurement +// 2285 = 3.7 V +// 2220 = 3.6 V +// 2150 = 3.5 V +#define LOWBAT_ADC_THRESHOLD 2100 +//#define LOWBAT_ADC_THRESHOLD 543 + +/* Exported functions ------------------------------------------------------- */ +void BatteryMonitoring_Config(void); +void BatteryMonitoring_Stop(); +uint16_t BatteryMonitoring_GetBatteryADCValue(); +uint16_t BatteryMonitoring_GetTempADCValue(); +//uint8_t BatteryMonitoring_RdADC(uint16_t * ADCValue); +//uint8_t TempMonitoring_RdADC(uint16_t * ADCValue); + +#endif /*BATTERY_H_*/ diff --git a/Firmware/WIMU3/inc/ble.h b/Firmware/WIMU3/inc/ble.h new file mode 100644 index 0000000..07b7645 --- /dev/null +++ b/Firmware/WIMU3/inc/ble.h @@ -0,0 +1,167 @@ +#ifndef BLE_H_ +#define BLE_H_ + +#include "imu.h" +#include "gps.h" +#include "power.h" +#include "utils.h" + +#define BLE_RX_BUFFER 64 // Maximum number of char that can be received +#define BLE_TX_BUFFER 128 // Maximum number of char that can be sent in one packet + +#define BLE_TX_BUF_NUM 5 // Number of TX buffers (number of messages in the queue) +#define BLE_RX_BUF_NUM 2 // Number of RX buffers (number of commands waiting) + +#define BLE_IMU_DATA 1 +#define BLE_GPS_DATA 2 +#define BLE_POWER_DATA 3 +#define BLE_DEVINFO_DATA 4 +#define BLE_CONTROL_DATA 5 +#define BLE_DATETIME_DATA 6 +#define BLE_CONFIG_DATA 7 + +#define BLE_CTRL_FLAG_REC 0x01 // Control flag used to start/stop recording + +#define BLE_SYNC_BYTE 0x00 // Sync byte for data flow to BLE chip - used in the Consistent Overhead Byte Stuffing algorithm (COBS) to prevent data with sync value to appear + +typedef struct { + uint8_t data_type; + //uint16_t length; + uint8_t length; + uint8_t* data; + //uint32_t crc; +} BLEFrame_Struct; + +/*typedef struct { + uint16_t frame_num; + int16_t acc[3]; + int16_t gyro[3]; + int16_t mag[3]; +} BLE_IMU;*/ + +typedef struct +{ + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hours; + uint8_t minutes; + uint8_t seconds; +} DateTime_Struct; + +typedef struct +{ + DateTime_Struct date_time; + uint8_t day_of_week; // 0=Undefined, 1 = Monday, ... +} DayDateTime_Struct; + +typedef struct +{ + DayDateTime_Struct day_date_time; + uint8_t fractions256; +} ExactTime256_Struct; + +typedef struct +{ + ExactTime256_Struct exact_time; + uint8_t adjust_reason; // See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.current_time.xml +} CurrentTime_Struct; + +typedef struct +{ + uint16_t flags; + uint16_t instantSpeed; + int32_t latitude; + int32_t longitude; + int8_t elevation[3]; + uint16_t heading; +} LocationAndSpeed_Struct; + +typedef struct +{ + uint16_t flags; + uint8_t beaconsInSolution; + uint8_t beaconsInView; + uint16_t timeFirstFix; + uint32_t ehpe; // Estimated Horizontal Position Error + uint32_t evpe; // Estimated Vertical Position Error + uint8_t hdop; // Horizontal Dilution of Precision + uint8_t vdop; // Vertical Dilution of Precision + +} PositionQuality_Struct; + + +// OR MASKING ATTRIBUTES +#define GPS_POSITION_QUALITY_INVALID_MASK 0 +#define GPS_POSITION_QUALITY_OK_MASK 0x0080 +#define GPS_POSITION_QUALITY_ESTIMATED_MASK 0x0100 +#define GPS_POSITION_QUALITY_LASTKNOWN_MASK 0x0180 +#define GPS_POSITION_QUALITY_CLEAR_MASK 0x0180 // To be "AND"ed + +typedef struct +{ + DateTime_Struct date_time; + LocationAndSpeed_Struct loc_speed; + PositionQuality_Struct quality; +} GPSFrame_struct; + + +typedef struct +{ + uint16_t serialNumber; + uint8_t hardRevision; + uint8_t firmSoftRevision[LEN_VERSION_STRING-2]; //should always be 29 in length (without \r\n) +} DEVINFOFrame_Struct; + +typedef struct { + uint16_t enabled_modules; + uint8_t sampling_rate; + uint8_t acc_range; + uint8_t gyro_range; + uint8_t mag_range; +} IMUConfig_Struct; + +typedef struct { + uint8_t status; + uint16_t rec_id; +} RemControl_Struct; + +extern volatile unsigned char ble_rx_queue; +extern bool ble_rx_ready; // Set to TRUE when RX data is ready to be processed + +extern bool ble_update_time; // Set to true to send the time update to the BLE chip +extern RemControl_Struct ble_control; + +// Data frame structures +extern POWERFrame_Struct POWERFrame; +extern DEVINFOFrame_Struct DEVINFOFrame; + +///////////////////////////////////////////////////////////////// +unsigned char init_ble(void); +unsigned char start_ble(void); +void stop_ble(); + +void BLE_SetupPower(void); +void BLE_EnablePower(void); +void BLE_DisablePower(void); + +unsigned char BLE_process_rx(void); + +void BLE_sendIMUData(IMUFrame_Struct* imu_data/*int16_t *acc, int16_t *gyro, int16_t *mag*/); +void BLE_sendPOWERData(POWERFrame_Struct* power_data); +void BLE_sendGPSData(unsigned char* gps_data, unsigned short length, uint8_t frame_type); +void BLE_sendDevInfoData(DEVINFOFrame_Struct* devInfo_data); +void BLE_sendConfig(WIMU_CONFIG* config_data); +void BLE_sendCurrentDateTime(); +void BLE_sendRemoteControlData(RemControl_Struct* remCon); + +void BLE_sendFrame(BLEFrame_Struct* frame); + +void BLE_ConfigRxIRQ(FunctionalState NewState); +void BLE_ConfigTxIRQ(FunctionalState NewState); + +// Consistent Overhead Byte Stuffing algorithm (COBS) implementation (https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing) +void COBS_StuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); +void COBS_UnStuffData(const unsigned char *ptr, unsigned long length, unsigned char *dst); + +#endif /*BLE_H_*/ diff --git a/Firmware/WIMU3/inc/buttons.h b/Firmware/WIMU3/inc/buttons.h new file mode 100644 index 0000000..98c94dd --- /dev/null +++ b/Firmware/WIMU3/inc/buttons.h @@ -0,0 +1,64 @@ +#ifndef BUTTONS_H_ +#define BUTTONS_H_ + +#include "config.h" +#include "stm32l1xx_gpio.h" +#include "stm32l1xx_rcc.h" +#include "stm32l1xx_tim.h" + +#define PUSHBUTTON_INACTIVE_STATE 1 +#define PUSH_BUTTON_DEBOUNCE_TICK 100 +#define PUSH_BUTTON_DEBOUNCE_TICK_LOWPOW 10 + +typedef enum +{ + INACTIVE, + DEBOUNCING, + ACTIVE +} PushButtonState_TypeDef; + +typedef enum +{ + BTN_NO_ACTION, + BTN_ON_OFF, + BTN_MARK, + BTN_USB_MODE, + BTN_CALIB +} PushButtonAction_TypeDef; + +typedef struct +{ + GPIO_TypeDef* GPIOx; + uint32_t GPIOx_PeriphClk; + uint16_t GPIOx_Pin; + PushButtonState_TypeDef State; + uint16_t ActivationNbrOfTicks; + uint8_t NbrOfPress; + PushButtonAction_TypeDef RequestedAction; + uint64_t FirstActivationTimeStamp; + uint64_t LastActivationTimeStamp; +} PushButton_TypeDef; + +extern PushButton_TypeDef ModeButton; +extern PushButton_TypeDef PowerButton; + + +void PushButton_Config(void); + +uint8_t PushButton_GetState(PushButton_TypeDef * Button); +void PushButton_UpdateState(PushButton_TypeDef * Button); + +void PushButton_ModeButtonUpdateAction(); +void PushButton_PowerButtonUpdateAction(); + +void PushButton_SetState(PushButton_TypeDef * Button, PushButtonState_TypeDef state); +void PushButton_SetAction(PushButton_TypeDef * Button, PushButtonAction_TypeDef action); + +bool PushButton_GetPinState(PushButton_TypeDef *Button); +//void PushButton_SetPollingAndResetTicks(PushButton_TypeDef * Button); +void PushButton_Reset(PushButton_TypeDef * Button); +void PushButton_ResetAll(PushButton_TypeDef * Button); + +uint16_t PushButton_GetActivationNbrTicks(PushButton_TypeDef * Button); +void PushButton_SetInterrupt(PushButton_TypeDef* Button, bool enabled); +#endif \ No newline at end of file diff --git a/Firmware/WIMU3/inc/config.h b/Firmware/WIMU3/inc/config.h new file mode 100644 index 0000000..09623f1 --- /dev/null +++ b/Firmware/WIMU3/inc/config.h @@ -0,0 +1,238 @@ +#ifndef CONFIG_H_ +#define CONFIG_H_ + +#include +#include + +//-------------------------------- +// Compilation options definitions +//-------------------------------- +//#define TEST //Define to output clocks +//#define DEV_BOARD //Define to use the Development Board from TI +//#define DEBUG_CONSOLE //Define to use the debug console + + +//------------------------- +// Global definitions +//------------------------- +/*#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif +#ifndef BOOL + #define BOOL unsigned char +#endif*/ + +//#define HARDWARE_VERSION 2 //Not used anymore - set in settings + +#define VERSION_MAJOR 3 +#define VERSION_MINOR 3 +#define VERSION_REV 2 + +#define VERSION_MAJOR_CHAR '3' +#define VERSION_MINOR_CHAR '3' +#define VERSION_REV_CHAR '2' + +#define VERSION_STRING "** WIMuGPS - Version 3.3.2 **\n\r" //should always be 31 in length +#define LEN_VERSION_STRING 31 + +#define CONSOLE_USART USART1 +#define BLE_USART USART2 + +#define SYNC_BYTE 0xEA // Sync Byte for binary streaming +#define ESC_BYTE 0xED // Escape Byte for binary streaming + +#define POWER_MANAGE 1 //Set to use power management + +//#define DEBUG //Define to disable Watchdog timer + +typedef struct { + uint16_t id; // Serial Number + uint8_t hw_id; // Hardware revision ID + uint8_t version[3]; // Version Numbers + int16_t acc_gain[3]; // Accelerometers gain + int16_t acc_offset[3]; // Accelerometers offset + int16_t gyro_gain[3]; // Gyroscope gain + int16_t gyro_offset[3]; // Gyroscope offset + int16_t mag_gain[3]; // Magnetometers gain + int16_t mag_offset[3]; // Magnetometers offset + /*unsigned char unused1; // Unused value in this WIMU version + unsigned char unused2; // Unused value in this WIMU version + unsigned char unused3; // Unused value in this WIMU version + unsigned short unused4; // Unused value in this WIMU version + unsigned short unused5; // Unused value in this WIMU version*/ + //unsigned char rtc_cal; // RTC calibration register + //unsigned short crc; // Checksum of the structure + int crc; + } WIMU_SETTINGS; + +typedef struct { + int8_t time_offset; + bool enable_gps_time; + bool enable_auto_offset; // Unused... for now! +} WIMUConfig_DateTimeOptions; + +typedef struct { + uint8_t led_blink_time; + bool write_led; + bool enable_marking; + bool gps_fix_led; + bool ble_activity_led; +} WIMUConfig_UIOptions; + +typedef struct { + uint8_t sampling_rate; + bool enable_watchdog; +} WIMUConfig_GlobalOptions; + +typedef struct { + uint8_t max_files_in_folder; + bool split_by_day; +} WIMUConfig_LoggerOptions; + +typedef struct { + uint8_t interval; + bool force_cold; + bool enable_scan_when_charged; +} WIMUConfig_GPSOptions; + +typedef struct { + bool power_manage; + bool enable_motion_detection; + bool adv_power_manage; +} WIMUConfig_PowerOptions; + +typedef struct { + bool enable_control; +} WIMUConfig_BLEOptions; + +typedef struct { + uint8_t range; +} WIMUConfig_AccOptions; + +typedef struct { + uint8_t range; +} WIMUConfig_GyroOptions; + +typedef struct { + uint8_t range; +} WIMUConfig_MagOptions; + +typedef struct { + float beta; + bool disable_magneto; + bool auto_calib_gyro; +} WIMUConfig_IMUOptions; + + +typedef struct { + uint16_t enabled_modules; // Enabled modules + WIMUConfig_DateTimeOptions datetime; // Date & Time options + WIMUConfig_UIOptions ui; // User Interface options + WIMUConfig_GlobalOptions general; // Global options + WIMUConfig_LoggerOptions logger; // Datalogger options + WIMUConfig_GPSOptions gps; // GPS options + WIMUConfig_PowerOptions power; // Power options + WIMUConfig_BLEOptions ble; // BLE options + WIMUConfig_AccOptions acc; // Accelero options + WIMUConfig_GyroOptions gyro; // Gyro options + WIMUConfig_MagOptions magneto; // Magneto options + WIMUConfig_IMUOptions imu; // IMU options + int crc; +} WIMU_CONFIG; + +#define MAX_FS 200 + +/////////// +// CLOCK // +/////////// +#define CLK_F_APROX 18000000 // Approximation of the CPU MCLK, 18 MHz +#define CLK_F 17989632 // More accurate value of the CPU MCLK (N+1)*Freq, see "init()" + +//#define US_CYCLE 18 // Number of clock cycle to have a micro-second + +#define V_IN 3.3 // Input voltage + +#define STOP_WATCHDOG (WDTPW + WDTHOLD) +#define START_WATCHDOG (WDTPW + WDTSSEL_2 + WDTIS_5 + WDTCNTCL) // Set clock as VLOCLK (9.4 kHz typical) / 8192 = 1.15 Hz +#define RESET_WATCHDOG ((WDTCTL & 0x00FF) | WDTPW | WDTCNTCL) + +//------------------------ +// Internal Peripherals +//------------------------ + +// Internal device definitions +typedef enum{ + MODULE_CPU=0, + MODULE_BLE=1, + MODULE_GPS=2, + MODULE_GYRO=3, + MODULE_MAGNETO=4, + MODULE_ACC=5, + MODULE_DATALOGGER=6, + MODULE_USB=7, + MODULE_POWER=8, + MODULE_IMU=9, + MODULE_INTERNAL_NUM //Total number of internal modules +} InternalModules_ID; + +#define MODULE_ALL 0xFF + +typedef enum{ + STATE_DISABLED, // Set when a module is disabled + STATE_ONLINE, // Set when a module is online + STATE_OFFLINE, // Set when a module is enabled, but offline + STATE_SLEEPMODE, // Set when a module is in sleep mode + STATE_TEMPOFF, // Set when a module is temporarly off + STATE_RESET, // Set when a module needs to be resetted + STATE_SPECIAL // Set when a module is in a specific operating mode, depends on each module +} ModuleStates; + +//extern volatile ModuleStates i_mod_status[MODULE_INTERNAL_NUM]; + +//------------------------ +// External Peripherals +//------------------------ + +//extern unsigned int enabled_ext_devices; + +// External enabled devices definitions (masks) +/*#define EXT_MODULE_SONARS 0//0x0001 +#define EXT_MODULE_FSR 1//0x0002 +#define EXT_MODULE_JOYSTICK 2//0x0004 +#define EXT_MODULE_ENCODERS 3//0x0008 +#define EXT_MODULE_CURRENT 4//0x0010 +#define EXT_MODULE_CHARGER 5//0x0020 +#define EXT_MODULE_WIENCODER 6//0x0040 +#define EXT_MODULE_PULSEOX 7 + +#define EXT_MODULE_ALL 0xFF //EXT_MODULE_SONARS+EXT_MODULE_FSR+EXT_MODULE_JOYSTICK+EXT_MODULE_ENCODERS+EXT_MODULE_CURRENT+EXT_MODULE_CHARGER + +#define EXT_MODULE_NUM 8 + +extern volatile unsigned char e_mod_status[EXT_MODULE_NUM];*/ + +#define TIME_SYNC_COUNT 30 // Number of seconds (GPS Samples) to consider the time from external source is stable +#define TIME_DRIFT_COUNT 3600 // Delay (in GPS samples) after which to update the timestamp (RTC clock) with the value in order to minimize drifts + +//------------------------ +// Variable references +//------------------------ + +//extern BOOL time_sync; //Set to TRUE when the time on the Datalogger is valid + //Time is set when a fix is done on the GPS + +extern unsigned char time_sync; // Count the number of seconds needed to consider the GPS time to be stable +extern unsigned long timestamp; + + +//extern unsigned char PowerDown_NbrOfPress; + +extern bool initialized; + +extern WIMU_SETTINGS wimu_settings; +extern WIMU_CONFIG wimu_config; + +#endif /*CONFIG_H_*/ diff --git a/Firmware/WIMU3/inc/datalogger.h b/Firmware/WIMU3/inc/datalogger.h new file mode 100644 index 0000000..937e902 --- /dev/null +++ b/Firmware/WIMU3/inc/datalogger.h @@ -0,0 +1,126 @@ +#ifndef DATALOGGER_H_ +#define DATALOGGER_H_ + +#include "config.h" +#include "ff.h" + +//------------------------ +// Constants Define +//------------------------ +//#define DOS_SD_SPI // Define to set that we use a direct SD card interface with SPI + + +#define DOS_SETTINGS_FILE "SETTINGS" // Settings file on the uSD card +#define DOS_CONFIG_FILE "CONFIG.WCF" // Configuration file on the uSD card +#define DOS_FILEID_FILE "FILE_ID" // File number on the uSD card +#define DOS_FILE_EXT ".DAT" // File extension for records +#define DOS_REC_PREFIX "REC" // Prefix for manually started recordings folders + +#define DOS_CPU_FILE "LOG.DAT" // Log file +#define DOS_ADC_FILE "ADC" // ADC data file on the uSD card +#define DOS_GPS_FILE "GPS" // GPS data file on the uSD card +#define DOS_ACC_FILE "ACC" // Accelerometer data file on the card +#define DOS_GYRO_FILE "GYR" // Gyroscope data file on the card +#define DOS_MAG_FILE "MAG" // Magnetometer data file on the card +#define DOS_POWER_FILE "POW" // Power data file on the card +#define DOS_IMU_FILE "IMU" // IMU data file on the card + +#define DOS_SONARS_FILE "SON" // Sonars data file on the uSD card +#define DOS_ENCODERS_FILE "ENC" // Encoders data file on the uSD card +#define DOS_FSR_FILE "FSR" // FSR data file on the uSD card +#define DOS_JOY_FILE "JOY" // Joystick Data file on the uSD card + +// ACC, GYRO, POWER, JOY @ 45 Hz +//#define DOS_ADC_HANDLE 0 //General file handle +//#define DOS_ACC_HANDLE 2 // Always uses file 2 as handle for ACC +#define DOS_GPS_HANDLE 1 // Always uses file 1 as handle for GPS +//#define DOS_GYRO_HANDLE 3 + +/*#define DOS_CPU_HANDLE 0 +#define DOS_ACC_HANDLE 1 +#define DOS_GYRO_HANDLE 2 +#define DOS_MAG_HANDLE 3 +#define DOS_GPS_HANDLE 4 +#define DOS_POWER_HANDLE 5 +#define DOS_SONARS_HANDLE 6 +#define DOS_ENCODERS_HANDLE 7 +#define DOS_FSR_HANDLE 8 +#define DOS_JOY_HANDLE 9 +*/ +#define DOS_OPENFILE_NUM 1 //Maximum number of opened file at once + + +//#define DOS_SONARS_HANDLE 2 // Always uses file 2 as handle for Sonars + +//#define DOS_FILE_TIME 60 // Time (in minutes) after which a new + // file has to be created + +//#define DOS_RESET_INTERVAL 24 // Time (in hours) after which the SD card must + // be resetted in order to prevent low write speed + // bug and data loss. Also equals the max number of + // files in a folder. + +//#define DOS_NOTIMESTAMP // Define to use timer timestamp increasing instead + // of DOS-ON-CHIP RTC. + +//#define DOS_TIMEOUT_RESET // Define to reset on too many timeouts +//#define DOS_TIMEOUT 300 // Set the time threshold to consider that DosWrite operation + // is taking too much time (then trigger a reset), in milliseconds +//#define DOS_STRIKEOUT 360 // Number of time > TIMEOUT to consider resetting the module / hour +#define DOS_MAX_ERRORS 30 // Maximum number of write error allowed in a folder + + +//#define DOS_LED // Define to enable visual display of writing operations +//------------------------ +// Structure Define +//------------------------ +typedef struct { + unsigned int exp_num; +} settings; +//------------------------ +// Functions Define +//------------------------ + +unsigned char init_datalogger(void); +unsigned char start_datalogger(void); +unsigned char reset_datalogger(void); +void stop_datalogger(void); +void init_settings(settings * set); +unsigned char datalog_save_data(unsigned char* data, unsigned short length, bool internal, unsigned int module, unsigned long time); + +void datalog_check_nextfiles(); +void next_files(); +unsigned char datalog_change_folder(); +FRESULT datalog_switch_recording_mode(); + +//------------------------ +// Variables Define +//------------------------ +extern int dos_filenum; +extern unsigned char dos_runtime; //Datalogger running time (in hours) +extern unsigned short dos_errors; +extern settings DOS_settings; + +extern uint16_t dos_rec_count; + +//extern unsigned int dos_adc_bytes; +//extern unsigned int dos_gps_bytes; +extern unsigned long dos_split_ts; +#ifdef RAW_ADC + extern unsigned char dos_adc_filename[12]; +#else + extern unsigned char dos_acc_filename[12]; + extern unsigned char dos_gyro_filename[12]; + extern unsigned char dos_joy_filename[12]; +#endif +extern unsigned char dos_quaternion_filename[12]; +extern unsigned char dos_mag_filename[12]; +extern unsigned char dos_gps_filename[12]; +extern unsigned char dos_sonars_filename[12]; +extern unsigned char dos_encoders_filename[12]; +extern unsigned char dos_fsr_filename[12]; +extern unsigned char dos_power_filename[12]; + +extern bool dos_isRecording; + +#endif /*DATALOGGER_H_*/ diff --git a/Firmware/WIMU3/inc/flash.h b/Firmware/WIMU3/inc/flash.h new file mode 100644 index 0000000..34ee7f5 --- /dev/null +++ b/Firmware/WIMU3/inc/flash.h @@ -0,0 +1,39 @@ +#ifndef FLASH_H_ +#define FLASH_H_ + +#include "config.h" +#include "stm32l1xx_flash.h" +#include "stm32l1xx_rcc.h" +#include +#include + +#define DATA_EEPROM_BASE 0x08080000 + +#define DATA_EEPROM_SETTING_OFFSET 0x00000000 +#define DATA_EEPROM_SETTING_BASE (DATA_EEPROM_BASE + DATA_EEPROM_SETTING_OFFSET) + +#define DATA_EEPROM_CONFIG_OFFSET 0x00000040 +#define DATA_EEPROM_CONFIG_BASE (DATA_EEPROM_BASE + DATA_EEPROM_CONFIG_OFFSET) + +//------------------------ +// Structure Define +//------------------------ + +//------------------------ +// Functions Define +//------------------------ + +void flash_init(void); +uint8_t flash_write_settings(WIMU_SETTINGS* settings); +uint8_t flash_write_config(WIMU_CONFIG* config); +uint32_t crc_calc(uint8_t* data, uint16_t NbrOfByte); +void flash_default_settings(WIMU_SETTINGS* settings); +void flash_default_config(WIMU_CONFIG* config); +void flash_read_settings(WIMU_SETTINGS* settings); +void flash_read_config(WIMU_CONFIG* config); + +//------------------------ +// Variables Define +//------------------------ + +#endif /*FLASH_H_*/ diff --git a/Firmware/WIMU3/inc/gps.h b/Firmware/WIMU3/inc/gps.h new file mode 100644 index 0000000..c180a6c --- /dev/null +++ b/Firmware/WIMU3/inc/gps.h @@ -0,0 +1,171 @@ +#ifndef GPS_H_ +#define GPS_H_ +#include "config.h" +#include "utils.h" +#include "Merged__hw_config.h" + +//------------------------ +// Constants Define +//------------------------ + +#define GPS_RX_BUFFER 256 // Maximum number of char that can be received (commands) - NMEA standard +#define GPS_TX_BUFFER 128 // Maximum number of char that can be sent in one packet - NMEA standard + +#define GPS_TX_BUF_NUM 2 // Number of TX buffers (number of messages in the queue) +#define GPS_RX_BUF_NUM 4 // Number of RX buffers (number of commands waiting) + +#define GPS_NOFIX_COUNT_MAX 60 // Number of seconds after which we consider a fix is lost + +//#define GPS_DEAD_T 5 // Number of seconds we consider the GPS dead if no RX and we decide to + // restart it. + +#define GPS_NMEA 0 +#define GPS_SIRF 1 + +#define GPS_MODE GPS_SIRF + +//#define GPS_MODE_1 // Define to use 57600 bps and SM +//#ifdef WHEELCHAIR + //#define GPS_MODE_1 +//#else +// #define GPS_MODE_2 // Define to use 57600 bps and SIRF Binary protocol to initialize +//#endif + +/// SIRF COMMANDS /// +///////////////////// +typedef enum{ + SIRF_CMD_NONE = 0, + SIRF_MNAV_DATA = 2, + SIRF_MTRACKER_DATA = 4, + SIRF_CLK_STATUS = 7, + SIRF_50BPS_DATA = 8, + SIRF_CPU_THROUGHPUT = 9, + SIRF_CMD_ACK = 11, + SIRF_CMD_NACK = 12, + SIRF_VISIBLE_LIST = 13, + SIRF_OK_TO_SEND = 18, + SIRF_NAV_PARAMS = 19, + SIRF_GEO_DATA = 41, + SIRF_SBAS_PARAMETERS = 50, + SIRF_EXT_EPHEMERIS = 56, + SIRF_NL_AUX_INIT_DATA = 64, + SIRF_CW_INTERFERENCE = 92, + SIRF_INIT_DATA_SRC = 128, + SIRF_POLL_VERSION = 132, + SIRF_MODE_CONTROL = 136, + SIRF_SET_TRICKLE_POWER = 151, + SIRF_POLL_NAV_PARAMS = 152, + SIRF_SETMSG_RATE = 166, + SIRF_SET_LOWPOW_PARAMS = 167, + SIRF_DEV_DATA = 255 +} SIRF_Cmds; + +//#define SIRF_POLL_NAV_PARAMS 0x98 +//#define SIRF_POLL_VERSION 0x84 +//#define SIRF_MODE_CONTROL 0x88 +//#define SIRF_OK_TO_SEND 0x12 +//#define SIRF_CMD_ACK 0x0B +//#define SIRF_CMD_NACK 0x0C +//#define SIRF_NAV_PARAMS 0x13 +//#define SIRF_SETMSG_RATE 0xA6 + +//#define SIRF_MTRACKER_DATA 0x04 +//#define SIRF_INIT_DATA_SRC 0x80 +//#define SIRF_SET_TRICKLE_POWER 0x97 +//#define SIRF_SET_LOWPOW_PARAMS 0xA7 +//#define SIRF_DEV_DATA 0xFF + +//#define SIRF_MNAV_DATA 2 +//#define SIRF_CLK_STATUS 7 +//#define SIRF_50BPS_DATA 8 +//#define SIRF_CPU_THROUGHPUT 9 +//#define SIRF_VISIBLE_LIST 13 +//#define SIRF_GEO_DATA 41 +//#define SIRF_SBAS_PARAMETERS 50 +//#define SIRF_EXT_EPHEMERIS 56 +//#define SIRF_NL_AUX_INIT_DATA 64 +//#define SIRF_CW_INTERFERENCE 92 + +#define SIRF_DEGRAD_NONE 0x04 //No degrad navigation mode allowed +#define SIRF_DEGRAD_2SVCD 0x03 //Allow 2 SV navigation, freeze clock drift +#define SIRF_DEGRAD_2SVD 0x02 //Allow 2 SV navigation, freeze direction +#define SIRF_DEGRAD_1SVCD 0x01 //Allow 1 SV navigation, freeze clock drift for 2 SV, then direc for 1 SV +#define SIRF_DEGRAD_1SVD 0x00 //Allow 1 SV navigation, freeze direction for 2 SV, then clock drift for 1 SV + +#define SIRF_HEADER_LEN 4 +#define SIRF_FOOTER_LEN 4 + +#define SIRF_GEO_NAVVALID_POS_OFFSET 1 +#define SIRF_GEO_NAVTYPE_POS_OFFSET 3 +#define SIRF_GEO_YEAR_POS_OFFSET 11 +#define SIRF_GEO_MONTH_POS_OFFSET 13 +#define SIRF_GEO_DAY_POS_OFFSET 14 +#define SIRF_GEO_HOUR_POS_OFFSET 15 +#define SIRF_GEO_MINUTE_POS_OFFSET 16 +#define SIRF_GEO_SECOND_POS_OFFSET 17 +#define SIRF_GEO_SATIDLIST_POS_OFFSET 19 +#define SIRF_GEO_LATITUDE_POS_OFFSET 23 +#define SIRF_GEO_LONGITUDE_POS_OFFSET 27 +#define SIRF_GEO_ALTITUDE_POS_OFFSET 31 +#define SIRF_GEO_SPEED_POS_OFFSET 40 +#define SIRF_GEO_EHPE_POS_OFFSET 50 +#define SIRF_GEO_EVPE_POS_OFFSET 54 +#define SIRF_GEO_SATNUM_POS_OFFSET 84 +#define SIRF_GEO_HDOP_POS_OFFSET 85 + + +// SIRF PARAMETERS (IF USING MODE 2) // +/////////////////////////////////////// +#define GPS_DEGRAD_MODE SIRF_DEGRAD_2SVCD +#define GPS_DEGRAD_TIMEOUT 60 //Number of seconds in degraded mode max +#define GPS_DEADREC_TIMEOUT 60 //Number of seconds in dead reckoning mode (0=disable) +#define GPS_TRACKSMOOTHING 1 //Set to 1 to enable Track Smoothing, 0 to disable + +//#define GPS_COLD_START // Define to force a GPS cold start + +//------------------------ +// Structure Define +//------------------------ + +//------------------------ +// Functions Define +//------------------------ +Error_TypeDef GPS_Init(void); +Error_TypeDef GPS_Start(void); +Error_TypeDef GPS_SendString(char* msg, unsigned short len); +#if GPS_MODE==GPS_SIRF + unsigned char GPS_SendSirf(unsigned char* msg, unsigned short len); + unsigned short GPS_Checksum(unsigned char* msg, unsigned short len); + unsigned char GPS_SetMsgInterval(unsigned char msg_id, unsigned char interval); + unsigned char GPS_SetMsgFrequency(); + void GPS_Sleep(BOOL sleep); +#endif +Error_TypeDef GPS_ProcessRX(void); +void GPS_Stop(void); + +//------------------------ +// Variable references +//------------------------ +extern unsigned char gps_rx[GPS_RX_BUF_NUM][GPS_RX_BUFFER]; +extern unsigned char gps_tx[GPS_TX_BUF_NUM][GPS_TX_BUFFER]; + +extern unsigned char gps_rx_rd_ptr; // Actual RX read index +extern unsigned char gps_rx_wr_ptr; // Actual RX write index +extern unsigned char gps_tx_rd_ptr; // Actual TX read index +extern unsigned char gps_tx_wr_ptr; // Actual TX write index + +extern volatile unsigned char gps_rx_index; +extern volatile unsigned char gps_tx_index; + +extern volatile unsigned char gps_rx_queue; +extern volatile unsigned char gps_tx_queue; + +extern unsigned short gps_rx_len[GPS_RX_BUF_NUM]; +extern unsigned short gps_tx_len[GPS_TX_BUF_NUM]; + +extern BOOL gps_rx_ready; // Set to TRUE when RX data is ready to be processed +extern BOOL gps_has_fix; +//extern BOOL gps_alive; +//extern unsigned char gps_count; + +#endif /*GPS_H_*/ diff --git a/Firmware/WIMU3/inc/imu.h b/Firmware/WIMU3/inc/imu.h new file mode 100644 index 0000000..a66dc1a --- /dev/null +++ b/Firmware/WIMU3/inc/imu.h @@ -0,0 +1,109 @@ +#ifndef _IMU_H_ +#define _IMU_H_ + +#include "config.h" +#include "Merged__hw_config.h" + +// this is for arm_math +#define ARM_MATH_CM3 +//------------------------ +// Structure Define +//------------------------ + +//This struct allow the calculation of madgwick quaternion and allow the calibration, this struct is built once when calling madgwickInit function +typedef struct{ + float beta; + int sampleFrequency; + bool onlyImu; + bool automaticGyroOffsets; + + int frameNum; + + // Gains and offsets are already defined globally in the WIMU_SETTINGS struct + /*float accOffsets[3]; + float gyroOffsets[3]; + float magOffsets[3]; + + int16_t accGains[3]; + int16_t gyroGains[3]; + int16_t magGains[3];*/ + + // Calibrated values + float acc_data[3]; + float gyro_data[3]; + float mag_data[3]; + + float quaternion[4]; +}Madgwick_Struct; + + +//This struct is for recording all the Imu data: acc, gyro, magneto and quaternion. the frame num allow the labeling of the frames +typedef struct{ + uint16_t frame_num; + int16_t acc_data[3]; + int16_t gyro_data[3]; + int16_t mag_data[3]; + float quaternion[4]; +}IMUFrame_Struct; + +typedef struct{ + int16_t acc_min[3]; + int16_t acc_max[3]; + int16_t gyro_min[3]; + int16_t gyro_max[3]; + int16_t mag_min[3]; + int16_t mag_max[3]; + BOOL in_progress; +}IMUCalib_Struct; + +extern IMUFrame_Struct IMUFrame; +extern uint8_t IMUFrame_Status; +extern uint8_t IMUFrame_ReadyMask; + +extern IMUCalib_Struct IMUCalib; +extern Madgwick_Struct madgwick_Struct; + +void IMUInit(); + +/* + +To start using Madgwick algorithm and library calibration tool, setup a struct with MadgwickInit function +This will return a Madgwick struct with algo parameters, offsets and gains, and last calculated quaternion +This struct is to be passed to all the functions + +beta is madgwick algo gain: with 10 000, we have good results +sample frequency of sensors data pulling +onlyIMU has to be true if no magnetometer +automaticGyroOffset will calculate automatic offset for gyro. the first 100 iterations will create a sum tp calculate the average value defining the offset. + If automaticGyroOffset is set to true, the parameters gyroOffsets[3] will be erased +next parameters are easy to understand +In our test we used the gains to apply axis changements for aligning the axes of the sensors +*/ +Madgwick_Struct MadgwickInit(float beta,int sampleFrequency,bool onlyImu,bool automaticGyroOffset/*,float accOffsets[3],float gyroOffsets[3],float magOffsets[3],int16_t accGains[3],int16_t gyroGains[3],int16_t magGains[3]*/); + + + +/* +This function allow calibration of ahrs data. +This will apply offsets and gains set in madgwick struct +*/ +void calibrateIMUFrame(Madgwick_Struct * madStruct, IMUFrame_Struct * input); + + +/* +Calculation of the quaternion. The quaternion calculated is set in the twice struct Madgwick_Struct and IMUFrame_Struct +*/ +void MadgwickProcess(Madgwick_Struct * madStruct); + +//private function to calculate inverse square root of float +float invSqrt(float x); + +void IMUCalibStructInit(IMUCalib_Struct* calib); +void IMUProcessRawCalibration(IMUCalib_Struct* calib, IMUFrame_Struct* last_reading); +void IMUStartCalibProcess(); + +float ConvertAccToG(int16_t value); +float ConvertMagToGauss(int16_t value); + + +#endif /*_IMU_H_*/ diff --git a/Firmware/WIMU3/inc/main.h b/Firmware/WIMU3/inc/main.h new file mode 100644 index 0000000..1c2b333 --- /dev/null +++ b/Firmware/WIMU3/inc/main.h @@ -0,0 +1,81 @@ +#ifndef MAIN_H_ +#define MAIN_H_ + +#include "ff.h" +#include "Storage.h" + +#include "RTC.h" + +#include "USART_driver.h" +#include "SPI_driver.h" +#include "I2C_driver.h" +#include "MPUCompass_driver.h" +#include "GPS_Driver.h" +#include "FIFO.h" + +#include "utils.h" +#include "battery.h" +#include "flash.h" +#include "gps.h" +#include "datalogger.h" +#include "usb.h" +#include "ble.h" +#include "power.h" +#include "imu.h" +#include "buttons.h" + +#include "config.h" +//#include "Merged__h_config.h" +#include "platform_config.h" + +//------------------------ +// Constants Define +//------------------------ +//#define DEBUG_CONSOLE 1 + +#define TIMESTAMPING_BUTTON_ACTIVATIONTICK 1000 // Number of SysTick required for timestamping validation (1 second = 1000 SysTick) + +//------------------------ +// Structure Define +//------------------------ + +//------------------------ +// Functions Define +//------------------------ +#ifdef DEBUG_CONSOLE +//void DebugConsole_Init(void); +//int __putchar (int ch); +#endif + +void USB_ModeSelection(void); +uint8_t PushButton_TimestampDetection(void); +uint8_t PushButton_PowerDownDetection(void); + +// Init +bool Main_Init(void); +bool Main_StartModules(void); +void Main_Start(); +void Main_Shutdown(InternalModules_ID int_mod); +void Main_PowerdownAll(); + +// Mains +//void main_acc(void); +void main_ble(void); +void main_buttons(void); +void main_datalogger(void); +void main_gps(void); +//void main_gyro(void); +void main_imu(void); +void main_magneto(void); +void main_mpu(void); +void main_power(void); +void main_usb(void); + +// Managers +void manage_resets(); + +//------------------------ +// Variables Define +//------------------------ + +#endif /*MAIN_H_*/ diff --git a/Firmware/WIMU3/inc/platform_config.h b/Firmware/WIMU3/inc/platform_config.h new file mode 100644 index 0000000..439fea0 --- /dev/null +++ b/Firmware/WIMU3/inc/platform_config.h @@ -0,0 +1,88 @@ +/** + ****************************************************************************** + * @file platform_config.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Evaluation board specific configuration file. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __PLATFORM_CONFIG_H +#define __PLATFORM_CONFIG_H + +#include "stm32l1xx.h" +#include "stm32l152_eval.h" +#include "stm32l152_eval_spi_sd.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Uncomment the line corresponding to the STMicroelectronics evaluation board + used to run the example */ + //#define USE_STM3210B_EVAL + //#define USE_STM3210C_EVAL + #define USE_STM32L152_EVAL + //#define USE_STM32L152D_EVAL + + + /* + For STM32L15xx devices it is possible to use the internal USB pullup + controlled by register SYSCFG_PMC (refer to RM0038 reference manual for + more details). + It is also possible to use external pullup (and disable the internal pullup) + by setting the define USB_USE_EXTERNAL_PULLUP in file platform_config.h + and configuring the right pin to be used for the external pull up configuration. + To have more details on how to use an external pull up, please refer to + STM3210E-EVAL evaluation board manuals. + */ + /* Uncomment the following define to use an external pull up instead of the + integrated STM32L15xx internal pull up. In this case make sure to set up + correctly the external required hardware and the GPIO defines below.*/ +/* #define USB_USE_EXTERNAL_PULLUP */ + +// #if !defined(USB_USE_EXTERNAL_PULLUP) +// #define STM32L15_USB_CONNECT SYSCFG_USBPuCmd(ENABLE) +// #define STM32L15_USB_DISCONNECT SYSCFG_USBPuCmd(DISABLE) + +// #elif defined(USB_USE_EXTERNAL_PULLUP) + /* PA0 is chosen just as illustrating example, you should modify the defines + below according to your hardware configuration. */ +// #define USB_DISCONNECT GPIOA +// #define USB_DISCONNECT_PIN GPIO_Pin_0 +// #define RCC_AHBPeriph_GPIO_DISCONNECT RCC_AHBPeriph_GPIOA +// #define STM32L15_USB_CONNECT GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) +// #define STM32L15_USB_DISCONNECT GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) +// #endif /* USB_USE_EXTERNAL_PULLUP */ + + // VC related definitions + + +#define SDHC +#define SHOW_DEBUG_PRINTF + + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __PLATFORM_CONFIG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/power.h b/Firmware/WIMU3/inc/power.h new file mode 100644 index 0000000..75d14ed --- /dev/null +++ b/Firmware/WIMU3/inc/power.h @@ -0,0 +1,120 @@ +#ifndef POWER_H_ +#define POWER_H_ + +#include "config.h" +#include "stm32l1xx.h" +#include "utils.h" +//#include "adc.h" + +//------------------------ +// Constants Define +//------------------------ +//#define POWER_BUF_NUM 2 // Number of alimentation buffers +//#define POWER_TEMP_ADC 10 // Temperature sensor ADC channel +//#define POWER_VBATT_ADC 6 // VBatt ADC channel +//#define POWER_CURRENT_ADC 13 // Current Probe ADC channel + +//Low Batt +//#define POWER_SLEEPIN_T 5 // Number of seconds required with a Vcc<3V required to + // enter sleep mode +//#define POWER_LOWBAT_ADC_VAL 2752 // Threshold on the ADC reading to consider we have a low bat + +//#define POWER_NOACT_ONTIME 240 // Number of seconds to enter sleep mode when there is no activity detected +//#define POWER_NOACT_OFFTIME 10 // Number of seconds with activity to exit sleep mode + +//External Charger +//#define POWER_CHARGEIN_T 1 // Number of seconds required to enter charge mode +//#define POWER_SLEEPOUT_T 2 // Number of seconds required to exit sleep mode +//#define POWER_CHARGE_LOGIC 0 // Signal level of the charge signal when charging, set to 0x02 when high +//#define POWER_CHARGE_ILOGIC 0x02 // Inverse logic + +//USB Charger +//#define POWER_USB_CHARGEIN_T 10 // Number of seconds required to enter USB charge mode +#define POWER_USB_CHARGE_LOGIC 0 // Signal level of the charge signal when charging +#define POWER_USB_CHARGE_ILOGIC 1 // Inverse logic + +//#ifdef POWER_OFF_USB +// #define POWER_USB_CHECK() (P8IN & BIT7) //(POWER_USB_CHARGE_ILOGIC) //(P8IN & BIT7) +//#else +// #define POWER_USB_CHECK() 0//(P8IN & BIT7) //(POWER_USB_CHARGE_ILOGIC) //(P8IN & BIT7) +//#endif + +#define POWER_GPS_TURNON 21600 // Time (in s.) after which the GPS needs to be turned on, when module is on charge. + +typedef enum{ + POWER_STATE_ON, + POWER_STATE_LOWBAT, + POWER_STATE_USB, + POWER_STATE_USB_MASS, + POWER_STATE_USB_COM, + POWER_STATE_OFF +} PowerStates; +/* +#define POWER_STATE_ON 0 // All systems go +#define POWER_STATE_LOWBAT 1 // Low battery mode +#define POWER_STATE_USB_ON 2 // On USB, all sensors ON +#define POWER_STATE_USB 3 // On USB, off. +#define POWER_STATE_OFF 4 // Low-power mode (OFF) +#define POWER_STATE_ACTIVITY 5 // No power activity mode +*/ + +//------------------------ +// Structure Define +//------------------------ + +typedef struct{ + uint8_t batteryValue; +}POWERFrame_Struct; + +//------------------------ +// Functions Define +//------------------------ + +Error_TypeDef Power_Init(void); +Error_TypeDef Power_Start(void); +//void Power_StateCheck(); +void Power_Stop(void); +void Power_Sleep(void); + +bool Power_IsBattLow(); + +bool Power_IsInStopMode(); + +void Power_StateDisplay(void); +//bool Power_StateManage(void); // Return true if we need to stop the module +bool Power_StateUpdate(); +bool Power_IsStopRequired(PowerStates state); +bool Power_IsStateUSBRelated(PowerStates state); +bool Power_IsCharging(); + +//void Power_SetState(PowerStates new_state); +PowerStates Power_GetState(); +PowerStates Power_GetLastState(); + +void ChargeStat_Config(void); +//uint8_t ChargeStat_StateChanged(uint8_t * NewState); +uint8_t ChargeStat_GetState(); +void ChargeStat_Update(); + +void Power_SetState(PowerStates new_state); + +float Battery_VFromADC(uint16_t batt); +float Temp_FromADC(uint16_t temp); + +//------------------------ +// Variables Define +//------------------------ +// Power Management +extern uint16_t Battery_ADCValue; +extern uint16_t Temp_ADCValue; +extern bool power_ready; +//extern unsigned long power_charge_t; + + +/*void ExtPwr_Config(void); +void ExtPwr_Enable(void); +void ExtPwr_Disable(void);*/ + + + +#endif /*POWER_H_*/ diff --git a/Firmware/WIMU3/inc/stm32l1xx_conf.h b/Firmware/WIMU3/inc/stm32l1xx_conf.h new file mode 100644 index 0000000..7a93760 --- /dev/null +++ b/Firmware/WIMU3/inc/stm32l1xx_conf.h @@ -0,0 +1,83 @@ +/** + ****************************************************************************** + * @file stm32l1xx_conf.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Library configuration file. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __STM32L1xx_CONF_H +#define __STM32L1xx_CONF_H + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +#include "stm32l1xx_adc.h" +#include "stm32l1xx_crc.h" +#include "stm32l1xx_comp.h" +#include "stm32l1xx_dac.h" +#include "stm32l1xx_dbgmcu.h" +#include "stm32l1xx_dma.h" +#include "stm32l1xx_exti.h" +#include "stm32l1xx_flash.h" +#include "stm32l1xx_gpio.h" +#include "stm32l1xx_syscfg.h" +#include "stm32l1xx_i2c.h" +#include "stm32l1xx_iwdg.h" +#include "stm32l1xx_lcd.h" +#include "stm32l1xx_pwr.h" +#include "stm32l1xx_rcc.h" +#include "stm32l1xx_rtc.h" +#include "stm32l1xx_spi.h" +#include "stm32l1xx_tim.h" +#include "stm32l1xx_usart.h" +#include "stm32l1xx_wwdg.h" +#include "stm32l1xx_sdio.h" +#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Uncomment the line below to expanse the "assert_param" macro in the + Standard Peripheral Library drivers code */ +/* #define USE_FULL_ASSERT 1 */ + +/* 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 */ + +#endif /* __STM32L1xx_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/usb.h b/Firmware/WIMU3/inc/usb.h new file mode 100644 index 0000000..d9c2019 --- /dev/null +++ b/Firmware/WIMU3/inc/usb.h @@ -0,0 +1,104 @@ +#ifndef USB_H_ +#define USB_H_ +#include "config.h" +#include "stm32l1xx.h" +#include "utils.h" + +//------------------------ +// Constants Define +//------------------------ +#define USB_RX_BUFFER 128 // Maximum number of char that can be received (commands) +#define USB_TX_BUFFER 256 // Maximum number of char that can be sent in one packet + +#define USB_TX_BUF_NUM 16 // Number of TX buffers (number of messages in the queue) +#define USB_RX_BUF_NUM 10 // Number of RX buffers (number of commands waiting) + +#define USB_STREAM_OFF 0 +#define USB_STREAM_FAST 1 +#define USB_STREAM_SLOW 2 + +/*#define USB_MODULE_ACC 0x00 +#define USB_MODULE_GYRO 0x01 +#define USB_MODULE_MAGNETO 0x02 +#define USB_MODULE_GPS 0x03 +#define USB_MODULE_POWER 0x04 +#define USB_MODULE_SONARS 0x05 +#define USB_MODULE_ENC 0x06 +#define USB_MODULE_FSR 0x07 +#define USB_MODULE_JOY 0x08 +#define USB_MODULE_IMU 0x09 +#define USB_MODULE_QUATERNION 0x10*/ + +#define USB_STATE_CONNECTED 1 // Logic level when USB cable is connected +#define USB_STATE_DISCONNECTED 0 // Logic level when USB cable is disconnected + +//------------------------ +// Structure Define +//------------------------ +typedef enum {VIRTUAL_COM, MASS_STORAGE, UNDEFINED} ProgramMode; + +//------------------------ +// Functions Define +//------------------------ +Error_TypeDef USB_GlobalInit(void); +Error_TypeDef USB_Start(void); +void USB_Stop(void); +void USB_StopAllStreams(void); +Error_TypeDef USB_ProcessRX(void); +Error_TypeDef USB_SendString(char* msg, unsigned short len); +Error_TypeDef USB_SendBinary(unsigned char* msg, unsigned char len, unsigned char module); +Error_TypeDef USB_SendChar(char chr); + +//void USB_ModeSelection(void); +void USB_SetMode(ProgramMode mode); + +void USBDetect_Config(void); +//uint8_t USB_GetState(); +bool USB_IsConnected(); + +//uint8_t USBDetect_StateChanged(uint8_t * NewState); + +//------------------------ +// Variable references +//------------------------ +extern unsigned char usb_rx[USB_RX_BUF_NUM][USB_RX_BUFFER]; +extern unsigned char usb_tx[USB_TX_BUF_NUM][USB_TX_BUFFER]; + +//extern unsigned short usb_rx_len[USB_RX_BUF_NUM]; +//extern unsigned short usb_tx_len[USB_TX_BUF_NUM]; + +extern unsigned char usb_rx_rd_ptr; // Actual RX read index +extern unsigned char usb_rx_wr_ptr; // Actual RX write index +extern unsigned char usb_tx_rd_ptr; // Actual TX read index +extern unsigned char usb_tx_wr_ptr; // Actual TX write index + +extern unsigned char usb_rx_index; +extern unsigned char usb_tx_index; + +extern unsigned char usb_rx_queue; +extern unsigned char usb_tx_queue; + +extern unsigned short usb_tx_len[USB_TX_BUF_NUM]; + +//extern unsigned char usb_stream_acc; //Stream ACC values on USB if =1 (fast) or =2 (slow) +extern unsigned char usb_stream_gps; //Stream GPS values on USB if =1 +//extern unsigned char usb_stream_quaternion; //Stream Quaternion values on USB if =1 +//extern unsigned char usb_stream_gyro; //Stream Gyro values on USB if =1 (fast) or =2 (slow) +//extern unsigned char usb_stream_mag; //Stream Magneto values on USB if 1(fast) or 2 (slow) +extern unsigned char usb_stream_power; //Stream power values on USB if =1 (fast) or =2 (slow) +//extern unsigned char usb_stream_time; + +//extern unsigned char usb_stream_sonars; //Stream Sonars values on USB if =1 +//extern unsigned char usb_stream_encoders; //Stream Encoders value on USB if =1 +//extern unsigned char usb_stream_fsr; //Stream FSR values on USB if =1 +//extern unsigned char usb_stream_joystick; //Stream joystick values on USB if =1 (fast) or =2 (slow) + +extern unsigned char usb_stream_bin; //Stream binary data on USB if =1 (fast) + +extern unsigned char usb_streaming; // >0 if any streaming is occuring, otherwise = 0 + +extern bool usb_rx_ready; // Set to TRUE when RX data is ready to be processed + + +extern ProgramMode usb_mode; +#endif /*USB_H_*/ diff --git a/Firmware/WIMU3/inc/usb_conf.h b/Firmware/WIMU3/inc/usb_conf.h new file mode 100644 index 0000000..b061bf4 --- /dev/null +++ b/Firmware/WIMU3/inc/usb_conf.h @@ -0,0 +1,36 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Mass Storage Demo configuration header + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_CONF_H +#define __USB_CONF_H + +#include "Merged__usb_conf.h" + +#endif /* __USB_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/usb_istr.h b/Firmware/WIMU3/inc/usb_istr.h new file mode 100644 index 0000000..eff8e62 --- /dev/null +++ b/Firmware/WIMU3/inc/usb_istr.h @@ -0,0 +1,99 @@ +/** + ****************************************************************************** + * @file usb_istr.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief This file includes the peripherals header files in the user application. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 __MS__USB_ISTR_H +#define __MS__USB_ISTR_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void USB_Istr(void); + +/* function prototypes Automatically built defining related macros */ + +void EP1_IN_Callback(void); +void EP2_IN_Callback(void); +void EP3_IN_Callback(void); +void EP4_IN_Callback(void); +void EP5_IN_Callback(void); +void EP6_IN_Callback(void); +void EP7_IN_Callback(void); + +void EP1_OUT_Callback(void); +void EP2_OUT_Callback(void); +void EP3_OUT_Callback(void); +void EP4_OUT_Callback(void); +void EP5_OUT_Callback(void); +void EP6_OUT_Callback(void); +void EP7_OUT_Callback(void); + + +#ifdef CTR_CALLBACK +void CTR_Callback(void); +#endif + +#ifdef DOVR_CALLBACK +void DOVR_Callback(void); +#endif + +#ifdef ERR_CALLBACK +void ERR_Callback(void); +#endif + +#ifdef WKUP_CALLBACK +void WKUP_Callback(void); +#endif + +#ifdef SUSP_CALLBACK +void SUSP_Callback(void); +#endif + +#ifdef RESET_CALLBACK +void RESET_Callback(void); +#endif + +#ifdef SOF_CALLBACK +void SOF_Callback(void); +#endif + +#ifdef ESOF_CALLBACK +void ESOF_Callback(void); +#endif + + + + +#endif /*__MS__USB_ISTR_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/usb_pwr.h b/Firmware/WIMU3/inc/usb_pwr.h new file mode 100644 index 0000000..08642d5 --- /dev/null +++ b/Firmware/WIMU3/inc/usb_pwr.h @@ -0,0 +1,73 @@ +/** + ****************************************************************************** + * @file usb_pwr.h + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Connection/disconnection & power management header + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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_PWR_H +#define __USB_PWR_H +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_type.h" + +/* Exported types ------------------------------------------------------------*/ +typedef enum _RESUME_STATE +{ + RESUME_EXTERNAL, + RESUME_INTERNAL, + RESUME_LATER, + RESUME_WAIT, + RESUME_START, + RESUME_ON, + RESUME_OFF, + RESUME_ESOF +} RESUME_STATE; + +typedef enum _DEVICE_STATE +{ + UNCONNECTED, + ATTACHED, + POWERED, + SUSPENDED, + ADDRESSED, + CONFIGURED +} DEVICE_STATE; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void Suspend(void); +void Resume_Init(void); +void Resume(RESUME_STATE eResumeSetVal); +RESULT PowerOn(void); +RESULT PowerOff(void); + +/* External variables --------------------------------------------------------*/ +extern __IO uint32_t bDeviceState; /* USB device status */ +extern __IO BOOL fSuspendEnabled; /* true when suspend is possible */ + +#endif /*__USB_PWR_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/inc/utils.h b/Firmware/WIMU3/inc/utils.h new file mode 100644 index 0000000..9039e2a --- /dev/null +++ b/Firmware/WIMU3/inc/utils.h @@ -0,0 +1,127 @@ +#ifndef UTILS_H_ +#define UTILS_H_ + +#include "config.h" +#include "stm32l1xx_gpio.h" +#include "stm32l1xx_rcc.h" +#include "stm32l1xx_tim.h" +#include "stm32l1xx_rtc.h" + +//------------------------ +// Constants Define +//------------------------ +#define ERROR_RESET_TIME 30 // Number of seconds to reset the device if in error state, -1 = no reset. +#define ERROR_DATALOG_BLINK 1 // Number of seconds to blink to LED on Datalogger error + +#define ABS(a) (((a) < 0) ? -(a) : (a)) + +typedef enum +{ + LED_RED, + LED_GREEN, + LED_BLUE +} LED_Color; + +typedef enum +{ + NO_PRIORITY, + LOW_PRIORITY, + MEDIUM_PRIORITY, + HIGH_PRIORITY +} Priority_TypeDef; + +typedef struct +{ + bool on; + bool blinking; + uint16_t on_time; + uint16_t off_time; + Priority_TypeDef priority; +} LEDState_TypeDef; + + +typedef enum{ + ERROR_NONE=0, + ERROR_INIT, + ERROR_COM, + ERROR_ID, + ERROR_POWER, + ERROR_BUFFER, + ERROR_UNMANAGED, + ERROR_FORMAT, + ERROR_CRC +}Error_TypeDef; + +//typedef enum { INACTIVE, DEBOUNCING } PushButton_DebouncingState_TypeDef; + + +// LED +extern uint8_t UpdateLedStatus; + +// Buzzer +typedef enum {BUZZER_ON, BUZZER_OFF} BuzzerState_TypeDef; +extern BuzzerState_TypeDef Buzzer_State; + +#define BUZZER_NOTE_A 2273 // 440 Hz +#define BUZZER_NOTE_B 2024 // 494 Hz +#define BUZZER_NOTE_C 1912 // 523 Hz +#define BUZZER_NOTE_D 1704 // 587 Hz +#define BUZZER_NOTE_E 1517 // 659 Hz +#define BUZZER_NOTE_F 1431 // 699 Hz +#define BUZZER_NOTE_G 1276 // 784 Hz +#define BUZZER_DEFAULT_TONE 2857 + +//------------------------ +// Functions Define +//------------------------ + +void LedAndBuzzer_Config(bool low_power); +void ChangeLEDState(void); +void Led_Config(void); + +void Buzzer_Config(void); +void Buzzer_Start(uint16_t time_ms); +void Buzzer_Stop(void); +void Buzzer_SetFrequency(uint16_t f); +void Buzzer_PlayStartSong(); +void Buzzer_PlayStopSong(); + +void Wait_TimerConfig(void); +void usWait(uint16_t SleepTime); +void msWait(uint16_t SleepTime); + +void led(LED_Color led, bool state, Priority_TypeDef priority); +void led_toggle(LED_Color led, Priority_TypeDef priority); +bool led_get_state(LED_Color led); +void led_start_blink(LED_Color led, uint16_t on_time, uint16_t off_time, Priority_TypeDef priority); +void led_stop_blink(LED_Color led); +void led_restore_state(); + + + +//void led_alive_start(); +//void led_alive_stop(); + +// +void error(unsigned char module, unsigned char code); +// +//void itoa(int n, char s[]); +//void reverse(char s[]); +// +//unsigned long time_count (bool start); +//float f_time_count (bool start); +// +//unsigned long get_count(void); +// +void update_RTCtime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec, bool apply_tz); +void update_timestampRTC(); +void update_RTCtimeFromTimestamp(uint64_t ts); + + +ModuleStates getModuleState(InternalModules_ID module); +void setModuleState(InternalModules_ID module, ModuleStates state); +bool isModuleOnline(InternalModules_ID module); + +uint32_t NumberOfSetBits(uint32_t i); + +#endif /*UTILS_H_*/ diff --git a/Firmware/WIMU3/inc/watchdog.h b/Firmware/WIMU3/inc/watchdog.h new file mode 100644 index 0000000..5947c9c --- /dev/null +++ b/Firmware/WIMU3/inc/watchdog.h @@ -0,0 +1,36 @@ + + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef WATCHDOG_H_ +#define WATCHDOG_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l1xx_tim.h" + + +/* Exported types ------------------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ + +// Set SOFTWDG_PRESCALER and SOFTWDG_PERIOD to get desired watchdog delay +// according to folowing equation: +// WatchdogDelay = TIMcCLK_Period * SOFTWDG_PRESCALER * SOFTWDG_PERIOD +// +// Refer to system_stm32lxx.c to determine TIMcCLK_Period: +// TIMcCLK_Period = 1/(SYSCLK) * AHB_Prescaler * APB1_Prescaler / X +// where X = 1 when APB1_Prescaler == 1 and X = 2 when APB1_Prescaler != 1. +// +// When SYSCLK = 32MHz, AHB_Prescaler = 1, APB1_Prescaler = 1: +// WatchdogDelay = 31,25 ns * SOFTWDG_PRESCALER * SOFTWDG_PERIOD +#define SOFTWDG_PRESCALER 32000 // *** 16 bits register (must be < 65 535) +#define SOFTWDG_PERIOD 10000 // *** 16 bits register (must be < 65 535) + +/* Exported functions ------------------------------------------------------- */ +void softWDTInit( void ); +void SOFT_WDT_RELOAD(void); + + +#endif /*WATCHDOG_H_*/ diff --git a/Firmware/WIMU3/src/FIFO.c b/Firmware/WIMU3/src/FIFO.c new file mode 100644 index 0000000..2d134e6 --- /dev/null +++ b/Firmware/WIMU3/src/FIFO.c @@ -0,0 +1,256 @@ +//****************************************************************************** +// WIMUuSD - FIFO module +// +// Description: +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "FIFO.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + + +/******************************************************************************* + * Function Name : FIFO_Init. + * Description : Initialize FIFO. + * Input : ElementSize: size of an element of the array pointed to by ArrayPtr + * FIFO: FIFO structure + * ArrayPtr: Address of the Array associated with the FIFO + * ArraySize: Number of element in the array + * Return : None + *******************************************************************************/ +void FIFO_Init(FIFO_TypeDef* FIFO, void * ArrayPtr, size_t ElementSize, uint16_t ArraySize) +{ + FIFO->ArrayPtr = ArrayPtr; + FIFO->ElementSize = ElementSize; + FIFO->ArraySize = ArraySize; + FIFO->RdPtr = 0; + FIFO->WrPtr = 0; + + return; +} + +/******************************************************************************* + * Function Name : FIFO_WrArrayInIfSpaceAvailable. + * Description : Write array in FIFO. + * ***CAUTION: Array MUST be of the same type than FIFO elements type + * Input : FIFO: Destination FIFO for Array + * Array: Array to be written in FIFO + * Return : Result (1:Success; 0:Fail (not enough free space in FIFO)) + *******************************************************************************/ +uint8_t FIFO_WrArrayInIfSpaceAvailable(FIFO_TypeDef* FIFO, void * Array, uint16_t Array_Length) +{ + uint16_t WrapUpLength; + + WrapUpLength = FIFO->ArraySize - FIFO->WrPtr; + + // Write the array in the FIFO if there's enough free space + if (FIFO_GetFreeSpace(FIFO) >= Array_Length) + { + + if(WrapUpLength > Array_Length) + { + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Array, Array_Length * FIFO->ElementSize); + } + else + { + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Array, WrapUpLength * FIFO->ElementSize); + memcpy((void *)(FIFO->ArrayPtr), (void *)((uint8_t *)Array + WrapUpLength * FIFO->ElementSize), (Array_Length - WrapUpLength) * FIFO->ElementSize); + } + + // Update write pointer w/ wrap-up + if(FIFO->WrPtr + Array_Length >= FIFO->ArraySize) + { + FIFO->WrPtr = FIFO->WrPtr + Array_Length - FIFO->ArraySize; + } + else + { + FIFO->WrPtr += Array_Length; + } + + return 1; + } + else + { + return 0; + } +} + +/******************************************************************************* + * Function Name : FIFO_WrArrayIn. + * Description : Write array in FIFO WITHOUT sapce availability check + * ***CAUTION: Array MUST be of the same type than FIFO elements type + * Input : FIFO: Destination FIFO for Array + * Array: Array to be written in FIFO + * Return : None. + *******************************************************************************/ +void FIFO_WrArrayIn(FIFO_TypeDef* FIFO, void * Array, uint16_t Array_Length) +{ + + uint16_t WrapUpLength; + + WrapUpLength = FIFO->ArraySize - FIFO->WrPtr; + + // Writing the array in the FIFO + if(WrapUpLength > Array_Length) + { + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Array, Array_Length * FIFO->ElementSize); + } + else + { + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Array, WrapUpLength * FIFO->ElementSize); + memcpy((void *)(FIFO->ArrayPtr), (void *)((uint8_t *)Array + WrapUpLength * FIFO->ElementSize), (Array_Length - WrapUpLength) * FIFO->ElementSize); + } + + // Update write pointer w/ wrap-up + if(FIFO->WrPtr + Array_Length >= FIFO->ArraySize) + { + FIFO->WrPtr = FIFO->WrPtr + Array_Length - FIFO->ArraySize; + } + else + { + FIFO->WrPtr += Array_Length; + } + +} + +/******************************************************************************* + * Function Name : FIFO_WrElementIfSpaceAvailable. + * Description : Write single element in FIFO if space available. + * ***CAUTION: element MUST be of the same type than FIFO elements type + * Input : FIFO: Destination FIFO for element + * Element: element to be written in FIFO + * Return : Result (1:Success; 0:Fail (not enough free space in FIFO)) + *******************************************************************************/ +uint8_t FIFO_WrElementIfSpaceAvailable(FIFO_TypeDef* FIFO, void * Element) +{ + + // Write element in the FIFO if there's enough free space + if (FIFO_GetFreeSpace(FIFO) >= 1) + { + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Element, FIFO->ElementSize); + + // Update write pointer w/ wrap-up + if(FIFO->WrPtr + 1 >= FIFO->ArraySize) + { + FIFO->WrPtr = 0; + } + else + { + FIFO->WrPtr++; + } + + return 1; + } + else + { + return 0; + } + +} + +/******************************************************************************* + * Function Name : FIFO_WrElementIn. + * Description : Write single element in FIFO WITHOUT sapce availability check. + * ***CAUTION: element MUST be of the same type than FIFO elements type + * Input : FIFO: Destination FIFO for element + * Element: element to be written in FIFO + * Return : None. + *******************************************************************************/ +void FIFO_WrElementIn(FIFO_TypeDef* FIFO, void * Element) +{ + + memcpy((void *)((uint8_t *)FIFO->ArrayPtr + FIFO->WrPtr * FIFO->ElementSize), Element, FIFO->ElementSize); + + // Update write pointer w/ wrap-up + if(FIFO->WrPtr + 1 >= FIFO->ArraySize) + { + FIFO->WrPtr = 0; + } + else + { + FIFO->WrPtr++; + } + +} + +/******************************************************************************* + * Function Name : FIFO_RdElementIfDataAvailable. + * Description : Read element when FIFO is not empty. + * Input : FIFO: FIFO to read from + * RdElement: Readed element + * Return : Result: (1:Success; 0:No data available). + *******************************************************************************/ +uint8_t FIFO_RdElementIfDataAvailable(FIFO_TypeDef* FIFO, void * RdElement) +{ + if(!FIFO_IsEmpty(FIFO)) + { + memcpy(RdElement, (void *)((uint8_t *)FIFO->ArrayPtr + FIFO->RdPtr * FIFO->ElementSize), FIFO->ElementSize); + + // Update read pointer w/ wrap-up + if(FIFO->RdPtr + 1 >= FIFO->ArraySize) + { + FIFO->RdPtr = 0; + } + else + { + FIFO->RdPtr++; + } + + return 1; + } + else + { + return 0; + } +} + +/******************************************************************************* + * Function Name : FIFO_IsEmpty. + * Description : Verify if FIFO is empty. + * Input : FIFO: FIFO to perform the empty validation on + * Return : Result: (1:FIFO is empty; 0:FIFO is not empty). + *******************************************************************************/ +uint8_t FIFO_IsEmpty(FIFO_TypeDef* FIFO) +{ + return (FIFO->RdPtr == FIFO->WrPtr) ? 1 : 0; +} + +/******************************************************************************* + * Function Name : FIFO_GetFreeSpace. + * Description : Return free space of FIFO. + * ***Returning available space minus 1 prevent from having to + * treat the ambiguity in the case where WrPtr == RdPtr. In + * that case (WrPtr == RdPtr), the FIFO could be full or empty. + * Input : FIFO: FIFO to perform free space calculation on + * Return : Result: free space. + *******************************************************************************/ +uint16_t FIFO_GetFreeSpace(FIFO_TypeDef* FIFO) +{ + if (FIFO->WrPtr >= FIFO->RdPtr) + { + return FIFO->ArraySize - (FIFO->WrPtr - FIFO->RdPtr) - 1; + } + else + { + return FIFO->RdPtr - FIFO->WrPtr - 1; + } +} + + diff --git a/Firmware/WIMU3/src/GPS_driver.c b/Firmware/WIMU3/src/GPS_driver.c new file mode 100644 index 0000000..09dc398 --- /dev/null +++ b/Firmware/WIMU3/src/GPS_driver.c @@ -0,0 +1,427 @@ +//****************************************************************************** +// GPS driver module +// +// Description: +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "GPS_driver.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint8_t GPS_PowerState = 0; + +#if GPS_MODE==GPS_SIRF +uint8_t GPS_Rx_DMA[255]; +DMA_InitTypeDef DMA_InitStructure; +#endif + +/* Extern variables ----------------------------------------------------------*/ +extern volatile uint64_t SysTick_Counter; +extern volatile uint32_t SysTick_Timeout; + +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ +uint8_t GPS_ReadWakeup(void); + +/******************************************************************************* + * Function Name : GPS_Config. + * Description : Configure the GPS pins. + * Input : None. + * Return : None. + *******************************************************************************/ +void GPS_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPS_SetupPower(); // Setup pin for power + + /************ GPS_ON_OFF (PB0) config ***********/ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOB, GPIO_Pin_0); + + /************ GPS_WAKEUP (PC2) config ***********/ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + + /************ GPS_1PPS (PC3) config ***********/ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + + /************ GPS USART (USART3-RX:PC11; USART3-TX:PC10) config ***********/ + + /* Enabling GPIO clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + + // Connecting TX and RX pins to the desired peripherals' Alternate Function + GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3); + + /* Configure USART Tx in output whenever the GPS is hibernating (to prevent IO powering) */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOC, GPIO_Pin_10); + + /* Configure USART Rx in alternate function */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + // DMA RX transfer setup + // Enable DMA clock +#if GPS_MODE==GPS_SIRF + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + + // Configure DMA transfer + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR; + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&GPS_Rx_DMA; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStructure.DMA_BufferSize = 1; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Channel3, &DMA_InitStructure); +#endif + // Set GPS Baudrate (default = 4800) + GPS_SetBaudrate(4800); + + GPS_PowerState = 0; + + // Insert delay to allow GPS power to reach 0V before repowering + msWait(50); + + +} + +void GPS_SetBaudrate(uint32_t baudrate){ +/* Initializing the USART (Baud Rate, Word Length , Stop Bit, Parity, Hardware + flow control and Mode) */ + // Enabling USART clock + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + + USART_InitTypeDef USART_InitStruct; + + USART_InitStruct.USART_BaudRate = baudrate; + USART_InitStruct.USART_WordLength = USART_WordLength_8b; + USART_InitStruct.USART_StopBits = USART_StopBits_1; + USART_InitStruct.USART_Parity = USART_Parity_No; + USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_Init(USART3, &USART_InitStruct); + +} + +void GPS_1PPS_IRQConfig(FunctionalState NewState) +{ + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + + /* Enable the INT Clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + /* Connect EXTI Line to INT Pin */ + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3); + + /* Configure EXTI line */ + EXTI_InitStructure.EXTI_Line = EXTI_Line3; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + /* Enable and set the EXTI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + +} + +void GPS_SetupPower(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /************ GPS_PWR_EN (PB12) config ***********/ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOB, GPIO_Pin_12); +} + +void GPS_EnablePower(void) +{ + + // Enable GPS power + GPIO_SetBits(GPIOB, GPIO_Pin_12); + + msWait(50); + + GPS_PowerState = 1; + +} + +void GPS_DisablePower(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_ResetBits(GPIOB, GPIO_Pin_12); + + // Disable the USART and change Tx GPIO type to output + USART_Cmd(USART3, DISABLE); + + // Pull TX down in order not to IO power GPS + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOC, GPIO_Pin_10); + + GPS_PowerState = 0; + +} + +uint8_t GPS_Wakeup(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + // Do it only if power is ON + if(GPS_PowerState == 1) + { + + // Wake the GPS up if not awake + if(GPS_ReadWakeup() == 0) + { + // Set ON_OFF + GPIO_SetBits(GPIOB, GPIO_Pin_0); + + // Wait till wakeup activation + __disable_irq(); + SysTick_Timeout = 250; + __enable_irq(); + while (GPS_ReadWakeup() == 0 && SysTick_Timeout != 0); + + // Change TX GPIO type to Alternate function and enable the USART + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + USART_Cmd(USART3, ENABLE); + + // Enable +#if GPS_MODE==GPS_SIRF + DMA_Cmd(DMA1_Channel3, ENABLE); + USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE); +#endif + + // Reset ON_OFF + while (SysTick_Timeout > 0); + GPIO_ResetBits(GPIOB, GPIO_Pin_0); + + + msWait(10); + if (GPS_ReadWakeup()) + setModuleState(MODULE_GPS,STATE_ONLINE); + + //TODO: Restore software trickle + power management in SIRF mode + + // Return 1 if the GPS is awake. If not, return 0 (wakeup fail) + return GPS_ReadWakeup(); + + } + else + { + return 1; + } + + } + else + { + return 0; + } + +} + +uint8_t GPS_Hibernate(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + // Do it only if power is ON + if(GPS_PowerState == 1) + { + // Put GPS in hibernation if it is not already + if(GPS_ReadWakeup() != 0) + { + //TODO: if in SIRF mode, restore normal operating mode (not trickle) before hibernation + + // Set ON_OFF + GPIO_SetBits(GPIOB, GPIO_Pin_0); + + // Wait till wakeup falling + __disable_irq(); + SysTick_Timeout = 150; + __enable_irq(); + + while (GPS_ReadWakeup() != 0 && SysTick_Timeout != 0); + + // Disable the USART and change Tx GPIO type to input + USART_Cmd(USART3, DISABLE); + DMA_Cmd(DMA1_Channel3, DISABLE); + + // Pull TX down in order not to IO power GPS + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOC, GPIO_Pin_10); + + // Reset ON_OFF + while (SysTick_Timeout > 50); + GPIO_ResetBits(GPIOB, GPIO_Pin_0); + + } + + msWait(10); + + if (!GPS_ReadWakeup()) + setModuleState(MODULE_GPS, STATE_SLEEPMODE); + + // Return 1 if the GPS is in hibernation. If not, return 0 (hibernation fail) + return !GPS_ReadWakeup(); + } + else + { + return 0; + } + +} + +uint8_t GPS_ReadWakeup(void) +{ + return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2); +} + +// This function is based on the module activation flowchart of the MN8010 design guidelines +// Return 1 when the module is up and running +uint8_t GPS_PowerAndWakeup(void) +{ + /*GPS_DisablePower(); + msWait(50); + */ + GPS_EnablePower(); + + msWait(400); + + return GPS_Wakeup(); + +} + +void GPS_ConfigRxIRQ(FunctionalState NewState) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + #if GPS_MODE==GPS_NMEA + USART_ClearFlag(USART3, USART_FLAG_RXNE); + USART_ITConfig(USART3, USART_IT_RXNE, NewState); + NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; + #endif + + #if GPS_MODE==GPS_SIRF + USART_ClearFlag(USART3, USART_FLAG_RXNE); + DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, NewState); + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn; + #endif + + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + + +} +void GPS_ConfigTxIRQ(FunctionalState NewState) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + USART_ClearFlag(USART3, USART_FLAG_TC); + USART_ITConfig(USART3, USART_IT_TC, NewState); + + NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + + +} diff --git a/Firmware/WIMU3/src/I2C_driver.c b/Firmware/WIMU3/src/I2C_driver.c new file mode 100644 index 0000000..da16dac --- /dev/null +++ b/Firmware/WIMU3/src/I2C_driver.c @@ -0,0 +1,103 @@ +//****************************************************************************** +// WIMUuSD - I2C driver module +// +// Description: +// +// Limitations: This module has been designed for the I2C to be master. Code +// MUST be adapt to supprt slave mode +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 30th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "I2C_driver.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +const I2CConfig_TypeDef I2CConfigTable[2] = +{ + { + I2C1, RCC_APB1Periph_I2C1, + RCC_AHBPeriph_GPIOB, GPIOB, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_I2C1, + RCC_AHBPeriph_GPIOB, GPIOB, GPIO_Pin_7, GPIO_PinSource7, GPIO_AF_I2C1 + }, + + { + I2C2, RCC_APB1Periph_I2C2, + RCC_AHBPeriph_GPIOB, GPIOB, GPIO_Pin_10, GPIO_PinSource10, GPIO_AF_I2C2, + RCC_AHBPeriph_GPIOB, GPIOB, GPIO_Pin_11, GPIO_PinSource11, GPIO_AF_I2C2 + } +}; + + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + + +/******************************************************************************* + * Function Name : I2C_Config. + * Description : Configure the I2C peripheral. + * + * Input : I2C_InitStruct: Refer to stm32l1xx_i2c.h for for field description + * : I2Cx: specific I2C peripheral to use (I2C1, I2C2) + * Return : None. + *******************************************************************************/ +void I2C_Config(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + uint8_t I2CConfigTable_Index; + + for(I2CConfigTable_Index = 0; I2CConfigTable_Index < NBR_OF_I2C_USED; I2CConfigTable_Index++) + { + if(I2CConfigTable[I2CConfigTable_Index].I2Cx == I2Cx) break; + } + + // Enabling I2C peripheral clock + RCC_APB1PeriphClockCmd(I2CConfigTable[I2CConfigTable_Index].I2Cx_PeriphClk, ENABLE); + + // Enabling GPIO clock + RCC_AHBPeriphClockCmd(I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLGPIOClk | I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAGPIOClk, ENABLE); + + // Connecting SCL and SDA pins to the desired peripherals' Alternate Function + GPIO_PinAFConfig(I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLPort, I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLPinSource, I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLAlternFunc); + GPIO_PinAFConfig(I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAPort, I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAPinSource, I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAAlternFunc); + + /* Configure I2C SCL as alternate function and selecting the IO type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(I2CConfigTable[I2CConfigTable_Index].I2Cx_SCLPort, &GPIO_InitStructure); + + /* Configure I2C SDA as alternate function and selecting the IO type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(I2CConfigTable[I2CConfigTable_Index].I2Cx_SDAPort, &GPIO_InitStructure); + + // Initializing the I2C peripheral (Mode, duty cycle, Own address, Ack, Speed and Ack Address) + I2C_Init(I2Cx, I2C_InitStruct); + + // Enabling I2C + I2C_Cmd(I2Cx, ENABLE); + + return; +} + + + diff --git a/Firmware/WIMU3/src/MPUCompass_driver.c b/Firmware/WIMU3/src/MPUCompass_driver.c new file mode 100644 index 0000000..079693d --- /dev/null +++ b/Firmware/WIMU3/src/MPUCompass_driver.c @@ -0,0 +1,1485 @@ +//****************************************************************************** +// WIMUuSD - MPU and Compass driver module +// +// Description: +// +// Limitations: This module has been designed to configure, to read and to write +// the MPU and Compass registers. +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 2, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "MPUCompass_driver.h" +#include "power.h" // For shared power button interrupt on EXTI_5_9 line +#include "utils.h" +#include "stm32l152_eval.h" +#include "buttons.h" +#include // For memcpy + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint8_t MPUCompass_PowerState = 0; + +uint8_t MPUCompass_MPUConfigState = 0; +uint8_t MPUCompass_MPUWakeState = 0; +uint8_t MPUCompass_MPUAcqState = 0; + +uint8_t MPU_DMA[16]; + +volatile MPUCompass_I2CState_Typedef MPUCompass_I2CState = MPUCOMPASS_I2C_IDLE; +volatile MPUCompass_I2CWrState_Typedef MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_START; +volatile MPUCompass_I2CRdState_Typedef MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_START; + +volatile I2C_ReadStruct_Typedef I2C_ReadStructure; +volatile I2C_WriteStruct_Typedef I2C_WriteStructure; + +uint8_t MPUCompass_CompassAcqState = 0; +volatile uint8_t MPUCompass_CompassStartAcq = 0; + +uint8_t MPU_SampleNumber = 0; +uint8_t MPU_BufWrPtr = 0; +volatile uint8_t MPU_BufRdPtr = 0; +volatile uint8_t Compass_BufRdPtr = 0; + +extern uint8_t MPUCompass_SamplingFrequency; + +//volatile bool MPU_BufferReady[2] = {false,false}; + +volatile bool MPU_NewValue = false; +volatile bool Mag_NewValue = false; + +extern volatile int16_t AccelX_1s[2][MAX_FS]; +extern volatile int16_t AccelY_1s[2][MAX_FS]; +extern volatile int16_t AccelZ_1s[2][MAX_FS]; +extern volatile int16_t GyroX_1s[2][MAX_FS]; +extern volatile int16_t GyroY_1s[2][MAX_FS]; +extern volatile int16_t GyroZ_1s[2][MAX_FS]; + +uint8_t Compass_SampleNumber = 0; +uint8_t Compass_BufWrPtr = 0; +extern volatile uint8_t Compass_BufRdPtr; + +//volatile bool Compass_BufferReady[2] = {false, false}; + +extern volatile int16_t MagnetoX_1s[2][MAX_FS]; +extern volatile int16_t MagnetoY_1s[2][MAX_FS]; +extern volatile int16_t MagnetoZ_1s[2][MAX_FS]; + +extern volatile uint8_t MPUCompass_CompassStartAcq; + +extern volatile uint32_t SysTick_DelayDownCounter; + +uint8_t MPU_SamplingFrequency = 50; +uint8_t MPUCompass_SamplingFrequency = 50; + +TIM_TimeBaseInitTypeDef TIM_TimebaseCompassInit = +{ + 0, // TIM_Prescaler (period tick = 1/32768 s) + TIM_CounterMode_Up, // TIM_CounterMode + 655,//MPUCOMPASS_50Hz, // TIM_Period (default freq : 49,95) + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +// Configuring the timer output compare unit to trigger Compass read +// Setting the compare value to 1.59ms before period end +// (The CPU have 1,59ms to perform the Compass register read) +TIM_OCInitTypeDef TIM_OCCompassInit = +{ + TIM_OCMode_Timing, // TIM_OCMode + TIM_OutputState_Disable, // TIM_OutputState + 655-52,//MPUCOMPASS_50Hz - 52, // TIM_Pulse + TIM_OCPolarity_High // TIM_OCPolarity +}; + + + +/* Extern variables ----------------------------------------------------------*/ +extern volatile uint64_t SysTick_Counter; +extern volatile uint32_t SysTick_Timeout; +extern PushButton_TypeDef PushButton1; +extern uint8_t BuzzerStartFlag; + +/* Private function prototypes -----------------------------------------------*/ +uint8_t MPUCompass_WrRegister(uint8_t I2C_Address, uint8_t RegisterAddress, uint8_t RegisterValue); +uint8_t MPUCompass_RdRegister(uint8_t I2C_Address, uint8_t RegisterAddress, uint8_t * RegisterValue, uint8_t BurstLength); +void MPUCompass_WaitDataReady(void); + +Error_TypeDef MPUCompass_MPUInit(void){ + uint8_t status=0; + + MPU_BufRdPtr = MPU_BufWrPtr = 0; + + if (MPUCompass_ConfigIO()!=1) + return ERROR_INIT; + + if (MPUCompass_EnablePower()!=1) + return ERROR_POWER; + + if (MPUCompass_MPUWakeup()!=1) + return ERROR_COM; + + if (MPUCompass_MPUIDValidation()==0){ + return ERROR_ID; + } + + if (MPUCompass_MPUConfigReg(wimu_config.acc.range, wimu_config.gyro.range)!=1) + return ERROR_COM; + + if (wimu_config.general.sampling_rate==50){ + status = MPUCompass_MPUSetFreq(MPUCOMPASS_50Hz); + } + + if (wimu_config.general.sampling_rate==100){ + status = MPUCompass_MPUSetFreq(MPUCOMPASS_100Hz); + } + + if (wimu_config.general.sampling_rate==200){ + status = MPUCompass_MPUSetFreq(MPUCOMPASS_200Hz); + } + + if (status!=1) + return ERROR_COM; + + return ERROR_NONE; +} + +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* + * Function Name : MPUCompass_Config. + * Description : configure the MPU and Compass. + * Input : None. + * Return : Config result: 1=OK, 0=LSE clock fail to start. + *******************************************************************************/ +uint8_t MPUCompass_ConfigIO(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //I2C_InitTypeDef I2C_InitStruct; + NVIC_InitTypeDef NVIC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + + // Configure GPIO for power supply + MPUCompass_SetupPower(); + MPUCompass_DisablePower(); + + // Initializing I2C peripheral + /* I2C_InitStruct.I2C_ClockSpeed = 400000; + I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; + I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStruct.I2C_OwnAddress1 = 0x00; + I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; + I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Config(I2C_MPUCOMPASS_PERIPHERAL_ID, &I2C_InitStruct); + + msWait(100);*/ + + /* ------ MPU_INT GPIO (PB5) config ------ */ + + /* Enable GPIOx AHB Clocks */ + //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + // Configure I2C pins as input + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + + /* ------ MCO (PA8) config ------ */ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOA, GPIO_Pin_8); + + // Enabling the Power Controller (PWR) APB1 interface clock + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); + + // Enabling access to RTC domain + PWR_RTCAccessCmd(ENABLE); + + // Enabling and selecting LSE as RTC clock source + RCC_LSEConfig(RCC_LSE_ON); + + // Wait for LSE clock to be ready + __disable_irq(); + SysTick_Timeout = LSE_STARTUP_TIMEOUT; + __enable_irq(); + + while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && SysTick_Timeout != 0) + if (SysTick_Timeout == 0) + { + //printf("ERROR: LSE clock fail to start\n"); + return 0; + } + + // Select LSE for MCO pin (PA8) + RCC_MCOConfig(RCC_MCOSource_LSE, RCC_MCODiv_1); + + // Enable the interrupt for I2C transaction + NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + // DMA RX transfer setup + // Enable DMA clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + + // Configure DMA transfer + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2C1->DR; + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&MPU_DMA; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStructure.DMA_BufferSize = 16; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Channel7, &DMA_InitStructure); + +// Enable the interrupt for DMA transfer + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + DMA_ClearITPendingBit(DMA1_IT_TC7); + + return 1; +} + +void MPUCompass_EnableInterrupt(bool enable){ + NVIC_InitTypeDef NVIC_InitStructure; + /* Enable and set the EXTI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + + if (enable==true) + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + else + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + + NVIC_Init(&NVIC_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line5); + + +} + +void MPUCompass_SetupPower(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + /* ------ SENSOR_PWR_EN GPIO (PB8) config ------ */ + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + /* Configure pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_ResetBits(GPIOB, GPIO_Pin_8); + __disable_irq(); + msWait(100); + __enable_irq(); + +} + +uint8_t MPUCompass_EnablePower(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + I2C_InitTypeDef I2C_InitStruct; + uint8_t RegisterValue; + uint8_t I2C_GlobalAccessResult = 1; + + // Enable MPU and compass power + GPIO_SetBits(GPIOB, GPIO_Pin_8); + MPUCompass_PowerState = 1; + + msWait(100); + + // Initializing I2C peripheral + I2C_InitStruct.I2C_ClockSpeed = 400000; + I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; + I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStruct.I2C_OwnAddress1 = 0x00; + I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; + I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Config(I2C_MPUCOMPASS_PERIPHERAL_ID, &I2C_InitStruct); + + //msWait(100); + + // Output MCO clock + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + // Configuring the Auxiliary I2C serial interface of MPU in Pass-Through Mode + + // Setting I2C_BYPASS_EN bit in INT_PIN_CFG register + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__INT_PIN_CFG, &RegisterValue, 1); + RegisterValue = MPU_REG__INT_PIN_CFG__I2C_BYPASS_EN__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__INT_PIN_CFG, RegisterValue); + + if(I2C_GlobalAccessResult == 0) + { + //printf("ERROR: Setting MPU's I2C in Pass-Through mode FAILED (I2C timeout).\n"); + return 0; + } + + MPUCompass_MPUConfigState = 0; + MPUCompass_MPUWakeState = 0; + MPUCompass_MPUAcqState = 0; + + return 1; +} + +void MPUCompass_DisablePower(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + // Shutdown MCO clock + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); +// GPIO_ResetBits(GPIOA, GPIO_Pin_8); + + // Disabling I2C + I2C_DeInit(I2C_MPUCOMPASS_PERIPHERAL_ID); + I2C_Cmd(I2C_MPUCOMPASS_PERIPHERAL_ID, DISABLE); + + // Configure I2C pins as input + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, DISABLE); + + + + + EXTI_ClearITPendingBit(EXTI_Line5); + + // Disable MPU and compass power + GPIO_ResetBits(GPIOB, GPIO_Pin_8); + MPUCompass_PowerState = 0; + + +// msWait(200); +} + +uint8_t MPUCompass_MPUWakeup(void) +{ + uint8_t I2C_GlobalAccessResult = 1; + uint8_t RegisterValue; + + // Waking up MPU by clearing SLEEP bit in PWR_MGMT_1 register + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, &RegisterValue, 1); + RegisterValue &= ~MPU_REG__PWR_MGMT_1__SLEEP__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, RegisterValue); + + if(I2C_GlobalAccessResult == 0) + { + // printf("ERROR: MPU wakeup FAILED (I2C timeout).\n"); + return 0; + } + + MPUCompass_MPUWakeState = 1; + + return 1; + +} + +uint8_t MPUCompass_MPUSleep(void) +{ + uint8_t I2C_GlobalAccessResult = 1; + uint8_t RegisterValue; + + // Put MPU in Sleep mode by setting SLEEP bit in PWR_MGMT_1 register + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, &RegisterValue, 1); + RegisterValue |= MPU_REG__PWR_MGMT_1__SLEEP__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, RegisterValue); + + if(I2C_GlobalAccessResult == 0) + { + printf("ERROR: MPU Sleep FAILED (I2C timeout).\n"); + return 0; + } + + MPUCompass_MPUWakeState = 0; + + return 1; +} + +uint8_t MPUCompass_MPUSetFreq(MPUCompassSamplingFreq_TypeDef SamplingFreq) +{ + uint8_t I2C_AccessResult; + + if(MPUCompass_PowerState == 1 && MPUCompass_MPUConfigState == 1 && MPUCompass_MPUAcqState == 0) + { + // Setting sampling frequency in SMPRT_DIV register + I2C_AccessResult = MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__SMPLRT_DIV, SamplingFreq /*/ 4 - 1*/); + + if(I2C_AccessResult == 0) + { + //printf("ERROR: MPU frequency setting FAILED (I2C timeout).\n"); + return 0; + } + + //msWait(50); + return 1; + } + else + { + //printf("ERROR: MPU frequency setting failed\n"); + return 0; + } +} + + +Error_TypeDef MPUCompass_MPUStart(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + //NVIC_InitTypeDef NVIC_InitStructure; + //uint8_t i; + + //MPU_BufferReady[0] = false; + //MPU_BufferReady[1] = false; + + + + /*for (i=0;i<2;i++){ + Acc_BufferReady[i]=false; + Gyro_BufferReady[i]=false; + }*/ + + /* Enable the INT Clock */ + //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + /* Connect EXTI Line to INT Pin */ + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5); + + /* Configure EXTI line */ + EXTI_InitStructure.EXTI_Line = EXTI_Line5; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + MPUCompass_EnableInterrupt(true); + + MPUCompass_MPUAcqState = 1; + + + return ERROR_NONE; + +} + +void MPUCompass_MPUStop(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + //NVIC_InitTypeDef NVIC_InitStructure; + + /* Configure EXTI line */ + EXTI_InitStructure.EXTI_Line = EXTI_Line5; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + EXTI_Init(&EXTI_InitStructure); + + /* Enable and set the EXTI interrupt priority */ + /*NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure);*/ + //MPUCompass_EnableInterrupt(false); + + MPUCompass_MPUAcqState = 0; + +} + +uint8_t MPUCompass_MPUIDValidation(void) +{ + uint8_t RegisterValue; + uint8_t I2C_AccessResult; + + if(MPUCompass_PowerState != 0) + { + + I2C_AccessResult = MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__WHO_AM_I, &RegisterValue, 1); + + if(I2C_AccessResult == 0) + { + //printf("ERROR: I2C timeout during MPU ID read\n"); + return 0; + } + + if(((RegisterValue >> 1) & 0x3F) != 0x34) + { + //printf("ERROR: Invalid MPU ID\n"); + return 0; + } + + return 1; + } + else + { + //printf("ERROR: MPU ID validation falied (Power is down)\n"); + return 0; + } + +} + +// acc_range = value to put in the register (0 to 3) +// gyro_range = value to put in the register (0 to 3) +uint8_t MPUCompass_MPUConfigReg(uint8_t acc_range, uint8_t gyro_range) +{ + uint8_t RegisterValue; + uint8_t I2C_GlobalAccessResult = 1; + + if(MPUCompass_PowerState != 0) + { + // Setting initial sampling frequency to 50Hz SMPRT_DIV register + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__SMPLRT_DIV, MPUCOMPASS_50Hz/*/ 4 - 1*/); // Will be overwritten in SetFreq + + // Setting Gyro range + RegisterValue = (gyro_range << MPU_REG__GYRO_CONFIG__FS_SEL__SHIFT) & MPU_REG__GYRO_CONFIG__FS_SEL__MASK; + //RegisterValue = 0x10; // +/-1000 deg/sec + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__GYRO_CONFIG, RegisterValue); + + // Setting Acc range + RegisterValue = (acc_range << MPU_REG__ACCEL_CONFIG__AFS_SEL__SHIFT) & MPU_REG__ACCEL_CONFIG__AFS_SEL__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__ACCEL_CONFIG, RegisterValue); + + // Configure the interrupt status bits to be cleared on any read operation by + // setting INT_RD_CLEAR bit in INT_PIN_CFG register + // (I2C_BYPASS_EN bit must always be set) + RegisterValue = MPU_REG__INT_PIN_CFG__INT_RD_CLEAR__MASK | MPU_REG__INT_PIN_CFG__I2C_BYPASS_EN__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__INT_PIN_CFG, RegisterValue); + + // Enabling Data ready interrupt by setting DATA_RDY_INT bit in INT_ENABLE register + RegisterValue = MPU_REG__INT_ENABLE__DATA_RDY_EN__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__INT_ENABLE, RegisterValue); + //I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__INT_ENABLE, &RegisterValue, 1); + + // Select external 32.768kHz clock as MPU clock source by writing to CLKSEL bits in PWR_MGMT_1 register + // Disabling the temperature sensor by setting TEMP_DIS bit in PWR_MGMT_1 register + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, &RegisterValue, 1); + RegisterValue |= (4 << MPU_REG__PWR_MGMT_1__CLKSEL__SHIFT) | MPU_REG__PWR_MGMT_1__TEMP_DIS__MASK; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__PWR_MGMT_1, RegisterValue); + + #ifdef MPU_FILTERGYRO + RegisterValue = MPU_DLPF_5HZ; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_MPU_ADDR, MPU_REG__CONFIG, RegisterValue); + #endif + + //msWait(50); + + if(I2C_GlobalAccessResult == 0) + { + //printf("ERROR: MPU config register FAILED because of timeout.\n"); + return 0; + } + + MPUCompass_MPUConfigState = 1; + + return 1; + } + else + { + printf("ERROR: MPU config register FAILED (Power is down)\n"); + return 0; + } + +} + +/*uint8_t MPUCompass_ReadMPUData(int16_t * AccelXYZData, int16_t * GyroXYZData) +{ + uint8_t I2C_AccessResult = 1; + uint8_t RegisterValue[14]; + + I2C_AccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__ACCEL_XOUT_H, RegisterValue, 14); + + AccelXYZData[0] = ((int16_t)(RegisterValue[0]) << 8) | RegisterValue[1]; + AccelXYZData[1] = ((int16_t)(RegisterValue[2]) << 8) | RegisterValue[3]; + AccelXYZData[2] = ((int16_t)(RegisterValue[4]) << 8) | RegisterValue[5]; + + GyroXYZData[0] = ((int16_t)(RegisterValue[8]) << 8) | RegisterValue[9]; + GyroXYZData[1] = ((int16_t)(RegisterValue[10]) << 8) | RegisterValue[11]; + GyroXYZData[2] = ((int16_t)(RegisterValue[12]) << 8) | RegisterValue[13]; + + return I2C_AccessResult; + +}*/ + +uint8_t MPUCompass_StartReadMPUData(){ + uint8_t I2C_AccessResult = 1; + + I2C_AccessResult &= MPUCompass_RdRegister(I2C_MPU_ADDR, MPU_REG__ACCEL_XOUT_H, NULL, 14); + + return I2C_AccessResult; +} + +uint8_t MPUCompass_CompassIDValidation(void) +{ + uint8_t CompassID[3]; + uint8_t I2C_GlobalAccessResult = 1; + //uint8_t ReturnValue = 1; + + if(MPUCompass_PowerState != 0) + { + + I2C_GlobalAccessResult = MPUCompass_RdRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__ID_A, CompassID, 3); + + if(I2C_GlobalAccessResult == 0) + { + printf("ERROR: I2C timeout during Compass ID read\n"); + return 0; + } + + if(CompassID[0] != 'H' || CompassID[1] != '4' || CompassID[2] != '3') + { + printf("ERROR: Invalid Compass ID\n"); + return 0; + } + + return 1; + } + else + { + printf("ERROR: Compass ID validation failed (Power is down)\n"); + return 0; + } + +} + +uint8_t MPUCompass_CompassConfigReg(uint8_t mag_range) +{ + uint8_t RegisterValue; + uint8_t I2C_GlobalAccessResult = 1; + + if(MPUCompass_PowerState != 0) + { + + // Initialize Config Register A + /*RegisterValue = (0 << COMPASS_REG__CONG_A__MUST_CLR__SHIFT) & COMPASS_REG__CONG_A__MUST_CLR__MASK; + RegisterValue |= (0 << COMPASS_REG__CONG_A__SAMPLE_FOR_AVG__SHIFT) & COMPASS_REG__CONG_A__SAMPLE_FOR_AVG__MASK; + RegisterValue |= (0 << COMPASS_REG__CONG_A__OUTPUT_RATE__SHIFT) & COMPASS_REG__CONG_A__OUTPUT_RATE__MASK; + RegisterValue |= (0 << COMPASS_REG__CONG_A__MEAS_CONF__SHIFT) & COMPASS_REG__CONG_A__MEAS_CONF__MASK;*/ + RegisterValue = (COMPASS_SAMPLE_AVG << 5) + (COMPASS_DATA_OUT << 2) + COMPASS_MEASURE; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__CONF_A, RegisterValue); + + // Initialize Config Register B + /*RegisterValue = (0 << COMPASS_REG__CONG_B__GAIN__SHIFT) & COMPASS_REG__CONG_B__GAIN__MASK; + RegisterValue |= (0 << COMPASS_REG__CONG_B__MUST_CLR__SHIFT) & COMPASS_REG__CONG_B__MUST_CLR__MASK;*/ + RegisterValue = (mag_range << 5); + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__CONF_B, RegisterValue); + + + // Initialize Mode register + //RegisterValue = (0x20 << COMPASS_REG__MODE__MUST_CLR__SHIFT) & COMPASS_REG__MODE__MUST_CLR__MASK; + //RegisterValue |= (1 << COMPASS_REG__MODE__OPERATE_MODE__SHIFT) & COMPASS_REG__MODE__OPERATE_MODE__MASK; + RegisterValue = COMPASS_MODE; + I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__MODE, RegisterValue); + /* + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_COMPASS_ADDR+1, COMPASS_REG__CONF_A, &RegisterValue, 1); + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_COMPASS_ADDR+1, COMPASS_REG__CONF_B, &RegisterValue, 1); + I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_COMPASS_ADDR+1, COMPASS_REG__MODE, &RegisterValue, 1);*/ + + + if(I2C_GlobalAccessResult == 0) + { + printf("ERROR: Compass config register FAILED (I2C timeout).\n"); + } + + return I2C_GlobalAccessResult; + } + else + { + printf("ERROR: Compass config register FAILED (Power is down)\n"); + return 0; + } + +} + + +uint8_t MPUCompass_CompassSetFreq(MPUCompassSamplingFreq_TypeDef SamplingFreq) +{ + uint16_t timer_period = 655; + + if(MPUCompass_CompassAcqState == 0) + { + // Disabling the timer + TIM_Cmd(TIM10, DISABLE); + + // Set timer period + if (SamplingFreq==MPUCOMPASS_50Hz) timer_period = 655;//655; //50.0275 Hz + if (SamplingFreq==MPUCOMPASS_100Hz || SamplingFreq==MPUCOMPASS_200Hz) timer_period = 327; //100.208 Hz + //if (SamplingFreq==MPUCOMPASS_200Hz) timer_period = 163; // 201.031 Hz + + TIM_TimebaseCompassInit.TIM_Period = timer_period; + TIM_TimeBaseInit(TIM10, &TIM_TimebaseCompassInit); + + // Set sample reading time + TIM_OCCompassInit.TIM_Pulse = timer_period - 52; + TIM_OC1Init(TIM10, &TIM_OCCompassInit); + + // Enabling the timer + TIM_Cmd(TIM10, ENABLE); + } + + return 1; + +} + +uint8_t MPUCompass_CompassInitiateSingleMeasure(void) +{ + uint8_t RegisterValue; + uint8_t I2C_AccessResult = 1; + + + /*RegisterValue = (0 << COMPASS_REG__MODE__MUST_CLR__SHIFT) & COMPASS_REG__MODE__MUST_CLR__MASK; + RegisterValue |= (1 << COMPASS_REG__MODE__OPERATE_MODE__SHIFT) & COMPASS_REG__MODE__OPERATE_MODE__MASK;*/ + RegisterValue = COMPASS_MODE_SINGLE; + I2C_AccessResult &= MPUCompass_WrRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__MODE, RegisterValue); + + return I2C_AccessResult; + +} + +void MPUCompass_WaitDataReady(void){ + // uint8_t Status=0; + //while ((Status&0x01)==0){*/ + //MPUCompass_RdRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__STATUS, &Status, 1); + //MPUCompass_RdRegister(I2C_COMPASS_RD_ADDR, COMPASS_REG__STATUS, NULL, 1); + MPUCompass_RdRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__STATUS, NULL, 1); + //msWait(1); + //} +} + + +/*uint8_t MPUCompass_ReadMegnetoData(int16_t * MagnetoXYZData) +{ + uint8_t I2C_GlobalAccessResult = 1; + uint8_t RegisterValue[6]={0,0,0,0,0,0}; + uint8_t Status=0; + //uint8_t test=0; + + MPUCompass_WaitDataReady(); + //RegisterValue[0] = (COMPASS_SAMPLE_AVG << 5) + (COMPASS_DATA_OUT << 2) + COMPASS_MEASURE; + //I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_COMPASS_ADDR, COMPASS_REG__CONF_A, RegisterValue[0], false); + + I2C_GlobalAccessResult = MPUCompass_RdRegister(I2C_COMPASS_ADDR, COMPASS_REG__DATA_X_MSB, RegisterValue,6); + + MagnetoXYZData[0] = ((int16_t)(RegisterValue[0]) << 8) | RegisterValue[1]; + MagnetoXYZData[1] = ((int16_t)(RegisterValue[4]) << 8) | RegisterValue[5]; + MagnetoXYZData[2] = ((int16_t)(RegisterValue[2]) << 8) | RegisterValue[3]; + + //I2C_GlobalAccessResult &= MPUCompass_RdRegister(I2C_COMPASS_ADDR+1, COMPASS_REG__STATUS, &Status, 1); + + //I2C_GlobalAccessResult &= MPUCompass_WrRegister(I2C_COMPASS_ADDR, COMPASS_REG__DATA_X_MSB, 0, true); + return I2C_GlobalAccessResult; + +}*/ + +uint8_t MPUCompass_StartReadMagnetoData(){ + uint8_t I2C_GlobalAccessResult = 1; + + MPUCompass_WaitDataReady(); + //I2C_GlobalAccessResult = MPUCompass_RdRegister(I2C_COMPASS_ADDR, COMPASS_REG__DATA_X_MSB, NULL, 6); + + return I2C_GlobalAccessResult; + +} + +void MPUCompass_CompassInitTimer(void) +{ + + // Enabling TIM10 peripheral clock + RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE); + + // Disabling the timer + TIM_Cmd(TIM10, DISABLE); + + // Configuring TIM10 timebase + TIM_TimeBaseInit(TIM10, &TIM_TimebaseCompassInit); + + TIM_ETRClockMode2Config(TIM10, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); + + // Enabling auto-reload preload + TIM_ARRPreloadConfig(TIM10, ENABLE); + + // Configuring the timer output compare unit to trigger Compass read + TIM_OC1Init(TIM10, &TIM_OCCompassInit); + + // Reseting counter + TIM_SetCounter(TIM10, 0); + + // Updating shadow registers + TIM10->EGR = 0x0001; + + // Enabling the timer + TIM_Cmd(TIM10, ENABLE); + +} + +void MPUCompass_CompassStart(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + //Compass_BufferReady[0] = false; + //Compass_BufferReady[1] = false; + + Compass_BufRdPtr = Compass_BufWrPtr = 0; + + MPUCompass_CompassStartAcq = 1; + MPUCompass_CompassAcqState = 1; + + // Clearing timer update flag and enabling timer interrupt : + // update inetrrupt and capture compare 1 interrupt + TIM_ClearITPendingBit(TIM10, TIM_IT_Update/* | TIM_IT_CC1*/); + TIM_ITConfig(TIM10, TIM_IT_Update /*| TIM_FLAG_CC1*/, ENABLE); + + // Enable the TIM10 global Interrupt + NVIC_InitStructure.NVIC_IRQChannel = TIM10_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + +} + +void MPUCompass_CompassStop(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + // Disabling the TIM10 global Interrupt + NVIC_InitStructure.NVIC_IRQChannel = TIM10_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure); + + MPUCompass_CompassAcqState = 0; + +} + +uint8_t MPUCompass_CompassSync(void) +{ + + //if(MPUCompass_PowerState == 1 && MPUCompass_MPUConfigState == 1 && MPUCompass_MPUWakeState == 1 && MPUCompass_MPUAcqState == 0) + { + // Wait for the rising edge of the MPU data ready signal + __disable_irq(); + SysTick_Timeout = 10; + __enable_irq(); + + while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) != 0 && SysTick_Timeout != 0); + while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) != 1 && SysTick_Timeout != 0); + + // Disabling the timer + TIM_Cmd(TIM10, DISABLE); + + // Reseting counter + TIM_SetCounter(TIM10, 0); + + // Updating shadow registers + TIM10->EGR = 0x0001; + + // Enabling the timer + TIM_Cmd(TIM10, ENABLE); + + if(SysTick_Timeout == 0) + { + printf("ERROR: Compass fail to sync on MPU data ready\n"); + return 0; + } + + return 1; + } + + return 0; + +} + +/******************************************************************************* + * Function Name : MPUCompass_WrRegister. + * Description : Write to MPU or Compass according to the I2C_Address. + * + * ***CAUTION***: If Compass is to be access, the MPU MUST be + * configured in Pass-Through Mode before compass register + * access and put back to I2C Master Mode after compass + * register access. + * + * Input : I2C_Address : I2C address of the chip to write to + * RegisterAddress : Register address to write to + * RegisterValue : register value to write in pointed register + * Return : Access result (1=OK, 0=timeout). + *******************************************************************************/ +uint8_t MPUCompass_WrRegister(uint8_t I2C_Address, uint8_t RegisterAddress, uint8_t RegisterValue) +{ + uint16_t timeout = 0xFFFF; + + // Verify that the I2C bus is idle + while(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE && (timeout--)>0); + if (timeout==0) + return 0; + + /*if(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE) + { + return 0; + }*/ + + // Prepare writing structure + I2C_WriteStructure.I2CAddress = I2C_Address; + I2C_WriteStructure.RegisterAddress = RegisterAddress; + I2C_WriteStructure.RegisterValue = RegisterValue; + + // Start I2C write + MPUCompass_I2CState = MPUCOMPASS_I2C_WRITING; + MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_START; + + // Enabling I2C interrupt + I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, ENABLE); + + // Generating START condition + I2C_GenerateSTART(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + timeout = 0xFFFF; + + while(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE && (timeout--)>0) + { +// printf("Sw\n"); + + //SB POWER MANAGEMENT OFF + #ifdef POWER_MANAGE + if (isModuleOnline(MODULE_DATALOGGER)){ + if(SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_BSY) == RESET) // Wait for data write complete on card before sleeping + PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI); + }else{ + PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI); + } + #endif + } + + if (timeout==0) + return 0; + +// printf("SwF\n"); + + return 1; + +} + +/******************************************************************************* + * Function Name : MPUCompass_RdRegister. + * Description : Write to MPU or Compass according to the I2C_Address. + * + * ***CAUTION***: If Compass is to be access, the MPU MUST be + * configured in Pass-Through Mode before compass register + * access and put back to I2C Master Mode after compass + * register access. + * + * Input : I2C_Address : I2C address of the chip to write to + * RegisterAddress : Register address to read from + * RegisterValue : Pointer to readed register value. If NULL, the function will block + * until data is fully received. + * Return : Access result (1=OK, 0=timeout). + *******************************************************************************/ +uint8_t MPUCompass_RdRegister(uint8_t I2C_Address, uint8_t RegisterAddress, uint8_t * RegisterValue, uint8_t BurstLength) +{ + uint16_t timeout=0xFFFF; + + // Verify that the I2C bus is idle + while(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE && (timeout--)>0); + if (timeout==0) + return 0; + /* if(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE) + { + return 0; + }*/ + + // Prepare reading structure + I2C_ReadStructure.I2CAddress = I2C_Address; + I2C_ReadStructure.RegisterAddress = RegisterAddress; + I2C_ReadStructure.RegisterValue = RegisterValue; + I2C_ReadStructure.BurstLength = BurstLength; + + // Start I2C read + MPUCompass_I2CState = MPUCOMPASS_I2C_READING; + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_START; + + // Use DMA + DMA_SetCurrDataCounter(DMA1_Channel7,BurstLength); + + //DMA + DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, true); + I2C_DMACmd(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + // Enable DMA Channel + DMA_Cmd(DMA1_Channel7, ENABLE); + + // Set LAST bit (to generate NACK automatically) + if (BurstLength>1) I2C_DMALastTransferCmd(I2C_MPUCOMPASS_PERIPHERAL_ID,true); + + // Enabling I2C interrupt + I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, ENABLE); + + // Generating START condition + I2C_GenerateSTART(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + // If RegisterValue isn't NULL, we block until we get some results + if (RegisterValue!=NULL){ + timeout=0xFFFF; + while(MPUCompass_I2CState != MPUCOMPASS_I2C_IDLE && (timeout--)>0) + { + //debug_printf("."); + //SB POWER MANAGEMENT OFF + #ifdef POWER_MANAGE + if (isModuleOnline(MODULE_DATALOGGER)){ + if(SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_BSY) == RESET) // Wait for data write complete on card before sleeping + PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI); + }else{ + PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI); + } + #endif + //debug_printf("\n"); + // printf("W\n"); + } + + if (timeout==0){ + return 0; + } + + memcpy(RegisterValue, &MPU_DMA, BurstLength); + } + return 1; + +} + +void EXTI9_5_IRQHandler(void) +{ + + //static uint8_t MPUReadResult; + + if(EXTI_GetITStatus(EXTI_Line5) != RESET) + { + // Special case: if we are in lowpower (off) mode, manually debounce the button + if (Power_IsInStopMode()/* || Power_GetState()==POWER_STATE_LOWBAT*/){ + + + // Manual debouncing + msWait(PUSH_BUTTON_DEBOUNCE_TICK_LOWPOW); + if (PushButton_GetPinState(&PowerButton)){ + EXTI_ClearITPendingBit(EXTI_Line5); + return; // False reading + } + + Buzzer_Start(100); + + led(LED_RED, true, HIGH_PRIORITY); + msWait(50); + led(LED_RED, false, HIGH_PRIORITY); + + update_timestampRTC(); + if (PowerButton.FirstActivationTimeStamp + 3 < timestamp){ + PowerButton.FirstActivationTimeStamp = timestamp; + PowerButton.NbrOfPress = 0; + } + PowerButton.NbrOfPress++; + //PushButton_UpdateState(&PowerButton); + PowerButton.State = ACTIVE; + PushButton_PowerButtonUpdateAction(); + EXTI_ClearITPendingBit(EXTI_Line5); + return; + } + + PushButton_UpdateState(&PowerButton); +/* + if (PushButton_GetState(&PowerButton) == ACTIVE){ + PushButton_Reset(&PowerButton); + __disable_irq(); + SysTick_DelayDownCounter = 5000; + __enable_irq(); + //PowerDown_NbrOfPress++; + PowerButton.NbrOfPress++; + Buzzer_Start(20); + }*/ + + if (!isModuleOnline(MODULE_ACC) && !isModuleOnline(MODULE_GYRO)){ + EXTI_ClearITPendingBit(EXTI_Line5); + return; + } + + //MPUReadResult = + MPUCompass_StartReadMPUData(); + + /*if(MPUReadResult == 0){ + AccelX_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + AccelY_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + AccelZ_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + + GyroX_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + GyroY_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + GyroZ_1s[MPU_BufWrPtr][MPU_SampleNumber] = 0xFFFF; + } */ + + /* Clear interrupt pending bit */ + EXTI_ClearITPendingBit(EXTI_Line5); + } + +} + +void I2C1_EV_IRQHandler(void) +{ + //static uint8_t DataIndex=0; + + if(MPUCompass_I2CState == MPUCOMPASS_I2C_WRITING) + { + switch(MPUCompass_I2CWrState) + { + case MPUCOMPASS_I2CWR_START : + /* ----- Event EV5 ------ */ + + // Waiting for SB, MSL and BUSY flags (SB could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_MODE_SELECT) == SUCCESS) + { + // Send address for write + I2C_Send7bitAddress(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_WriteStructure.I2CAddress, I2C_Direction_Transmitter); + MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_ICADDR_1; + } + break; + + case MPUCOMPASS_I2CWR_ICADDR_1 : + /* ----- Event EV6 ------ */ + + // Waiting for BUSY, MSL, ADDR, TXE and TRA flags (ADDR, and TXE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == SUCCESS) + { + MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_ICADDR_2; + } + break; + + case MPUCOMPASS_I2CWR_ICADDR_2 : + /* ----- Event EV8_1 ------ */ + + // Waiting for TRA, BUSY, MSL, TXE flags (TXE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_BYTE_TRANSMITTING) == SUCCESS) + { + // Writting register address to the MPU + I2C_SendData(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_WriteStructure.RegisterAddress); + MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_REGADDR; + } + break; + + case MPUCOMPASS_I2CWR_REGADDR : + /* ----- Event EV8 ------ */ + + // Waiting for TRA, BUSY, MSL, TXE flags (TXE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_BYTE_TRANSMITTING) == SUCCESS) + { + // Writing register Value to the MPU + I2C_SendData(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_WriteStructure.RegisterValue); + MPUCompass_I2CWrState = MPUCOMPASS_I2CWR_REGVAL; + } + break; + + case MPUCOMPASS_I2CWR_REGVAL : + /* ----- Event EV8_2 ------ */ + + // Waiting for TRA, BUSY, MSL, TXE and BTF flags (TXE and BTF could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_BYTE_TRANSMITTED) == SUCCESS) + { + // Generating STOP condition + I2C_GenerateSTOP(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + // Disabling I2C interrupt + I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, DISABLE); + + MPUCompass_I2CState = MPUCOMPASS_I2C_IDLE; + } + break; + + default: + break; + } + + } + else if(MPUCompass_I2CState == MPUCOMPASS_I2C_READING) + { + switch(MPUCompass_I2CRdState) + { + case MPUCOMPASS_I2CRD_START : + /* ----- Event EV5 ------ */ + + // Waiting for SB, MSL and BUSY flags (SB could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_MODE_SELECT) == SUCCESS) + { + // Send I2C address for write + I2C_Send7bitAddress(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_ReadStructure.I2CAddress, I2C_Direction_Transmitter); + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_ICADDR_1; + } + break; + + case MPUCOMPASS_I2CRD_ICADDR_1 : + /* ----- Event EV6 ------ */ + + // Waiting for BUSY, MSL, ADDR, TXE and TRA flags (ADDR and TXE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == SUCCESS) + { + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_ICADDR_2; + } + break; + + case MPUCOMPASS_I2CRD_ICADDR_2 : + /* ----- Event EV8_1 ------ */ + + // Waiting for TRA, BUSY, MSL, TXE flags (TXE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_BYTE_TRANSMITTING) == SUCCESS) + { + // Writting register address to the MPU + I2C_SendData(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_ReadStructure.RegisterAddress); + + // Generating ReSTART condition + I2C_GenerateSTART(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_REGADDR; + } + break; + + case MPUCOMPASS_I2CRD_REGADDR : + /* ----- Event EV5 ------ */ + + // Waiting for SB, MSL and BUSY flags (SB could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_MODE_SELECT) == SUCCESS) + { + + // Disabling I2C interrupt + // I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, DISABLE); + + // Send I2C address for read + I2C_Send7bitAddress(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_ReadStructure.I2CAddress, I2C_Direction_Receiver); + + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_RESTART; + + } + break; + + case MPUCOMPASS_I2CRD_RESTART : + //----- Event EV6 ------ + + // Waiting for BUSY, MSL and ADDR flags (ADDR could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) == SUCCESS) + { + //DataIndex = 0; + if(I2C_ReadStructure.BurstLength > 1) + { + //MANAGED WITH DMA + // Enabling receive ack to generate ACK after next received byte + I2C_AcknowledgeConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + } + else + { + // Disabling receive ack to generate NoACK after next received byte + I2C_AcknowledgeConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, DISABLE); + + // Enabling STOP condition generation + //I2C_GenerateSTOP(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + } + MPUCompass_I2CRdState = MPUCOMPASS_I2CRD_DATA; + + I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, DISABLE); + } + break; + + /*case MPUCOMPASS_I2CRD_DATA : + // ----- Event EV7_1 ------ + + // Waiting for BUSY, MSL and RXNE flags (RXNE could interrupt the CPU) + if(I2C_CheckEvent(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_EVENT_MASTER_BYTE_RECEIVED) == SUCCESS) + { + // Reading received data byte (MSB) + I2C_ReadStructure.RegisterValue[DataIndex] = I2C_ReceiveData(I2C_MPUCOMPASS_PERIPHERAL_ID); + + DataIndex++; + if(DataIndex == I2C_ReadStructure.BurstLength - 1) + { + // Disabling receive ack to generate NoACK after next received byte + I2C_AcknowledgeConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, DISABLE); + + // Enabling STOP condition generation + I2C_GenerateSTOP(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + } + else if(DataIndex == I2C_ReadStructure.BurstLength) + { + // Disabling I2C interrupt + I2C_ITConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, I2C_IT_BUF | I2C_IT_EVT, DISABLE); + + MPUCompass_I2CState = MPUCOMPASS_I2C_IDLE; + } + } + break;*/ + + default: + break; + } + } + else + { + //printf("X"); + } + +} + +void TIM10_IRQHandler(void) +{ + //static int16_t MagnetoXYZData[3]; + // static uint8_t MagnetoReadResult; + uint16_t timeout = 0xFFFF; + + if(TIM_GetITStatus(TIM10, TIM_IT_Update) == SET) + { + TIM_ClearFlag(TIM10, TIM_FLAG_Update); + TIM_ClearITPendingBit(TIM10, TIM_IT_Update); + + while (I2C_GetFlagStatus(I2C_MPUCOMPASS_PERIPHERAL_ID,I2C_FLAG_BUSY)==SET && (--timeout)>0); + + if (timeout>0){ + //MPUCompass_StartReadMagnetoData(); + MPUCompass_CompassInitiateSingleMeasure(); + MPUCompass_WaitDataReady(); + + } + } + + + if(TIM_GetITStatus(TIM10, TIM_IT_CC1) == SET) + { + TIM_ClearFlag(TIM10, TIM_FLAG_CC1); + TIM_ClearITPendingBit(TIM10, TIM_IT_CC1); + } + +} + +void DMA1_Channel7_IRQHandler(void){ + + // Disabling receive ack to generate NoACK after next received byte + //I2C_AcknowledgeConfig(I2C_MPUCOMPASS_PERIPHERAL_ID, DISABLE); + + // Enabling STOP condition generation + I2C_GenerateSTOP(I2C_MPUCOMPASS_PERIPHERAL_ID, ENABLE); + + MPUCompass_I2CState = MPUCOMPASS_I2C_IDLE; + //DMA + DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, false); + + // Disable DMA Channel + DMA_Cmd(DMA1_Channel7, DISABLE); + I2C_DMACmd(I2C_MPUCOMPASS_PERIPHERAL_ID, DISABLE); + I2C_DMALastTransferCmd(I2C_MPUCOMPASS_PERIPHERAL_ID, false); + + // Check if we need to do something with the data + + // ACCELERO / GYRO + if(I2C_ReadStructure.RegisterAddress==MPU_REG__ACCEL_XOUT_H){ //MPU Data + + AccelX_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[0]) << 8) | MPU_DMA[1]; + AccelY_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[2]) << 8) | MPU_DMA[3]; + AccelZ_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[4]) << 8) | MPU_DMA[5]; + + GyroX_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[8]) << 8) | MPU_DMA[9]; + GyroY_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[10]) << 8) | MPU_DMA[11]; + GyroZ_1s[MPU_BufWrPtr][MPU_SampleNumber] = ((int16_t)(MPU_DMA[12]) << 8) | MPU_DMA[13]; + + MPU_SampleNumber++; + + MPU_NewValue = true; + //GyroNewValue = true; + + //led_toggle(LED_RED); + + if(MPU_SampleNumber >= MPUCompass_SamplingFrequency) + { + MPU_SampleNumber = 0; + //MPU_BufferReady[MPU_BufWrPtr] = true; + //Gyro_BufferReady[MPU_BufWrPtr] = true; + + MPU_BufWrPtr++; + if(MPU_BufWrPtr > 1) + MPU_BufWrPtr = 0; + + } + } + + // MAGNETO + if (I2C_ReadStructure.RegisterAddress==COMPASS_REG__STATUS){ + //Data ready signal + //if ((MPU_DMA[0]&0x03)==3 || MPU_DMA[0]==0x11 ){ // Status register: ready and locked + if ((MPU_DMA[0]&0x01)==1){ // Status register: ready and locked + DMA_ClearITPendingBit(DMA1_IT_TC7); + MPUCompass_RdRegister(I2C_COMPASS_WR_ADDR, COMPASS_REG__DATA_X_MSB, NULL, 6); //Data is ready, read! + return; + } + else{ + MPUCompass_WaitDataReady(); + } + } + if (I2C_ReadStructure.RegisterAddress==COMPASS_REG__DATA_X_MSB){ + + MagnetoX_1s[Compass_BufWrPtr][Compass_SampleNumber] = ((int16_t)(MPU_DMA[0]) << 8) | MPU_DMA[1]; + MagnetoZ_1s[Compass_BufWrPtr][Compass_SampleNumber] = ((int16_t)(MPU_DMA[2]) << 8) | MPU_DMA[3]; + MagnetoY_1s[Compass_BufWrPtr][Compass_SampleNumber] = ((int16_t)(MPU_DMA[4]) << 8) | MPU_DMA[5]; + + Compass_SampleNumber++; + Mag_NewValue = true; + if(Compass_SampleNumber == MPUCompass_SamplingFrequency) + { + Compass_SampleNumber = 0; + //Compass_BufferReady[Compass_BufWrPtr] = true; + Compass_BufWrPtr++; + if(Compass_BufWrPtr > 1) + Compass_BufWrPtr = 0; + } + } + + DMA_ClearITPendingBit(DMA1_IT_TC7); + +} diff --git a/Firmware/WIMU3/src/MS__mass_mal.c b/Firmware/WIMU3/src/MS__mass_mal.c new file mode 100644 index 0000000..c2c3752 --- /dev/null +++ b/Firmware/WIMU3/src/MS__mass_mal.c @@ -0,0 +1,166 @@ +/** + ****************************************************************************** + * @file mass_mal.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Medium Access Layer interface + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "platform_config.h" +#include "MS__mass_mal.h" +#include +#include "config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint32_t Mass_Memory_Size[2]; +uint32_t Mass_Block_Size[2]; +uint32_t Mass_Block_Count[2]; +__IO uint32_t Status = 0; + + + +#ifdef SDHC +extern uint8_t flag_SDHC; +#endif + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/******************************************************************************* +* Function Name : MAL_Init +* Description : Initializes the Media on the STM32 +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint16_t MAL_Init(uint8_t lun) +{ + #ifdef SHOW_DEBUG_PRINTF + printf("Entering MAL_Init()\n"); + #endif + + uint16_t status = MAL_OK; + + switch (lun) + { + case 0: + Status = SD_Init(); + break; + default: + return MAL_FAIL; + } + return status; +} +/******************************************************************************* +* Function Name : MAL_Write +* Description : Write sectors +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint16_t MAL_Write(uint8_t lun, uint64_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length) +{ + switch (lun) + { + case 0: + Status = SD_WriteMultiBlocks((uint8_t*)Writebuff, Memory_Offset, Transfer_Length,1); + break; + default: + return MAL_FAIL; + } + return MAL_OK; +} + +/******************************************************************************* +* Function Name : MAL_Read +* Description : Read sectors +* Input : None +* Output : None +* Return : Buffer pointer +*******************************************************************************/ +uint16_t MAL_Read(uint8_t lun, uint64_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length) +{ + switch (lun) + { + case 0: + + SD_ReadMultiBlocks((uint8_t*)Readbuff, Memory_Offset, Transfer_Length, 1); + break; + default: + return MAL_FAIL; + } + return MAL_OK; +} + +/******************************************************************************* +* Function Name : MAL_GetStatus +* Description : Get status +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +uint16_t MAL_GetStatus (uint8_t lun) +{ + #ifdef SHOW_DEBUG_PRINTF + printf("Entering MAL_GetStatus()\n"); + #endif + + SD_CSD SD_csd; + uint32_t DeviceSizeMul = 0; + + + if (lun == 0) + { + SD_GetCSDRegister(&SD_csd); +#ifdef SDHC + if(flag_SDHC ==1) + { + Mass_Block_Count[0] = ((uint32_t)(SD_csd.DeviceSize + 1))*1024 ; + Mass_Block_Size[0] = 512; + Mass_Memory_Size[0] = Mass_Block_Count[0]*Mass_Block_Size[0]; + } + else +#endif //SDHC + { + uint32_t temp_block_mul = 0; + DeviceSizeMul = SD_csd.DeviceSizeMul + 2; + temp_block_mul = (1 << SD_csd.RdBlockLen)/ 512; + Mass_Block_Count[0] = ((SD_csd.DeviceSize + 1) * (1 << (DeviceSizeMul))) * temp_block_mul; + Mass_Block_Size[0] = 512; + + Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]); + } + +// STM_EVAL_LEDOn(LED2); + return MAL_OK; + + } +// STM_EVAL_LEDOn(LED2); + return MAL_FAIL; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/src/MS__memory.c b/Firmware/WIMU3/src/MS__memory.c new file mode 100644 index 0000000..c267128 --- /dev/null +++ b/Firmware/WIMU3/src/MS__memory.c @@ -0,0 +1,201 @@ +/** + ****************************************************************************** + * @file memory.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Memory management layer + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "MS__memory.h" +#include "MS__usb_scsi.h" +#include "MS__usb_bot.h" +#include "usb_regs.h" +#include "usb_mem.h" +#include "usb_conf.h" +#include "Merged__hw_config.h" +#include "MS__mass_mal.h" +#include "usb_lib.h" +#include +#include "config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint32_t Block_Read_count = 0; +__IO uint32_t Block_offset; +__IO uint32_t Counter = 0; +uint32_t Idx; +uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE *2]; /* 512 bytes*/ +uint8_t TransferState = TXFR_IDLE; +/* Extern variables ----------------------------------------------------------*/ +extern uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ +extern uint16_t Data_Len; +extern uint8_t Bot_State; +extern Bulk_Only_CBW CBW; +extern Bulk_Only_CSW CSW; +extern uint32_t Mass_Memory_Size[2]; +extern uint32_t Mass_Block_Size[2]; + + + +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the microSD card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) +{ + static uint64_t Offset; + static uint32_t Length; + + if (TransferState == TXFR_IDLE ) + { + Offset = (uint64_t)Memory_Offset * Mass_Block_Size[lun]; + Length = Transfer_Length * Mass_Block_Size[lun]; + TransferState = TXFR_ONGOING; + #ifdef SHOW_DEBUG_PRINTF + if(Memory_Offset > (0x100000000 >> 9)) + { + printf("ByteAddr:%llu\n",Offset); + printf("BlockAddr:%lu\n", Memory_Offset); + printf("BlockSize(%lu)\n", Mass_Block_Size[lun]); + } + #endif + + } + + if (TransferState == TXFR_ONGOING ) + { + if (!Block_Read_count) + { + MAL_Read(lun , + Offset , + Data_Buffer, + Mass_Block_Size[lun]); + + USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer, BULK_MAX_PACKET_SIZE); + + Block_Read_count = Mass_Block_Size[lun] - BULK_MAX_PACKET_SIZE; + Block_offset = BULK_MAX_PACKET_SIZE; + } + else + { + USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer + Block_offset, BULK_MAX_PACKET_SIZE); + + Block_Read_count -= BULK_MAX_PACKET_SIZE; + Block_offset += BULK_MAX_PACKET_SIZE; + } + + SetEPTxCount(ENDP1, BULK_MAX_PACKET_SIZE); + SetEPTxStatus(ENDP1, EP_TX_VALID); + Offset += BULK_MAX_PACKET_SIZE; + Length -= BULK_MAX_PACKET_SIZE; + + CSW.dDataResidue -= BULK_MAX_PACKET_SIZE; +// Led_RW_ON(); + } + if (Length == 0) + { + Block_Read_count = 0; + Block_offset = 0; + Offset = 0; + Bot_State = BOT_DATA_IN_LAST; + TransferState = TXFR_IDLE; +// Led_RW_OFF(); + } +} + +/******************************************************************************* +* Function Name : Write_Memory +* Description : Handle the Write operation to the microSD card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) +{ + static uint64_t W_Offset; + static uint32_t W_Length; + + uint32_t temp = Counter + 64; + + if (TransferState == TXFR_IDLE ) + { + W_Offset = (uint64_t)Memory_Offset * Mass_Block_Size[lun]; + W_Length = Transfer_Length * Mass_Block_Size[lun]; + TransferState = TXFR_ONGOING; + #ifdef SHOW_DEBUG_PRINTF + if(Memory_Offset > (0x100000000 >> 9)) + { + printf("ByteAddr:%llu\n",W_Offset); + printf("BlockAddr:%lu\n", Memory_Offset); + printf("BlockSize(%lu)\n", Mass_Block_Size[lun]); + } + #endif + } + + if (TransferState == TXFR_ONGOING ) + { + + for (Idx = 0 ; Counter < temp; Counter++) + { + *((uint8_t *)Data_Buffer + Counter) = Bulk_Data_Buff[Idx++]; + } + + W_Offset += Data_Len; + W_Length -= Data_Len; + + if (!(W_Length % Mass_Block_Size[lun])) + { + Counter = 0; + MAL_Write(lun , + W_Offset - Mass_Block_Size[lun], + Data_Buffer, + Mass_Block_Size[lun]); + } + + CSW.dDataResidue -= Data_Len; + SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ + +// Led_RW_ON(); + } + + if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) + { + Counter = 0; + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); + TransferState = TXFR_IDLE; +// Led_RW_OFF(); + } +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/src/MS__scsi_data.c b/Firmware/WIMU3/src/MS__scsi_data.c new file mode 100644 index 0000000..2200ea7 --- /dev/null +++ b/Firmware/WIMU3/src/MS__scsi_data.c @@ -0,0 +1,158 @@ +/** + ****************************************************************************** + * @file scsi_data.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Initialization of the SCSI data + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "MS__usb_scsi.h" +#include "MS__memory.h" + + +uint8_t Page00_Inquiry_Data[] = + { + 0x00, /* PERIPHERAL QUALIFIER & PERIPHERAL DEVICE TYPE*/ + 0x00, + 0x00, + 0x00, + 0x00 /* Supported Pages 00*/ + }; +uint8_t Standard_Inquiry_Data[] = + { + 0x00, /* Direct Access Device */ + 0x80, /* RMB = 1: Removable Medium */ + 0x02, /* Version: No conformance claim to standard */ + 0x02, + + 36 - 4, /* Additional Length */ + 0x00, /* SCCS = 1: Storage Controller Component */ + 0x00, + 0x00, + /* Vendor Identification */ + 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', + /* Product Identification */ + 'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ', + 'D', 'i', 's', 'k', ' ', ' ', ' ', + /* Product Revision Level */ + '1', '.', '0', ' ' + }; +uint8_t Standard_Inquiry_Data2[] = + { + 0x00, /* Direct Access Device */ + 0x80, /* RMB = 1: Removable Medium */ + 0x02, /* Version: No conformance claim to standard */ + 0x02, + + 36 - 4, /* Additional Length */ + 0x00, /* SCCS = 1: Storage Controller Component */ + 0x00, + 0x00, + /* Vendor Identification */ + 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', + /* Product Identification */ + 'N', 'A', 'N', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ', + 'D', 'i', 's', 'k', ' ', + /* Product Revision Level */ + '1', '.', '0', ' ' + }; +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +uint8_t Mode_Sense6_data[] = + { + 0x03, + 0x00, + 0x00, + 0x00, + }; + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +uint8_t Mode_Sense10_data[] = + { + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 + }; +uint8_t Scsi_Sense_Data[] = + { + 0x70, /*RespCode*/ + 0x00, /*SegmentNumber*/ + NO_SENSE, /* Sens_Key*/ + 0x00, + 0x00, + 0x00, + 0x00, /*Information*/ + 0x0A, /*AdditionalSenseLength*/ + 0x00, + 0x00, + 0x00, + 0x00, /*CmdInformation*/ + NO_SENSE, /*Asc*/ + 0x00, /*ASCQ*/ + 0x00, /*FRUC*/ + 0x00, /*TBD*/ + 0x00, + 0x00 /*SenseKeySpecific*/ + }; +uint8_t ReadCapacity10_Data[] = + { + /* Last Logical Block */ + 0, + 0, + 0, + 0, + + /* Block Length */ + 0, + 0, + 0, + 0 + }; + +uint8_t ReadFormatCapacity_Data [] = + { + 0x00, + 0x00, + 0x00, + 0x08, /* Capacity List Length */ + + /* Block Count */ + 0, + 0, + 0, + 0, + + /* Block Length */ + 0x02,/* Descriptor Code: Formatted Media */ + 0, + 0, + 0 + }; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/MS__usb_bot.c b/Firmware/WIMU3/src/MS__usb_bot.c new file mode 100644 index 0000000..d2b8436 --- /dev/null +++ b/Firmware/WIMU3/src/MS__usb_bot.c @@ -0,0 +1,360 @@ +/** + ****************************************************************************** + * @file usb_bot.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief BOT State Machine management + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "MS__usb_scsi.h" +#include "Merged__hw_config.h" +#include "usb_regs.h" +#include "usb_mem.h" +#include "usb_conf.h" +#include "MS__usb_bot.h" +#include "MS__memory.h" +#include "usb_lib.h" +#include +#include "config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint8_t Bot_State; +uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ +uint16_t Data_Len; +Bulk_Only_CBW CBW; +Bulk_Only_CSW CSW; +uint32_t SCSI_LBA , SCSI_BlkLen; +extern uint32_t Max_Lun; + + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Mass_Storage_In +* Description : Mass Storage IN transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Mass_Storage_In (void) +{ + switch (Bot_State) + { + case BOT_CSW_Send: + case BOT_ERROR: + Bot_State = BOT_IDLE; + SetEPRxStatus(ENDP2, EP_RX_VALID);/* enable the Endpoint to receive the next cmd*/ + break; + case BOT_DATA_IN: + switch (CBW.CB[0]) + { + case SCSI_READ10: + SCSI_Read10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); + break; + } + break; + case BOT_DATA_IN_LAST: + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); + SetEPRxStatus(ENDP2, EP_RX_VALID); + break; + + default: + break; + } +} + +/******************************************************************************* +* Function Name : Mass_Storage_Out +* Description : Mass Storage OUT transfer. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Mass_Storage_Out (void) +{ + uint8_t CMD; + CMD = CBW.CB[0]; + + Data_Len = USB_SIL_Read(EP2_OUT, Bulk_Data_Buff); + + switch (Bot_State) + { + case BOT_IDLE: + CBW_Decode(); + break; + case BOT_DATA_OUT: + if (CMD == SCSI_WRITE10) + { + SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); + break; + } + Bot_Abort(DIR_OUT); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); + break; + default: + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); + break; + } +} + +/******************************************************************************* +* Function Name : CBW_Decode +* Description : Decode the received CBW and call the related SCSI command +* routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void CBW_Decode(void) +{ + + uint32_t Counter; + + for (Counter = 0; Counter < Data_Len; Counter++) + { + *((uint8_t *)&CBW + Counter) = Bulk_Data_Buff[Counter]; + } + CSW.dTag = CBW.dTag; + CSW.dDataResidue = CBW.dDataLength; + if (Data_Len != BOT_CBW_PACKET_LENGTH) + { + Bot_Abort(BOTH_DIR); + /* reset the CBW.dSignature to disable the clear feature until receiving a Mass storage reset*/ + CBW.dSignature = 0; + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, PARAMETER_LIST_LENGTH_ERROR); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + return; + } + + if ((CBW.CB[0] == SCSI_READ10 ) || (CBW.CB[0] == SCSI_WRITE10 )) + { + /* Calculate Logical Block Address */ + SCSI_LBA = (CBW.CB[2] << 24) | (CBW.CB[3] << 16) | (CBW.CB[4] << 8) | CBW.CB[5]; + /* Calculate the Number of Blocks to transfer */ + SCSI_BlkLen = (CBW.CB[7] << 8) | CBW.CB[8]; + #ifdef SHOW_DEBUG_PRINTF + if(CBW.CB[0] == SCSI_READ10) + { + printf("Read10:0x%lX\n", SCSI_LBA); + } + else + { + printf("Write10:0x%lX\n", SCSI_LBA); + } + printf("Nbr of Block : %d\n", SCSI_BlkLen); + #endif + } + + if (CBW.dSignature == BOT_CBW_SIGNATURE) + { + /* Valid CBW */ + if ((CBW.bLUN > Max_Lun) || (CBW.bCBLength < 1) || (CBW.bCBLength > 16)) + { + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } + else + { + switch (CBW.CB[0]) + { + case SCSI_REQUEST_SENSE: + SCSI_RequestSense_Cmd (CBW.bLUN); + break; + case SCSI_INQUIRY: + SCSI_Inquiry_Cmd(CBW.bLUN); + break; + case SCSI_START_STOP_UNIT: + SCSI_Start_Stop_Unit_Cmd(CBW.bLUN); + break; + case SCSI_ALLOW_MEDIUM_REMOVAL: + SCSI_Start_Stop_Unit_Cmd(CBW.bLUN); + break; + case SCSI_MODE_SENSE6: + SCSI_ModeSense6_Cmd (CBW.bLUN); + break; + case SCSI_MODE_SENSE10: + SCSI_ModeSense10_Cmd (CBW.bLUN); + break; + case SCSI_READ_FORMAT_CAPACITIES: + SCSI_ReadFormatCapacity_Cmd(CBW.bLUN); + break; + case SCSI_READ_CAPACITY10: + SCSI_ReadCapacity10_Cmd(CBW.bLUN); + break; + case SCSI_TEST_UNIT_READY: + SCSI_TestUnitReady_Cmd(CBW.bLUN); + break; + case SCSI_READ10: + SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen); + break; + case SCSI_WRITE10: + SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen); + break; + case SCSI_VERIFY10: + SCSI_Verify10_Cmd(CBW.bLUN); + break; + case SCSI_FORMAT_UNIT: + SCSI_Format_Cmd(CBW.bLUN); + break; + /*Unsupported command*/ + + case SCSI_MODE_SELECT10: + SCSI_Mode_Select10_Cmd(CBW.bLUN); + break; + case SCSI_MODE_SELECT6: + SCSI_Mode_Select6_Cmd(CBW.bLUN); + break; + + case SCSI_SEND_DIAGNOSTIC: + SCSI_Send_Diagnostic_Cmd(CBW.bLUN); + break; + case SCSI_READ6: + SCSI_Read6_Cmd(CBW.bLUN); + break; + case SCSI_READ12: + SCSI_Read12_Cmd(CBW.bLUN); + break; + case SCSI_READ16: + SCSI_Read16_Cmd(CBW.bLUN); + break; + case SCSI_READ_CAPACITY16: + SCSI_READ_CAPACITY16_Cmd(CBW.bLUN); + break; + case SCSI_WRITE6: + SCSI_Write6_Cmd(CBW.bLUN); + break; + case SCSI_WRITE12: + SCSI_Write12_Cmd(CBW.bLUN); + break; + case SCSI_WRITE16: + SCSI_Write16_Cmd(CBW.bLUN); + break; + case SCSI_VERIFY12: + SCSI_Verify12_Cmd(CBW.bLUN); + break; + case SCSI_VERIFY16: + SCSI_Verify16_Cmd(CBW.bLUN); + break; + + default: + { + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } + } + } + } + else + { + /* Invalid CBW */ + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } +} + +/******************************************************************************* +* Function Name : Transfer_Data_Request +* Description : Send the request response to the PC HOST. +* Input : uint8_t* Data_Address : point to the data to transfer. +* uint16_t Data_Length : the number of Bytes to transfer. +* Output : None. +* Return : None. +*******************************************************************************/ +void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len) +{ + USB_SIL_Write(EP1_IN, Data_Pointer, Data_Len); + SetEPTxStatus(ENDP1, EP_TX_VALID); + Bot_State = BOT_DATA_IN_LAST; + CSW.dDataResidue -= Data_Len; + CSW.bStatus = CSW_CMD_PASSED; +} + +/******************************************************************************* +* Function Name : Set_CSW +* Description : Set the SCW with the needed fields. +* Input : uint8_t CSW_Status this filed can be CSW_CMD_PASSED,CSW_CMD_FAILED, +* or CSW_PHASE_ERROR. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission) +{ + CSW.dSignature = BOT_CSW_SIGNATURE; + CSW.bStatus = CSW_Status; + + USB_SIL_Write(EP1_IN, ((uint8_t *)& CSW), CSW_DATA_LENGTH); + + Bot_State = BOT_ERROR; + if (Send_Permission) + { + Bot_State = BOT_CSW_Send; + SetEPTxStatus(ENDP1, EP_TX_VALID); + } + +} + +/******************************************************************************* +* Function Name : Bot_Abort +* Description : Stall the needed Endpoint according to the selected direction. +* Input : Endpoint direction IN, OUT or both directions +* Output : None. +* Return : None. +*******************************************************************************/ +void Bot_Abort(uint8_t Direction) +{ + + #ifdef SHOW_DEBUG_PRINTF + printf("Entering Bot_Abort()\n"); + #endif + + switch (Direction) + { + case DIR_IN : + SetEPTxStatus(ENDP1, EP_TX_STALL); + break; + case DIR_OUT : + SetEPRxStatus(ENDP2, EP_RX_STALL); + break; + case BOTH_DIR : + SetEPTxStatus(ENDP1, EP_TX_STALL); + SetEPRxStatus(ENDP2, EP_RX_STALL); + break; + default: + break; + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/MS__usb_desc.c b/Firmware/WIMU3/src/MS__usb_desc.c new file mode 100644 index 0000000..9095f73 --- /dev/null +++ b/Firmware/WIMU3/src/MS__usb_desc.c @@ -0,0 +1,147 @@ +/** + ****************************************************************************** + * @file usb_desc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Descriptors for Mass Storage Device + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "MS__usb_desc.h" + +const uint8_t MASS_DeviceDescriptor[MASS_SIZ_DEVICE_DESC] = + { + 0x12, /* bLength */ + 0x01, /* bDescriptorType */ + 0x00, /* bcdUSB, version 2.00 */ + 0x02, + 0x00, /* bDeviceClass : each interface define the device class */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + 0x40, /* bMaxPacketSize0 0x40 = 64 */ + 0x83, /* idVendor (0483) */ + 0x04, + 0x20, /* idProduct */ + 0x57, + 0x00, /* bcdDevice 2.00*/ + 0x02, + 1, /* index of string Manufacturer */ + /**/ + 2, /* index of string descriptor of product*/ + /* */ + 3, /* */ + /* */ + /* */ + 0x01 /*bNumConfigurations */ + }; +const uint8_t MASS_ConfigDescriptor[MASS_SIZ_CONFIG_DESC] = + { + + 0x09, /* bLength: Configuration Descriptor size */ + 0x02, /* bDescriptorType: Configuration */ + MASS_SIZ_CONFIG_DESC, + + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + /* Configuration value */ + 0x00, /* iConfiguration: */ + /* Index of string descriptor */ + /* describing the configuration */ + 0xC0, /* bmAttributes: */ + /* bus powered */ + 0x32, /* MaxPower 100 mA */ + + /******************** Descriptor of Mass Storage interface ********************/ + /* 09 */ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MASS STORAGE Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 4, /* iInterface: */ + /* 18 */ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + 0x81, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + 0x40, /*Maximum packet size (64 bytes) */ + 0x00, + 0x00, /*Polling interval in milliseconds */ + /* 25 */ + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + 0x02, /*Endpoint address (OUT, address 2) */ + 0x02, /*Bulk endpoint type */ + 0x40, /*Maximum packet size (64 bytes) */ + 0x00, + 0x00 /*Polling interval in milliseconds*/ + /*32*/ + }; +const uint8_t MASS_StringLangID[MASS_SIZ_STRING_LANGID] = + { + MASS_SIZ_STRING_LANGID, + 0x03, + 0x09, + 0x04 + } + ; /* LangID = 0x0409: U.S. English */ +const uint8_t MASS_StringVendor[MASS_SIZ_STRING_VENDOR] = + { + MASS_SIZ_STRING_VENDOR, /* Size of manufacturer string */ + 0x03, /* bDescriptorType = String descriptor */ + /* Manufacturer: "STMicroelectronics" */ + 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, + 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, + 'c', 0, 's', 0 + }; +const uint8_t MASS_StringProduct[MASS_SIZ_STRING_PRODUCT] = + { + MASS_SIZ_STRING_PRODUCT, + 0x03, + /* Product name: "STM32F10x:USB Mass Storage" */ + 'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, + 's', 0, ' ', 0, 'S', 0, 't', 0, 'o', 0, 'r', 0, 'a', 0, 'g', 0, 'e', 0 + + }; + +uint8_t MASS_StringSerial[MASS_SIZ_STRING_SERIAL] = + { + MASS_SIZ_STRING_SERIAL, + 0x03, + /* Serial number*/ + 'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, 'L', 0, '1', 0 + }; +const uint8_t MASS_StringInterface[MASS_SIZ_STRING_INTERFACE] = + { + MASS_SIZ_STRING_INTERFACE, + 0x03, + /* Interface 0: "ST Mass" */ + 'S', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0 + }; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/MS__usb_prop.c b/Firmware/WIMU3/src/MS__usb_prop.c new file mode 100644 index 0000000..510f71a --- /dev/null +++ b/Firmware/WIMU3/src/MS__usb_prop.c @@ -0,0 +1,440 @@ +/** + ****************************************************************************** + * @file usb_prop.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to Mass Storage Demo + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "usb_lib.h" +#include "MS__usb_desc.h" +#include "usb_pwr.h" +#include "MS__usb_bot.h" +#include "MS__memory.h" +#include "MS__mass_mal.h" +#include "MS__usb_prop.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint32_t Max_Lun = 0; + +DEVICE MS__Device_Table = + { + MS__EP_NUM, + 1 + }; + +DEVICE_PROP MS__Device_Property = + { + MASS_init, + MASS_Reset, + MASS_Status_In, + MASS_Status_Out, + MASS_Data_Setup, + MASS_NoData_Setup, + MASS_Get_Interface_Setting, + MASS_GetDeviceDescriptor, + MASS_GetConfigDescriptor, + MASS_GetStringDescriptor, + 0, + 0x40 /*MAX PACKET SIZE*/ + }; + +USER_STANDARD_REQUESTS MS__User_Standard_Requests = + { + Mass_Storage_GetConfiguration, + Mass_Storage_SetConfiguration, + Mass_Storage_GetInterface, + Mass_Storage_SetInterface, + Mass_Storage_GetStatus, + Mass_Storage_ClearFeature, + Mass_Storage_SetEndPointFeature, + Mass_Storage_SetDeviceFeature, + Mass_Storage_SetDeviceAddress + }; + +ONE_DESCRIPTOR MS__Device_Descriptor = + { + (uint8_t*)MASS_DeviceDescriptor, + MASS_SIZ_DEVICE_DESC + }; + +ONE_DESCRIPTOR MS__Config_Descriptor = + { + (uint8_t*)MASS_ConfigDescriptor, + MASS_SIZ_CONFIG_DESC + }; + +ONE_DESCRIPTOR MS__String_Descriptor[5] = + { + {(uint8_t*)MASS_StringLangID, MASS_SIZ_STRING_LANGID}, + {(uint8_t*)MASS_StringVendor, MASS_SIZ_STRING_VENDOR}, + {(uint8_t*)MASS_StringProduct, MASS_SIZ_STRING_PRODUCT}, + {(uint8_t*)MASS_StringSerial, MASS_SIZ_STRING_SERIAL}, + {(uint8_t*)MASS_StringInterface, MASS_SIZ_STRING_INTERFACE}, + }; + +DEVICE Device_Table; +DEVICE_PROP Device_Property; +USER_STANDARD_REQUESTS User_Standard_Requests; +ONE_DESCRIPTOR Device_Descriptor; +ONE_DESCRIPTOR Config_Descriptor; +ONE_DESCRIPTOR *String_Descriptor; +uint16_t IMR_MSK; + + + +/* Extern variables ----------------------------------------------------------*/ +extern unsigned char Bot_State; +extern Bulk_Only_CBW CBW; +extern DEVICE_PROP Device_Property; + +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/******************************************************************************* +* Function Name : MASS_init +* Description : Mass Storage init routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void MASS_init() +{ + /* Update the serial number string descriptor with the data from the unique + ID*/ + Get_SerialNum(); + + pInformation->Current_Configuration = 0; + + /* Connect the device */ + PowerOn(); + + /* Perform basic device initialization operations */ + USB_SIL_Init(); + + bDeviceState = UNCONNECTED; +} + +/******************************************************************************* +* Function Name : MASS_Reset +* Description : Mass Storage reset routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void MASS_Reset() +{ + /* Set the device as not configured */ + Device_Info.Current_Configuration = 0; + + /* Current Feature initialization */ + pInformation->Current_Feature = MASS_ConfigDescriptor[7]; + + + SetBTABLE(MS__BTABLE_ADDRESS); + + /* Initialize Endpoint 0 */ + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_NAK); + SetEPRxAddr(ENDP0, MS__ENDP0_RXADDR); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPTxAddr(ENDP0, MS__ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxValid(ENDP0); + + /* Initialize Endpoint 1 */ + SetEPType(ENDP1, EP_BULK); + SetEPTxAddr(ENDP1, MS__ENDP1_TXADDR); + SetEPTxStatus(ENDP1, EP_TX_NAK); + SetEPRxStatus(ENDP1, EP_RX_DIS); + + /* Initialize Endpoint 2 */ + SetEPType(ENDP2, EP_BULK); + SetEPRxAddr(ENDP2, MS__ENDP2_RXADDR); + SetEPRxCount(ENDP2, Device_Property.MaxPacketSize); + SetEPRxStatus(ENDP2, EP_RX_VALID); + SetEPTxStatus(ENDP2, EP_TX_DIS); + + + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + + /* Set the device to response on default address */ + SetDeviceAddress(0); + + + bDeviceState = ATTACHED; + + CBW.dSignature = BOT_CBW_SIGNATURE; + Bot_State = BOT_IDLE; + +// USB_NotConfigured_LED(); +} + +/******************************************************************************* +* Function Name : Mass_Storage_SetConfiguration +* Description : Handle the SetConfiguration request. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Mass_Storage_SetConfiguration(void) +{ + if (pInformation->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + + ClearDTOG_TX(ENDP1); + ClearDTOG_RX(ENDP2); + + Bot_State = BOT_IDLE; /* set the Bot state machine to the IDLE state */ + } +} + +/******************************************************************************* +* Function Name : Mass_Storage_ClearFeature +* Description : Handle the ClearFeature request. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Mass_Storage_ClearFeature(void) +{ + /* when the host send a CBW with invalid signature or invalid length the two + Endpoints (IN & OUT) shall stall until receiving a Mass Storage Reset */ + if (CBW.dSignature != BOT_CBW_SIGNATURE) + Bot_Abort(BOTH_DIR); +} + +/******************************************************************************* +* Function Name : Mass_Storage_SetConfiguration. +* Description : Update the device state to addressed. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Mass_Storage_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} +/******************************************************************************* +* Function Name : MASS_Status_In +* Description : Mass Storage Status IN routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void MASS_Status_In(void) +{ + return; +} + +/******************************************************************************* +* Function Name : MASS_Status_Out +* Description : Mass Storage Status OUT routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void MASS_Status_Out(void) +{ + return; +} + +/******************************************************************************* +* Function Name : MASS_Data_Setup. +* Description : Handle the data class specific requests.. +* Input : RequestNo. +* Output : None. +* Return : RESULT. +*******************************************************************************/ +RESULT MASS_Data_Setup(uint8_t RequestNo) +{ + uint8_t *(*CopyRoutine)(uint16_t); + + CopyRoutine = NULL; + if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + && (RequestNo == GET_MAX_LUN) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x01)) + { + CopyRoutine = Get_Max_Lun; + } + else + { + return USB_UNSUPPORT; + } + + if (CopyRoutine == NULL) + { + return USB_UNSUPPORT; + } + + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)(0); + + return USB_SUCCESS; + +} + +/******************************************************************************* +* Function Name : MASS_NoData_Setup. +* Description : Handle the no data class specific requests. +* Input : RequestNo. +* Output : None. +* Return : RESULT. +*******************************************************************************/ +RESULT MASS_NoData_Setup(uint8_t RequestNo) +{ + if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + && (RequestNo == MASS_STORAGE_RESET) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x00)) + { + /* Initialize Endpoint 1 */ + ClearDTOG_TX(ENDP1); + + /* Initialize Endpoint 2 */ + ClearDTOG_RX(ENDP2); + + /*initialize the CBW signature to enable the clear feature*/ + CBW.dSignature = BOT_CBW_SIGNATURE; + Bot_State = BOT_IDLE; + + return USB_SUCCESS; + } + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : MASS_Get_Interface_Setting +* Description : Test the interface and the alternate setting according to the +* supported one. +* Input : uint8_t Interface, uint8_t AlternateSetting. +* Output : None. +* Return : RESULT. +*******************************************************************************/ +RESULT MASS_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT;/* in this application we don't have AlternateSetting*/ + } + else if (Interface > 0) + { + return USB_UNSUPPORT;/*in this application we have only 1 interfaces*/ + } + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : MASS_GetDeviceDescriptor +* Description : Get the device descriptor. +* Input : uint16_t Length. +* Output : None. +* Return : None. +*******************************************************************************/ +uint8_t *MASS_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor ); +} + +/******************************************************************************* +* Function Name : MASS_GetConfigDescriptor +* Description : Get the configuration descriptor. +* Input : uint16_t Length. +* Output : None. +* Return : None. +*******************************************************************************/ +uint8_t *MASS_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor ); +} + +/******************************************************************************* +* Function Name : MASS_GetStringDescriptor +* Description : Get the string descriptors according to the needed index. +* Input : uint16_t Length. +* Output : None. +* Return : None. +*******************************************************************************/ +uint8_t *MASS_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + + if (wValue0 > 5) + { + return NULL; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/******************************************************************************* +* Function Name : Get_Max_Lun +* Description : Handle the Get Max Lun request. +* Input : uint16_t Length. +* Output : None. +* Return : None. +*******************************************************************************/ +uint8_t *Get_Max_Lun(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = LUN_DATA_LENGTH; + return 0; + } + else + { + return((uint8_t*)(&Max_Lun)); + } +} + +/******************************************************************************* + * Function Name : MS_Init. + * Description : Initialise USB structure with MS values. + * Input : None. + * Output : None. + * Return : None. + *******************************************************************************/ +void MS_Init(void) +{ + IMR_MSK = MS__IMR_MSK; + Device_Table = MS__Device_Table; + Device_Property = MS__Device_Property; + User_Standard_Requests = MS__User_Standard_Requests; + Device_Descriptor = MS__Device_Descriptor; + Config_Descriptor = MS__Config_Descriptor; + String_Descriptor = MS__String_Descriptor; + return; +} + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/MS__usb_scsi.c b/Firmware/WIMU3/src/MS__usb_scsi.c new file mode 100644 index 0000000..3a61102 --- /dev/null +++ b/Firmware/WIMU3/src/MS__usb_scsi.c @@ -0,0 +1,444 @@ +/** + ****************************************************************************** + * @file usb_scsi.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to the SCSI commands + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "MS__usb_scsi.h" +#include "MS__mass_mal.h" +#include "MS__usb_bot.h" +#include "usb_regs.h" +#include "MS__memory.h" +#include "platform_config.h" +#include "usb_lib.h" +#include + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* External variables --------------------------------------------------------*/ +extern uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ +extern uint8_t Bot_State; +extern Bulk_Only_CBW CBW; +extern Bulk_Only_CSW CSW; +extern uint32_t Mass_Memory_Size[2]; +extern uint32_t Mass_Block_Size[2]; +extern uint32_t Mass_Block_Count[2]; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : SCSI_Inquiry_Cmd +* Description : SCSI Inquiry Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Inquiry_Cmd(uint8_t lun) +{ + uint8_t* Inquiry_Data; + uint16_t Inquiry_Data_Length; + + if (CBW.CB[1] & 0x01)/*Evpd is set*/ + { + Inquiry_Data = Page00_Inquiry_Data; + Inquiry_Data_Length = 5; + } + else + { + + if ( lun == 0) + { + Inquiry_Data = Standard_Inquiry_Data; + } + else + { + Inquiry_Data = Standard_Inquiry_Data2; + } + + if (CBW.CB[4] <= STANDARD_INQUIRY_DATA_LEN) + Inquiry_Data_Length = CBW.CB[4]; + else + Inquiry_Data_Length = STANDARD_INQUIRY_DATA_LEN; + + } + Transfer_Data_Request(Inquiry_Data, Inquiry_Data_Length); +} + +/******************************************************************************* +* Function Name : SCSI_ReadFormatCapacity_Cmd +* Description : SCSI ReadFormatCapacity Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_ReadFormatCapacity_Cmd(uint8_t lun) +{ + if (MAL_GetStatus(lun) != 0 ) + { + Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); + Bot_Abort(DIR_IN); + return; + } + ReadFormatCapacity_Data[4] = (uint8_t)(Mass_Block_Count[lun] >> 24); + ReadFormatCapacity_Data[5] = (uint8_t)(Mass_Block_Count[lun] >> 16); + ReadFormatCapacity_Data[6] = (uint8_t)(Mass_Block_Count[lun] >> 8); + ReadFormatCapacity_Data[7] = (uint8_t)(Mass_Block_Count[lun]); + + ReadFormatCapacity_Data[9] = (uint8_t)(Mass_Block_Size[lun] >> 16); + ReadFormatCapacity_Data[10] = (uint8_t)(Mass_Block_Size[lun] >> 8); + ReadFormatCapacity_Data[11] = (uint8_t)(Mass_Block_Size[lun]); + Transfer_Data_Request(ReadFormatCapacity_Data, READ_FORMAT_CAPACITY_DATA_LEN); +} + +/******************************************************************************* +* Function Name : SCSI_ReadCapacity10_Cmd +* Description : SCSI ReadCapacity10 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_ReadCapacity10_Cmd(uint8_t lun) +{ + if (MAL_GetStatus(lun)) + { + Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); + Bot_Abort(DIR_IN); + return; + } + + ReadCapacity10_Data[0] = (uint8_t)((Mass_Block_Count[lun] - 1) >> 24); + ReadCapacity10_Data[1] = (uint8_t)((Mass_Block_Count[lun] - 1) >> 16); + ReadCapacity10_Data[2] = (uint8_t)((Mass_Block_Count[lun] - 1) >> 8); + ReadCapacity10_Data[3] = (uint8_t)(Mass_Block_Count[lun] - 1); + + ReadCapacity10_Data[4] = (uint8_t)(Mass_Block_Size[lun] >> 24); + ReadCapacity10_Data[5] = (uint8_t)(Mass_Block_Size[lun] >> 16); + ReadCapacity10_Data[6] = (uint8_t)(Mass_Block_Size[lun] >> 8); + ReadCapacity10_Data[7] = (uint8_t)(Mass_Block_Size[lun]); + Transfer_Data_Request(ReadCapacity10_Data, READ_CAPACITY10_DATA_LEN); +} + +/******************************************************************************* +* Function Name : SCSI_ModeSense6_Cmd +* Description : SCSI ModeSense6 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_ModeSense6_Cmd (uint8_t lun) +{ + Transfer_Data_Request(Mode_Sense6_data, MODE_SENSE6_DATA_LEN); +} + +/******************************************************************************* +* Function Name : SCSI_ModeSense10_Cmd +* Description : SCSI ModeSense10 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_ModeSense10_Cmd (uint8_t lun) +{ + Transfer_Data_Request(Mode_Sense10_data, MODE_SENSE10_DATA_LEN); +} + +/******************************************************************************* +* Function Name : SCSI_RequestSense_Cmd +* Description : SCSI RequestSense Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_RequestSense_Cmd (uint8_t lun) +{ + uint8_t Request_Sense_data_Length; + + if (CBW.CB[4] <= REQUEST_SENSE_DATA_LEN) + { + Request_Sense_data_Length = CBW.CB[4]; + } + else + { + Request_Sense_data_Length = REQUEST_SENSE_DATA_LEN; + } + Transfer_Data_Request(Scsi_Sense_Data, Request_Sense_data_Length); +} + +/******************************************************************************* +* Function Name : Set_Scsi_Sense_Data +* Description : Set Scsi Sense Data routine. +* Input : uint8_t Sens_Key + uint8_t Asc. +* Output : None. +* Return : None. +*******************************************************************************/ +void Set_Scsi_Sense_Data(uint8_t lun, uint8_t Sens_Key, uint8_t Asc) +{ + Scsi_Sense_Data[2] = Sens_Key; + Scsi_Sense_Data[12] = Asc; +} + +/******************************************************************************* +* Function Name : SCSI_Start_Stop_Unit_Cmd +* Description : SCSI Start_Stop_Unit Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Start_Stop_Unit_Cmd(uint8_t lun) +{ + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); +} + +/******************************************************************************* +* Function Name : SCSI_Read10_Cmd +* Description : SCSI Read10 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Read10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr) +{ + if (Bot_State == BOT_IDLE) + { + if (!(SCSI_Address_Management(CBW.bLUN, SCSI_READ10, LBA, BlockNbr)))/*address out of range*/ + { + #ifdef SHOW_DEBUG_PRINTF + printf("SD Read Address out of range"); + #endif + return; + } + + if ((CBW.bmFlags & 0x80) != 0) + { + Bot_State = BOT_DATA_IN; + Read_Memory(lun, LBA , BlockNbr); + } + else + { + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); + } + return; + } + else if (Bot_State == BOT_DATA_IN) + { + Read_Memory(lun , LBA , BlockNbr); + } +} + +/******************************************************************************* +* Function Name : SCSI_Write10_Cmd +* Description : SCSI Write10 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Write10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr) +{ + if (Bot_State == BOT_IDLE) + { + if (!(SCSI_Address_Management(CBW.bLUN, SCSI_WRITE10 , LBA, BlockNbr)))/*address out of range*/ + { + #ifdef SHOW_DEBUG_PRINTF + printf("SD Write Address out of range"); + #endif + return; + } + + if ((CBW.bmFlags & 0x80) == 0) + { + Bot_State = BOT_DATA_OUT; + SetEPRxStatus(ENDP2, EP_RX_VALID); + } + else + { + Bot_Abort(DIR_IN); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } + return; + } + else if (Bot_State == BOT_DATA_OUT) + { + Write_Memory(lun , LBA , BlockNbr); + } +} + +/******************************************************************************* +* Function Name : SCSI_Verify10_Cmd +* Description : SCSI Verify10 Command routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Verify10_Cmd(uint8_t lun) +{ + if ((CBW.dDataLength == 0) && !(CBW.CB[1] & BLKVFY))/* BLKVFY not set*/ + { + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); + } + else + { + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } +} +/******************************************************************************* +* Function Name : SCSI_Valid_Cmd +* Description : Valid Commands routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Valid_Cmd(uint8_t lun) +{ + if (CBW.dDataLength != 0) + { + Bot_Abort(BOTH_DIR); + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + } + else + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); +} +/******************************************************************************* +* Function Name : SCSI_Valid_Cmd +* Description : Valid Commands routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_TestUnitReady_Cmd(uint8_t lun) +{ + if (MAL_GetStatus(lun)) + { + Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); + Bot_Abort(DIR_IN); + return; + } + else + { + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); + } +} +/******************************************************************************* +* Function Name : SCSI_Format_Cmd +* Description : Format Commands routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Format_Cmd(uint8_t lun) +{ + if (MAL_GetStatus(lun)) + { + Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); + Bot_Abort(DIR_IN); + return; + } +} +/******************************************************************************* +* Function Name : SCSI_Invalid_Cmd +* Description : Invalid Commands routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void SCSI_Invalid_Cmd(uint8_t lun) +{ + #ifdef SHOW_DEBUG_PRINTF + printf("Entering SCSI_Invalid_Cmd()\n"); + #endif + + if (CBW.dDataLength == 0) + { + Bot_Abort(DIR_IN); + } + else + { + if ((CBW.bmFlags & 0x80) != 0) + { + Bot_Abort(DIR_IN); + } + else + { + Bot_Abort(BOTH_DIR); + } + } + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); +} + +/******************************************************************************* +* Function Name : SCSI_Address_Management +* Description : Test the received address. +* Input : uint8_t Cmd : the command can be SCSI_READ10 or SCSI_WRITE10. +* Output : None. +* Return : Read\Write status (bool). +*******************************************************************************/ +BOOL SCSI_Address_Management(uint8_t lun , uint8_t Cmd , uint32_t LBA , uint32_t BlockNbr) +{ + if ((LBA + BlockNbr) > Mass_Block_Count[lun] ) + { + if (Cmd == SCSI_WRITE10) + { + Bot_Abort(BOTH_DIR); + } + Bot_Abort(DIR_IN); + Set_Scsi_Sense_Data(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + return (FALSE); + } + + + if (CBW.dDataLength != BlockNbr * Mass_Block_Size[lun]) + { + if (Cmd == SCSI_WRITE10) + { + Bot_Abort(BOTH_DIR); + } + else + { + Bot_Abort(DIR_IN); + } + Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); + return (FALSE); + } + return (TRUE); +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/Merged__hw_config.c b/Firmware/WIMU3/src/Merged__hw_config.c new file mode 100644 index 0000000..0de56f7 --- /dev/null +++ b/Firmware/WIMU3/src/Merged__hw_config.c @@ -0,0 +1,379 @@ +/** + ****************************************************************************** + * @file hw_config.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Hardware Configuration & Setup + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "Merged__stm32_it.h" +#include "MS__mass_mal.h" +#include "MS__usb_desc.h" +#include "usb_pwr.h" +#include "usb_lib.h" +#include "usb.h" + +#include "VC__usb_prop.h" +#include "VC__usb_desc.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +ErrorStatus HSEStartUpStatus; + + +uint8_t USB_Tx_State = 0; + +/* Extern variables ----------------------------------------------------------*/ + +//extern ProgramMode usb_mode; +extern LINE_CODING linecoding; + +extern unsigned char usb_tx_rd_ptr; // Actual TX read index +extern unsigned char usb_tx_index; // Actual TX buffer index (write) +extern unsigned char usb_tx_queue; // Actual number of unsent elements in TX + +extern unsigned short usb_tx_len[USB_TX_BUF_NUM]; + + +/* Private function prototypes -----------------------------------------------*/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len); + +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Set_System +* Description : Configures Main system clocks & power and Interrupt priority group +* Input : None. +* Return : None. +*******************************************************************************/ +void Set_System(void) +{ + /*!< At this stage the microcontroller clock setting is already configured, + this is done through SystemInit() function which is called from startup + file (startup_stm32f10x_xx.s) before to branch to application main. + To reconfigure the default setting of SystemInit() function, refer to + system_stm32f10x.c file + */ +#if defined(USB_USE_EXTERNAL_PULLUP) + GPIO_InitTypeDef GPIO_InitStructure; +#endif /* USB_USE_EXTERNAL_PULLUP */ + + /* Enable the SYSCFG module clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + +//#if defined(USB_USE_EXTERNAL_PULLUP) +// /* Enable the USB disconnect GPIO clock */ +// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIO_DISCONNECT, ENABLE); +// +// /* USB_DISCONNECT used as USB pull-up */ +// GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; +// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure); +//#endif /* USB_USE_EXTERNAL_PULLUP */ + + // MS specific section + if(usb_mode == MASS_STORAGE /*&& getModuleState(MODULE_DATALOGGER)!=STATE_DISABLED*/) + { + /* MAL configuration */ + MAL_Config(); + } + // End of MS specific section + +} + +/******************************************************************************* +* Function Name : Set_USBClock +* Description : Configures USB Clock input (48MHz) +* Input : None. +* Return : None. +*******************************************************************************/ +void Set_USBClock(void) +{ + /* Enable USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); +} + +/******************************************************************************* +* Function Name : Enter_LowPowerMode +* Description : Power-off system clocks and power while entering suspend mode +* Input : None. +* Return : None. +*******************************************************************************/ +void Enter_LowPowerMode(void) +{ + /* Set the device state to suspend */ + bDeviceState = SUSPENDED; +} + +/******************************************************************************* +* Function Name : Leave_LowPowerMode +* Description : Restores system clocks and power while exiting suspend mode +* Input : None. +* Return : None. +*******************************************************************************/ +void Leave_LowPowerMode(void) +{ + DEVICE_INFO *pInfo = &Device_Info; + + /* Set the device state to the correct state */ + if (pInfo->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + } + else + { + bDeviceState = ATTACHED; + } + +} + +/******************************************************************************* +* Function Name : USB_Interrupts_Config +* Description : Configures the USB interrupts +* Input : None. +* Return : None. +*******************************************************************************/ +void USB_Interrupts_Config(void) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + + NVIC_InitStructure.NVIC_IRQChannel = USB_LP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + +// MS specific section +//#if defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS) +// NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; +// NVIC_Init(&NVIC_InitStructure); +// NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; +// NVIC_Init(&NVIC_InitStructure); +//#endif +// End of MS specific section + +} + + +/******************************************************************************* +* Function Name : USB_Cable_Config +* Description : Software Connection/Disconnection of USB Cable. +* Input : None. +* Return : Status +*******************************************************************************/ +void USB_Cable_Config (FunctionalState NewState) +{ + + SYSCFG_USBPuCmd(NewState); + + +//#if defined(STM32L1XX_MD) +// if (NewState != DISABLE) +// { +// STM32L15_USB_CONNECT; +// } +// else +// { +// STM32L15_USB_DISCONNECT; +// } +// +//// MS specific section +//#else +// if (NewState != DISABLE) +// { +// GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); +// SYSCFG_USBPuCmd(ENABLE); +// +// } +// else +// { +// GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); +// SYSCFG_USBPuCmd(DISABLE); +// +// } +//#endif +// End of MS specific section +} + +/******************************************************************************* + * Function Name : Handle_USBAsynchXfer. + * Description : send data to USB. + * Input : None. + * Return : none. + *******************************************************************************/ +void Handle_USBAsynchXfer (void) +{ + + uint16_t USB_Tx_Length; + + + + // If no buffer is under transmission + if(USB_Tx_State != 1) + { + if (usb_tx_queue > 0) + { + + //usb_tx_index = 0; + + if (usb_tx_len[usb_tx_rd_ptr] > VIRTUAL_COM_PORT_DATA_SIZE) + { + USB_Tx_Length = VIRTUAL_COM_PORT_DATA_SIZE; + + UserToPMABufferCopy(&usb_tx[usb_tx_rd_ptr][usb_tx_index], VC__ENDP1_TXADDR, USB_Tx_Length); + SetEPTxCount(ENDP1, USB_Tx_Length); + SetEPTxValid(ENDP1); + + usb_tx_index += VIRTUAL_COM_PORT_DATA_SIZE; + USB_Tx_State = 1; + } + // Send entire buffer fit in one VC transaction + else + { + USB_Tx_Length = usb_tx_len[usb_tx_rd_ptr]-usb_tx_index; + if (USB_Tx_Length > VIRTUAL_COM_PORT_DATA_SIZE){ + //This can happen when com port opens / closes and usb_tx_index isn't correctly setted + USB_Tx_Length = usb_tx_len[usb_tx_rd_ptr]; + } + usb_tx_queue--; + + UserToPMABufferCopy(&usb_tx[usb_tx_rd_ptr][usb_tx_index], VC__ENDP1_TXADDR, USB_Tx_Length); + SetEPTxCount(ENDP1, USB_Tx_Length); + SetEPTxValid(ENDP1); + + usb_tx_rd_ptr++; + if (usb_tx_rd_ptr >= USB_TX_BUF_NUM) + usb_tx_rd_ptr = 0; + + usb_tx_index = 0; + USB_Tx_State = 0; + } + // Check endpoint status - stop transmission is NAK (com port closed) + /*if (GetEPTxStatus(ENDP1)==EP_TX_NAK){ + usb_stop_all_streams(); + SetEPTxStatus(ENDP1, EP_TX_VALID); // Get ready for further transmissions + }*/ + } + + } + + + +} + + +/******************************************************************************* +* Function Name : Get_SerialNum. +* Description : Create the serial number string descriptor. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Get_SerialNum(void) +{ + uint32_t Device_Serial0, Device_Serial1, Device_Serial2; + + Device_Serial0 = *(uint32_t*)(0x1FF80050); + Device_Serial1 = *(uint32_t*)(0x1FF80054); + Device_Serial2 = *(uint32_t*)(0x1FF80064); + + Device_Serial0 += Device_Serial2; + + if (usb_mode == VIRTUAL_COM) + { + if (Device_Serial0 != 0) + { + IntToUnicode (Device_Serial0, &Virtual_Com_Port_StringSerial[2] , 8); + IntToUnicode (Device_Serial1, &Virtual_Com_Port_StringSerial[18], 4); + } + } + else + { + if (Device_Serial0 != 0) + { + IntToUnicode (Device_Serial0, &MASS_StringSerial[2] , 8); + IntToUnicode (Device_Serial1, &MASS_StringSerial[18], 4); + } + } +} + +/******************************************************************************* +* Function Name : HexToChar. +* Description : Convert Hex 32Bits value into char. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len) +{ + uint8_t idx = 0; + + for( idx = 0 ; idx < len ; idx ++) + { + if( ((value >> 28)) < 0xA ) + { + pbuf[ 2* idx] = (value >> 28) + '0'; + } + else + { + pbuf[2* idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[ 2* idx + 1] = 0; + } +} + +// MS specific section + +/******************************************************************************* +* Function Name : MAL_Config +* Description : MAL_layer configuration +* Input : None. +* Return : None. +*******************************************************************************/ +void MAL_Config(void) +{ + MAL_Init(0); + +} + +// End of MS specific section + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/Merged__stm32_it.c b/Firmware/WIMU3/src/Merged__stm32_it.c new file mode 100644 index 0000000..7828d5e --- /dev/null +++ b/Firmware/WIMU3/src/Merged__stm32_it.c @@ -0,0 +1,362 @@ +/** + ****************************************************************************** + * @file stm32_it.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and peripherals + * interrupt service routine. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "Merged__stm32_it.h" +#include "usb_lib.h" +#include "usb_istr.h" +#include "usb_pwr.h" +#include "usb.h" +#include "USART_driver.h" +#include "utils.h" +#include "gps.h" +#include "MPUCompass_driver.h" +#include "power.h" +#include "buttons.h" +#include "ble.h" +#include "battery.h" +#include "power.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +// USART Buffers +// USART Buffers +extern FIFO_TypeDef Usart1_TxFIFOStruct; +extern FIFO_TypeDef Usart1_RxFIFOStruct; + + +//extern uint32_t Buzzer_NbrOfCycleCompleted; + +extern PushButton_TypeDef PushButton1; +extern PushButton_TypeDef PushButton2; + +extern uint8_t Calib_Counter; + +volatile uint64_t SysTick_Counter = 0; +volatile uint32_t SysTick_Timeout; +//volatile uint32_t SysTick_DelayDownCounter; + + + +extern BOOL test_mode; + +/******************************************************************************/ +/* Cortex-M Processor Exceptions Handlers */ +/******************************************************************************/ + +/******************************************************************************* +* Function Name : NMI_Handler +* Description : This function handles NMI exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void NMI_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : HardFault_Handler +* Description : This function handles Hard Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + //Reboot the module + NVIC_SystemReset(); + } +} + +/******************************************************************************* +* Function Name : MemManage_Handler +* Description : This function handles Memory Manage exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + //Reboot the module + NVIC_SystemReset(); + } +} + +/******************************************************************************* +* Function Name : BusFault_Handler +* Description : This function handles Bus Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + //Reboot the module + NVIC_SystemReset(); + } +} + +/******************************************************************************* +* Function Name : UsageFault_Handler +* Description : This function handles Usage Fault exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + //Reboot the module + NVIC_SystemReset(); + } +} + +/******************************************************************************* +* Function Name : SVC_Handler +* Description : This function handles SVCall exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void SVC_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : DebugMon_Handler +* Description : This function handles Debug Monitor exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void DebugMon_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : PendSV_Handler +* Description : This function handles PendSVC exception. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void PendSV_Handler(void) +{ +} + +/******************************************************************************* +* Function Name : SysTick_Handler +* Description : This function handles SysTick Handler. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void SysTick_Handler(void) +{ + + static uint8_t Alive_Counter=0; + + /* --------- SysTick counter --------- */ + SysTick_Counter++; + + // Update timestamp + if (SysTick_Counter>=1000){ + update_timestampRTC(); + + SysTick_Counter=0; + Alive_Counter++; + + // Check battery power + if (isModuleOnline(MODULE_POWER)){ + power_ready = TRUE; + } + + if (isModuleOnline(MODULE_BLE)){ + ble_update_time = true; + } + + // Update calibration counter if needed +/* if (Calib_Counter>0){ + Calib_Counter--; + Buzzer_Start(10); + + if (isModuleOnline(MODULE_USB)){ + if (Calib_Counter>0) + usb_send_char('.'); + else + usb_send_string("OK\n\r",4); + } + //Buzzer_Stop(); + }*/ + // Update battery level +// BatteryMonitoring_RdADC(&Battery_ADCValue); + } + + // Push buttons management + if (PushButton_GetState(&ModeButton)!=INACTIVE){ + ModeButton.ActivationNbrOfTicks++; + PushButton_UpdateState(&ModeButton); + PushButton_ModeButtonUpdateAction(); + } + + if (PushButton_GetState(&PowerButton)!=INACTIVE){ + PowerButton.ActivationNbrOfTicks++; + PushButton_UpdateState(&PowerButton); + PushButton_PowerButtonUpdateAction(); + } + + + if(SysTick_Timeout > 0) + { + SysTick_Timeout--; + } + + /*if (Power_GetState()!=POWER_STATE_ON && Power_GetState() != POWER_STATE_USB_ON) + return;*/ + + // Blink LED if needed + if (wimu_config.ui.led_blink_time>0 && initialized==true){ + if (Alive_Counter >= wimu_config.ui.led_blink_time){ + if (!Power_IsStateUSBRelated(Power_GetState())) + led(LED_GREEN,TRUE, LOW_PRIORITY); + Alive_Counter=0; + } + if (SysTick_Counter==500 && Alive_Counter==0){ + if (!Power_IsStateUSBRelated(Power_GetState())) + led(LED_GREEN,FALSE, LOW_PRIORITY); + } + + + } + + /*if(SysTick_DelayDownCounter > 0) + { + SysTick_DelayDownCounter--; + }*/ + + + + +} + +/******************************************************************************/ +/* STM32 Peripherals Interrupt Handlers */ +/******************************************************************************/ + + +/******************************************************************************* +* Function Name : USB_IRQHandler +* Description : This function handles USB Low Priority interrupts +* requests. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void USB_LP_IRQHandler(void) +{ + USB_Istr(); +} + + +/******************************************************************************/ +/* STM32 Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32xxx.s). */ +/******************************************************************************/ + + + + + + + +/******************************************************************************* + * Function Name : TIM4_IRQHandler + * Description : This function handles UART5 interrupt request. + * Input : None + * Output : None + * Return : None + *******************************************************************************/ +void TIM4_IRQHandler(void) +{ + + #ifdef EN_SOFT_WATCHDOG + IWDG_Enable(); + #endif + + while (1); +} + +// MODE BUTTON HANDLER +void EXTI4_IRQHandler(void){ + //Mode button was pushed + if(EXTI_GetITStatus(EXTI_Line4) != RESET){ + + PushButton_UpdateState(&ModeButton); + + /* + if (USB_GetState()==USB_STATE_CONNECTED){ + // Change power state + PowerSetState(POWER_STATE_USB_ON); + + // Power USB On + PowerOn(); + //led(LED_GREEN,TRUE); + }*/ + + + EXTI_ClearITPendingBit(EXTI_Line4); + } +} + + + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/RTC.c b/Firmware/WIMU3/src/RTC.c new file mode 100644 index 0000000..c75f70a --- /dev/null +++ b/Firmware/WIMU3/src/RTC.c @@ -0,0 +1,69 @@ +//****************************************************************************** +// WIMUuSD - Real-Time clock module +// +// Description: +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "RTC.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +RTC_TimeTypeDef RTC_TimeStruct; +RTC_DateTypeDef RTC_DateStruct; + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + + +/******************************************************************************* + * Function Name : RTC_Config + * Description : Low level config of the STM32 RTC + * Input : None. + * Output : Result (1: Success; 0: Error) + * Return : None. + *******************************************************************************/ +int RTC_Config(void) +{ + RTC_InitTypeDef RTC_InitStruct; + + // Enabling the Power Controller (PWR) APB1 interface clock + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); + + // Enabling access to RTC domain + PWR_RTCAccessCmd(ENABLE); + + // Enabling and selecting LSE as RTC clock source + RCC_LSEConfig(RCC_LSE_ON); + while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // Wait for LSE clock to be ready + RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); + RCC_RTCCLKCmd(ENABLE); + + // Configuring the RTC Prescaler (Asynchronous and Synchronous) and RTC hour format + RTC_StructInit(&RTC_InitStruct); + RTC_Init(&RTC_InitStruct); + + + + return 1; +} + +void RTC_SetInitial(void){ + // Initializing time and date until synchro w/ GPS or USB + RTC_TimeStructInit(&RTC_TimeStruct); + RTC_DateStructInit(&RTC_DateStruct); + RTC_DateStruct.RTC_Month = 1; + RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); + RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/SPI_driver.c b/Firmware/WIMU3/src/SPI_driver.c new file mode 100644 index 0000000..a5ea50c --- /dev/null +++ b/Firmware/WIMU3/src/SPI_driver.c @@ -0,0 +1,109 @@ +//****************************************************************************** +// WIMUuSD - SPI driver module +// +// Description: +// +// Limitations: This module has been designed for the SPI to be master. Code +// MUST be adapt to supprt slave mode +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "SPI_driver.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +const SPIConfig_TypeDef SPIConfigTable[1] = +{ + { + SPI1, RCC_APB2Periph_SPI1, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_7, GPIO_PinSource7, GPIO_AF_SPI1, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_SPI1, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_5, GPIO_PinSource5, GPIO_AF_SPI1 + } +}; + + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* + * Function Name : SPI_Config. + * Description : Configure the SPI to be MASTER and with default values. + * + * ***This function do NOT enable the SPI*** + * + * Input : SPI_InitStruct: Refer to stm32l1xx_spi.h for for field description + * : SPIx: specific SPI peripheral to use (SPI1, SPI2, ect.) + * Return : None. + *******************************************************************************/ +void SPI_Config(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + uint8_t SPIConfigTable_Index; + + for(SPIConfigTable_Index = 0; SPIConfigTable_Index < NBR_OF_SPI_USED; SPIConfigTable_Index++) + { + if(SPIConfigTable[SPIConfigTable_Index].SPIx == SPIx) break; + } + + /* Enabling SPI clock */ + if (SPIConfigTable[SPIConfigTable_Index].SPIx == SPI1) + { + RCC_APB2PeriphClockCmd(SPIConfigTable[SPIConfigTable_Index].SPIx_PeriphClk, ENABLE); + } + else + { + RCC_APB1PeriphClockCmd(SPIConfigTable[SPIConfigTable_Index].SPIx_PeriphClk, ENABLE); + } + + /* Enabling GPIO clock */ + RCC_AHBPeriphClockCmd(SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIGPIOClk | SPIConfigTable[SPIConfigTable_Index].SPIx_MISOGPIOClk | SPIConfigTable[SPIConfigTable_Index].SPIx_SCKGPIOClk, ENABLE); + + // Connecting MOSI, MISO and SCK pins to the desired peripherals' Alternate Function + GPIO_PinAFConfig(SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIPort, SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIPinSource, SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIAlternFunc); + GPIO_PinAFConfig(SPIConfigTable[SPIConfigTable_Index].SPIx_MISOPort, SPIConfigTable[SPIConfigTable_Index].SPIx_MISOPinSource, SPIConfigTable[SPIConfigTable_Index].SPIx_MISOAlternFunc); + GPIO_PinAFConfig(SPIConfigTable[SPIConfigTable_Index].SPIx_SCKPort, SPIConfigTable[SPIConfigTable_Index].SPIx_SCKPinSource, SPIConfigTable[SPIConfigTable_Index].SPIx_SCKAlternFunc); + + /* Configure SPI MOSI as alternate function and selecting the IO type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(SPIConfigTable[SPIConfigTable_Index].SPIx_MOSIPort, &GPIO_InitStructure); + + /* Configure SPI SCK as alternate function and selecting the IO type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = SPIConfigTable[SPIConfigTable_Index].SPIx_SCKPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(SPIConfigTable[SPIConfigTable_Index].SPIx_SCKPort, &GPIO_InitStructure); + + /* Configure SPI MISO as alternate function and selecting the type and pull-up/pull-down */ + GPIO_InitStructure.GPIO_Pin = SPIConfigTable[SPIConfigTable_Index].SPIx_MISOPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(SPIConfigTable[SPIConfigTable_Index].SPIx_MISOPort, &GPIO_InitStructure); + + /* Initializing the SPI (Polarity, Phase, First Data, Baud Rate Prescaler, Slave + Management, Peripheral Mode and CRC Polynomial values) */ + SPI_Init(SPIConfigTable[SPIConfigTable_Index].SPIx, SPI_InitStruct); + + return; +} + diff --git a/Firmware/WIMU3/src/USART_driver.c b/Firmware/WIMU3/src/USART_driver.c new file mode 100644 index 0000000..c0cf0f2 --- /dev/null +++ b/Firmware/WIMU3/src/USART_driver.c @@ -0,0 +1,211 @@ +//****************************************************************************** +// WIMUuSD - USART driver module +// +// Description: +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + + +/* Includes ------------------------------------------------------------------*/ +#include "USART_driver.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + + +const USARTConfig_TypeDef USARTConfigTable[NBR_OF_USART_USED] = +{ + { + USART1, RCC_APB2Periph_USART1, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_9, GPIO_PinSource9, GPIO_AF_USART1, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_10, GPIO_PinSource10, GPIO_AF_USART1 + }, + + { + USART2, RCC_APB1Periph_USART2, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_2, GPIO_PinSource2, GPIO_AF_USART2, + RCC_AHBPeriph_GPIOA, GPIOA, GPIO_Pin_3, GPIO_PinSource3, GPIO_AF_USART2 + }, + + { + USART3, RCC_APB1Periph_USART3, + RCC_AHBPeriph_GPIOC, GPIOC, GPIO_Pin_10, GPIO_PinSource10, GPIO_AF_USART3, + RCC_AHBPeriph_GPIOC, GPIOC, GPIO_Pin_11, GPIO_PinSource11, GPIO_AF_USART3 + }, + + { + UART5, RCC_APB1Periph_UART5, + RCC_AHBPeriph_GPIOC, GPIOC, GPIO_Pin_12, GPIO_PinSource12, GPIO_AF_UART5, + RCC_AHBPeriph_GPIOD, GPIOD, GPIO_Pin_2, GPIO_PinSource2, GPIO_AF_UART5 + } +}; + + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + + +/******************************************************************************* + * Function Name : USART_Config. + * Description : configure the USART with default values. + * Input : None. + * Return : None. + *******************************************************************************/ +void USART_Config(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + uint8_t USARTConfigTable_Index; + + for(USARTConfigTable_Index = 0; USARTConfigTable_Index < NBR_OF_USART_USED; USARTConfigTable_Index++) + { + if(USARTConfigTable[USARTConfigTable_Index].USARTx == USARTx) break; + } + + /* Enabling USART clock */ + if (USARTConfigTable[USARTConfigTable_Index].USARTx == USART1) + { + RCC_APB2PeriphClockCmd(USARTConfigTable[USARTConfigTable_Index].USARTx_PeriphClk, ENABLE); + } + else + { + RCC_APB1PeriphClockCmd(USARTConfigTable[USARTConfigTable_Index].USARTx_PeriphClk, ENABLE); + } + + /* Enabling GPIO clock */ + RCC_AHBPeriphClockCmd(USARTConfigTable[USARTConfigTable_Index].USARTx_TXGPIOClk | USARTConfigTable[USARTConfigTable_Index].USARTx_RXGPIOClk, ENABLE); + + // Connecting TX and RX pins to the desired peripherals' Alternate Function + GPIO_PinAFConfig(USARTConfigTable[USARTConfigTable_Index].USARTx_TXPort, USARTConfigTable[USARTConfigTable_Index].USARTx_TXPinSource, USARTConfigTable[USARTConfigTable_Index].USARTx_TXAlternFunc); + GPIO_PinAFConfig(USARTConfigTable[USARTConfigTable_Index].USARTx_RXPort, USARTConfigTable[USARTConfigTable_Index].USARTx_RXPinSource, USARTConfigTable[USARTConfigTable_Index].USARTx_RXAlternFunc); + + /* Configure USART Tx as alternate function and selecting the type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = USARTConfigTable[USARTConfigTable_Index].USARTx_TXPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(USARTConfigTable[USARTConfigTable_Index].USARTx_TXPort, &GPIO_InitStructure); + + /* Configure USART Rx as alternate function and selecting the type and pull-up/pull-down */ + GPIO_InitStructure.GPIO_Pin = USARTConfigTable[USARTConfigTable_Index].USARTx_RXPin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(USARTConfigTable[USARTConfigTable_Index].USARTx_RXPort, &GPIO_InitStructure); + + /* Initializing the USART (Baud Rate, Word Length , Stop Bit, Parity, Hardware + flow control and Mode) */ + USART_Init(USARTConfigTable[USARTConfigTable_Index].USARTx, USART_InitStruct); + + /* Enabling the USART */ + USART_Cmd(USARTConfigTable[USARTConfigTable_Index].USARTx, ENABLE); + return; +} + +/******************************************************************************* + * Function Name : USART_ConfigRxIRQ. + * Description : Enable or disable USART_IT_RXNE (Receive Data register not empty) interrupt. + * Input : USARTx: Select the USART peripheral + * NewState: new state of the interrupts (ENABLE or DISABLE) + * Return : None. + *******************************************************************************/ +void USART_ConfigRxIRQ(USART_TypeDef* USARTx, FunctionalState NewState) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + + USART_ITConfig(USARTx, USART_IT_RXNE, NewState); + + NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + +} + +/******************************************************************************* + * Function Name : USARTx_SendDataIfPossible. + * Description : Send data byte from FIFO w/ USARTx if FIFO is not empty and Tx data register is empty. + * Input : USARTx: USART to send data with + * FIFO: FIFO to read from + * Return : None. + *******************************************************************************/ +void USARTx_SendDataIfPossible(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO) +{ + uint8_t RdElement; + + // Verify that Tx data register is empty + if ((USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == SET)) + { + // Send data if data available in FIFO + if(FIFO_RdElementIfDataAvailable(FIFO, (void *)&RdElement) == 1) + { + USART_SendData(USARTx, RdElement); + } + } + + return; +} + +/******************************************************************************* + * Function Name : USARTx_SendAllData. + * Description : Send all the data bytes from FIFO w/ USARTx. + * Input : USARTx: USART to send data with + * FIFO: FIFO to read from + * Return : None. + *******************************************************************************/ +void USARTx_SendAllData(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO) +{ + uint8_t RdElement; + + // While there is data in the FIFO + while(FIFO_RdElementIfDataAvailable(FIFO, (void *)&RdElement) == 1) + { + // Wait till Tx data register is empty + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); + + USART_SendData(USARTx, RdElement); + } + + return; +} + + + +/******************************************************************************* + * Function Name : USARTx_GetDataIfAvailable. + * Description : Get data byte from USARTx if data is available and if FIFO is not full. + * Input : USARTx: USART to get data with + * FIFO: FIFO to read from + * Return : Result: (1:Success; 0:Data loss). + *******************************************************************************/ +uint8_t USARTx_GetDataIfAvailable(USART_TypeDef* USARTx, FIFO_TypeDef* FIFO) +{ + uint8_t RdElement; + + // Verify that data is available in the rx register + if (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == SET) + { + RdElement = (uint8_t)USART_ReceiveData(USARTx); + + // Write data byte in the FIFO if there's enough free space + //return FIFO_WrElementIfSpaceAvailable(FIFO, (void *)RdElement); + return FIFO_WrElementIfSpaceAvailable(FIFO, (void *)&RdElement); + } + else + { + return 0 ; + } +} + diff --git a/Firmware/WIMU3/src/VC__usb_desc.c b/Firmware/WIMU3/src/VC__usb_desc.c new file mode 100644 index 0000000..0bb0aa8 --- /dev/null +++ b/Firmware/WIMU3/src/VC__usb_desc.c @@ -0,0 +1,181 @@ +/** + ****************************************************************************** + * @file usb_desc.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Descriptors for Virtual Com Port Demo + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" +#include "VC__usb_desc.h" +#include "config.h" + +/* USB Standard Device Descriptor */ +const uint8_t Virtual_Com_Port_DeviceDescriptor[] = + { + 0x12, /* bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x00, + 0x02, /* bcdUSB = 2.00 */ + 0x02, /* bDeviceClass: CDC */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + 0x40, /* bMaxPacketSize0 */ + 0x83, + 0x04, /* idVendor = 0x0483 */ + 0x40, + 0x57, /* idProduct = 0x7540 */ + 0x00, + 0x02, /* bcdDevice = 2.00 */ + 1, /* Index of string descriptor describing manufacturer */ + 2, /* Index of string descriptor describing product */ + 3, /* Index of string descriptor describing the device's serial number */ + 0x01 /* bNumConfigurations */ + }; + +const uint8_t Virtual_Com_Port_ConfigDescriptor[] = + { + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + VIRTUAL_COM_PORT_SIZ_CONFIG_DESC, /* wTotalLength:no of returned bytes */ + 0x00, + 0x02, /* bNumInterfaces: 2 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 0 mA */ + /*Interface Descriptor*/ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + 0x82, /* bEndpointAddress: (IN2) */ + 0x03, /* bmAttributes: Interrupt */ + VIRTUAL_COM_PORT_INT_SIZE, /* wMaxPacketSize: */ + 0x00, + 0xFF, /* bInterval: */ + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + /*Endpoint 3 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + 0x03, /* bEndpointAddress: (OUT3) */ + 0x02, /* bmAttributes: Bulk */ + VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */ + 0x00, + 0x00, /* bInterval: ignore for Bulk transfer */ + /*Endpoint 1 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + 0x81, /* bEndpointAddress: (IN1) */ + 0x02, /* bmAttributes: Bulk */ + VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */ + 0x00, + 0x00 /* bInterval */ + }; + +/* USB String Descriptors */ +const uint8_t Virtual_Com_Port_StringLangID[VIRTUAL_COM_PORT_SIZ_STRING_LANGID] = + { + VIRTUAL_COM_PORT_SIZ_STRING_LANGID, + USB_STRING_DESCRIPTOR_TYPE, + 0x09, + 0x04 /* LangID = 0x0409: U.S. English */ + }; + +const uint8_t Virtual_Com_Port_StringVendor[VIRTUAL_COM_PORT_SIZ_STRING_VENDOR] = + { + VIRTUAL_COM_PORT_SIZ_STRING_VENDOR, /* Size of Vendor string */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/ + /* Manufacturer: "STMicroelectronics" */ + /*'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, + 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, + 'c', 0, 's', 0*/ + + //Manufacturer: CDRV + 'C', 0, 'D', 0, 'R', 0, 'V', 0 + }; + +const uint8_t Virtual_Com_Port_StringProduct[VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT] = + { + VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + /* Product name: "STM32 Virtual COM Port" */ + /*'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'V', 0, 'i', 0, + 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, + 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0, ' ', 0, ' ', 0*/ + // Product name: "WIMUGPS" + 'W', 0, 'I', 0, 'M', 0, 'U', 0, 'G', 0, 'P', 0, 'S', 0 + }; + +uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] = + { + VIRTUAL_COM_PORT_SIZ_STRING_SERIAL, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + //'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, '1', 0, '0', 0 + 'W', 0, 'I', '0', 'M', 0, 'U', 0, ' ', 0, VERSION_MAJOR_CHAR, 0, VERSION_MINOR_CHAR, 0, VERSION_REV_CHAR, 0 + }; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/VC__usb_prop.c b/Firmware/WIMU3/src/VC__usb_prop.c new file mode 100644 index 0000000..fc2280c --- /dev/null +++ b/Firmware/WIMU3/src/VC__usb_prop.c @@ -0,0 +1,447 @@ +/** + ****************************************************************************** + * @file usb_prop.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief All processing related to Virtual Com Port Demo + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" +#include "usb_conf.h" +#include "VC__usb_prop.h" +#include "VC__usb_desc.h" +#include "usb_pwr.h" +#include "Merged__hw_config.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +uint8_t Request = 0; + +LINE_CODING linecoding = + { + 115200, /* baud rate*/ + 0x00, /* stop bits-1*/ + 0x00, /* parity - none*/ + 0x08 /* no. of bits 8*/ + }; + +/* -------------------------------------------------------------------------- */ +/* Structures initializations */ +/* -------------------------------------------------------------------------- */ + +DEVICE VC__Device_Table = + { + VC__EP_NUM, + 1 + }; + +DEVICE_PROP VC__Device_Property = + { + Virtual_Com_Port_init, + Virtual_Com_Port_Reset, + Virtual_Com_Port_Status_In, + Virtual_Com_Port_Status_Out, + Virtual_Com_Port_Data_Setup, + Virtual_Com_Port_NoData_Setup, + Virtual_Com_Port_Get_Interface_Setting, + Virtual_Com_Port_GetDeviceDescriptor, + Virtual_Com_Port_GetConfigDescriptor, + Virtual_Com_Port_GetStringDescriptor, + 0, + 0x40 /*MAX PACKET SIZE*/ + }; + +USER_STANDARD_REQUESTS VC__User_Standard_Requests = + { + Virtual_Com_Port_GetConfiguration, + Virtual_Com_Port_SetConfiguration, + Virtual_Com_Port_GetInterface, + Virtual_Com_Port_SetInterface, + Virtual_Com_Port_GetStatus, + Virtual_Com_Port_ClearFeature, + Virtual_Com_Port_SetEndPointFeature, + Virtual_Com_Port_SetDeviceFeature, + Virtual_Com_Port_SetDeviceAddress + }; + +ONE_DESCRIPTOR VC__Device_Descriptor = + { + (uint8_t*)Virtual_Com_Port_DeviceDescriptor, + VIRTUAL_COM_PORT_SIZ_DEVICE_DESC + }; + +ONE_DESCRIPTOR VC__Config_Descriptor = + { + (uint8_t*)Virtual_Com_Port_ConfigDescriptor, + VIRTUAL_COM_PORT_SIZ_CONFIG_DESC + }; + +ONE_DESCRIPTOR VC__String_Descriptor[4] = + { + {(uint8_t*)Virtual_Com_Port_StringLangID, VIRTUAL_COM_PORT_SIZ_STRING_LANGID}, + {(uint8_t*)Virtual_Com_Port_StringVendor, VIRTUAL_COM_PORT_SIZ_STRING_VENDOR}, + {(uint8_t*)Virtual_Com_Port_StringProduct, VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT}, + {(uint8_t*)Virtual_Com_Port_StringSerial, VIRTUAL_COM_PORT_SIZ_STRING_SERIAL} + }; + +/* Extern variables ----------------------------------------------------------*/ + +extern DEVICE Device_Table; +extern DEVICE_PROP Device_Property; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern ONE_DESCRIPTOR Device_Descriptor; +extern ONE_DESCRIPTOR Config_Descriptor; +extern ONE_DESCRIPTOR *String_Descriptor; +extern uint16_t IMR_MSK; + +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/******************************************************************************* +* Function Name : Virtual_Com_Port_init. +* Description : Virtual COM Port Mouse init routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_init(void) +{ + + /* Update the serial number string descriptor with the data from the unique + ID*/ + Get_SerialNum(); + + pInformation->Current_Configuration = 0; + + /* Connect the device */ + PowerOn(); + + /* Perform basic device initialization operations */ + USB_SIL_Init(); + + /* configure the USART to the default settings */ +// USART_Config_Default(); + + bDeviceState = UNCONNECTED; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_Reset +* Description : Virtual_Com_Port Mouse reset routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_Reset(void) +{ + /* Set Virtual_Com_Port DEVICE as not configured */ + pInformation->Current_Configuration = 0; + + /* Current Feature initialization */ + pInformation->Current_Feature = Virtual_Com_Port_ConfigDescriptor[7]; + + /* Set Virtual_Com_Port DEVICE with the default Interface*/ + pInformation->Current_Interface = 0; + + + SetBTABLE(VC__BTABLE_ADDRESS); + + /* Initialize Endpoint 0 */ + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_STALL); + SetEPRxAddr(ENDP0, VC__ENDP0_RXADDR); + SetEPTxAddr(ENDP0, VC__ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + + /* Initialize Endpoint 1 */ + SetEPType(ENDP1, EP_BULK); + SetEPTxAddr(ENDP1, VC__ENDP1_TXADDR); + SetEPTxStatus(ENDP1, EP_TX_NAK); + SetEPRxStatus(ENDP1, EP_RX_DIS); + + /* Initialize Endpoint 2 */ + SetEPType(ENDP2, EP_INTERRUPT); + SetEPTxAddr(ENDP2, VC__ENDP2_TXADDR); + SetEPRxStatus(ENDP2, EP_RX_DIS); + SetEPTxStatus(ENDP2, EP_TX_NAK); + + /* Initialize Endpoint 3 */ + SetEPType(ENDP3, EP_BULK); + SetEPRxAddr(ENDP3, VC__ENDP3_RXADDR); + SetEPRxCount(ENDP3, VIRTUAL_COM_PORT_DATA_SIZE); + SetEPRxStatus(ENDP3, EP_RX_VALID); + SetEPTxStatus(ENDP3, EP_TX_DIS); + + /* Set this device to response on default address */ + SetDeviceAddress(0); + + bDeviceState = ATTACHED; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_SetConfiguration. +* Description : Update the device state to configured. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_SetConfiguration(void) +{ + DEVICE_INFO *pInfo = &Device_Info; + + if (pInfo->Current_Configuration != 0) + { + /* Device configured */ + bDeviceState = CONFIGURED; + } +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_SetConfiguration. +* Description : Update the device state to addressed. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_Status_In. +* Description : Virtual COM Port Status In Routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_Status_In(void) +{ + if (Request == SET_LINE_CODING) + { +// USART_Config(); + Request = 0; + } +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_Status_Out +* Description : Virtual COM Port Status OUT Routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Virtual_Com_Port_Status_Out(void) +{} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_Data_Setup +* Description : handle the data class specific requests +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT Virtual_Com_Port_Data_Setup(uint8_t RequestNo) +{ + uint8_t *(*CopyRoutine)(uint16_t); + + CopyRoutine = NULL; + + if (RequestNo == GET_LINE_CODING) + { + if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + { + CopyRoutine = Virtual_Com_Port_GetLineCoding; + } + } + else if (RequestNo == SET_LINE_CODING) + { + if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + { + CopyRoutine = Virtual_Com_Port_SetLineCoding; + } + Request = SET_LINE_CODING; + } + + if (CopyRoutine == NULL) + { + return USB_UNSUPPORT; + } + + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)(0); + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_NoData_Setup. +* Description : handle the no data class specific requests. +* Input : Request Nb. +* Output : None. +* Return : USB_UNSUPPORT or USB_SUCCESS. +*******************************************************************************/ +RESULT Virtual_Com_Port_NoData_Setup(uint8_t RequestNo) +{ + + if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + { + if (RequestNo == SET_COMM_FEATURE) + { + return USB_SUCCESS; + } + else if (RequestNo == SET_CONTROL_LINE_STATE) + { + return USB_SUCCESS; + } + } + + return USB_UNSUPPORT; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_GetDeviceDescriptor. +* Description : Gets the device descriptor. +* Input : Length. +* Output : None. +* Return : The address of the device descriptor. +*******************************************************************************/ +uint8_t *Virtual_Com_Port_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor); +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_GetConfigDescriptor. +* Description : get the configuration descriptor. +* Input : Length. +* Output : None. +* Return : The address of the configuration descriptor. +*******************************************************************************/ +uint8_t *Virtual_Com_Port_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor); +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_GetStringDescriptor +* Description : Gets the string descriptors according to the needed index +* Input : Length. +* Output : None. +* Return : The address of the string descriptors. +*******************************************************************************/ +uint8_t *Virtual_Com_Port_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + if (wValue0 > 4) + { + return NULL; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_Get_Interface_Setting. +* Description : test the interface and the alternate setting according to the +* supported one. +* Input1 : uint8_t: Interface : interface number. +* Input2 : uint8_t: AlternateSetting : Alternate Setting number. +* Output : None. +* Return : The address of the string descriptors. +*******************************************************************************/ +RESULT Virtual_Com_Port_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT; + } + else if (Interface > 1) + { + return USB_UNSUPPORT; + } + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_GetLineCoding. +* Description : send the linecoding structure to the PC host. +* Input : Length. +* Output : None. +* Return : Linecoding structure base address. +*******************************************************************************/ +uint8_t *Virtual_Com_Port_GetLineCoding(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding); + return NULL; + } + return(uint8_t *)&linecoding; +} + +/******************************************************************************* +* Function Name : Virtual_Com_Port_SetLineCoding. +* Description : Set the linecoding structure fields. +* Input : Length. +* Output : None. +* Return : Linecoding structure base address. +*******************************************************************************/ +uint8_t *Virtual_Com_Port_SetLineCoding(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding); + return NULL; + } + return(uint8_t *)&linecoding; +} + +/******************************************************************************* + * Function Name : VC_Init. + * Description : Initialise USB structure with VC values. + * Input : None. + * Output : None. + * Return : None. + *******************************************************************************/ +void VC_Init(void) +{ + IMR_MSK = VC__IMR_MSK; + Device_Table = VC__Device_Table; + Device_Property = VC__Device_Property; + User_Standard_Requests = VC__User_Standard_Requests; + Device_Descriptor = VC__Device_Descriptor; + Config_Descriptor = VC__Config_Descriptor; + String_Descriptor = VC__String_Descriptor; + return; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/src/battery.c b/Firmware/WIMU3/src/battery.c new file mode 100644 index 0000000..02a06c0 --- /dev/null +++ b/Firmware/WIMU3/src/battery.c @@ -0,0 +1,247 @@ +//****************************************************************************** +// WIMUuSD - ADC Module +// +// Description: +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 20th, 2012 +// +// Modifications: +// +//****************************************************************************** + +/* Includes ------------------------------------------------------------------*/ +#include "battery.h" +#include "power.h" +#include "stm32l1xx_dma.h" +#include // For memset + +/* Global variables ----------------------------------------------------------*/ +//BatteryMonitoringState_TypeDef BatMonitoring_State = BATTERY_MONITORING; + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +ADC_InitTypeDef ADC_InitStruct = +{ + ADC_Resolution_12b, // ADC_Resolution + ENABLE, // ADC_ScanConvMode + ENABLE, // ADC_ContinuousConvMode + ADC_ExternalTrigConvEdge_None, // ADC_ExternalTrigConvEdge + ADC_ExternalTrigConv_T9_TRGO, // ADC_ExternalTrigConv + ADC_DataAlign_Right, // ADC_DataAlign + 2 // ADC_NbrOfConversion +}; + +ADC_CommonInitTypeDef ADC_CommonInitStruct = +{ + ADC_Prescaler_Div1 // ADC_Prescaler +}; + +//uint16_t BatteryADC_Buffer[10] = {0,0,0,0,0,0,0,0,0,0}; // Keep last 10 samples +//uint8_t Battery_Buffer_Ptr=0; + +uint32_t BatteryTemp_ADC[2]; // Battery and temperature buffer for DMA transfers + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +void BatteryMonitoring_Config(void) +{ + BatteryMonitoring_Stop(); + BatteryTemp_ADC[0] = 0; + BatteryTemp_ADC[1] = 0; + + DMA_InitTypeDef DMA_InitStructure; + + /* -------- Starting HSI clock -------- */ + RCC_HSICmd(ENABLE); + while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); + + // Enable temperature reading + ADC_TempSensorVrefintCmd(ENABLE); + + /* ---------- Configuring ADC ---------- */ + + // DMA config + + /* Enable DMA1 clock */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + + /* De-initialise DMA */ + DMA_DeInit(DMA1_Channel1); + + /* DMA1 channel1 configuration */ + DMA_StructInit(&DMA_InitStructure); + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); // Set DMA channel Peripheral base address to ADC Data register + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&BatteryTemp_ADC[0]; // Set DMA channel Memeory base addr to ADC buffer address + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // Set DMA channel direction to peripheral to memory + DMA_InitStructure.DMA_BufferSize = 2; // Set DMA channel buffersize to peripheral to ADC_CONV_BUFF_SIZE + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // Disable DMA channel Peripheral address auto increment + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // Enable Memory increment + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // set Peripheral data size to 8bit + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; // set Memeory data size to 8bit + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // Set DMA in normal mode + DMA_InitStructure.DMA_Priority = DMA_Priority_High; // Set DMA channel priority to High + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // Disable memory to memory option + DMA_Init(DMA1_Channel1, &DMA_InitStructure); // Use Init structure to initialise channel1 (channel linked to ADC) + + DMA_Cmd(DMA1_Channel1, ENABLE); // Enable DMA transfer + +// Configuring ADC prescaler, resolution and data alignment + ADC_CommonInit(&ADC_CommonInitStruct); + ADC_Init(ADC1, &ADC_InitStruct); + + // Setting ADC auto power down (This must be done only when ADON = 0 (ADC power down)) + ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle, ENABLE); + + // Configuring the sampling time (This must be done only when ADON = 0 (ADC power down)) + ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_384Cycles); + ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 2, ADC_SampleTime_384Cycles); //Temperature sensor + + // Enabling EOC bit setting at end of conversion + //ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE); + + // Clearing EOC flag + ADC_ClearFlag(ADC1, ADC_FLAG_EOC); + + // Enable DMA transfer on ADC after each conversion + ADC_DMACmd(ADC1, ENABLE); + ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); + + // Enabling ADC (Set ADON bit in CR2 register) + ADC_Cmd(ADC1, ENABLE); + + // Starting ADC conversion + ADC_SoftwareStartConv(ADC1); + +} + +void BatteryMonitoring_Stop(){ + // Disabling ADC (Clear ADON bit in CR2 register) + ADC_Cmd(ADC1, DISABLE); + DMA_DeInit(DMA1_Channel1); + ADC_DeInit(ADC1); + + // Disable temperature reading + ADC_TempSensorVrefintCmd(DISABLE); + + // Clear and reset buffers + BatteryTemp_ADC[0] = 0; + BatteryTemp_ADC[1] = 0; + + //memset(&BatteryADC_Buffer,0,10); + //Battery_Buffer_Ptr = 0; + //Battery_ADCValue = 0; + +} + +uint16_t BatteryMonitoring_GetBatteryADCValue(){ + return (uint16_t)BatteryTemp_ADC[0]; +} + +uint16_t BatteryMonitoring_GetTempADCValue(){ + return (uint16_t)BatteryTemp_ADC[1]; +} + +/* +uint8_t BatteryMonitoring_RdADC(uint16_t * ADCValue) +{ + uint8_t i; + // Validating that HSI clock is stable + if(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) + { + return 0; + } + + // Validating that the ADC is ready to start a conversion (ADSONS = 1 and RCNR = 0) + if(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == SET && ADC_GetFlagStatus(ADC1, ADC_FLAG_RCNR) == RESET) + { + // Set channel + ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_4Cycles); + + // Starting ADC conversion + ADC_SoftwareStartConv(ADC1); + + // Wait for conversion completion + while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); + + // Clearing EOC flag + ADC_ClearFlag(ADC1, ADC_FLAG_EOC); + + BatteryADC_Buffer[Battery_Buffer_Ptr++] = (uint16_t)(ADC_GetConversionValue(ADC1)); + + if (Battery_Buffer_Ptr>=10) + Battery_Buffer_Ptr = 0; + + while (BatteryADC_Buffer[9]==0){ // Fill buffer with samples, if needed + // Starting ADC conversion + ADC_SoftwareStartConv(ADC1); + + // Wait for conversion completion + while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); + + // Clearing EOC flag + ADC_ClearFlag(ADC1, ADC_FLAG_EOC); + + BatteryADC_Buffer[Battery_Buffer_Ptr++] = (uint16_t)(ADC_GetConversionValue(ADC1)); + + if (Battery_Buffer_Ptr>=10) + Battery_Buffer_Ptr = 0; + } + + // Return max over the period + *ADCValue=BatteryADC_Buffer[0]; + for (i=1; i<10; i++){ + if (BatteryADC_Buffer[i]>*ADCValue) + *ADCValue = BatteryADC_Buffer[i]; + } + + return 1; + } + else + { + return 0; + } + +} + +uint8_t TempMonitoring_RdADC(uint16_t* ADCValue){ + + + // Validating that HSI clock is stable + if(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) + { + return 0; + } + + // Validating that the ADC is ready to start a conversion (ADSONS = 1 and RCNR = 0) + if(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == SET && ADC_GetFlagStatus(ADC1, ADC_FLAG_RCNR) == RESET) + { + // Set channel + ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_384Cycles); //Temperature sensor + + // Starting ADC conversion + ADC_SoftwareStartConv(ADC1); + + // Wait for conversion completion + while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); + + // Clearing EOC flag + ADC_ClearFlag(ADC1, ADC_FLAG_EOC); + + *ADCValue = (uint16_t)(ADC_GetConversionValue(ADC1)); + + return 1; + } + else + { + return 0; + } +}*/ + +/* Private functions ---------------------------------------------------------*/ diff --git a/Firmware/WIMU3/src/ble.c b/Firmware/WIMU3/src/ble.c new file mode 100644 index 0000000..aa971cd --- /dev/null +++ b/Firmware/WIMU3/src/ble.c @@ -0,0 +1,720 @@ +#include "Merged__hw_config.h" +#include "ble.h" +#include "config.h" +#include "utils.h" +#include //memcpy + +#include "datalogger.h" // To get current recording directory + +#include "buttons.h" // To simulate button presses +#include "RTC.h" +#include "gps.h" + +unsigned char ble_rx[BLE_RX_BUF_NUM][BLE_RX_BUFFER]; +unsigned char ble_tx[BLE_TX_BUF_NUM][BLE_TX_BUFFER]; + +unsigned char ble_rx_rd_ptr; // Actual RX read index +unsigned char ble_rx_wr_ptr; // Actual RX write index +unsigned char ble_tx_rd_ptr; // Actual TX read index +unsigned char ble_tx_wr_ptr; // Actual TX write index + +volatile unsigned char ble_rx_index; +volatile unsigned char ble_tx_index; + +volatile unsigned char ble_rx_queue; +volatile unsigned char ble_tx_queue; + +uint16_t ble_tx_len[BLE_TX_BUF_NUM]; +uint16_t ble_rx_len[BLE_RX_BUF_NUM]; + +bool ble_rx_ready; + +extern unsigned long timestamp; + +unsigned long total_rx_frames=0; +unsigned long total_tx_frames=0; + +RemControl_Struct ble_control; + +bool ble_update_time = false; + +//BOOL test_mode=TRUE; + +// Data frame structures +POWERFrame_Struct POWERFrame; +DEVINFOFrame_Struct DEVINFOFrame; + +CurrentTime_Struct current_time; + +/* Extern variables ----------------------------------------------------------*/ +extern RTC_TimeTypeDef RTC_TimeStruct; +extern RTC_DateTypeDef RTC_DateStruct; + +//------------------------------------------------------------------------------ +// INIT_BLE +//------------------------------------------------------------------------------ +// Initialization function for the BLE module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if initialization was successfully completed +// 0xYY, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +unsigned char init_ble(void){ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStruct; + + /* Enabling USART clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + + // Connecting TX and RX pins to the desired peripherals' Alternate Function + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); + + /* Configure USART Tx as alternate function and selecting the type, pull-up/pull-down and output speed */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure USART Rx as alternate function and selecting the type and pull-up/pull-down */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Initializing the USART (Baud Rate, Word Length , Stop Bit, Parity, Hardware + flow control and Mode) */ + USART_InitStruct.USART_BaudRate = 230400;//115200; + USART_InitStruct.USART_WordLength = USART_WordLength_8b; + USART_InitStruct.USART_StopBits = USART_StopBits_1; + USART_InitStruct.USART_Parity = USART_Parity_No; + USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_Init(USART2, &USART_InitStruct); + + BLE_SetupPower(); + + + // Initialize device info frame + DEVINFOFrame.serialNumber = wimu_settings.id; + DEVINFOFrame.hardRevision = wimu_settings.hw_id; + for(int i = 0;i<(LEN_VERSION_STRING -2);i++) { // without new line and carriage return (\n\r) + DEVINFOFrame.firmSoftRevision[i] = *(VERSION_STRING + i);} + + + return 0x00; +} + +unsigned char start_ble(){ + uint8_t i; + + // Reset pointers + ble_rx_index=0; + ble_tx_index=0; + ble_rx_rd_ptr=0; + ble_rx_wr_ptr=0; + ble_tx_rd_ptr=0; + ble_tx_wr_ptr=0; + ble_rx_queue=0; + ble_tx_queue=0; + for (i=0; i= BLE_RX_BUF_NUM) // At the end of the buffers? + ble_rx_rd_ptr=0; + + ble_rx_queue--; + + return rval; +} + +void BLE_sendIMUData(IMUFrame_Struct* imu_data/*int16_t *acc, int16_t *gyro, int16_t *mag*/){ + static uint16_t fnum=0; + + IMUFrame_Struct tosend; + BLEFrame_Struct frame; + + //uint8_t i; + + //Copy IMU data to send into local buffer (in case of overwrite) + memcpy(&tosend, imu_data, sizeof(IMUFrame_Struct)); + + tosend.frame_num = fnum++; + /*tosend.frame_num = 1; + + for (i=0;i<3; i++){ + tosend.acc_data[i] = 1*i; + tosend.gyro_data[i] = 2*i; + tosend.mag_data[i] = 3*i; + } + + tosend.quaternion[0]=1; + tosend.quaternion[1]=2; + tosend.quaternion[2]=3; + tosend.quaternion[3]=4;*/ + frame.data_type = BLE_IMU_DATA; + frame.length = sizeof(IMUFrame_Struct); + //frame.crc=0xffffffff; + frame.data = (uint8_t*)&tosend; + + BLE_sendFrame(&frame); +} + +void BLE_sendGPSData(unsigned char* gps_data, unsigned short length, uint8_t frame_type){ + uint32_t value32; + uint16_t value16; + uint8_t value8; + + if (frame_type == SIRF_GEO_DATA){ + //led_toggle(LED_GREEN,NO_PRIORITY); + + // Build and send GPS position update + GPSFrame_struct GPSFrame; + + // Time + ////////////////// + GPSFrame.date_time.year = gps_data[SIRF_HEADER_LEN + SIRF_GEO_YEAR_POS_OFFSET+1] + (unsigned short)(gps_data[SIRF_HEADER_LEN + SIRF_GEO_YEAR_POS_OFFSET]<<8); + GPSFrame.date_time.month = gps_data[SIRF_HEADER_LEN + SIRF_GEO_MONTH_POS_OFFSET]; + GPSFrame.date_time.day = gps_data[SIRF_HEADER_LEN + SIRF_GEO_DAY_POS_OFFSET]; + GPSFrame.date_time.hours = gps_data[SIRF_HEADER_LEN + SIRF_GEO_HOUR_POS_OFFSET]; + GPSFrame.date_time.minutes = gps_data[SIRF_HEADER_LEN + SIRF_GEO_MINUTE_POS_OFFSET]; + GPSFrame.date_time.seconds = (gps_data[SIRF_HEADER_LEN + SIRF_GEO_SECOND_POS_OFFSET+1] + (unsigned short)(gps_data[SIRF_HEADER_LEN + SIRF_GEO_SECOND_POS_OFFSET]<<8))/1000; + + // Position + ///////////////// + value32 = gps_data[SIRF_HEADER_LEN + SIRF_GEO_LATITUDE_POS_OFFSET+3] + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LATITUDE_POS_OFFSET+2]<<8) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LATITUDE_POS_OFFSET+1]<<16) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LATITUDE_POS_OFFSET]<<24); + GPSFrame.loc_speed.latitude = value32; + + value32 = gps_data[SIRF_HEADER_LEN + SIRF_GEO_LONGITUDE_POS_OFFSET+3] + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LONGITUDE_POS_OFFSET+2]<<8) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LONGITUDE_POS_OFFSET+1]<<16) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_LONGITUDE_POS_OFFSET]<<24); + GPSFrame.loc_speed.longitude = value32; + + // Elevation + //////////////// + GPSFrame.loc_speed.elevation[0] = gps_data[SIRF_HEADER_LEN + SIRF_GEO_ALTITUDE_POS_OFFSET+3]; + GPSFrame.loc_speed.elevation[1] = gps_data[SIRF_HEADER_LEN + SIRF_GEO_ALTITUDE_POS_OFFSET+2]; + GPSFrame.loc_speed.elevation[2] = gps_data[SIRF_HEADER_LEN + SIRF_GEO_ALTITUDE_POS_OFFSET+1]; + + // Speed + //////////////// + GPSFrame.loc_speed.instantSpeed = gps_data[SIRF_HEADER_LEN + SIRF_GEO_SPEED_POS_OFFSET+1] + (unsigned short)(gps_data[SIRF_HEADER_LEN + SIRF_GEO_SPEED_POS_OFFSET]<<8); + + // Precisions + //////////////// + value32 = gps_data[SIRF_HEADER_LEN + SIRF_GEO_EHPE_POS_OFFSET+3] + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EHPE_POS_OFFSET+2]<<8) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EHPE_POS_OFFSET+1]<<16) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EHPE_POS_OFFSET]<<24); + GPSFrame.quality.ehpe = value32; + + value32 = gps_data[SIRF_HEADER_LEN + SIRF_GEO_EVPE_POS_OFFSET+3] + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EVPE_POS_OFFSET+2]<<8) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EVPE_POS_OFFSET+1]<<16) + + ((uint32_t)gps_data[SIRF_HEADER_LEN + SIRF_GEO_EVPE_POS_OFFSET]<<24); + GPSFrame.quality.evpe = value32; + + GPSFrame.quality.hdop = gps_data[SIRF_HEADER_LEN + SIRF_GEO_HDOP_POS_OFFSET]; + + // GPS in fix + /////////////////// + GPSFrame.quality.beaconsInSolution = gps_data[SIRF_HEADER_LEN + SIRF_GEO_SATNUM_POS_OFFSET]; + + // Adjust flags for available information + ///////////////////////////////////////// + GPSFrame.quality.flags = 0x0079; + GPSFrame.loc_speed.flags = 0x004d; + + // Position valid + ///////////////// + value16 = gps_data[SIRF_HEADER_LEN + SIRF_GEO_NAVTYPE_POS_OFFSET + 1] + + ((uint16_t)(gps_data[SIRF_HEADER_LEN + SIRF_GEO_NAVTYPE_POS_OFFSET]) << 8); + + value8 = (value16 & 0x0007); + + //GPSFrame.quality.flags &= GPS_POSITION_QUALITY_CLEAR_MASK; + if (value8==0){ + // No navigation fix + GPSFrame.quality.flags |= GPS_POSITION_QUALITY_INVALID_MASK; + GPSFrame.loc_speed.flags |= GPS_POSITION_QUALITY_INVALID_MASK; + } + if (value8>0 && (value8<4 || value8 == 5 || value8 == 6)){ + GPSFrame.quality.flags |= GPS_POSITION_QUALITY_ESTIMATED_MASK; + GPSFrame.loc_speed.flags |= GPS_POSITION_QUALITY_ESTIMATED_MASK; + } + if (value8==4){ + GPSFrame.quality.flags |= GPS_POSITION_QUALITY_OK_MASK; + GPSFrame.loc_speed.flags |= GPS_POSITION_QUALITY_OK_MASK; + } + if (value8==7){ + GPSFrame.quality.flags |= GPS_POSITION_QUALITY_LASTKNOWN_MASK; + GPSFrame.loc_speed.flags |= GPS_POSITION_QUALITY_LASTKNOWN_MASK; + } + + BLEFrame_Struct frame; + + frame.data_type = BLE_GPS_DATA; + frame.length = sizeof(GPSFrame); + // frame.crc=0xffffffff; + frame.data = (uint8_t*)&GPSFrame; + + BLE_sendFrame(&frame); + } + +} + +void BLE_sendPOWERData(POWERFrame_Struct* power_data){ + BLEFrame_Struct frame; + + frame.data_type = BLE_POWER_DATA; + frame.length = sizeof(POWERFrame_Struct); + //frame.crc=0xffffffff; + frame.data = (uint8_t*)power_data; + + BLE_sendFrame(&frame); +} + +void BLE_sendDevInfoData(DEVINFOFrame_Struct* devInfo_data){ + BLEFrame_Struct frame; + + frame.data_type = BLE_DEVINFO_DATA; + frame.length = sizeof(DEVINFOFrame_Struct); + //frame.crc=0xffffffff; + frame.data = (uint8_t*)devInfo_data; + + BLE_sendFrame(&frame); + + // Always send the config at the same time! + BLE_sendConfig(&wimu_config); +} + +void BLE_sendConfig(WIMU_CONFIG* config_data){ + BLEFrame_Struct frame; + IMUConfig_Struct configFrame; + + // Fill frame with informations + configFrame.enabled_modules = config_data->enabled_modules; + configFrame.sampling_rate = config_data->general.sampling_rate; + configFrame.acc_range = config_data->acc.range; + configFrame.gyro_range = config_data->gyro.range; + configFrame.mag_range = config_data->magneto.range; + + frame.data_type = BLE_CONFIG_DATA; + frame.length = sizeof(IMUConfig_Struct); + + //frame.crc=0xffffffff; + frame.data = (uint8_t*)&configFrame; + + BLE_sendFrame(&frame); +} + +void BLE_sendRemoteControlData(RemControl_Struct* remCon){ + BLEFrame_Struct frame; + + frame.data_type = BLE_CONTROL_DATA; + frame.length = sizeof(RemControl_Struct); + + //frame.crc=0xffffffff; + frame.data = (uint8_t*)remCon; + + BLE_sendFrame(&frame); +} + +void BLE_sendCurrentDateTime(){ + + // led_toggle(LED_GREEN,NO_PRIORITY); + + /*RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); + RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);*/ + + current_time.exact_time.day_date_time.date_time.seconds = RTC_TimeStruct.RTC_Seconds; + current_time.exact_time.day_date_time.date_time.minutes = RTC_TimeStruct.RTC_Minutes; + current_time.exact_time.day_date_time.date_time.hours = RTC_TimeStruct.RTC_Hours; + current_time.exact_time.day_date_time.date_time.day = RTC_DateStruct.RTC_Date; + current_time.exact_time.day_date_time.date_time.month = RTC_DateStruct.RTC_Month; + current_time.exact_time.day_date_time.date_time.year = RTC_DateStruct.RTC_Year + 2000; + + current_time.exact_time.day_date_time.day_of_week = RTC_DateStruct.RTC_WeekDay; + current_time.exact_time.fractions256 = 0; // No ms value... yet! + + current_time.adjust_reason = 0x02; // External time reference update + + BLEFrame_Struct frame; + + frame.data_type = BLE_DATETIME_DATA; + frame.length = sizeof(CurrentTime_Struct); + //frame.crc=0xffffffff; + frame.data = (uint8_t*)¤t_time; + + BLE_sendFrame(&frame); + + +} + +void BLE_sendFrame(BLEFrame_Struct* frame){ + // Check for overflow + if (frame->length+4 > BLE_TX_BUFFER) + return; + + if (wimu_config.ui.ble_activity_led==true) + led(LED_BLUE,true,MEDIUM_PRIORITY); + + //Copy the bytes into the actual transmit buffer + //ble_tx[ble_tx_wr_ptr][0] = SYNC_BYTE; + ble_tx[ble_tx_wr_ptr][0] = frame->data_type; + ble_tx[ble_tx_wr_ptr][1] = frame->length; + memcpy(&ble_tx[ble_tx_wr_ptr][2], frame->data, frame->length); + /*memcpy(&ble_tx[ble_tx_wr_ptr][2], &frame->length, 2); + memcpy(&ble_tx[ble_tx_wr_ptr][4], frame->data, frame->length);*/ + uint16_t size = frame->length+2; + uint8_t stuffed[BLE_TX_BUFFER]; + + COBS_StuffData(&ble_tx[ble_tx_wr_ptr][0], size, &stuffed[0]); + memcpy(&ble_tx[ble_tx_wr_ptr][0], stuffed, size+1); + ble_tx[ble_tx_wr_ptr][size+1] = BLE_SYNC_BYTE; + + //Set the message length + ble_tx_len[ble_tx_wr_ptr] = size+2; + + //Increment buffer ptr + ble_tx_wr_ptr++; + if (ble_tx_wr_ptr >= BLE_TX_BUF_NUM){ + ble_tx_wr_ptr=0; + } + + //Start the transfer of the first byte, if not sending already + //__disable_irq(); + ble_tx_queue++; + if (ble_tx_queue>BLE_TX_BUF_NUM) + ble_tx_queue = BLE_TX_BUF_NUM; + + if (ble_tx_queue==1){ + //Start transfer + USART_SendData(USART2, ble_tx[ble_tx_rd_ptr][0]); + } + //__enable_irq(); + + if (wimu_config.ui.ble_activity_led==false) + led(LED_BLUE,false,MEDIUM_PRIORITY); +} + +void BLE_ConfigRxIRQ(FunctionalState NewState) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + USART_ClearFlag(USART2, USART_FLAG_RXNE); + USART_ITConfig(USART2, USART_IT_RXNE, NewState); + + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + +} +void BLE_ConfigTxIRQ(FunctionalState NewState) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + USART_ClearFlag(USART2, USART_FLAG_TC); + USART_ITConfig(USART2, USART_IT_TC, NewState); + + NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; + NVIC_Init(&NVIC_InitStructure); + +} + +#define COBS_FinishBlock(X) (*code_ptr = (X), code_ptr = dst++, code = 0x01) + +void COBS_StuffData(const unsigned char *ptr, +unsigned long length, unsigned char *dst) +{ + const unsigned char *end = ptr + length; + unsigned char *code_ptr = dst++; + unsigned char code = 0x01; + + while (ptr < end) + { + if (*ptr == 0) + COBS_FinishBlock(code); + else + { + *dst++ = *ptr; + if (++code == 0xFF) + COBS_FinishBlock(code); + } + ptr++; + } + + COBS_FinishBlock(code); +} + +/* + * Defensive UnStuffData, which prevents poorly + * conditioned data at *ptr from over-running + * the available buffer at *dst. + */ + +void COBS_UnStuffData(const unsigned char *ptr, +unsigned long length, unsigned char *dst) +{ + const unsigned char *end = ptr + length; + while (ptr < end) + { + int i, code = *ptr++; + for (i=1; ptr= BLE_RX_BUF_NUM) // All buffers were used + ble_rx_wr_ptr = 0; + + ble_rx_ready=true; + } + + // SYNC + /*if (ble_rx_index==1){ + //1 byte received, and no length yet + if (ble_rx[ble_rx_wr_ptr][0]!=SYNC_BYTE){ + //Not synced, reset the buffer. + ble_rx_index=0; + ble_rx_len[ble_rx_wr_ptr]=0; + } +// led_toggle(LED_BLUE); + }else{ + + //DATA LENGTH + if (ble_rx_index==4){ + //Set length + ble_rx_len[ble_rx_wr_ptr] = ble_rx[ble_rx_wr_ptr][2] + (uint16_t)(ble_rx[ble_rx_wr_ptr][3]<<8) + 4; + } + + if (ble_rx_index>BLE_RX_BUFFER || ble_rx_index==ble_rx_len[ble_rx_wr_ptr]){ + //Command completed or overflowed... + ble_rx_index=0; + ble_rx_queue++; + total_rx_frames++; + + ble_rx_wr_ptr++; + if (ble_rx_wr_ptr >= BLE_RX_BUF_NUM) // All buffers were used + ble_rx_wr_ptr = 0; + + ble_rx_ready=TRUE; + } + }*/ + //rx_byte = USART_ReceiveData(USART2); + //printf("%c", rx_byte); + //USART_SendData(USART2, rx_byte); + //test_mode=TRUE; + } + + // Data Transmitted + if(USART_GetITStatus(USART2, USART_IT_TC) != RESET) + { + USART_ClearFlag(USART2, USART_FLAG_TC); + //Check for the next char to send + if (ble_tx_queue>0){ + ble_tx_index++; + if (ble_tx_index >= BLE_TX_BUFFER || ble_tx_index >= ble_tx_len[ble_tx_rd_ptr]){ + //This sequence is over. + if (ble_tx_queue>0){ + //__disable_irq(); + ble_tx_queue--; + //__enable_irq(); + } + ble_tx_rd_ptr++; + ble_tx_index=0; + total_tx_frames++; + if (ble_tx_rd_ptr >= BLE_TX_BUF_NUM) // All buffers were used + ble_tx_rd_ptr = 0; + if (ble_tx_queue>0){ + //Sends the next message + USART_SendData(USART2, ble_tx[ble_tx_rd_ptr][ble_tx_index]); + }/*else{ + if (total_tx_frames%50==0) + led_toggle(LED_RED); + }*/ + }else{ + //Sends the next char waiting! + //while (!(UCA3IFG&UCTXIFG)); + USART_SendData(USART2, ble_tx[ble_tx_rd_ptr][ble_tx_index]); + } + } + + } + + + +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/buttons.c b/Firmware/WIMU3/src/buttons.c new file mode 100644 index 0000000..46cb6ba --- /dev/null +++ b/Firmware/WIMU3/src/buttons.c @@ -0,0 +1,243 @@ +#include "buttons.h" +#include "utils.h" +#include "config.h" +#include "usb.h" +#include "power.h" +#include "usb_pwr.h" +#include "MS__usb_prop.h" + +//#include "MPUCompass_driver.h" + +// Push button for WIMU +PushButton_TypeDef PowerButton = // Power Button +{ + GPIOC, // GPIOx + RCC_AHBPeriph_GPIOC, // GPIOx_PeriphClk + GPIO_Pin_5, // GPIOx_Pin + INACTIVE, // State + 0, // LastActivationNbrTicks + 0, // Number of press on that button + BTN_NO_ACTION // Requested Action +}; + +PushButton_TypeDef ModeButton = // Mode Button +{ + GPIOC, // GPIOx + RCC_AHBPeriph_GPIOC, // GPIOx_PeriphClk + GPIO_Pin_4, // GPIOx_Pin + INACTIVE, // State + 0, // LastActivationNbrTicks + 0, // Number of press on that button + BTN_NO_ACTION // Requested Action +}; + +//------------------------------------------------------------------------------ +// PushButton_GetState +//------------------------------------------------------------------------------ +// Description: Returns the selected Button state. +// +//------------------------------------------------------------------------------ +// Parameters: +// Button: specifies the Button to be checked +// +// Return value: +// State = POLLING : the code is polling for push button activation +// State = ACTIVE : the push button is currently activated. A user that take action +// based on ACTIVE state MUST set State to POLLING when State +// reach ACTIVATION_PENDING. +// State = ACTIVATION_PENDING : activation event is pending. In order to catch other +// button event, user MUST put the State back to POLLING +// None +//------------------------------------------------------------------------------ +PushButtonState_TypeDef PushButton_GetState(PushButton_TypeDef * Button) +{ + return Button->State; +} + +void PushButton_SetState(PushButton_TypeDef * Button, PushButtonState_TypeDef state){ + Button->State = state; + if (state==ACTIVE){ + Button->LastActivationTimeStamp = timestamp; + if (Button->NbrOfPress==1){ + Button->FirstActivationTimeStamp = timestamp; + } + } +} + +void PushButton_SetAction(PushButton_TypeDef * Button, PushButtonAction_TypeDef action){ + Button->RequestedAction = action; +} + +void PushButton_UpdateState(PushButton_TypeDef * Button){ + uint8_t debounce_tick; + switch (Button->State){ + case INACTIVE: + if (PushButton_GetPinState(Button)){ + // Start debouncing + Button->State = DEBOUNCING; + } + break; + case ACTIVE: + if (!PushButton_GetPinState(Button)){ + // Button was released + PushButton_Reset(Button); + } + break; + case DEBOUNCING: + if (!Power_IsInStopMode()) + debounce_tick = PUSH_BUTTON_DEBOUNCE_TICK; + else + debounce_tick = PUSH_BUTTON_DEBOUNCE_TICK_LOWPOW; + + if (Button->ActivationNbrOfTicks>=debounce_tick){ + if (PushButton_GetPinState(Button)){ + Button->NbrOfPress++; + PushButton_SetState(Button, ACTIVE); + Buzzer_Start(20); + }else{ + PushButton_Reset(Button); + } + } + + break; + default: + break; + } + + // Reset everything if last activation > 2 seconds + if (Button->LastActivationTimeStamp >= timestamp+2){ + PushButton_ResetAll(Button); + } + + +} + +void PushButton_ModeButtonUpdateAction(){ + if (ModeButton.State == DEBOUNCING) return; + + // Mark + if (ModeButton.NbrOfPress==1 && !USB_IsConnected()){ + ModeButton.RequestedAction = BTN_MARK; + ModeButton.NbrOfPress=0; + } + + // Change USB Mode + if (ModeButton.NbrOfPress==1 && USB_IsConnected()){ + ModeButton.RequestedAction = BTN_USB_MODE; + ModeButton.NbrOfPress=0; + + /*if (Power_GetState()!=POWER_STATE_USB_ON){ + ModeButton.RequestedAction = BTN_NO_ACTION; // Clear requested action since we manage it here + // Change power state + Power_SetState(POWER_STATE_USB_ON); + + // Power USB On + PowerOn(); + }*/ + } +} + +void PushButton_PowerButtonUpdateAction(){ + if (PowerButton.State == DEBOUNCING) return; + // On-Off + if (PowerButton.NbrOfPress==3){ + PowerButton.RequestedAction = BTN_ON_OFF; + PowerButton.NbrOfPress=0; + } + + + +} +/* +uint16_t PushButton_GetActivationNbrTicks(PushButton_TypeDef * Button) +{ + return Button->ActivationNbrOfTicks; +}*/ + +void PushButton_Reset(PushButton_TypeDef * Button) +{ + PushButton_SetState(Button, INACTIVE); + Button->ActivationNbrOfTicks = 0; + //Button->NbrOfPress = 0; +} + +void PushButton_ResetAll(PushButton_TypeDef * Button) +{ + PushButton_Reset(Button); + Button->NbrOfPress = 0; + Button->RequestedAction = BTN_NO_ACTION; + Button->LastActivationTimeStamp = 0; + Button->FirstActivationTimeStamp = 0; +} + +void PushButton_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(ModeButton.GPIOx_PeriphClk | PowerButton.GPIOx_PeriphClk, ENABLE); + + /* Configure push button pins */ + GPIO_InitStructure.GPIO_Pin = PowerButton.GPIOx_Pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(PowerButton.GPIOx, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = ModeButton.GPIOx_Pin; + GPIO_Init(ModeButton.GPIOx, &GPIO_InitStructure); + + // Enable DMA clock - for a strange reason, this needs to be enabled.....!! + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + +} + +void PushButton_SetInterrupt(PushButton_TypeDef* Button, bool enabled){ + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + switch (Button->GPIOx_Pin){ + case GPIO_Pin_4: //Push Button 2 + if (enabled==true) SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource4); + EXTI_InitStructure.EXTI_Line = EXTI_Line4; + NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; + break; + case GPIO_Pin_5: //Push Button 1 + if (enabled==true) SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource5); + EXTI_InitStructure.EXTI_Line = EXTI_Line5; + NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; + break; + default: + return; // Unsupported config + } + + if (enabled==true){ + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + }else{ + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + } + + // Configure EXTI line for button interrupts + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //EXTI_Trigger_Falling; + EXTI_Init(&EXTI_InitStructure); + + // Enable and set the EXTI interrupt priority + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_Init(&NVIC_InitStructure); + + // Clear all pending interrupt + EXTI_ClearITPendingBit(EXTI_InitStructure.EXTI_Line); + +} + +bool PushButton_GetPinState(PushButton_TypeDef *Button){ + uint8_t value; + value = GPIO_ReadInputDataBit(Button->GPIOx, Button->GPIOx_Pin); + if (value == PUSHBUTTON_INACTIVE_STATE) + return false; + else + return true; +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/datalogger.c b/Firmware/WIMU3/src/datalogger.c new file mode 100644 index 0000000..b9bfa44 --- /dev/null +++ b/Firmware/WIMU3/src/datalogger.c @@ -0,0 +1,668 @@ +//****************************************************************************** +// WIMUuGPS - DataLogger +// +// Description: This is the internal datalogger call functions. The functions +// follow the conventional peripheral structures, with added +// features to support peripheral specific functions. Currently, +// the system supports a direct microSD card interface using SPI. +// +// Author: Simon Brière, ing., M. Sc. A. +// Initial Version: November 29th, 2010 +// +// Modifications: +// March 30th, 2011 - Prevented new folder being created if WIMU did not reboot +//****************************************************************************** +#include "datalogger.h" +#include "utils.h" + +#include "storage.h" +#include "usb.h" // For mass storage + +//#include "fsr.h" // Used to enabled / disable seated detection +#include "gps.h" + +#include "ble.h" // For BLE recording control + +#include //For timestamping functions +#include //For sprintf +#include + +settings DOS_settings; + +unsigned char dos_acc_filename[12]; +unsigned char dos_gyro_filename[12]; +unsigned char dos_joy_filename[12]; +unsigned char dos_mag_filename[12]; +unsigned char dos_gps_filename[12]; +unsigned char dos_quaternion_filename[12]; +//unsigned char dos_sonars_filename[12]; +//unsigned char dos_encoders_filename[12]; +//unsigned char dos_fsr_filename[12]; +unsigned char dos_power_filename[12]; + +int dos_filenum; +unsigned long dos_split_ts; +unsigned short dos_errors; + +unsigned char dos_runtime=0; + +uint16_t dos_rec_count=0; // Number of manual recorded folders present on the card +bool dos_isRecording = false; // Flag to indicate if we are indeed recording in a specific folder or not + +FATFS fatfs; +FIL dos_files[DOS_OPENFILE_NUM]; // Open files pointers + + +// Private prototypes +FRESULT datalog_update_manual_recordings_count(); +FRESULT datalog_save_config(); +FRESULT datalog_save_settings(); + +//------------------------------------------------------------------------------ +// INIT_DATALOGGER +//------------------------------------------------------------------------------ +// Initialization function for the DataLogger module. Currently, USCI_A1 in SPI +// mode is used to interface the chip. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if initialization was successfully completed +// 0xYY, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +unsigned char init_datalogger(void){ + + //Nothing to do here - all done in sd.c - sd_initialize() function. + dos_errors = 0; + //dos_runtime = 0; //Already initialized in declaration, no need to touch it anymore + + return 0x00; //No error +} + +//------------------------------------------------------------------------------ +// START_DATALOGGER +//------------------------------------------------------------------------------ +// Startup function for the DataLogger module. Creates Data Folder for the +// experiment. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if startup was successfully completed +// 0xYY, if startup wasn't successfully completed and where YY=error code +//------------------------------------------------------------------------------ +unsigned char start_datalogger(void){ + FRESULT status; + + dos_errors = 0; + + if (fatfs.id!=0) + return 0; + + //f_mount(0, &fatfs); /* Register volume work area (never fails) */ + f_mount(&fatfs, "", 1); +/* if ((status = f_chdrive(0))!= FR_OK) + return 1;//status;*/ + + // Count numbers of manually started recordings + if (!datalog_update_manual_recordings_count()==FR_OK) + return 2; + status = datalog_change_folder(); + if (status!=0) + return status; + + return 0x00; +} + +//------------------------------------------------------------------------------ +// RESET_DATALOGGER +//------------------------------------------------------------------------------ +// Executes an hardware reset of the DataLogger module. Not used anymore in current +// configuration. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (void): +// None +//------------------------------------------------------------------------------ +unsigned char reset_datalogger(void){ + unsigned char status=0; + stop_datalogger(); + msWait(100); + status = start_datalogger(); + if (status>0) + setModuleState(MODULE_DATALOGGER, STATE_ONLINE); + return status; +} + +//------------------------------------------------------------------------------ +// STOP_DATALOGGER +//------------------------------------------------------------------------------ +// Stop the Datalogger +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (void): +// None +//------------------------------------------------------------------------------ +void stop_datalogger(void){ + //unsigned char tmp; + f_mount(0, NULL, 1); // Unmount file system + + //tmp = UCA1RXBUF; + + //Clear structure buffer + memset(&fatfs,0,sizeof(FATFS)); + + SPI_I2S_DeInit(SD_SPI); + + //--TODO: Disable clock system & remove power to card (NV) + + //while (!(UCA1IFG&UCTXIFG)); + //while (!(UCA1IFG&UCRXIFG)); + //P5OUT |= BIT5; // Set P5.5 as high (Chip Select disabled) + + //Disable clk system + /*sleep(100); + + UCA1CTL1 |= UCSWRST; + UCA1CTLW0=1; + + + P5SEL &= ~(BIT6+BIT7); // Disable SIMO/MOSI + P5DIR &= ~(BIT5); // Set P5.5 as input + P3SEL &= ~(BIT6); + sleep(100); + + //Shutdown the power supply of the datalogger + P8OUT &= ~(BIT1); // Set P8.1 as low, cut power to SD card + P8DIR &= ~(BIT1); + + UCA1IFG = 0; + //UCA1TXBUF = 0;*/ + if (getModuleState(MODULE_DATALOGGER) == STATE_ONLINE) + setModuleState(MODULE_DATALOGGER, STATE_OFFLINE); + + if (getModuleState(MODULE_DATALOGGER) == STATE_SPECIAL) + setModuleState(MODULE_DATALOGGER, STATE_DISABLED); + +} +//------------------------------------------------------------------------------ +// INIT_SETTINGS +//------------------------------------------------------------------------------ +// Initialize the settings structure with default values. +//------------------------------------------------------------------------------ +// Parameters: +// set, pointer to a settings structure +// +// Return value (void): +// None +//------------------------------------------------------------------------------ +void init_settings(settings * set){ + + set->exp_num=1; // Start in folder "1" + + return; +} + + +//------------------------------------------------------------------------------ +// NEXT_FILES +//------------------------------------------------------------------------------ +// Update the file names when a break (timed - default: 1h) is detected, in order +// to have time separated files. Also closes and opens the next files. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (void): +// None +//------------------------------------------------------------------------------ +void next_files(/*long timestamp*/){ + unsigned int t_diff=0; + unsigned char f_diff=1; + + // Check difference between last split_ts and current timestamp to determine what file number is next + if (dos_split_ts>0){ + t_diff = timestamp - dos_split_ts; + f_diff = t_diff / (/*wimu_config.logger.file_time **/ 3600) + 1; + } + + dos_filenum+=f_diff; + + sprintf((char*)dos_acc_filename, "%s_%d%s",DOS_ACC_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_gyro_filename, "%s_%d%s",DOS_GYRO_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_joy_filename, "%s_%d%s",DOS_JOY_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_quaternion_filename, "%s_%d%s",DOS_IMU_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_mag_filename, "%s_%d%s",DOS_MAG_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_gps_filename, "%s_%d%s",DOS_GPS_FILE, dos_filenum, DOS_FILE_EXT); +// sprintf((char*)dos_sonars_filename, "%s_%d%s",DOS_SONARS_FILE, dos_filenum, DOS_FILE_EXT); +// sprintf((char*)dos_encoders_filename, "%s_%d%s",DOS_ENCODERS_FILE, dos_filenum, DOS_FILE_EXT); +// sprintf((char*)dos_fsr_filename, "%s_%d%s",DOS_FSR_FILE, dos_filenum, DOS_FILE_EXT); + sprintf((char*)dos_power_filename, "%s_%d%s",DOS_POWER_FILE, dos_filenum, DOS_FILE_EXT); + + if (timestamp>0) + dos_split_ts = timestamp + /*wimu_config.logger.file_time **/ 3600; + + dos_runtime+=f_diff; + + if (dos_runtime >= wimu_config.logger.max_files_in_folder && dos_filenum>0){ + dos_runtime = 0; + setModuleState(MODULE_DATALOGGER, STATE_RESET); + } + + return; + +} + + +//------------------------------------------------------------------------------ +// DATALOG_SAVE_DATA +//------------------------------------------------------------------------------ +// Wrap-up function that saves data on the uSD card +//------------------------------------------------------------------------------ +// Parameters: +// data, pointer to the data in memory +// length, number of word to write +// internal, set to TRUE if module is internal (i.e. adc, gps, ...) +// module, ID of the module requesting the write (to correctly manage filenames) +// time, the timestamp attached to the data. Set to "0" to use actual time. +// +// Return value (Unsigned Char): +// 0x00, if writing was successfully completed +// 0xYY, if writing wasn't successfully completed and where YY=error code +//------------------------------------------------------------------------------ +unsigned char datalog_save_data(unsigned char* data, unsigned short length, bool internal, unsigned int module, unsigned long time){ + unsigned char status=0; + FRESULT err[5] = {FR_OK,FR_OK,FR_OK,FR_OK,FR_OK}; + char buf[32]; + unsigned int bytes_count; + //unsigned char handle; + //unsigned long int fileSize; + #ifdef DOS_TIMEOUT_RESET + unsigned long time; + #endif + //unsigned char step=0; + //unsigned long timestamp=0; + + if (usb_mode==MASS_STORAGE && USB_IsConnected()){ + return 0; // Don't write anything while in mass storage and connected + } + + //LED blinking is config is set + if (wimu_config.ui.write_led){ + if ((ble_control.status & BLE_CTRL_FLAG_REC) ==0) + led(LED_RED,TRUE, MEDIUM_PRIORITY); + else + led(LED_BLUE,TRUE, MEDIUM_PRIORITY); + //led(LED_RED,TRUE); + } + + #ifndef DEBUG + //WDTCTL = START_WATCHDOG; + #endif + + #ifdef DOS_TIMEOUT_RESET + time_count(TRUE); + #endif + + + + if (internal==TRUE){ + switch(module){ + case MODULE_CPU: + err[0] = f_open(&dos_files[0], (TCHAR*) "LOG.DAT", FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_GPS: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_gps_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_ACC: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_acc_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_GYRO: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_gyro_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_MAGNETO: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_mag_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_POWER: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_power_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case MODULE_IMU: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_quaternion_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + } + + }else{ + /*switch(module){ + case EXT_MODULE_SONARS: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_sonars_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case EXT_MODULE_FSR: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_fsr_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case EXT_MODULE_JOYSTICK: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_joy_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + case EXT_MODULE_ENCODERS: + case EXT_MODULE_WIENCODER: + err[0] = f_open(&dos_files[0], (TCHAR*) &dos_encoders_filename[0], FA_WRITE | FA_OPEN_ALWAYS); + break; + }*/ + } + /* + if (internal==FALSE){ + module += MODULE_NUM; // Correct index for open file list + } + */ + + // Move to end of file to append data + //err[1] = f_lseek(&dos_files[0], dos_files[0].fsize); + err[1] = f_lseek(&dos_files[0], f_size(&dos_files[0])); + + //handle = datalog_get_modulefile(internal, module); + err[2] = FR_OK; + + //update_timestampRTC(FALSE); //TODO: Find a way not to always resync timestamp from RTC (optimize) + + #ifdef GPS_MODE_2 + if (module != MODULE_GPS) //No timestamp on SIRF data + #endif + //Timestamp + + if (time!=0) + err[2] = f_write(&dos_files[0], (unsigned char*) &time, 4, &bytes_count); + else + err[2] = f_write(&dos_files[0], (unsigned char*) ×tamp, 4, &bytes_count); + + //Data + if (module == MODULE_CPU){ + // Convert Timestamp to text + if (time!=0) + sprintf(buf, ",%ld,",time); + else + sprintf(buf, ",%ld,",timestamp); + bytes_count = strlen(buf); + err[2] = f_write(&dos_files[0], buf, bytes_count, &bytes_count); + } + + err[3] = f_write(&dos_files[0], data, length, &bytes_count); + + + // Close the file + err[4] = f_close(&dos_files[0]); + + #ifdef DOS_TIMEOUT_RESET + time = time_count(FALSE); + #endif + + //if (i_mod_status[MODULE_DATALOGGER]!=MODULE_RESET){ // Prevents infinite loop + // DOSONCHIP error + status = err[0] + err[1] + err[2] + err[3] + err[4]; + if (status!=0){ + /*i_mod_status[MODULE_DATALOGGER]=MODULE_RESET; //Request DOSONCHIP reset + //datalog_save_data((unsigned char*)"Datalogger: Error!\r\n",20, TRUE, MODULE_CPU); + sprintf((char*)buf, "Log Error: %d in %d\n\r", status, module); + datalog_save_data(buf,strlen((char*)buf), TRUE, MODULE_CPU); + dos_timeouts++; + if (dos_timeouts0) + led(LED2,TRUE);*/ + + if (dos_errors>=DOS_MAX_ERRORS){ + //Amount of write errors exceeded the maximum threshold + setModuleState(MODULE_DATALOGGER, STATE_RESET); // Provokes a reset of the card + //led(LED_RED,TRUE); + } + + } + /* + #ifdef DOS_TIMEOUT_RESET + // Timeout + if (time > DOS_TIMEOUT){ + i_mod_status[MODULE_DATALOGGER]=MODULE_RESET; //Request DOSONCHIP reset + //datalog_save_data((unsigned char*)"Datalogger: Timeout!\r\n",22, TRUE, MODULE_CPU); + dos_timeouts++; + if (dos_timeouts=dos_split_ts){ // New files needed? + next_files(); + } + + return;// rval; +} + +unsigned char datalog_change_folder(){ + char name[9]={0,0,0,0,0,0,0,0,0}; + FRESULT status; + unsigned int bytes_count; + //char buf[32]; //Char buffer + + //Switch to root directory + name[0]='/'; + if ((status = f_chdir((const TCHAR*)&name[0]))!=FR_OK) + return 1;//status; + + status = f_open(&dos_files[0], (const TCHAR*) DOS_FILEID_FILE, FA_READ); // Check for ID_FILE + + if (status==FR_NO_FILE){ //File was not found + // Ensure file counter is set to 0 + dos_filenum=0; + next_files(); + dos_runtime=0; + DOS_settings.exp_num = 0; + } + + if (DOS_settings.exp_num == 0){ // Not restarting the logger from sleep + //Load settings from uSD card + if (status==FR_NO_FILE){ //File was not found + // Initialize the settings structure + init_settings(&DOS_settings); + + }else{ //File found + if (status!=FR_OK){ + return 2;//status; + }else{ + //Load the settings from the file + /*if (status = DOSread(0, (unsigned char*) &DOS_settings, sizeof(settings))!=0) + return status;*/ + if ((status = f_read(&dos_files[0], (char*) &DOS_settings, sizeof(settings), &bytes_count))!=0) + return 3;//status; + + + //Close the file + //if (status=DOSclose(0)!=0) //Close the file + if ((status = f_close(&dos_files[0])) != FR_OK) + return 4;//status; + + // Delete old file + } + } + + // Create the file + if ((status = f_open(&dos_files[0], (const TCHAR*) DOS_FILEID_FILE, FA_WRITE | FA_CREATE_ALWAYS))!= FR_OK) + return 5;//status; + + // Increment Experiment number + DOS_settings.exp_num++; + + // Save the settings + if ((status = f_write(&dos_files[0], (const TCHAR*)&DOS_settings, sizeof(settings), &bytes_count)) != FR_OK) + return 6;//status; + // Decrement Experiment number (for the actual experiment) + DOS_settings.exp_num--; + + if ((status = f_close(&dos_files[0]))!=FR_OK) + return 7;//status; + + // Create experiment log directory + itoa(DOS_settings.exp_num, (char*) &name, 10); + status = f_mkdir((const TCHAR*)&name); + if (status!=FR_OK && status != FR_EXIST) + return 8;//status; + }else{ + if (status == FR_OK) + f_close(&dos_files[0]); // Close ID_FILE + + //Restarting the logger from sleep + itoa(DOS_settings.exp_num, (char*) &name,10); + } + //Switch to work directory + if ((status = f_chdir((const TCHAR*)&name))!=FR_OK) + return 9;//status; + + if ((status = datalog_save_settings()) != FR_OK) + return 10; + + if ((status = datalog_save_config()) != FR_OK) + return 11; + + return 0; +} + +// Used to isolate data in another folder - manual recordings +FRESULT datalog_switch_recording_mode(){ + FRESULT status; + static char old_path[32]; + char rec_path[12]; + + if (dos_isRecording){ + // Currently recording - restoring old path for future data + if ((status = f_chdir((const TCHAR*)&old_path))!=FR_OK) + return status; + + }else{ + // Backup current path + if ((status = f_getcwd(old_path,32))!=FR_OK) + return status; + + // Build recording folder string + sprintf((char*)rec_path, "/%s_%d", DOS_REC_PREFIX, ++dos_rec_count); + + // Create folder - no error check, in case the folder already exists + f_mkdir((const TCHAR*)&rec_path); + + // Change to recording folder + if ((status = f_chdir((const TCHAR*)&rec_path))!=FR_OK) + return status; + + } + + dos_isRecording = !dos_isRecording; + + return FR_OK; + +} + +FRESULT datalog_save_config(){ + FRESULT status; + unsigned int bytes_count; + + if ((status = f_open(&dos_files[0], (const TCHAR*) DOS_CONFIG_FILE, FA_WRITE | FA_CREATE_ALWAYS))!= FR_OK) + return status; + + //Save config + if ((status = f_write(&dos_files[0], (const TCHAR*)&wimu_config, sizeof(WIMU_CONFIG), &bytes_count)) != FR_OK) + return status; + + //Close config file + if ((status = f_close(&dos_files[0]))!=FR_OK) + return status; + + return FR_OK; +} + +FRESULT datalog_save_settings(){ + FRESULT status; + unsigned int bytes_count; + + //Save current settings + if ((status = f_open(&dos_files[0], (const TCHAR*) DOS_SETTINGS_FILE, FA_WRITE | FA_CREATE_ALWAYS))!= FR_OK) + return status; + + //Save settings + if ((status = f_write(&dos_files[0], (const TCHAR*)&wimu_settings, sizeof(WIMU_SETTINGS), &bytes_count)) != FR_OK) + return status; + + //Close settings file + if ((status = f_close(&dos_files[0]))!=FR_OK) + return status; + + return FR_OK; +} + +// Counts the number of manually recorded data folders +FRESULT datalog_update_manual_recordings_count(){ + char name[10]={0,0,0,0,0,0,0,0,0,0}; + char current_path[32]; + char search_pattern[8]; + FRESULT status; + DIR dj; /* Directory search object */ + FILINFO fno; /* File information */ + + dos_rec_count = 0; + + // Save current folder + if ((status = f_getcwd(current_path,32))!=FR_OK) + return status; + + // Switch to root directory + name[0]='/'; + if ((status = f_chdir((const TCHAR*)&name[0]))!=FR_OK) + return status; + + // Browse each folder + sprintf((char*)search_pattern, "%s_*", DOS_REC_PREFIX); + + status = f_findfirst(&dj, &fno, "", search_pattern); + while (status == FR_OK && fno.fname[0]) { /* Repeat while an item is found */ + dos_rec_count++; + status = f_findnext(&dj, &fno); /* Search for next item */ + } + + // Restore current folder + if ((status = f_chdir((const TCHAR*)¤t_path[0]))!=FR_OK) + return status; + + return FR_OK; +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/diskio.c b/Firmware/WIMU3/src/diskio.c new file mode 100644 index 0000000..ce4442e --- /dev/null +++ b/Firmware/WIMU3/src/diskio.c @@ -0,0 +1,185 @@ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* This is a stub disk I/O module that acts as front end of the existing */ +/* disk I/O modules and attach it to FatFs module with common interface. */ +/*-----------------------------------------------------------------------*/ + +#include "diskio.h" +#include "stm32l1xx.h" +#include "ffconf.h" +#include "stm32l152_eval_spi_sd.h" +#include "stm32l1xx_rtc.h" +#include "config.h" + +/*-----------------------------------------------------------------------*/ +/* Correspondence between physical drive number and physical drive. */ +/*-----------------------------------------------------------------------*/ + +#define ATA 0 +#define MMC 1 +#define USB 2 +SD_CardInfo SDCardInfo2; + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + SD_Error res = SD_RESPONSE_FAILURE; + res = SD_Init(); + return ((DSTATUS)res); +} + + + +/*-----------------------------------------------------------------------*/ +/* Return Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return 0; +} + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Sector address (LBA) */ + UINT count /* Number of sectors to read (1..255) */ +) +{ + SD_Error err; + err = SD_ReadBlock(buff, sector << 9, 512); + + if (err==SD_RESPONSE_NO_ERROR) + return RES_OK; + else{ + return RES_ERROR; + } +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ +/* The FatFs module will issue multiple sector transfer request +/ (count > 1) to the disk I/O layer. The disk function should process +/ the multiple sector transfer properly Do. not translate it into +/ multiple single sector transfers to the media, or the data read/write +/ performance may be drasticaly decreased. */ + +/* +RES_OK (0) + The function succeeded. +RES_ERROR + Any hard error occured during the write operation and could not recover it. +RES_WRPRT + The medium is write protected. +RES_PARERR + Invalid parameter. +RES_NOTRDY + The device has not been initialized. */ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0..) */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Sector address (LBA) */ + UINT count /* Number of sectors to write (1..255) */ +) +{ + SD_Error err; + err = SD_WriteBlock((BYTE *)buff, sector << 9,512);; + + if (err==SD_RESPONSE_NO_ERROR) + return RES_OK; + else{ + return RES_ERROR; + } +} +#endif /* _READONLY */ + +/*-----------------------------------------------------------------------*/ +/* Get current time */ +/*-----------------------------------------------------------------------*/ + +DWORD get_fattime () +{ + DWORD time=0; + + RTC_TimeTypeDef RTC_Time; + RTC_DateTypeDef RTC_Date; + unsigned int val=0; + + RTC_GetTime(RTC_Format_BIN, &RTC_Time); + RTC_GetDate(RTC_Format_BIN, &RTC_Date); + + // Generate time word + val = RTC_Date.RTC_Year + 20; // - 1980; + //if (val<0) val=0; + time = (val & 0x007F) << 25; + + val = RTC_Date.RTC_Month+1; + time += (val & 0x000F) << 21; + + val = RTC_Date.RTC_Date; + time += (val & 0x001F) << 16; + + val = RTC_Time.RTC_Hours; + time += (val & 0x001F) << 11; + + val = RTC_Time.RTC_Minutes; + time += (val & 0x001F) << 5; + + val = RTC_Time.RTC_Seconds/2; + time += (val & 0x001F); + + return time; +} + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res = RES_OK; + switch (ctrl) { + + case CTRL_SYNC : // Only used when _MAX_SS is not 512 (Always 512 for SDHC) + break; + + case GET_SECTOR_COUNT : // Get number of sectors on the disk (DWORD) (Only used by f_mkfs() that is not used in our case) + *(DWORD*)buff = 1; + res = RES_OK; + break; + + case GET_SECTOR_SIZE : // Get R/W sector size (WORD) + *(WORD*)buff = 512; + res = RES_OK; + break; + + case GET_BLOCK_SIZE : // Get erase block size in unit of sector (DWORD) (Only used by f_mkfs() that is not used in our case) + *(DWORD*)buff = 32; + res = RES_OK; + } + + return res; +} diff --git a/Firmware/WIMU3/src/flash.c b/Firmware/WIMU3/src/flash.c new file mode 100644 index 0000000..691c09c --- /dev/null +++ b/Firmware/WIMU3/src/flash.c @@ -0,0 +1,313 @@ +//****************************************************************************** +// WIMUuSD - Flash Memory Module +// +// Description: This is the interface to the EEPROM memory embedded in the STM32L151. +// It provides an access to the data stored in the EEPROM memory. +// +// Author: N. Viscogliosi, B. ing., M. Sc. A. +// Initial Version: November 23th, 2012 +// +// Modifications: +// +//****************************************************************************** + +#include "flash.h" + + +void flash_init(void) +{ + // Enabling the CRC peripheral clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); +} + + +//------------------------------------------------------------------------------ +// flash_write_settings +//------------------------------------------------------------------------------ +// This function writes the WIMU_SETTINGS structure in DATA_EEPROM section of Flash. +//------------------------------------------------------------------------------ +// Parameters: +// settings, a pointer to the WIMU_SETTINGS structure to be written. +// +// Return value (uint8_t): +// 0, if initialization was successfully completed +// 1, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +uint8_t flash_write_settings(WIMU_SETTINGS* settings) +{ + FLASH_Status FlashOperationResult; + + uint8_t LoopIndex; + uint8_t Settings_NbrByte = sizeof(WIMU_SETTINGS); + uint8_t Settings_NbrCompleteWord = Settings_NbrByte >> 2; + uint8_t Settings_NbrResidualByte = Settings_NbrByte & 0x3; + + // Unlocking Data EEPROM + DATA_EEPROM_Unlock(); + + /* --------- EEPROM erase --------- */ + + for(LoopIndex = 0; LoopIndex < Settings_NbrCompleteWord; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_EraseWord(DATA_EEPROM_SETTING_BASE + LoopIndex * 4); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + if(Settings_NbrResidualByte != 0) + { + FlashOperationResult = DATA_EEPROM_EraseWord(DATA_EEPROM_SETTING_BASE + Settings_NbrCompleteWord * 4); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + /* --------- EEPROM write --------- */ + + for(LoopIndex = 0; LoopIndex < Settings_NbrCompleteWord; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_FastProgramWord(DATA_EEPROM_SETTING_BASE + LoopIndex * 4, *((uint32_t*)settings + LoopIndex)); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + for(LoopIndex = 0; LoopIndex < Settings_NbrResidualByte; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_FastProgramByte(DATA_EEPROM_SETTING_BASE + Settings_NbrCompleteWord * 4 + LoopIndex, *((uint8_t*)settings + Settings_NbrCompleteWord * 4 + LoopIndex)); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + + // Locking Data EEPROM + DATA_EEPROM_Lock(); + + return 1; +} + +//------------------------------------------------------------------------------ +// flash_write_config +//------------------------------------------------------------------------------ +// This function writes the WIMU_CONFIG structure in DATA_EEPROM section of Flash. +//------------------------------------------------------------------------------ +// Parameters: +// config, a pointer to the WIMU_CONFIG structure to be written. +// +// Return value (uint8_t): +// 0, if initialization was successfully completed +// 1, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +uint8_t flash_write_config(WIMU_CONFIG* config) +{ + FLASH_Status FlashOperationResult; + + uint8_t LoopIndex; + uint8_t Config_NbrByte = sizeof(WIMU_CONFIG); + uint8_t Config_NbrCompleteWord = Config_NbrByte >> 2; + uint8_t Config_NbrResidualByte = Config_NbrByte & 0x3; + + // Unlocking Data EEPROM + DATA_EEPROM_Unlock(); + + /* --------- EEPROM erase --------- */ + + for(LoopIndex = 0; LoopIndex < Config_NbrCompleteWord; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_EraseWord(DATA_EEPROM_CONFIG_BASE + LoopIndex * 4); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + if(Config_NbrResidualByte != 0) + { + FlashOperationResult = DATA_EEPROM_EraseWord(DATA_EEPROM_CONFIG_BASE + Config_NbrCompleteWord * 4); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + /* --------- EEPROM write --------- */ + + for(LoopIndex = 0; LoopIndex < Config_NbrCompleteWord; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_FastProgramWord(DATA_EEPROM_CONFIG_BASE + LoopIndex * 4, *((uint32_t*)config + LoopIndex)); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + for(LoopIndex = 0; LoopIndex < Config_NbrResidualByte; LoopIndex++) + { + FlashOperationResult = DATA_EEPROM_FastProgramByte(DATA_EEPROM_CONFIG_BASE + Config_NbrCompleteWord * 4 + LoopIndex, *((uint8_t*)config + Config_NbrCompleteWord * 4 + LoopIndex)); + + if(FlashOperationResult != FLASH_COMPLETE) + { + return 0; + } + } + + + // Locking Data EEPROM + DATA_EEPROM_Lock(); + + return 1; +} + +//------------------------------------------------------------------------------ +// crc_calc +//------------------------------------------------------------------------------ +// This function uses the CRC module to calculate checksum value for the data +// specified in parameter. +//------------------------------------------------------------------------------ +// Parameters: +// data, a pointer to the data that needs to be calculated +// NbrOfCompleteWord, number of complete word in the data array +// NbrOfResidualByte, number of byte at the end of the array taht not fill completely +// the last word +// +// Return value (uint32_t): +// CRC32 value +//------------------------------------------------------------------------------ +uint32_t crc_calc(uint8_t* data, uint16_t NbrOfByte) +{ + uint16_t LoopIndex; + uint32_t DataWord; + uint16_t NbrOfCompleteWord = NbrOfByte >> 2; // /4 + uint16_t NumberOfResidualByte = NbrOfByte - (NbrOfCompleteWord << 2); + + // Initialize CRC module + CRC_ResetDR(); + + // Feeding Words to the CRC module + for(LoopIndex = 0; LoopIndex < NbrOfCompleteWord; LoopIndex++) + { + DataWord = ((uint32_t)(data[LoopIndex*4 + 3]) << 24) | ((uint32_t)(data[LoopIndex*4 + 2]) << 16); + DataWord |= ((uint32_t)(data[LoopIndex*4 + 1]) << 8) | ((uint32_t)(data[LoopIndex*4 ])); + //DataWord = data[LoopIndex]; + //CRC_CalcBlockCRC(data, NbrOfCompleteWord); + //CRC_CalcBlockCRC(&DataWord, 1); + CRC_CalcCRC(DataWord); + } + + // Feeding residual bytes to CRC module in a left align word + // (First byte left align in word, second byte insert after first byte...) + DataWord = 0; + for(LoopIndex = 0; LoopIndex < NumberOfResidualByte; LoopIndex++) + { + DataWord |= (*(data + (NbrOfCompleteWord << 2) + LoopIndex)) << (8 * (3 - LoopIndex)); + CRC_CalcCRC(DataWord); + } + + return CRC_GetCRC(); + +} + +//------------------------------------------------------------------------------ +// FLASH_DEFAULT_SETTINGS +//------------------------------------------------------------------------------ +// This function fills a WIMU_SETTINGS structure with the default values. +//------------------------------------------------------------------------------ +// Parameters: +// settings, a pointer to the WIMU_SETTINGS structure to be written. +// +// Return value : +// None +//------------------------------------------------------------------------------ +void flash_default_settings(WIMU_SETTINGS* settings) +{ + uint8_t i; + memset(settings,0,sizeof(WIMU_SETTINGS)-4); + + settings->id = 0x0000; + settings->hw_id = 3; + settings->crc = 0; + + // Set gains to 1 by default + for (i=0; i<3; i++){ + settings->acc_gain[i]=1; + settings->gyro_gain[i]=1; + settings->mag_gain[i]=1; + } + + + return; +} + +//------------------------------------------------------------------------------ +// FLASH_DEFAULT_CONFIG +//------------------------------------------------------------------------------ +// This function fills a WIMU_CONFIG structure with the default values. +//------------------------------------------------------------------------------ +// Parameters: +// config, a pointer to the WIMU_CONFIG structure to be written. +// +// Return value : +// None +//------------------------------------------------------------------------------ +void flash_default_config(WIMU_CONFIG* config) +{ + memset(config,0,sizeof(WIMU_CONFIG)-4); + + /*config->int_mod = 0x00C0; // No sensors used + config->ext_mod = 0; // No external module + config->cpu_opt = (30 << 2); // No watchdog, no ADC@100 Hz, 30s blink + config->log_opt = 0; // No writing LED + config->gps_opt = 0x04; // Tracking smoothing on + config->power_opt = 0x02A5; // Power off on USB = false, sleepout = 2, usbcharge_t=10, lowbat_t=5 + config->log_filetime = 60; // Create a new file each 60 minutes + config->log_reset_t = 24; // Resets datalogger and change folder each 24 hours + config->gps_dead_t = 5; // If no reply from GPS in 5 seconds, tries to reset it + config->gps_degrad_t = 60; // GPS maximum number of seconds in degraded mode + config->gps_deadrec_t = 60; // GPS maximum number of seconds in dead reckoning mode + config->enc_opt = 17; // Encoder 17 cm radius wheel + config->mag_opt = 1; // Magneto range = 1Ga + config->acc_opt = 3; // Acc. range = 4g + config->man_opt = 180; // 3 minutes motion detection window*/ + + // Set non-zero values + config->ui.led_blink_time = 30; + config->general.sampling_rate = 50; + config->datetime.time_offset = -5; + //config->logger.file_time = 60; + config->logger.split_by_day = true; + config->logger.max_files_in_folder = 24; + config->gps.interval = 1; + config->gps.enable_scan_when_charged = true; + config->acc.range = 3; + config->gyro.range = 0; + config->magneto.range = 1; + config->imu.beta = 0.5; + + + config->crc = crc_calc((unsigned char*)config, sizeof(WIMU_CONFIG) - 4); + return; +} + +void flash_read_settings(WIMU_SETTINGS* settings) +{ + *settings = *(WIMU_SETTINGS*)(DATA_EEPROM_SETTING_BASE); +} + +void flash_read_config(WIMU_CONFIG* config) +{ + *config = *(WIMU_CONFIG*)(DATA_EEPROM_CONFIG_BASE); +} + diff --git a/Firmware/WIMU3/src/gps.c b/Firmware/WIMU3/src/gps.c new file mode 100644 index 0000000..3389ad1 --- /dev/null +++ b/Firmware/WIMU3/src/gps.c @@ -0,0 +1,1076 @@ +//****************************************************************************** +// WIMuGPS - GPS Module +// +// Description: This is the internal GPS module. Currently, a MN5010HS is used +// communicating using UART (port USCI A2). +// +// Author: Simon Brière, ing., M. Sc. A. +// Initial Version: 25 May 2009 +// +// Modifications: +// October 8th, 2009 - Added Stop function +// June 28th, 2010 - Added SIRF support +// January 7th, 2011 - Changed clock source from ACLK to SMCLK +// January 11th, 2011 - Added support for RTC. +// March 1st, 2011 - Added config support +// May 12th, 2011 - Added Trickle Power support +// July 13th, 2011 - Changed Trickle Power behavious to activate only when a first fix was made +// July 27th, 2011 - Added gps_has_fix flag to identify when GPS has a fix +//****************************************************************************** + +#include "gps.h" +#include "GPS_driver.h" +#include "RTC.h" +#include "config.h" + +#include "datalogger.h" //For Logging + +#include //for memset, strncmp +#include +#include + +unsigned char gps_rx[GPS_RX_BUF_NUM][GPS_RX_BUFFER]; +unsigned char gps_tx[GPS_TX_BUF_NUM][GPS_TX_BUFFER]; + +unsigned char gps_rx_rd_ptr; // Actual RX read index +unsigned char gps_rx_wr_ptr; // Actual RX write index +unsigned char gps_tx_rd_ptr; // Actual TX read index +unsigned char gps_tx_wr_ptr; // Actual TX write index + +uint16_t gps_time_drift; //Counter to update the RTC time with GPS time to minimize drift. + +volatile unsigned char gps_rx_index; +volatile unsigned char gps_tx_index; + +volatile unsigned char gps_rx_queue; +volatile unsigned char gps_tx_queue; + +unsigned short gps_tx_len[GPS_TX_BUF_NUM]; +unsigned short gps_rx_len[GPS_RX_BUF_NUM]; + +//BOOL gps_alive; +//unsigned char gps_count; + +BOOL gps_rx_ready; +BOOL gps_got_ffix; +BOOL gps_has_fix; +BOOL gps_sleep; +unsigned char gps_nofix_count; + +SIRF_Cmds last_gps_cmd; + +extern char buf[32]; +//------------------------------------------------------------------------------ +// INIT_GPS +//------------------------------------------------------------------------------ +// Initialization function for the GPS module. Currently, USCI_A2 in UART +// mode is used to interface the chip. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if initialization was successfully completed +// 0xYY, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef GPS_Init(void){ + + GPS_Config(); + GPS_1PPS_IRQConfig(ENABLE); + if(GPS_PowerAndWakeup() == 0){ + /*{ + printf("GPS power up sequence OK!!!\n"); + } + else + {*/ + //printf("GPS power up sequence FAIL!!!\n"); + return ERROR_POWER; + } + + // Variables initialization + ////////////////////////// + gps_rx_rd_ptr = 0; + gps_rx_wr_ptr = 0; + gps_tx_rd_ptr = 0; + gps_tx_wr_ptr = 0; + gps_rx_index = 0; + gps_tx_index = 0; + + gps_rx_queue = 0; + gps_tx_queue = 0; + + gps_rx_ready = FALSE; + + gps_got_ffix = FALSE; + gps_has_fix = FALSE; + gps_nofix_count=0; + gps_time_drift=0; + //gps_alive = TRUE; + //gps_count = 0; + + memset(&gps_rx, 0, GPS_RX_BUFFER * GPS_RX_BUF_NUM); + memset(&gps_tx, 0, GPS_TX_BUFFER * GPS_TX_BUF_NUM); + memset(&gps_rx_len,255,GPS_RX_BUF_NUM*sizeof(short)); + memset(&gps_tx_len, 0, GPS_TX_BUF_NUM*sizeof(short)); + + last_gps_cmd = SIRF_CMD_NONE; + + return ERROR_NONE; +} + +//------------------------------------------------------------------------------ +// START_GPS +//------------------------------------------------------------------------------ +// Startup function for the GPS module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if startup was successfully completed +// 0xYY, if startup wasn't successfully completed and where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef GPS_Start(void){ + //unsigned char i; + uint16_t timeout = 4000; + #if GPS_MODE==GPS_SIRF + unsigned char bin[64]; + #endif + // Interrupt enable + /////////////////// + GPS_ConfigTxIRQ(ENABLE); + + //Wakeup GPS + //#ifndef DEV_BOARD + /*P9OUT &= ~(BIT6); + P9DIR |= BIT6; + sleep(100); + P9DIR &= ~(BIT6);*/ + + /*#ifdef GPS_MODE_1 + sleep(500); + + P9OUT |= BIT7; //GPS_SM high + us_sleep(2000); + P9OUT &= ~(BIT7); //GPS_SM low + #endif*/ + + + //#endif + + // *** To calculate checksums: http://www.hhhh.org/wiml/proj/nmeaxor.html *** + //sleep(200); //Enable to initialize correctly the first time - otherwise, will be ok with watchdog + //sleep(2); + //msWait(200); + #if GPS_MODE==GPS_NMEA + // Set baudrate + GPS_ConfigRxIRQ(ENABLE); + gps_send_string("$PSRF100,1,115200,8,1,0*05\r\n",28); // Set NMEA, baudrate = 115200, 8 bits, 1 stop bit, no parity + while (gps_tx_queue>0); + GPS_SetBaudrate(115200); + + //gps_send_string("$PSRF103,00,00,00,01*24\r\n",25); // Disable GGA + gps_send_string("$PSRF103,03,00,10,01*26\r\n",25); // Set GSV @10s interval + + while (gps_tx_queue>0); + gps_send_string("$PSRF103,04,00,00,01*20\r\n",25); // Disable RMC + while (gps_tx_queue>0); + gps_send_string("$PSRF103,08,00,01,01*2D\r\n",25); //Enable ZDA + while (gps_tx_queue>0); + + /*#ifndef GPS_MODE_1 + // We are in mode 0, we need to set the correct parameters + while (gps_tx_queue>0); + gps_send_string("$PSRF100,1,57600,8,1,0*36\r\n",27); //Set Baudrate on the GPS + sleep(200); + //while ((UCA2STAT & UCBUSY)>0); + while (gps_tx_queue>0); + + + // Set new Baudrate on USCI A2 + UCA2CTL1 |= UCSWRST; // **Put state machine in reset** + UCA2BR0 = 19; // 1.125 MHz @ 57600 (ref. p. 426 UserGuide) + UCA2BR1 = 0; // 1.125 MHz @ 57600 (ref. p. 426 UserGuide) + UCA2MCTL |= UCBRS_7 + UCBRF_0; // Modulation stage = 6 //TOCHECK: 7 ??? + UCA2CTL1 &= ~UCSWRST; // **Initialize USCI state machine** + + #endif + + //UCA2IE |= UCRXIE;*/ + #endif + + #if GPS_MODE==GPS_SIRF + //SIRF MODE + // Set the GPS into SIRF Mode + GPS_SendString("$PSRF100,0,115200,8,1,0*04\r\n",28); // Set SIRF, baudrate = 115200, 8 bits, 1 stop bit, no parity + //gps_send_string("$PSRF100,0,9600,8,1,0*0C\r\n",26); // Set SIRF, baudrate = 9600, 8 bits, 1 stop bit, no parity + //gps_send_string("$PSRF100,0,57600,8,1,0*37\r\n",27); // Set SIRF, baudrate = 57600, 8 bits, 1 stop bit, no parity + while (gps_tx_queue>0); + GPS_ConfigRxIRQ(ENABLE); // Enable only + GPS_SetBaudrate(115200); + msWait(800); + + // Wait for a first message before continuing (indicating baudrate was correcly set) + + timeout = 0xffff; + while (gps_rx_ready==false && (--timeout)>0); + if (timeout==0) + return ERROR_COM; + GPS_ProcessRX(); + gps_rx_ready=FALSE; + + //GPS_SetBaudrate(57600); + //GPS_SetBaudrate(9600); + + //if (initialized==FALSE){ + // while (gps_rx_ready==FALSE); //Wait for initial message + // process_gps_rx(); + // gps_rx_ready=FALSE; + /*}else{ + sleep_gps(FALSE); + }*/ + + // Test communication: Get SIRF chip version + /*bin[0]=SIRF_POLL_VERSION; + bin[1]=0x00; + gps_send_sirf((char*)&bin[0],0x84,2); + + while (gps_tx_queue>0); + //while ((UCA2STAT & UCBUSY)>0); + while (gps_rx_ready==FALSE); + process_gps_rx(); + gps_rx_ready=FALSE;*/ + + //Set SIRF parameters + bin[0] = SIRF_MODE_CONTROL; + bin[1] = 0; // Not used + bin[2] = 0; // Not used + bin[3] = GPS_DEGRAD_MODE; // Degraded Mode + bin[4] = 0; // Not used + bin[5] = 0; // Not used + bin[6] = 0; // Altitude + bin[7] = 0; // Altitude + bin[8] = 0; // Altitude Hold Mode + bin[9] = 0; // Altitude Hold Source + bin[10] = 0; // Not used + bin[11] = GPS_DEGRAD_TIMEOUT; // Degraded Mode Timeout + bin[12] = GPS_DEADREC_TIMEOUT; // Dead reckoning timeout + bin[13] = GPS_TRACKSMOOTHING; // Track Smoothing + + GPS_SendSirf(&bin[0],14); + while (gps_tx_queue>0); + + //Wait for acknowledgement message + timeout = 0xFFFF; + last_gps_cmd = SIRF_CMD_NONE; + while (last_gps_cmd != SIRF_CMD_ACK){ + while (gps_rx_ready==FALSE && (--timeout)>0); + if (timeout==0) + return ERROR_COM; + GPS_ProcessRX(); + gps_rx_ready=FALSE; + } + + //msWait(1000); + //sleep(5000); + + if (GPS_SetMsgFrequency()!=0) //Set messages frequency + return ERROR_COM; + + + // GPS Adaptative Trickle Power Mode + // MOVED TO GOT FIRST FIX SECTION + + //GPS FORCE COLD START MODE + /*if ((wimu_config.gps_opt & CONFIG_GPS_COLD)>0){ + bin[0]=SIRF_INIT_DATA_SRC; + for (i=1; i<23; i++) + bin[i]=0; + bin[23] = 12; // Number of channels + bin[24] = 0x44; // Clear all history (except almanac), RTC=bad + + gps_send_sirf(&bin[0],25); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + process_gps_rx(); + gps_rx_ready=FALSE; + }*/ + + //Check SIRF parameters + /*bin[0]=SIRF_POLL_VERSION; + bin[1]=0; + gps_send_sirf(&bin[0],2); //Poll Version + while (gps_tx_queue>0); + + //Wait for reply + while (gps_rx_ready==FALSE);*/ + + //MUST SET A BREAKPOINT TO READ + + /*bin[0]=SIRF_POLL_NAV_PARAMS; + bin[1]=0x00; + gps_send_sirf(&bin[0],2); //Poll Navigation Parameters + + while (gps_tx_queue>0); + + //Wait for reply + while (gps_rx_ready==FALSE); + process_gps_rx(); + gps_rx_ready=FALSE;*/ + + #endif + // + + //Set request to get all NMEA messages + //gps_send_string("$PUNV,CONFIG,00,00,0,1000,57600,FF*cc\r\n",39); + + //sleep(200); + //gps_send_string("$PSRF103,00,00,00,01*24\r\n",25); // Disable GGA + //sleep(200); + //gps_send_string("$PSRF103,00,00,00,01*24\r\n",25); // Disable GGA + //gps_send_string("$PSRF103,08,00,01,01*2D\r\n",25); //Enable ZDA + //gps_send_string("$PSRF103,01,00,01,01*24\r\n",25); //Enable GLL + + + + return 0x00; +} +//------------------------------------------------------------------------------ +// STOP_GPS +//------------------------------------------------------------------------------ +// Stop function for the GPS module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void GPS_Stop(void){ + //Disable GPS + GPS_DisablePower(); + + GPS_ConfigRxIRQ(DISABLE); + GPS_ConfigTxIRQ(DISABLE); + + //P8DIR |= BIT2; // Set P8.2 as Output + //P8OUT &= ~(BIT2); // Set P8.2 as Low + + //UCA2CTL1 |= UCSWRST; // **Put state machine in reset** + +} + +#if GPS_MODE==GPS_SIRF + +void GPS_Sleep(BOOL sleep){ + //Puts the GPS in a pseudo-sleep mode using SIRF commands + unsigned char bin[16]; + if (sleep==TRUE){ + //Set trickle power + bin[0]=SIRF_SET_TRICKLE_POWER; + bin[1]=0x00; //Using push-to-fix mode + bin[2]=0x01; + bin[3]=0x03; //Duty Cycle set to 100% + bin[4]=0xE8; + bin[5]=0x00; //On-Time set to 200 ms + bin[6]=0x00; + bin[7]=0x00; + bin[8]=0xC8; + + GPS_SendSirf(&bin[0],9); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + GPS_ProcessRX(); + gps_rx_ready=FALSE; + + bin[0]=SIRF_SET_LOWPOW_PARAMS; + bin[1] = 0x01; // Set max offtime as maximum value possible + bin[2] = 0xFF; + bin[3] = 0xFF; + bin[4] = 0xFF; + bin[5] = 0x00; // Set min search time as minimum value possible + bin[6] = 0x00; + bin[7] = 0x00; + bin[8] = 0x01; + bin[9] = 0x00; // Set push-to-fix period + bin[10]= 0x00; + bin[11]= 0x00; + bin[12]= 0x00; + bin[13]= 0x00; // Disable Adaptative Trickle Power + bin[14]= 0x00; + + GPS_SendSirf(&bin[0],15); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + GPS_ProcessRX(); + + gps_sleep=TRUE; + + }else{ + //Revert to default settings + bin[0]=SIRF_SET_TRICKLE_POWER; + bin[1]=0x00; //No push-to-fix mode + bin[2]=0x00; + bin[3]=0x03; //Duty Cycle set to 100% + bin[4]=0xE8; + bin[5]=0x00; //On-Time set to 200 ms + bin[6]=0x00; + bin[7]=0x00; + bin[8]=0xC8; + + GPS_SendSirf(&bin[0],9); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + GPS_ProcessRX(); + + gps_got_ffix = FALSE; + gps_sleep=FALSE; + } +} + +//------------------------------------------------------------------------------ +// GPS_CHECKSUM +//------------------------------------------------------------------------------ +// Calculates the Checksum needed for the SIRF command +//------------------------------------------------------------------------------ +// Parameters: +// msg - a pointer to the start of the binary command to calculate. +// len - the length of the command to send, excluding the header, CRC and end sequence +// +// Return value (Unsigned short): +// Checksum of the message +//------------------------------------------------------------------------------ +unsigned short GPS_Checksum(unsigned char* msg, unsigned short len){ + unsigned short checksum=0; + unsigned short i; + + for (i=0; iGPS_TX_BUFFER){ + return ERROR_BUFFER; + } + + //Check if buffers are full + //TODO! + + //Header + gps_tx[gps_tx_wr_ptr][0] = 0xA0; + gps_tx[gps_tx_wr_ptr][1] = 0xA2; + gps_tx[gps_tx_wr_ptr][2] = len>>8; + gps_tx[gps_tx_wr_ptr][3] = (char)(len&0x00FF); + + //Copy the bytes into the actual transmit buffer + memcpy(&gps_tx[gps_tx_wr_ptr][4], msg, len); + + //Footer + chk = GPS_Checksum(msg,len); + gps_tx[gps_tx_wr_ptr][len+4] = chk>>8; + gps_tx[gps_tx_wr_ptr][len+5] = (char)(chk&0x00FF); + gps_tx[gps_tx_wr_ptr][len+6] = 0xB0; + gps_tx[gps_tx_wr_ptr][len+7] = 0xB3; + + //Set the message length + gps_tx_len[gps_tx_wr_ptr]=len+8; + + //Increments buffer ptr + gps_tx_wr_ptr++; + if (gps_tx_wr_ptr >= GPS_TX_BUF_NUM){ + gps_tx_wr_ptr=0; + } + + //Starts the transfer of the first byte + if (gps_tx_queue>0) + //Already processing... we just add another item + gps_tx_queue++; + else{ + gps_tx_queue++; + USART_SendData(USART3, gps_tx[gps_tx_rd_ptr][0]); + + } + + + return ERROR_NONE; //All is well! +} +#endif + +//------------------------------------------------------------------------------ +// GPS_SEND_STRING +//------------------------------------------------------------------------------ +// Add a string to the TX buffer and starts the transfer process to the GPS +//------------------------------------------------------------------------------ +// Parameters: +// msg - a pointer to the start of the character string to transfer. This pointer +// doesn't need to still be valid after the execution of this function, since +// it will copy the string into a transmit buffer. +// len - the length of the string to send +// +// Return value (Unsigned Char): +// 0x00, if everything went ok +// 0x01, if string is too long +// 0x02, if transmit buffer are full +//------------------------------------------------------------------------------ +Error_TypeDef GPS_SendString(char* msg, unsigned short len){ + + //Check if length is <= TX buffer size + if (len>GPS_TX_BUFFER){ + return ERROR_BUFFER; + } + + //Check if buffers are full + //TODO! + + //Copy the bytes into the actual transmit buffer + memcpy(&gps_tx[gps_tx_wr_ptr][0], msg, len); + + //Set the message length + gps_tx_len[gps_tx_wr_ptr]=len; + + //Increments buffer ptr + gps_tx_wr_ptr++; + if (gps_tx_wr_ptr >= GPS_TX_BUF_NUM){ + gps_tx_wr_ptr=0; + } + + //Starts the transfer of the first byte + if (gps_tx_queue>0) + //Already processing... we just add another item + gps_tx_queue++; + else{ + gps_tx_queue++; + //UCA2TXBUF = gps_tx[gps_tx_rd_ptr][0]; + //Start transfer + USART_SendData(USART3, gps_tx[gps_tx_rd_ptr][0]); + + } + + + return ERROR_NONE; //All is well! +} + +//------------------------------------------------------------------------------ +// PROCESS_GPS_RX +//------------------------------------------------------------------------------ +// Process the last received GPS NMEA data and execute appropriate tasks according +// to it. +//------------------------------------------------------------------------------ +// Parameters: +// None - it will automatically use the actual RX read buffer as defined by +// gps_rx_rd_ptr; +// +// Return value (Unsigned Char): +// 0x00, if command was processed +// 0x01, if command wasn't processed +//------------------------------------------------------------------------------ +Error_TypeDef GPS_ProcessRX(void){ + unsigned char rval = ERROR_UNMANAGED; + unsigned short t; + //RTC_DateTypeDef RTC_DateStruct; + //RTC_TimeTypeDef RTC_TimeStruct; + //unsigned long last_ts; + #if GPS_MODE==GPS_SIRF + //unsigned char bin[64]; + #endif + + //gps_count=0; //Reset watchdog timer + //gps_alive=TRUE; + + +#if GPS_MODE==GPS_NMEA + gps_rx[gps_rx_rd_ptr][gps_rx_len[gps_rx_rd_ptr]]=0; + //printf("%lu: %s",timestamp, gps_rx[gps_rx_rd_ptr]); + //ZDA + //////////////// + + + if (strncmp((const char*)&gps_rx[gps_rx_rd_ptr][0],"$GPZDA",6)==0){ + + //Set timestamp if not set + //if (time_sync==FALSE){ + if (time_sync==TIME_SYNC_COUNT){ + + //if (i_mod_status[MODULE_DATALOGGER]==MODULE_ONLINE){ + t=(gps_rx[gps_rx_rd_ptr][7]-48)*10+(gps_rx[gps_rx_rd_ptr][8]-48); + //SetRTCHOUR(t); + RTC_TimeStruct.RTC_Hours = t; + t=(gps_rx[gps_rx_rd_ptr][9]-48)*10+(gps_rx[gps_rx_rd_ptr][10]-48); + //SetRTCMIN(t); + RTC_TimeStruct.RTC_Minutes = t; + t=(gps_rx[gps_rx_rd_ptr][11]-48)*10+(gps_rx[gps_rx_rd_ptr][12]-48); + //SetRTCSEC(t); + RTC_TimeStruct.RTC_Seconds = t; + t=(gps_rx[gps_rx_rd_ptr][18]-48)*10+(gps_rx[gps_rx_rd_ptr][19]-48); + //SetRTCDAY(t); + RTC_DateStruct.RTC_Date = t; + t=(gps_rx[gps_rx_rd_ptr][21]-48)*10+(gps_rx[gps_rx_rd_ptr][22]-48); + //SetRTCMON(t); + RTC_DateStruct.RTC_Month = t; + t=(gps_rx[gps_rx_rd_ptr][24]-48)*1000+(gps_rx[gps_rx_rd_ptr][25]-48)*100 + +(gps_rx[gps_rx_rd_ptr][26]-48)*10+(gps_rx[gps_rx_rd_ptr][27]-48); + //SetRTCYEAR(t); + RTC_DateStruct.RTC_Year = t; + //update_timestampRTC(); + RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); + RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); + + //} + time_sync++; + //TODO: resync at regular intervals??? + //time_sync=TRUE; + }else{ + if (time_sync!=TIME_SYNC_COUNT+1) + time_sync++; + } + + rval=ERROR_NONE; + } +#endif + +#if GPS_MODE==GPS_SIRF + //Sirf Binary data + //TODO: check checksum + last_gps_cmd = gps_rx[gps_rx_rd_ptr][4]; + switch(gps_rx[gps_rx_rd_ptr][4]){ + /*case SIRF_OK_TO_SEND: + if (gps_rx[gps_rx_rd_ptr][5]==1 && i_mod_status[MODULE_GPS]==MODULE_ONLINE){ // OK to Send, so make sure config is ok + gps_config(); + } + rval=0x00; + break;*/ + case SIRF_CMD_ACK: + rval = ERROR_NONE; + break; + case SIRF_CMD_NACK: + rval = ERROR_NONE; + break; + case SIRF_NAV_PARAMS: + //TODO: update parameters in memory?? + rval = ERROR_NONE; + break; + case SIRF_GEO_DATA: + //if (time_sync==FALSE){ + //led_toggle(LED_BLUE); + t=gps_rx[gps_rx_rd_ptr][16] + (unsigned short)(gps_rx[gps_rx_rd_ptr][15]<<8); + if (time_sync0){ // A fix was achieved + if (t>2013 && t<3000){ // Year is different than default value + time_sync++; + if (time_sync>=TIME_SYNC_COUNT){ + //Prepare time structure for datalogger + update_RTCtime(t,gps_rx[gps_rx_rd_ptr][17],gps_rx[gps_rx_rd_ptr][18],gps_rx[gps_rx_rd_ptr][19],gps_rx[gps_rx_rd_ptr][20],(gps_rx[gps_rx_rd_ptr][22] + (unsigned short)(gps_rx[gps_rx_rd_ptr][21]<<8))/1000, true); + + // Disable GPS if was on only for timestamp sync + if (wimu_config.datetime.enable_gps_time > 0 && getModuleState(MODULE_GPS)==STATE_SPECIAL){ + // GOTO hibernation mode + GPS_Hibernate(); + } + // Log time sync in log.dat + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"Time Synced\r\n",13, TRUE, MODULE_CPU,0); + msWait(50); + } + } + //timestamp=mktime(&timing); + //time_sync=TRUE; + + } + }else{ //Time_Sync + //Correct RTC drift + gps_time_drift++; + if (gps_time_drift>=TIME_DRIFT_COUNT){ + if (t>2013 && t<3000){ //Year is valid + //last_ts=timestamp; + update_RTCtime(t,gps_rx[gps_rx_rd_ptr][17],gps_rx[gps_rx_rd_ptr][18],gps_rx[gps_rx_rd_ptr][19],gps_rx[gps_rx_rd_ptr][20],(gps_rx[gps_rx_rd_ptr][22] + (unsigned short)(gps_rx[gps_rx_rd_ptr][21]<<8))/1000, true); + + /*if (i_mod_status[MODULE_DATALOGGER]==MODULE_ONLINE){ + + sprintf(buf, "Drift: %d\r\n", timestamp-last_ts); + datalog_save_data((unsigned char*)&buf[0],strlen(buf), TRUE, MODULE_CPU,0); + }*/ + gps_time_drift=0; + } + } + } + + //Fix analysis + if ((gps_rx[gps_rx_rd_ptr][8] & 0x07)>0){ + gps_has_fix = TRUE; + gps_nofix_count=0; //Reset fix counter + if (gps_got_ffix == FALSE){ + //Check if we got a first fix since last restart or not + gps_got_ffix = TRUE; + + //TODO: Set duty cycle and adaptative trickle power + + //Enable adaptative trickle power, if selected + /*if ((wimu_config.gps_opt & CONFIG_GPS_TRICKLE)>0){ + //Set trickle power + bin[0]=SIRF_SET_TRICKLE_POWER; + bin[1]=0; //Not using push-to-fix mode + bin[2]=0; + bin[3]=0x01; //Duty Cycle set to 30% (recommended setting) + bin[4]=0x2C; + bin[5]=0x00; //On-Time set to 300 ms + bin[6]=0x00; + bin[7]=0x01; + bin[8]=0x2C; + + gps_send_sirf(&bin[0],9); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + process_gps_rx(); + gps_rx_ready=FALSE; + + //Set adaptative trickle power + bin[0]=SIRF_SET_LOWPOW_PARAMS; + bin[1]=0; // Max OffTime @ 5 minutes //TODO: Set in Config + bin[2]=0x04; // 0x000493E0 = 300 000 ms = 5 minutes + bin[3]=0x93; + bin[4]=0xE0; + bin[5]=0x00; // Max SearchTime @ 10 minutes + bin[6]=0x09; // 0x000927C0 = 600 000 ms = 10 minutes + bin[7]=0x27; + bin[8]=0xC0; + bin[9]=0; //Push-to-fix period not needed + bin[10]=0; + bin[11]=0; + bin[12]=0x3C; + bin[13]=0x00; //Enable Adaptative Trickle Power + bin[14]=0x01; + + gps_send_sirf(&bin[0],15); + while (gps_tx_queue>0); + //Wait for acknowledgement message + while (gps_rx_ready==FALSE); + process_gps_rx(); + gps_rx_ready=FALSE; + + } //Enable Trickle*/ + } //Has first Fix + }else{ //Has Fix + gps_nofix_count++; + if (gps_nofix_count>=GPS_NOFIX_COUNT_MAX){ + gps_nofix_count = GPS_NOFIX_COUNT_MAX; + gps_has_fix = FALSE; + } + } + rval = ERROR_NONE; + break; + case SIRF_CLK_STATUS: + rval = ERROR_NONE; + break; + default: + rval=ERROR_UNMANAGED; + break; + } +#endif + + if (++gps_rx_rd_ptr >= GPS_RX_BUF_NUM) // At the end of the buffers? + gps_rx_rd_ptr=0; + + gps_rx_queue--; + + + return rval; +} + + +#if GPS_MODE==GPS_SIRF +Error_TypeDef GPS_SetMsgInterval(unsigned char msg_id, unsigned char interval){ + uint32_t timeout = 0x0fFFFF; + unsigned char bin[10]; + bin[0]=SIRF_SETMSG_RATE; + bin[1]=0; // No polling yet + bin[2]=msg_id; // Message ID to set + bin[3]=interval; // Interval + bin[4]=0; // Not used + bin[5]=0; // Not used + bin[6]=0; // Not used + bin[7]=0; // Not used + + GPS_SendSirf(&bin[0],8); + while (gps_tx_queue>0); + //Wait for acknowledgement message + last_gps_cmd = SIRF_CMD_NONE; + while (last_gps_cmd != SIRF_CMD_ACK){ + while (gps_rx_ready==FALSE && (--timeout)>0); + if (timeout==0) + return ERROR_COM; + GPS_ProcessRX(); + gps_rx_ready=FALSE; + } + return ERROR_NONE; + +} + +//------------------------------------------------------------------------------ +// GPS_SET_FILTERS +//------------------------------------------------------------------------------ +// Set the right configuration of messages to send/receive on the GPS +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// 0 = all is fine +// 1+ = timeout +//------------------------------------------------------------------------------ +Error_TypeDef GPS_SetMsgFrequency(){ + unsigned char rval = ERROR_NONE; + + // Disable Measured Navigation Data + rval |= GPS_SetMsgInterval(SIRF_MNAV_DATA,0); + + // Disable CPU throughput + rval |= GPS_SetMsgInterval(SIRF_CPU_THROUGHPUT,0); + + // Disable Clock Status + rval |= GPS_SetMsgInterval(SIRF_CLK_STATUS,0); + + // Disable Extended Ephemeris + rval |= GPS_SetMsgInterval(SIRF_EXT_EPHEMERIS,0); + + // Disable Auxiliary init data + rval |= GPS_SetMsgInterval(SIRF_NL_AUX_INIT_DATA,0); + //msWait(200); + // Disable SBAS parameters + rval |= GPS_SetMsgInterval(SIRF_SBAS_PARAMETERS,0); + //msWait(200); + // Disable CW Interference report + //rval |= GPS_SetMsgInterval(SIRF_CW_INTERFERENCE,0); + //msWait(200); + + // Disable 50 BPS Data + rval |= GPS_SetMsgInterval(SIRF_50BPS_DATA,0); + //msWait(200); + // Disable visible list + rval |= GPS_SetMsgInterval(SIRF_VISIBLE_LIST,0); + + // Enable measured tracker data out + //rval |= GPS_SetMsgInterval(SIRF_MTRACKER_DATA,1); + + return rval; +} +#endif + +#if GPS_MODE==GPS_SIRF +void DMA1_Channel3_IRQHandler(void){ + //SIRF MODE + //gps_rx[gps_rx_wr_ptr][gps_rx_index++]=USART_ReceiveData(USART3); + + uint8_t num_bytes = DMA_InitStructure.DMA_BufferSize; + uint8_t new_byte = GPS_Rx_DMA[0]; + + DMA_ClearITPendingBit(DMA1_IT_TC3); + + //Set DMA to trigger after next byte + DMA_SetCurrDataCounter(DMA1_Channel3, 1); + + //Check for frame alignment + if (gps_rx_index==0){ + if (new_byte != 0xA0){ // Not correctly aligned - wait for next + return; + } + } + + // Copy data to main buffer + memcpy(&gps_rx[gps_rx_wr_ptr][gps_rx_index], &GPS_Rx_DMA[0], num_bytes); + + // Update index + gps_rx_index += num_bytes; + + if (gps_rx_index ==4 ){ + //Check and record message length + //TODO: won't work with message payload longer than 255!! (not considering upper byte now) + gps_rx_len[gps_rx_wr_ptr] = 8 + gps_rx[gps_rx_wr_ptr][3]; + + //Prime DMA next message size + DMA_SetCurrDataCounter(DMA1_Channel3, gps_rx_len[gps_rx_wr_ptr] - gps_rx_index); + } + + if (gps_rx_index>=gps_rx_len[gps_rx_wr_ptr]){ + + gps_rx_index=0; + gps_rx_queue++; + + gps_rx_wr_ptr++; + if (gps_rx_wr_ptr >= GPS_RX_BUF_NUM) // All buffers were used + gps_rx_wr_ptr = 0; + + gps_rx_len[gps_rx_wr_ptr]=255; + gps_rx_ready=TRUE; + } + +} +#endif +/******************************************************************************* + * Function Name : USART3_IRQHandler + * Description : This function handles USART3 interrupt request. + * Input : None + * Output : None + * Return : None + *******************************************************************************/ +void USART3_IRQHandler(void) +{ + // GPS Data Received + ///////////////////// + + /*if (USART_GetITStatus(USART3, USART_IT_ORE_RX) != RESET){ //RX Overrun + }*/ + + // If a RX overrun occur, we continue to proceed with GPS reception as normal + // + if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET || USART_GetITStatus(USART3, USART_IT_ORE_RX) != RESET) + { + USART_ClearFlag(USART3, USART_FLAG_RXNE); + USART_ClearFlag(USART3, USART_FLAG_ORE); + //printf("%c", USART_ReceiveData(USART3)); + #if GPS_MODE==GPS_NMEA + gps_rx[gps_rx_wr_ptr][gps_rx_index++]=USART_ReceiveData(USART3); + //printf("%c", gps_rx[gps_rx_wr_ptr][gps_rx_index-1]); + + if (gps_rx_index>GPS_RX_BUFFER || gps_rx[gps_rx_wr_ptr][gps_rx_index-1]==0x0A){ //Line Feed + //Command complete or overflowed... + + gps_rx_len[gps_rx_wr_ptr] = gps_rx_index; + gps_rx_index=0; + gps_rx_queue++; + + gps_rx_wr_ptr++; + if (gps_rx_wr_ptr >= GPS_RX_BUF_NUM) // All buffers were used + gps_rx_wr_ptr = 0; + + gps_rx_ready=TRUE; + } + else{ + //while (!(UCA3IFG&UCTXIFG)); // USCI_A0 TX buffer ready? + //UCA3TXBUF = UCA3RXBUF; // TX -> RXed character + + //usb_send_char(UCA3RXBUF); + } + #endif + /*#if GPS_MODE==GPS_SIRF + //SIRF MODE + gps_rx[gps_rx_wr_ptr][gps_rx_index++]=USART_ReceiveData(USART3); + //led_toggle(LED1); + if (gps_rx_index==1){ + if (gps_rx[gps_rx_wr_ptr][0]!=0xA0){ + //Frame alignment isn't right - don't consider the data + gps_rx_index=0; + } + } + + if (gps_rx_index==2){ + if (gps_rx[gps_rx_wr_ptr][1]!=0xA2){ + //Frame alignment isn't right - don't consider the data + if (gps_rx[gps_rx_wr_ptr][1]==0xA0){ + gps_rx[gps_rx_wr_ptr][0]=0xA0; + gps_rx_index=1; + }else{ + gps_rx_index=0; + } + } + } + + if (gps_rx_index==4){ + //Check and record message length + //TODO: won't work with message payload longer than 255!! (not considering upper byte now) + gps_rx_len[gps_rx_wr_ptr] = 8 + gps_rx[gps_rx_wr_ptr][3]; + } + + if (gps_rx_index>=gps_rx_len[gps_rx_wr_ptr]){ + + gps_rx_index=0; + gps_rx_queue++; + + gps_rx_wr_ptr++; + if (gps_rx_wr_ptr >= GPS_RX_BUF_NUM) // All buffers were used + gps_rx_wr_ptr = 0; + gps_rx_len[gps_rx_wr_ptr]=255; + gps_rx_ready=TRUE; + } + #endif*/ + } + // GPS Data Transmitted + if(USART_GetITStatus(USART3, USART_IT_TC) != RESET) + { + USART_ClearFlag(USART3, USART_FLAG_TC); + //Check for the next char to send + if (gps_tx_queue>0){ + gps_tx_index++; + if (gps_tx_index >= GPS_TX_BUFFER || gps_tx_index >= gps_tx_len[gps_tx_rd_ptr]){ + //This sequence is over. + gps_tx_queue--; + gps_tx_rd_ptr++; + gps_tx_index=0; + if (gps_tx_rd_ptr >= GPS_TX_BUF_NUM) // All buffers were used + gps_tx_rd_ptr = 0; + if (gps_tx_queue>0){ + //Sends the next message + //while (!(UCA3IFG&UCTXIFG)); + USART_SendData(USART3, gps_tx[gps_tx_rd_ptr][gps_tx_index]); + } + + }else{ + //Sends the next char waiting! + //while (!(UCA3IFG&UCTXIFG)); + USART_SendData(USART3, gps_tx[gps_tx_rd_ptr][gps_tx_index]); + } + } + } + /*if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) + { + USART_ClearFlag(USART3, USART_FLAG_RXNE); + printf("%c", USART_ReceiveData(USART3)); + }*/ + +} + + +// GPS 1PPS interrupt +void EXTI3_IRQHandler(void) +{ + if(EXTI_GetITStatus(EXTI_Line3) != RESET) + { +// printf("1PPS\n"); + //GPIO_ToggleBits(GPIOC, GPIO_Pin_7); + if (isModuleOnline(MODULE_GPS)) + if (wimu_config.ui.gps_fix_led==true) + led_toggle(LED_GREEN, MEDIUM_PRIORITY); + + /* Clear interrupt pending bit */ + EXTI_ClearITPendingBit(EXTI_Line3); + } + +} + + diff --git a/Firmware/WIMU3/src/imu.c b/Firmware/WIMU3/src/imu.c new file mode 100644 index 0000000..3167ae3 --- /dev/null +++ b/Firmware/WIMU3/src/imu.c @@ -0,0 +1,374 @@ +#include + +#include "imu.h" +#include "utils.h" +#include "config.h" +#include "usb.h" +#include "flash.h" + +#include "arm_math.h" + +IMUFrame_Struct IMUFrame; +uint8_t IMUFrame_Status = 0; + +uint8_t IMUFrame_ReadyMask = 0; +IMUCalib_Struct IMUCalib; + +extern WIMU_SETTINGS wimu_settings; // For gains and offset values +extern WIMU_CONFIG wimu_config; // For accelero, gyro and magneto ranges + +float gyroSum[3], gyroOffsets[3]; + +uint8_t acc_range; +float mag_range; +uint16_t gyro_range; + +Madgwick_Struct madgwick_Struct; + +void IMUInit(){ + uint8_t value; + + // Accelerometer range + value = wimu_config.acc.range; // Raw config register value + acc_range = 1 << (value+1); // Accelerometer sensibility + + // Gyrometer range + value = wimu_config.gyro.range; // Raw config register value + gyro_range = (1 << value) * 250; // Gyrometer sensibility + + // Magnetometer range + value = wimu_config.magneto.range; // Raw config register value + switch(value){ + case 0: + mag_range = 0.88; + break; + case 1: + mag_range = 1.3; + break; + case 2: + mag_range = 1.9; + break; + case 3: + mag_range = 2.5; + break; + case 4: + mag_range = 4.0; + break; + case 5: + mag_range = 4.7; + break; + case 6: + mag_range = 5.6; + break; + case 7: + mag_range = 8.1; + break; + default: + mag_range = 0; + break; + } + +} + +Madgwick_Struct MadgwickInit(float beta,int sampleFrequency,bool onlyImu,bool automaticGyroOffsets/*,float accOffsets[3],float gyroOffsets[3],float magOffsets[3],int16_t accGains[3],int16_t gyroGains[3],int16_t magGains[3]*/){ + + Madgwick_Struct m; + m.beta = beta; + m.sampleFrequency = sampleFrequency; + m.onlyImu = onlyImu; + m.automaticGyroOffsets=automaticGyroOffsets; + m.frameNum = 0; + + /*memcpy(m.accOffsets,accOffsets,3*4); + memcpy(m.gyroOffsets,accOffsets,3*4); + memcpy(m.magOffsets,accOffsets,3*4); + memcpy(m.accGains,accGains,3*2); + memcpy(m.gyroGains,gyroGains,3*2); + memcpy(m.magGains,magGains,3*2);*/ + + return m; + +} + + +void MadgwickProcess(Madgwick_Struct* madStruct){ + + float beta = madStruct->beta; + int sampleFreq = madStruct->sampleFrequency; + float q0 = madStruct->quaternion[0]; + float q1 = madStruct->quaternion[1]; + float q2 = madStruct->quaternion[2]; + float q3 = madStruct->quaternion[3]; + + // initialize quaternion data if first iteration + if( q0==0){ + q0 = 1; + q1 = 0; + q2 = 0; + q3 = 0; + } + + float gx = -(madStruct->gyro_data[0])/1000; + float gy = -(madStruct->gyro_data[1])/1000; + float gz = (madStruct->gyro_data[2])/1000; + float ax = -(madStruct->acc_data[0])/1000; + float ay = -(madStruct->acc_data[1])/1000; + float az = (madStruct->acc_data[2])/1000; + float mx = (madStruct->mag_data[0])/1000; + float my = (madStruct->mag_data[1])/1000; + float mz = (madStruct->mag_data[2])/1000; + + + float recipNorm; + float s0, s1, s2, s3; + float qDot1, qDot2, qDot3, qDot4; + float hx, hy; + float _2q0mx, _2q0my, _2q0mz, _2q1mx, _2bx, _2bz, _4bx, _4bz, _8bx, _8bz, _2q0, _2q1, _2q2, _2q3,/* _2q0q2, _2q2q3,*/ q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3; + + // Rate of change of quaternion from gyroscope + qDot1 = 0.5 * (-q1 * gx - q2 * gy - q3 * gz); + qDot2 = 0.5 * (q0 * gx + q2 * gz - q3 * gy); + qDot3 = 0.5 * (q0 * gy - q1 * gz + q3 * gx); + qDot4 = 0.5 * (q0 * gz + q1 * gy - q2 * gx); + +// Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation) + if(!((ax == 0) && (ay == 0) && (az == 0))) { + + // Normalize accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Normalise magnetometer measurement + recipNorm = invSqrt(mx * mx + my * my + mz * mz); + mx *= recipNorm; + my *= recipNorm; + mz *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + _2q0mx = 2 * q0 * mx; + _2q0my = 2 * q0 * my; + _2q0mz = 2 * q0 * mz; + _2q1mx = 2 * q1 * mx; + _2q0 = 2 * q0; + _2q1 = 2 * q1; + _2q2 = 2 * q2; + _2q3 = 2 * q3; + //_2q0q2 = 2 * q0 * q2; + //_2q2q3 = 2 * q2 * q3; + q0q0 = q0 * q0; + q0q1 = q0 * q1; + q0q2 = q0 * q2; + q0q3 = q0 * q3; + q1q1 = q1 * q1; + q1q2 = q1 * q2; + q1q3 = q1 * q3; + q2q2 = q2 * q2; + q2q3 = q2 * q3; + q3q3 = q3 * q3; + + // Reference direction of Earth's magnetic field + hx = mx * q0q0 - _2q0my * q3 + _2q0mz * q2 + mx * q1q1 + _2q1 * my * q2 + _2q1 * mz * q3 - mx * q2q2 - mx * q3q3; + hy = _2q0mx * q3 + my * q0q0 - _2q0mz * q1 + _2q1mx * q2 - my * q1q1 + my * q2q2 + _2q2 * mz * q3 - my * q3q3; + + arm_sqrt_f32(hx * hx + hy * hy,&_2bx); + + _2bz = -_2q0mx * q2 + _2q0my * q1 + mz * q0q0 + _2q1mx * q3 - mz * q1q1 + _2q2 * my * q3 - mz * q2q2 + mz * q3q3; + _4bx = 2 * _2bx; + _4bz = 2 * _2bz; + _8bx = 2 * _4bx; + _8bz = 2 * _4bz; + + // Gradient decent algorithm corrective step + //s0 = -_2q2 * (2 * q1q3 - _2q0q2 - ax) + _2q1 * (2 * q0q1 + _2q2q3 - ay) - _2bz * q2 * (_2bx * (1/2 - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx * q3 + _2bz * q1) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx * q2 * (_2bx * (q0q2 + q1q3) + _2bz * (1/2 - q1q1 - q2q2) - mz); + //s1 = _2q3 * (2 * q1q3 - _2q0q2 - ax) + _2q0 * (2 * q0q1 + _2q2q3 - ay) - 4 * q1 * (1 - 2 * q1q1 - 2 * q2q2 - az) + _2bz * q3 * (_2bx * (0.5 - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx * q2 + _2bz * q0) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx * q3 - _4bz * q1) * (_2bx * (q0q2 + q1q3) + _2bz * (1/2 - q1q1 - q2q2) - mz); + //s2 = -_2q0 * (2 * q1q3 - _2q0q2 - ax) + _2q3 * (2 * q0q1 + _2q2q3 - ay) - 4 * q2 * (1 - 2 * q1q1 - 2 * q2q2 - az) + (-_4bx * q2 - _2bz * q0) * (_2bx * (1/2 - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx * q1 + _2bz * q3) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx * q0 - _4bz * q2) * (_2bx * (q0q2 + q1q3) + _2bz * (1/2 - q1q1 - q2q2) - mz); + //s3 = _2q1 * (2 * q1q3 - _2q0q2 - ax) + _2q2 * (2 * q0q1 + _2q2q3 - ay) + (-_4bx * q3 + _2bz * q1) * (_2bx * (1/2 - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx * q0 + _2bz * q2) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx * q1 * (_2bx * (q0q2 + q1q3) + _2bz * (1/2 - q1q1 - q2q2) - mz); + + // Il semble y avoir une erreur pour la stabilité lorsque pointé vers le bas: http://stackoverflow.com/questions/25902186/madgwick-sensor-fusion-on-lsm9ds0 + s0= -_2q2*(2*(q1q3 - q0q2) - ax) + _2q1*(2*(q0q1 + q2q3) - ay) + -_4bz*q2*(_4bx*(0.5 - q2q2 - q3q3) + _4bz*(q1q3 - q0q2) - mx) + (-_4bx*q3+_4bz*q1)*(_4bx*(q1q2 - q0q3) + _4bz*(q0q1 + q2q3) - my) + _4bx*q2*(_4bx*(q0q2 + q1q3) + _4bz*(0.5 - q1q1 - q2q2) - mz); + s1= _2q3*(2*(q1q3 - q0q2) - ax) + _2q0*(2*(q0q1 + q2q3) - ay) + -4*q1*(2*(0.5 - q1q1 - q2q2) - az) + _4bz*q3*(_4bx*(0.5 - q2q2 - q3q3) + _4bz*(q1q3 - q0q2) - mx) + (_4bx*q2+_4bz*q0)*(_4bx*(q1q2 - q0q3) + _4bz*(q0q1 + q2q3) - my) + (_4bx*q3-_8bz*q1)*(_4bx*(q0q2 + q1q3) + _4bz*(0.5 - q1q1 - q2q2) - mz); + s2= -_2q0*(2*(q1q3 - q0q2) - ax) + _2q3*(2*(q0q1 + q2q3) - ay) + (-4*q2)*(2*(0.5 - q1q1 - q2q2) - az) + (-_8bx*q2-_4bz*q0)*(_4bx*(0.5 - q2q2 - q3q3) + _4bz*(q1q3 - q0q2) - mx)+(_4bx*q1+_4bz*q3)*(_4bx*(q1q2 - q0q3) + _4bz*(q0q1 + q2q3) - my)+(_4bx*q0-_8bz*q2)*(_4bx*(q0q2 + q1q3) + _4bz*(0.5 - q1q1 - q2q2) - mz); + s3= _2q1*(2*(q1q3 - q0q2) - ax) + _2q2*(2*(q0q1 + q2q3) - ay)+(-_8bx*q3+_4bz*q1)*(_4bx*(0.5 - q2q2 - q3q3) + _4bz*(q1q3 - q0q2) - mx)+(-_4bx*q0+_4bz*q2)*(_4bx*(q1q2 - q0q3) + _4bz*(q0q1 + q2q3) - my)+(_4bx*q1)*(_4bx*(q0q2 + q1q3) + _4bz*(0.5 - q1q1 - q2q2) - mz); + + recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3); // normalise step magnitude + s0 *= recipNorm; + s1 *= recipNorm; + s2 *= recipNorm; + s3 *= recipNorm; + + // Apply feedback step + qDot1 -= beta * s0; + qDot2 -= beta * s1; + qDot3 -= beta * s2; + qDot4 -= beta * s3; + + }//endif accelerometer data is good + + + // floategrate rate of change of quaternion to yield quaternion + q0 += qDot1 * (1.0f / sampleFreq); + q1 += qDot2 * (1.0f / sampleFreq); + q2 += qDot3 * (1.0f / sampleFreq); + q3 += qDot4 * (1.0f / sampleFreq); + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + + madStruct->quaternion[0] = q0; + madStruct->quaternion[1] = q1; + madStruct->quaternion[2] = q2; + madStruct->quaternion[3] = q3; + + /*madStruct->quaternion[0] = gx; + madStruct->quaternion[1] = gy; + madStruct->quaternion[2] = gz; + madStruct->quaternion[3] = q3;*/ + + + return; + +} + +void calibrateIMUFrame(Madgwick_Struct * madStruct, IMUFrame_Struct * input){ + + uint8_t i; + + for (i=0; i<3; i++){ + madStruct->acc_data[i] = (input->acc_data[i] - wimu_settings.acc_offset[i]) / ((float)wimu_settings.acc_gain[i]); + madStruct->gyro_data[i] = (input->gyro_data[i] - wimu_settings.gyro_offset[i]) / ((float)wimu_settings.gyro_gain[i]); + madStruct->mag_data[i] = (input->mag_data[i] - wimu_settings.mag_offset[i]) / ((float)wimu_settings.mag_gain[i]); + } + madStruct->frameNum ++; +} + +// Originally Madgwick use fast inverse square-root but this algo is only usable for floats. +// instead arm_math is used +float invSqrt(float x){ + + float pOut; + + int result = arm_sqrt_f32(x,&pOut); + + if(result!=ARM_MATH_SUCCESS||pOut==0.0) + return 0; + + return 1 / pOut; +} + +void IMUCalibStructInit(IMUCalib_Struct* calib){ + // Set initial values + uint8_t i; + for (i=0; i<3; i++){ + calib->acc_min[i] = 32767; + calib->mag_min[i] = 32767; + calib->gyro_min[i] = 32767; + + calib->acc_max[i] = -32767; + calib->gyro_max[i] = -32767; + calib->mag_max[i] = -32767; + } + calib->in_progress = TRUE; +} + +void IMUProcessRawCalibration(IMUCalib_Struct* calib, IMUFrame_Struct* last_reading){ + // TODO: REVISE AS INITIAL CALIBRATION PROCEDURE WASN'T ADEQUATE + // NOTE: last_reading isn't and shouldn't be calibrated here + uint8_t i; + //int32_t value; + char buf[64]; + + // Compute gains and offset values from raw min and max values + + // Accelerometer + if (isModuleOnline(MODULE_ACC)){ + //value=-32767; + for (i=0; i<3; i++){ + wimu_settings.acc_offset[i] = (calib->acc_min[i] + calib->acc_max[i]) / 2; + sprintf(buf, "ACC # %d: MIN=%d, MAX=%d, OFFSET=%d\n\r", i,calib->acc_min[i], calib->acc_max[i], wimu_settings.acc_offset[i]); + USB_SendString(buf,strlen(buf)); + + // Calibrate last reading with those offset + // last_reading->acc_data[i] = last_reading->acc_data[i] - wimu_settings.acc_offset[i]; + + // Get max acceleration + //if (calib->acc_max[i]>value) value = calib->acc_max[i]; + } + /*sprintf(buf, "REF=%d\n\r", value); + usb_send_string(buf,strlen(buf));*/ + + // Compute gains + for (i=0; i<3; i++){ + // Based on "1g" value + wimu_settings.acc_gain[i] = (ConvertAccToG(calib->acc_max[i] - wimu_settings.acc_offset[i])) * 1000; + //wimu_settings.acc_gain[i] = ((float)calib->acc_max[i] / (float) value) * 1000; + sprintf(buf, "ACC # %d: GAIN=%d\n\r", i,wimu_settings.acc_gain[i]); + USB_SendString(buf,strlen(buf)); + } + + } + + /////////////// + // Magnetometer + if (isModuleOnline(MODULE_MAGNETO)){ + //value=-32767; + for (i=0; i<3; i++){ + wimu_settings.mag_offset[i] = (calib->mag_min[i] + calib->mag_max[i]) / 2; + sprintf(buf, "MAG # %d: MIN=%d, MAX=%d, OFFSET=%d\n\r", i,calib->mag_min[i], calib->mag_max[i], wimu_settings.mag_offset[i]); + USB_SendString(buf,strlen(buf)); + + // Calibrate last reading with those offset + // last_reading->mag_data[i] = last_reading->mag_data[i] - wimu_settings.mag_offset[i]; + + // Compute max magnetic field + //if (calib->mag_max[i]>value) value = calib->mag_max[i]; + } + //sprintf(buf, "REF=%d\n\r", value); + //usb_send_string(buf,strlen(buf)); + + // Compute gains + for (i=0; i<3; i++){ + + // Earth Magnetic Field Calculator: http://geomag.bgs.ac.uk/data_service/models_compass/wmm_calc.html + // Sherbrooke, 2016: 0.53653 Ga + + //TODO: Use value in config + wimu_settings.mag_gain[i] = (ConvertMagToGauss(calib->mag_max[i] - wimu_settings.mag_offset[i]) / 0.53653) * 1000; + //wimu_settings.mag_gain[i] = ((float)calib->mag_max[i] / (float) value) * 1000; + + sprintf(buf, "MAG # %d: GAIN=%d\n\r", i,wimu_settings.mag_gain[i]); + USB_SendString(buf,strlen(buf)); + } + + } + + // Save values in EEPROM + wimu_settings.crc = crc_calc((unsigned char*)&wimu_settings, (sizeof(WIMU_SETTINGS)-4)); + flash_write_settings(&wimu_settings); + +} + +void IMUStartCalibProcess(){ + //Calib_Counter=30; + USB_SendString("Sensors Calibration Started...\n\r",32); + + // Init calibration frame + IMUCalibStructInit(&IMUCalib); +} + +float ConvertAccToG(int16_t value){ + float acc_g = (float)value + 32767; // Remove negative offset + acc_g = ((acc_g / 65536) * 2 * acc_range) - acc_range; + return acc_g; +} + +float ConvertMagToGauss(int16_t value){ + float gauss = (float)value + 2048; // Remove negative offset + gauss = ((gauss / 4096) * 2 * mag_range) - mag_range; + return gauss; +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/main.c b/Firmware/WIMU3/src/main.c new file mode 100644 index 0000000..3f2629b --- /dev/null +++ b/Firmware/WIMU3/src/main.c @@ -0,0 +1,1787 @@ +//****************************************************************************** +// WIMUGPS - Main Module +// +// Description: This is the main module, which includes the main functions +// +// Author: Simon Briere, ing., M. Sc. A. +// STM32 adaptation: Nicolas Viscogliosi +// Initial Version: April 24th, 2013 +// +// Modifications: +//****************************************************************************** + +/* Includes ------------------------------------------------------------------*/ +#include + +#include "main.h" +#include "battery.h" + +/* Private macro -------------------------------------------------------------*/ + +/* Public variables ----------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +// Timing +unsigned long timestamp; +unsigned char time_sync = 0; + +// Settings & Config +WIMU_SETTINGS wimu_settings; +WIMU_CONFIG wimu_config; + +// Data management +bool initialized = FALSE; +bool first_time_init = true; +int16_t dataToWrite[MAX_FS*3]; //Memory buffer to write 3-axis data +int8_t dataGPSToWrite[200]; +float dataQuaternionToWrite[MAX_FS*4]; +float Quaternion_1s[4][MAX_FS]; +uint8_t Qua_SampleNumber = 0; + +volatile int16_t AccelX_1s[2][MAX_FS]; +volatile int16_t AccelY_1s[2][MAX_FS]; +volatile int16_t AccelZ_1s[2][MAX_FS]; +volatile int16_t GyroX_1s[2][MAX_FS]; +volatile int16_t GyroY_1s[2][MAX_FS]; +volatile int16_t GyroZ_1s[2][MAX_FS]; + +volatile int16_t MagnetoX_1s[2][MAX_FS]; +volatile int16_t MagnetoY_1s[2][MAX_FS]; +volatile int16_t MagnetoZ_1s[2][MAX_FS]; + + + + +/* Extern variables ----------------------------------------------------------*/ +// Real-Time Clock +extern RTC_TimeTypeDef RTC_TimeStruct; +extern RTC_DateTypeDef RTC_DateStruct; + +// Using 64 bits SysTick counter to ensure that the counter will never overflow +extern volatile uint64_t SysTick_Counter; +extern volatile uint32_t SysTick_DelayDownCounter; + + +/* Private function prototypes -----------------------------------------------*/ +void Main_ManageNewPowerState(); +/* Private functions ---------------------------------------------------------*/ + +//------------------------------------------------------------------------------ +// MAIN +//------------------------------------------------------------------------------ +// System Main +//------------------------------------------------------------------------------ +int main(void){ + char buf[32]; + + ///////////////////////////////////// + // Base system initialization + ///////////////////////////////////// + DOS_settings.exp_num = 0; + //Set RTC initial time (01-01-xx00) + RTC_SetInitial(); + timestamp=0; // Global timestamp set to 0 + + // Initial datalogger informations + /*dos_filenum = -1; + next_files(); + dos_runtime=0;*/ + + ////////////////////////////////////////////// + // Starts everything that needs to be started + ////////////////////////////////////////////// + Main_Start(); + + ////////////////////////////////////////////// + // Write module start in log + ////////////////////////////////////////////// + if (first_time_init==true){ + first_time_init=false; + // Log start message, if required + if (isModuleOnline(MODULE_DATALOGGER)){ + sprintf(buf, "WIMuGPS %d.%d.%d started\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_REV); + datalog_save_data((unsigned char*)&buf[0],strlen(buf), TRUE, MODULE_CPU,0); + } + } + + initialized=true; + +/* -----------Main loop----------- */ + while (1){ + + // softWDTInit(); + + //////////////////////// + // Power Management + /////////////////////// + if (Power_StateUpdate(false)){ + // Power state was changed - do the required action + Main_ManageNewPowerState(); + } + + //////////////////////// + // Reset Watchdog + /////////////////////// + //TODO + + //////////////////////// + // Process USB commands + /////////////////////// + if (isModuleOnline(MODULE_USB)) + main_usb(); + + //Global manipulations + /////////////////////////////// + + /////////////////////////// + // Datalogger module + /////////////////////////// + if (isModuleOnline(MODULE_DATALOGGER)){ + main_datalogger(); + } + + // Power module + /////////////////////////// + if (isModuleOnline(MODULE_POWER)){ + main_power(); + } + + /////////////////////////// + // Accelerometer/Gyroscope module + /////////////////////////// + if (isModuleOnline(MODULE_ACC) || isModuleOnline(MODULE_GYRO)){ + main_mpu(); + } + + /////////////////////////// + // Gyroscope module + /////////////////////////// + /*if (isModuleOnline(MODULE_GYRO)){ + main_gyro(); + }*/ + + /////////////////////////// + // Magnetometer module + /////////////////////////// + if (isModuleOnline(MODULE_MAGNETO)){ + main_magneto(); + } + + + + /////////////////////////// + // Bluetooth module + /////////////////////////// + if (isModuleOnline(MODULE_BLE)){ + main_ble(); + } + + //////////////////////// + // Process GPS data + /////////////////////// + if (isModuleOnline(MODULE_GPS) || getModuleState(MODULE_GPS)==STATE_SPECIAL){ + main_gps(); + } + + //////////////////////// + // Resets Management + /////////////////////// + manage_resets(); + + //////////////////////// + // Buttons Management + /////////////////////// + main_buttons(); + + ////////////////////// + // IMU + ///////////////////// + main_imu(); + + #ifdef POWER_MANAGE + /*if (i_mod_status[MODULE_DATALOGGER]==MODULE_ONLINE) + if(SPI_I2S_GetFlagStatus(SD_SPI, SPI_I2S_FLAG_BSY) == RESET); // Wait for data write complete on card before sleeping + PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI);*/ + #endif + + } // Main While + + + + /* -----------Main loop end----------- */ + return 0; +} + +//------------------------------------------------------------------------------ +// MAIN_INIT +//------------------------------------------------------------------------------ +// Initialization function for the system. +//------------------------------------------------------------------------------ +bool Main_Init(void){ + unsigned char i; + uint32_t crc; + + ////////////////////////////// + // Initialize Clocks + ////////////////////////////// + // System clock init + RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); + RCC_HSEConfig(RCC_HSE_ON); + RCC_PLLCmd(ENABLE); + SysTick_Config(SystemCoreClock/1000); + + //Timer and RTC config + Wait_TimerConfig(); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); + RTC_Config(); + + ////////////////////////////// + // Initialize Interrupt system + ////////////////////////////// + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + + ////////////////////////////// + // UI (LED, button) config + ////////////////////////////// + LedAndBuzzer_Config(false); + PushButton_Config(); + + ////////////////////////////// + // Monitors config + ////////////////////////////// + // Battery Monitoring + BatteryMonitoring_Config(); + // Charge detection Config + //ChargeStat_Config(); + + // Enable Pushbuttons interrupts - Charge stats modify EXTI interrupts, so before that line, would not be useful... + // PushButton_SetInterrupt(&ModeButton, ENABLE); + //PushButton_SetInterrupt(&PowerButton, ENABLE); + + // USB Detection + USBDetect_Config(); + + ////////////////////////////// + // Debugger config + ////////////////////////////// + DBGMCU_Config(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY, ENABLE); + + ////////////////////////////// + // Modules config + ////////////////////////////// + // Disable all modules by default + for (i=0; i 0){ + setModuleState(i,STATE_OFFLINE); + } + } + + setModuleState(MODULE_CPU, STATE_ONLINE); //CPU is always on by default + setModuleState(MODULE_USB, STATE_OFFLINE); // Always enable USB Module + setModuleState(MODULE_POWER, STATE_OFFLINE); // Always enable Power Module + + // Manually control each module for test + /*setModuleState(MODULE_ACC, STATE_DISABLED); + setModuleState(MODULE_GYRO, STATE_DISABLED); + setModuleState(MODULE_MAGNETO, STATE_DISABLED); + setModuleState(MODULE_DATALOGGER, STATE_DISABLED); + setModuleState(MODULE_GPS, STATE_DISABLED); + setModuleState(MODULE_BLE, STATE_DISABLED); + + wimu_config.ui.write_led = true;*/ + + // Enable IMU module if at least Acc and Gyro modules are enabled + if (getModuleState(MODULE_ACC)==STATE_OFFLINE && getModuleState(MODULE_GYRO)==STATE_OFFLINE){ + setModuleState(MODULE_IMU, STATE_OFFLINE); + }else + setModuleState(MODULE_IMU, STATE_DISABLED); + + ////////////////////////////// + // Variables initialization + ////////////////////////////// + //Initialize IMU Frame + for (i=0;i<3;i++){ + IMUFrame.acc_data[i]=0xFFFF; + IMUFrame.gyro_data[i]=0xFFFF; + IMUFrame.mag_data[i]=0xFFFF; + } + IMUFrame.frame_num=0; + + return TRUE; //All is well! +} + +// Start every modules +void Main_Start(){ + Main_Init(); + + led(LED_GREEN, TRUE, MEDIUM_PRIORITY); + + //if (first_time_init){ + ////////////////////////////// + // USB Module - Started only once for the whole run + ////////////////////////////// + if (getModuleState(MODULE_USB)==STATE_OFFLINE){ + USB_GlobalInit(); + USB_Start(); + setModuleState(MODULE_USB, STATE_ONLINE); + + if (USB_IsConnected()){ + // USB cable connected at startup, delay a little to allow everything to set up correctly + msWait(500); + } + } + //} + + ChargeStat_Config(); + PushButton_SetInterrupt(&ModeButton, ENABLE); + + update_timestampRTC(); + if (Main_StartModules()==false){ + //Error happened in the initialization sequence + error(MODULE_CPU, ERROR_INIT); + //return; + } + + // Turn off LED to indicate boot is completed + led(LED_GREEN, FALSE, NO_PRIORITY); + Buzzer_PlayStartSong(); +} + +// Stop every module +void Main_Stop(bool enter_stop_mode){ + uint8_t i; + __disable_irq(); + + // Wait a little if USB connected, to try and detect if we are connected to a "talking" device + /*if (Power_GetState()==POWER_STATE_USB){ + msWait(200); + Power_StateUpdate(); + }*/ + + //Shutdown every module, except USB and power + for (i=0; iCTRL, SysTick_CTRL_TICKINT_Msk); // Disable SysTick interrupts + + if (!Power_IsCharging() && Power_GetState()!=POWER_STATE_LOWBAT){ + LedAndBuzzer_Config(true); + Power_StateDisplay(); + Power_Stop(); + }else{ + LedAndBuzzer_Config(false); + Power_StateDisplay(); + //PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // Low-Power Sleep mode to enable timers for LED display + Power_Sleep(); + } + SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); // Enable SysTick interrupts + #endif + if (PowerButton.RequestedAction==BTN_ON_OFF){ + // Give a quick visual feedback that the command was understood + led(LED_GREEN, TRUE, MEDIUM_PRIORITY); + } + if (Power_StateUpdate()){ + Main_ManageNewPowerState(); + Power_StateDisplay(); + } + + } + } +} + + +//------------------------------------------------------------------------------ +// MAIN_STARTUP +//------------------------------------------------------------------------------ +// Initialize each internal peripheral. +// Verify that each device is correctly responding +// Start (enable) each device +//------------------------------------------------------------------------------ +bool Main_StartModules(void){ + unsigned char status; + uint16_t battery; + //unsigned short count; + //unsigned char f = ((wimu_config.cpu_opt & CONFIG_CPU_ADCBIT1) >> 7)*2 + ((wimu_config.cpu_opt & CONFIG_CPU_ADCBIT0) >> (CONFIG_CPU_ADCBIT0-1)); + //unsigned short fe; + //if (f==0) fe=50; + //if (f==1) fe=100; + //if (f==2) fe=200; + + // Set sampling rate for BLE module + //DEVINFOFrame.samplingRate = wimu_config.general.sampling_rate; + + // Update battery level + //BatteryMonitoring_RdADC(&Battery_ADCValue); + + // Wait for first battery level reading + while ( (battery = BatteryMonitoring_GetBatteryADCValue() ) == 0); + + ////////////////////////////// + // Power Module + ////////////////////////////// + if (getModuleState(MODULE_POWER)==STATE_OFFLINE){ + if ((status=Power_Init())!=0){ + error(MODULE_POWER, status); + return FALSE; //Problem occured + } + + if ((status=Power_Start())!=0){ + error(MODULE_POWER, status); + return FALSE; + } + setModuleState(MODULE_POWER, STATE_ONLINE); + + usb_mode = MASS_STORAGE; // Set USB mode in case it is already plugged in + if (Power_StateUpdate()){ + Main_ManageNewPowerState(); + if (Power_IsStopRequired(Power_GetState()) || Power_GetState()==POWER_STATE_USB_MASS) + return true; // Leave here + } + + /*if (USB_GetState()==USB_STATE_CONNECTED && Power_GetState() != POWER_STATE_USB_ON) + Power_SetState(POWER_STATE_USB); + + if (Power_GetState() != POWER_STATE_ON && Power_GetState() != POWER_STATE_USB_ON && USB_GetState()!=USB_STATE_CONNECTED){ + return true; // Leave here + } */ + } + + + ////////////////////////////// + // LOGGER Module + ////////////////////////////// + if (getModuleState(MODULE_DATALOGGER)==STATE_OFFLINE && Power_GetState()!=POWER_STATE_USB_MASS && Power_GetState()!=POWER_STATE_USB_COM){ + status=init_datalogger(); + msWait(100); + if (status==0) + status=start_datalogger(); + + if (status!=0) + error(MODULE_DATALOGGER, status); + + setModuleState(MODULE_DATALOGGER,STATE_ONLINE); + } + + /*if (Power_GetState() != POWER_STATE_ON && Power_GetState() != POWER_STATE_USB_ON){ + return TRUE; // Leave here + }*/ + + ///////////////////////////////////// + // Accelerometer & Gyrometer Modules + ///////////////////////////////////// + if (getModuleState(MODULE_ACC)==STATE_OFFLINE || getModuleState(MODULE_GYRO)==STATE_OFFLINE){ + + status = MPUCompass_MPUInit(); + if (status==ERROR_NONE) + status = MPUCompass_MPUStart(); + + if (status!=ERROR_NONE) + error(MODULE_ACC,status); + + if (getModuleState(MODULE_ACC)==STATE_OFFLINE){ + setModuleState(MODULE_ACC,STATE_ONLINE); + IMUFrame_ReadyMask |= MODULE_ACC; + } + + if (getModuleState(MODULE_GYRO)==STATE_OFFLINE){ + setModuleState(MODULE_GYRO, STATE_ONLINE); + IMUFrame_ReadyMask |= MODULE_GYRO; + } + + } + + ////////////////////////////// + // Magnetometer Module + ////////////////////////////// + if (getModuleState(MODULE_MAGNETO)==STATE_OFFLINE){ + + if (!isModuleOnline(MODULE_ACC) && !isModuleOnline(MODULE_GYRO)){ //i_mod_status[MODULE_ACC]!=MODULE_ONLINE && i_mod_status[MODULE_GYRO]!=MODULE_ONLINE){ + MPUCompass_ConfigIO(); + MPUCompass_EnablePower(); + MPUCompass_MPUWakeup(); + // MPUCompass_MPUConfigReg(); + } + + if (MPUCompass_CompassIDValidation()==0) + error(MODULE_MAGNETO, 1); + + MPUCompass_CompassConfigReg(wimu_config.magneto.range); + MPUCompass_CompassInitTimer(); + //MPUCompass_CompassSetFreq(MPUCOMPASS_50Hz); + + + if (wimu_config.general.sampling_rate==50) MPUCompass_CompassSetFreq(MPUCOMPASS_50Hz); + if (wimu_config.general.sampling_rate==100) MPUCompass_CompassSetFreq(MPUCOMPASS_100Hz); + if (wimu_config.general.sampling_rate==200) MPUCompass_CompassSetFreq(MPUCOMPASS_200Hz); + + if (isModuleOnline(MODULE_ACC) || isModuleOnline(MODULE_GYRO)) + MPUCompass_CompassSync(); + + //MPUCompass_MPUStart(); + MPUCompass_CompassStart(); + + setModuleState(MODULE_MAGNETO, STATE_ONLINE); + + IMUFrame_ReadyMask |= MODULE_MAGNETO; + + } + + // Ensure interrupts are still set for PushButton which shares the same Int Vector as the MPU + //PushButton_SetInterrupt(&PowerButton, ENABLE); + + ////////////////////////////// + // BLE Module + ////////////////////////////// + if (getModuleState(MODULE_BLE)==STATE_OFFLINE){ + + if ((status=init_ble())!=0){ + error(MODULE_BLE, status); + return FALSE; //Problem occured + } + if ((status=start_ble())!=0){ + error(MODULE_BLE, status); + return FALSE; + } + setModuleState(MODULE_BLE, STATE_ONLINE); + } + + ////////////////////////////// + // GPS Module + ////////////////////////////// + if (getModuleState(MODULE_GPS)==STATE_OFFLINE || wimu_config.datetime.enable_gps_time){ + if ((status=GPS_Init())!=0){ + error(MODULE_GPS, status); + return FALSE; //Problem occured + } + if ((status=GPS_Start())!=0){ + error(MODULE_GPS, status); + return FALSE; + } + setModuleState(MODULE_GPS, STATE_ONLINE); + + // In case MPU is off, we must manually set the interrupt for the power button + if (!isModuleOnline(MODULE_ACC) && !isModuleOnline(MODULE_MAGNETO)) + PushButton_SetInterrupt(&PowerButton, ENABLE); + + if (wimu_config.datetime.enable_gps_time && !isModuleOnline(MODULE_GPS)) + setModuleState(MODULE_GPS,STATE_SPECIAL); + } + + ////////////////////////////// + // IMU Module + ////////////////////////////// + if (getModuleState(MODULE_IMU)==STATE_OFFLINE){ + IMUInit(); + madgwick_Struct = MadgwickInit(wimu_config.imu.beta, + wimu_config.general.sampling_rate, + getModuleState(MODULE_MAGNETO)==STATE_DISABLED || wimu_config.imu.disable_magneto, + wimu_config.imu.auto_calib_gyro); + setModuleState(MODULE_IMU, STATE_ONLINE); + } + + return true; //All is well! +} + + +//------------------------------------------------------------------------------ +// MAIN_DATALOGGER +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the datalogger +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_datalogger(void){ + datalog_check_nextfiles(); // Check if we need to change file +} + +//------------------------------------------------------------------------------ +// MAIN_USB +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the USB +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_usb(void){ + uint8_t usb_bin_stream_old = usb_stream_bin; + if (usb_rx_ready==TRUE){ + //led(LED1, TRUE); + + USB_ProcessRX(); + + if (usb_bin_stream_old != usb_stream_bin){ + if (usb_stream_bin == USB_STREAM_FAST){ + // Must start all modules + led(LED_GREEN, TRUE, NO_PRIORITY); + Main_StartModules(); + led(LED_GREEN, FALSE, NO_PRIORITY); + + // Ensure we are still in the correct state! + Power_SetState(POWER_STATE_USB_COM); + }else{ + // Must stop all modules.. + Main_Stop(false); + //...except battery monitor + BatteryMonitoring_Config(); + } + } + + + //led(LED1, FALSE); + if (usb_rx_queue<=0) + usb_rx_ready=FALSE; + } +} + +//------------------------------------------------------------------------------ +// MAIN_BLE +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the BLE +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_ble(void){ + if (ble_rx_ready==TRUE){ + BLE_process_rx(); + + if (ble_rx_queue<=0) + ble_rx_ready=FALSE; + } + + // Check if we need to update the timestamp + if (ble_update_time){ + BLE_sendCurrentDateTime(); + ble_update_time = false; + } +} + +//------------------------------------------------------------------------------ +// MAIN_POWER +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the power +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_power(void){ + //int i; + char buf[32]; + + float voltage_battery; + float actual_temp; + uint8_t pourcentage_battery; + uint16_t adcValue; + + if (power_ready==TRUE){ + power_ready = FALSE; + // Read battery level + //BatteryMonitoring_RdADC(&Battery_ADCValue); + adcValue = BatteryMonitoring_GetBatteryADCValue(); + + //TDDO: Better algorithm for battery % + voltage_battery = Battery_VFromADC(adcValue); + //voltage_battery = (3.3/1024.0) * (float)(Battery_ADCValue) / 2.0; // in volts + pourcentage_battery = (uint8_t)((voltage_battery-3.3) / (3.7f-3.3f) * 100); //(uint8_t)((voltage_battery * 100.0)/3.7); // in % + if (pourcentage_battery > 100) + pourcentage_battery = 100; + + // Read actual temperature + //TempMonitoring_RdADC(&Temp_ADCValue); + adcValue = BatteryMonitoring_GetTempADCValue(); + + actual_temp = Temp_FromADC(adcValue); + // Check for low-batt + /*if(Battery_ADCValue <= LOWBAT_ADC_THRESHOLD) + { + Power_SetState(POWER_STATE_LOWBAT); + return; + }*/ + + dataToWrite[0] = (uint16_t)(actual_temp * 100); // Temperature + dataToWrite[1] = (uint16_t)(voltage_battery * 100); // Battery voltage + dataToWrite[2] = ((uint8_t)Power_GetState() & 0x7F) + (Power_IsCharging() ? 0x80 : 0x00); // Current power state & charge status + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],6, TRUE, MODULE_POWER,0); + } + + if (isModuleOnline(MODULE_USB)){ + if (usb_stream_power==USB_STREAM_SLOW){ + sprintf(buf, "%ld, %f %f, %d\n\r", timestamp, voltage_battery, actual_temp, dataToWrite[2]); + USB_SendString(buf,strlen(buf)); + } + if (usb_stream_bin==USB_STREAM_FAST){ + USB_SendBinary((unsigned char*)&dataToWrite[0],6,MODULE_POWER); + } + /*if (usb_stream_time==USB_STREAM_SLOW){ + sprintf(buf, "%ld\n\r", timestamp); + USB_SendString(buf,strlen(buf)); + }*/ + + + } + + if (isModuleOnline(MODULE_BLE)){ + //Send power data to BLE chip + POWERFrame.batteryValue = pourcentage_battery; + BLE_sendPOWERData(&POWERFrame); + } + } +} + +//------------------------------------------------------------------------------ +// MAIN_ACC +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the accelerometer +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +/*void main_acc(void){ + //static uint8_t Acc_ReadBufferPtr = 0; + static uint16_t idleCount=0xFFFF; + //static uint16_t count = 0; + //char buf[32]; + //int16_t AccelXYZData[3]; + //int16_t GyroXYZData[3]; + + //unsigned int WrittenByteCount; + //MPUCompass_ReadMPUData(AccelXYZData, GyroXYZData); + idleCount--; + + if (idleCount==0){ + // No data for a while! + error(MODULE_ACC, 32); + } + if (AccNewValue==TRUE){ + idleCount=0xFFFF; + if (MPU_SampleNumber>0){ + memcpy(&dataToWrite[0], (void*) &AccelX_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[1], (void*) &AccelY_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[2], (void*) &AccelZ_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + }else{ + memcpy(&dataToWrite[0], (void*) &AccelX_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[1], (void*) &AccelY_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[2], (void*) &AccelZ_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + } + + + // Prepare IMU Frame + //dataToWrite[0] = dataToWrite[1] = dataToWrite[2] = count+=100; + memcpy(&IMUFrame.acc_data, (void*) &dataToWrite[0], 6); + + IMUFrame_Status |= MODULE_ACC; + + AccNewValue=FALSE; + + } + if(Acc_BufferReady[MPU_BufRdPtr] == TRUE) + { + memcpy(&dataToWrite, &AccelX_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency], &AccelY_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency*2], &AccelZ_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],3*MPU_SamplingFrequency*2, TRUE, MODULE_ACC,0); + } + + + Acc_BufferReady[MPU_BufRdPtr] = FALSE; + + // Check if gyro data was needed and already read before doing this... + if (((IMUFrame_ReadyMask & MODULE_GYRO) > 0 && (IMUFrame_Status & MODULE_GYRO) >0) || (IMUFrame_ReadyMask & MODULE_GYRO) == 0){ + MPU_BufRdPtr++; + if(MPU_BufRdPtr > 1) + MPU_BufRdPtr = 0; + + debug_printf("A%d",MPU_BufRdPtr); + } + } +} + +//------------------------------------------------------------------------------ +// MAIN_GYRO +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the gyroscope +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_gyro(void){ + //static uint8_t Gyro_ReadBufferPtr = 0; + //static uint16_t count = 0; + //char buf[32]; + + //unsigned int WrittenByteCount; + + if (GyroNewValue==TRUE){ + if (MPU_SampleNumber>0){ + memcpy(&dataToWrite[0], (void*) &GyroX_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[1], (void*) &GyroY_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[2], (void*) &GyroZ_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + }else{ + memcpy(&dataToWrite[0], (void*) &GyroX_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[1], (void*) &GyroY_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[2], (void*) &GyroZ_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + } + + + //dataToWrite[0] = dataToWrite[1] = dataToWrite[2] = count+=100; + memcpy(&IMUFrame.gyro_data, (void*) &dataToWrite[0], 6); + IMUFrame_Status |= MODULE_GYRO; + + GyroNewValue=FALSE; + + } + + if(Gyro_BufferReady[MPU_BufRdPtr] == TRUE) + { + memcpy(&dataToWrite, &GyroX_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency], &GyroY_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency*2], &GyroZ_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],3*MPU_SamplingFrequency*2, TRUE, MODULE_GYRO,0); + } + + + + Gyro_BufferReady[MPU_BufRdPtr] = FALSE; + // Check if acc data was needed and already read before doing this... + if (((IMUFrame_ReadyMask & MODULE_ACC) > 0 && (IMUFrame_Status & MODULE_ACC) >0) || (IMUFrame_ReadyMask & MODULE_ACC) == 0){ + MPU_BufRdPtr++; + if(MPU_BufRdPtr > 1) + MPU_BufRdPtr = 0; + + debug_printf("G%d",MPU_BufRdPtr); + } + + }* +}*/ + +//------------------------------------------------------------------------------ +// MAIN_MPU +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the accelero +// and/or gyroscope module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_mpu(void){ + static uint16_t idleCount=0xFFFF; + + // Error detection + idleCount--; + if (idleCount==0){ + // No data for a while! + error(MODULE_ACC, 32); + } + + if (MPU_NewValue==true){ + idleCount=0xFFFF; + // Accelero + if (isModuleOnline(MODULE_ACC)){ + if (MPU_SampleNumber>0){ + memcpy(&dataToWrite[0], (void*) &AccelX_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[1], (void*) &AccelY_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[2], (void*) &AccelZ_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + }else{ + memcpy(&dataToWrite[0], (void*) &AccelX_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[1], (void*) &AccelY_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[2], (void*) &AccelZ_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + } + + // Prepare IMU Frame + memcpy(&IMUFrame.acc_data, (void*) &dataToWrite[0], 6); + + IMUFrame_Status |= MODULE_ACC; + } + + // Gyro + if (isModuleOnline(MODULE_GYRO)){ + if (MPU_SampleNumber>0){ + memcpy(&dataToWrite[0], (void*) &GyroX_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[1], (void*) &GyroY_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + memcpy(&dataToWrite[2], (void*) &GyroZ_1s[MPU_BufRdPtr][MPU_SampleNumber-1], 2); + }else{ + memcpy(&dataToWrite[0], (void*) &GyroX_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[1], (void*) &GyroY_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[2], (void*) &GyroZ_1s[MPU_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + } + + // Prepare IMU Frame + memcpy(&IMUFrame.gyro_data, (void*) &dataToWrite[0], 6); + IMUFrame_Status |= MODULE_GYRO; + } + MPU_NewValue=false; + } + + // 1 Hz saving data + if(/*MPU_BufferReady[MPU_BufRdPtr] == true*/MPU_BufRdPtr != MPU_BufWrPtr) + { + // Accelero + if (isModuleOnline(MODULE_ACC)){ + memcpy(&dataToWrite, &AccelX_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency], &AccelY_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency*2], &AccelZ_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],3*MPU_SamplingFrequency*2, TRUE, MODULE_ACC,0); + } + } + + // Gyro + if (isModuleOnline(MODULE_GYRO)){ + memcpy(&dataToWrite, &GyroX_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency], &GyroY_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + memcpy(&dataToWrite[MPU_SamplingFrequency*2], &GyroZ_1s[MPU_BufRdPtr], MPU_SamplingFrequency*2); + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],3*MPU_SamplingFrequency*2, TRUE, MODULE_GYRO,0); + } + } + + + //MPU_BufferReady[MPU_BufRdPtr] = false; + + MPU_BufRdPtr++; + if(MPU_BufRdPtr > 1) + MPU_BufRdPtr = 0; + + //debug_printf("A%d",MPU_BufRdPtr); + + } + +} + +//------------------------------------------------------------------------------ +// MAIN_MAGNETO +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop if the magnetometer +// module is enabled. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_magneto(void){ + //static uint8_t Compass_ReadBufferPtr = 0; + //static uint16_t count = 0; + //unsigned int WrittenByteCount; + uint8_t sample_number = Compass_SampleNumber; + //char buf[32]; + + if (Mag_NewValue==true){ + if (sample_number>0){ + memcpy(&dataToWrite[0], (void*) &MagnetoX_1s[Compass_BufRdPtr][sample_number-1], 2); + memcpy(&dataToWrite[1], (void*) &MagnetoY_1s[Compass_BufRdPtr][sample_number-1], 2); + memcpy(&dataToWrite[2], (void*) &MagnetoZ_1s[Compass_BufRdPtr][sample_number-1], 2); + }else{ + memcpy(&dataToWrite[0], (void*) &MagnetoX_1s[Compass_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[1], (void*) &MagnetoY_1s[Compass_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + memcpy(&dataToWrite[2], (void*) &MagnetoZ_1s[Compass_BufRdPtr][MPUCompass_SamplingFrequency-1], 2); + } + + + //dataToWrite[0] = dataToWrite[1] = dataToWrite[2] = count+=100; + memcpy(&IMUFrame.mag_data, (void*) &dataToWrite[0], 6); + + IMUFrame_Status |= MODULE_MAGNETO; + + Mag_NewValue=false; + + } + if(/*Compass_BufferReady[Compass_BufRdPtr] == true*/Compass_BufRdPtr != Compass_BufWrPtr) + { + memcpy(&dataToWrite, &MagnetoX_1s[Compass_BufRdPtr], MPUCompass_SamplingFrequency*2); + memcpy(&dataToWrite[MPUCompass_SamplingFrequency], &MagnetoY_1s[Compass_BufRdPtr], MPUCompass_SamplingFrequency*2); + memcpy(&dataToWrite[MPUCompass_SamplingFrequency*2], &MagnetoZ_1s[Compass_BufRdPtr], MPUCompass_SamplingFrequency*2); + + //Save to Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&dataToWrite[0],3*MPUCompass_SamplingFrequency*2, TRUE, MODULE_MAGNETO,0/*mag_time[mag_rd_buf_ptr]*/); + } + + /* if (isModuleOnline(MODULE_USB)){ + if (usb_stream_mag==USB_STREAM_SLOW){ + sprintf(buf, "%ld, %d %d %d\n\r", timestamp,MagnetoX_1s[Compass_ReadBufferPtr][MPU_SampleNumber], MagnetoY_1s[Compass_ReadBufferPtr][MPU_SampleNumber], MagnetoZ_1s[Compass_ReadBufferPtr][MPU_SampleNumber]); + USB_SendString(buf,strlen(buf)); + } + }*/ + + //Compass_BufferReady[Compass_BufRdPtr] = false; + Compass_BufRdPtr++; + + if(Compass_BufRdPtr > 1) + Compass_BufRdPtr = 0; + + // debug_printf("M%d",Compass_BufRdPtr); + + + } +} + +//------------------------------------------------------------------------------ +// MAIN_BUTTONS +//------------------------------------------------------------------------------ +// This function is called on each iteration of the main loop. It process the +// required actions on the buttons +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void main_buttons(void){ + //char buf[32]; + //uint8_t i; + + switch(ModeButton.RequestedAction){ + case BTN_MARK: + if (isModuleOnline(MODULE_DATALOGGER)/* && Calib_Counter==0*/){ + if (wimu_config.ui.enable_marking){ // Data marking enabled? + if (dos_isRecording) + datalog_save_data((unsigned char*)"Mark OFF\r\n", 10, TRUE, MODULE_CPU,0); + else + datalog_save_data((unsigned char*)"Mark ON\r\n", 9, TRUE, MODULE_CPU,0); + + //DOS_settings.exp_num = 0; + //datalog_change_folder(); + + datalog_switch_recording_mode(); + + if (dos_isRecording) + datalog_save_data((unsigned char*)"Mark ON\r\n", 9, TRUE, MODULE_CPU,0); + else + datalog_save_data((unsigned char*)"Mark OFF\r\n", 10, TRUE, MODULE_CPU,0); + + Buzzer_Start(100); + } + } + ModeButton.RequestedAction = BTN_NO_ACTION; + break; + case BTN_USB_MODE: + // First step is directly managed into the button action since it must occur even if device is in sleep mode + /*if (usb_mode==MASS_STORAGE && Power_GetState()==POWER_STATE_USB_ON){ + USB_ModeSelection(); + init_usb(); + }*/ + if (Power_GetState()==POWER_STATE_USB_MASS){ + USB_SetMode(VIRTUAL_COM); + BatteryMonitoring_Config(); + Power_SetState(POWER_STATE_USB_COM); + }else{ + if (Power_GetState()==POWER_STATE_USB_COM){ + USB_SetMode(MASS_STORAGE); + Power_SetState(POWER_STATE_USB_MASS); + } + } + + + ModeButton.RequestedAction = BTN_NO_ACTION; + break; + case BTN_CALIB: + //IMUStartCalibProcess(); + ModeButton.RequestedAction = BTN_NO_ACTION; + break; + default: + ModeButton.RequestedAction = BTN_NO_ACTION; + break; + } + + switch(PowerButton.RequestedAction){ + case BTN_ON_OFF: + /*//Light all LED + led(LED_RED,TRUE, HIGH_PRIORITY); + led(LED_GREEN,TRUE, HIGH_PRIORITY); + led(LED_BLUE,TRUE, HIGH_PRIORITY); + + Buzzer_Start(200); + + sprintf(buf, "WIMUGPS Off\r\n"); + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)&buf[0],13, TRUE, MODULE_CPU,0); + msWait(200); + }*/ + + if (Power_StateUpdate()){ + Main_ManageNewPowerState(); + } + + //Shutdown every module, except USB and power + /*for (i=0; i0){ + + // Check if we are calibrating + /*if (Calib_Counter>0){ + // We are, so keep min and max values + for (i=0; i<3; i++){ + if isModuleOnline(MODULE_ACC)){ + if (IMUFrame.acc_data[i] < IMUCalib.acc_min[i]) + IMUCalib.acc_min[i] = IMUFrame.acc_data[i]; + if (IMUFrame.acc_data[i] > IMUCalib.acc_max[i]) + IMUCalib.acc_max[i] = IMUFrame.acc_data[i]; + } + + if (isModuleOnline(MODULE_GYRO)){ + if (IMUFrame.gyro_data[i] < IMUCalib.gyro_min[i]) + IMUCalib.gyro_min[i] = IMUFrame.gyro_data[i]; + if (IMUFrame.gyro_data[i] > IMUCalib.gyro_max[i]) + IMUCalib.gyro_max[i] = IMUFrame.gyro_data[i]; + } + + if (isModuleOnline(MODULE_MAGNETO)){ + if (IMUFrame.mag_data[i] < IMUCalib.mag_min[i]) + IMUCalib.mag_min[i] = IMUFrame.mag_data[i]; + if (IMUFrame.mag_data[i] > IMUCalib.mag_max[i] && IMUFrame.mag_data[i]!=0) + IMUCalib.mag_max[i] = IMUFrame.mag_data[i]; + } + + } + }else{ + if(IMUCalib.in_progress==TRUE ){ + IMUCalib.in_progress=FALSE; + //if (i_mod_status[MODULE_MAGNETO]==MODULE_ONLINE){ + // if (IMUFrame.mag_data[0]!=0) + // IMUProcessRawCalibration(&IMUCalib, &IMUFrame); + //} + } + }*/ + + // Calibrate data + IMUFrame_Struct imu; + memcpy(&imu, &IMUFrame, sizeof(IMUFrame_Struct)); + calibrateIMUFrame (&madgwick_Struct, &imu); + MadgwickProcess (&madgwick_Struct); + + // Copy Quaternion from Madwick_Struct to IMU_Frame_Struct (which will be sent) + imu.quaternion[0] = madgwick_Struct.quaternion[0]; + imu.quaternion[1] = madgwick_Struct.quaternion[1]; + imu.quaternion[2] = madgwick_Struct.quaternion[2]; + imu.quaternion[3]= madgwick_Struct.quaternion[3]; + + // Send data + //USB + if (isModuleOnline(MODULE_USB)){ + if (usb_stream_bin==USB_STREAM_FAST){ + USB_SendBinary((unsigned char*)&imu,sizeof(IMUFrame_Struct),MODULE_IMU); + } + } + + //BLE + //Send data to BLE chip + if (isModuleOnline(MODULE_BLE)){ + if (usb_stream_bin==USB_STREAM_OFF){ // Don't use BLE if streaming data on USB + BLE_sendIMUData(&imu); + } + } + + //Datalogger + if (isModuleOnline(MODULE_DATALOGGER)){ + Qua_SampleNumber++; + + memcpy(&Quaternion_1s[0][Qua_SampleNumber-1],&imu.quaternion[0],4); + memcpy(&Quaternion_1s[1][Qua_SampleNumber-1],&imu.quaternion[1],4); + memcpy(&Quaternion_1s[2][Qua_SampleNumber-1],&imu.quaternion[2],4); + memcpy(&Quaternion_1s[3][Qua_SampleNumber-1],&imu.quaternion[3],4); + + if(Qua_SampleNumber == MPU_SamplingFrequency){ + Qua_SampleNumber = 0; + memcpy(&dataQuaternionToWrite, &Quaternion_1s[0], MPU_SamplingFrequency*4); + memcpy(&dataQuaternionToWrite[MPU_SamplingFrequency], &Quaternion_1s[1], MPU_SamplingFrequency*4); + memcpy(&dataQuaternionToWrite[MPU_SamplingFrequency*2], &Quaternion_1s[2], MPU_SamplingFrequency*4); + memcpy(&dataQuaternionToWrite[MPU_SamplingFrequency*3], &Quaternion_1s[3], MPU_SamplingFrequency*4); + datalog_save_data((unsigned char*)&dataQuaternionToWrite,MPU_SamplingFrequency*4*4, TRUE, MODULE_IMU,0/*mag_time[mag_rd_buf_ptr]*/); + } + } + + IMUFrame_Status=0; + IMUFrame.frame_num++; + + }// endif (IMUFrame_Status == IMUFrame_ReadyMask && IMUFrame_ReadyMask>0 + +} + +void Main_Shutdown(InternalModules_ID int_mod){ + + //*** USB MODULE *** + if (int_mod==MODULE_USB || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_USB)!=STATE_DISABLED){ + USB_Stop(); + setModuleState(MODULE_USB, STATE_OFFLINE); + } + } + + //*** DATALOGGER (DOS-ON-CHIP) *** + if (int_mod==MODULE_DATALOGGER || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_DATALOGGER)!=STATE_DISABLED){ + stop_datalogger(); + //setModuleState(MODULE_DATALOGGER, STATE_OFFLINE); + } + } + + //*** POWER MODULE *** + /*if (int_mod==MODULE_POWER || int_mod==MODULE_ALL){ + if (i_mod_status[MODULE_POWER]!=MODULE_DISABLED){ + stop_power(); + i_mod_status[MODULE_POWER]=MODULE_OFFLINE; + } + }*/ + + //*** GPS MODULE *** + if (int_mod==MODULE_GPS || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_GPS)!=STATE_DISABLED){ + GPS_Stop(); + setModuleState(MODULE_GPS, STATE_OFFLINE); + } + } + + //*** ACCELEROMETERS MODULE *** + if (int_mod==MODULE_ACC || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_ACC)!=STATE_DISABLED/*(enabled_i_devices & MODULE_ACC) && ((int_mask & MODULE_ACC))*/){ + MPUCompass_MPUStop(); + MPUCompass_DisablePower(); + setModuleState(MODULE_ACC, STATE_OFFLINE); + } + } + + //*** GYROSCOPE MODULE *** + if (int_mod==MODULE_GYRO || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_GYRO)!=STATE_DISABLED && getModuleState(MODULE_ACC)!=STATE_DISABLED && getModuleState(MODULE_ACC)!=STATE_OFFLINE){ + MPUCompass_MPUStop(); + MPUCompass_DisablePower(); + + } + if (getModuleState(MODULE_GYRO)!=STATE_DISABLED) + setModuleState(MODULE_GYRO, STATE_OFFLINE); + + } + + //*** MAGNETO MODULE *** + if (int_mod==MODULE_MAGNETO || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_MAGNETO)!=STATE_DISABLED){ + MPUCompass_CompassStop(); + MPUCompass_DisablePower(); + setModuleState(MODULE_MAGNETO, STATE_OFFLINE); + } + } + + //*** BLE MODULE *** + if (int_mod==MODULE_BLE || int_mod==MODULE_ALL){ + if (getModuleState(MODULE_BLE)!=STATE_DISABLED){ + stop_ble(); + setModuleState(MODULE_BLE, STATE_OFFLINE); + } + } + + if (int_mod==MODULE_CPU || int_mod==MODULE_ALL){ + __disable_irq(); + BatteryMonitoring_Stop(); + + GPIO_InitTypeDef GPIO_InitStructure; + // Configure all GPIO as analog to reduce current consumption on non used IOs + // Enable GPIOs clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | + RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH | + RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, ENABLE); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All /*- GPIO_Pin_1 - GPIO_Pin_6*/ - GPIO_Pin_7 - GPIO_Pin_8 - GPIO_Pin_9 - GPIO_Pin_13; // Dont touch USB and charge detection + //GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; + //GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_Init(GPIOE, &GPIO_InitStructure); + GPIO_Init(GPIOH, &GPIO_InitStructure); + GPIO_Init(GPIOG, &GPIO_InitStructure); + GPIO_Init(GPIOF, &GPIO_InitStructure); + + + //GPIO_Init(GPIOA, &GPIO_InitStructure); + //GPIO_Init(GPIOB, &GPIO_InitStructure); + + // Disable GPIOs clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |/* RCC_AHBPeriph_GPIOC |*/ + RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH | + RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, DISABLE); + + // Disable PVD + PWR_PVDCmd(DISABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE); + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, DISABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE); + //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, DISABLE); + + // Enable Ultra low power mode + PWR_UltraLowPowerCmd(ENABLE); + LedAndBuzzer_Config(false); + PushButton_Config(); + ChargeStat_Config(); + + // Enable Pushbuttons interrupts - Charge stats modify EXTI interrupts, so before that line, would not be useful... + PushButton_SetInterrupt(&ModeButton, ENABLE); + PushButton_SetInterrupt(&PowerButton, ENABLE); + + __enable_irq(); + + // Keep USB interrupts alive + //USBDetect_Config(); + } +} + +void Main_PowerdownAll(){ + // Cuts power to all sensors, doesn't change any state in the config + // GPS + GPS_SetupPower(); + GPS_DisablePower(); + + // Sensors + MPUCompass_SetupPower(); + MPUCompass_DisablePower(); + + // BLE + BLE_SetupPower(); + BLE_DisablePower(); +} + +void Main_ManageNewPowerState(){ + uint8_t status; + PowerStates last_state = Power_GetLastState(); + + ///////////////////////////// + // New state action + ///////////////////////////// + switch(Power_GetState()){ + ///////////////////////// + case POWER_STATE_ON: + if (Power_IsStopRequired(last_state) || last_state == POWER_STATE_USB_MASS || last_state == POWER_STATE_USB_COM){ + Main_Shutdown(MODULE_ALL); + // Restart every module + Main_Start(); + //last_power_state = last_state; // Restore real last state, since reset will have cleared it to default + } + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"WIMUGPS ON\n\r",12, TRUE, MODULE_CPU,0); + msWait(200); + } + break; + + ///////////////////////// + case POWER_STATE_OFF: + //Light all LED + led(LED_RED,TRUE, HIGH_PRIORITY); + led(LED_GREEN,TRUE, HIGH_PRIORITY); + led(LED_BLUE,TRUE, HIGH_PRIORITY); + + //Buzzer_Start(200); + + msWait(200); + + //Close all LED + led(LED_RED,false, HIGH_PRIORITY); + led(LED_GREEN,false, HIGH_PRIORITY); + led(LED_BLUE,false, HIGH_PRIORITY); + + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"WIMUGPS OFF\r\n",13, TRUE, MODULE_CPU,0); + msWait(200); + } + // Shutdown every module and stops + Main_Stop(true); + + //Light all LED + /*led(LED_RED,TRUE, HIGH_PRIORITY); + led(LED_GREEN,TRUE, HIGH_PRIORITY); + led(LED_BLUE,TRUE, HIGH_PRIORITY);*/ + + //Buzzer_Start(100); + + /*msWait(300); + + //Close all LED + led(LED_RED,false, HIGH_PRIORITY); + led(LED_GREEN,false, HIGH_PRIORITY); + led(LED_BLUE,false, HIGH_PRIORITY);*/ + + break; + + /////////////////////////// + case POWER_STATE_LOWBAT: + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"Low-Battery\r\n",13, TRUE, MODULE_CPU,0); + msWait(200); + } + + // Shutdown every module and stops + Main_Stop(true); + + // Ensure battery monitor is on before managing next state! + BatteryMonitoring_Config(); + break; + //////////////////////////// + case POWER_STATE_USB: + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"USB Connected\r\n",15, TRUE, MODULE_CPU,0); + msWait(200); + } + + // Shutdown every module and stops + Main_Stop(true); + break; + //////////////////////////// + case POWER_STATE_USB_MASS: + if (isModuleOnline(MODULE_DATALOGGER)){ + datalog_save_data((unsigned char*)"USB Mass Storage\r\n",18, TRUE, MODULE_CPU,0); + msWait(200); + } + + if (!Power_IsStopRequired(last_state)){ + // Shutdown every module since they were not already off + for (status=0; status= DOS_MAX_ERRORS) + dos_toomany_errors = TRUE; + + while (status!=0 && count < 3){ + //Do a reset of the datalogger module + //shutdown(MODULE_DATALOGGER,0); + //sleep(1000); + + if (dos_toomany_errors == FALSE){ + DOS_settings.exp_num=0; //Force a folder change + } + + status=reset_datalogger(); + /*if (status==0) + status=start_datalogger();*/ + count++; + } + + if (status!=0){ + error(MODULE_DATALOGGER, status); + return; + } + + setModuleState(MODULE_DATALOGGER, STATE_ONLINE); + if (dos_toomany_errors == TRUE){ + datalog_save_data((unsigned char*)"Datalogger: Too many errors Reset\r\n",35, TRUE, MODULE_CPU,0); + msWait(200); + }else{ + datalog_save_data((unsigned char*)"Datalogger: Folder Change\r\n",27, TRUE, MODULE_CPU,0); + msWait(200); + } + + } +} + +#ifdef USE_FULL_ASSERT +/******************************************************************************* +* Function Name : assert_failed +* Description : Reports the name of the source file and the source line number +* where the assert_param error has occurred. +* Input : - file: pointer to the source file name +* - line: assert_param error line source number +* Output : None +* Return : None +*******************************************************************************/ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while (1) + {} +} +#endif + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/power.c b/Firmware/WIMU3/src/power.c new file mode 100644 index 0000000..a15471b --- /dev/null +++ b/Firmware/WIMU3/src/power.c @@ -0,0 +1,439 @@ +//****************************************************************************** +// WIMUuSD - Power module +// +// Description: This is the module that records internal and external data such +// as VBatt, Temperature and current probe (if present). Unlike +// other module, if the current probe isn't there, data is still +// recorded since it uses a mix of internal and external sensors. +// +// Author: Simon Brière, ing., M. Sc. A. +// Initial Version: August 28th, 2009 +// +// Modifications: +// October 8th, 2009 - Added Stop function +// October 13th, 2009 - Added Power Management function, charger detection pin +// August 13th, 2010 - Added USB Charge detection (according that USB GPIO3 is +// correctly configured) +// November 4th, 2010 - Improved USB Charge dectection by using the RESET pin +// instead of the GPIO3 pin +// March 28th, 2011 - Added Activity Detection Power Management +//****************************************************************************** +#include + +#include "power.h" +#include "datalogger.h" +#include "usb.h" +#include "usb_pwr.h" +#include "battery.h" +#include "buttons.h" +#include "main.h" // For shutdown + +//#include "adc.h" +//#include "usb.h" // for USB charger detection +//#include "fsr.h" // For not seated power management +//#include "activity.h" + +/* +//unsigned short power_data[POWER_BUF_NUM][3][MAX_ADC_FE]; +unsigned short power_data[POWER_BUF_NUM][3*MAX_ADC_FE]; +unsigned long power_time[POWER_BUF_NUM]; +unsigned char power_wr_buf_ptr; +unsigned char power_rd_buf_ptr; +unsigned char power_ptr; + + +bool power_new_value; +bool power_charging; + +unsigned char pow_acc_rd_index; +*/ + +bool power_ready; + +PowerStates power_state; +PowerStates last_power_state; + +bool power_is_charging; +bool power_is_stopped; +bool power_charge_completed; + +// Power Management +//uint16_t Battery_ADCValue; +//uint16_t Temp_ADCValue; + +uint16_t VRefIntCal; +float Temp_Slope; +float Temp_Offset; +//uint16_t TSense_Cal1; +//uint16_t TSense_Cal2; + +//unsigned short power_noact_count; // Number of seconds no activity occured + +//------------------------------------------------------------------------------ +// INIT_POWER +//------------------------------------------------------------------------------ +// Initialization function for the power module. Nothing has to be done, since +// all init is done in the adc module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if initialization was successfully completed +// 0xYY, if initialization wasn't successfucompleted where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef Power_Init(void){ + // Initialize variables + power_ready = false; + power_is_charging = false; + power_charge_completed = false; + last_power_state = POWER_STATE_OFF; + power_state = POWER_STATE_ON; + power_is_stopped=false; + + // Get VrefIntCal value + uint16_t* val = (uint16_t *) 0x1FF800F8; + VRefIntCal = *(val); + + // Get TSense1 & TSense2 values + uint16_t TSense_Cal1; + uint16_t TSense_Cal2; + + val = (uint16_t *) 0x1FF800FA; + TSense_Cal1 = *val; + + val = (uint16_t *) 0x1FF800FE; + TSense_Cal2 = *val; + + Temp_Slope = ((float)TSense_Cal2 - (float)TSense_Cal1) / (110.f-30); // Actual temperature curve for that module + + Temp_Offset = TSense_Cal1 - (Temp_Slope * 30); + + return 0x00; //No error +} + +//------------------------------------------------------------------------------ +// START_POWER +//------------------------------------------------------------------------------ +// Startup function for the power module +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if startup was successfully completed +// 0xYY, if startup wasn't successfully completed and where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef Power_Start(void){ +// Power_StateUpdate(false); + + // Check if we are charging or not... + //ChargeStat_Update(); + return ERROR_NONE; +} +/* +void Power_StateCheck(){ + uint16_t batt_lvl=65535; + + //if (Power_GetState() == POWER_STATE_USB_ON) + // return; // If connected to USB but running, don't check anything. + + // Check in which state we should start in + if (USB_IsConnected()){ + + Power_SetState(POWER_STATE_USB); + + }else{ + // Check if low-batt + BatteryMonitoring_RdADC(&batt_lvl); + if (batt_lvl <= LOWBAT_ADC_THRESHOLD){ + Power_SetState(POWER_STATE_LOWBAT); + }else{ + Power_SetState(POWER_STATE_ON); + } + } +}*/ + +void ChargeStat_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* Enable GPIOx AHB Clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + /* Configure detection pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Connect EXTI Line to INT Pin */ + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1); + + /* Configure EXTI line */ + EXTI_InitStructure.EXTI_Line = EXTI_Line1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + /* Enable and set the EXTI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + ChargeStat_Update(); + +} + +uint8_t ChargeStat_GetState(){ + return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1); +} + +void ChargeStat_Update(){ + if ( ChargeStat_GetState()== POWER_USB_CHARGE_LOGIC){ + //if (!power_charge_completed) // Don't put back into charging mode if already completed without unplugging USB + power_is_charging = true; + }else{ + //Not charging + power_is_charging = false; + power_charge_completed = USB_IsConnected(); // Only set this flag if connected to USB + } + Power_StateDisplay(); // Refresh LED status +} +/* +void ExtPwr_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + // Enable GPIOx AHB Clocks + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + // Configure push button pins + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_Init(GPIOB, &GPIO_InitStructure); + +} + +void ExtPwr_Enable(void) +{ + GPIO_SetBits(GPIOB, GPIO_Pin_9); +} + +void ExtPwr_Disable(void) +{ + GPIO_ResetBits(GPIOB, GPIO_Pin_9); +}*/ + +void Power_StateDisplay(){ + switch (power_state){ + case POWER_STATE_USB: + case POWER_STATE_USB_MASS: + case POWER_STATE_USB_COM: + //case POWER_STATE_USB_ON: + led(LED_RED,FALSE, NO_PRIORITY); + led(LED_GREEN,FALSE, NO_PRIORITY); + if (Power_IsCharging()){ + //led(LED_RED,TRUE); + led_start_blink(LED_BLUE,100,2900, HIGH_PRIORITY); + }else{ + //led(LED_RED,FALSE); + led_stop_blink(LED_BLUE); + } + break; + case POWER_STATE_OFF: + /*if (USB_GetState()==USB_STATE_CONNECTED) + led(LED_BLUE, TRUE); + else*/ + led(LED_BLUE, FALSE, NO_PRIORITY); + if (Power_IsCharging()) + //led(LED_RED, TRUE); + led_start_blink(LED_BLUE,100,2900, HIGH_PRIORITY); + else{ + led_stop_blink(LED_BLUE); + } + led(LED_RED,FALSE, NO_PRIORITY); + led(LED_GREEN,FALSE, NO_PRIORITY); + break; + case POWER_STATE_LOWBAT: + led(LED_BLUE,FALSE, HIGH_PRIORITY); + //led(LED_GREEN,TRUE); + led(LED_GREEN,FALSE, HIGH_PRIORITY); + led_stop_blink(LED_RED); + led_start_blink(LED_RED,50,4950, HIGH_PRIORITY); + break; + case POWER_STATE_ON: + /*led(LED_RED,TRUE); + led(LED_GREEN,TRUE);*/ + led(LED_RED,FALSE, NO_PRIORITY); + led(LED_GREEN,FALSE, NO_PRIORITY); + led(LED_BLUE,FALSE, NO_PRIORITY); + break; + default: + //led(LED_BLUE,FALSE); + break; + } +} + +// Returns true if state was changed from last one +bool Power_StateUpdate(){ + PowerStates last_state = Power_GetState(); + // 1. Check if we need to stop the module + if (PowerButton.RequestedAction==BTN_ON_OFF){ + // Wait for buzzer to end, if needed +// while(Buzzer_State==BUZZER_ON); + PushButton_ResetAll(&PowerButton); + // Switch to OFF mode + if (!Power_IsStopRequired(last_state) || last_state == POWER_STATE_LOWBAT){ + Power_SetState(POWER_STATE_OFF); + return power_state != last_state; + } + + // Switch to ON mode + if (Power_GetState()==POWER_STATE_OFF){ + Power_SetState(POWER_STATE_ON); + return power_state != last_state; + } + } + + // 1B. If "OFF", don't check anything else + if (Power_GetState()==POWER_STATE_OFF) + return false; + + // 2. Check if USB is connected + if (USB_IsConnected()/* && !Power_IsStopRequired(last_state)*/){ + // Check if we are connected to a computer or not + if ((bDeviceState==UNCONNECTED || bDeviceState==ATTACHED) && Power_GetState()!=POWER_STATE_USB_MASS && Power_GetState()!=POWER_STATE_USB_COM){ + // Wait a little more, just in case... + //msWait(700); + msWait(400); + if (bDeviceState==UNCONNECTED || bDeviceState==ATTACHED){ + Power_SetState(POWER_STATE_USB); // Plugged in with a wall charger + return power_state != last_state; + } + } + //} else{ + // Depending on usb mode, set correct state + if (usb_mode==VIRTUAL_COM) + Power_SetState(POWER_STATE_USB_COM); + if (usb_mode==MASS_STORAGE) + Power_SetState(POWER_STATE_USB_MASS); + return power_state != last_state; + //} + } + + // 3. Check for low-battery + if (Power_IsBattLow()){ + Power_SetState(POWER_STATE_LOWBAT); + return power_state != last_state; + } + + // 4. OK, keep module running! + Power_SetState(POWER_STATE_ON); + return power_state != last_state; +} + + +bool Power_IsStopRequired(PowerStates state){ + return (state==POWER_STATE_OFF) || + (state==POWER_STATE_USB) || + (state==POWER_STATE_LOWBAT); +} + + +void Power_SetState(PowerStates new_state){ + if (new_state == power_state) return; + last_power_state = power_state; + power_state = new_state; + + Power_StateDisplay(); + +} + +PowerStates Power_GetState(){ + return power_state; +} + +PowerStates Power_GetLastState(){ + return last_power_state; +} + +bool Power_IsBattLow(){ + //BatteryMonitoring_RdADC(&Battery_ADCValue); // Updated once per second or on demand, but not here! + uint16_t Battery_ADCValue = BatteryMonitoring_GetBatteryADCValue(); + + return (Battery_ADCValue <= LOWBAT_ADC_THRESHOLD) && Battery_ADCValue>0; +} + +bool Power_IsStateUSBRelated(PowerStates state){ + bool rval =(state==POWER_STATE_USB) || + (state==POWER_STATE_USB_MASS) || + (state==POWER_STATE_USB_COM); + return rval; +} + +bool Power_IsInStopMode(){ + /*uint8_t scr = SCB->SCR; + bool rval = (scr & SCB_SCR_SLEEPDEEP) > 0; + return rval;*/ + return power_is_stopped; +} + +void Power_Stop(){ + power_is_stopped=true; + PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); + power_is_stopped=false; +} + +void Power_Sleep(){ + power_is_stopped=true; + PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); + power_is_stopped=false; +} + +bool Power_IsCharging(){ + return power_is_charging; +} + +float Battery_VFromADC(uint16_t batt){ + float voltage = 0; + + voltage = batt * 2.f / 4096.f * 3.3f; + + + //voltage_battery = (3.3/1024.0) * (float)(Battery_ADCValue) / 2.0; // in volts + + return voltage; +} + +float Temp_FromADC(uint16_t temp){ + float temperature; + + temperature = (float)temp * 1.06f; // Convert from 3.3 ADC ref to 3 ADC Ref value + + temperature = (temperature - Temp_Offset) / Temp_Slope; + + return temperature; +} + + +// Charging state changed +void EXTI1_IRQHandler(void) +{ + //char buf[32]; + if(EXTI_GetITStatus(EXTI_Line1) != RESET) + { + ChargeStat_Update(); + // Clear interrupt pending bit + EXTI_ClearITPendingBit(EXTI_Line1); + } + +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/storage.c b/Firmware/WIMU3/src/storage.c new file mode 100644 index 0000000..f0911f4 --- /dev/null +++ b/Firmware/WIMU3/src/storage.c @@ -0,0 +1,185 @@ +/** + ****************************************************************************** + * @file storage.c + * @author MCD Application Team + * @version V1.2.0 + * @date 24-January-2012 + * @brief This file includes the Storage (FatFs) driver for the STM32L152-EVAL + * demo. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * FOR MORE INFORMATION PLEASE READ CAREFULLY THE LICENSE AGREEMENT FILE + * LOCATED IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE. + * + *

      © COPYRIGHT 2012 STMicroelectronics

      + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +//#include "main.h" +#include "Storage.h" + +/** @addtogroup STM32L152_EVAL_Demo + * @{ + */ + +/** @defgroup STORAGE + * @brief This file includes the Storage (FatFs) driver for the STM32L152-EVAL + * demo. + * @{ + */ + +/** @defgroup STORAGE_Private_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup STORAGE_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @defgroup STORAGE_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STORAGE_Private_Variables + * @{ + */ +FATFS fs; +FILINFO fno; +DIR dir; +FIL F_LogFile; +UINT BytesWritten; +UINT BytesRead; +extern const uint8_t SlidesCheck[]; +extern uint8_t Buffer1[]; +/** + * @} + */ + + +/** @defgroup STORAGE_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup STORAGE_Private_Functions + * @{ + */ + +/** + * @brief SDCARD Initialisation for FatFs + * @param None + * @retval err : Error status (0=> success, 1=> fail) + */ +uint32_t Storage_Init(void) +{ + EXTI_InitTypeDef EXTI_InitStructure; + + SD_Init(); + +// SYSCFG_EXTILineConfig(SD_DETECT_EXTI_PORT_SOURCE, SD_DETECT_EXTI_PIN_SOURCE); + + /*!< Configure the SD Card detect Pin as input with interrupt */ +// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; +// EXTI_InitStructure.EXTI_Line = SD_DETECT_EXTI_LINE; +// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; +// EXTI_InitStructure.EXTI_LineCmd = ENABLE; +// EXTI_Init(&EXTI_InitStructure); + + /****************** FatFs Volume Acess ******************************/ + + if (f_mount(0, &fs) == FR_INVALID_DRIVE) + { + return 1; + } + return 0; +} + + + +/** + * @brief Create a file on SD + * @param FileName: the file name to create + * @retval err : Error status (0=> success, 1=> fail) + */ +uint32_t Storage_CreateFile(FIL * F, const char* FileName, char * FileNameWithNumAndExtension) +{ + uint8_t FileName_Length = strlen(FileName); + uint8_t FileName_HundredPos = FileName_Length; + uint8_t FileName_TensPos = FileName_Length + 1; + uint8_t FileName_UnitiesPos = FileName_Length + 2; + char *s_FileName_NumberStart; + FRESULT res; /* FatFs function common result code */ + + // Create file "FileName000.txt" if no "FileNameXXX.txt" files exist. + // Create "FileName(XXX+1).txt" if "FileNameXXX.txt" files exist + strcpy(FileNameWithNumAndExtension, FileName); + strcat(FileNameWithNumAndExtension,"000.txt"); + s_FileName_NumberStart = &FileNameWithNumAndExtension[FileName_Length]; + + + + res = f_open (F, FileNameWithNumAndExtension, FA_CREATE_NEW); + while(res == FR_EXIST || (res != FR_OK && res != FR_DISK_ERR && res != FR_NO_FILESYSTEM && res != FR_NOT_READY && res != FR_NOT_ENABLED && res != FR_INT_ERR && res != FR_DENIED)) + { + if(strcmp(s_FileName_NumberStart,"999.txt") == 0) + { + printf("Error: Reach file %s",FileNameWithNumAndExtension); + } + else if (strcmp(s_FileName_NumberStart + 1,"99.txt") == 0) + { + FileNameWithNumAndExtension[FileName_HundredPos]++; + FileNameWithNumAndExtension[FileName_TensPos] = '0'; + FileNameWithNumAndExtension[FileName_UnitiesPos] = '0'; + } + else if (strcmp(s_FileName_NumberStart + 2,"9.txt") == 0) + { + FileNameWithNumAndExtension[FileName_TensPos]++; + FileNameWithNumAndExtension[FileName_UnitiesPos] = '0'; + } + else + { + FileNameWithNumAndExtension[FileName_UnitiesPos]++; + } + + res = f_open (F, FileNameWithNumAndExtension, FA_CREATE_NEW); + } + + + return 0; + +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/system_stm32l1xx.c b/Firmware/WIMU3/src/system_stm32l1xx.c new file mode 100644 index 0000000..f5cab73 --- /dev/null +++ b/Firmware/WIMU3/src/system_stm32l1xx.c @@ -0,0 +1,533 @@ +/** + ****************************************************************************** + * @file system_stm32l1xx.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32L1xx Ultra + * Low Power devices, and is generated by the clock configuration + * tool "STM32L1xx_Clock_Configuration_V1.1.0.xls". + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * and Divider factors, AHB/APBx prescalers and Flash settings), + * depending on the configuration made in the clock xls tool. + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l1xx_xx.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. + * + * 2. After each device reset the MSI (2.1 MHz Range) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l1xx_xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and MSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 8MHz, refer to "HSE_VALUE" define + * in "stm32l1xx.h" file. When HSE is used as system clock source, directly or + * through PLL, and you are using different crystal you have to adapt the HSE + * value to your own configuration. + * + * 5. This file configures the system clock as follows: + *============================================================================= + * System Clock Configuration + *============================================================================= + * System Clock source | PLL(HSE) + *----------------------------------------------------------------------------- + * SYSCLK | 32000000 Hz + *----------------------------------------------------------------------------- + * HCLK | 32000000 Hz + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * HSE Frequency | 8000000 Hz + *----------------------------------------------------------------------------- + * PLL DIV | 3 + *----------------------------------------------------------------------------- + * PLL MUL | 12 + *----------------------------------------------------------------------------- + * VDD | 3.3 V + *----------------------------------------------------------------------------- + * Vcore | 1.8 V (Range 1) + *----------------------------------------------------------------------------- + * Flash Latency | 1 WS + *----------------------------------------------------------------------------- + * SDIO clock (SDIOCLK) | 48000000 Hz + *----------------------------------------------------------------------------- + * Require 48MHz for USB clock | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l1xx_system + * @{ + */ + +/** @addtogroup STM32L1xx_System_Private_Includes + * @{ + */ + +#include "stm32l1xx.h" + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Defines + * @{ + */ + +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM32L152D_EVAL board as data memory */ +/* #define DATA_IN_ExtSRAM */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Variables + * @{ + */ +uint32_t SystemCoreClock = 32000000; +__I uint8_t PLLMulTable[9] = {3, 4, 6, 8, 12, 16, 24, 32, 48}; +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32L1xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /*!< Set MSION bit */ + RCC->CR |= (uint32_t)0x00000100; + + /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */ + RCC->CFGR &= (uint32_t)0x88FFC00C; + + /*!< Reset HSION, HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xEEFEFFFE; + + /*!< Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ + RCC->CFGR &= (uint32_t)0xFF02FFFF; + + /*!< Disable all interrupts */ + RCC->CIR = 0x00000000; + +#ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM */ + + /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */ + SetSysClock(); + +#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 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 MSI, SystemCoreClock will contain the MSI + * value as defined by the MSI range. + * + * - 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 stm32l1xx.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 stm32l1xx.h file (default value + * 8 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. + * + * - 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, pllmul = 0, plldiv = 0, pllsource = 0, msirange = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; + SystemCoreClock = (32768 * (1 << (msirange + 1))); + break; + case 0x04: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x08: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x0C: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; + pllmul = PLLMulTable[(pllmul >> 18)]; + plldiv = (plldiv >> 22) + 1; + + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + + if (pllsource == 0x00) + { + /* HSI oscillator clock selected as PLL clock entry */ + SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv); + } + else + { + /* HSE selected as PLL clock entry */ + SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv); + } + break; + default: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; + SystemCoreClock = (32768 * (1 << (msirange + 1))); + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @brief Configures the System clock frequency, AHB/APBx prescalers and Flash + * settings. + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ +static void SetSysClock(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Enable 64-bit access */ + FLASH->ACR |= FLASH_ACR_ACC64; + + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTEN; + + /* Flash 1 wait state */ + FLASH->ACR |= FLASH_ACR_LATENCY; + + /* Power enable */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + + /* Select the Voltage Range 1 (1.8 V) */ + PWR->CR = PWR_CR_VOS_0; + + /* Wait Until the Voltage Regulator is ready */ + while((PWR->CSR & PWR_CSR_VOSF) != RESET) + { + } + + /* HCLK = SYSCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; + + /* PCLK1 = HCLK /1*/ + RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; + + /* PLL configuration */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL | + RCC_CFGR_PLLDIV)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL12 | RCC_CFGR_PLLDIV3); + + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)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 */ + } +} + +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in SystemInit() function before jump to main. + * This function configures the external SRAM mounted on STM32L152D_EVAL board + * This SRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ +/*-- GPIOs Configuration -----------------------------------------------------*/ +/* + +-------------------+--------------------+------------------+------------------+ + + SRAM pins assignment + + +-------------------+--------------------+------------------+------------------+ + | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | + | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | + | PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | + | PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | + | PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | + | PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | + | PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 | PF12 <-> FSMC_A6 | PG10<-> FSMC_NE2 | + | PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9 | PF13 <-> FSMC_A7 |------------------+ + | PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10 | PF14 <-> FSMC_A8 | + | PD13 <-> FSMC_A18 | PE14 <-> FSMC_D11 | PF15 <-> FSMC_A9 | + | PD14 <-> FSMC_D0 | PE15 <-> FSMC_D12 |------------------+ + | PD15 <-> FSMC_D1 |--------------------+ + +-------------------+ +*/ + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHBENR = 0x000080D8; + + /* Connect PDx pins to FSMC Alternate function */ + GPIOD->AFR[0] = 0x00CC00CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A0A; + /* Configure PDx pins speed to 40 MHz */ + GPIOD->OSPEEDR = 0xFFFF0F0F; + /* 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 FSMC 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 40 MHz */ + GPIOE->OSPEEDR = 0xFFFFC00F; + /* 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 FSMC 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 40 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 FSMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x00000C00; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00200AAA; + /* Configure PGx pins speed to 40 MHz */ + GPIOG->OSPEEDR = 0x00300FFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FSMC Configuration ------------------------------------------------------*/ + /* Enable the FSMC interface clock */ + RCC->AHBENR = 0x400080D8; + + /* Configure and enable Bank1_SRAM3 */ + FSMC_Bank1->BTCR[4] = 0x00001011; + FSMC_Bank1->BTCR[5] = 0x00000300; + FSMC_Bank1E->BWTR[4] = 0x0FFFFFFF; +/* + Bank1_SRAM3 is configured as follow: + + p.FSMC_AddressSetupTime = 0; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 3; + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); +*/ + +} +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/usb.c b/Firmware/WIMU3/src/usb.c new file mode 100644 index 0000000..b14ca44 --- /dev/null +++ b/Firmware/WIMU3/src/usb.c @@ -0,0 +1,926 @@ +//****************************************************************************** +// WIMUGPS - USB Module +// +// Description: This is the interface to the USB modules. It contains the various +// functions used to interpret commands received on the USB module +// and send back appropriate data to the requests. +// +// Author: Simon Brière, ing., M. Sc. A. +// Initial Version: May 19, 2009 +// +// Modifications: +// July 30th, 2013 - Official conversion for STM32 +//****************************************************************************** + +//#include "msp430x54x.h" +#include "config.h" +#include "usb.h" +#include "utils.h" + +#include "datalogger.h" +#include "flash.h" +#include "power.h" +#include "imu.h" +#include "buttons.h" +//#include "bootload.h" +#include "gps.h" + + +#include "usb_lib.h" +#include "usb_pwr.h" +#include "MS__usb_desc.h" +#include "MS__usb_prop.h" +#include "VC__usb_prop.h" + +#include //for memset and string functions +#include +#include + +unsigned char usb_rx[USB_RX_BUF_NUM][USB_RX_BUFFER]; +unsigned char usb_tx[USB_TX_BUF_NUM][USB_TX_BUFFER]; + +//unsigned short usb_rx_len[USB_RX_BUF_NUM]; +//unsigned short usb_tx_len[USB_TX_BUF_NUM]; + +unsigned char usb_rx_rd_ptr; // Actual RX read index +unsigned char usb_rx_wr_ptr; // Actual RX write index +unsigned char usb_tx_rd_ptr; // Actual TX read index +unsigned char usb_tx_wr_ptr; // Actual TX write index + +unsigned char usb_rx_index; // Actual RX buffer index (write) +unsigned char usb_tx_index; // Actual TX buffer index (write) + +unsigned char usb_rx_queue; // Actual number of unread elements in RX +unsigned char usb_tx_queue; // Actual number of unsent elements in TX + +unsigned short usb_tx_len[USB_TX_BUF_NUM]; + +bool usb_rx_ready; // Set to TRUE when RX data is ready to be processed + +//Streaming settings +//unsigned char usb_stream_acc; +unsigned char usb_stream_gps; +//unsigned char usb_stream_gyro; +//unsigned char usb_stream_mag; +//unsigned char usb_stream_quaternion; +unsigned char usb_stream_power; +//unsigned char usb_stream_time; + +//unsigned char usb_stream_sonars; +//unsigned char usb_stream_encoders; +//unsigned char usb_stream_fsr; +//unsigned char usb_stream_joystick; + +unsigned char usb_stream_bin; +unsigned char usb_datalog; +unsigned char usb_streaming; + +ModuleStates copy_enabled_i_devices; + +ProgramMode usb_mode = UNDEFINED; + +extern PushButton_TypeDef PushButton1; +extern uint8_t Calib_Counter; + +extern WIMU_SETTINGS wimu_settings; // For gains and offset values + +//------------------------------------------------------------------------------ +// INIT_USB +//------------------------------------------------------------------------------ +// Initialization function for the USB module. Currently, USB module is on the +// USCI A3 port configured on UART Mode (see function for details) using CTS/RTS +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if initialization was successfully completed +// 0xYY, if initialization wasn't successfully completed where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef USB_GlobalInit(void){ + + Set_System(); + Set_USBClock(); + if(usb_mode == MASS_STORAGE) + { + MS_Init(); + } + else + { + VC_Init(); + } + + USB_Interrupts_Config(); + USB_Init(); + + // Variables initialization + ////////////////////////// + usb_rx_rd_ptr = 0; + usb_rx_wr_ptr = 0; + usb_tx_rd_ptr = 0; + usb_tx_wr_ptr = 0; + usb_rx_index = 0; + usb_tx_index = 0; + + usb_rx_queue = 0; + usb_tx_queue = 0; + + USB_StopAllStreams(); + usb_datalog= USB_STREAM_FAST; + + usb_rx_ready = FALSE; + usb_streaming = 0; + + memset(&usb_rx,0,USB_RX_BUFFER*USB_RX_BUF_NUM); + memset(&usb_tx,0,USB_TX_BUFFER*USB_TX_BUF_NUM); + //memset(&usb_rx_len,0,USB_RX_BUFFER*sizeof(short)); + memset(&usb_tx_len,0,USB_TX_BUF_NUM*sizeof(short)); + + return ERROR_NONE; +} + +//------------------------------------------------------------------------------ +// START_USB +//------------------------------------------------------------------------------ +// Startup function for the USB module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (Unsigned Char): +// 0x00, if startup was successfully completed +// 0xYY, if startup wasn't successfully completed and where YY=error code +//------------------------------------------------------------------------------ +Error_TypeDef USB_Start(void){ + + // Interrupt enable + /////////////////// + //UCA3IFG |= UCTXIFG; + //UCA3IE |= UCRXIE + UCTXIE; + + return ERROR_NONE; +} + +//------------------------------------------------------------------------------ +// STOP_USB +//------------------------------------------------------------------------------ +// Stop function for the USB module. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void USB_Stop(void){ + PowerOff(); +} + +void USB_StopAllStreams(){ + /*usb_stream_acc = USB_STREAM_OFF; + usb_stream_gyro = USB_STREAM_OFF; + usb_stream_mag = USB_STREAM_OFF;*/ + usb_stream_gps = USB_STREAM_OFF; + //usb_stream_quaternion = USB_STREAM_OFF; + usb_stream_power = USB_STREAM_OFF; + //usb_stream_time= USB_STREAM_OFF; + + /*usb_stream_sonars = USB_STREAM_OFF; + usb_stream_encoders = USB_STREAM_OFF; + usb_stream_fsr = USB_STREAM_OFF; + usb_stream_joystick = USB_STREAM_OFF;*/ + + usb_stream_bin= USB_STREAM_OFF; +} + +//------------------------------------------------------------------------------ +// PROCESS_USB_RX +//------------------------------------------------------------------------------ +// Process the last received USB command and execute appropriate tasks according +// to it. +//------------------------------------------------------------------------------ +// Parameters: +// None - it will automatically use the actual RX read buffer as defined by +// usb_rx_rd_ptr; +// +// Return value (Unsigned Char): +// 0x00, if command was correct +// 0xYY, if command is unknown or malformed +//------------------------------------------------------------------------------ +Error_TypeDef USB_ProcessRX(void){ + unsigned char rval = ERROR_UNMANAGED; + char buf[64]; //char buffer + uint32_t crc; + uint32_t received_crc; + uint64_t received_time; + + // If binary streaming, abort + if (usb_stream_bin==USB_STREAM_FAST){ + usb_stream_bin = USB_STREAM_OFF; + rval = ERROR_NONE; + } + + // Check if first character is \n or \r. If so, we shift the received buffer as this + // depends on the host sequence (\n, \n\r, \r, \r\n) + if (usb_rx[usb_rx_rd_ptr][0]=='\n' || usb_rx[usb_rx_rd_ptr][0]=='\r'){ + memcpy(&usb_rx[usb_rx_rd_ptr][0],(void*)&usb_rx[usb_rx_rd_ptr][1],USB_RX_BUFFER-1); + rval = ERROR_NONE; // Set in case this is the only good character in the stream + } + + //Status command + //////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"status",6)==0){ + + USB_SendString("OK\n\r",4); + //TODO: Send system status + rval=ERROR_NONE; + } + + //Version command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"version",7)==0){ + USB_SendString(VERSION_STRING,31); + rval=ERROR_NONE; + } + + //ACC command + ///////////////// + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"acc",3)==0){ + //Display values of accelerometer channels + /*if (usb_stream_acc != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_acc=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_acc=USB_STREAM_SLOW; + }*/ + if (getModuleState(MODULE_ACC)!=STATE_DISABLED){ + USB_SendString("Accelero ENABLED\n\r",18); + }else{ + USB_SendString("Accelero DISABLED\n\r",19); + } + rval=ERROR_NONE; + } + + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"facc",4)==0){ + //Display values of accelerometer channels + if (usb_stream_acc != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_acc=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_acc=USB_STREAM_FAST; + } + rval=ERROR_NONE; + }*/ + + //GYRO command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"gyro",4)==0){ + //Display values of gyro channels + /*if (usb_stream_gyro != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_gyro=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_gyro=USB_STREAM_SLOW; + }*/ + if (getModuleState(MODULE_GYRO)!=STATE_DISABLED){ + USB_SendString("Gyro ENABLED\n\r",14); + }else{ + USB_SendString("Gyro DISABLED\n\r",15); + } + rval=ERROR_NONE; + } + + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"fgyro",5)==0){ + //Display values of gyro channels + if (usb_stream_gyro != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_gyro=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_gyro=USB_STREAM_FAST; + } + rval=ERROR_NONE; + }*/ + + //MAGNETO command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"mag",3)==0){ + //Display values of magneto channels + /*if (usb_stream_mag != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_mag=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_mag=USB_STREAM_SLOW; + }*/ + if (getModuleState(MODULE_MAGNETO)!=STATE_DISABLED){ + USB_SendString("Magneto ENABLED\n\r",17); + }else{ + USB_SendString("Magneto DISABLED\n\r",18); + } + rval=ERROR_NONE; + } + + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"fmag",4)==0){ + //Display values of magneto channels + if (usb_stream_mag != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_mag=USB_STREAM_OFF; + + }else{ + USB_SendString(" X Y Z\n\r",15); + usb_stream_mag=USB_STREAM_FAST; + } + rval=ERROR_NONE; + }*/ + + //IMU command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"imu",3)==0){ + //Display values of gyro channels + /*if (usb_stream_quaternion != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_quaternion=USB_STREAM_OFF; + + }else{ + USB_SendString(" q0 q1 q2 q3\n\r",23); + usb_stream_quaternion=USB_STREAM_FAST; + }*/ + if (getModuleState(MODULE_IMU)!=STATE_DISABLED){ + USB_SendString("IMU ENABLED\n\r",13); + }else{ + USB_SendString("IMU DISABLED\n\r",14); + } + rval=ERROR_NONE; + } + + //BLE command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"ble",3)==0){ + //Display values of gyro channels + /*if (usb_stream_quaternion != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_quaternion=USB_STREAM_OFF; + + }else{ + USB_SendString(" q0 q1 q2 q3\n\r",23); + usb_stream_quaternion=USB_STREAM_FAST; + }*/ + if (getModuleState(MODULE_IMU)!=STATE_DISABLED){ + USB_SendString("BLE ENABLED\n\r",13); + }else{ + USB_SendString("BLE DISABLED\n\r",14); + } + rval=ERROR_NONE; + } + + //Power command + ///////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"power",5)==0){ + //Display values of power channels + if (usb_stream_power != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_power=USB_STREAM_OFF; + + }else{ + USB_SendString(" V T\n\r",20); + usb_stream_power=USB_STREAM_SLOW; + } + rval=ERROR_NONE; + } + + //GPS command + ///////////////// + //if ((short)(enabled_i_devices & MODULE_GPS)>0){ + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"gps",3)==0){ + #if GPS_MODE==GPS_NMEA + //Display values of accelerometer channels + if (usb_stream_gps != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_gps=USB_STREAM_OFF; + + }else{ + USB_SendString("GPS Values\n\r",17); + usb_stream_gps=USB_STREAM_FAST; + } + rval=ERROR_NONE; + #else + if (getModuleState(MODULE_GPS)!=STATE_DISABLED){ + USB_SendString("GPS ENABLED\n\r",13); + }else{ + USB_SendString("GPS DISABLED\n\r",14); + } + #endif + rval=ERROR_NONE; + } + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"bin",3)==0){ + //Stream USB raw data + if (usb_stream_bin == USB_STREAM_OFF){ + /*if (isModuleOnline(MODULE_DATALOGGER)) + stop_datalogger();*/ + + usb_stream_bin=USB_STREAM_FAST; + } + rval=ERROR_NONE; + } + + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"sbin",4)==0){ + if (usb_stream_bin != USB_STREAM_OFF){ + usb_stream_bin=USB_STREAM_OFF; + if (getModuleState(MODULE_DATALOGGER)==STATE_OFFLINE) + start_datalogger(); + } + rval=ERROR_NONE; + }*/ + + // Datalogger control + ///////////////////// + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"log",3)==0){ + //Stop/Start datalogger + if (usb_datalog != USB_STREAM_OFF){ + copy_enabled_i_devices = getModuleState(MODULE_DATALOGGER);//enabled_i_devices; // Copy actual internal devices setup + //enabled_i_devices &= ~(MODULE_DATALOGGER); // Disable Datalogger if enabled + setModuleState(MODULE_DATALOGGER, STATE_TEMPOFF); + USB_SendString("LOG OFF\n\r",9); + usb_datalog = USB_STREAM_OFF; + + }else{ + //enabled_i_devices = copy_enabled_i_devices; // Restore previous internal config (to reactivate Datalogger) + setModuleState(MODULE_DATALOGGER, copy_enabled_i_devices); + USB_SendString("LOG ON\n\r",8); + usb_datalog = USB_STREAM_FAST; + } + rval=ERROR_NONE; + }*/ + + // Log Mark + /////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"mark",4)==0){ + // Save data in the LOG file + if (usb_rx[usb_rx_rd_ptr][4] != ' '){ //Incorrect format + rval=ERROR_FORMAT; + }else{ + sprintf(buf, "%s\r\n",&usb_rx[usb_rx_rd_ptr][0]); + if (isModuleOnline(MODULE_DATALOGGER)) + datalog_save_data((unsigned char*)&buf[4],strlen(buf)-4, TRUE, MODULE_CPU,0); + rval = ERROR_NONE; + } + } + + // Module serial number (ID) + ///////////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"id",2)==0){ + //usb_send_string(ID_STRING,6); + sprintf(buf, "%x\r\n",wimu_settings.id); + USB_SendString(buf,strlen(buf)); + rval = ERROR_NONE; + } + + // Flash writing interface + //////////////////// + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"getset",6)==0){ + //Reply with settings structure + //wimu_settings.crc = crc_calc((unsigned short*)&wimu_settings, (sizeof(wimu_settings)-2)/2); + //wimu_settings.crc = crc_calc((unsigned char*)&wimu_settings, (sizeof(wimu_settings)-2)); + + USB_SendBinary((unsigned char*)&wimu_settings, sizeof(wimu_settings), MODULE_CPU); + + rval = ERROR_NONE; + } + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"getconf",7)==0){ + //Reply with settings structure + //wimu_settings.crc = crc_calc((unsigned short*)&wimu_settings, (sizeof(wimu_settings)-2)/2); + //wimu_settings.crc = crc_calc((unsigned char*)&wimu_settings, (sizeof(wimu_settings)-2)); + + USB_SendBinary((unsigned char*)&wimu_config, sizeof(wimu_config), MODULE_CPU); + + rval = ERROR_NONE; + } + + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"setset",6)==0){ + // Compute and check CRC value + crc = crc_calc((unsigned char*)&usb_rx[usb_rx_rd_ptr][6], (sizeof(wimu_settings)-4)); + received_crc = (usb_rx[usb_rx_rd_ptr][sizeof(wimu_settings)]) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][1+sizeof(wimu_settings)])<<8) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][2+sizeof(wimu_settings)])<<16) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][3+sizeof(wimu_settings)])<<24); + // Check if CRC is valid + if (crc == received_crc || received_crc==0xffffffff){ + // Write received data into settings structure + // *** It is assumed that the incoming data is structured accordingly to WIMU_SETTINGS structure + //wimu_settings = *((WIMU_SETTINGS*)(&(usb_rx[usb_rx_rd_ptr][7]))); + memcpy(&wimu_settings,&usb_rx[usb_rx_rd_ptr][6],sizeof(WIMU_SETTINGS)); + + // Recompute CRC if needed + if (received_crc==0xffffffff) + wimu_settings.crc = crc; + + //CRC OK, save data + flash_write_settings(&wimu_settings); + + // Overwrite software information + wimu_settings.version[0] = VERSION_MAJOR; + wimu_settings.version[1] = VERSION_MINOR; + wimu_settings.version[2] = VERSION_REV; + + //Send confirmation + USB_SendString("OK\n\r",4); + + rval = ERROR_NONE; + }else{ + //CRC not OK, send error message + rval = ERROR_CRC; + } + + + } + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"setconf",7)==0){ + rval = sizeof(wimu_config); + // Compute and check CRC value + //crc = crc_calc((unsigned char*)&usb_rx[usb_rx_rd_ptr][8], (sizeof(wimu_config)-4)); + + // Check if CRC is valid + //if (crc == (usb_rx[usb_rx_rd_ptr][6+sizeof(wimu_config)])+(((unsigned short)usb_rx[usb_rx_rd_ptr][7+sizeof(wimu_config)])<<8)){ + + crc = crc_calc((unsigned char*)&usb_rx[usb_rx_rd_ptr][7], (sizeof(wimu_config)-4)); + received_crc = (usb_rx[usb_rx_rd_ptr][1+sizeof(wimu_config)]) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][2+sizeof(wimu_config)])<<8) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][3+sizeof(wimu_config)])<<16) + + (((uint32_t)usb_rx[usb_rx_rd_ptr][4+sizeof(wimu_config)])<<24); + // Check if CRC is valid + if (crc == received_crc || received_crc==0xffffffff){ + // Write received data into config structure + // *** It is assumed that the incoming data is structured accordingly to WIMU_CONFIG structure + //wimu_config = *((WIMU_CONFIG*)(&usb_rx[usb_rx_rd_ptr][7])); + memcpy(&wimu_config,&usb_rx[usb_rx_rd_ptr][7],sizeof(WIMU_CONFIG)); + + // Recompute CRC if needed + if (received_crc==0xffffffff) + wimu_config.crc = crc; + + //CRC OK, save data + flash_write_config(&wimu_config); + + //TODO: Reboot?? + + //Send confirmation + USB_SendString("OK\n\r",4); + + rval = ERROR_NONE; + }else{ + //CRC not OK, send error message + rval = ERROR_CRC; + } + + + } + + // Utilities + //////////////////// + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"reboot",6)==0){ + //Reboot the module + NVIC_SystemReset(); + } + + // Time + /////////////////// + + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"timeset",7)==0){ + // Copy data to buffer + for (crc = 8; crc < USB_RX_BUFFER; crc++){ + if (usb_rx[usb_rx_rd_ptr][crc]=='\n' || usb_rx[usb_rx_rd_ptr][crc]=='\r') + break; // We found the end of the parameters + } + if (crc==USB_RX_BUFFER){ + rval = ERROR_FORMAT; + }else{ + // Copy string to buffer + memcpy(&buf[0], &usb_rx[usb_rx_rd_ptr][8], crc-7); + // Convert to value + received_time = atoll(&buf[0]) - wimu_config.datetime.time_offset * 3600; // Time should be in local format - ignore time_offset + update_RTCtimeFromTimestamp(received_time); + + + //Send confirmation + USB_SendString("OK\n\r",4); + } + + //&usb_rx[usb_rx_rd_ptr][0] + // + rval=ERROR_NONE; + }else{ + if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"time",4)==0){ + /*if (usb_stream_time != USB_STREAM_OFF){ + USB_SendString("*************\n\r",15); + usb_stream_time=USB_STREAM_OFF; + + }else{ + USB_SendString("System Time\n\r",13); + usb_stream_time=USB_STREAM_SLOW; + }*/ + sprintf(buf, "%ld\n\r", timestamp); + USB_SendString(buf,strlen(buf)); + rval=ERROR_NONE; + } + } + + + //Sensors Calibration + /*if (strncmp((const char*)&usb_rx[usb_rx_rd_ptr][0],"calib",5)==0){ + //ModeButton.RequestedAction = BTN_CALIB; + rval = ERROR_NONE; + }*/ + + //Unknown command + ///////////////// + if (rval != ERROR_NONE){ + //Command not found + USB_SendString("ERROR\n\r",7); + } + + //Check if doing any streaming at all + usb_streaming = /*usb_stream_acc +*/ usb_stream_gps + /*usb_stream_gyro + usb_stream_mag +*/ usb_stream_power + + /*usb_stream_sonars + usb_stream_encoders + usb_stream_fsr + usb_stream_joystick +*/ + /*usb_stream_time +*/ usb_stream_bin; + + if (++usb_rx_rd_ptr >= USB_RX_BUF_NUM) // At the end of the buffers? + usb_rx_rd_ptr=0; + + usb_rx_queue--; + + return rval; +} + +//------------------------------------------------------------------------------ +// USB_SEND_STRING +//------------------------------------------------------------------------------ +// Add a string to the TX buffer and starts the transfer process +//------------------------------------------------------------------------------ +// Parameters: +// msg - a pointer to the start of the character string to transfer. This pointer +// doesn't need to still be valid after the execution of this function, since +// it will copy the string into a transmit buffer. +// len - the length of the string to send +// +// Return value (Unsigned Char): +// 0x00, if everything went ok +// 0x01, if string is too long +// 0x02, if transmit buffer are full +//------------------------------------------------------------------------------ +Error_TypeDef USB_SendString(char* msg, unsigned short len){ + + //Check if length is <= TX buffer size + if (len>USB_TX_BUFFER){ + return ERROR_BUFFER; + } + + //Check if buffers are full + if (usb_tx_queue>USB_TX_BUF_NUM){ + // Wait for buffers to be free + return ERROR_BUFFER; + } + + //Copy the bytes into the actual transmit buffer + memcpy(&usb_tx[usb_tx_wr_ptr][0], msg, len); + + //Set the message length + usb_tx_len[usb_tx_wr_ptr]=len; + + //Increments buffer ptr + usb_tx_wr_ptr++; + if (usb_tx_wr_ptr >= USB_TX_BUF_NUM){ + usb_tx_wr_ptr=0; + } + + // ***The SOF_Callback() (usb_endp.c) is call every 5 ms to start VC transfer + + usb_tx_queue++; + + + return ERROR_NONE; //All is well! +} + +//------------------------------------------------------------------------------ +// USB_SEND_BINARY +//------------------------------------------------------------------------------ +// Add binary data to the TX buffer and starts the transfer process +//------------------------------------------------------------------------------ +// Parameters: +// msg - a pointer to the start of data to transfer. This pointer +// doesn't need to still be valid after the execution of this function, since +// it will copy the string into a transmit buffer. +// len - the length of the data to send +// module - the module sending the data (see constants definition in usb.h) +// +// Return value (Unsigned Char): +// 0x00, if everything went ok +// 0x01, if string is too long +// 0x02, if transmit buffer are full +//------------------------------------------------------------------------------ +Error_TypeDef USB_SendBinary(unsigned char* msg, unsigned char len, unsigned char module){ + + //Check if length is <= TX buffer size + if (len+4>USB_TX_BUFFER){ + return ERROR_BUFFER; + } + + //Check if buffers are full + if (usb_tx_queue>USB_TX_BUF_NUM){ + //All buffers are full, stop streaming + /*USB_StopAllStreams(); + usb_tx_queue=0; + return ERROR_BUFFER;*/ + // Wait for buffers to be free + while (usb_tx_queue>USB_TX_BUF_NUM && USB_IsConnected()); + + } + + //Copy the bytes into the actual transmit buffer + + // Sync byte + usb_tx[usb_tx_wr_ptr][0] = SYNC_BYTE; + usb_tx[usb_tx_wr_ptr][1] = SYNC_BYTE; + // Module + usb_tx[usb_tx_wr_ptr][2] = module; + // Length + usb_tx[usb_tx_wr_ptr][3] = len; + //Data + memcpy(&usb_tx[usb_tx_wr_ptr][4], msg, len); + + //Set the message length + usb_tx_len[usb_tx_wr_ptr]=len+4; + + //Increments buffer ptr + usb_tx_wr_ptr++; + if (usb_tx_wr_ptr >= USB_TX_BUF_NUM){ + usb_tx_wr_ptr=0; + } + + // ***The SOF_Callback() (usb_endp.c) is call every 5 ms to start VC transfer + + usb_tx_queue++; + + return ERROR_NONE; //All is well! +} + +//------------------------------------------------------------------------------ +// USB_SEND_CHAR +//------------------------------------------------------------------------------ +// Add a char to the TX buffer and starts the transfer process +//------------------------------------------------------------------------------ +// Parameters: +// char, the character to send +// +// Return value (Unsigned Char): +// 0x00, if everything went ok +// 0x02, if transmit buffer are full +//------------------------------------------------------------------------------ +Error_TypeDef USB_SendChar(char chr){ + + //Check if buffers are full + if (usb_tx_queue>USB_TX_BUF_NUM){ + // Wait for buffers to be free + while (usb_tx_queue>USB_TX_BUF_NUM && USB_IsConnected()); + } + + //Copy the bytes into the actual transmit buffer + usb_tx[usb_tx_wr_ptr][0]=chr; + + //Set the message length + usb_tx_len[usb_tx_wr_ptr]=1; + + //Increments buffer ptr + usb_tx_wr_ptr++; + if (usb_tx_wr_ptr >= USB_TX_BUF_NUM){ + usb_tx_wr_ptr=0; + } + + // ***The SOF_Callback() (usb_endp.c) is call every 5 ms to start VC transfer + usb_tx_queue++; + + return ERROR_NONE; +} + +void USB_SetMode(ProgramMode mode){ + usb_mode = mode; + + PowerOff(); // Disable USB for now + msWait(100); + USB_GlobalInit(); +} + +void USBDetect_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + +/* Enable and set the EXTI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; // In case it was already enabled + NVIC_Init(&NVIC_InitStructure); + + // Enable GPIOx AHB Clocks + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + + // Configure pins + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOC, &GPIO_InitStructure); + +/* Connect EXTI Line to INT Pin */ + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13); + + /* Configure EXTI line */ + EXTI_InitStructure.EXTI_Line = EXTI_Line13; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + /* Enable and set the EXTI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + +} + + +/*uint8_t USBDetect_StateChanged(uint8_t * NewState) +{ + *NewState = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); + + if(*NewState != USBDetect_CurrentState) + { + USBDetect_CurrentState = *NewState; + return 1; + } + else + { + return 0; + } +}*/ + +uint8_t USB_GetState(){ + return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); +} + +bool USB_IsConnected(){ + return USB_GetState()==USB_STATE_CONNECTED; +} + +void EXTI15_10_IRQHandler(void) +{ + //char buf[32]; + //PushButtonState_TypeDef btn_state; + if(EXTI_GetITStatus(EXTI_Line13) != RESET) + { + if (USB_GetState()==USB_STATE_CONNECTED){ + //USB cable connected + //if (Power_GetState()!=POWER_STATE_USB_ON && Power_GetState() !=POWER_STATE_OFF){ + //Power_SetState(POWER_STATE_USB); + /*}else + Power_StateDisplay();*/ + + // Require a new time sync when connected + time_sync = 0; + + }else{ + // Disconnected - exit USB mode + //led(LED_BLUE,FALSE); + usb_mode = MASS_STORAGE; // Reset mode + //PowerOff(); + //init_usb(); + + /*if (Power_GetState() == POWER_STATE_USB || Power_GetState() == POWER_STATE_USB_ON || Power_GetState() == POWER_STATE_LOWBAT){ + if (Power_GetLastState()!=POWER_STATE_OFF)*/ + //Power_SetState(POWER_STATE_ON); + /*else{ + Power_SetState(POWER_STATE_OFF); + } + }else{ + Power_StateDisplay(); + } + */ + } + + EXTI_ClearITPendingBit(EXTI_Line13); + } +} diff --git a/Firmware/WIMU3/src/usb_endp.c b/Firmware/WIMU3/src/usb_endp.c new file mode 100644 index 0000000..0fa3c07 --- /dev/null +++ b/Firmware/WIMU3/src/usb_endp.c @@ -0,0 +1,263 @@ +/** + ****************************************************************************** + * @file usb_endp.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Endpoint routines + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "usb_lib.h" +#include "usb_istr.h" +#include +#include "MS__usb_bot.h" +#include "VC__usb_desc.h" +#include "usb_mem.h" +#include "Merged__hw_config.h" +#include "usb_pwr.h" +#include "usb.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + + +/* Interval between sending IN packets in frame number (1 frame = 1ms) */ +#define VCOMPORT_IN_FRAME_INTERVAL 5 + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +extern uint8_t USB_Tx_State; +extern unsigned char usb_tx_rd_ptr; // Actual TX read index +extern unsigned char usb_rx_wr_ptr; // Actual RX write index +extern unsigned char usb_rx_index; // Actual RX buffer index (write) +extern unsigned char usb_tx_index; // Actual TX buffer index (write) +extern unsigned char usb_rx_queue; // Actual number of unread elements in RX +extern unsigned char usb_tx_queue; // Actual number of unsent elements in TX + +extern unsigned short usb_tx_len[USB_TX_BUF_NUM]; + + +//extern enum {VIRTUAL_COM, MASS_STORAGE} ProgramMode; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : EP1_IN_Callback +* Description : EP1 IN Callback Routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void EP1_IN_Callback(void) +{ + uint16_t USB_Tx_Length; + if(usb_mode == MASS_STORAGE) + { + Mass_Storage_In(); + } + else + { + // Continue the buffer transmission + if (USB_Tx_State == 1) + { + if (usb_tx_len[usb_tx_rd_ptr] - usb_tx_index > VIRTUAL_COM_PORT_DATA_SIZE) + { + USB_Tx_Length = VIRTUAL_COM_PORT_DATA_SIZE; + + UserToPMABufferCopy(&usb_tx[usb_tx_rd_ptr][usb_tx_index], VC__ENDP1_TXADDR, USB_Tx_Length); + SetEPTxCount(ENDP1, USB_Tx_Length); + SetEPTxValid(ENDP1); + + usb_tx_index += VIRTUAL_COM_PORT_DATA_SIZE; + USB_Tx_State = 1; + } + // The remaining buffer data fit in one VC transaction + else + { + USB_Tx_Length = usb_tx_len[usb_tx_rd_ptr]-usb_tx_index; + if (USB_Tx_Length > VIRTUAL_COM_PORT_DATA_SIZE){ + //This can happen when com port opens / closes and usb_tx_index isn't correctly setted + USB_Tx_Length = usb_tx_len[usb_tx_rd_ptr]; + } + usb_tx_queue--; + + + UserToPMABufferCopy(&usb_tx[usb_tx_rd_ptr][usb_tx_index], VC__ENDP1_TXADDR, USB_Tx_Length); + SetEPTxCount(ENDP1, USB_Tx_Length); + SetEPTxValid(ENDP1); + + usb_tx_rd_ptr++; + if (usb_tx_rd_ptr >= USB_TX_BUF_NUM) + usb_tx_rd_ptr = 0; + + usb_tx_index = 0; + USB_Tx_State = 0; + } + + } + } +} + +/******************************************************************************* +* Function Name : EP2_OUT_Callback. +* Description : EP2 OUT Callback Routine. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void EP2_OUT_Callback(void) +{ + Mass_Storage_Out(); +} + +/******************************************************************************* + * Function Name : EP3_OUT_Callback + * Description : + * Input : None. + * Output : None. + * Return : None. + *******************************************************************************/ +void EP3_OUT_Callback(void) +{ + static uint16_t USB_Rx_Cnt, LoopIndex; + static uint8_t USB_Rx_Buffer[VIRTUAL_COM_PORT_DATA_SIZE]; + bool stop = false; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer); + + + for(LoopIndex = 0; LoopIndex < USB_Rx_Cnt; LoopIndex++) + { + usb_rx[usb_rx_wr_ptr][usb_rx_index++] = USB_Rx_Buffer[LoopIndex]; + + // Look for command end character + if (USB_Rx_Buffer[LoopIndex] == '\r' || USB_Rx_Buffer[LoopIndex] == '\n') + { + //For "set" commands, ignore end of line character if length not good + if (usb_rx[usb_rx_wr_ptr][0]=='s' &&usb_rx[usb_rx_wr_ptr][1]=='e' && usb_rx[usb_rx_wr_ptr][2]=='t') + { + //We have a set command + if (usb_rx[usb_rx_wr_ptr][3]=='s') + { + //Settings + if (usb_rx_index>=sizeof(WIMU_SETTINGS)+6) //6 = len(setset) + { + //we must stop... + //usb_rx_index=USB_RX_BUFFER+1; + stop = true; + } + } + if (usb_rx[usb_rx_wr_ptr][3]=='c') + { + //Config + if (usb_rx_index>=sizeof(WIMU_CONFIG)+7) //7 = len(setconf) + { + //we must stop... + //usb_rx_index=USB_RX_BUFFER+1; + stop = true; + } + } + + } + else + { + //we must stop... + // usb_rx_index=USB_RX_BUFFER+1; + stop = true; + } + } + + if (usb_rx_index>USB_RX_BUFFER || stop) + { + //usb_rx_len[usb_rx_wr_ptr]=usb_rx_index; + + if (!usb_rx_ready){ + if (usb_streaming==0){ //Echo character only if not streaming + //USB_SendString("\n\r",2); //TODO: disable if streaming binary not commands + if (usb_rx_index= USB_RX_BUF_NUM) // All buffers were used + usb_rx_wr_ptr = 0; + + + usb_rx_ready=TRUE; + } + else + { + /*if (usb_streaming==0){ //Echo character only if not streaming + if (usb_tx_queue
      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "usb_type.h" +#include "usb_regs.h" +#include "usb_pwr.h" +#include "usb_istr.h" +#include "usb_init.h" +#include "usb_int.h" +#include "usb_lib.h" +#include "MS__usb_prop.h" +#include "VC__usb_prop.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint16_t wIstr; /* ISTR register last read value */ +__IO uint8_t bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */ + +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* function pointers to non-control endpoints service routines */ +void (*pEpInt_IN[7])(void) = + { + EP1_IN_Callback, + EP2_IN_Callback, + EP3_IN_Callback, + EP4_IN_Callback, + EP5_IN_Callback, + EP6_IN_Callback, + EP7_IN_Callback, + }; + +void (*pEpInt_OUT[7])(void) = + { + EP1_OUT_Callback, + EP2_OUT_Callback, + EP3_OUT_Callback, + EP4_OUT_Callback, + EP5_OUT_Callback, + EP6_OUT_Callback, + EP7_OUT_Callback, + }; + + +/******************************************************************************* +* Function Name : USB_Istr +* Description : ISTR events interrupt service routine +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void USB_Istr(void) +{ + + wIstr = _GetISTR(); + +#if (_IMR_MSK & ISTR_CTR) + if (wIstr & ISTR_CTR & wInterrupt_Mask) + { + /* servicing of the endpoint correct transfer interrupt */ + /* clear of the CTR flag into the sub */ + CTR_LP(); +#ifdef CTR_CALLBACK + CTR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_RESET) + if (wIstr & ISTR_RESET & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_RESET); + Device_Property.Reset(); +#ifdef RESET_CALLBACK + RESET_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_DOVR) + if (wIstr & ISTR_DOVR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_DOVR); +#ifdef DOVR_CALLBACK + DOVR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_ERR) + if (wIstr & ISTR_ERR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_ERR); +#ifdef ERR_CALLBACK + ERR_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_WKUP) + if (wIstr & ISTR_WKUP & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_WKUP); + Resume(RESUME_EXTERNAL); +#ifdef WKUP_CALLBACK + WKUP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_SUSP) + if (wIstr & ISTR_SUSP & wInterrupt_Mask) + { + + /* check if SUSPEND is possible */ + if (fSuspendEnabled) + { + Suspend(); + } + else + { + /* if not possible then resume after xx ms */ + Resume(RESUME_LATER); + } + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + _SetISTR((uint16_t)CLR_SUSP); +#ifdef SUSP_CALLBACK + SUSP_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_SOF) + if (wIstr & ISTR_SOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_SOF); + bIntPackSOF++; + +#ifdef SOF_CALLBACK + SOF_Callback(); +#endif + } +#endif + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ +#if (_IMR_MSK & ISTR_ESOF) + if (wIstr & ISTR_ESOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_ESOF); + /* resume handling timing is made with ESOFs */ + Resume(RESUME_ESOF); /* request without change of the machine state */ + +#ifdef ESOF_CALLBACK + ESOF_Callback(); +#endif + } +#endif +} /* USB_Istr */ + +/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Firmware/WIMU3/src/usb_pwr.c b/Firmware/WIMU3/src/usb_pwr.c new file mode 100644 index 0000000..bc5d045 --- /dev/null +++ b/Firmware/WIMU3/src/usb_pwr.c @@ -0,0 +1,238 @@ +/** + ****************************************************************************** + * @file usb_pwr.c + * @author MCD Application Team + * @version V3.4.0 + * @date 29-June-2012 + * @brief Connection/disconnection & power management + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT 2012 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 "Merged__hw_config.h" +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_pwr.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */ +__IO BOOL fSuspendEnabled = TRUE; /* true when suspend is possible */ + +struct +{ + __IO RESUME_STATE eState; + __IO uint8_t bESOFcnt; +} +ResumeS; + +/* Extern variables ----------------------------------------------------------*/ +extern uint16_t IMR_MSK; + +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : PowerOn +* Description : +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +RESULT PowerOn(void) +{ + uint16_t wRegVal; + + /*** cable plugged-in ? ***/ + /*while(!CablePluggedIn());*/ + USB_Cable_Config(ENABLE); + + /*** CNTR_PWDN = 0 ***/ + wRegVal = CNTR_FRES; + _SetCNTR(wRegVal); + + /*** CNTR_FRES = 0 ***/ + wInterrupt_Mask = 0; + _SetCNTR(wInterrupt_Mask); + /*** Clear pending interrupts ***/ + _SetISTR(0); + /*** Set interrupt mask ***/ + wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM; + _SetCNTR(wInterrupt_Mask); + + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : PowerOff +* Description : handles switch-off conditions +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +RESULT PowerOff() +{ + /* disable all interrupts and force USB reset */ + _SetCNTR(CNTR_FRES); + /* clear interrupt status register */ + _SetISTR(0); + /* Disable the Pull-Up*/ + USB_Cable_Config(DISABLE); + /* switch-off device */ + _SetCNTR(CNTR_FRES + CNTR_PDWN); + /* sw variables reset */ + /* ... */ + + return USB_SUCCESS; +} + +/******************************************************************************* +* Function Name : Suspend +* Description : sets suspend mode operating conditions +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +void Suspend(void) +{ + + /* suspend preparation */ + /* ... */ + + uint16_t wCNTR; + + /* macrocell enters suspend mode */ + wCNTR = _GetCNTR(); + wCNTR |= CNTR_FSUSP; + _SetCNTR(wCNTR); + + /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ + /* power reduction */ + /* ... on connected devices */ + + /* force low-power mode in the macrocell */ + wCNTR = _GetCNTR(); + wCNTR |= CNTR_LPMODE; + _SetCNTR(wCNTR); + + /* switch-off the clocks */ + /* ... */ + Enter_LowPowerMode(); +} + +/******************************************************************************* +* Function Name : Resume_Init +* Description : Handles wake-up restoring normal operations +* Input : None. +* Output : None. +* Return : USB_SUCCESS. +*******************************************************************************/ +void Resume_Init(void) +{ + /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ + /* restart the clocks */ + /* ... */ + uint16_t wCNTR; + + /* CNTR_LPMODE = 0 */ + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_LPMODE); + _SetCNTR(wCNTR); + + /* restore full power */ + /* ... on connected devices */ + Leave_LowPowerMode(); + + /* reset FSUSP bit */ + _SetCNTR(IMR_MSK); + + /* reverse suspend preparation */ + /* ... */ +} + +/******************************************************************************* +* Function Name : Resume +* Description : This is the state machine handling resume operations and +* timing sequence. The control is based on the Resume structure +* variables and on the ESOF interrupt calling this subroutine +* without changing machine state. +* Input : a state machine value (RESUME_STATE) +* RESUME_ESOF doesn't change ResumeS.eState allowing +* decrementing of the ESOF counter in different states. +* Output : None. +* Return : None. +*******************************************************************************/ +void Resume(RESUME_STATE eResumeSetVal) +{ + uint16_t wCNTR; + + if (eResumeSetVal != RESUME_ESOF) + ResumeS.eState = eResumeSetVal; + + switch (ResumeS.eState) + { + case RESUME_EXTERNAL: + Resume_Init(); + ResumeS.eState = RESUME_OFF; + break; + case RESUME_INTERNAL: + Resume_Init(); + ResumeS.eState = RESUME_START; + break; + case RESUME_LATER: + ResumeS.bESOFcnt = 2; + ResumeS.eState = RESUME_WAIT; + break; + case RESUME_WAIT: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + ResumeS.eState = RESUME_START; + break; + case RESUME_START: + wCNTR = _GetCNTR(); + wCNTR |= CNTR_RESUME; + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_ON; + ResumeS.bESOFcnt = 10; + break; + case RESUME_ON: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + { + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_RESUME); + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_OFF; + } + break; + case RESUME_OFF: + case RESUME_ESOF: + default: + ResumeS.eState = RESUME_OFF; + break; + } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Firmware/WIMU3/src/utils.c b/Firmware/WIMU3/src/utils.c new file mode 100644 index 0000000..67f189b --- /dev/null +++ b/Firmware/WIMU3/src/utils.c @@ -0,0 +1,911 @@ +//****************************************************************************** +// WIMUuSD - Utils +// +// Description: This source contains utility functions that are globally used +// in the project. +// +// Author: Simon Brière, ing., M. Sc. A. +// Initial Version: April 3rd, 2009 +// +// Modifications: +// 2nd November 2010 - Rework of us_sleep function to be functional +// with delay > 65.6 ms +// +// +//****************************************************************************** +#include +//#include "msp430x54x.h" +#include "utils.h" +#include "string.h" //for strlen +#include "config.h" +#include "datalogger.h" +#include "main.h" // For shutdown + +#include "RTC.h" +#include + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +// LED +uint8_t UpdateLedStatus = 0; + +BuzzerState_TypeDef Buzzer_State = BUZZER_OFF; + +uint8_t USBDetect_CurrentState = 0; +uint8_t ChargeStat_CurrentState = 0; + +volatile ModuleStates i_mod_status[MODULE_INTERNAL_NUM]; + +//bool LED_status[3] = {bool, bool, bool}; + +// Set TIM_Prescaler for the timer according to folowing equation: +// TimerUnit = TIMcCLK_Period * TIM_Prescaler +// +// Refer to system_stm32lxx.c to determine TIMcCLK_Period: +// TIMcCLK_Period = 1/(SYSCLK) * AHB_Prescaler * APB1_Prescaler / X +// where X = 1 when APB1_Prescaler == 1 and X = 2 when APB1_Prescaler != 1. +// +// When SYSCLK = 32MHz, AHB_Prescaler = 1, APB1_Prescaler = 1: +// TimerUnit = 31,25 ns * TIM_Prescaler +// To get a TimerUnit of 1 ms, we have to use TIM_Prescaler = 32000 +// To get a TimerUnit of 1 us, we have to use TIM_Prescaler = 32 +// +// Division ratio is between CLK_INT frequency and sampling clock used by the digital filters (ETR, TIx) +// Those signal are not use; assigned value is irrelevant +TIM_TimeBaseInitTypeDef TIM_LedPWMTimeBaseInitStruct = +{ + 32000, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_LedLowPowPWMTimeBaseInitStruct = +{ + 3200, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + + +TIM_TimeBaseInitTypeDef TIM_BuzzerPWMTimeBaseInitStruct = +{ + 32, // TIM_Prescaler (period tick = 1 us) + TIM_CounterMode_Up, // TIM_CounterMode + 350, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_BuzzerLowPowPWMTimeBaseInitStruct = +{ + 1, // TIM_Prescaler (period tick = 1 us) + TIM_CounterMode_Up, // TIM_CounterMode + 1, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_BuzzerSequencerTimeBaseInitStruct = +{ + 32000, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_BuzzerLowPowSequencerTimeBaseInitStruct = +{ + 32, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + + +TIM_TimeBaseInitTypeDef TIM_usWait = +{ + 32, // TIM_Prescaler (period tick = 1 us) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_msWait = +{ + 32000, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + +TIM_TimeBaseInitTypeDef TIM_msWaitLowPow = +{ + 3200, // TIM_Prescaler (period tick = 1 ms) + TIM_CounterMode_Up, // TIM_CounterMode + 1000, // TIM_Period + TIM_CKD_DIV1 // TIM_ClockDivision +}; + + +LEDState_TypeDef LEDStates[3]; + +/* Extern variables ----------------------------------------------------------*/ +extern RTC_TimeTypeDef RTC_TimeStruct; +extern RTC_DateTypeDef RTC_DateStruct; + +/* Private function prototypes -----------------------------------------------*/ + + +/* Public functions ---------------------------------------------------------*/ + + +//------------------------------------------------------------------------------ +// LED_Config +//------------------------------------------------------------------------------ +// Description: Mapping IOs for LEDs. Initializing the timer to pulse the led. +// +//------------------------------------------------------------------------------ +// Parameters: None +// +// Return value: +// None +//------------------------------------------------------------------------------ +void LedAndBuzzer_Config(bool low_power) +{ + /*Led_Config(); + Buzzer_Config();*/ + uint8_t i; + + GPIO_InitTypeDef GPIO_InitStructure; + TIM_OCInitTypeDef TIM_OCInitStruct; + NVIC_InitTypeDef NVIC_InitStructure; + + // Enabling TIM3 peripheral clock + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); + + // Enabling GPIO clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + + // Connecting LED0 (RED)(TIM3_CH4), LED1 (GREEN)(TIM3_CH3), LED2 (BLUE)(TIM3_CH2) and Buzzer pins (TIM3_CH1) to the desired peripherals' Alternate Function + GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); + + // Configuring TIM3 alternate function and selecting the type, pull-up/pull-down and output speed + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + /*GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_SetBits(GPIOC, GPIO_Pin_7); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_SetBits(GPIOC, GPIO_Pin_8); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_SetBits(GPIOC, GPIO_Pin_9);*/ + + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + // Configuring TIM3 timebase for Buzzer + if (low_power){ + TIM_LedPWMTimeBaseInitStruct.TIM_Prescaler = TIM_LedLowPowPWMTimeBaseInitStruct.TIM_Prescaler; + }else{ + TIM_LedPWMTimeBaseInitStruct.TIM_Prescaler = 32000; + } + TIM_TimeBaseInit(TIM3, &TIM_LedPWMTimeBaseInitStruct); + //TIM_TimeBaseInit(TIM3, &TIM_BuzzerPWMTimeBaseInitStruct); + TIM_TimeBaseInit(TIM6, &TIM_BuzzerSequencerTimeBaseInitStruct); // Buzzer sequencer + TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Single); + + // Enable the TIM6 global Interrupt (for buzzer sequencer) + NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + + // Configuring the timer output compare unit for LED0, LED1 and LED2 + // Setting pulse width (blink time) of 500 (ms) + // Setting the output to active high + TIM_OCStructInit(&TIM_OCInitStruct); + + // ...For LED + TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStruct.TIM_Pulse = 500; + TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; + + TIM_OC2Init(TIM3, &TIM_OCInitStruct); + TIM_OC3Init(TIM3, &TIM_OCInitStruct); + TIM_OC4Init(TIM3, &TIM_OCInitStruct); + + // ...for buzzer + TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStruct.TIM_Pulse = 175; + TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OC1Init(TIM3, &TIM_OCInitStruct); + + // Driving outputs inactive + TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Enable); + + TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); + + TIM_SelectOCxM(TIM3, TIM_Channel_3, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Enable); + + TIM_SelectOCxM(TIM3, TIM_Channel_4, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_4, TIM_CCx_Enable); + + // Enabling the proload register. Mandatory for PWM mode + TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); + TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); + TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); + TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); + + // Enabling auto-reload preload + TIM_ARRPreloadConfig(TIM3, ENABLE); + TIM_SetAutoreload(TIM3, 1000); + + // Update of the shadow register with the preloaded value will be initiated + // when setting UG bit in TIMx_EGR register + TIM_UpdateDisableConfig(TIM3, DISABLE); + + // Initializing shadow register + TIM3->EGR = 0x0001; + + Buzzer_Stop(); + // Initialize led state structure + for (i=0;i<3;i++){ + LEDStates[i].on = false; + LEDStates[i].blinking = false; + LEDStates[i].on_time = 0; + LEDStates[i].off_time = 0; + LEDStates[i].priority = NO_PRIORITY; + } + +} + +// time_ms = time in ms the buzzer should be on + +void Buzzer_Start(uint16_t time_ms) +{ +// NVIC_InitTypeDef NVIC_InitStructure; + + // Don't play the buzzer if in low-batt! + if (Power_GetState()==POWER_STATE_LOWBAT || Power_GetLastState()==POWER_STATE_LOWBAT) + return; + + // Changing state of the buffer + Buzzer_State = BUZZER_ON; + + // Initializing the buzz cycle counter + //Buzzer_NbrOfCycleCompleted = 0; + +// Start Timer6 that will end the buzzer + TIM_Cmd(TIM6, DISABLE); + TIM_ClearITPendingBit(TIM6, TIM_IT_Update); + if (!Power_IsInStopMode()) + TIM_PrescalerConfig(TIM6, TIM_BuzzerSequencerTimeBaseInitStruct.TIM_Prescaler, TIM_PSCReloadMode_Update); + else + TIM_PrescalerConfig(TIM6, TIM_BuzzerLowPowSequencerTimeBaseInitStruct.TIM_Prescaler, TIM_PSCReloadMode_Update); + TIM_SetAutoreload(TIM6, time_ms); + TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); + TIM_Cmd(TIM6, ENABLE); + + // Placing buzzer output in PWM1 mode - Start buzzing + TIM_Cmd(TIM3, DISABLE); + if (!Power_IsInStopMode()) + TIM_TimeBaseInit(TIM3, &TIM_BuzzerPWMTimeBaseInitStruct); + else + TIM_TimeBaseInit(TIM3, &TIM_BuzzerLowPowPWMTimeBaseInitStruct); + TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Enable); + TIM_Cmd(TIM3, ENABLE); +} + + +void Buzzer_Stop(void) +{ + //NVIC_InitTypeDef NVIC_InitStructure; + + // Disabling the timer + //TIM_Cmd(TIM3, DISABLE); + + // Disabling the TIM3 gloabal Interrupt + /*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure);*/ + + // Forcing low on buzzer output + TIM_Cmd(TIM3, DISABLE); + TIM_TimeBaseInit(TIM3, &TIM_LedPWMTimeBaseInitStruct); + TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Enable); + TIM_Cmd(TIM3, ENABLE); + + TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE); + + led_restore_state(); + // changing state of the buffer + Buzzer_State = BUZZER_OFF; + //Buzzer_NbrOfCycleCompleted = BUZZER_LENGTH_NBROFCYCLE; +} + +void Buzzer_SetFrequency(uint16_t f){ + TIM_BuzzerPWMTimeBaseInitStruct.TIM_Period = 1 / (f * 1e-6); + + if (Buzzer_State==BUZZER_ON){ + // Change the tone + TIM_Cmd(TIM3, DISABLE); + TIM_TimeBaseInit(TIM3, &TIM_BuzzerPWMTimeBaseInitStruct); + TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Enable); + TIM_Cmd(TIM3, ENABLE); + } +} + +void Buzzer_PlayStopSong(){ + Buzzer_SetFrequency(BUZZER_NOTE_C); + Buzzer_Start(300); + msWait(100); + Buzzer_SetFrequency(BUZZER_NOTE_E); + msWait(100); + Buzzer_SetFrequency(BUZZER_NOTE_G); + msWait(100); + Buzzer_SetFrequency(BUZZER_DEFAULT_TONE); + Buzzer_Stop(); +} + +void Buzzer_PlayStartSong(){ + Buzzer_SetFrequency(BUZZER_NOTE_G); + Buzzer_Start(300); + msWait(100); + Buzzer_SetFrequency(BUZZER_NOTE_E); + msWait(100); + Buzzer_SetFrequency(BUZZER_NOTE_C); + msWait(100); + Buzzer_SetFrequency(BUZZER_DEFAULT_TONE); + Buzzer_Stop(); +} + + + +void Wait_TimerConfig(void) +{ + + // Enabling TIM9 peripheral clock + RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE); + + // Configuring TIM9 timebase (use either TIM_msWait or TIM_usWait + // because prescaler will be adjusted at the beginning of usWait and msWait functions) + TIM_TimeBaseInit(TIM9, &TIM_msWait); + + // Enabling auto-reload preload + TIM_ARRPreloadConfig(TIM9, ENABLE); + + // Disabling the timer + TIM_Cmd(TIM9, DISABLE); + +} + +//------------------------------------------------------------------------------ +// usWait +//------------------------------------------------------------------------------ +// Do nothing for the specified time interval. +//------------------------------------------------------------------------------ +// Parameters: +// SleepTime, number of micro-seconds to sleep +// +// Return value: +// None +//------------------------------------------------------------------------------ + +void usWait(uint16_t SleepTime) +{ + // Disabling the timer + TIM_Cmd(TIM9, DISABLE); + + // Initializing TIM9 with us values + TIM_TimeBaseInit(TIM9, &TIM_usWait); + + // Changing preload register value updating shadow register + TIM_SetAutoreload(TIM9, SleepTime); + TIM9->EGR = 0x0001; + TIM_ClearFlag(TIM9, TIM_IT_Update); + + // Starting timer and wait until SleepTime ending + TIM_Cmd(TIM9, ENABLE); + while(TIM_GetFlagStatus(TIM9, TIM_IT_Update) == RESET); + TIM_ClearFlag(TIM9, TIM_IT_Update); + + // Disabling the timer + TIM_Cmd(TIM9, DISABLE); + +} + +//------------------------------------------------------------------------------ +// msWait +//------------------------------------------------------------------------------ +// Do nothing for the specified time interval. +//------------------------------------------------------------------------------ +// Parameters: +// SleepTime, number of milli-seconds to sleep +// +// Return value: +// None +//------------------------------------------------------------------------------ + +void msWait(uint16_t SleepTime) +{ + + // Disabling the timer + TIM_Cmd(TIM9, DISABLE); + + // Initializing TIM9 with us values + if (!Power_IsInStopMode()) + TIM_TimeBaseInit(TIM9, &TIM_msWait); + else + TIM_TimeBaseInit(TIM9, &TIM_msWaitLowPow); + + // Changing preload register value updating shadow register + TIM_SetAutoreload(TIM9, SleepTime); + TIM9->EGR = 0x0001; + TIM_ClearFlag(TIM9, TIM_IT_Update); + + // Starting timer and wait until SleepTime ending + TIM_Cmd(TIM9, ENABLE); + while(TIM_GetFlagStatus(TIM9, TIM_IT_Update) == RESET); + TIM_ClearFlag(TIM9, TIM_IT_Update); + + // Disabling the timer + TIM_Cmd(TIM9, DISABLE); + +} + + + +//------------------------------------------------------------------------------ + +// LED + +//------------------------------------------------------------------------------ + +// Turn on or off the specified LED + +//------------------------------------------------------------------------------ + +// Parameters: + +// id, the LED to turn on or off + +// state, LED_ON to turn on or LED_OFF to turn off + +// priority, the priority associated with that LED activation. Lower priority than the current +// one will be ignored. + +// Return value: + +// None + +//------------------------------------------------------------------------------ + +void led(LED_Color led, bool state, Priority_TypeDef priority){ + if (LEDStates[led].priority > priority && priority != NO_PRIORITY) + return; // Ignore request as the LED displayed has more priority + + if (LEDStates[led].blinking==true){ + led_stop_blink(led); // Stop blinking mode if that LED is currently blinking + //return; + } + + // ----------Taking control of the shared timer TIM3---------- + // Disabling the timer + TIM_Cmd(TIM3, DISABLE); + + // Initializing TIM3 with LED values + //TIM_TimeBaseInit(TIM3, &TIM_LedPWMTimeBaseInitStruct); + + // Reseting counter + //TIM_SetCounter(TIM3, 0); + + //Select the correct LED and apply the state + switch (led){ + case LED_RED: + if (state==false){ + TIM_SelectOCxM(TIM3, TIM_Channel_4, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_4, TIM_CCx_Enable); + //GPIO_SetBits(GPIOC, GPIO_Pin_9); + }else{ + TIM_SelectOCxM(TIM3, TIM_Channel_4, TIM_ForcedAction_Active); + TIM_CCxCmd(TIM3, TIM_Channel_4, TIM_CCx_Enable); + //GPIO_ResetBits(GPIOC, GPIO_Pin_9); + } + break; + + case LED_GREEN: + if (state==false){ + TIM_SelectOCxM(TIM3, TIM_Channel_3, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Enable); + //GPIO_SetBits(GPIOC, GPIO_Pin_8); + }else{ + TIM_SelectOCxM(TIM3, TIM_Channel_3, TIM_ForcedAction_Active); + TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Enable); + //GPIO_ResetBits(GPIOC, GPIO_Pin_8); + } + break; + + case LED_BLUE: + if (state==false){ + TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_ForcedAction_InActive); + TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); + //GPIO_SetBits(GPIOC, GPIO_Pin_7); + }else{ + TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_ForcedAction_Active); + TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); + //GPIO_ResetBits(GPIOC, GPIO_Pin_7); + } + break; + }; + + // Updating shadow registers + //TIM3->EGR = 0x0001; + + // Enabling TIM3 + TIM_Cmd(TIM3, ENABLE); + + + LEDStates[led].on = state; + LEDStates[led].priority = priority; + return; +} + +//------------------------------------------------------------------------------ +// LED +//------------------------------------------------------------------------------ +// Switch the state of the specified LED. If the LED is on, it is turned off. If +// the LED is off, it is turned on. +//------------------------------------------------------------------------------ +// Parameters: +// id, the LED to turn on or off +// +// Return value: +// None +//------------------------------------------------------------------------------ +void led_toggle(LED_Color l, Priority_TypeDef priority){ + + if (LEDStates[l].priority > priority && priority != NO_PRIORITY) + return; // Ignore request as the LED displayed has more priority + + //Select the correct LED and apply the state + /*switch (LEDStates[l].on){ + case true: + LEDStates[l].on=false; + break; + case false: + LEDStates[l].on=true; + break; + };*/ + LEDStates[l].on = !LEDStates[l].on; + led(l,LEDStates[l].on, priority); + +} + +bool led_get_state(LED_Color l){ + return LEDStates[l].on; +} + +void led_start_blink(LED_Color led, uint16_t on_time, uint16_t off_time, Priority_TypeDef priority){ + + if (LEDStates[led].priority > priority && priority != NO_PRIORITY) + return; // Ignore request as the LED displayed has more priority + + // If LED is already blinking, return + //if (LEDStates[led].blinking==true) return; + + // Disabling the timer + TIM_Cmd(TIM3, DISABLE); + + // Initializing TIM3 with LED values + //if (low_pow==bool){ + //TIM_TimeBaseInit(TIM3, &TIM_LedPWMTimeBaseInitStruct); + /*}else{ + TIM_TimeBaseInit(TIM3, &TIM_LedLowPowPWMTimeBaseInitStruct); + }*/ + + // Reseting counter + //TIM_SetCounter(TIM3, 0); + + TIM_SetAutoreload(TIM3, off_time+on_time); // WARNING: multiple LED blinking at different frequency will not correctly work. + + switch(led){ + case LED_RED: + TIM_SetCompare4(TIM3, on_time); + + // Setting output compare mode + TIM_SelectOCxM(TIM3, TIM_Channel_4, TIM_OCMode_PWM1); // Red LED + TIM_CCxCmd(TIM3, TIM_Channel_4, TIM_CCx_Enable); + break; + case LED_GREEN: + //TIM_SetAutoreload(TIM3, off_time+on_time); + TIM_SetCompare3(TIM3, on_time); + + // Setting output compare mode + TIM_SelectOCxM(TIM3, TIM_Channel_3, TIM_OCMode_PWM1); // Red LED + TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Enable); + break; + case LED_BLUE: + //TIM_SetAutoreload(TIM3, off_time+on_time); + TIM_SetCompare2(TIM3, on_time); + + // Setting output compare mode + TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_OCMode_PWM1); // Red LED + TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); + break; + } + // Updating shadow registers + TIM3->EGR = 0x0001; + + // Enabling TIM3 + TIM_Cmd(TIM3, ENABLE); + + // Update state variables + LEDStates[led].on_time = on_time; + LEDStates[led].off_time = off_time; + LEDStates[led].blinking = true; +} + +void led_stop_blink(LED_Color l){ + // Update state variables + LEDStates[l].on_time = 0; + LEDStates[l].off_time = 0; + LEDStates[l].blinking = false; + + led(l,false, NO_PRIORITY); + TIM_Cmd(TIM3, DISABLE); +} + +void led_restore_state(){ + uint8_t i; + for (i=0; i<3; i++){ + if (LEDStates[i].blinking==true){ + led_start_blink(i,LEDStates[i].on_time, LEDStates[i].off_time, LEDStates[i].priority); + }else{ + led(i,LEDStates[i].on, LEDStates[i].priority); + } + } +} + +//------------------------------------------------------------------------------ +// ERROR +//------------------------------------------------------------------------------ +// Called when an error occurs. Turn a LED on to indicate the problem, and if the +// specific error isn't trapped, stops the CPU. +//------------------------------------------------------------------------------ +// Parameters: +// module, the module on which the error occured +// code, the error code +// +// Return value: +// None +//------------------------------------------------------------------------------ +void error(unsigned char module, unsigned char code){ + led(LED_RED,true, HIGH_PRIORITY); + led(LED_GREEN, false, HIGH_PRIORITY); + uint8_t timeout=0; + uint8_t i; + char buf[64]; + + // Shutdown everything except CPU & DataLogger & USB & Power + for (i=0; i0) //Check sign + tzone = -tzone;*/ + + // Modify timestamp + timestamp += tzone * 3600; + } + + // Reconvert to time struct + localtime_r((time_t*)×tamp, &timing); + + /*RTC_DateStruct.RTC_Year = year-2000; + RTC_DateStruct.RTC_Month = month; + RTC_DateStruct.RTC_Date = day; + + RTC_TimeStruct.RTC_Hours = hour; + RTC_TimeStruct.RTC_Minutes = min; + RTC_TimeStruct.RTC_Seconds = sec;*/ + + RTC_DateStruct.RTC_Year = timing.tm_year-100; + RTC_DateStruct.RTC_Month = timing.tm_mon; + RTC_DateStruct.RTC_Date = timing.tm_mday; + + RTC_TimeStruct.RTC_Hours = timing.tm_hour; + RTC_TimeStruct.RTC_Minutes = timing.tm_min; + RTC_TimeStruct.RTC_Seconds = timing.tm_sec; + + RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); + RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); + + // update_timestampRTC(true); + + //Update actual datalogger runtime value in order to split file correctly in days + if(wimu_config.logger.split_by_day){ + //FIX ME + //Only works if 24h are recorded in a folder + /*RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); + RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); + + dos_runtime = RTC_TimeStruct.RTC_Hours;// + tzone; + dos_split_ts = timestamp + wimu_config.log_filetime * 60 - RTC_TimeStruct.RTC_Minutes * 60 - RTC_TimeStruct.RTC_Seconds;*/ + + dos_runtime = timing.tm_hour;// + tzone; + dos_split_ts = timestamp + /*wimu_config.logger.file_time **/ 60 - timing.tm_min * 60 - timing.tm_sec; + + } + + return; +} +// +//------------------------------------------------------------------------------ +// UPDATE_TIMESTAMPRTC +//------------------------------------------------------------------------------ +// Update the timestamp value with the current RTC values. Timestamp is reported +// UNIX standard, e.g. seconds since Jan. 1st. 1970. +//------------------------------------------------------------------------------ +// Parameters: +// None +// +// Return value (None): +// None, but global timestamp variable is updated. +//------------------------------------------------------------------------------ +void update_timestampRTC(){ + struct tm timing; + RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); + RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); + + timing.tm_sec = RTC_TimeStruct.RTC_Seconds; + timing.tm_min = RTC_TimeStruct.RTC_Minutes; + timing.tm_hour = RTC_TimeStruct.RTC_Hours; + timing.tm_mday = RTC_DateStruct.RTC_Date; + timing.tm_mon = RTC_DateStruct.RTC_Month; + timing.tm_year = RTC_DateStruct.RTC_Year+100;//+70;// - 1970; + timestamp = mktime(&timing); + + return; +} + +void update_RTCtimeFromTimestamp(uint64_t ts){ + struct tm timing; + + localtime_r((time_t*)&ts, &timing); + update_RTCtime(timing.tm_year+1900, timing.tm_mon+1, timing.tm_mday, timing.tm_hour, timing.tm_min, timing.tm_sec, true); + +} + +inline ModuleStates getModuleState(InternalModules_ID module){ + return i_mod_status[module]; +} + +inline void setModuleState(InternalModules_ID module, ModuleStates state){ + i_mod_status[module] = state; +} + +inline bool isModuleOnline(InternalModules_ID module){ + return i_mod_status[module] == STATE_ONLINE; +} + +uint32_t NumberOfSetBits(uint32_t i) +{ + i = i - ((i >> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >> 2) & 0x33333333); + return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; +} + + + +void TIM6_IRQHandler(void) +{ + Buzzer_Stop(); + TIM_ClearITPendingBit(TIM6, TIM_IT_Update); +} \ No newline at end of file diff --git a/Firmware/WIMU3/src/watchdog.c b/Firmware/WIMU3/src/watchdog.c new file mode 100644 index 0000000..433097b --- /dev/null +++ b/Firmware/WIMU3/src/watchdog.c @@ -0,0 +1,67 @@ +//****************************************************************************** +// WIMUuSD - Watchdog module +// +// Description: +// +// Author: Jasmin +// Initial Version: November 10th, 2012 +// +// Modifications: +// +// +//****************************************************************************** + +/* Includes ------------------------------------------------------------------*/ +#include "watchdog.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Extern variables ----------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + + +void softWDTInit(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); + + /* --------------------------NVIC Configuration -------------------------------*/ + /* Enable the TIM4 global Interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + + NVIC_Init(&NVIC_InitStructure); + + /* Time base configuration */ + TIM_TimeBaseStructure.TIM_Period = SOFTWDG_PERIOD; + TIM_TimeBaseStructure.TIM_Prescaler = SOFTWDG_PRESCALER; + // Division ratio between CLK_INT frequency and sampling clock used by the digital filters (ETR, TIx) + // Those signal are not use for soft watchdog; assigned value is irrelevant + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + + TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); + TIM_SetCounter(TIM4, 0); + + TIM_ClearITPendingBit(TIM4, TIM_IT_Update); + /* TIM IT enable */ + TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); + + /* TIM4 enable counter */ + TIM_Cmd(TIM4, ENABLE); +} + +void SOFT_WDT_RELOAD(void) +{ + TIM_Cmd(TIM4, DISABLE); + TIM_SetCounter(TIM4, 0); + TIM_Cmd(TIM4, ENABLE); +} diff --git a/Software/WIMUStudio2/Doxyfile b/Software/WIMUStudio2/Doxyfile new file mode 100644 index 0000000..82b64e8 --- /dev/null +++ b/Software/WIMUStudio2/Doxyfile @@ -0,0 +1,2492 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = WIMUStudio2 + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = D:\Simon_Dev\WIMuGPS\Workspace\openwimu\WIMUStudio2\src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /